diff --git a/app/src/components/containers/AttributeListFormField/attributeListFormField.jsx b/app/src/components/containers/AttributeListFormField/attributeListFormField.jsx
index b8cfef72a5..b606546a9f 100644
--- a/app/src/components/containers/AttributeListFormField/attributeListFormField.jsx
+++ b/app/src/components/containers/AttributeListFormField/attributeListFormField.jsx
@@ -18,7 +18,7 @@ import React from 'react';
import PropTypes from 'prop-types';
import className from 'classnames/bind';
import { defineMessages, useIntl } from 'react-intl';
-import { Checkbox } from 'componentLibrary/checkbox';
+import { Checkbox } from '@reportportal/ui-kit';
import { AttributeListContainer } from 'components/containers/attributeListContainer';
import styles from './attributeListFormField.scss';
@@ -69,7 +69,7 @@ export const AttributeListFormField = ({
{formatMessage(messages.attributes)}
diff --git a/app/src/components/containers/localizationContainer/localizationContainer.jsx b/app/src/components/containers/localizationContainer/localizationContainer.jsx
index 92ed97dbb0..cd90ee68b7 100644
--- a/app/src/components/containers/localizationContainer/localizationContainer.jsx
+++ b/app/src/components/containers/localizationContainer/localizationContainer.jsx
@@ -25,6 +25,7 @@ import localeUK from '../../../../localization/translated/uk.json';
import localeRU from '../../../../localization/translated/ru.json';
import localeBE from '../../../../localization/translated/be.json';
import localeZH from '../../../../localization/translated/zh.json';
+import localeES from '../../../../localization/translated/es.json';
const localesReadyPromise = polyfillLocales();
@@ -49,6 +50,7 @@ export class LocalizationContainer extends React.Component {
be: localeBE,
uk: localeUK,
zh: localeZH,
+ es: localeES,
};
}
diff --git a/app/src/components/fields/fieldErrorHint/fieldErrorHint.jsx b/app/src/components/fields/fieldErrorHint/fieldErrorHint.jsx
index 2ff1907696..0a9a5f3d67 100644
--- a/app/src/components/fields/fieldErrorHint/fieldErrorHint.jsx
+++ b/app/src/components/fields/fieldErrorHint/fieldErrorHint.jsx
@@ -226,7 +226,7 @@ const messages = defineMessages({
},
ruleNameDuplicateHint: {
id: 'Notifications.ruleNameDuplicateHint',
- defaultMessage: 'Rule with the same name already exist on the project',
+ defaultMessage: 'Rule with the same name already exists for this communication channel',
},
customColumnsDuplicationHint: {
id: 'ProductStatusControls.customColumnsDuplicationHint',
diff --git a/app/src/components/integrations/elements/integrationSettings/integrationForm/integrationForm.jsx b/app/src/components/integrations/elements/integrationSettings/integrationForm/integrationForm.jsx
index 478ec4350a..f838d795f8 100644
--- a/app/src/components/integrations/elements/integrationSettings/integrationForm/integrationForm.jsx
+++ b/app/src/components/integrations/elements/integrationSettings/integrationForm/integrationForm.jsx
@@ -21,7 +21,7 @@ import { reduxForm } from 'redux-form';
import track from 'react-tracking';
import classNames from 'classnames/bind';
import { COMMON_LOCALE_KEYS } from 'common/constants/localization';
-import { Button } from 'componentLibrary/button';
+import { Button } from '@reportportal/ui-kit';
import { isIntegrationSupportsMultipleInstances } from 'components/integrations/utils';
import { PLUGINS_PAGE_EVENTS, SETTINGS_PAGE_EVENTS } from 'components/main/analytics/events';
import styles from './integrationForm.scss';
@@ -170,7 +170,7 @@ export class IntegrationForm extends Component {
@@ -180,7 +180,7 @@ export class IntegrationForm extends Component {
@@ -192,7 +192,7 @@ export class IntegrationForm extends Component {
variant="ghost"
onClick={this.toggleDisabled}
disabled={shouldFieldsBeHidden}
- dataAutomationId="cancelConfigurationButton"
+ data-automation-id="cancelConfigurationButton"
>
{formatMessage(COMMON_LOCALE_KEYS.CANCEL)}
diff --git a/app/src/components/integrations/integrationProviders/emailIntegration/emailFormFields/emailFormFields.jsx b/app/src/components/integrations/integrationProviders/emailIntegration/emailFormFields/emailFormFields.jsx
index ecac8c096f..58a46c8a4f 100644
--- a/app/src/components/integrations/integrationProviders/emailIntegration/emailFormFields/emailFormFields.jsx
+++ b/app/src/components/integrations/integrationProviders/emailIntegration/emailFormFields/emailFormFields.jsx
@@ -28,7 +28,7 @@ import {
} from 'common/utils/validation';
import { FieldProvider } from 'components/fields/fieldProvider';
import { FieldErrorHint } from 'components/fields/fieldErrorHint';
-import { Checkbox } from 'componentLibrary/checkbox';
+import { Checkbox } from '@reportportal/ui-kit';
import { INTEGRATION_FORM } from 'components/integrations/elements';
import { FieldElement } from 'pages/inside/projectSettingsPageContainer/content/elements';
import { FieldText } from 'componentLibrary/fieldText';
diff --git a/app/src/components/main/analytics/events/ga4Events/projectSettingsPageEvents.js b/app/src/components/main/analytics/events/ga4Events/projectSettingsPageEvents.js
index 63bceabb81..3707ec2c9f 100644
--- a/app/src/components/main/analytics/events/ga4Events/projectSettingsPageEvents.js
+++ b/app/src/components/main/analytics/events/ga4Events/projectSettingsPageEvents.js
@@ -103,58 +103,92 @@ export const PROJECT_SETTINGS_DEMO_DATA_EVENTS = {
};
export const PROJECT_SETTINGS_NOTIFICATIONS_EVENTS = {
- CLICK_SAVE_BUTTON_IN_MODAL: ({ modalName, status, number, type, switcher }) => ({
+ CLICK_SAVE_BUTTON_IN_MODAL: ({
+ modalName,
+ status,
+ number,
+ type,
+ switcher,
+ ruleId,
+ communicationChanelName,
+ }) => ({
...BASIC_EVENT_PARAMETERS_NOTIFICATIONS,
element_name: 'button_save',
modal: normalizeEventString(modalName),
status: getStatus(status),
type: normalizeEventString(type),
switcher: getSwitcher(switcher),
+ icon_name: ruleId,
+ condition: communicationChanelName,
...(number !== undefined && { number }),
}),
- CLICK_CHECKBOX_AUTO_NOTIFICATIONS: (status) => ({
+ SWITCH_NOTIFICATION_RULE: (communicationChanelName, ruleId, switcher) => ({
...BASIC_EVENT_PARAMETERS_NOTIFICATIONS,
- element_name: 'checkbox_auto_email_notifications',
- status: getStatus(status),
+ switcher: getSwitcher(switcher),
+ condition: communicationChanelName,
+ element_name: 'rule',
+ icon_name: ruleId,
}),
- SWITCH_NOTIFICATION_RULE: (switcher) => ({
+ SWITCH_PLUGIN_NOTIFICATIONS: (communicationChanelName, switcher) => ({
...BASIC_EVENT_PARAMETERS_NOTIFICATIONS,
switcher: getSwitcher(switcher),
+ element_name: `${communicationChanelName}_notifications`,
}),
- clickDocumentationLink: (place) => ({
+ SWITCH_ALL_NOTIFICATIONS: (switcher) => ({
...BASIC_EVENT_PARAMETERS_NOTIFICATIONS,
- ...(place && { place }),
- link_name: 'documentation',
+ switcher: getSwitcher(switcher),
+ element_name: 'all_notifications',
}),
- CLICK_CREATE_RULE_BUTTON: {
+ CLICK_DISCOVER_PLUGINS_LINK: {
...BASIC_EVENT_PARAMETERS_NOTIFICATIONS,
- element_name: 'button_create_rule',
+ link_name: 'discover_plugins',
+ },
+
+ CLICK_INTEGRATION_SETTINGS_LINK: {
+ ...BASIC_EVENT_PARAMETERS_NOTIFICATIONS,
+ element_name: 'integration_settings',
+ },
+
+ CLICK_CONFIGURE_INTEGRATION_LINK: {
+ ...BASIC_EVENT_PARAMETERS_NOTIFICATIONS,
+ element_name: 'configure_integration',
+ condition: 'email',
},
- CLICK_TO_EXPAND_NOTIFICATIONS_DETAILS: {
+ CLICK_CREATE_RULE_BUTTON: (communicationChanelName) => ({
+ ...BASIC_EVENT_PARAMETERS_NOTIFICATIONS,
+ element_name: 'button_create_rule',
+ condition: communicationChanelName,
+ }),
+
+ CLICK_TO_EXPAND_NOTIFICATIONS_DETAILS: (communicationChanelName) => ({
...BASIC_EVENT_PARAMETERS_NOTIFICATIONS,
element_name: 'notifications_name',
status: 'open',
- },
+ condition: communicationChanelName,
+ }),
- CLICK_ICON_EDIT_NOTIFICATIONS: {
+ CLICK_ICON_EDIT_NOTIFICATIONS: (communicationChanelName) => ({
...BASIC_EVENT_PARAMETERS_NOTIFICATIONS,
icon_name: 'icon_edit',
- },
+ condition: communicationChanelName,
+ }),
- CLICK_ICON_DUPLICATE_NOTIFICATIONS: {
+ CLICK_ICON_DUPLICATE_NOTIFICATIONS: (communicationChanelName) => ({
...BASIC_EVENT_PARAMETERS_NOTIFICATIONS,
icon_name: 'icon_duplicate',
- },
+ condition: communicationChanelName,
+ }),
- CLICK_ICON_DELETE_NOTIFICATIONS: {
+ CLICK_ICON_DELETE_NOTIFICATIONS: (communicationChanelName) => ({
...BASIC_EVENT_PARAMETERS_NOTIFICATIONS,
icon_name: 'icon_delete',
- },
+ condition: communicationChanelName,
+ }),
};
export const PROJECT_SETTINGS_DEFECT_TYPES_EVENTS = {
diff --git a/app/src/controllers/log/sagas.js b/app/src/controllers/log/sagas.js
index 0a75551103..eef4a45b83 100644
--- a/app/src/controllers/log/sagas.js
+++ b/app/src/controllers/log/sagas.js
@@ -44,7 +44,7 @@ import {
} from 'controllers/log/nestedSteps/actionCreators';
import { createNamespacedQuery } from 'common/utils/routingUtils';
import { FAILED } from 'common/constants/testStatuses';
-import { ERROR } from 'common/constants/logLevels';
+import { ERROR, FATAL } from 'common/constants/logLevels';
import {
fetchErrorLogs,
clearLogPageStackTrace,
@@ -128,6 +128,9 @@ function* fetchAllErrorLogs({
excludeLogContent = true,
level,
}) {
+ const logMessages = yield select(logItemsSelector);
+ const requiresErrorLogLocation = logMessages.some((log) => [ERROR, FATAL].includes(log.level));
+
const { id } = logItem;
const { projectKey, query, filterLevel } = yield call(collectLogPayload);
let retryId = null;
@@ -137,15 +140,20 @@ function* fetchAllErrorLogs({
}
let cancelRequest = () => {};
try {
- yield put(
- fetchDataAction(namespace)(URLS.errorLogs(projectKey, retryId || id, level || filterLevel), {
- params: { ...query, excludeLogContent },
- abort: (cancelFunc) => {
- cancelRequest = cancelFunc;
- },
- }),
- );
- yield take(createFetchPredicate(namespace));
+ if (logViewMode === DETAILED_LOG_VIEW && requiresErrorLogLocation) {
+ yield put(
+ fetchDataAction(namespace)(
+ URLS.errorLogs(projectKey, retryId || id, level || filterLevel),
+ {
+ params: { ...query, excludeLogContent },
+ abort: (cancelFunc) => {
+ cancelRequest = cancelFunc;
+ },
+ },
+ ),
+ );
+ yield take(createFetchPredicate(namespace));
+ }
} catch (err) {
yield handleError(err);
} finally {
diff --git a/app/src/controllers/plugins/uiExtensions/createImportProps.js b/app/src/controllers/plugins/uiExtensions/createImportProps.js
index 514cde17ce..de50c52f86 100644
--- a/app/src/controllers/plugins/uiExtensions/createImportProps.js
+++ b/app/src/controllers/plugins/uiExtensions/createImportProps.js
@@ -30,7 +30,7 @@ import {
import Link from 'redux-first-router-link';
import { useTracking } from 'react-tracking';
import classNames from 'classnames/bind';
-import { BubblesLoader } from '@reportportal/ui-kit';
+import { BubblesLoader, Button, Checkbox } from '@reportportal/ui-kit';
import { GhostButton } from 'components/buttons/ghostButton';
import { BigButton } from 'components/buttons/bigButton';
import { NavigationTabs } from 'components/main/navigationTabs';
@@ -183,9 +183,7 @@ import {
RuleList as RuleListComponent,
DraggableRuleList,
} from 'pages/inside/projectSettingsPageContainer/content/elements';
-import { Checkbox } from 'componentLibrary/checkbox';
import { FieldTextFlex } from 'componentLibrary/fieldTextFlex';
-import { Button } from 'componentLibrary/button';
import { Toggle } from 'componentLibrary/toggle';
import { EmptyStatePage } from 'pages/inside/projectSettingsPageContainer/content/emptyStatePage';
import { Dropdown } from 'componentLibrary/dropdown';
diff --git a/app/src/controllers/project/actionCreators.js b/app/src/controllers/project/actionCreators.js
index f69d28c724..12f757c2e4 100644
--- a/app/src/controllers/project/actionCreators.js
+++ b/app/src/controllers/project/actionCreators.js
@@ -169,9 +169,9 @@ export const fetchProjectNotificationsSuccessAction = (notifications) => ({
payload: notifications,
});
-export const addProjectNotificationAction = (notification) => ({
+export const addProjectNotificationAction = (notification, triggerAddingEvent = () => {}) => ({
type: ADD_PROJECT_NOTIFICATION,
- payload: notification,
+ payload: { notification, triggerAddingEvent },
});
export const addProjectNotificationSuccessAction = (notification) => ({
diff --git a/app/src/controllers/project/sagas.js b/app/src/controllers/project/sagas.js
index c17e2ba703..79ac39627f 100644
--- a/app/src/controllers/project/sagas.js
+++ b/app/src/controllers/project/sagas.js
@@ -198,7 +198,7 @@ function* updateNotificationState({
yield put(updateConfigurationAttributesAction(updatedConfig));
}
-function* addProjectNotification({ payload: notification }) {
+function* addProjectNotification({ payload: { notification, triggerAddingEvent = () => {} } }) {
try {
const projectKey = yield select(projectKeySelector);
@@ -214,6 +214,7 @@ function* addProjectNotification({ payload: notification }) {
type: NOTIFICATION_TYPES.SUCCESS,
}),
);
+ triggerAddingEvent(response.id);
yield put(hideModalAction());
} catch (error) {
yield put(showDefaultErrorNotification(error));
diff --git a/app/src/layouts/common/appSidebar/helpAndService/modal/requestSupportModal.jsx b/app/src/layouts/common/appSidebar/helpAndService/modal/requestSupportModal.jsx
index 2bb011b182..f8022dbdf7 100644
--- a/app/src/layouts/common/appSidebar/helpAndService/modal/requestSupportModal.jsx
+++ b/app/src/layouts/common/appSidebar/helpAndService/modal/requestSupportModal.jsx
@@ -20,6 +20,7 @@ import { reduxForm } from 'redux-form';
import { useDispatch, useSelector } from 'react-redux';
import { useIntl } from 'react-intl';
import classNames from 'classnames/bind';
+import { Checkbox } from '@reportportal/ui-kit';
import { commonValidators } from 'common/utils/validation';
import { userEmailSelector } from 'controllers/user';
import { FieldProvider } from 'components/fields/fieldProvider';
@@ -29,7 +30,6 @@ import { NOTIFICATION_TYPES, showNotification } from 'controllers/notification';
import { HELP_AND_SUPPORT_EVENTS } from 'analyticsEvents/helpAndSupportEvents';
import { FieldText } from 'componentLibrary/fieldText';
import { ModalLayout } from 'componentLibrary/modal';
-import { Checkbox } from 'componentLibrary/checkbox';
import { hideModalAction, withModal } from 'controllers/modal';
import OpenIcon from 'common/img/open-in-new-tab-inline.svg';
import { referenceDictionary } from 'common/utils';
diff --git a/app/src/pages/inside/launchesPage/launchesPage.jsx b/app/src/pages/inside/launchesPage/launchesPage.jsx
index 13f2c161f0..bf306b8f31 100644
--- a/app/src/pages/inside/launchesPage/launchesPage.jsx
+++ b/app/src/pages/inside/launchesPage/launchesPage.jsx
@@ -623,7 +623,12 @@ export class LaunchesPage extends Component {
};
mergeLaunches = () => {
- this.props.mergeLaunchesAction(this.props.selectedLaunches, {
+ const launches = this.props.selectedLaunches.map((launch) => ({
+ ...launch,
+ startTime: new Date(launch.startTime).getTime(),
+ endTime: new Date(launch.endTime).getTime(),
+ }));
+ this.props.mergeLaunchesAction(launches, {
fetchFunc: this.unselectAndResetPage,
});
};
diff --git a/app/src/pages/inside/profilePage/deleteAccountBlock/deleteAccountBlock.jsx b/app/src/pages/inside/profilePage/deleteAccountBlock/deleteAccountBlock.jsx
index 8e22a629b4..a2e4f5daba 100644
--- a/app/src/pages/inside/profilePage/deleteAccountBlock/deleteAccountBlock.jsx
+++ b/app/src/pages/inside/profilePage/deleteAccountBlock/deleteAccountBlock.jsx
@@ -24,9 +24,11 @@ import { GhostButton } from 'components/buttons/ghostButton';
import { withTooltip } from 'components/main/tooltips/tooltip';
import { PROFILE_PAGE_EVENTS } from 'components/main/analytics/events';
import { showModalAction } from 'controllers/modal';
-import { isAdminSelector } from 'controllers/user';
+import { isAdminSelector, userIdSelector } from 'controllers/user';
+import { isDemoInstanceSelector } from 'controllers/appInfo';
import { instanceTypeSelector } from 'controllers/appInfo/selectors';
import { EPAM } from 'controllers/appInfo/constants';
+import { DEFAULT_USER_ID } from 'common/constants/accountRoles';
import styles from './deleteAccountBlock.scss';
const cx = classNames.bind(styles);
@@ -35,11 +37,15 @@ const messages = defineMessages({
id: 'DeleteAccountBlock.deleteAccount',
defaultMessage: 'Delete account',
},
- tooltipText: {
- id: 'DeleteAccountBlock.tooltipText',
+ tooltipAdminDisabledText: {
+ id: 'DeleteAccountBlock.tooltipAdminDisabledText',
defaultMessage:
'Only users with non-admin role can delete their account.\nAlternatively, other admin can do it.',
},
+ tooltipDefaultUserDisabledText: {
+ id: 'DeleteAccountBlock.tooltipDefaultUserDisabledText',
+ defaultMessage: "It's forbidden to delete account of default user on Demo instance.",
+ },
});
const Button = ({ onClick, formatMessage, disabled }) => (
@@ -57,17 +63,23 @@ const Button = ({ onClick, formatMessage, disabled }) => (
);
Button.propTypes = {
formatMessage: PropTypes.func.isRequired,
- disabled: PropTypes.bool.isRequired,
+ disabled: PropTypes.bool,
onClick: PropTypes.func,
};
Button.propTypes = {
+ disabled: false,
onClick: () => {},
};
-const TooltipContent = ({ formatMessage }) => (
-
{formatMessage(messages.tooltipText)}
+const TooltipContent = ({ formatMessage, isAdmin }) => (
+
+ {formatMessage(
+ isAdmin ? messages.tooltipAdminDisabledText : messages.tooltipDefaultUserDisabledText,
+ )}
+
);
TooltipContent.propTypes = {
formatMessage: PropTypes.func.isRequired,
+ isAdmin: PropTypes.bool.isRequired,
};
const ButtonWithTooltip = withTooltip({
@@ -83,7 +95,9 @@ export const DeleteAccountBlock = () => {
const { formatMessage } = useIntl();
const { trackEvent } = useTracking();
const isAdmin = useSelector(isAdminSelector);
+ const isDefaultUser = useSelector(userIdSelector) === DEFAULT_USER_ID;
const instanceType = useSelector(instanceTypeSelector);
+ const isDemoInstance = useSelector(isDemoInstanceSelector);
const onDeleteAccountClick = () => {
trackEvent(PROFILE_PAGE_EVENTS.CLICK_DELETE_ACCOUNT);
@@ -97,8 +111,8 @@ export const DeleteAccountBlock = () => {
return (
- {isAdmin ? (
-
+ {isAdmin || (isDefaultUser && isDemoInstance) ? (
+
) : (
)}
diff --git a/app/src/pages/inside/profilePage/localizationBlock/img/es-flag-inline.svg b/app/src/pages/inside/profilePage/localizationBlock/img/es-flag-inline.svg
new file mode 100644
index 0000000000..d945e4aa58
--- /dev/null
+++ b/app/src/pages/inside/profilePage/localizationBlock/img/es-flag-inline.svg
@@ -0,0 +1,84 @@
+
+
+
+
diff --git a/app/src/pages/inside/profilePage/localizationBlock/localizationBlock.jsx b/app/src/pages/inside/profilePage/localizationBlock/localizationBlock.jsx
index f297eecc49..e305db603c 100644
--- a/app/src/pages/inside/profilePage/localizationBlock/localizationBlock.jsx
+++ b/app/src/pages/inside/profilePage/localizationBlock/localizationBlock.jsx
@@ -29,6 +29,7 @@ import {
RUSSIAN,
BELARUSIAN,
SIMPLIFIED_CHINESE,
+ SPANISH,
DEFAULT_LANGUAGE,
} from 'common/constants/supportedLanguages';
import { langSelector, setLangAction } from 'controllers/lang';
@@ -40,6 +41,7 @@ import UkrainianFlagIcon from './img/ua-flag-inline.svg';
import RussianFlagIcon from './img/ru-flag-inline.svg';
import BelarusFlagIcon from './img/be-flag-inline.svg';
import ChineseFlagIcon from './img/zh-flag-inline.svg';
+import SpanishFlagIcon from './img/es-flag-inline.svg';
const cx = classNames.bind(styles);
@@ -68,6 +70,10 @@ const messages = defineMessages({
id: 'LocalizationBlock.chinese',
defaultMessage: '简体中文',
},
+ spanish: {
+ id: 'LocalizationBlock.spanish',
+ defaultMessage: 'Spanish',
+ },
note: {
id: 'LocalizationBlock.note',
defaultMessage: 'Note',
@@ -84,6 +90,7 @@ const langName = {
[RUSSIAN]: 'russian',
[BELARUSIAN]: 'belarusian',
[SIMPLIFIED_CHINESE]: 'chinese',
+ [SPANISH]: 'spanish',
};
const langNameByCode = (code) => langName[code];
@@ -129,6 +136,11 @@ const LANG_OPTIONS = [
icon: ChineseFlagIcon,
label: messages.chinese,
},
+ {
+ value: SPANISH,
+ icon: SpanishFlagIcon,
+ label: messages.spanish,
+ },
];
@connect(
diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/autoAnalysis/autoAnalysis.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/autoAnalysis/autoAnalysis.jsx
index 9e7f7c0a0b..dd7859d23f 100644
--- a/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/autoAnalysis/autoAnalysis.jsx
+++ b/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/autoAnalysis/autoAnalysis.jsx
@@ -21,12 +21,11 @@ import { reduxForm } from 'redux-form';
import { COMMON_LOCALE_KEYS } from 'common/constants/localization';
import { LAUNCH_ANALYZE_TYPES } from 'common/constants/launchAnalyzeTypes';
import { FIELD } from 'common/constants/dataAutomation';
-import { Button } from 'componentLibrary/button';
+import { Button, Checkbox } from '@reportportal/ui-kit';
import { FieldNumber } from 'componentLibrary/fieldNumber';
import { FieldErrorHint } from 'components/fields/fieldErrorHint';
import { bindMessageToValidator, validate } from 'common/utils/validation';
import { Dropdown } from 'componentLibrary/dropdown';
-import { Checkbox } from 'componentLibrary/checkbox';
import { useTracking } from 'react-tracking';
import { PROJECT_SETTINGS_ANALYZER_EVENTS } from 'analyticsEvents/projectSettingsPageEvents';
import { docsReferences, createExternalLink } from 'common/utils';
@@ -196,12 +195,7 @@ const AutoAnalysis = ({
>
{formatMessage(messages.allMessagesShouldMatch)}
-
@@ -97,9 +96,8 @@ const IndexSettings = ({ indexingRunning, analyzerUnavailableTitle, hasPermissio
disabled={indexingRunning || isFieldDisabled}
onClick={removeIndex}
title={analyzerUnavailableTitle}
- mobileDisabled
variant="ghost"
- dataAutomationId="removeIndexButton"
+ data-automation-id="removeIndexButton"
>
{formatMessage(messages.removeIndexButtonCaption)}
diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/similarItems/similarItems.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/similarItems/similarItems.jsx
index 11b0271016..1d36877e69 100644
--- a/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/similarItems/similarItems.jsx
+++ b/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/similarItems/similarItems.jsx
@@ -19,7 +19,7 @@ import PropTypes from 'prop-types';
import { useIntl } from 'react-intl';
import { reduxForm } from 'redux-form';
import { COMMON_LOCALE_KEYS } from 'common/constants/localization';
-import { Button } from 'componentLibrary/button';
+import { Button } from '@reportportal/ui-kit';
import { FieldNumber } from 'componentLibrary/fieldNumber';
import { FieldErrorHint } from 'components/fields/fieldErrorHint';
import { bindMessageToValidator, validate } from 'common/utils/validation';
@@ -88,12 +88,7 @@ const SimilarItems = ({
-
+
{formatMessage(COMMON_LOCALE_KEYS.SUBMIT)}
{isPending && }
diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/uniqueErrors/uniqueErrors.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/uniqueErrors/uniqueErrors.jsx
index f503bddab4..915ec6e9cc 100644
--- a/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/uniqueErrors/uniqueErrors.jsx
+++ b/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/uniqueErrors/uniqueErrors.jsx
@@ -19,9 +19,8 @@ import PropTypes from 'prop-types';
import { useIntl } from 'react-intl';
import { reduxForm } from 'redux-form';
import { COMMON_LOCALE_KEYS } from 'common/constants/localization';
-import { Button } from 'componentLibrary/button';
+import { Button, Checkbox } from '@reportportal/ui-kit';
import { Dropdown } from 'componentLibrary/dropdown';
-import { Checkbox } from 'componentLibrary/checkbox';
import { useTracking } from 'react-tracking';
import { PROJECT_SETTINGS_ANALYZER_EVENTS } from 'analyticsEvents/projectSettingsPageEvents';
import { docsReferences, createExternalLink } from 'common/utils';
@@ -115,12 +114,7 @@ const UniqueErrors = ({
>
-
+
{formatMessage(COMMON_LOCALE_KEYS.SUBMIT)}
{isPending && }
diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/defectTypes/defectTypes.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/defectTypes/defectTypes.jsx
index af41e2fe97..d4c4f4ed7e 100644
--- a/app/src/pages/inside/projectSettingsPageContainer/content/defectTypes/defectTypes.jsx
+++ b/app/src/pages/inside/projectSettingsPageContainer/content/defectTypes/defectTypes.jsx
@@ -25,7 +25,7 @@ import { addDefectTypeAction, defectTypesSelector } from 'controllers/project';
import { userRolesSelector } from 'controllers/user';
import { canUpdateSettings } from 'common/utils/permissions';
import { DEFECT_TYPES_SEQUENCE } from 'common/constants/defectTypes';
-import { Button } from 'componentLibrary/button';
+import { Button } from '@reportportal/ui-kit';
import CreateDefectIcon from 'common/img/newIcons/create-subtype-inline.svg';
import DefectGroupIcon from 'common/img/newIcons/defect-group-inline.svg';
import { withTooltip } from 'componentLibrary/tooltip';
@@ -130,7 +130,7 @@ export const DefectTypes = ({ setHeaderTitleNode }) => {
trackEvent(PROJECT_SETTINGS_DEFECT_TYPES_EVENTS.CLICK_CREATE_BUTTON),
)
}
- dataAutomationId={'createDefectTypeButton'}
+ data-automation-id={'createDefectTypeButton'}
>
{formatMessage(messages.createDefectHeader)}
diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/demoDataContent/generateDemoDataBlock/generateDemoDataBlock.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/demoDataContent/generateDemoDataBlock/generateDemoDataBlock.jsx
index a762537b13..f57561ac42 100644
--- a/app/src/pages/inside/projectSettingsPageContainer/content/demoDataContent/generateDemoDataBlock/generateDemoDataBlock.jsx
+++ b/app/src/pages/inside/projectSettingsPageContainer/content/demoDataContent/generateDemoDataBlock/generateDemoDataBlock.jsx
@@ -21,7 +21,7 @@ import classNames from 'classnames/bind';
import { useDispatch, useSelector } from 'react-redux';
import { fetch } from 'common/utils';
import { URLS } from 'common/urls';
-import { Button } from 'componentLibrary/button';
+import { Button } from '@reportportal/ui-kit';
import {
NOTIFICATION_TYPES,
showDefaultErrorNotification,
diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/emptyStatePage/emptyStatePage.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/emptyStatePage/emptyStatePage.jsx
index 711e3d78c5..893982ca30 100644
--- a/app/src/pages/inside/projectSettingsPageContainer/content/emptyStatePage/emptyStatePage.jsx
+++ b/app/src/pages/inside/projectSettingsPageContainer/content/emptyStatePage/emptyStatePage.jsx
@@ -16,7 +16,7 @@
import React from 'react';
import classNames from 'classnames/bind';
-import { Button } from 'componentLibrary/button';
+import { Button } from '@reportportal/ui-kit';
import { withTooltip } from 'componentLibrary/tooltip';
import Parser from 'html-react-parser';
import ExternalLinkIcon from 'common/img/open-in-rounded-inline.svg';
@@ -78,9 +78,9 @@ export const EmptyStatePage = ({
) : (
{buttonName}
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 1b237d5d36..e245f67074 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
@@ -19,7 +19,7 @@ import PropTypes from 'prop-types';
import { useIntl } from 'react-intl';
import classNames from 'classnames/bind';
import Parser from 'html-react-parser';
-import { Button } from 'componentLibrary/button';
+import { Button } from '@reportportal/ui-kit';
import { PLUGIN_NAME_TITLES } from 'components/integrations';
import { PLUGIN_DESCRIPTIONS_MAP } from 'components/integrations/messages';
import { PluginIcon } from 'components/integrations/elements/pluginIcon';
@@ -102,7 +102,7 @@ export const IntegrationHeader = (props) => {
{formatMessage(messages.noGlobalIntegrationsButtonAdd)}
@@ -110,7 +110,7 @@ export const IntegrationHeader = (props) => {
{formatMessage(messages.projectIntegrationReset)}
diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/LinkComponent/LinkComponent.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/LinkComponent/LinkComponent.jsx
index 3ce9000a3c..d09e1b68f1 100644
--- a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/LinkComponent/LinkComponent.jsx
+++ b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/LinkComponent/LinkComponent.jsx
@@ -19,19 +19,31 @@ import PropTypes from 'prop-types';
import Parser from 'html-react-parser';
import classNames from 'classnames/bind';
import Link from 'redux-first-router-link';
+import { useTracking } from 'react-tracking';
import styles from './LinkComponent.scss';
import { isInternalLink } from '../utils';
const cx = classNames.bind(styles);
-export const LinkComponent = ({ to, children, icon, className, automationId }) => {
+export const LinkComponent = ({ to, children, icon, className, event, automationId }) => {
+ const { trackEvent } = useTracking();
+ const handleLinkTracking = () => {
+ trackEvent(event);
+ };
return isInternalLink(to) ? (
-
+
{children}
{icon && {Parser(icon)}}
) : (
{
{formatMessage(messages.create)}
diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/footer/footer.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/footer/footer.jsx
index 061b4d44ba..742809bce6 100644
--- a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/footer/footer.jsx
+++ b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/footer/footer.jsx
@@ -28,6 +28,7 @@ import { INTEGRATIONS } from 'common/constants/settingsTabs';
import { useSelector } from 'react-redux';
import { activeProjectSelector } from 'controllers/user';
import { docsReferences } from 'common/utils';
+import { PROJECT_SETTINGS_NOTIFICATIONS_EVENTS } from 'components/main/analytics/events/ga4Events/projectSettingsPageEvents';
import { messages } from '../messages';
import styles from './footer.scss';
import { HelpPanel } from '../helpPanel';
@@ -45,6 +46,7 @@ export const NotificationsFooter = () => {
link: docsReferences.pluginsDocs,
description: formatMessage(messages.discoverPluginsDescription),
openIcon: openInNewTabIcon,
+ event: PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_DISCOVER_PLUGINS_LINK,
automationId: 'documentationLink',
},
{
@@ -59,6 +61,7 @@ export const NotificationsFooter = () => {
},
description: formatMessage(messages.integrationSettingsDescription),
openIcon: arrowRightIcon,
+ event: PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_INTEGRATION_SETTINGS_LINK,
automationId: 'integrationSettingsLink',
},
];
diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/helpPanel/helpPanel.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/helpPanel/helpPanel.jsx
index fccbf239a7..912fcbea59 100644
--- a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/helpPanel/helpPanel.jsx
+++ b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/helpPanel/helpPanel.jsx
@@ -26,13 +26,13 @@ const cx = classNames.bind(styles);
export const HelpPanel = ({ items }) => {
return (
- {items.map(({ title, mainIcon, link, openIcon, automationId, description }) => (
+ {items.map(({ title, mainIcon, link, openIcon, automationId, description, event }) => (
{Parser(mainIcon)}
-
+
{title}
{description}
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 fa23b8cab9..6f9d106b7f 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
@@ -17,7 +17,6 @@
import React, { useEffect } from 'react';
import PropTypes from 'prop-types';
import { formValueSelector, reduxForm } from 'redux-form';
-import { useTracking } from 'react-tracking';
import { useDispatch, useSelector } from 'react-redux';
import className from 'classnames/bind';
import { defineMessages, useIntl } from 'react-intl';
@@ -33,13 +32,13 @@ import { URLS } from 'common/urls';
import { Dropdown } from 'componentLibrary/dropdown';
import { hideModalAction } from 'controllers/modal';
import { FieldText } from 'componentLibrary/fieldText';
-import { Checkbox } from 'componentLibrary/checkbox';
-import { PROJECT_SETTINGS_NOTIFICATIONS_EVENTS } from 'analyticsEvents/projectSettingsPageEvents';
+import { Checkbox } from '@reportportal/ui-kit';
import { AttributeListFormField } from 'components/containers/AttributeListFormField';
import { RadioGroup } from 'componentLibrary/radioGroup';
import { EMAIL } from 'common/constants/pluginNames';
import { FieldTextFlex } from 'componentLibrary/fieldTextFlex';
import { ruleField } from 'pages/inside/projectSettingsPageContainer/content/notifications/propTypes';
+import { capitalizeWord } from '../util';
import { RecipientsContainer } from './recipientsContainer';
import { LaunchNamesContainer } from './launchNamesContainer';
import {
@@ -70,7 +69,7 @@ const cx = className.bind(styles);
const messages = defineMessages({
title: {
id: 'AddEditNotificationCaseModal.title',
- defaultMessage: '{actionType} Notification Rule',
+ defaultMessage: '{actionType} {pluginType} Notification Rule',
},
description: {
id: 'AddEditNotificationCaseModal.description',
@@ -215,7 +214,6 @@ const AddEditNotificationModal = ({
dirty,
}) => {
const { formatMessage } = useIntl();
- const { trackEvent } = useTracking();
const dispatch = useDispatch();
const [isEditorShown, setShowEditor] = React.useState(data.notification.attributes.length > 0);
const attributesValue =
@@ -279,10 +277,9 @@ const AddEditNotificationModal = ({
type: messages[sendCase].defaultMessage,
switcher,
number: isEditorShown ? length : undefined,
+ communicationChanelName: data.type,
};
-
- trackEvent(PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_SAVE_BUTTON_IN_MODAL(eventParameters));
- onSave(newFormValues);
+ onSave(newFormValues, eventParameters);
};
const okButton = {
@@ -323,6 +320,7 @@ const AddEditNotificationModal = ({
{
+const DeleteNotificationCaseModal = ({ data: { onSave, type } }) => {
const { formatMessage } = useIntl();
const dispatch = useDispatch();
return (
word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/notifications.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/notifications.jsx
index 468243c60a..42a4520016 100644
--- a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/notifications.jsx
+++ b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/notifications.jsx
@@ -18,7 +18,7 @@ import React, { useEffect } from 'react';
import PropTypes from 'prop-types';
import { useDispatch, useSelector } from 'react-redux';
import classNames from 'classnames/bind';
-import { trackEvent } from 'react-tracking';
+import { useTracking } from 'react-tracking';
import { useIntl } from 'react-intl';
import { canUpdateSettings } from 'common/utils/permissions';
import {
@@ -54,6 +54,7 @@ export const Notifications = () => {
const allNotificationPlugins = useSelector(notificationPluginsSelector);
const { formatMessage } = useIntl();
const dispatch = useDispatch();
+ const { trackEvent } = useTracking();
const userRoles = useSelector(userRolesSelector);
const isAllNotificationsEnabled = useSelector(projectNotificationsStateSelector);
@@ -66,7 +67,7 @@ export const Notifications = () => {
}, []);
const toggleNotificationsEnabled = (isEnabled) => {
- trackEvent(PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_CHECKBOX_AUTO_NOTIFICATIONS(isEnabled));
+ trackEvent(PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.SWITCH_ALL_NOTIFICATIONS(isEnabled));
dispatch(updateNotificationStateAction(isEnabled));
};
// separate notifications by types
@@ -110,6 +111,3 @@ export const Notifications = () => {
);
};
-Notifications.propTypes = {
- setHeaderTitleNode: PropTypes.func.isRequired,
-};
diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/ruleGroup/ruleGroup.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/ruleGroup/ruleGroup.jsx
index 52a9b2e90c..2248434df2 100644
--- a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/ruleGroup/ruleGroup.jsx
+++ b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/ruleGroup/ruleGroup.jsx
@@ -16,7 +16,7 @@
import { Layout } from 'pages/inside/projectSettingsPageContainer/content/layout';
import { Toggle } from 'componentLibrary/toggle';
-import { Button } from 'componentLibrary/button';
+import { Button } from '@reportportal/ui-kit';
import addIcon from 'common/img/add-inline.svg';
import React from 'react';
import classNames from 'classnames/bind';
@@ -98,7 +98,13 @@ export const RuleGroup = ({ pluginName, ruleDescription, rules, isPluginEnabled,
pluginName === EMAIL && !isEmailIntegrationAvailable && isActivationRequired;
const onToggleHandler = (isEnabled, notification) => {
- trackEvent(PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.SWITCH_NOTIFICATION_RULE(isEnabled));
+ trackEvent(
+ PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.SWITCH_NOTIFICATION_RULE(
+ pluginNameInCamelCase,
+ notification.id,
+ isEnabled,
+ ),
+ );
dispatch(
updateProjectNotificationAction(
@@ -109,11 +115,22 @@ export const RuleGroup = ({ pluginName, ruleDescription, rules, isPluginEnabled,
const handleRuleItemClick = (isShown) => {
if (isShown) {
- trackEvent(PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_TO_EXPAND_NOTIFICATIONS_DETAILS);
+ trackEvent(
+ PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_TO_EXPAND_NOTIFICATIONS_DETAILS(
+ pluginNameInCamelCase,
+ ),
+ );
}
};
const togglePluginNotificationsEnabled = (isEnabled) => {
+ trackEvent(
+ PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.SWITCH_PLUGIN_NOTIFICATIONS(
+ pluginNameInCamelCase,
+ isEnabled,
+ ),
+ );
+
dispatch(
updateNotificationStateAction(
isEnabled,
@@ -121,16 +138,29 @@ export const RuleGroup = ({ pluginName, ruleDescription, rules, isPluginEnabled,
),
);
};
- const confirmAdd = (newNotification) => {
+ const confirmAdd = (newNotification, eventParameters) => {
+ const trackAddingEvent = (id) =>
+ trackEvent(
+ PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_SAVE_BUTTON_IN_MODAL({
+ ...eventParameters,
+ ruleId: id,
+ }),
+ );
const notification = convertNotificationCaseForSubmission(newNotification);
- dispatch(addProjectNotificationAction(notification));
+ dispatch(addProjectNotificationAction(notification, trackAddingEvent));
};
const confirmDelete = (id) => {
dispatch(deleteProjectNotificationAction(id));
};
- const confirmEdit = (notification) => {
+ const confirmEdit = (notification, eventParameters) => {
+ trackEvent(
+ PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_SAVE_BUTTON_IN_MODAL({
+ ...eventParameters,
+ ruleId: notification.id,
+ }),
+ );
dispatch(
updateProjectNotificationAction(
convertNotificationCaseForSubmission({
@@ -142,7 +172,9 @@ export const RuleGroup = ({ pluginName, ruleDescription, rules, isPluginEnabled,
};
const onAdd = () => {
- trackEvent(PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_CREATE_RULE_BUTTON);
+ trackEvent(
+ PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_CREATE_RULE_BUTTON(pluginNameInCamelCase),
+ );
dispatch(
showModalAction({
@@ -160,7 +192,9 @@ export const RuleGroup = ({ pluginName, ruleDescription, rules, isPluginEnabled,
};
const onEdit = (notification) => {
- trackEvent(PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_ICON_EDIT_NOTIFICATIONS);
+ trackEvent(
+ PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_ICON_EDIT_NOTIFICATIONS(pluginNameInCamelCase),
+ );
dispatch(
showModalAction({
@@ -178,19 +212,26 @@ export const RuleGroup = ({ pluginName, ruleDescription, rules, isPluginEnabled,
};
const onDelete = (notification) => {
- trackEvent(PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_ICON_DELETE_NOTIFICATIONS);
+ trackEvent(
+ PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_ICON_DELETE_NOTIFICATIONS(pluginNameInCamelCase),
+ );
dispatch(
showModalAction({
id: 'deleteNotificationModal',
data: {
onSave: () => confirmDelete(notification.id),
+ type: pluginName,
},
}),
);
};
const onCopy = (notification) => {
- trackEvent(PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_ICON_DUPLICATE_NOTIFICATIONS);
+ trackEvent(
+ PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_ICON_DUPLICATE_NOTIFICATIONS(
+ pluginNameInCamelCase,
+ ),
+ );
const { id, ...newNotification } = flatRule(notification);
dispatch(
@@ -200,7 +241,8 @@ export const RuleGroup = ({ pluginName, ruleDescription, rules, isPluginEnabled,
type: pluginName,
actionType: MODAL_ACTION_TYPE_COPY,
ruleFields,
- onSave: (withoutAttributes) => confirmAdd(withoutAttributes),
+ onSave: (withoutAttributes, eventParameters) =>
+ confirmAdd(withoutAttributes, eventParameters),
notification: {
...newNotification,
ruleName: notification.ruleName + COPY_POSTFIX,
@@ -283,6 +325,7 @@ export const RuleGroup = ({ pluginName, ruleDescription, rules, isPluginEnabled,
},
}}
icon={arrowRightIcon}
+ event={PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_CONFIGURE_INTEGRATION_LINK}
>
{formatMessage(messages.configureIntegration)}
@@ -311,11 +354,11 @@ export const RuleGroup = ({ pluginName, ruleDescription, rules, isPluginEnabled,
/>
{isUpdateSettingAvailable && (
{formatMessage(messages.addRule)}
diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/patternAnalysis/patternAnalysisContent/patternAnalysisContent.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/patternAnalysis/patternAnalysisContent/patternAnalysisContent.jsx
index ac0973487d..b97e4bde07 100644
--- a/app/src/pages/inside/projectSettingsPageContainer/content/patternAnalysis/patternAnalysisContent/patternAnalysisContent.jsx
+++ b/app/src/pages/inside/projectSettingsPageContainer/content/patternAnalysis/patternAnalysisContent/patternAnalysisContent.jsx
@@ -27,8 +27,7 @@ import {
} from 'controllers/project';
import { hideModalAction, showModalAction } from 'controllers/modal';
import { useIntl } from 'react-intl';
-import { Checkbox } from 'componentLibrary/checkbox';
-import { Button } from 'componentLibrary/button';
+import { Button, Checkbox } from '@reportportal/ui-kit';
import classNames from 'classnames/bind';
import PropTypes from 'prop-types';
import PencilIcon from 'common/img/newIcons/pencil-inline.svg';
@@ -58,7 +57,7 @@ export const PatternAnalysisContent = ({
useEffect(() => {
setHeaderTitleNode(
-
+
{formatMessage(messages.create)}
,
diff --git a/app/src/pages/inside/projectSettingsPageContainer/generalTab/generalTab.jsx b/app/src/pages/inside/projectSettingsPageContainer/generalTab/generalTab.jsx
index 09ef36a816..c3abf75d49 100644
--- a/app/src/pages/inside/projectSettingsPageContainer/generalTab/generalTab.jsx
+++ b/app/src/pages/inside/projectSettingsPageContainer/generalTab/generalTab.jsx
@@ -23,7 +23,7 @@ import { connect } from 'react-redux';
import { injectIntl } from 'react-intl';
import { formValueSelector, reduxForm } from 'redux-form';
import moment from 'moment';
-import { BubblesLoader } from '@reportportal/ui-kit';
+import { BubblesLoader, Button } from '@reportportal/ui-kit';
import { URLS } from 'common/urls';
import { fetch, secondsToDays } from 'common/utils';
import { canUpdateSettings } from 'common/utils/permissions';
@@ -44,7 +44,6 @@ import { userRolesSelector } from 'controllers/user';
import { showNotification, NOTIFICATION_TYPES } from 'controllers/notification';
import { langSelector } from 'controllers/lang';
import { SpinningPreloader } from 'components/preloaders/spinningPreloader';
-import { Button } from 'componentLibrary/button';
import { Dropdown } from 'componentLibrary/dropdown';
import { PROJECT_SETTINGS_GENERAL_TAB_EVENTS } from 'analyticsEvents/projectSettingsPageEvents';
import styles from './generalTab.scss';
@@ -429,7 +428,7 @@ export class GeneralTab extends Component {
/>
-
+
{this.props.intl.formatMessage(COMMON_LOCALE_KEYS.SUBMIT)}
{processingData && (
diff --git a/app/src/pages/inside/stepPage/modals/postIssueModal/postIssueModal.jsx b/app/src/pages/inside/stepPage/modals/postIssueModal/postIssueModal.jsx
index d87959c216..b17b10afb0 100644
--- a/app/src/pages/inside/stepPage/modals/postIssueModal/postIssueModal.jsx
+++ b/app/src/pages/inside/stepPage/modals/postIssueModal/postIssueModal.jsx
@@ -40,7 +40,7 @@ import {
} from 'components/fields/dynamicFieldsSection/utils';
import { projectInfoSelector, projectKeySelector } from 'controllers/project';
import { FieldProvider } from 'components/fields/fieldProvider';
-import { Checkbox } from 'componentLibrary/checkbox';
+import { Checkbox } from '@reportportal/ui-kit';
import { ISSUE_TYPE_FIELD_KEY } from 'components/integrations/elements/bts/constants';
import { BtsIntegrationSelector } from 'pages/inside/common/btsIntegrationSelector';
import { DarkModalLayout, ModalFooter } from 'components/main/modal/darkModalLayout';
@@ -105,7 +105,7 @@ const messages = defineMessages({
},
postIssueSuccess: {
id: 'PostIssueModal.postIssueSuccess',
- defaultMessage: 'Ticket has been created.',
+ defaultMessage: 'Ticket has been created successfully',
},
postIssueForTheTest: {
id: 'PostIssueModal.postIssueForTheTest',
@@ -381,10 +381,10 @@ export class PostIssueModal extends Component {
type: NOTIFICATION_TYPES.SUCCESS,
});
})
- .catch(() => {
+ .catch((err) => {
this.props.hideScreenLockAction();
this.props.showNotification({
- message: formatMessage(messages.postIssueFailed),
+ message: `${formatMessage(messages.postIssueFailed)}. ${err.message}`,
type: NOTIFICATION_TYPES.ERROR,
});
});
diff --git a/app/src/pages/organization/emptyPageState/emptyPageState.jsx b/app/src/pages/organization/emptyPageState/emptyPageState.jsx
index c41ae150a8..036e814bcd 100644
--- a/app/src/pages/organization/emptyPageState/emptyPageState.jsx
+++ b/app/src/pages/organization/emptyPageState/emptyPageState.jsx
@@ -15,7 +15,7 @@
*/
import classNames from 'classnames/bind';
-import { Button } from 'componentLibrary/button';
+import { Button } from '@reportportal/ui-kit';
import PropTypes from 'prop-types';
import Parser from 'html-react-parser';
import styles from './emptyPageState.scss';
diff --git a/app/src/pages/organization/organizationProjectsPage/projectsPageHeader/projectsPageHeader.jsx b/app/src/pages/organization/organizationProjectsPage/projectsPageHeader/projectsPageHeader.jsx
index 6ccecc918d..f820d05f13 100644
--- a/app/src/pages/organization/organizationProjectsPage/projectsPageHeader/projectsPageHeader.jsx
+++ b/app/src/pages/organization/organizationProjectsPage/projectsPageHeader/projectsPageHeader.jsx
@@ -19,13 +19,13 @@ import PropTypes from 'prop-types';
import { useIntl } from 'react-intl';
import { useSelector } from 'react-redux';
import Parser from 'html-react-parser';
+import { Button } from '@reportportal/ui-kit';
import classNames from 'classnames/bind';
import { PROJECTS_PAGE } from 'controllers/pages';
import searchIcon from 'common/img/newIcons/search-outline-inline.svg';
import filterIcon from 'common/img/newIcons/filters-outline-inline.svg';
import plusIcon from 'common/img/plus-button-inline.svg';
import { Breadcrumbs } from 'componentLibrary/breadcrumbs';
-import { Button } from 'componentLibrary/button';
import { activeOrganizationSelector } from 'controllers/organizations/organization';
import userIcon from './img/user-inline.svg';
import { messages } from '../messages';
diff --git a/app/src/pages/organization/projectTeamPage/projectTeamPageHeader/projectTeamPageHeader.jsx b/app/src/pages/organization/projectTeamPage/projectTeamPageHeader/projectTeamPageHeader.jsx
index 79e7e87298..4601e52e40 100644
--- a/app/src/pages/organization/projectTeamPage/projectTeamPageHeader/projectTeamPageHeader.jsx
+++ b/app/src/pages/organization/projectTeamPage/projectTeamPageHeader/projectTeamPageHeader.jsx
@@ -18,9 +18,9 @@ import React from 'react';
import PropTypes from 'prop-types';
import Parser from 'html-react-parser';
import classNames from 'classnames/bind';
+import { Button } from '@reportportal/ui-kit';
import searchIcon from 'common/img/newIcons/search-outline-inline.svg';
import filterIcon from 'common/img/newIcons/filters-outline-inline.svg';
-import { Button } from 'componentLibrary/button';
import { useIntl } from 'react-intl';
import { messages } from '../messages';
import styles from './projectTeamPageHeader.scss';
diff --git a/docs/9-localization.md b/docs/9-localization.md
index ffeae0d283..580a01d28c 100644
--- a/docs/9-localization.md
+++ b/docs/9-localization.md
@@ -5,7 +5,7 @@ For localization needs Report Portal uses [react-intl](https://github.com/yahoo/
[Documentation](https://github.com/yahoo/react-intl/wiki)
All text content of application should be controlled by localization system.
-At the moment Report Portal supports English (default), Russian, Belorussian and Ukrainian languages.
+At the moment Report Portal supports English (default), Russian, Belorussian, Ukrainian and Spanish languages.
Localization message id format: `ComponentsName.elementName` (for example FiltersPage.addFilterButton)