diff --git a/package.json b/package.json
index f5700e080..35f998665 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,7 @@
"private": true,
"dependencies": {
"@appquality/languages": "1.4.3",
- "@appquality/unguess-design-system": "4.0.35",
+ "@appquality/unguess-design-system": "4.0.36",
"@headwayapp/react-widget": "^0.0.4",
"@reduxjs/toolkit": "^1.8.0",
"@sentry/react": "^8.32.0",
diff --git a/src/assets/icons/info.svg b/src/assets/icons/info.svg
new file mode 100644
index 000000000..b4798c63e
--- /dev/null
+++ b/src/assets/icons/info.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/common/components/inviteUsers/modalFooter.tsx b/src/common/components/inviteUsers/modalFooter.tsx
index f52752075..7a38e4654 100644
--- a/src/common/components/inviteUsers/modalFooter.tsx
+++ b/src/common/components/inviteUsers/modalFooter.tsx
@@ -1,8 +1,8 @@
-import { Modal, Button } from '@appquality/unguess-design-system';
+import { Button, Modal } from '@appquality/unguess-design-system';
+import { useTranslation } from 'react-i18next';
import { ReactComponent as LinkIcon } from 'src/assets/icons/link-stroke.svg';
+import { useCopyLink } from 'src/hooks/useCopyLink';
import styled from 'styled-components';
-import { useTranslation } from 'react-i18next';
-import { useCopyLink } from '../utils/useCopyLink';
const FooterWithBorder = styled(Modal.Footer)`
padding: ${({ theme }) =>
diff --git a/src/common/components/navigation/asideNav/index.tsx b/src/common/components/navigation/asideNav/index.tsx
index 1dbc71380..87762928f 100644
--- a/src/common/components/navigation/asideNav/index.tsx
+++ b/src/common/components/navigation/asideNav/index.tsx
@@ -27,8 +27,8 @@ export const StickyNavContainer = styled(ContainerCard)`
`;
export const StyledDivider = styled(Divider)`
- margin-top: ${({ theme }) => theme.space.base * 6}px;
- margin-bottom: ${({ theme }) => theme.space.base * 6}px;
+ margin-top: ${({ theme }) => theme.space.base * 4}px;
+ margin-bottom: ${({ theme }) => theme.space.base * 4}px;
`;
export const StickyNavItem = styled(Link)`
diff --git a/src/common/components/utils/useCopyLink.tsx b/src/common/components/utils/useCopyLink.tsx
deleted file mode 100644
index e5aedcbd7..000000000
--- a/src/common/components/utils/useCopyLink.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import { useToast, Notification } from '@appquality/unguess-design-system';
-import { t } from 'i18next';
-
-export const useCopyLink = () => {
- const { addToast } = useToast();
-
- const copyLinkToClipboard = () => {
- const url = new URL(window.location.href);
- navigator.clipboard.writeText(`${url.origin}${url.pathname}`);
- addToast(
- ({ close }) => (
-
- ),
- { placement: 'top' }
- );
- };
-
- return copyLinkToClipboard;
-};
diff --git a/src/features/api/index.ts b/src/features/api/index.ts
index d0d567c71..20ac6e677 100644
--- a/src/features/api/index.ts
+++ b/src/features/api/index.ts
@@ -2280,6 +2280,16 @@ export type Transcript = {
speakers: number;
paragraphs: Paragraph[];
};
+export type MediaSentiment = {
+ value: number;
+ reason: string;
+ paragraphs: {
+ start: number;
+ end: number;
+ value: number;
+ reason: string;
+ }[];
+};
export type Video = {
id: number;
url: string;
@@ -2295,6 +2305,7 @@ export type Video = {
};
};
transcript?: Transcript;
+ sentiment?: MediaSentiment;
};
export type PaginationData = {
start?: number;
diff --git a/src/features/navigation/Navigation.tsx b/src/features/navigation/Navigation.tsx
index 674343745..f695b3f08 100644
--- a/src/features/navigation/Navigation.tsx
+++ b/src/features/navigation/Navigation.tsx
@@ -104,9 +104,6 @@ export const Navigation = ({
case 'insights':
dispatch(setSidebarOpen(false));
break;
- case 'templates':
- dispatch(setSidebarOpen(false));
- break;
case 'template':
dispatch(setSidebarOpen(false));
break;
diff --git a/src/hooks/useCopy.tsx b/src/hooks/useCopy.tsx
new file mode 100644
index 000000000..38c1f0040
--- /dev/null
+++ b/src/hooks/useCopy.tsx
@@ -0,0 +1,46 @@
+import { Notification, useToast } from '@appquality/unguess-design-system';
+import { useTranslation } from 'react-i18next';
+
+export const useCopy = ({
+ text,
+ notification,
+}: {
+ text: string;
+ notification?: string;
+}) => {
+ const { t } = useTranslation();
+ const { addToast } = useToast();
+
+ const copyToClipboard = async () => {
+ try {
+ await navigator.clipboard.writeText(text);
+ addToast(
+ ({ close }) => (
+
+ ),
+ { placement: 'top' }
+ );
+ } catch (error) {
+ addToast(
+ ({ close }) => (
+
+ ),
+ { placement: 'top' }
+ );
+ }
+ };
+
+ return copyToClipboard;
+};
diff --git a/src/hooks/useCopyLink.tsx b/src/hooks/useCopyLink.tsx
new file mode 100644
index 000000000..574722bbf
--- /dev/null
+++ b/src/hooks/useCopyLink.tsx
@@ -0,0 +1,13 @@
+import { useTranslation } from 'react-i18next';
+import { useCopy } from './useCopy';
+
+export const useCopyLink = () => {
+ const { t } = useTranslation();
+ const url = new URL(window.location.href);
+ const text = `${url.origin}${url.pathname}`;
+ const copyLinkToClipboard = useCopy({
+ text,
+ notification: t('__PERMISSION_SETTINGS_TOAST_COPY_MESSAGE'),
+ });
+ return copyLinkToClipboard;
+};
diff --git a/src/hooks/useLocalizeDashboardUrl.ts b/src/hooks/useLocalizeDashboardUrl.ts
index 85ff09e3f..85d66d44b 100644
--- a/src/hooks/useLocalizeDashboardUrl.ts
+++ b/src/hooks/useLocalizeDashboardUrl.ts
@@ -88,3 +88,13 @@ export const getLocalizedCampaignUrl = (
? `${protocol}//${host}/campaigns/${aCampaignId}`
: `${protocol}//${host}/it/campaigns/${aCampaignId}`;
};
+
+export const getLocalizedPlanUrl = (
+ aPlanId: number,
+ aLanguage: string
+): string => {
+ const { host, protocol } = window.location;
+ return aLanguage === 'en'
+ ? `${protocol}//${host}/plans/${aPlanId}`
+ : `${protocol}//${host}/it/plans/${aPlanId}`;
+};
diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json
index ead3e2e90..e9c5b7428 100644
--- a/src/locales/en/translation.json
+++ b/src/locales/en/translation.json
@@ -23,6 +23,23 @@
"__APP_SIDEBAR_SHARED_WORKSPACE_HOME_ITEM_LABEL": "Activities",
"__APP_SIDEBAR_SHARED_WORKSPACE_LABEL": "Shared with me",
"__APP_SIDEBAR_TEMPLATES_ITEM_LABEL": "Templates",
+ "__ARCHIVE_PAGE_TOTAL_CAMPAIGN_TITLE": "All",
+ "__ASIDE_NAVIGATION_MODULE_ADDITIONAL_TARGET_SUBTITLE": " ",
+ "__ASIDE_NAVIGATION_MODULE_AGE_SUBTITLE": "Participant age groups",
+ "__ASIDE_NAVIGATION_MODULE_BROWSER_SUBTITLE": "Compatible browsers",
+ "__ASIDE_NAVIGATION_MODULE_DATES_BLOCK_SUBTITLE": " ",
+ "__ASIDE_NAVIGATION_MODULE_DIGITAL_LITERACY_ACCORDION_SUBTITLE": "Participant technical proficiency",
+ "__ASIDE_NAVIGATION_MODULE_GENDER_ACCORDION_SUBTITLE": "Participant gender criteria",
+ "__ASIDE_NAVIGATION_MODULE_GOAL_SUBTITLE": "Activity objective",
+ "__ASIDE_NAVIGATION_MODULE_INSTRUCTIONS_NOTE_BLOCK_SUBTITLE": " ",
+ "__ASIDE_NAVIGATION_MODULE_LANGUAGE_SUBTITLE": "Feedback language",
+ "__ASIDE_NAVIGATION_MODULE_OUT_OF_SCOPE_SUBTITLE": " ",
+ "__ASIDE_NAVIGATION_MODULE_SETUP_NOTE_BLOCK_SUBTITLE": " ",
+ "__ASIDE_NAVIGATION_MODULE_SUBTITLE_BLOCK_SUBTITLE": " ",
+ "__ASIDE_NAVIGATION_MODULE_TARGET_NOTE_BLOCK_SUBTITLE": " ",
+ "__ASIDE_NAVIGATION_MODULE_TARGET_SUBTITLE": "Participant number",
+ "__ASIDE_NAVIGATION_MODULE_TASKS_SUBTITLE": " ",
+ "__ASIDE_NAVIGATION_MODULE_TOUCHPOINTS_SUBTITLE": "Interaction points",
"__BANNER_CROSS_FUNCTIONAL_CTA_AUTOMATION": "Get in touch",
"__BANNER_CROSS_FUNCTIONAL_CTA_EXPERIENCE": "Get in touch",
"__BANNER_CROSS_FUNCTIONAL_CTA_LOADING": "sending...",
@@ -410,6 +427,7 @@
"__CAMPAIGN_PAGE_NAVIGATION_MEDIA_ITEM_INSIGHTS_LABEL": "Key points",
"__CAMPAIGN_PAGE_NAVIGATION_MEDIA_ITEM_METHODOLOGY_LABEL": "Activity",
"__CAMPAIGN_PAGE_NAVIGATION_MEDIA_ITEM_OVERVIEW_LABEL": "Overview",
+ "__CAMPAIGN_PAGE_NAVIGATION_PLAN_EXTERNAL_LINK_LABEL": "Go to Activity Setup",
"__CAMPAIGN_PAGE_REPORTS_CARDS_DOWNLOAD_LABEL": "Download now",
"__CAMPAIGN_PAGE_REPORTS_CARDS_OPEN_LINK_LABEL": "Open link",
"__CAMPAIGN_PAGE_REPORTS_CARDS_UPDATED_ON_LABEL": "Last edit",
@@ -550,6 +568,8 @@
"__CATALOG_PAGE_TITLE": "Services",
"__CATALOG_STICKY_CONTAINER_NAV_CATEGORIES_LABEL": "BY CATEGORY",
"__CATALOG_STICKY_CONTAINER_NAV_EXTERNAL_LINK_LABEL": "Discover services",
+ "__COPY_ERROR": "Failed to copy text to clipboard",
+ "__COPY_SUCCESS": "Text copied to clipboard",
"__DASHABOARD_CAMPAIGN_CAMPAIGN_TYPE_FILTER_LABEL Max:10": "Type",
"__DASHABOARD_CAMPAIGN_STATUS_FILTER_ALL": "All",
"__DASHABOARD_CAMPAIGN_STATUS_FILTER_COMPLETED": "Completed",
@@ -952,6 +972,7 @@
"__PAGE_TITLE_CATALOG": "Services",
"__PAGE_TITLE_LOGIN": "Log in",
"__PAGE_TITLE_PRIMARY_DASHBOARD": "My activities",
+ "__PAGE_TITLE_PRIMARY_DASHBOARD_ARCHIVE": "Archive",
"__PAGE_TITLE_PRIMARY_DASHBOARD_SINGLE_PROJECT": "Projects",
"__PAGE_TITLE_TEMPLATES": "Templates",
"__PAGE_VIDEOS_EMPTY_STATE": "The videos for this project have not been uploaded yet.",
@@ -978,6 +999,7 @@
"__PLAN_CREATION_PROJECT_DROPDOWN_PLACEHOLDER": "Select a project",
"__PLAN_DATE_ERROR_REQUIRED": "Required field: enter a date to continue",
"__PLAN_DATE_IN_FUTURE_ERROR": "Date must be at least one business day in the future",
+ "__PLAN_DELETE_PLAN_CTA": "Delete draft",
"__PLAN_GOAL_SIZE_ERROR_REQUIRED": "Required field: enter a goal to continue",
"__PLAN_GOAL_SIZE_ERROR_TOO_LONG": "Character limit exceeded: Please reduce your text to 256 characters",
"__PLAN_INSTRUCTION_NOTE_SIZE_ERROR_EMPTY": "Required field: enter a text to continue",
@@ -987,6 +1009,11 @@
"__PLAN_PAGE_ADD_MODULE_BLOCK_BUTTON": "Add item",
"__PLAN_PAGE_ADD_MODULE_BLOCK_MODAL_SUBTITLE": "Provide the necessary details to describe this activity",
"__PLAN_PAGE_ADD_MODULE_BLOCK_MODAL_TITLE": "Available informations",
+ "__PLAN_PAGE_DELETE_PLAN_MODAL_BODY": "You're about to delete \"{{planTitle}}\".
This action will permanently remove all information you've entered.
After deletion, you'll be redirected to your Activities dashboard.",
+ "__PLAN_PAGE_DELETE_PLAN_MODAL_BUTTON_CANCEL": "Keep editing",
+ "__PLAN_PAGE_DELETE_PLAN_MODAL_BUTTON_CONFIRM": "Delete permanently",
+ "__PLAN_PAGE_DELETE_PLAN_MODAL_ERROR": "We couldn't delete your draft: please try again later.",
+ "__PLAN_PAGE_DELETE_PLAN_MODAL_TITLE": "Delete this draft?",
"__PLAN_PAGE_HEADER_BREADCRUMBS_INSTRUCTIONS_TAB": "Assign Tasks",
"__PLAN_PAGE_HEADER_BREADCRUMBS_SETUP_TAB": "Set up",
"__PLAN_PAGE_HEADER_BREADCRUMBS_SUMMARY_TAB": "Get expert feedback",
@@ -1160,7 +1187,7 @@
"__PLAN_PAGE_MODULE_TOUCHPOINTS_REMOVE_TOUCHPOINT_BUTTON": "Remove",
"__PLAN_PAGE_MODULE_TOUCHPOINTS_SUBTITLE": "Add touchpoints & devices for the test",
"__PLAN_PAGE_MODULE_TOUCHPOINTS_TITLE": "Touchpoints & Devices",
- "__PLAN_PAGE_MODULE_TOUCHPOINTS_TOUCHPOINT_APP_LINK_ANDROID_DESCRIPTION": "Add Google Play Store or Test Flight link for activity partecipants",
+ "__PLAN_PAGE_MODULE_TOUCHPOINTS_TOUCHPOINT_APP_LINK_ANDROID_DESCRIPTION": "Add Play Store or beta testing link for the test",
"__PLAN_PAGE_MODULE_TOUCHPOINTS_TOUCHPOINT_APP_LINK_ANDROID_HINT": "Add accessible URL with http:// or https:// prefix",
"__PLAN_PAGE_MODULE_TOUCHPOINTS_TOUCHPOINT_APP_LINK_ANDROID_LABEL": "Product link",
"__PLAN_PAGE_MODULE_TOUCHPOINTS_TOUCHPOINT_APP_LINK_ANDROID_PLACEHOLDER": "https://example.com",
@@ -1245,9 +1272,9 @@
"__PROFILE_MODAL_LANGUAGES_TITLE": "Change Language",
"__PROFILE_MODAL_LOGOUT_TITLE": "Log Out",
"__PROFILE_MODAL_NOTIFICATIONS_INTRO": "Manage the notifications we send you by email.",
- "__PROFILE_MODAL_NOTIFICATIONS_OUTRO_P_1": "By turning on notifications, you will be updated on: ",
- "__PROFILE_MODAL_NOTIFICATIONS_OUTRO_P_2": "comments, mentions, activity starting, activity ending, and invitations.",
- "__PROFILE_MODAL_NOTIFICATIONS_OUTRO_P_3": "By turning off notifications, you will be only updated on mentions and invitations",
+ "__PROFILE_MODAL_NOTIFICATIONS_OUTRO_P_1": " ",
+ "__PROFILE_MODAL_NOTIFICATIONS_OUTRO_P_2": "Enable to receive all updates: comments, mentions, quotes on the platform, confirmations, activity timelines, and invitations.",
+ "__PROFILE_MODAL_NOTIFICATIONS_OUTRO_P_3": "Disable to receive only essentials: mentions, quotes on the platform, activity confirmations, and invitations.",
"__PROFILE_MODAL_NOTIFICATIONS_TITLE": "Notifications settings",
"__PROFILE_MODAL_NOTIFICATIONS_TOGGLE_OFF": "No",
"__PROFILE_MODAL_NOTIFICATIONS_TOGGLE_ON": "Yes",
@@ -1269,6 +1296,13 @@
"__PUBLIC_MANUAL_HELP_MODAL_TITLE": "Got questions?",
"__PUBLIC_MANUAL_NOT_FOUND_TEXT": "This page does not exist yet. Ask your CSM or explore our Support Center.",
"__PUBLIC_MANUAL_NOT_FOUND_TITLE": "There is no manual here",
+ "__SENTIMENT_COPY_BUTTON_LABEL": "Copy",
+ "__SENTIMENT_OVERVIEW_ALERT_DISCLAIMER": "AI helps you explore. Just remember to verify what you find.",
+ "__SENTIMENT_OVERVIEW_ALERT_SUBTITLE": "See how your user felt paragraph by paragraph",
+ "__SENTIMENT_OVERVIEW_ALERT_TITLE": "Explore sentiment journey:",
+ "__SENTIMENT_OVERVIEW_SUBTITLE": "Generated from transcript",
+ "__SENTIMENT_OVERVIEW_TITLE": "Experience Summary",
+ "__SENTIMENT_TOAST_COPY_MESSAGE": "Sentiment copied to clipboard",
"__SERVICE_DETAIL_PAGE_TAG_RESULTS_DAYS_LABEL": "First results in <0>{{hours}}0>h",
"__SERVICE_TILES_HEADER": "Explore new ways of testing",
"__SERVICE_TILES_SUBTITLE": "Launch lean tests autonomosly, get expert-verified results",
@@ -1296,7 +1330,9 @@
"__TOAST_CLOSE_TEXT": "Dismiss",
"__TOAST_GENERIC_ERROR_MESSAGE": "Something went wrong. Please try again later.",
"__TOOLS_MENU_ITEM_BUTTON_LABEL": "Translate",
+ "__TOOLS_MENU_ITEM_HIDE_SENTIMENT_LABEL": "Hide Sentiment",
"__TOOLS_MENU_ITEM_LANGUAGE_SETTINGS_TOOLTIP": "Language settings",
+ "__TOOLS_MENU_ITEM_SHOW_SENTIMENT_LABEL": "Show Sentiment",
"__TOOLS_MENU_ITEM_TRANSLATE_PREFERENCE_TITLE": "Translate in",
"__TOOLS_TRANSLATE_BUTTON_CANCEL": "Cancel",
"__TOOLS_TRANSLATE_BUTTON_SEND": "Translate",
@@ -1310,6 +1346,11 @@
"__TOOLS_TRANSLATE_TOAST_LANGUAGE_ERROR_MESSAGE": "Something went wrong during the preferred language update, try again",
"__TOOLS_TRANSLATE_TOAST_LANGUAGE_SUCCESS_MESSAGE": "Preferred language updated",
"__TOOLS_TRANSLATE_TOGGLE_TEXT": "Set as preferred language",
+ "__TRANSCRIPT_SENTIMENT_VALUE_NEGATIVE": "Negative",
+ "__TRANSCRIPT_SENTIMENT_VALUE_NEUTRAL": "Neutral",
+ "__TRANSCRIPT_SENTIMENT_VALUE_POSITIVE": "Positive",
+ "__TRANSCRIPT_SENTIMENT_VALUE_VERY_NEGATIVE": "Very Negative",
+ "__TRANSCRIPT_SENTIMENT_VALUE_VERY_POSITIVE": "Very Positive",
"__UX_CAMPAIGN_PAGE_NAVIGATION_DASHBOARD_TOOLTIP": "Dashboard",
"__UX_CAMPAIGN_PAGE_NAVIGATION_INSIGHTS_TOOLTIP": "Topics & insights",
"__UX_CAMPAIGN_PAGE_NAVIGATION_VIDEO_LIST_TOOLTIP": "Playlist",
diff --git a/src/locales/it/translation.json b/src/locales/it/translation.json
index 3f60a44fd..8c1c448bd 100644
--- a/src/locales/it/translation.json
+++ b/src/locales/it/translation.json
@@ -23,6 +23,23 @@
"__APP_SIDEBAR_SHARED_WORKSPACE_HOME_ITEM_LABEL": "Campagne",
"__APP_SIDEBAR_SHARED_WORKSPACE_LABEL": "Condivisi con me",
"__APP_SIDEBAR_TEMPLATES_ITEM_LABEL": "",
+ "__ARCHIVE_PAGE_TOTAL_CAMPAIGN_TITLE": "",
+ "__ASIDE_NAVIGATION_MODULE_ADDITIONAL_TARGET_SUBTITLE": "",
+ "__ASIDE_NAVIGATION_MODULE_AGE_SUBTITLE": "",
+ "__ASIDE_NAVIGATION_MODULE_BROWSER_SUBTITLE": "",
+ "__ASIDE_NAVIGATION_MODULE_DATES_BLOCK_SUBTITLE": "",
+ "__ASIDE_NAVIGATION_MODULE_DIGITAL_LITERACY_ACCORDION_SUBTITLE": "",
+ "__ASIDE_NAVIGATION_MODULE_GENDER_ACCORDION_SUBTITLE": "",
+ "__ASIDE_NAVIGATION_MODULE_GOAL_SUBTITLE": "",
+ "__ASIDE_NAVIGATION_MODULE_INSTRUCTIONS_NOTE_BLOCK_SUBTITLE": "",
+ "__ASIDE_NAVIGATION_MODULE_LANGUAGE_SUBTITLE": "",
+ "__ASIDE_NAVIGATION_MODULE_OUT_OF_SCOPE_SUBTITLE": "",
+ "__ASIDE_NAVIGATION_MODULE_SETUP_NOTE_BLOCK_SUBTITLE": "",
+ "__ASIDE_NAVIGATION_MODULE_SUBTITLE_BLOCK_SUBTITLE": "",
+ "__ASIDE_NAVIGATION_MODULE_TARGET_NOTE_BLOCK_SUBTITLE": "",
+ "__ASIDE_NAVIGATION_MODULE_TARGET_SUBTITLE": "",
+ "__ASIDE_NAVIGATION_MODULE_TASKS_SUBTITLE": "",
+ "__ASIDE_NAVIGATION_MODULE_TOUCHPOINTS_SUBTITLE": "",
"__BANNER_CROSS_FUNCTIONAL_CTA_AUTOMATION": "Contattaci",
"__BANNER_CROSS_FUNCTIONAL_CTA_EXPERIENCE": "Contattaci",
"__BANNER_CROSS_FUNCTIONAL_CTA_LOADING": "invio in corso...",
@@ -432,6 +449,7 @@
"__CAMPAIGN_PAGE_NAVIGATION_MEDIA_ITEM_INSIGHTS_LABEL": "Punti principali",
"__CAMPAIGN_PAGE_NAVIGATION_MEDIA_ITEM_METHODOLOGY_LABEL": "Sulla campagna",
"__CAMPAIGN_PAGE_NAVIGATION_MEDIA_ITEM_OVERVIEW_LABEL": "Panoramica",
+ "__CAMPAIGN_PAGE_NAVIGATION_PLAN_EXTERNAL_LINK_LABEL": "",
"__CAMPAIGN_PAGE_REPORTS_CARDS_DOWNLOAD_LABEL": "Scarica ora",
"__CAMPAIGN_PAGE_REPORTS_CARDS_OPEN_LINK_LABEL": "Apri link",
"__CAMPAIGN_PAGE_REPORTS_CARDS_UPDATED_ON_LABEL": "Ultima modifica",
@@ -576,6 +594,8 @@
"__CATALOG_PAGE_TITLE": "Servizi",
"__CATALOG_STICKY_CONTAINER_NAV_CATEGORIES_LABEL": "PER TIPOLOGIA",
"__CATALOG_STICKY_CONTAINER_NAV_EXTERNAL_LINK_LABEL": "Scopri tutti i servizi",
+ "__COPY_ERROR": "",
+ "__COPY_SUCCESS": "",
"__DASHABOARD_CAMPAIGN_CAMPAIGN_TYPE_FILTER_LABEL Max:10": "Tipo",
"__DASHABOARD_CAMPAIGN_STATUS_FILTER_ALL": "Tutte",
"__DASHABOARD_CAMPAIGN_STATUS_FILTER_COMPLETED": "Completate",
@@ -981,6 +1001,7 @@
"__PAGE_TITLE_CATALOG": "Servizi",
"__PAGE_TITLE_LOGIN": "Accedi",
"__PAGE_TITLE_PRIMARY_DASHBOARD": "Le mie campagne",
+ "__PAGE_TITLE_PRIMARY_DASHBOARD_ARCHIVE": "",
"__PAGE_TITLE_PRIMARY_DASHBOARD_SINGLE_PROJECT": "Progetti",
"__PAGE_TITLE_TEMPLATES": "",
"__PAGE_VIDEOS_EMPTY_STATE": "I video per questo progetto non sono ancora stati caricati.",
@@ -1007,6 +1028,7 @@
"__PLAN_CREATION_PROJECT_DROPDOWN_PLACEHOLDER": "",
"__PLAN_DATE_ERROR_REQUIRED": "",
"__PLAN_DATE_IN_FUTURE_ERROR": "",
+ "__PLAN_DELETE_PLAN_CTA": "",
"__PLAN_GOAL_SIZE_ERROR_REQUIRED": "",
"__PLAN_GOAL_SIZE_ERROR_TOO_LONG": "",
"__PLAN_INSTRUCTION_NOTE_SIZE_ERROR_EMPTY": "",
@@ -1016,6 +1038,11 @@
"__PLAN_PAGE_ADD_MODULE_BLOCK_BUTTON": "",
"__PLAN_PAGE_ADD_MODULE_BLOCK_MODAL_SUBTITLE": "",
"__PLAN_PAGE_ADD_MODULE_BLOCK_MODAL_TITLE": "",
+ "__PLAN_PAGE_DELETE_PLAN_MODAL_BODY": "",
+ "__PLAN_PAGE_DELETE_PLAN_MODAL_BUTTON_CANCEL": "",
+ "__PLAN_PAGE_DELETE_PLAN_MODAL_BUTTON_CONFIRM": "",
+ "__PLAN_PAGE_DELETE_PLAN_MODAL_ERROR": "",
+ "__PLAN_PAGE_DELETE_PLAN_MODAL_TITLE": "",
"__PLAN_PAGE_HEADER_BREADCRUMBS_INSTRUCTIONS_TAB": "",
"__PLAN_PAGE_HEADER_BREADCRUMBS_SETUP_TAB": "",
"__PLAN_PAGE_HEADER_BREADCRUMBS_SUMMARY_TAB": "",
@@ -1274,9 +1301,9 @@
"__PROFILE_MODAL_LANGUAGES_TITLE": "Cambia Lingua",
"__PROFILE_MODAL_LOGOUT_TITLE": "Esci",
"__PROFILE_MODAL_NOTIFICATIONS_INTRO": "Gestisci le notifiche che ti mandiamo per email.",
- "__PROFILE_MODAL_NOTIFICATIONS_OUTRO_P_1": "Con le notifiche attive, ti aggiorneremo su: ",
- "__PROFILE_MODAL_NOTIFICATIONS_OUTRO_P_2": "un commento, l’inizio di una campagna, la fine di una campagna, una menzione e un invito.",
- "__PROFILE_MODAL_NOTIFICATIONS_OUTRO_P_3": "Se disattivi le notifiche, riceverai solo comunicazioni su menzioni e inviti",
+ "__PROFILE_MODAL_NOTIFICATIONS_OUTRO_P_1": "",
+ "__PROFILE_MODAL_NOTIFICATIONS_OUTRO_P_2": "",
+ "__PROFILE_MODAL_NOTIFICATIONS_OUTRO_P_3": "",
"__PROFILE_MODAL_NOTIFICATIONS_TITLE": "Gestisci notifiche",
"__PROFILE_MODAL_NOTIFICATIONS_TOGGLE_OFF": "No",
"__PROFILE_MODAL_NOTIFICATIONS_TOGGLE_ON": "Si",
@@ -1298,6 +1325,13 @@
"__PUBLIC_MANUAL_HELP_MODAL_TITLE": "I nostri Articoli",
"__PUBLIC_MANUAL_NOT_FOUND_TEXT": "A quanto pare la pagina che stai cercando non esiste ancora.",
"__PUBLIC_MANUAL_NOT_FOUND_TITLE": "Manuale non trovato",
+ "__SENTIMENT_COPY_BUTTON_LABEL": "",
+ "__SENTIMENT_OVERVIEW_ALERT_DISCLAIMER": "",
+ "__SENTIMENT_OVERVIEW_ALERT_SUBTITLE": "",
+ "__SENTIMENT_OVERVIEW_ALERT_TITLE": "",
+ "__SENTIMENT_OVERVIEW_SUBTITLE": "",
+ "__SENTIMENT_OVERVIEW_TITLE": "",
+ "__SENTIMENT_TOAST_COPY_MESSAGE": "",
"__SERVICE_DETAIL_PAGE_TAG_RESULTS_DAYS_LABEL": "Primi risultati in <0>{{hours}}0>h",
"__SERVICE_TILES_HEADER": "",
"__SERVICE_TILES_SUBTITLE": "",
@@ -1326,7 +1360,9 @@
"__TOAST_CLOSE_TEXT": "Chiudi",
"__TOAST_GENERIC_ERROR_MESSAGE": "Qualcosa è andato storto, riprova più tardi.",
"__TOOLS_MENU_ITEM_BUTTON_LABEL": "Traduci",
+ "__TOOLS_MENU_ITEM_HIDE_SENTIMENT_LABEL": "",
"__TOOLS_MENU_ITEM_LANGUAGE_SETTINGS_TOOLTIP": "Impostazioni lingua",
+ "__TOOLS_MENU_ITEM_SHOW_SENTIMENT_LABEL": "",
"__TOOLS_MENU_ITEM_TRANSLATE_PREFERENCE_TITLE": "Traduci in",
"__TOOLS_TRANSLATE_BUTTON_CANCEL": "Annulla",
"__TOOLS_TRANSLATE_BUTTON_SEND": "Traduci",
@@ -1340,6 +1376,11 @@
"__TOOLS_TRANSLATE_TOAST_LANGUAGE_ERROR_MESSAGE": "Qualcosa è andato storto durante l'aggiornamento della lingua preferita, riprova",
"__TOOLS_TRANSLATE_TOAST_LANGUAGE_SUCCESS_MESSAGE": "Lingua preferita aggiornata",
"__TOOLS_TRANSLATE_TOGGLE_TEXT": "Imposta come lingua preferita",
+ "__TRANSCRIPT_SENTIMENT_VALUE_NEGATIVE": "",
+ "__TRANSCRIPT_SENTIMENT_VALUE_NEUTRAL": "",
+ "__TRANSCRIPT_SENTIMENT_VALUE_POSITIVE": "",
+ "__TRANSCRIPT_SENTIMENT_VALUE_VERY_NEGATIVE": "",
+ "__TRANSCRIPT_SENTIMENT_VALUE_VERY_POSITIVE": "",
"__UX_CAMPAIGN_PAGE_NAVIGATION_DASHBOARD_TOOLTIP": "Dashboard",
"__UX_CAMPAIGN_PAGE_NAVIGATION_INSIGHTS_TOOLTIP": "Temi e scoperte",
"__UX_CAMPAIGN_PAGE_NAVIGATION_VIDEO_LIST_TOOLTIP": "Lista Video",
diff --git a/src/pages/Bug/Header/ActionsMenu.tsx b/src/pages/Bug/Header/ActionsMenu.tsx
index fb9e7ebb8..07a3eed8e 100644
--- a/src/pages/Bug/Header/ActionsMenu.tsx
+++ b/src/pages/Bug/Header/ActionsMenu.tsx
@@ -2,12 +2,12 @@ import { DotsMenu } from '@appquality/unguess-design-system';
import { t } from 'i18next';
import { useState } from 'react';
import { appTheme } from 'src/app/theme';
+import { ReactComponent as CopyIcon } from 'src/assets/icons/copy-icon.svg';
import { ReactComponent as KeyboardIcon } from 'src/assets/icons/keyboard.svg';
import { ReactComponent as ShareIcon } from 'src/assets/icons/share-stroke.svg';
-import { ReactComponent as CopyIcon } from 'src/assets/icons/copy-icon.svg';
-import { useCopyLink } from 'src/common/components/utils/useCopyLink';
import { ShareModal } from 'src/common/components/BugDetail/ShareModal';
import { GetCampaignsByCidBugsAndBidApiResponse } from 'src/features/api';
+import { useCopyLink } from 'src/hooks/useCopyLink';
import { useSendGTMevent } from 'src/hooks/useGTMevent';
import { BugShortcutHelper } from '../BugShortcutHelper';
diff --git a/src/pages/Bugs/Content/BugsTable/components/SingleGroupAccordion.tsx b/src/pages/Bugs/Content/BugsTable/components/SingleGroupAccordion.tsx
index 15519b405..812565825 100644
--- a/src/pages/Bugs/Content/BugsTable/components/SingleGroupAccordion.tsx
+++ b/src/pages/Bugs/Content/BugsTable/components/SingleGroupAccordion.tsx
@@ -97,7 +97,7 @@ const SingleGroupAccordion = ({
style={{ marginRight: appTheme.space.xs }}
/>
{t('__BUGS_PAGE_TABLE_SEE_ALL', 'see all')}
- {` (${item.bugs.length})`}
+ {` (${item.bugs.length - 3})`}
>
) : (
<>
diff --git a/src/pages/Campaign/ExternalLink.tsx b/src/pages/Campaign/ExternalLink.tsx
index 250f1e187..dbcfa73b3 100644
--- a/src/pages/Campaign/ExternalLink.tsx
+++ b/src/pages/Campaign/ExternalLink.tsx
@@ -3,7 +3,6 @@ import styled from 'styled-components';
const StyledAnchor = styled(Anchor)`
display: block;
- margin-bottom: ${({ theme }) => theme.space.sm};
`;
export const ExternalLink = ({
diff --git a/src/pages/Campaign/useWidgets/Functional/widgets.tsx b/src/pages/Campaign/useWidgets/Functional/widgets.tsx
index 9067281e6..665d160d3 100644
--- a/src/pages/Campaign/useWidgets/Functional/widgets.tsx
+++ b/src/pages/Campaign/useWidgets/Functional/widgets.tsx
@@ -1,11 +1,21 @@
import { useTranslation } from 'react-i18next';
import { useGetCampaignsByCidQuery } from 'src/features/api';
-import { getLocalizedFunctionalDashboardUrl } from 'src/hooks/useLocalizeDashboardUrl';
+import {
+ getLocalizedFunctionalDashboardUrl,
+ getLocalizedPlanUrl,
+} from 'src/hooks/useLocalizeDashboardUrl';
+import styled from 'styled-components';
import { ExternalLink } from '../../ExternalLink';
import { CampaignOverview } from './CampaignOverview';
import { DevicesAndTypes } from './DevicesAndTypes';
import { UniqueBugsSection } from './UniqueBugsSection';
+const NavFooterCTAContainer = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: ${({ theme }) => theme.space.sm};
+`;
+
export const widgets = ({ campaignId }: { campaignId: number }) => {
const { t, i18n } = useTranslation();
const { data: campaign } = useGetCampaignsByCidQuery({
@@ -44,15 +54,25 @@ export const widgets = ({ campaignId }: { campaignId: number }) => {
},
{
content: (
-
+ {campaign.plan && (
+
+ {t('__CAMPAIGN_PAGE_NAVIGATION_PLAN_EXTERNAL_LINK_LABEL')}
+
)}
- >
- {t('__CAMPAIGN_PAGE_NAVIGATION_BUG_EXTERNAL_LINK_LABEL')}
-
+
+ {t('__CAMPAIGN_PAGE_NAVIGATION_BUG_EXTERNAL_LINK_LABEL')}
+
+
),
type: 'footer' as const,
},
diff --git a/src/pages/Dashboard/Project.tsx b/src/pages/Dashboard/Project.tsx
index f8efe5de9..75e56b1f0 100644
--- a/src/pages/Dashboard/Project.tsx
+++ b/src/pages/Dashboard/Project.tsx
@@ -48,14 +48,19 @@ const Items = ({
);
}
+ const isArchiveProject = project.is_archive === 1;
+
if (project.campaigns_count > 0 || items.length > 0) {
return (
-
+
-
+ {!isArchiveProject && }
);
}
@@ -130,7 +135,11 @@ const Project = () => {
return (
}
excludeMarginBottom={isEmpty}
diff --git a/src/pages/Dashboard/project-items/index.tsx b/src/pages/Dashboard/project-items/index.tsx
index 199798305..b74b0f71e 100644
--- a/src/pages/Dashboard/project-items/index.tsx
+++ b/src/pages/Dashboard/project-items/index.tsx
@@ -23,7 +23,13 @@ const FloatRight = styled.div`
margin-bottom: ${theme.space.xs};
`;
-export const ProjectItems = ({ projectId }: { projectId: number }) => {
+export const ProjectItems = ({
+ isArchive,
+ projectId,
+}: {
+ isArchive: boolean;
+ projectId: number;
+}) => {
const { t } = useTranslation();
const { width } = useWindowSize();
const breakpointMd = parseInt(theme.breakpoints.md, 10);
@@ -75,8 +81,16 @@ export const ProjectItems = ({ projectId }: { projectId: number }) => {
>
{width >= breakpointMd && (
diff --git a/src/pages/Plan/Controls.tsx b/src/pages/Plan/Controls.tsx
index 64a4ea05d..9e4f815f8 100644
--- a/src/pages/Plan/Controls.tsx
+++ b/src/pages/Plan/Controls.tsx
@@ -1,18 +1,25 @@
-import { Button } from '@appquality/unguess-design-system';
+import {
+ Button,
+ ButtonMenu,
+ IconButton,
+} from '@appquality/unguess-design-system';
import { useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useNavigate, useParams } from 'react-router-dom';
import { appTheme } from 'src/app/theme';
import { Pipe } from 'src/common/components/Pipe';
+import { ReactComponent as DotsIcon } from '@zendeskgarden/svg-icons/src/16/overflow-vertical-stroke.svg';
import { usePatchPlansByPidStatusMutation } from 'src/features/api';
import { useSubmit } from 'src/features/modules/useModuleConfiguration';
import { useRequestQuotation } from 'src/features/modules/useRequestQuotation';
import { useValidateForm } from 'src/features/planModules';
import { useLocalizeRoute } from 'src/hooks/useLocalizedRoute';
import styled from 'styled-components';
+import { useModule } from 'src/features/modules/useModule';
import { getPlanStatus } from '../Dashboard/hooks/getPlanStatus';
import { usePlan } from './hooks/usePlan';
import { SendRequestModal } from './modals/SendRequestModal';
+import { DeletePlanModal } from './modals/DeletePlanModal';
const StyledPipe = styled(Pipe)`
display: inline;
@@ -24,6 +31,7 @@ export const Controls = () => {
const { t } = useTranslation();
const navigate = useNavigate();
const [isModalOpen, setIsModalOpen] = useState(false);
+ const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);
const { planId } = useParams();
const { plan } = usePlan(planId);
const { handleSubmit: submitModuleConfiguration, isLoading: isSubmitting } =
@@ -31,6 +39,7 @@ export const Controls = () => {
const { validateForm } = useValidateForm();
const [isSubmitted, setIsSubmitted] = useState(false);
const [patchStatus] = usePatchPlansByPidStatusMutation();
+ const { value: titleValue } = useModule('title'); // to use the current changed title value (also if plan is not saved) in delete modal
const campaignRoute = useLocalizeRoute(
`campaigns/${plan?.campaign?.id ?? 0}`
@@ -45,6 +54,16 @@ export const Controls = () => {
setIsModalOpen(true);
};
+ const handleQuitDeletePlanModal = () => {
+ setIsDeleteModalOpen(false);
+ };
+
+ const handleMenuClick = (value?: string) => {
+ if (value === 'delete') {
+ setIsDeleteModalOpen(true);
+ }
+ };
+
if (!plan) return null;
const { status } = getPlanStatus(plan, t);
@@ -94,7 +113,9 @@ export const Controls = () => {
}
return (
-
+
+ {
+ handleMenuClick(value ?? '');
+ }}
+ label={(props) => (
+
+
+
+ )}
+ >
+
+ {t('__PLAN_DELETE_PLAN_CTA')}
+
+
+
+ {isDeleteModalOpen && planId && (
+
+ )}
+
{isModalOpen && setIsModalOpen(false)} />}
);
diff --git a/src/pages/Plan/ModulesList.tsx b/src/pages/Plan/ModulesList.tsx
index 75618668d..44317c21e 100644
--- a/src/pages/Plan/ModulesList.tsx
+++ b/src/pages/Plan/ModulesList.tsx
@@ -30,6 +30,10 @@ export const ModulesList = ({ tabId }: { tabId: PlanTab }) => {
id={`module-${type}`}
style={{
marginBottom: appTheme.space.lg,
+ paddingLeft:
+ type === 'tasks' || type === 'target' ? 0 : appTheme.space.xs,
+ paddingRight:
+ type === 'tasks' || type === 'target' ? 0 : appTheme.space.xs,
display: isVisible ? 'block' : 'none',
}}
>
@@ -37,8 +41,13 @@ export const ModulesList = ({ tabId }: { tabId: PlanTab }) => {
);
})}
-
{tabId !== 'summary' && }
+
>
);
};
diff --git a/src/pages/Plan/PlanBody.tsx b/src/pages/Plan/PlanBody.tsx
index 1e95bd8f5..9fb9082af 100644
--- a/src/pages/Plan/PlanBody.tsx
+++ b/src/pages/Plan/PlanBody.tsx
@@ -1,5 +1,6 @@
import { Col, Grid, Row } from '@appquality/unguess-design-system';
import { appTheme } from 'src/app/theme';
+import { LayoutWrapper } from 'src/common/components/LayoutWrapper';
import { StickyCol } from './common/StickyCol';
import { usePlanTab } from './context/planContext';
import { ModulesList } from './ModulesList';
@@ -15,20 +16,22 @@ export const PlanBody = () => {
const debug = params.get('debug');
return (
-
- {activeTab === 'summary' ? (
-
- ) : (
-
-
-
-
-
-
-
- {debug && }
-
- )}
-
+
+
+ {activeTab === 'summary' ? (
+
+ ) : (
+
+
+
+
+
+
+
+ {debug && }
+
+ )}
+
+
);
};
diff --git a/src/pages/Plan/common/NavContainer.tsx b/src/pages/Plan/common/NavContainer.tsx
index bb7600b00..428940f9e 100644
--- a/src/pages/Plan/common/NavContainer.tsx
+++ b/src/pages/Plan/common/NavContainer.tsx
@@ -3,9 +3,9 @@ import styled from 'styled-components';
export const NavContainer = styled.div`
position: relative;
height: 100%;
- padding: ${({ theme }) => theme.space.sm};
+ padding: ${({ theme }) => theme.space.md};
z-index: ${({ theme }) => theme.levels.front};
- padding-bottom: ${({ theme }) => theme.space.xxl};
+ margin-right: ${({ theme }) => theme.space.md};
display: flex;
flex-direction: column;
diff --git a/src/pages/Plan/modals/DeletePlanModal.tsx b/src/pages/Plan/modals/DeletePlanModal.tsx
new file mode 100644
index 000000000..1860307f8
--- /dev/null
+++ b/src/pages/Plan/modals/DeletePlanModal.tsx
@@ -0,0 +1,95 @@
+import { useNavigate } from 'react-router-dom';
+import { useTranslation, Trans } from 'react-i18next';
+import {
+ Modal,
+ ModalClose,
+ Button,
+ FooterItem,
+ Notification,
+ MD,
+ Span,
+ useToast,
+ Dots,
+} from '@appquality/unguess-design-system';
+import { appTheme } from 'src/app/theme';
+import { useDeletePlansByPidMutation } from 'src/features/api';
+
+const DeletePlanModal = ({
+ planId,
+ planTitle,
+ onQuit,
+}: {
+ planId: string;
+ planTitle: string;
+ onQuit: () => void;
+}) => {
+ const { t } = useTranslation();
+ const { addToast } = useToast();
+ const navigate = useNavigate();
+
+ const [deletePlan, { isLoading }] = useDeletePlansByPidMutation();
+
+ const showDeleteErrorToast = (error: Error) => {
+ addToast(
+ ({ close }) => (
+
+ ),
+ { placement: 'top' }
+ );
+ };
+
+ const handleConfirm = async () => {
+ try {
+ await deletePlan({ pid: planId });
+ navigate(`/`);
+ } catch (e) {
+ showDeleteErrorToast(e as unknown as Error);
+ }
+ onQuit();
+ };
+
+ return (
+
+
+ {t('__PLAN_PAGE_DELETE_PLAN_MODAL_TITLE')}
+
+
+ , boldSpan: }}
+ values={{ planTitle }}
+ defaults=""
+ />
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export { DeletePlanModal };
diff --git a/src/pages/Plan/modules/AdditionalTarget.tsx b/src/pages/Plan/modules/AdditionalTarget.tsx
index c53594cbd..21c362945 100644
--- a/src/pages/Plan/modules/AdditionalTarget.tsx
+++ b/src/pages/Plan/modules/AdditionalTarget.tsx
@@ -90,7 +90,14 @@ const AdditionalTarget = () => {
{hasFeatureFlag(FEATURE_FLAG_CHANGE_MODULES_VARIANTS) &&
getPlanStatus() === 'draft' && (
-