From dc5cfca409c4779c144f2bbe35e21bc35d6327db Mon Sep 17 00:00:00 2001 From: maria-hambardzumian <164881199+maria-hambardzumian@users.noreply.github.com> Date: Fri, 6 Sep 2024 13:29:26 +0400 Subject: [PATCH 1/4] EPMRPP-94958 || Jira Cloud plugin. Error on Post issue (#4004) * Update CODEOWNERS * EPMRPP-94958 || Jira Cloud plugin. Error on Post issue * EPMRPP-94958 || code review fix -1 --------- Co-authored-by: Ilya --- .github/CODEOWNERS | 2 +- .../dynamicFieldsSection.jsx | 21 +++++++------------ .../fields/dynamicFieldsSection/utils.js | 8 +++++++ .../modals/postIssueModal/postIssueModal.jsx | 11 ++++++++-- 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 8db1a9d345..0ad4d71c46 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -* @AmsterGet @Vadim73i @BlazarQSO @maria-hambardzumian +* @AmsterGet @BlazarQSO @maria-hambardzumian diff --git a/app/src/components/fields/dynamicFieldsSection/dynamicFieldsSection.jsx b/app/src/components/fields/dynamicFieldsSection/dynamicFieldsSection.jsx index 775bcdbe38..4fac0f5a68 100644 --- a/app/src/components/fields/dynamicFieldsSection/dynamicFieldsSection.jsx +++ b/app/src/components/fields/dynamicFieldsSection/dynamicFieldsSection.jsx @@ -17,15 +17,9 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames/bind'; -import { JIRA_CLOUD } from 'pages/inside/projectSettingsPageContainer/content/integrations/integrationsList/integrationInfo/constats'; import { dynamicFieldShape } from './dynamicFieldShape'; -import { getFieldComponent } from './utils'; -import { - ASSIGNEE_FIELD_NAME, - MULTIPLE_AUTOCOMPLETE_TYPE, - VALUE_ID_KEY, - VALUE_NAME_KEY, -} from './constants'; +import { getFieldComponent, isJiraCloudAssigneeField } from './utils'; +import { AUTOCOMPLETE_TYPE, VALUE_ID_KEY, VALUE_NAME_KEY } from './constants'; import styles from './dynamicFieldsSection.scss'; const cx = classNames.bind(styles); @@ -70,12 +64,11 @@ export class DynamicFieldsSection extends Component { } = this.props; return fields.map((field) => { - const isJiraCloud = integrationInfo.pluginName === JIRA_CLOUD; - const isAssigneeField = field.fieldName?.toLowerCase() === ASSIGNEE_FIELD_NAME.toLowerCase(); - const fieldType = - isJiraCloud && isAssigneeField ? MULTIPLE_AUTOCOMPLETE_TYPE : field.fieldType; - - const FieldComponent = getFieldComponent({ ...field, fieldType }); + const { pluginName } = integrationInfo; + const FieldComponent = getFieldComponent({ + ...field, + ...(isJiraCloudAssigneeField(pluginName, field) && { fieldType: AUTOCOMPLETE_TYPE }), + }); return ( { }); return obj; }; + +export const isJiraCloudAssigneeField = (pluginName, field) => { + const isJiraCloud = pluginName === JIRA_CLOUD; + const isAssigneeField = field.fieldName?.toLowerCase() === ASSIGNEE_FIELD_NAME.toLowerCase(); + return isJiraCloud && isAssigneeField; +}; diff --git a/app/src/pages/inside/stepPage/modals/postIssueModal/postIssueModal.jsx b/app/src/pages/inside/stepPage/modals/postIssueModal/postIssueModal.jsx index 7abeee9fbb..43ece4833a 100644 --- a/app/src/pages/inside/stepPage/modals/postIssueModal/postIssueModal.jsx +++ b/app/src/pages/inside/stepPage/modals/postIssueModal/postIssueModal.jsx @@ -38,6 +38,7 @@ import { normalizeFieldsWithOptions, mapFieldsToValues, removeNoneValues, + isJiraCloudAssigneeField, } from 'components/fields/dynamicFieldsSection/utils'; import { projectInfoSelector } from 'controllers/project'; import { FieldProvider } from 'components/fields/fieldProvider'; @@ -279,7 +280,7 @@ export class PostIssueModal extends Component { getBtsIntegrationBackLink, data: { items }, } = this.props; - + const pluginName = this.state.pluginName; const fields = this.state.fields.map((field) => { const isAutocomplete = field.fieldType === AUTOCOMPLETE_TYPE || @@ -290,7 +291,13 @@ export class PostIssueModal extends Component { if (!Array.isArray(formFieldData)) { preparedFormFieldData = formFieldData ? [formFieldData] : []; } - return { ...field, [isAutocomplete ? 'namedValue' : 'value']: preparedFormFieldData }; + return { + ...field, + [isAutocomplete ? 'namedValue' : 'value']: preparedFormFieldData, + ...(isJiraCloudAssigneeField(pluginName, field) && { + value: preparedFormFieldData.map((item) => item.id), + }), + }; }); const backLinks = items.reduce( (acc, item) => ({ ...acc, [item.id]: getBtsIntegrationBackLink(item) }), From 5131adde6d1c6559da5ec755eefc87f4407482b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20Mart=C3=ADnez?= <39908763+mg-diego@users.noreply.github.com> Date: Fri, 6 Sep 2024 15:16:54 +0200 Subject: [PATCH 2/4] Update ES translations (#4002) Co-authored-by: Diego Martinez Gilabert --- app/localization/translated/es.json | 40 ++++++++++++++--------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/app/localization/translated/es.json b/app/localization/translated/es.json index 399afd6a0b..a94647513c 100644 --- a/app/localization/translated/es.json +++ b/app/localization/translated/es.json @@ -78,7 +78,7 @@ "AddEditNotificationCaseModal.title": "{actionType} Regla de notificación", "AddEditNotificationModal.nameLabel": "Nombre de la regla", "AddEditNotificationModal.namePlaceholder": "Nombre de la regla", - "AddEditNotificationModal.recipientsError": "Please enter existent user name on your project or valid email", + "AddEditNotificationModal.recipientsError": "Por favor, introduzca un nombre de usuario existente en su proyecto o un correo electrónico válido", "AddEditNotificationModal.recipientsPlaceholder": "Nombre de usuario/correo electrónico", "AddEditNotificationModal.ruleNameHint": "Campo obligatorio. El nombre de la regla debe tener entre 1 y 55 caracteres", "AddFilter.filterName": "Nombre del filtro", @@ -87,10 +87,10 @@ "AddIntegrationModal.createProjectTitle": "Crear integración de proyecto", "AddIntegrationModal.editGlobalIntegrationTitle": "Editar integración global", "AddIntegrationModal.editProjectIntegrationTitle": "Editar integración de proyecto", - "AddLdapIntegrationModal.createLdapTitle": "Create Global Integration", - "AddLdapIntegrationModal.editLdapIntegrationTitle": "Edit Global Integration", - "AddLdapIntegrationModal.fieldSettingsTitle": "Field settings", - "AddLdapIntegrationModal.serverSettingsTitle": "Server settings", + "AddLdapIntegrationModal.createLdapTitle": "Crear Integración Global", + "AddLdapIntegrationModal.editLdapIntegrationTitle": "Editar Integratión Global", + "AddLdapIntegrationModal.fieldSettingsTitle": "Configuración de campos", + "AddLdapIntegrationModal.serverSettingsTitle": "Configuración del servidor", "AddNewCaseButton.addNewRuleButton": "Agregar nueva regla", "AddNewCaseButton.addRule": "Agregar regla", "AddUserForm.addUserTitle": "Agregar usuario", @@ -548,7 +548,7 @@ "DefectTypesTab.warningSubMessage": "La cantidad de tipos de defectos en tu proyecto es actualmente de {maxLength} de {maxLength}. Podrás crear uno nuevo después de eliminar al menos uno previamente creado", "DeleteAccountBlock.deleteAccount": "Eliminar cuenta", "DeleteAccountBlock.tooltipAdminDisabledText": "Solo los usuarios con un rol distinto al de administrador pueden eliminar su cuenta.\nAdemás, otro administrador también puede hacerlo.", - "DeleteAccountBlock.tooltipDefaultUserDisabledText": "It's forbidden to delete account of default user on Demo instance.", + "DeleteAccountBlock.tooltipDefaultUserDisabledText": "Está prohibido eliminar la cuenta del usuario por defecto en la instancia Demo.", "DeleteAccountFeedbackModal.alternative": "Encontré una mejor alternativa", "DeleteAccountFeedbackModal.continue": "Continuar", "DeleteAccountFeedbackModal.deleteAccountReasonSizeHint": "El campo debe tener un tamaño máximo de 128 caracteres.", @@ -1056,7 +1056,7 @@ "IntegrationsDescription.noGlobalIntegrationsButtonAdd": "Agregar integración de proyecto", "IntegrationsDescription.noGlobalIntegrationsDescription": "Las integraciones no están configuradas. Puedes configurar manualmente una integración para este proyecto.", "IntegrationsDescription.noGlobalIntegrationsMessage": "No hay integraciones", - "IntegrationsDescription.projectIntegrationAddLimited": "Only one Project Integration can be created", + "IntegrationsDescription.projectIntegrationAddLimited": "Sólo puede crearse un proyecto de integración", "IntegrationsDescription.projectIntegrationReset": "Restablecer a integraciones globales", "IntegrationsDescription.projectIntegrationResetDescription": "¿Estás seguro de que deseas restablecer la configuración a las Integraciones Globales? Todas tus integraciones de proyecto se eliminarán sin posibilidad de recuperación.", "IntegrationsDescription.projectIntegrationText": "Las integraciones de proyecto se crean específicamente para cada proyecto.", @@ -1195,16 +1195,16 @@ "LaunchesTableControls.ItemsValidationError": "La cantidad de elementos debe ser entre '1' y '600'", "LdapFormFields.baseDnLabel": "DN Base", "LdapFormFields.emailAttributeLabel": "Atributo de Correo Electrónico", - "LdapFormFields.firstAndLastName": "First & last name", - "LdapFormFields.firstNameAttributeLabel": "First name", - "LdapFormFields.fullName": "Full name", + "LdapFormFields.firstAndLastName": "Nombre y apellidos", + "LdapFormFields.firstNameAttributeLabel": "Nombre", + "LdapFormFields.fullName": "Nombre completo", "LdapFormFields.fullNameAttributeLabel": "Atributo de Nombre Completo", "LdapFormFields.groupSearchBaseLabel": "Base de Búsqueda de Grupo", "LdapFormFields.groupSearchFilterLabel": "Filtro de Búsqueda de Grupo", - "LdapFormFields.lastNameAttributeLabel": "Last name", + "LdapFormFields.lastNameAttributeLabel": "Apellidos", "LdapFormFields.managerDnLabel": "DN del Manager", "LdapFormFields.managerPasswordLabel": "Contraseña del Manager", - "LdapFormFields.nameTypeLabel": "Name attributes mode", + "LdapFormFields.nameTypeLabel": "Modo nombre de atributos", "LdapFormFields.passwordAttributeLabel": "Atributo de Contraseña", "LdapFormFields.passwordEncoderTypeLabel": "Tipo de Codificador de Contraseña", "LdapFormFields.photoAttributeLabel": "Atributo de Foto", @@ -1523,8 +1523,8 @@ "NotificationsEnableForm.toggleNotificationsLabel": "Notificaciones automáticas por correo electrónico", "NotificationsEnableForm.toggleNotificationsNote": "Enviar notificaciones por correo electrónico al finalizar las ejecuciones", "NotificationsEnableForm.typeDescription": "Seleccione una lista de destinatarios {type} para cada regla para enviar notificaciones relacionadas con la ejecución.", - "NotificationsEnableForm.unableToConfigure": "Why can't I configure it?", - "NotificationsEnableForm.unableToConfigureDescription": "Learn more about roles and permissions", + "NotificationsEnableForm.unableToConfigure": "¿Por qué no puedo configurarlo?", + "NotificationsEnableForm.unableToConfigureDescription": "Más información sobre funciones y permisos", "NotificationsTab.updateProjectNotificationsConfigurationSuccess": "¡La configuración de notificaciones se ha actualizado correctamente!", "OverallStatisticsControls.ContentFieldsValidationError": "Seleccione al menos un elemento", "OverallStatisticsControls.CriteriaFieldLabel": "Criterios para el widget", @@ -2000,12 +2000,12 @@ "Timer.hours": "h", "Timer.minutes": "m", "Timer.seconds": "s", - "TwoStepsFooter.cancel": "Cancel", - "TwoStepsFooter.create": "Create", - "TwoStepsFooter.discardChanges": "Discard changes", - "TwoStepsFooter.nextStep": "Next step", - "TwoStepsFooter.previousStep": "Previous step", - "TwoStepsFooter.saveAndClose": "Save & close", + "TwoStepsFooter.cancel": "Cancelar", + "TwoStepsFooter.create": "Crear", + "TwoStepsFooter.discardChanges": "Descartar cambios", + "TwoStepsFooter.nextStep": "Siguiente paso", + "TwoStepsFooter.previousStep": "Paso previo", + "TwoStepsFooter.saveAndClose": "Guardar y cerrar", "UnassignButton.anassignBtn": "Desasignar", "UnassignButton.anassignUser": "¡El usuario ha sido desasignado del proyecto!", "UnassignButton.unAssignTitle": "Desasignar usuario del proyecto", From 46b011986497de93b24187484dbd04953a374225 Mon Sep 17 00:00:00 2001 From: maria-hambardzumian <164881199+maria-hambardzumian@users.noreply.github.com> Date: Wed, 11 Sep 2024 15:16:18 +0400 Subject: [PATCH 3/4] EPMRPP-95113 || Wrong spacing between text in "Delete launch" modal window (#4009) --- .../modals/deleteLaunchModal/deleteLaunchModal.jsx | 1 + .../modals/deleteLaunchModal/deleteLaunchModal.scss | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/app/src/pages/inside/launchesPage/modals/deleteLaunchModal/deleteLaunchModal.jsx b/app/src/pages/inside/launchesPage/modals/deleteLaunchModal/deleteLaunchModal.jsx index 0a4cf1af50..f6e657f786 100644 --- a/app/src/pages/inside/launchesPage/modals/deleteLaunchModal/deleteLaunchModal.jsx +++ b/app/src/pages/inside/launchesPage/modals/deleteLaunchModal/deleteLaunchModal.jsx @@ -170,6 +170,7 @@ const DeleteLaunchModal = ({ data: { launches, confirmDeleteLaunches, userId } } cancelButton={cancelButton} warningMessage={warning} CustomFooter={selectedImportantLaunches.length > 0 ? CustomFooter : null} + contentClassName={cx('delete-launch-modal-content')} >

{Parser(DOMPurify.sanitize(getMainContent()))}

diff --git a/app/src/pages/inside/launchesPage/modals/deleteLaunchModal/deleteLaunchModal.scss b/app/src/pages/inside/launchesPage/modals/deleteLaunchModal/deleteLaunchModal.scss index 6cc378bbfa..9aae4bbd82 100644 --- a/app/src/pages/inside/launchesPage/modals/deleteLaunchModal/deleteLaunchModal.scss +++ b/app/src/pages/inside/launchesPage/modals/deleteLaunchModal/deleteLaunchModal.scss @@ -13,8 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +.delete-launch-modal-content { + padding: 15px 10px; +} .message { + line-height: 24px; + b { font-family: $FONT-SEMIBOLD; } From 2543d24b3a6d4224e9a932c1242ea8cdea446971 Mon Sep 17 00:00:00 2001 From: maria-hambardzumian <164881199+maria-hambardzumian@users.noreply.github.com> Date: Mon, 16 Sep 2024 12:18:19 +0400 Subject: [PATCH 4/4] EPMRPP-95285 || Unable to Unlink the issue & EPMRPP-95281 || Wrong validation message (#4011) * EPMRPP-95285 || Unable to Unlink the issue * EPMRPP-95281 || Wrong validation message --- app/src/components/fields/fieldErrorHint/fieldErrorHint.jsx | 2 +- app/src/pages/inside/uniqueErrorsPage/uniqueErrorsPage.jsx | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/components/fields/fieldErrorHint/fieldErrorHint.jsx b/app/src/components/fields/fieldErrorHint/fieldErrorHint.jsx index 0cd87b61ad..8575b69694 100644 --- a/app/src/components/fields/fieldErrorHint/fieldErrorHint.jsx +++ b/app/src/components/fields/fieldErrorHint/fieldErrorHint.jsx @@ -186,7 +186,7 @@ const messages = defineMessages({ }, btsIntegrationNameHint: { id: 'BtsCommonMessages.btsIntegrationNameHint', - defaultMessage: 'Integration name should have a size from 1 to 55 characters', + defaultMessage: 'Integration name should have size from 1 to 55 characters', }, btsUrlHint: { id: 'BtsCommonMessages.btsUrlHint', diff --git a/app/src/pages/inside/uniqueErrorsPage/uniqueErrorsPage.jsx b/app/src/pages/inside/uniqueErrorsPage/uniqueErrorsPage.jsx index bc434b099e..154579ce65 100644 --- a/app/src/pages/inside/uniqueErrorsPage/uniqueErrorsPage.jsx +++ b/app/src/pages/inside/uniqueErrorsPage/uniqueErrorsPage.jsx @@ -237,7 +237,9 @@ export class UniqueErrorsPage extends Component { ]; this.props.onUnlinkIssue(items, { fetchFunc: this.unselectAndFetchItems, - eventsInfo: {}, + eventsInfo: { + unlinkBtn: UNIQUE_ERRORS_PAGE_EVENTS.UNLINK_ISSUE_MODAL_EVENTS.getClickUnlinkButtonEventParameters(), + }, }); }; deleteItems = () => {