diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index cb69a3748..3ae1e444c 100644 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -803,7 +803,6 @@ "__PLAN_PAGE_EXPERT_REVIEW_TOOLTIP_CONTENT": "An expert will contact you within 3-5 business days with a custom quote", "__PLAN_PAGE_EXPERT_REVIEW_WARNING": "Requires expert review", "__PLAN_PAGE_GROUP_TITLE_ACTIVITY_SCOPE": "Activity Scope", - "__PLAN_PAGE_GROUP_TITLE_ADDITIONAL_DETAILS": "Additional Details", "__PLAN_PAGE_GROUP_TITLE_ADVANCED_CRITERIA": "Other", "__PLAN_PAGE_GROUP_TITLE_BEFORE_STARTING": " ", "__PLAN_PAGE_GROUP_TITLE_BEHAVIOURAL_DATA": "Behavioural Data", @@ -1014,6 +1013,32 @@ "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_ACCESSIBILITY_TAB": "Accessibility", "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_ACCESSIBILITY_TASK_ACCESSIBILITY_BUTTON": "Accessibility Task", "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_ACCESSIBILITY_TASKS_LABEL": "Accessibility", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_AI_DISCLAIMER": "Want to speed things up? Generate structured functional tasks automatically based on your project details.", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_ALERT_TEXT": "List the key pages or flows you want tested. Example:", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_ALERT_TITLE": "How to describe your areas:", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_BUTTON": "Create functional tasks AI", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_CANCEL": "Cancel", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_CONFIRM_CLOSE_BODY": "Heads up! Anything you’ve typed or started generating will be lost if you close this modal.", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_CONFIRM_CLOSE_CLOSE_ANYWAY": "Confirm", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_CONFIRM_CLOSE_HEADER": "Are you sure you want to close?", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_CONFIRM_CLOSE_KEEP_PROCESSING": "Cancel", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_CREATE_BUTTON": "Generate tasks", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_CREATING": "Creating...", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_ERROR_FETCHING": "Something went wrong. Please try again.", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_ERROR_SUBMITTING": "Something went wrong. Please try again.", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_FINALIZING": "I'm analyzing your setup and building realistic scenarios. Good things take a few seconds 🙂", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_GATHERING": "Gathering your data…", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_MODAL_HEADER": "Create functional tasks AI", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_PROMPT_INFO": "Tell us which areas you want tested.The AI will use your project goals and setup to generate relevant, structured tasks.", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_PROMPT_LABEL": "Describe the area to test", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_PROMPT_PLACEHOLDER": "e.g. Homepage, product search, checkout…", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_STOP": "Stop Generation", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_SUCCESS_TOAST": "Tasks successfully generated! Review them below and save your plan to move forward.", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_TASK_ANALYZING_CONTEXT": "Analyzing context", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_TASK_COLLECTING_INPUTS": "Collecting your inputs", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_TASK_GENERATING_TASKS": "Generating tasks", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_TASK_IDENTIFYING_AREAS": "Identifying key areas", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_TASKS_QUANTITY_LABEL": "Tasks to generate", "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_DEFAULT_TAB": "All", "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_EXPERIENTIAL_TAB": "Experience", "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_EXPERIENTIAL_TASK_THINKING_ALOUD_BUTTON": "Thinking aloud task", diff --git a/src/locales/it/translation.json b/src/locales/it/translation.json index 1ab3b65b9..811ab8442 100644 --- a/src/locales/it/translation.json +++ b/src/locales/it/translation.json @@ -833,7 +833,6 @@ "__PLAN_PAGE_EXPERT_REVIEW_TOOLTIP_CONTENT": "", "__PLAN_PAGE_EXPERT_REVIEW_WARNING": "", "__PLAN_PAGE_GROUP_TITLE_ACTIVITY_SCOPE": "", - "__PLAN_PAGE_GROUP_TITLE_ADDITIONAL_DETAILS": "", "__PLAN_PAGE_GROUP_TITLE_ADVANCED_CRITERIA": "", "__PLAN_PAGE_GROUP_TITLE_BEFORE_STARTING": "", "__PLAN_PAGE_GROUP_TITLE_BEHAVIOURAL_DATA": "", @@ -1047,6 +1046,32 @@ "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_ACCESSIBILITY_TAB": "", "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_ACCESSIBILITY_TASK_ACCESSIBILITY_BUTTON": "", "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_ACCESSIBILITY_TASKS_LABEL": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_AI_DISCLAIMER": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_ALERT_TEXT": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_ALERT_TITLE": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_BUTTON": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_CANCEL": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_CONFIRM_CLOSE_BODY": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_CONFIRM_CLOSE_CLOSE_ANYWAY": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_CONFIRM_CLOSE_HEADER": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_CONFIRM_CLOSE_KEEP_PROCESSING": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_CREATE_BUTTON": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_CREATING": "Creating...", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_ERROR_FETCHING": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_ERROR_SUBMITTING": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_FINALIZING": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_GATHERING": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_MODAL_HEADER": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_PROMPT_INFO": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_PROMPT_LABEL": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_PROMPT_PLACEHOLDER": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_STOP": "Stop Generation", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_SUCCESS_TOAST": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_TASK_ANALYZING_CONTEXT": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_TASK_COLLECTING_INPUTS": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_TASK_GENERATING_TASKS": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_TASK_IDENTIFYING_AREAS": "", + "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_CREATE_WITH_AI_TASKS_QUANTITY_LABEL": "", "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_DEFAULT_TAB": "", "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_EXPERIENTIAL_TAB": "", "__PLAN_PAGE_MODULE_TASKS_ADD_TASK_MODAL_EXPERIENTIAL_TASK_THINKING_ALOUD_BUTTON": "", diff --git a/src/pages/Plan/common/constants.ts b/src/pages/Plan/common/constants.ts index ec1f8ebb4..131200246 100644 --- a/src/pages/Plan/common/constants.ts +++ b/src/pages/Plan/common/constants.ts @@ -15,7 +15,7 @@ export const MODULE_GROUPS: Record = { { id: 'essentials', title: '__PLAN_PAGE_GROUP_TITLE_ESSENTIALS', - modules: ['goal'], + modules: ['goal', 'out_of_scope'], }, { id: 'technicalRequirements', @@ -75,11 +75,6 @@ export const MODULE_GROUPS: Record = { title: '__PLAN_PAGE_GROUP_TITLE_ACTIVITY_SCOPE', modules: ['tasks'], }, - { - id: 'additionalDetails', - title: '__PLAN_PAGE_GROUP_TITLE_ADDITIONAL_DETAILS', - modules: ['out_of_scope'], - }, ], summary: [], }; @@ -99,7 +94,6 @@ const i18nPlanTitles = () => { t('__PLAN_PAGE_GROUP_TITLE_BEHAVIOURAL_DATA'); t('__PLAN_PAGE_GROUP_TITLE_ADVANCED_CRITERIA'); t('__PLAN_PAGE_GROUP_TITLE_ACTIVITY_SCOPE'); - t('__PLAN_PAGE_GROUP_TITLE_ADDITIONAL_DETAILS'); // Tab titles t('__PLAN_PAGE_TAB_SETUP_TAB_TITLE'); t('__PLAN_PAGE_TAB_TARGET_TAB_TITLE'); diff --git a/src/pages/Plan/modules/Factory/modules/Tasks/Component/context/index.tsx b/src/pages/Plan/modules/Factory/modules/Tasks/Component/context/index.tsx index 046fecd16..c66c651cb 100644 --- a/src/pages/Plan/modules/Factory/modules/Tasks/Component/context/index.tsx +++ b/src/pages/Plan/modules/Factory/modules/Tasks/Component/context/index.tsx @@ -3,6 +3,8 @@ import { createContext, useContext, useMemo, useState } from 'react'; interface ModuleTasksContextType { modalRef: HTMLButtonElement | null; setModalRef: (ref: HTMLButtonElement | null) => void; + isOpenCreateTasksWithAIModal: boolean; + setIsOpenCreateTasksWithAIModal: (value: boolean) => void; } const ModuleTasksContext = createContext(null); @@ -14,13 +16,17 @@ export const ModuleTasksContextProvider = ({ }) => { const [modalRef, setModalRef] = useState(null); + const [isOpenCreateTasksWithAIModal, setIsOpenCreateTasksWithAIModal] = + useState(false); const moduleTasksContextValue = useMemo( () => ({ modalRef, setModalRef, + isOpenCreateTasksWithAIModal, + setIsOpenCreateTasksWithAIModal, }), - [modalRef, setModalRef] + [modalRef, setModalRef, isOpenCreateTasksWithAIModal] ); return ( diff --git a/src/pages/Plan/modules/Factory/modules/Tasks/Component/parts/CreateTaskListsWithAI.tsx b/src/pages/Plan/modules/Factory/modules/Tasks/Component/parts/CreateTaskListsWithAI.tsx deleted file mode 100644 index ad112900d..000000000 --- a/src/pages/Plan/modules/Factory/modules/Tasks/Component/parts/CreateTaskListsWithAI.tsx +++ /dev/null @@ -1,155 +0,0 @@ -import { - Button, - Textarea, - FormField, - Label, - Message, - Input, - AccordionNew, - LG, -} from '@appquality/unguess-design-system'; -import { useEffect, useMemo, useState } from 'react'; -import { useParams } from 'react-router-dom'; -import { appTheme } from 'src/app/theme'; -import { - useGetServicesApiKJobsByJobIdQuery, - usePostServicesApiKUsecasesMutation, -} from 'src/features/api'; - -export const CreateTaskListsWithAI = () => { - const { planId } = useParams(); - const MIN_LENGTH = 1; - const [userPrompt, setUserPrompt] = useState(''); - const [taskCount, setTaskCount] = useState(3); - const [isCreating, setIsCreating] = useState(false); - const [pollingInterval, setPollingInterval] = useState(0); - const [postServicesApiKUsecases, { data: jobData, error: postError }] = - usePostServicesApiKUsecasesMutation(); - - const { data: useCasesData, error: useCasesError } = - useGetServicesApiKJobsByJobIdQuery( - { jobId: jobData?.jobId || '' }, - { - skip: !jobData?.jobId, - pollingInterval, // number in ms or 0 for no polling - } - ); - - const isFormDisabled = useMemo( - () => isCreating || pollingInterval > 0, - [isCreating, pollingInterval] - ); - - const isButtonDisabled = useMemo( - () => userPrompt.length < MIN_LENGTH || isFormDisabled, - [userPrompt, isFormDisabled] - ); - - const handleClick = async () => { - setIsCreating(true); - await postServicesApiKUsecases({ - body: { - planId: planId || '', - count: taskCount, - requirements: userPrompt, - }, - }); - setIsCreating(false); - }; - - // Polling for job status every 5 seconds when jobId becomes available or changes - useEffect(() => { - if (jobData?.jobId) { - setPollingInterval(5000); - } - }, [jobData?.jobId]); - - // Stop polling when job is completed - useEffect(() => { - if (useCasesData?.status === 'completed' && useCasesData?.result) { - setPollingInterval(0); - } - }, [useCasesData]); - - // Stopping polling when there is an error - useEffect(() => { - if (useCasesError) { - setPollingInterval(0); - } - }, [useCasesError]); - - return ( -
-
- - -