From 0cbc72ed7b9ea2659be30a74d467dffa67bc3f06 Mon Sep 17 00:00:00 2001 From: Iukou Siarhei <45054016+BlazarQSO@users.noreply.github.com> Date: Wed, 20 Dec 2023 11:48:40 +0300 Subject: [PATCH 001/183] EPMRPP-87438 || wrong text on the unlink issue modal (#3698) --- app/localization/translated/zh.json | 2 +- .../stepPage/modals/unlinkIssueModal/unlinkIssueModal.jsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/localization/translated/zh.json b/app/localization/translated/zh.json index 2bd249cc17..8c37e840da 100644 --- a/app/localization/translated/zh.json +++ b/app/localization/translated/zh.json @@ -1981,7 +1981,7 @@ "UniqueErrors.uniqueError": "自动独特错误分析", "UniqueErrors.uniqueErrorDescription": "如果自动独特错误分析已启用,则在任何测试任务完成后都将立即开始独特错误分析", "UnlinkIssueModal.unlinkIssue": "取消关联问题", - "UnlinkIssueModal.unlinkModalConfirmationText": "您确定要将该问题与测试项的关联取消吗?", + "UnlinkIssueModal.unlinkModalConfirmationText": "Are you sure you want to unlink the issue(s) for test item(s)?", "UnlinkIssueModal.unlinkSuccessMessage": "顺利完成!", "UpdateAnalysisSettings.allMessagesShouldMatch": "开关“所有3行或有更多行的日志都应该匹配”", "UpdateAnalysisSettings.analysisProps": "自动分析服务的属性:", diff --git a/app/src/pages/inside/stepPage/modals/unlinkIssueModal/unlinkIssueModal.jsx b/app/src/pages/inside/stepPage/modals/unlinkIssueModal/unlinkIssueModal.jsx index c0176ad03c..53ca57852a 100644 --- a/app/src/pages/inside/stepPage/modals/unlinkIssueModal/unlinkIssueModal.jsx +++ b/app/src/pages/inside/stepPage/modals/unlinkIssueModal/unlinkIssueModal.jsx @@ -45,7 +45,7 @@ const messages = defineMessages({ }, unlinkModalConfirmationText: { id: 'UnlinkIssueModal.unlinkModalConfirmationText', - defaultMessage: 'Are you sure to unlink issue/s for test items?', + defaultMessage: 'Are you sure you want to unlink the issue(s) for test item(s)?', }, unlinkSuccessMessage: { id: 'UnlinkIssueModal.unlinkSuccessMessage', From c722cd612ccc3529555ea0c1ae8d6453a9e9e523 Mon Sep 17 00:00:00 2001 From: Iukou Siarhei <45054016+BlazarQSO@users.noreply.github.com> Date: Wed, 20 Dec 2023 11:50:03 +0300 Subject: [PATCH 002/183] EPMRPP-88591 || update event parameter auto_analysis (#3699) --- app/src/components/main/analytics/AnalyticsWrapper.jsx | 4 ++-- app/src/components/main/analytics/utils.js | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/components/main/analytics/AnalyticsWrapper.jsx b/app/src/components/main/analytics/AnalyticsWrapper.jsx index 3d0a1ea072..4065b1c7a3 100644 --- a/app/src/components/main/analytics/AnalyticsWrapper.jsx +++ b/app/src/components/main/analytics/AnalyticsWrapper.jsx @@ -23,7 +23,7 @@ import GA4 from 'react-ga4'; import { omit } from 'common/utils'; import { gaMeasurementIdSelector } from 'controllers/appInfo/selectors'; import ReactObserver from 'react-event-observer'; -import { normalizeDimensionValue, getAppVersion } from './utils'; +import { normalizeDimensionValue, getAppVersion, getAutoAnalysisEventValue } from './utils'; export const analyticsEventObserver = ReactObserver(); @@ -51,7 +51,7 @@ export const analyticsEventObserver = ReactObserver(); instanceID: instanceId, version: getAppVersion(buildVersion), uid: `${userId}|${instanceId}`, - auto_analysis: normalizeDimensionValue(isAutoAnalyzerEnabled), + auto_analysis: getAutoAnalysisEventValue(isAutoAnalyzerEnabled), pattern_analysis: normalizeDimensionValue(isPatternAnalyzerEnabled), timestamp: Date.now(), ...(!isAdmin && { project_id: `${projectInfoId}|${instanceId}` }), diff --git a/app/src/components/main/analytics/utils.js b/app/src/components/main/analytics/utils.js index 3c9205d3b6..f8b9c791b1 100644 --- a/app/src/components/main/analytics/utils.js +++ b/app/src/components/main/analytics/utils.js @@ -21,6 +21,10 @@ export const normalizeDimensionValue = (value) => { return value !== undefined ? value.toString() : undefined; }; +export const getAutoAnalysisEventValue = (value) => { + return normalizeDimensionValue(value) ?? 'no_analyzer'; +}; + export const normalizeEventString = (string = '') => string .trim() @@ -48,7 +52,7 @@ export const provideEcGA = ({ eventName, baseEventParameters, additionalParamete instanceID: instanceId, version: getAppVersion(buildVersion), uid: `${userId}|${instanceId}`, - auto_analysis: normalizeDimensionValue(isAutoAnalyzerEnabled), + auto_analysis: getAutoAnalysisEventValue(isAutoAnalyzerEnabled), pattern_analysis: normalizeDimensionValue(isPatternAnalyzerEnabled), timestamp: Date.now(), ...(!isAdmin && { project_id: `${projectInfoId}|${instanceId}` }), From 7a49f8a49e216db1c8a51efb7c980c3471ef0a77 Mon Sep 17 00:00:00 2001 From: Iukou Siarhei <45054016+BlazarQSO@users.noreply.github.com> Date: Fri, 22 Dec 2023 10:58:32 +0300 Subject: [PATCH 003/183] =?UTF-8?q?EPMRPP-88345=20||=20Attribute=20icon=20?= =?UTF-8?q?on=20Launch=20is=20not=20moved=20with=20the=20attrib=E2=80=A6?= =?UTF-8?q?=20(#3702)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/localization/translated/be.json | 7 ++-- app/localization/translated/ru.json | 7 ++-- app/localization/translated/uk.json | 1 + app/localization/translated/zh.json | 1 + .../attributesBlock/attributesBlock.jsx | 40 ++++++++++++++----- .../attributesBlock/attributesBlock.scss | 4 ++ 6 files changed, 43 insertions(+), 17 deletions(-) diff --git a/app/localization/translated/be.json b/app/localization/translated/be.json index 01ea549dc7..036414d644 100644 --- a/app/localization/translated/be.json +++ b/app/localization/translated/be.json @@ -177,9 +177,10 @@ "AttributesContainer.attributesNotActive": "Атрыбуты не актыўныя. Для актывацыі ўсталюеце сцяжок ‘Атрыбуты’", "AttributesFieldArrayControl.addOneMoreLevel": "Дадаць яшчэ адзін узровень", "AttributesFieldArrayControl.attributeKeyFieldLabel": "ўзровень {number} {view}", - "AttributesFieldArrayControl.attributeKeyFieldPlaceholder": "Калі ласка, увядзіце ключ аттрибута", + "AttributesFieldArrayControl.attributeKeyFieldPlaceholder": "Калі ласка, увядзіце ключ атрибута", "AttributesFieldArrayControl.levelCanBeAddedMessage": "1 ўзровень можа быць дададзены", "AttributesFieldArrayControl.levelsCanBeAddedMessage": "{amount} узроўняў можна дадаць", + "AttributesBlock.attributesTitle": "Атрыбуты", "AutoAnalysis.AutoAnalysisMode": "Аўта-Аналіз на аснове", "AutoAnalysis.AutoAnalysisModeDescription": "Вы можаце вызначыць запускі, якія будуць выкарыстоўвацца ў якасці асновы для аўтаматычнага аналізу. Дакументацыя", "AutoAnalysis.allLaunchesCaption": "Усе папярэднія запускі", @@ -369,7 +370,7 @@ "ComponentHealthCheckControls.ComponentTitle": "Кампанент", "ComponentHealthCheckControls.PassingRateFieldLabel": "Мінімальны дапушчальны працэнт пройдзеных тэстаў для кампанента", "ComponentHealthCheckControls.PassingRateValidationError": "Павінен мець значэнне ад 50 да 100", - "ComponentHealthCheckControls.attributesArrayValidationError": "Увядзіце ключы аттрыбута чые унікальнае значэнне будзе выкарыстоўвацца для групоўкі тэстаў", + "ComponentHealthCheckControls.attributesArrayValidationError": "Увядзіце ключы атрыбута чые унікальнае значэнне будзе выкарыстоўвацца для групоўкі тэстаў", "ComponentHealthCheckTable.automationBugColumnTitle": "Хіба аўтаматызацыі", "ComponentHealthCheckTable.customColumnHint": "Карыстацкі слупок:", "ComponentHealthCheckTable.nameColumn": "Імя", @@ -381,7 +382,7 @@ "ComponentHealthCheckTable.statusHint": "Статус", "ComponentHealthCheckTable.systemIssueColumnTitle": "Сыстэмная праблема", "ComponentHealthCheckTable.toInvestigateColumnTitle": "Праблема непрааналізавана", - "ComponentHealthCheckTableViewControls.attributesArrayValidationError": "Увядзіце ключы аттрыбута чые унікальнае значэнне будзе выкарыстоўвацца для групоўкі тэстаў", + "ComponentHealthCheckTableViewControls.attributesArrayValidationError": "Увядзіце ключы атрыбута чые унікальнае значэнне будзе выкарыстоўвацца для групоўкі тэстаў", "ComponentHealthCheckTableViewControls.componentTitle": "Кампанент", "ComponentHealthCheckTableViewControls.customColumnPlaceholder": "Enter an attribute key", "ComponentHealthCheckTableViewControls.customColumnTitle": "Карыстальніцкая калонка", diff --git a/app/localization/translated/ru.json b/app/localization/translated/ru.json index 911eb40c6a..a25802defe 100644 --- a/app/localization/translated/ru.json +++ b/app/localization/translated/ru.json @@ -177,9 +177,10 @@ "AttributesContainer.attributesNotActive": "Атрибуты не активны. Для активации установите флажок ‘Атрибуты‘", "AttributesFieldArrayControl.addOneMoreLevel": "Добавить еще один уровень", "AttributesFieldArrayControl.attributeKeyFieldLabel": "Уровень {number} {view}", - "AttributesFieldArrayControl.attributeKeyFieldPlaceholder": "Введить ключ аттрибута", + "AttributesFieldArrayControl.attributeKeyFieldPlaceholder": "Введить ключ атрибута", "AttributesFieldArrayControl.levelCanBeAddedMessage": "1 уровень может быть добавлен", "AttributesFieldArrayControl.levelsCanBeAddedMessage": "{amount} уровней могут быть добавлены", + "AttributesBlock.attributesTitle": "Атрибуты", "AutoAnalysis.AutoAnalysisMode": "Авто-Анализ на основе", "AutoAnalysis.AutoAnalysisModeDescription": "Вы можете указать запуски, которые будут использоваться в качестве основы для автоматического анализа. Документация", "AutoAnalysis.allLaunchesCaption": "Все предыдущие запуски", @@ -369,7 +370,7 @@ "ComponentHealthCheckControls.ComponentTitle": "Компонент", "ComponentHealthCheckControls.PassingRateFieldLabel": "Минимальный допустимый процент пройденных тестов для компонента", "ComponentHealthCheckControls.PassingRateValidationError": "Должен иметь значение от 50 до 100", - "ComponentHealthCheckControls.attributesArrayValidationError": "Введите ключи аттрибута чье уникальное значение будет использоваться для группировки тестов", + "ComponentHealthCheckControls.attributesArrayValidationError": "Введите ключи атрибута чье уникальное значение будет использоваться для группировки тестов", "ComponentHealthCheckTable.automationBugColumnTitle": "Ошибка автоматизации", "ComponentHealthCheckTable.customColumnHint": "Пользовательский столбец:", "ComponentHealthCheckTable.nameColumn": "Имя", @@ -381,7 +382,7 @@ "ComponentHealthCheckTable.statusHint": "Статус", "ComponentHealthCheckTable.systemIssueColumnTitle": "Системные проблемы", "ComponentHealthCheckTable.toInvestigateColumnTitle": "Непроанализированная проблема", - "ComponentHealthCheckTableViewControls.attributesArrayValidationError": "Введите ключи аттрибута чье уникальное значение будет использоваться для группировки тестов", + "ComponentHealthCheckTableViewControls.attributesArrayValidationError": "Введите ключи атрибута чье уникальное значение будет использоваться для группировки тестов", "ComponentHealthCheckTableViewControls.componentTitle": "Компонент", "ComponentHealthCheckTableViewControls.customColumnPlaceholder": "Enter an attribute key", "ComponentHealthCheckTableViewControls.customColumnTitle": "Пользовательский столбец", diff --git a/app/localization/translated/uk.json b/app/localization/translated/uk.json index c6cc210f1f..5cdc2fa1cb 100644 --- a/app/localization/translated/uk.json +++ b/app/localization/translated/uk.json @@ -180,6 +180,7 @@ "AttributesFieldArrayControl.attributeKeyFieldPlaceholder": "Введить ключ атрибуту", "AttributesFieldArrayControl.levelCanBeAddedMessage": "1 рівень може бути доданий", "AttributesFieldArrayControl.levelsCanBeAddedMessage": "{amount} рівнів можуть бути додані", + "AttributesBlock.attributesTitle": "Атрибути", "AutoAnalysis.AutoAnalysisMode": "Авто-Аналіз на основі", "AutoAnalysis.AutoAnalysisModeDescription": "Ви можете вказати запуски, які будуть використовуватися як основа для автоматичного аналізу. Документація", "AutoAnalysis.allLaunchesCaption": "Всі попередні запуски", diff --git a/app/localization/translated/zh.json b/app/localization/translated/zh.json index 8c37e840da..e6df961276 100644 --- a/app/localization/translated/zh.json +++ b/app/localization/translated/zh.json @@ -180,6 +180,7 @@ "AttributesFieldArrayControl.attributeKeyFieldPlaceholder": "请输入属性名", "AttributesFieldArrayControl.levelCanBeAddedMessage": "可以再增加1层", "AttributesFieldArrayControl.levelsCanBeAddedMessage": "可以再增加{amount}层", + "AttributesBlock.attributesTitle": "属性", "AutoAnalysis.AutoAnalysisMode": "自动分析服务基于的数据", "AutoAnalysis.AutoAnalysisModeDescription": "You can specify the launches that will be used as the base for Auto-Analysis. Documentation", "AutoAnalysis.allLaunchesCaption": "All previous launches", diff --git a/app/src/pages/inside/common/itemInfo/attributesBlock/attributesBlock.jsx b/app/src/pages/inside/common/itemInfo/attributesBlock/attributesBlock.jsx index cc18d5d674..c343573c2b 100644 --- a/app/src/pages/inside/common/itemInfo/attributesBlock/attributesBlock.jsx +++ b/app/src/pages/inside/common/itemInfo/attributesBlock/attributesBlock.jsx @@ -16,6 +16,7 @@ import classNames from 'classnames/bind'; import PropTypes from 'prop-types'; +import { injectIntl, defineMessages } from 'react-intl'; import { formatAttribute, formatAttributeWithSpacedDivider, @@ -24,16 +25,16 @@ import { import styles from './attributesBlock.scss'; const cx = classNames.bind(styles); +const messages = defineMessages({ + attributesTitle: { + id: 'AttributesBlock.attributesTitle', + defaultMessage: 'Attributes', + }, +}); -export const AttributesBlock = ({ - attributes, - onClickAttribute, - isAttributeClickable, - noHoverEffects, -}) => ( -
- {attributes.some(notSystemAttributePredicate) &&
} - {attributes.filter(notSystemAttributePredicate).map((attribute) => ( +export const AttributesBlock = injectIntl( + ({ intl, attributes, onClickAttribute, isAttributeClickable, noHoverEffects }) => { + const allAttributes = attributes.filter(notSystemAttributePredicate).map((attribute) => (
{attribute.value}
)}
- ))} -
+ )); + + const [attributeWithIcon, ...otherAttributes] = allAttributes; + + return ( +
+ {!!attributeWithIcon && ( +
+
+ {attributeWithIcon} +
+ )} + {otherAttributes} +
+ ); + }, ); AttributesBlock.propTypes = { diff --git a/app/src/pages/inside/common/itemInfo/attributesBlock/attributesBlock.scss b/app/src/pages/inside/common/itemInfo/attributesBlock/attributesBlock.scss index f3fc624271..95417ed574 100644 --- a/app/src/pages/inside/common/itemInfo/attributesBlock/attributesBlock.scss +++ b/app/src/pages/inside/common/itemInfo/attributesBlock/attributesBlock.scss @@ -19,6 +19,10 @@ margin-bottom: 10px; } +.icon-block { + display: inline-block; +} + .attributes-icon { display: inline-block; width: 15px; From 79b36ce515cb76b747af0b90c0bedf192505dd49 Mon Sep 17 00:00:00 2001 From: Iukou Siarhei <45054016+BlazarQSO@users.noreply.github.com> Date: Fri, 22 Dec 2023 11:24:57 +0300 Subject: [PATCH 004/183] EPMRPP-85656 || update ReportPortal spelling on plugins pages (#3703) --- .../instancesSection/instancesSection.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/components/integrations/containers/integrationInfoContainer/instancesSection/instancesSection.jsx b/app/src/components/integrations/containers/integrationInfoContainer/instancesSection/instancesSection.jsx index a0f6a3e485..3b6943ba7b 100644 --- a/app/src/components/integrations/containers/integrationInfoContainer/instancesSection/instancesSection.jsx +++ b/app/src/components/integrations/containers/integrationInfoContainer/instancesSection/instancesSection.jsx @@ -108,7 +108,7 @@ const messages = defineMessages({ uninstallPluginNote: { id: 'InstancesSection.uninstallPluginNote', defaultMessage: - 'Remove this plugin from the reportportal and revoke all access and authorizations.', + 'Remove this plugin from the ReportPortal and revoke all access and authorizations.', }, }); From 6e903c2394c998fa7de9f9bdcb48409a4e01e734 Mon Sep 17 00:00:00 2001 From: Iukou Siarhei <45054016+BlazarQSO@users.noreply.github.com> Date: Fri, 22 Dec 2023 12:10:32 +0300 Subject: [PATCH 005/183] EPMRPP-79773 || the field has unnecessary placeholder and does not have asterisk (#3704) --- .../emailIntegration/emailFormFields/emailFormFields.jsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/app/src/components/integrations/integrationProviders/emailIntegration/emailFormFields/emailFormFields.jsx b/app/src/components/integrations/integrationProviders/emailIntegration/emailFormFields/emailFormFields.jsx index 611e72e7e3..e04289176d 100644 --- a/app/src/components/integrations/integrationProviders/emailIntegration/emailFormFields/emailFormFields.jsx +++ b/app/src/components/integrations/integrationProviders/emailIntegration/emailFormFields/emailFormFields.jsx @@ -212,13 +212,10 @@ export class EmailFormFields extends Component { label={formatMessage(messages.passwordLabel)} disabled={disabled} className={cx('fields')} + isRequired > - + )} From 28ebbf36781f0a36f664bfd77141b36842eed545 Mon Sep 17 00:00:00 2001 From: Iukou Siarhei <45054016+BlazarQSO@users.noreply.github.com> Date: Fri, 22 Dec 2023 15:47:12 +0300 Subject: [PATCH 006/183] EPMRPP-88591 || update event parameter auto analysis (#3705) --- app/src/components/main/analytics/AnalyticsWrapper.jsx | 3 ++- app/src/components/main/analytics/utils.js | 7 ++++--- app/src/controllers/appInfo/selectors.js | 3 +++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/src/components/main/analytics/AnalyticsWrapper.jsx b/app/src/components/main/analytics/AnalyticsWrapper.jsx index 4065b1c7a3..d95822a916 100644 --- a/app/src/components/main/analytics/AnalyticsWrapper.jsx +++ b/app/src/components/main/analytics/AnalyticsWrapper.jsx @@ -44,6 +44,7 @@ export const analyticsEventObserver = ReactObserver(); isPatternAnalyzerEnabled, projectInfoId, isAdmin, + isAnalyzerAvailable, } = baseEventParameters; if ('place' in data) { @@ -51,7 +52,7 @@ export const analyticsEventObserver = ReactObserver(); instanceID: instanceId, version: getAppVersion(buildVersion), uid: `${userId}|${instanceId}`, - auto_analysis: getAutoAnalysisEventValue(isAutoAnalyzerEnabled), + auto_analysis: getAutoAnalysisEventValue(isAnalyzerAvailable, isAutoAnalyzerEnabled), pattern_analysis: normalizeDimensionValue(isPatternAnalyzerEnabled), timestamp: Date.now(), ...(!isAdmin && { project_id: `${projectInfoId}|${instanceId}` }), diff --git a/app/src/components/main/analytics/utils.js b/app/src/components/main/analytics/utils.js index f8b9c791b1..fa0be02f87 100644 --- a/app/src/components/main/analytics/utils.js +++ b/app/src/components/main/analytics/utils.js @@ -21,8 +21,8 @@ export const normalizeDimensionValue = (value) => { return value !== undefined ? value.toString() : undefined; }; -export const getAutoAnalysisEventValue = (value) => { - return normalizeDimensionValue(value) ?? 'no_analyzer'; +export const getAutoAnalysisEventValue = (isAnalyzerAvailable, value) => { + return isAnalyzerAvailable ? normalizeDimensionValue(value) : 'no_analyzer'; }; export const normalizeEventString = (string = '') => @@ -43,6 +43,7 @@ export const provideEcGA = ({ eventName, baseEventParameters, additionalParamete buildVersion, userId, isAutoAnalyzerEnabled, + isAnalyzerAvailable, isPatternAnalyzerEnabled, projectInfoId, isAdmin, @@ -52,7 +53,7 @@ export const provideEcGA = ({ eventName, baseEventParameters, additionalParamete instanceID: instanceId, version: getAppVersion(buildVersion), uid: `${userId}|${instanceId}`, - auto_analysis: getAutoAnalysisEventValue(isAutoAnalyzerEnabled), + auto_analysis: getAutoAnalysisEventValue(isAnalyzerAvailable, isAutoAnalyzerEnabled), pattern_analysis: normalizeDimensionValue(isPatternAnalyzerEnabled), timestamp: Date.now(), ...(!isAdmin && { project_id: `${projectInfoId}|${instanceId}` }), diff --git a/app/src/controllers/appInfo/selectors.js b/app/src/controllers/appInfo/selectors.js index 92b10a6586..7383086e46 100644 --- a/app/src/controllers/appInfo/selectors.js +++ b/app/src/controllers/appInfo/selectors.js @@ -73,6 +73,7 @@ export const baseEventParametersSelector = createSelector( patternAnalysisEnabledSelector, projectInfoIdSelector, isAdminSelector, + analyzerExtensionsSelector, ( instanceId, buildVersion, @@ -81,6 +82,7 @@ export const baseEventParametersSelector = createSelector( isPatternAnalyzerEnabled, projectInfoId, isAdmin, + analyzerExtensions, ) => ({ instanceId, buildVersion, @@ -89,5 +91,6 @@ export const baseEventParametersSelector = createSelector( isPatternAnalyzerEnabled, projectInfoId, isAdmin, + isAnalyzerAvailable: !!analyzerExtensions.length, }), ); From 85b1ab9c3f5d784fd66f88fc51b0304477159fff Mon Sep 17 00:00:00 2001 From: Vadim73i <55870906+Vadim73i@users.noreply.github.com> Date: Tue, 26 Dec 2023 14:30:02 +0300 Subject: [PATCH 007/183] EPMRPP-86916 || Update the image for default user (#3706) --- app/src/common/img/default-user-avatar.png | Bin 2573 -> 33353 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/app/src/common/img/default-user-avatar.png b/app/src/common/img/default-user-avatar.png index b40402d891ff0619380d70d3ffc3b424d0ea4127..11972b6738cd8047f7427353af058dca426a2bb2 100644 GIT binary patch literal 33353 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 literal 2573 zcmd5;c{JPG7EXuzXpIl8nYy$nMTtgLr%Mw#cSF=z4#=wcc9$tbNWt-&t#)y}tdOlXlew zCUa2jAP5AKaj>_$2KZJGXpfZSUSPKPFo^)T15x(gF(8nX!nd(!^et{1h_yS|U35<< zT6#Ma$?4bZ<$LEmwsSRYkhHiO7Q2K}pxVp+u(hi#XiDAdQ)hqYjj!s_5`xl;b~Ea$ zeLgSki@LLohnSJ;SXB6aM$K2t(;5yR<<9TkdUjv_5PRQ|L=~CN|7XLp_f->DJW4QM zxFh=X`khX%&k2;Yt|PxoxT@G~=ofpYbtT;pj-uO!iAw>((3-)+4CF&@s#X~x%ZMEI zKHg%0g$g|`M8a)<{6j-`2G@ZZ>)AqAZrnyP(GTVA6 zy=aO-!%P0EfHkY)60{6se=gRGc9)SA6=L9}6(QDs0(KgQ*QDV*PsJtTFrR)t#}0c9 zZ-3%E|2clb)-%Kg1^tkeJFmC=( zVlHEiZGgR%yvC|IT^mkJa#d+f6uwS4+4!J|zr}T%iCKt^TgW#g@{KvRt}0gJnP=M5 zRy>T2X-b679$`7pbuly3l#hao(ZL}nOZ8Cbhj~CO^+lCAwXklpEvhkot7=!Sn}EPp zt@fcrqTS)WrX~Sw+sS>(CCygn>xJED&!?{8kcjg?;_@>lw$!mz54vU86wrE#hEn@Q zEI6bj-PN&P&5~!K&S&XG2Vo?uL%K{UK`=KNY|>%8cI8+FS*wfEp9TFyH9xqICDnZ= zwUYE8;a9`AB8MQu6qp-603&&(7H_z!o&wX|wAUpsBB&L-rln-EtwjsSI*SUWkkq8-#pnQxQj0Vo)lLC^E zMqE4L~&gGqrb1BUD=p8v6}%z>)t6XXG8#6Shzph1jAVw5EQxB+%7|6G`T z%2>W#Brt3AS4n;E4^FHR53M_dnH9A_c3*J)0SMa6^6R)DAlLUyd_i)4A#j;@esY;b z)bs$+&YLMkw}C0dYJf;vktiT~%zZq>_8o@WroKc-_WsT0Zh>9JX*`{#0UqMAjZ=l% z{aws<{AqQdg;7Df9{c=eU(O!+t8E!;Zf-v9W{sg|H8Oey$E*C#StgM0cU@SvXw>ei zSBz4Cn2cOGJMu-_Rsj;`vHSZjYaqTA|5cbD&JLW+j-$s#sX29Y|fk;szFn~i3MtOA(lgv*c)|BGl#YQTz}*N zjX$-F(y)hl0owE_mLps7JlzGxd>T35!_qzA47&h6<)^VkXhK(HK?i$Sa7o9$QG^~G z2;D~`0jdKbui`9UmQ_r2o$@#>kg*)SI*TwhzTB6NFc~@XmKustx^Begl_{#DNI_QQ zRl2E7ht1V0&T>&oueS2dTeYf$PQRJ$+dUUb%o5gC%cri8)QGfgZnjV%G^E%wQ9N7T z$u+VNF@YN4tOHMG^SApZU-NsJC<~D)JfwAtU6Avz7OD-Tft?}sG0h<nogVe@-c5d+=Yj~#nG4W7Dc=A>WuWmzZsG%QGRZT-Q zk;`s3oWX~t_X>ok*qxz1!>{U0n{7TQXn~4KLQI%{W66K=hGqz~$HLUB93SIYY@d%C zn8Lp{axZHN-8R0~S8hml&MUiHP#mH83}?-v>m+; ze=}?jr%m+O{LGPC3Vt>bVWH{nicI}b+9^6kZgpS=H54<)$2#zNb=LYiD_(29M2|e# zU*Rzw5bg?Y9EABas*M2@t=n_r`V_jMfH}b~ zpdD>VrAOx@Yq4fUa`$3N-7UXRF!F?pE#8@39e;4v0pu};GUEzcc!QJ9Kp`{cDxLEp zYq4PXrdug#^@XFm+`=zcrM92!P}RQvBzLJXjnw{cZY~x&X;iGtxwVBAq>gn|d5F!A z%seH{xYYkq?f#F)Br@}qV|mYUqx7YKf~mOY7Y`8U;Ekd=xT^}u@8Hg2HG0L@xGnC} zae*M@JoDSj&ST)|@37%EvQawZNYNX0Wv(zQ?)_rx1KHH?sP}i}{eKHsZ0{F<)Qr*+ SJ^}wbki#VxyUL&Z@B9fo=m2T} From 514b53c054d62a16321f5bafd48f7b80723b417d Mon Sep 17 00:00:00 2001 From: Iukou Siarhei <45054016+BlazarQSO@users.noreply.github.com> Date: Wed, 3 Jan 2024 13:13:49 +0300 Subject: [PATCH 008/183] EPMRPP-86736 || wrong font-size of elements on the bottom of Project Settings page (#3707) --- app/src/layouts/settingsLayout/footer/footer.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/layouts/settingsLayout/footer/footer.scss b/app/src/layouts/settingsLayout/footer/footer.scss index 5ff6d25b9e..1eaa8714eb 100644 --- a/app/src/layouts/settingsLayout/footer/footer.scss +++ b/app/src/layouts/settingsLayout/footer/footer.scss @@ -38,7 +38,7 @@ display: inline-block; line-height: 16px; color: $COLOR--e-300; - font-size: 9px; + font-size: 11px; font-family: $FONT-ROBOTO-REGULAR; margin: 0 8px; From a54b96391f44af4f7a0edcfa0a6691a713097bd0 Mon Sep 17 00:00:00 2001 From: Vadim73i <55870906+Vadim73i@users.noreply.github.com> Date: Thu, 4 Jan 2024 15:40:10 +0300 Subject: [PATCH 009/183] EPMRPP-87061 || Extra symbols are cut in Integrations modals and user isn't notified about entered extra symbols (#3708) * EPMRPP-87061 || Extra symbols are cut in Integrations modals and user isn't notified about entered extra symbols * EPMRPP-87061 || code review fixes - 1 --- app/localization/translated/be.json | 12 +++++------- app/localization/translated/ru.json | 12 +++++------- app/localization/translated/uk.json | 12 +++++------- app/localization/translated/zh.json | 14 ++++++-------- app/src/common/utils/validation/validate.js | 2 ++ .../fields/fieldErrorHint/fieldErrorHint.jsx | 8 ++++++++ .../emailFormFields/emailFormFields.jsx | 2 +- .../jiraConnectionFormFields.jsx | 18 +++++++++++------- .../rallyConnectionFormFields.jsx | 6 +++--- 9 files changed, 46 insertions(+), 40 deletions(-) diff --git a/app/localization/translated/be.json b/app/localization/translated/be.json index 036414d644..3d2b0b098e 100644 --- a/app/localization/translated/be.json +++ b/app/localization/translated/be.json @@ -84,8 +84,8 @@ "AddFilter.placeholderFilterName": "Увядзіце назву фільтра", "AddIntegrationModal.createGlobalTitle": "Стварыць глабальную інтэграцыю", "AddIntegrationModal.createProjectTitle": "Стварыць праектную інтэграцыю", - "AddIntegrationModal.editProjectIntegrationTitle": "Рэдагаваць інтэграцыю праекта", "AddIntegrationModal.editGlobalIntegrationTitle": "Рэдагаваць глабальную інтэграцыю", + "AddIntegrationModal.editProjectIntegrationTitle": "Рэдагаваць інтэграцыю праекта", "AddNewCaseButton.addNewRuleButton": "Дадаць новае правіла", "AddUserForm.addUserTitle": "Дадаць карыстальніка", "AddUserForm.generatePassword": "Згенераваць пароль", @@ -172,6 +172,7 @@ "AttributeEditor.uniqueAttributeKeyHint": "Ключ атрыбуту павінен быць унікальным", "AttributeEditor.valueLabel": "Значэнне", "AttributeList.addNew": "Дадаць новы", + "AttributesBlock.attributesTitle": "Атрыбуты", "AttributesContainer.addAttribute": "Дадаць атрыбут", "AttributesContainer.attributes": "Атрыбуты", "AttributesContainer.attributesNotActive": "Атрыбуты не актыўныя. Для актывацыі ўсталюеце сцяжок ‘Атрыбуты’", @@ -180,7 +181,6 @@ "AttributesFieldArrayControl.attributeKeyFieldPlaceholder": "Калі ласка, увядзіце ключ атрибута", "AttributesFieldArrayControl.levelCanBeAddedMessage": "1 ўзровень можа быць дададзены", "AttributesFieldArrayControl.levelsCanBeAddedMessage": "{amount} узроўняў можна дадаць", - "AttributesBlock.attributesTitle": "Атрыбуты", "AutoAnalysis.AutoAnalysisMode": "Аўта-Аналіз на аснове", "AutoAnalysis.AutoAnalysisModeDescription": "Вы можаце вызначыць запускі, якія будуць выкарыстоўвацца ў якасці асновы для аўтаматычнага аналізу. Дакументацыя", "AutoAnalysis.allLaunchesCaption": "Усе папярэднія запускі", @@ -203,9 +203,11 @@ "Breadcrumbs.restorePath": "Аднавіць шлях", "BtsCommonMessages.authTypeLabel": "Тып аўтарызацыі", "BtsCommonMessages.btsIntegrationNameHint": "Памер імя Інтэграцыі павінен быць ад 1 да 55", + "BtsCommonMessages.btsPasswordHint": "Пароль павінен быць памерам ад 1 да 55", "BtsCommonMessages.btsProjectIdHint": "ID праекта павінен быць памерам ад 1 да 55", "BtsCommonMessages.btsProjectKeyHint": "Ключ праекта павіннен быць памерам ад 1 да 55", "BtsCommonMessages.btsUrlHint": "Калі ласка, падайце сапраўдную спасылку ў САХ", + "BtsCommonMessages.btsUserNameHint": "Імя павінна быць памерам ад 1 да 55", "BtsCommonMessages.integrationNameLabel": "Імя интеграцыі", "BtsCommonMessages.linkToBtsLabel": "Спасылка на САХ", "BtsCommonMessages.projectKeyLabel": "Ключ праекта ў САХ", @@ -263,8 +265,6 @@ "Charts.testCasesCaption": "Тэставыя выпадкі", "Charts.total": "Усяго {type}", "ClusterItemsGridRow.loadLabel": "Загрузіць яшчэ", - "ColorPicker.pickSwatch": "Выберыце ўзор", - "ColorPicker.selectColor": "Выберыце свой колер", "CommandItem.commandTitle": "Каманда", "CommandItem.parametersTitle": "Параметры", "CommandItem.responseTitle": "Адказ", @@ -726,6 +726,7 @@ "EventsGrid.userSearchPlaceholder": "Калі ласка, увядзіце імя карыстальніка", "ExpandToggler.hideCriteria": "Схаваць Крытэрыі", "ExpandToggler.showCriteria": "Паказаць Крытэрыі", + "ExtensionError.message": "У плагіне адбыўся збой.
Дачакайцеся ўзнаўлення злучэння
або звярніцеся за дапамогай да адміністратара.", "ExternalSystems.createIntegration": "сканфігураваў", "ExternalSystems.deleteIntegration": "выдаліў", "ExternalSystems.emailDefaultName": "Email Server", @@ -737,7 +738,6 @@ "ExternalUserInvitationModal.email": "Запрашэнне было адпраўлена на", "ExternalUserInvitationModal.header": "Запрасіць карыстальніка", "ExternalUserInvitationModal.link": "Спасылка на запрашэнне", - "ExtensionError.message": "У плагіне адбыўся збой.
Дачакайцеся ўзнаўлення злучэння
або звярніцеся за дапамогай да адміністратара.", "FailedCasesTrendChart.failedCases": "няўдалыя сцэнарыі", "FailedCasesTrendControls.ItemsFieldLabel": "Элементы", "FailedCasesTrendControls.ItemsValidationError": "Колькасць элементаў павінна быць памерам ад '1' да '600'", @@ -1030,7 +1030,6 @@ "IntegrationsList.bts": "Сістэма адсочвання памылак", "IntegrationsList.notification": "Апавяшчэнні", "IntegrationsList.other": "Іншыя", - "IntegrationsTab.integrationsBreadcrumbTitle": "Інтэграцыі", "InvestigatedPercentageOfLaunchesControls.ItemsFieldLabel": "Элементы", "InvestigatedPercentageOfLaunchesControls.ItemsValidationError": "Колькасць элементаў павінна быць памерам ад '1' да '600'", "InviteUserModal.description": "Запрасіць карыстальніка на праект", @@ -1641,7 +1640,6 @@ "ProjectActivityControls.UsersPlaceholder": "Увядзiце iмя карыстальніка", "ProjectDetailsPageEvents.headerButton": "Маніторынг праекта", "ProjectDetailsPageMembers.headerButton": "Удзельнікі праекта", - "ProjectDetailsPageSettings.headerButton": "Налады праекта", "ProjectPanel.assign": "Прызначыць", "ProjectPanel.delete": "Выдаліць", "ProjectPanel.internal": "Унутраны", diff --git a/app/localization/translated/ru.json b/app/localization/translated/ru.json index a25802defe..78f47c1d9a 100644 --- a/app/localization/translated/ru.json +++ b/app/localization/translated/ru.json @@ -84,8 +84,8 @@ "AddFilter.placeholderFilterName": "Ввести имя фильтра", "AddIntegrationModal.createGlobalTitle": "Создать глобальную интеграцию", "AddIntegrationModal.createProjectTitle": "Создать проектную интеграцию", - "AddIntegrationModal.editProjectIntegrationTitle": "Редактировать интеграцию проекта", "AddIntegrationModal.editGlobalIntegrationTitle": "Редактировать глобальную интеграцию", + "AddIntegrationModal.editProjectIntegrationTitle": "Редактировать интеграцию проекта", "AddNewCaseButton.addNewRuleButton": "Добавить новое правило", "AddUserForm.addUserTitle": "Добавить пользователя", "AddUserForm.generatePassword": "Сгенерировать пароль", @@ -172,6 +172,7 @@ "AttributeEditor.uniqueAttributeKeyHint": "Ключ атрибута должен быть уникальным", "AttributeEditor.valueLabel": "Значение", "AttributeList.addNew": "Добавить", + "AttributesBlock.attributesTitle": "Атрибуты", "AttributesContainer.addAttribute": "Добавить атрибут", "AttributesContainer.attributes": "Атрибуты", "AttributesContainer.attributesNotActive": "Атрибуты не активны. Для активации установите флажок ‘Атрибуты‘", @@ -180,7 +181,6 @@ "AttributesFieldArrayControl.attributeKeyFieldPlaceholder": "Введить ключ атрибута", "AttributesFieldArrayControl.levelCanBeAddedMessage": "1 уровень может быть добавлен", "AttributesFieldArrayControl.levelsCanBeAddedMessage": "{amount} уровней могут быть добавлены", - "AttributesBlock.attributesTitle": "Атрибуты", "AutoAnalysis.AutoAnalysisMode": "Авто-Анализ на основе", "AutoAnalysis.AutoAnalysisModeDescription": "Вы можете указать запуски, которые будут использоваться в качестве основы для автоматического анализа. Документация", "AutoAnalysis.allLaunchesCaption": "Все предыдущие запуски", @@ -203,9 +203,11 @@ "Breadcrumbs.restorePath": "Восстановить путь", "BtsCommonMessages.authTypeLabel": "Тип авторизации", "BtsCommonMessages.btsIntegrationNameHint": "Размер имени Интеграции должен быть от 1 до 55", + "BtsCommonMessages.btsPasswordHint": "Пароль должен быть длиной от 1 до 55", "BtsCommonMessages.btsProjectIdHint": "ID проекта должен быть длиной от 1 до 55", "BtsCommonMessages.btsProjectKeyHint": "Ключ проекта должен быть длиной от 1 до 55", "BtsCommonMessages.btsUrlHint": "Пожалуйста, предоставьте действительную ссылку в СОД", + "BtsCommonMessages.btsUserNameHint": "Имя должно быть длиной от 1 до 55", "BtsCommonMessages.integrationNameLabel": "Имя интеграции", "BtsCommonMessages.linkToBtsLabel": "Ссылка на СОД", "BtsCommonMessages.projectKeyLabel": "Ключ проекта в СОД", @@ -263,8 +265,6 @@ "Charts.testCasesCaption": "Тествовые случаи", "Charts.total": "Всего {type}", "ClusterItemsGridRow.loadLabel": "Загрузить еще", - "ColorPicker.pickSwatch": "Выберите образец", - "ColorPicker.selectColor": "Выберите свой цвет", "CommandItem.commandTitle": "Команда", "CommandItem.parametersTitle": "Параметры", "CommandItem.responseTitle": "Ответ", @@ -726,6 +726,7 @@ "EventsGrid.userSearchPlaceholder": "Введите имя пользователя", "ExpandToggler.hideCriteria": "Спрятать Критерии", "ExpandToggler.showCriteria": "Показать Критерии", + "ExtensionError.message": "В плагине произошел сбой.
Дождитесь восстановления соединения
или обратитесь за помощью к администратору.", "ExternalSystems.createIntegration": "сконфигурировал", "ExternalSystems.deleteIntegration": "удалил", "ExternalSystems.emailDefaultName": "Email Server", @@ -737,7 +738,6 @@ "ExternalUserInvitationModal.email": "Приглашение было отправлено на", "ExternalUserInvitationModal.header": "Пригласить пользователя", "ExternalUserInvitationModal.link": "Ссылка на приглашение", - "ExtensionError.message": "В плагине произошел сбой.
Дождитесь восстановления соединения
или обратитесь за помощью к администратору.", "FailedCasesTrendChart.failedCases": "неудавшиеся сценарии", "FailedCasesTrendControls.ItemsFieldLabel": "Элементы", "FailedCasesTrendControls.ItemsValidationError": "Количество элементов принимает значения от '1' до '600'", @@ -1030,7 +1030,6 @@ "IntegrationsList.bts": "Системы отслеживания ошибок", "IntegrationsList.notification": "Уведомления", "IntegrationsList.other": "Другие", - "IntegrationsTab.integrationsBreadcrumbTitle": "Интеграции", "InvestigatedPercentageOfLaunchesControls.ItemsFieldLabel": "Элементы", "InvestigatedPercentageOfLaunchesControls.ItemsValidationError": "Количество элементов принимает значения от '1' до '600'", "InviteUserModal.description": "Пригласить пользователя на проект", @@ -1641,7 +1640,6 @@ "ProjectActivityControls.UsersPlaceholder": "Введите имя пользователя", "ProjectDetailsPageEvents.headerButton": "Мониторинг проекта", "ProjectDetailsPageMembers.headerButton": "Участники проекта", - "ProjectDetailsPageSettings.headerButton": "Настройки проекта", "ProjectPanel.assign": "Назначить", "ProjectPanel.delete": "Удалить", "ProjectPanel.internal": "Внутренний", diff --git a/app/localization/translated/uk.json b/app/localization/translated/uk.json index 5cdc2fa1cb..ff807c01d5 100644 --- a/app/localization/translated/uk.json +++ b/app/localization/translated/uk.json @@ -84,8 +84,8 @@ "AddFilter.placeholderFilterName": "Ввести ім’я фільтру", "AddIntegrationModal.createGlobalTitle": "Створити глобальну інтеграцію", "AddIntegrationModal.createProjectTitle": "Створити проектну інтеграцію", - "AddIntegrationModal.editProjectIntegrationTitle": "Редагувати інтеграцію проекту", "AddIntegrationModal.editGlobalIntegrationTitle": "Редагувати глобальну інтеграцію", + "AddIntegrationModal.editProjectIntegrationTitle": "Редагувати інтеграцію проекту", "AddNewCaseButton.addNewRuleButton": "Додати нове правило", "AddUserForm.addUserTitle": "Додати користувача", "AddUserForm.generatePassword": "Згенерувати пароль", @@ -172,6 +172,7 @@ "AttributeEditor.uniqueAttributeKeyHint": "Ключ атрибута повинен бути унікальним", "AttributeEditor.valueLabel": "Значення", "AttributeList.addNew": "Додати", + "AttributesBlock.attributesTitle": "Атрибути", "AttributesContainer.addAttribute": "Додати атрибут", "AttributesContainer.attributes": "Атрибути", "AttributesContainer.attributesNotActive": "Атрибути не є активними. Для активації встановіть прапорець 'Атрибути’", @@ -180,7 +181,6 @@ "AttributesFieldArrayControl.attributeKeyFieldPlaceholder": "Введить ключ атрибуту", "AttributesFieldArrayControl.levelCanBeAddedMessage": "1 рівень може бути доданий", "AttributesFieldArrayControl.levelsCanBeAddedMessage": "{amount} рівнів можуть бути додані", - "AttributesBlock.attributesTitle": "Атрибути", "AutoAnalysis.AutoAnalysisMode": "Авто-Аналіз на основі", "AutoAnalysis.AutoAnalysisModeDescription": "Ви можете вказати запуски, які будуть використовуватися як основа для автоматичного аналізу. Документація", "AutoAnalysis.allLaunchesCaption": "Всі попередні запуски", @@ -203,9 +203,11 @@ "Breadcrumbs.restorePath": "Відновити шлях", "BtsCommonMessages.authTypeLabel": "Тип авторизації", "BtsCommonMessages.btsIntegrationNameHint": "Розмір імені Інтеграції повинен бути від 1 до 55", + "BtsCommonMessages.btsPasswordHint": "Пароль має бути довжиною від 1 до 55", "BtsCommonMessages.btsProjectIdHint": "ID проекту має бути довжиною від 1 до 55", "BtsCommonMessages.btsProjectKeyHint": "Ключ проекту має бути довжиною від 1 до 55", "BtsCommonMessages.btsUrlHint": "Будь ласка, надайте в дійсну посилання СОД", + "BtsCommonMessages.btsUserNameHint": "Ім’я має бути довжиною від 1 до 55", "BtsCommonMessages.integrationNameLabel": "Ім’я інтеграції", "BtsCommonMessages.linkToBtsLabel": "Посилання на СОД", "BtsCommonMessages.projectKeyLabel": "Ключ проекту в СОД", @@ -263,8 +265,6 @@ "Charts.testCasesCaption": "Тествовые випадки", "Charts.total": "Всього {type}", "ClusterItemsGridRow.loadLabel": "Завантажити", - "ColorPicker.pickSwatch": "Виберіть зразок", - "ColorPicker.selectColor": "Виберіть свій колір", "CommandItem.commandTitle": "Команда", "CommandItem.parametersTitle": "Параметри", "CommandItem.responseTitle": "Відповідь", @@ -726,6 +726,7 @@ "EventsGrid.userSearchPlaceholder": "Введіть ім’я користувача", "ExpandToggler.hideCriteria": "Сховати Критерії", "ExpandToggler.showCriteria": "Показати Критерії", + "ExtensionError.message": "У плагіні стався збій.
Дочекайте відновлення з'єднання
або зверніться за допомогою до адміністратора.", "ExternalSystems.createIntegration": "сконфигурировал", "ExternalSystems.deleteIntegration": "видалив", "ExternalSystems.emailDefaultName": "Email Server", @@ -737,7 +738,6 @@ "ExternalUserInvitationModal.email": "Запрошення було надіслано на", "ExternalUserInvitationModal.header": "Запросити користувача", "ExternalUserInvitationModal.link": "Посилання на запрошення", - "ExtensionError.message": "У плагіні стався збій.
Дочекайте відновлення з'єднання
або зверніться за допомогою до адміністратора.", "FailedCasesTrendChart.failedCases": "сценарії невдалі", "FailedCasesTrendControls.ItemsFieldLabel": "Елементи", "FailedCasesTrendControls.ItemsValidationError": "Кількість елементів приймає значення від '1' до '600'", @@ -1030,7 +1030,6 @@ "IntegrationsList.bts": "Системи відстеження помилок", "IntegrationsList.notification": "Повідомлення", "IntegrationsList.other": "Інші", - "IntegrationsTab.integrationsBreadcrumbTitle": "Інтеграції", "InvestigatedPercentageOfLaunchesControls.ItemsFieldLabel": "Елементи", "InvestigatedPercentageOfLaunchesControls.ItemsValidationError": "Кількість елементів приймає значення від '1' до '600'", "InviteUserModal.description": "Запросити користувача на проект", @@ -1641,7 +1640,6 @@ "ProjectActivityControls.UsersPlaceholder": "Введіть ім’я користувача", "ProjectDetailsPageEvents.headerButton": "Моніторинг проекту", "ProjectDetailsPageMembers.headerButton": "Учасники проекту", - "ProjectDetailsPageSettings.headerButton": "Налаштування проекту", "ProjectPanel.assign": "Призначити", "ProjectPanel.delete": "Видалити", "ProjectPanel.internal": "Внутрішній", diff --git a/app/localization/translated/zh.json b/app/localization/translated/zh.json index e6df961276..0a6752d739 100644 --- a/app/localization/translated/zh.json +++ b/app/localization/translated/zh.json @@ -84,8 +84,8 @@ "AddFilter.placeholderFilterName": "请输入过滤器名称", "AddIntegrationModal.createGlobalTitle": "创建全局集成", "AddIntegrationModal.createProjectTitle": "Create Project Integration", - "AddIntegrationModal.editProjectIntegrationTitle": "Edit Project Integration", "AddIntegrationModal.editGlobalIntegrationTitle": "Edit Global Integration", + "AddIntegrationModal.editProjectIntegrationTitle": "Edit Project Integration", "AddNewCaseButton.addNewRuleButton": "创建规则", "AddUserForm.addUserTitle": "添加用户", "AddUserForm.generatePassword": "生成密码", @@ -172,6 +172,7 @@ "AttributeEditor.uniqueAttributeKeyHint": "关键字取值是唯一的", "AttributeEditor.valueLabel": "值", "AttributeList.addNew": "添加新属性", + "AttributesBlock.attributesTitle": "属性", "AttributesContainer.addAttribute": "添加属性", "AttributesContainer.attributes": "属性", "AttributesContainer.attributesNotActive": "属性未生效。请勾选复选框“属性”进行激活", @@ -180,7 +181,6 @@ "AttributesFieldArrayControl.attributeKeyFieldPlaceholder": "请输入属性名", "AttributesFieldArrayControl.levelCanBeAddedMessage": "可以再增加1层", "AttributesFieldArrayControl.levelsCanBeAddedMessage": "可以再增加{amount}层", - "AttributesBlock.attributesTitle": "属性", "AutoAnalysis.AutoAnalysisMode": "自动分析服务基于的数据", "AutoAnalysis.AutoAnalysisModeDescription": "You can specify the launches that will be used as the base for Auto-Analysis. Documentation", "AutoAnalysis.allLaunchesCaption": "All previous launches", @@ -203,9 +203,11 @@ "Breadcrumbs.restorePath": "恢复路径", "BtsCommonMessages.authTypeLabel": "认证类型", "BtsCommonMessages.btsIntegrationNameHint": "集成名称的长度应为1到55个字符", + "BtsCommonMessages.btsPasswordHint": "Password should have size from 1 to 55", "BtsCommonMessages.btsProjectIdHint": "项目ID的长度取值范围是1~55个字符", "BtsCommonMessages.btsProjectKeyHint": "项目键长度取值范围是1~55个字符", "BtsCommonMessages.btsUrlHint": "请提供一个有效的BTS链接", + "BtsCommonMessages.btsUserNameHint": "Username should have size from 1 to 55", "BtsCommonMessages.integrationNameLabel": "集成名称", "BtsCommonMessages.linkToBtsLabel": "关联到BTS", "BtsCommonMessages.projectKeyLabel": "BTS中项目的关键字", @@ -263,8 +265,6 @@ "Charts.testCasesCaption": "测试用例", "Charts.total": "全部{type}", "ClusterItemsGridRow.loadLabel": "加载更多", - "ColorPicker.pickSwatch": "选择一个样本", - "ColorPicker.selectColor": "选择您的颜色", "CommandItem.commandTitle": "指令", "CommandItem.parametersTitle": "参数", "CommandItem.responseTitle": "响应", @@ -726,6 +726,7 @@ "EventsGrid.userSearchPlaceholder": "请输入用户名", "ExpandToggler.hideCriteria": "隐藏条件", "ExpandToggler.showCriteria": "显示条件", + "ExtensionError.message": "The plugin has encountered a crash.
Await the reestablishment of the connection
or contact the administrator for assistance.", "ExternalSystems.createIntegration": "已设置", "ExternalSystems.deleteIntegration": "已删除", "ExternalSystems.emailDefaultName": "电子邮件服务器", @@ -737,7 +738,6 @@ "ExternalUserInvitationModal.email": "邀请已发送至", "ExternalUserInvitationModal.header": "邀请用户", "ExternalUserInvitationModal.link": "邀请链接", - "ExtensionError.message": "The plugin has encountered a crash.
Await the reestablishment of the connection
or contact the administrator for assistance.", "FailedCasesTrendChart.failedCases": "失败的用例", "FailedCasesTrendControls.ItemsFieldLabel": "测试项", "FailedCasesTrendControls.ItemsValidationError": "测试项的数量应该在1到600之间", @@ -1030,7 +1030,6 @@ "IntegrationsList.bts": "缺陷跟踪系统", "IntegrationsList.notification": "通知", "IntegrationsList.other": "第三方", - "IntegrationsTab.integrationsBreadcrumbTitle": "集成", "InvestigatedPercentageOfLaunchesControls.ItemsFieldLabel": "测试项", "InvestigatedPercentageOfLaunchesControls.ItemsValidationError": "测试项的数量应为1到600个", "InviteUserModal.description": "为此项目邀请用户", @@ -1641,7 +1640,6 @@ "ProjectActivityControls.UsersPlaceholder": "请输入用户名", "ProjectDetailsPageEvents.headerButton": "项目监控", "ProjectDetailsPageMembers.headerButton": "项目成员", - "ProjectDetailsPageSettings.headerButton": "项目设置", "ProjectPanel.assign": "分配", "ProjectPanel.delete": "删除", "ProjectPanel.internal": "内部", @@ -2179,4 +2177,4 @@ "usersGrid.roleNonAdmin": "非管理", "usersGrid.type": "类型", "usersGrid.user": "登录" -} +} \ No newline at end of file diff --git a/app/src/common/utils/validation/validate.js b/app/src/common/utils/validation/validate.js index 7d4a253493..4fed6cc6d0 100644 --- a/app/src/common/utils/validation/validate.js +++ b/app/src/common/utils/validation/validate.js @@ -53,6 +53,8 @@ export const defectTypeShortName = composeValidators([isNotEmpty, maxLength(4)]) export const projectName = composeValidators([isNotEmpty, regex(/^[0-9a-zA-Z-_]{3,256}$/)]); export const btsIntegrationName = composeValidators([isNotEmpty, maxLength(55)]); export const btsProject = composeValidators([isNotEmpty, maxLength(55)]); +export const btsUserName = composeValidators([isNotEmpty, maxLength(55)]); +export const btsPassword = composeValidators([isNotEmpty, maxLength(55)]); export const patternNameLength = composeValidators([isNotEmpty, maxLength(55)]); export const ruleNameLength = composeValidators([isNotEmpty, maxLength(55)]); export const createNameUniqueValidator = (itemId, items) => (newName) => diff --git a/app/src/components/fields/fieldErrorHint/fieldErrorHint.jsx b/app/src/components/fields/fieldErrorHint/fieldErrorHint.jsx index 498da67d56..d2e01d1be2 100644 --- a/app/src/components/fields/fieldErrorHint/fieldErrorHint.jsx +++ b/app/src/components/fields/fieldErrorHint/fieldErrorHint.jsx @@ -200,6 +200,14 @@ const messages = defineMessages({ id: 'BtsCommonMessages.btsProjectIdHint', defaultMessage: 'Project ID should have size from 1 to 55', }, + btsUserNameHint: { + id: 'BtsCommonMessages.btsUserNameHint', + defaultMessage: 'Username should have size from 1 to 55', + }, + btsPasswordHint: { + id: 'BtsCommonMessages.btsPasswordHint', + defaultMessage: 'Password should have size from 1 to 55', + }, portFieldHint: { id: 'EmailFormFields.portFieldHint', defaultMessage: "Only numbers from '1' to '65535' are possible.", diff --git a/app/src/components/integrations/integrationProviders/emailIntegration/emailFormFields/emailFormFields.jsx b/app/src/components/integrations/integrationProviders/emailIntegration/emailFormFields/emailFormFields.jsx index e04289176d..e29d1d3a87 100644 --- a/app/src/components/integrations/integrationProviders/emailIntegration/emailFormFields/emailFormFields.jsx +++ b/app/src/components/integrations/integrationProviders/emailIntegration/emailFormFields/emailFormFields.jsx @@ -182,7 +182,7 @@ export class EmailFormFields extends Component { isRequired > - + - + - + - + - + diff --git a/app/src/components/integrations/integrationProviders/rallyIntegration/rallyConnectionFormFields/rallyConnectionFormFields.jsx b/app/src/components/integrations/integrationProviders/rallyIntegration/rallyConnectionFormFields/rallyConnectionFormFields.jsx index 4e2c5d84df..ce3952bdb2 100644 --- a/app/src/components/integrations/integrationProviders/rallyIntegration/rallyConnectionFormFields/rallyConnectionFormFields.jsx +++ b/app/src/components/integrations/integrationProviders/rallyIntegration/rallyConnectionFormFields/rallyConnectionFormFields.jsx @@ -77,14 +77,14 @@ export class RallyConnectionFormFields extends Component { - + - + Date: Fri, 5 Jan 2024 11:48:57 +0300 Subject: [PATCH 010/183] EPMRPP-80257 || Popover arrow under defect type locator icon is shifted to the left (#3710) --- .../content/defectTypes/defectTypeRow/defectTypeRow.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/defectTypes/defectTypeRow/defectTypeRow.scss b/app/src/pages/inside/projectSettingsPageContainer/content/defectTypes/defectTypeRow/defectTypeRow.scss index 31dc295c21..b687ac3b32 100644 --- a/app/src/pages/inside/projectSettingsPageContainer/content/defectTypes/defectTypeRow/defectTypeRow.scss +++ b/app/src/pages/inside/projectSettingsPageContainer/content/defectTypes/defectTypeRow/defectTypeRow.scss @@ -141,7 +141,7 @@ $DEFECT_NAME_PADDING: 16px; } .locator-icon-wrapper { - padding-left: 10px; + margin-left: 10px; } .defect-locator-popover { From 134afde04535aea78fae86b38c71d2be11083bbc Mon Sep 17 00:00:00 2001 From: Iukou Siarhei <45054016+BlazarQSO@users.noreply.github.com> Date: Fri, 5 Jan 2024 11:49:13 +0300 Subject: [PATCH 011/183] EPMRPP-80377 || Popover looks different after configuration submission on Integrations tab (#3711) --- app/src/componentLibrary/popover/popover.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/componentLibrary/popover/popover.jsx b/app/src/componentLibrary/popover/popover.jsx index a43886a51c..c9d70d2a34 100644 --- a/app/src/componentLibrary/popover/popover.jsx +++ b/app/src/componentLibrary/popover/popover.jsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import React, { useEffect, useRef, useState } from 'react'; +import React, { useLayoutEffect, useRef, useState } from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames/bind'; import { useOnClickOutside } from 'common/hooks'; @@ -39,7 +39,7 @@ export const Popover = ({ useOnClickOutside(popoverRef, onClose); - useEffect(() => { + useLayoutEffect(() => { const { current: parent } = parentRef; const parentTop = parent.offsetTop; const parentLeft = parent.offsetLeft; From 5835c0c11eeae1752021615514e1a992595a1e56 Mon Sep 17 00:00:00 2001 From: Vadim73i <55870906+Vadim73i@users.noreply.github.com> Date: Fri, 5 Jan 2024 19:07:29 +0300 Subject: [PATCH 012/183] EPMRPP-84913 || Attribute radio-buttons remain visible on modal window when user unselects "Attributes" checkbox (#3713) --- .../addEditNotificationModal/addEditNotificationModal.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/modals/addEditNotificationModal/addEditNotificationModal.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/modals/addEditNotificationModal/addEditNotificationModal.jsx index 06cdf36612..d7a2d0ddf1 100644 --- a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/modals/addEditNotificationModal/addEditNotificationModal.jsx +++ b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/modals/addEditNotificationModal/addEditNotificationModal.jsx @@ -389,7 +389,7 @@ const AddEditNotificationModal = ({ autocompleteProps={{ useFixedPositioning: true }} /> - {attributesValue.length > 0 && ( + {attributesValue.length > 0 && isEditorShown && ( Date: Tue, 9 Jan 2024 12:39:34 +0300 Subject: [PATCH 013/183] EPMRPP-88959 || Add test automation attributes on Integration pages in Project settings (#3716) --- .../connectionSection/connectionSection.jsx | 12 ++++++++++-- .../integrationForm/integrationForm.jsx | 8 +++++++- .../integrationCollectionItem.jsx | 7 ++++++- .../integrationHeader/integrationHeader.jsx | 15 ++++++++++++--- .../integrationInfo/integrationInfo.jsx | 1 + 5 files changed, 36 insertions(+), 7 deletions(-) diff --git a/app/src/components/integrations/elements/integrationSettings/connectionSection/connectionSection.jsx b/app/src/components/integrations/elements/integrationSettings/connectionSection/connectionSection.jsx index 7fd21da405..47050ddb5f 100644 --- a/app/src/components/integrations/elements/integrationSettings/connectionSection/connectionSection.jsx +++ b/app/src/components/integrations/elements/integrationSettings/connectionSection/connectionSection.jsx @@ -225,13 +225,21 @@ export class ConnectionSection extends Component { {isEditable && (
{editAuthConfig && !blocked && ( - )} {!blocked && ( - )} diff --git a/app/src/components/integrations/elements/integrationSettings/integrationForm/integrationForm.jsx b/app/src/components/integrations/elements/integrationSettings/integrationForm/integrationForm.jsx index 9bcf696e18..a9ef01c456 100644 --- a/app/src/components/integrations/elements/integrationSettings/integrationForm/integrationForm.jsx +++ b/app/src/components/integrations/elements/integrationSettings/integrationForm/integrationForm.jsx @@ -166,7 +166,11 @@ export class IntegrationForm extends Component { {!blocked && isEditable && (
{disabled ? ( - ) : ( @@ -175,6 +179,7 @@ export class IntegrationForm extends Component { @@ -186,6 +191,7 @@ export class IntegrationForm extends Component { variant="ghost" onClick={this.toggleDisabled} disabled={shouldFieldsBeHidden} + dataAutomationId="cancelConfigurationButton" > {formatMessage(COMMON_LOCALE_KEYS.CANCEL)} diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/integrations/integrationsList/integrationInfo/integrationCollection/integrationCollectionItem/integrationCollectionItem.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/integrations/integrationsList/integrationInfo/integrationCollection/integrationCollectionItem/integrationCollectionItem.jsx index 3957120dbe..3757d57e0e 100644 --- a/app/src/pages/inside/projectSettingsPageContainer/content/integrations/integrationsList/integrationInfo/integrationCollection/integrationCollectionItem/integrationCollectionItem.jsx +++ b/app/src/pages/inside/projectSettingsPageContainer/content/integrations/integrationsList/integrationInfo/integrationCollection/integrationCollectionItem/integrationCollectionItem.jsx @@ -63,7 +63,12 @@ export const IntegrationCollectionItem = ({ openIntegration(item); }; return ( -
  • +
  • {title}

    diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/integrations/integrationsList/integrationInfo/integrationHeader/integrationHeader.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/integrations/integrationsList/integrationInfo/integrationHeader/integrationHeader.jsx index 70da97ef33..22ed90972c 100644 --- a/app/src/pages/inside/projectSettingsPageContainer/content/integrations/integrationsList/integrationInfo/integrationHeader/integrationHeader.jsx +++ b/app/src/pages/inside/projectSettingsPageContainer/content/integrations/integrationsList/integrationInfo/integrationHeader/integrationHeader.jsx @@ -59,7 +59,7 @@ export const IntegrationHeader = (props) => { {PLUGIN_DESCRIPTIONS_MAP[name]}{' '} createExternalLink(link, documentationLink), + a: (link) => createExternalLink(link, documentationLink, 'documentationLink'), })} event={PROJECT_SETTINGS_INTEGRATION.clickDocumentationLink(analyticsData, name)} /> @@ -72,6 +72,7 @@ export const IntegrationHeader = (props) => { target="_blank" rel="noreferrer noopener" href={documentationLink} + data-automation-id="documentationLink" > Documentation @@ -98,11 +99,19 @@ export const IntegrationHeader = (props) => {
    {withButton && (
    - {availableProjectIntegrations.length > 0 && isAbleToClick && ( - )} diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/integrations/integrationsList/integrationInfo/integrationInfo.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/integrations/integrationsList/integrationInfo/integrationInfo.jsx index eb2bea2529..3ae45cde8a 100644 --- a/app/src/pages/inside/projectSettingsPageContainer/content/integrations/integrationsList/integrationInfo/integrationInfo.jsx +++ b/app/src/pages/inside/projectSettingsPageContainer/content/integrations/integrationsList/integrationInfo/integrationInfo.jsx @@ -273,6 +273,7 @@ export const IntegrationInfo = (props) => { handleDocumentationClick={handleDocumentationClick} buttonName={formatMessage(messages.noGlobalIntegrationsButtonAdd)} disableButton={!isAbleToClick} + buttonDataAutomationId="addProjectIntegrationButton" /> )} From 9b4656bf3b2dc45d572f0824eadd2b3e03800258 Mon Sep 17 00:00:00 2001 From: Iukou Siarhei <45054016+BlazarQSO@users.noreply.github.com> Date: Tue, 9 Jan 2024 12:42:52 +0300 Subject: [PATCH 014/183] EPMRPP-86735 || Rule list item is broken when Analyzed Launch has long name (#3715) --- .../content/elements/ruleList/ruleItem/plain/ruleItem.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/elements/ruleList/ruleItem/plain/ruleItem.scss b/app/src/pages/inside/projectSettingsPageContainer/content/elements/ruleList/ruleItem/plain/ruleItem.scss index 33625b0124..62801e8987 100644 --- a/app/src/pages/inside/projectSettingsPageContainer/content/elements/ruleList/ruleItem/plain/ruleItem.scss +++ b/app/src/pages/inside/projectSettingsPageContainer/content/elements/ruleList/ruleItem/plain/ruleItem.scss @@ -25,6 +25,7 @@ .container { display: flex; flex: 1; + max-width: calc(100% - 32px); &.preview-container { justify-content: flex-end; @@ -36,7 +37,7 @@ } .panel-wrapper { - width: 100%; + width: calc(100% - 48px); background: $COLOR--bg-000; box-shadow: 0 1px 3px $COLOR--item-shadow; border-radius: 4px; From 4a7ee26b1e4e4a1a19163c7b8c842886ee775e5e Mon Sep 17 00:00:00 2001 From: Iukou Siarhei <45054016+BlazarQSO@users.noreply.github.com> Date: Tue, 16 Jan 2024 14:52:57 +0300 Subject: [PATCH 015/183] EPMRPP-89030 || Wrong height of endpoints block on UAT tab in API Documentation page (#3725) --- app/src/pages/inside/apiPage/apiPage.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/pages/inside/apiPage/apiPage.scss b/app/src/pages/inside/apiPage/apiPage.scss index 6e80a53ceb..d6d02fdb5e 100644 --- a/app/src/pages/inside/apiPage/apiPage.scss +++ b/app/src/pages/inside/apiPage/apiPage.scss @@ -73,6 +73,11 @@ } } + .opblock-tag-section h3 { + padding: 0px 20px 0px 10px; + height: 14px; + } + .opblock-tag { .nostyle { &:after { From 46ecf3063ee5b8299ef109164e7840516d8d567e Mon Sep 17 00:00:00 2001 From: Iukou Siarhei <45054016+BlazarQSO@users.noreply.github.com> Date: Wed, 17 Jan 2024 13:35:51 +0300 Subject: [PATCH 016/183] EPMRPP-89030 || Wrong height of endpoints block on UAT tab in API Documentation page (#3727) --- app/src/pages/inside/apiPage/apiPage.scss | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/src/pages/inside/apiPage/apiPage.scss b/app/src/pages/inside/apiPage/apiPage.scss index d6d02fdb5e..b050a1e86f 100644 --- a/app/src/pages/inside/apiPage/apiPage.scss +++ b/app/src/pages/inside/apiPage/apiPage.scss @@ -73,11 +73,6 @@ } } - .opblock-tag-section h3 { - padding: 0px 20px 0px 10px; - height: 14px; - } - .opblock-tag { .nostyle { &:after { @@ -85,6 +80,7 @@ } } + .renderedMarkdown, .markdown { p { margin: 0; From e4f9d91f65243561576d72c2d532710a54f10db6 Mon Sep 17 00:00:00 2001 From: Iukou Siarhei <45054016+BlazarQSO@users.noreply.github.com> Date: Fri, 19 Jan 2024 11:25:33 +0300 Subject: [PATCH 017/183] =?UTF-8?q?EPMRPP-87445=20||=20Add=20ability=20to?= =?UTF-8?q?=20exclude=20skipped=20tests=20from=20statistics=20=E2=80=A6=20?= =?UTF-8?q?(#3729)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * EPMRPP-87445 || Add ability to exclude skipped tests from statistics for component health check widget * EPMRPP-87445 || Code Review fix - 1 --- app/localization/translated/be.json | 3 ++- app/localization/translated/ru.json | 3 ++- app/localization/translated/uk.json | 3 ++- app/localization/translated/zh.json | 5 +++-- .../componentHealthCheckTable.jsx | 8 ++++++-- .../componentHealthCheckTableViewControls.jsx | 9 +++++++++ .../inside/dashboardItemPage/modals/common/widgets.jsx | 2 +- 7 files changed, 25 insertions(+), 8 deletions(-) diff --git a/app/localization/translated/be.json b/app/localization/translated/be.json index 3d2b0b098e..7cb5f0ccc0 100644 --- a/app/localization/translated/be.json +++ b/app/localization/translated/be.json @@ -389,6 +389,7 @@ "ComponentHealthCheckTableViewControls.passingRateFieldLabel": "Мінімальны дапушчальны працэнт пройдзеных тэстаў для кампанента", "ComponentHealthCheckTableViewControls.passingRateValidationError": "Павінен мець значэнне ад 50 да 100", "ComponentHealthCheckTableViewControls.sortingTitle": "Сартаванне", + "ComponentHealthCheckTableViewControls.excludeSkipped": "Выключыць прапушчаныя тэсты са статыстыкі", "Conditions.all": "Усе", "Conditions.allShort": "Усе", "Conditions.any": "Любы", @@ -2057,7 +2058,7 @@ "Widgets.Description.bugTrend": "Паказвае тэндэнцыю росту колькасці няўдалых тэставых сцэнарыяў ад прагону да прагону.", "Widgets.Description.casesTrend": "у \"Рэжыме запуску\" паказвае рост колькасці тэставых сцэнарыяў ад прагону да прагону,
    - у \"Рэжыме графіка\" паказвае рост колькасці тэставых сцэнарыяў з размеркаваннем па дат (у запусках з найбольшай колькасцю тэставых сцэнарыяў за дзень).", "Widgets.Description.componentHealthCheck": "Паказаць працэнт пройдзеных тэстаў па кампаненце", - "Widgets.Description.componentHealthCheckTable": "Паказвае падрабязную статыстыку кампанентаў прыкладання, якія пазначаны паказанымі атрыбутамі. Наколькі віджэт змяшчае складаныя запыты, ён можа рэндэрыраваць некаторы час (~ 10 мін)", + "Widgets.Description.componentHealthCheckTable": "Паказвае падрабязную статыстыку кампанентаў прыкладання, якія пазначаны паказанымі атрыбутамі, з магчымасцю выключэння прапушчаных тэстаў з статыстыкі. Наколькі віджэт змяшчае складаныя запыты, ён можа рэндэрыраваць некаторы час (~ 10 мін)", "Widgets.Description.cumulative": "Паказвае тэндэнцыю росту зводных статыстычных дадзеных па запусках з аднолькавым ключом атрыбуту.", "Widgets.Description.flakyTestCases": "Паказвае ТОП-50 найбольш зменлівых тэставых сцэнарыяў ў пазначаных запусках.", "Widgets.Description.investigatedTrend": "- у \"Рэжыме запуску\" паказвае, аналізуюцца Ці запускі (працэнт \"Даследавана\"/\"Трэба будзе даследаваць\") ад прагону да прагону,
    - у \"Рэжыме графіка\"паказвае працэнт тэстаў ў стане \"Даследавана\"/\"Даследаваць\"ва ўсіх прагонах у дзень з размеркаваннем па датах.", diff --git a/app/localization/translated/ru.json b/app/localization/translated/ru.json index 78f47c1d9a..02a3b4397b 100644 --- a/app/localization/translated/ru.json +++ b/app/localization/translated/ru.json @@ -389,6 +389,7 @@ "ComponentHealthCheckTableViewControls.passingRateFieldLabel": "Минимальный допустимый процент пройденных тестов для компонента", "ComponentHealthCheckTableViewControls.passingRateValidationError": "Должен иметь значение от 50 до 100", "ComponentHealthCheckTableViewControls.sortingTitle": "Сортировка", + "ComponentHealthCheckTableViewControls.excludeSkipped": "Исключить пропущенные тесты из статистики", "Conditions.all": "Все", "Conditions.allShort": "Все", "Conditions.any": "Любой", @@ -2057,7 +2058,7 @@ "Widgets.Description.bugTrend": "Показывает тенденцию роста количества неудачных тестовых сценариев от прогона к прогону.", "Widgets.Description.casesTrend": "- в \"Режиме запуска\" показывает рост числа тестовых сценариев от прогона к прогону,
    - в \"Режиме графика\" показывает рост количества тестовых сценариев с распределением по датам (в запусках с наибольшим количеством тестовых сценариев за день).", "Widgets.Description.componentHealthCheck": "Показать процент пройденных тестов по компоненту", - "Widgets.Description.componentHealthCheckTable": "Показывает подробную статистику компонентов приложения, которые обозначены указанными атрибутами.Поскольку виджет содержит сложные запросы, виджет может рендериться некоторое время (~ 10 минут)", + "Widgets.Description.componentHealthCheckTable": "Показывает подробную статистику компонентов приложения, которые обозначены указанными атрибутами, с возможностью исключения пропущенных тестов из статистики. Поскольку виджет содержит сложные запросы, виджет может рендериться некоторое время (~ 10 минут)", "Widgets.Description.cumulative": "Показывает тенденцию роста суммарной статистики запусков с одним и тем же ключом атрибута.", "Widgets.Description.flakyTestCases": "Показывает ТОП-50 наиболее изменчивых тестовых сценариев в обозначенных запусках.", "Widgets.Description.investigatedTrend": "- в \"Режиме запуска\" показывает, анализируются ли запуски (процент \"Исследовано\"/\"Предстоит исследовать\") от прогона к прогону,
    - в \"Режиме графика\" показывает процент тестов в состоянии \"Исследовано\"/\"Исследовать\" во всех прогонах в день с распределением по датам.", diff --git a/app/localization/translated/uk.json b/app/localization/translated/uk.json index ff807c01d5..d7d5c0675b 100644 --- a/app/localization/translated/uk.json +++ b/app/localization/translated/uk.json @@ -389,6 +389,7 @@ "ComponentHealthCheckTableViewControls.passingRateFieldLabel": "Мінімальний допустимий відсоток пройдених тестів для компонента", "ComponentHealthCheckTableViewControls.passingRateValidationError": "Повинен мати значення від 50 до 100", "ComponentHealthCheckTableViewControls.sortingTitle": "Сортування", + "ComponentHealthCheckTableViewControls.excludeSkipped": "Виключити пропущені тести зі статистики", "Conditions.all": "Всі", "Conditions.allShort": "Всі", "Conditions.any": "Будь-який", @@ -2057,7 +2058,7 @@ "Widgets.Description.bugTrend": "Показує тенденцію зростання кількості невдалих тестових сценаріїв від прогону до прогону.", "Widgets.Description.casesTrend": "- в \"Режимі запуску\" показує зростання кількості тестових сценаріїв від прогону до прогону,
    - а в \"Режимі графіка\" показує зростання кількості тестових сценаріїв з розподілом по датах (в запусках з найбільшою кількістю тестових сценаріїв за день).", "Widgets.Description.componentHealthCheck": "Показати відсоток пройдених тестів по компоненту", - "Widgets.Description.componentHealthCheckTable": "Показує детальну статистику компонентів додатка, які позначені зазначеними атрибутами. Оскільки віджет містить складні запити, віджет може рендери деякий час (~ 10 хвилин)", + "Widgets.Description.componentHealthCheckTable": "Показує детальну статистику компонентів додатка, які позначені зазначеними атрибутами, з можливістю виключення пропущених тестів зі статистики. Оскільки віджет містить складні запити, віджет може рендери деякий час (~ 10 хвилин)", "Widgets.Description.cumulative": "Показує тенденцію зростання сумарної статистики запусків з одним і тим же ключем атрибута.", "Widgets.Description.flakyTestCases": "ТОП-50 Показує найбільш мінливих тестових сценаріїв у позначених запусках.", "Widgets.Description.investigatedTrend": "- в \"Режимі запуску\" показує, аналізуються чи запуски (відсоток \"Досліджено\"/\"Належить досліджувати\") від прогону до прогону,
    - а в \"Режимі графіка\" показує відсоток тестів в стані \"Досліджено\"/\"Дослідити\" у всіх прогонах в день з розподілом по датах.", diff --git a/app/localization/translated/zh.json b/app/localization/translated/zh.json index 0a6752d739..9f547d11df 100644 --- a/app/localization/translated/zh.json +++ b/app/localization/translated/zh.json @@ -389,6 +389,7 @@ "ComponentHealthCheckTableViewControls.passingRateFieldLabel": "组件所允许的最低合格率", "ComponentHealthCheckTableViewControls.passingRateValidationError": "值应该在50到100之间", "ComponentHealthCheckTableViewControls.sortingTitle": "排序", + "ComponentHealthCheckTableViewControls.excludeSkipped": "Exclude Skipped tests from statistics", "Conditions.all": "全部", "Conditions.allShort": "全部", "Conditions.any": "任何", @@ -2057,7 +2058,7 @@ "Widgets.Description.bugTrend": "显示每次运行失败的测试用例数量的增长趋势。", "Widgets.Description.casesTrend": " - 选择“测试任务模式”将显示测试用例每次运行的增量,
    - 选择“时间线模式”将显示测试用例按日期分布的增量(每天拥有测试用例数量最多的测试任务中)。", "Widgets.Description.componentHealthCheck": "显示由指定属性所指示的应用程序组件的通过率。", - "Widgets.Description.componentHealthCheckTable": "显示由指定属性所指示的应用程序组件的详细统计信息。由于小部件包含复杂的查询,小部件可能需要渲染一段时间(大约10分钟)", + "Widgets.Description.componentHealthCheckTable": "Shows the detailed statistics of the application components which are indicated by the specified attributes with an ability to exclude Skipped tests from the statistics. As far the widget contains complicated queries, the widget can be rendering some time (~ 10 min)", "Widgets.Description.cumulative": "显示具有相同属性关键字的测试任务的汇总统计的增长趋势。", "Widgets.Description.flakyTestCases": "Shows the TOP-50 the most flaky test cases within the specified launches.", "Widgets.Description.investigatedTrend": " - 选择“测试任务模式”将显示每次运行测试任务是否被分析(“已分析”/“待分析”的百分比),
    - 选择“时间轴模式”将按日期分布的形式显示在每天所有运行的测试中“已分析”/“待分析”的百分比。", @@ -2177,4 +2178,4 @@ "usersGrid.roleNonAdmin": "非管理", "usersGrid.type": "类型", "usersGrid.user": "登录" -} \ No newline at end of file +} diff --git a/app/src/components/widgets/multiLevelWidgets/componentHealthCheckTable/componentHealthCheckTable.jsx b/app/src/components/widgets/multiLevelWidgets/componentHealthCheckTable/componentHealthCheckTable.jsx index f013ea3887..d8da4b1bbd 100644 --- a/app/src/components/widgets/multiLevelWidgets/componentHealthCheckTable/componentHealthCheckTable.jsx +++ b/app/src/components/widgets/multiLevelWidgets/componentHealthCheckTable/componentHealthCheckTable.jsx @@ -304,10 +304,10 @@ export class ComponentHealthCheckTable extends Component { const customProps = { minPassingRate: this.getPassingRateValue(), formatMessage, - isLatest: widget.contentParameters && widget.contentParameters.widgetOptions.latest, + isLatest: widget.contentParameters?.widgetOptions.latest, linkPayload: { projectId: project, - filterId: widget.appliedFilters[0] && widget.appliedFilters[0].id, + filterId: widget.appliedFilters[0]?.id, testItemIds: TEST_ITEMS_TYPE_LIST, }, getCompositeAttributes: this.getCompositeAttributes, @@ -321,6 +321,10 @@ export class ComponentHealthCheckTable extends Component { return columns; } + if (widget.contentParameters?.widgetOptions.excludeSkipped && item === STATS_SKIPPED) { + return columns; + } + return [...columns, getColumn(item, customProps, customColumn)]; }, []); }; diff --git a/app/src/pages/inside/dashboardItemPage/modals/common/widgetControls/componentHealthCheckTableViewControls.jsx b/app/src/pages/inside/dashboardItemPage/modals/common/widgetControls/componentHealthCheckTableViewControls.jsx index 7c9e4262bb..99056a2e41 100644 --- a/app/src/pages/inside/dashboardItemPage/modals/common/widgetControls/componentHealthCheckTableViewControls.jsx +++ b/app/src/pages/inside/dashboardItemPage/modals/common/widgetControls/componentHealthCheckTableViewControls.jsx @@ -36,6 +36,7 @@ import { activeProjectSelector } from 'controllers/user'; import { DEFAULT_LAUNCHES_LIMIT } from 'controllers/testItem'; import { getWidgetModeOptions } from './utils/getWidgetModeOptions'; import { + CheckboxControl, FiltersControl, InputControl, AttributesFieldArrayControl, @@ -80,6 +81,10 @@ const messages = defineMessages({ defaultMessage: 'Enter an attribute key whose unique value will be used for combine tests into groups', }, + excludeSkipped: { + id: 'ComponentHealthCheckTableViewControls.excludeSkipped', + defaultMessage: 'Exclude Skipped tests from statistics', + }, }); const passingRateValidator = (formatMessage) => @@ -133,6 +138,7 @@ export class ComponentHealthCheckTableViewControls extends Component { asc: false, sortingColumn: WIDGET_OPTIONS.SORT.PASSING_RATE, }, + excludeSkipped: false, }, }, }); @@ -227,6 +233,9 @@ export class ComponentHealthCheckTableViewControls extends Component { )} /> + + + [ ), From 69ceacdca6f4f33a966c0063a0510f4adc2a8e63 Mon Sep 17 00:00:00 2001 From: Vadim73i <55870906+Vadim73i@users.noreply.github.com> Date: Tue, 23 Jan 2024 12:58:42 +0300 Subject: [PATCH 018/183] EPMRPP-88348 || Implement multiline text field for plugin integrations (#3733) * EPMRPP-88348 || Description is not added to plugin issue when posting it if it contains label * EPMRPP-88348 || code review fixes - 1 --- .../fieldTextFlex/fieldTextFlex.jsx | 15 ++- .../fieldTextFlex/fieldTextFlex.scss | 99 ++++++++++++++----- .../fields/dynamicFieldsSection/constants.js | 1 + .../dynamicFieldsSection/dynamicFieldMap.js | 3 + .../dynamicFieldsSection/fields/index.js | 1 + .../fields/multilineTextField.jsx | 47 +++++++++ 6 files changed, 134 insertions(+), 32 deletions(-) create mode 100644 app/src/components/fields/dynamicFieldsSection/fields/multilineTextField.jsx diff --git a/app/src/componentLibrary/fieldTextFlex/fieldTextFlex.jsx b/app/src/componentLibrary/fieldTextFlex/fieldTextFlex.jsx index 2a38f69029..1b6477b597 100644 --- a/app/src/componentLibrary/fieldTextFlex/fieldTextFlex.jsx +++ b/app/src/componentLibrary/fieldTextFlex/fieldTextFlex.jsx @@ -22,6 +22,8 @@ const cx = classNames.bind(styles); const HEIGHT = 72; const BORDER = 2; +const LIGHT_VARIANT = 'light'; +const DARK_VARIANT = 'dark'; export const FieldTextFlex = ({ value, @@ -38,6 +40,7 @@ export const FieldTextFlex = ({ className, label, helpText, + variant, }) => { const resizeHeight = (e) => { e.target.style.height = `${HEIGHT}px`; @@ -45,10 +48,10 @@ export const FieldTextFlex = ({ }; return ( <> - {label && {label}} + {label && {label}}