From 613d479d77f54b4d7c28060b28b9d7ba1ffee5f7 Mon Sep 17 00:00:00 2001 From: RohitR311 Date: Fri, 3 Jan 2025 00:16:08 +0530 Subject: [PATCH 01/11] feat: add reset functionality to reset all states --- .../molecules/BrowserRecordingSave.tsx | 118 ++++++++++++++++-- 1 file changed, 110 insertions(+), 8 deletions(-) diff --git a/src/components/molecules/BrowserRecordingSave.tsx b/src/components/molecules/BrowserRecordingSave.tsx index e1eff20e6..e837e8dd2 100644 --- a/src/components/molecules/BrowserRecordingSave.tsx +++ b/src/components/molecules/BrowserRecordingSave.tsx @@ -1,7 +1,9 @@ -import React, { useState } from 'react' +import React, { useState } from 'react'; import { Grid, Button, Box, Typography } from '@mui/material'; import { SaveRecording } from "./SaveRecording"; import { useGlobalInfoStore } from '../../context/globalInfo'; +import { useActionContext } from '../../context/browserActions'; +import { useBrowserSteps } from '../../context/browserSteps'; import { stopRecording } from "../../api/recording"; import { useNavigate } from 'react-router-dom'; import { GenericModal } from "../atoms/GenericModal"; @@ -9,10 +11,27 @@ import { useTranslation } from 'react-i18next'; const BrowserRecordingSave = () => { const { t } = useTranslation(); - const [openModal, setOpenModal] = useState(false); - const { recordingName, browserId, setBrowserId, notify } = useGlobalInfoStore(); + const [openDiscardModal, setOpenDiscardModal] = useState(false); + const [openResetModal, setOpenResetModal] = useState(false); + const { recordingName, browserId, setBrowserId, notify, setCurrentWorkflowActionsState, resetInterpretationLog } = useGlobalInfoStore(); const navigate = useNavigate(); + const { + stopGetText, + stopGetList, + stopGetScreenshot, + stopPaginationMode, + stopLimitMode, + setCaptureStage, + updatePaginationType, + updateLimitType, + updateCustomLimit, + setShowLimitOptions, + setShowPaginationOptions, + } = useActionContext(); + + const { browserSteps, deleteBrowserStep } = useBrowserSteps(); + const goToMainMenu = async () => { if (browserId) { await stopRecording(browserId); @@ -22,6 +41,41 @@ const BrowserRecordingSave = () => { navigate('/'); }; + const performReset = () => { + stopGetText(); + stopGetList(); + stopGetScreenshot(); + stopPaginationMode(); + stopLimitMode(); + + setShowLimitOptions(false); + setShowPaginationOptions(false); + setCaptureStage('initial'); + + updatePaginationType(''); + updateLimitType(''); + updateCustomLimit(''); + + setCurrentWorkflowActionsState({ + hasScrapeListAction: false, + hasScreenshotAction: false, + hasScrapeSchemaAction: false + }); + + resetInterpretationLog(); + + // Clear all browser steps + browserSteps.forEach(step => { + deleteBrowserStep(step.id); + }); + + // Close the reset confirmation modal + setOpenResetModal(false); + + // Notify user + notify('info', t('browser_recording.notifications.environment_reset')); + }; + return ( @@ -38,28 +92,76 @@ const BrowserRecordingSave = () => { display: 'flex', justifyContent: 'space-between', }}> - - setOpenModal(false)} modalStyle={modalStyle}> + + {/* Reset Button */} + + + + + {/* Discard Confirmation Modal */} + setOpenDiscardModal(false)} modalStyle={modalStyle}> {t('browser_recording.modal.confirm_discard')} - + + + + + {/* Reset Confirmation Modal */} + setOpenResetModal(false)} modalStyle={modalStyle}> + + {t('browser_recording.modal.confirm_reset')} + + {t('browser_recording.modal.reset_warning')} + + + + - ); -} +}; export default BrowserRecordingSave; From 54bc5e98c3baf3f9bcb8cd1260eab4191e35c204 Mon Sep 17 00:00:00 2001 From: RohitR311 Date: Fri, 3 Jan 2025 00:17:29 +0530 Subject: [PATCH 02/11] feat: get pagination and limit options from browser actions --- src/components/organisms/RightSidePanel.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/organisms/RightSidePanel.tsx b/src/components/organisms/RightSidePanel.tsx index 8211a64a1..a44a6ad08 100644 --- a/src/components/organisms/RightSidePanel.tsx +++ b/src/components/organisms/RightSidePanel.tsx @@ -49,8 +49,8 @@ export const RightSidePanel: React.FC = ({ onFinishCapture const [errors, setErrors] = useState<{ [id: string]: string }>({}); const [confirmedTextSteps, setConfirmedTextSteps] = useState<{ [id: string]: boolean }>({}); const [confirmedListTextFields, setConfirmedListTextFields] = useState<{ [listId: string]: { [fieldKey: string]: boolean } }>({}); - const [showPaginationOptions, setShowPaginationOptions] = useState(false); - const [showLimitOptions, setShowLimitOptions] = useState(false); + // const [showPaginationOptions, setShowPaginationOptions] = useState(false); + // const [showLimitOptions, setShowLimitOptions] = useState(false); const [showCaptureList, setShowCaptureList] = useState(true); const [showCaptureScreenshot, setShowCaptureScreenshot] = useState(true); const [showCaptureText, setShowCaptureText] = useState(true); @@ -60,7 +60,7 @@ export const RightSidePanel: React.FC = ({ onFinishCapture const [isCaptureListConfirmed, setIsCaptureListConfirmed] = useState(false); const { lastAction, notify, currentWorkflowActionsState, setCurrentWorkflowActionsState, resetInterpretationLog } = useGlobalInfoStore(); - const { getText, startGetText, stopGetText, getScreenshot, startGetScreenshot, stopGetScreenshot, getList, startGetList, stopGetList, startPaginationMode, stopPaginationMode, paginationType, updatePaginationType, limitType, customLimit, updateLimitType, updateCustomLimit, stopLimitMode, startLimitMode, captureStage, setCaptureStage } = useActionContext(); + const { getText, startGetText, stopGetText, getScreenshot, startGetScreenshot, stopGetScreenshot, getList, startGetList, stopGetList, startPaginationMode, stopPaginationMode, paginationType, updatePaginationType, limitType, customLimit, updateLimitType, updateCustomLimit, stopLimitMode, startLimitMode, captureStage, setCaptureStage, showPaginationOptions, setShowPaginationOptions, showLimitOptions, setShowLimitOptions } = useActionContext(); const { browserSteps, updateBrowserTextStepLabel, deleteBrowserStep, addScreenshotStep, updateListTextFieldLabel, removeListTextField } = useBrowserSteps(); const { id, socket } = useSocketStore(); const { t } = useTranslation(); From 1cdf279c9e5b421fd59bbff9ffccc30e848314c3 Mon Sep 17 00:00:00 2001 From: RohitR311 Date: Fri, 3 Jan 2025 00:17:55 +0530 Subject: [PATCH 03/11] feat: add pagination and limit options --- src/context/browserActions.tsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/context/browserActions.tsx b/src/context/browserActions.tsx index fd951f924..4854911d2 100644 --- a/src/context/browserActions.tsx +++ b/src/context/browserActions.tsx @@ -15,6 +15,10 @@ interface ActionContextProps { limitType: LimitType; customLimit: string; captureStage: CaptureStage; + showPaginationOptions: boolean; + showLimitOptions: boolean; + setShowPaginationOptions: (show: boolean) => void; + setShowLimitOptions: (show: boolean) => void; setCaptureStage: (stage: CaptureStage) => void; startPaginationMode: () => void; startGetText: () => void; @@ -43,6 +47,8 @@ export const ActionProvider = ({ children }: { children: ReactNode }) => { const [limitType, setLimitType] = useState(''); const [customLimit, setCustomLimit] = useState(''); const [captureStage, setCaptureStage] = useState('initial'); + const [showPaginationOptions, setShowPaginationOptions] = useState(false); + const [showLimitOptions, setShowLimitOptions] = useState(false); const { socket } = useSocketStore(); @@ -96,6 +102,10 @@ export const ActionProvider = ({ children }: { children: ReactNode }) => { limitType, customLimit, captureStage, + showPaginationOptions, + showLimitOptions, + setShowPaginationOptions, + setShowLimitOptions, setCaptureStage, startGetText, stopGetText, From 609eec49dbe8e2dfacc6c8a017344274b15df997 Mon Sep 17 00:00:00 2001 From: RohitR311 Date: Fri, 3 Jan 2025 00:23:08 +0530 Subject: [PATCH 04/11] feat: add translations for reset functionality --- public/locales/de.json | 11 ++++++++--- public/locales/en.json | 10 ++++++++-- public/locales/es.json | 9 +++++++-- public/locales/ja.json | 9 +++++++-- public/locales/zh.json | 9 +++++++-- 5 files changed, 37 insertions(+), 11 deletions(-) diff --git a/public/locales/de.json b/public/locales/de.json index b9b4185b1..5380c3fc3 100644 --- a/public/locales/de.json +++ b/public/locales/de.json @@ -162,6 +162,7 @@ "confirm_limit": "Bestätigen", "finish_capture": "Erfassung abschließen", "back": "Zurück", + "reset": "Zurücksetzen", "finish": "Fertig", "cancel": "Abbrechen", "delete": "Löschen" @@ -225,10 +226,14 @@ }, "browser_recording": { "modal": { - "confirm_discard": "Sind Sie sicher, dass Sie die Aufnahme verwerfen möchten?" - }, + "confirm_discard": "Sind Sie sicher, dass Sie die Aufnahme verwerfen möchten?", + "confirm_reset": "Sind Sie sicher, dass Sie zurücksetzen möchten?", + "reset_warning": "Dies wird alle aktuellen Aufnahmen löschen und Sie zur Startseite zurückbringen. Ihre Aufnahme wird nicht verworfen." + }, "notifications": { - "terminated": "Aktuelle Aufnahme wurde beendet" + "terminated": "Aktuelle Aufnahme wurde beendet", + "environment_reset": "Browser-Umgebung wurde zurückgesetzt", + "reset_successful": "Alle Aufnahmen erfolgreich zurückgesetzt und zum Ausgangszustand zurückgekehrt" } }, "interpretation_log": { diff --git a/public/locales/en.json b/public/locales/en.json index bd8acce38..6f9ae4235 100644 --- a/public/locales/en.json +++ b/public/locales/en.json @@ -161,8 +161,10 @@ "confirm_capture": "Confirm Capture", "confirm_pagination": "Confirm", "confirm_limit": "Confirm", + "confirm_reset": "Confirm", "finish_capture": "Finish Capture", "back": "Back", + "reset": "Reset", "finish": "Finish", "cancel": "Cancel", "delete": "Delete" @@ -226,10 +228,14 @@ }, "browser_recording": { "modal": { - "confirm_discard": "Are you sure you want to discard the recording?" + "confirm_discard": "Are you sure you want to discard the recording?", + "confirm_reset": "Are you sure you want to reset?", + "reset_warning": "This will clear all current captures and return you to the home page. Your recording will not be discarded." }, "notifications": { - "terminated": "Current Recording was terminated" + "terminated": "Current Recording was terminated", + "environment_reset": "Browser environment has been reset", + "reset_successful": "Successfully reset all captures and returned to initial state" } }, "interpretation_log": { diff --git a/public/locales/es.json b/public/locales/es.json index 942108801..87c397d2c 100644 --- a/public/locales/es.json +++ b/public/locales/es.json @@ -163,6 +163,7 @@ "confirm_limit": "Confirmar", "finish_capture": "Finalizar Captura", "back": "Atrás", + "reset": "Reiniciar", "finish": "Finalizar", "cancel": "Cancelar", "delete": "Eliminar" @@ -226,10 +227,14 @@ }, "browser_recording": { "modal": { - "confirm_discard": "¿Está seguro de que desea descartar la grabación?" + "confirm_discard": "¿Está seguro de que desea descartar la grabación?", + "confirm_reset": "¿Está seguro de que desea reiniciar?", + "reset_warning": "Esto borrará todas las capturas actuales y lo devolverá a la página de inicio. Su grabación no se descartará." }, "notifications": { - "terminated": "La grabación actual fue terminada" + "terminated": "La grabación actual fue terminada", + "environment_reset": "El entorno del navegador ha sido reiniciado", + "reset_successful": "Se reiniciaron correctamente todas las capturas y se volvió al estado inicial" } }, "interpretation_log": { diff --git a/public/locales/ja.json b/public/locales/ja.json index 0bcba967a..db38f7642 100644 --- a/public/locales/ja.json +++ b/public/locales/ja.json @@ -163,6 +163,7 @@ "confirm_limit": "確認", "finish_capture": "取得を完了", "back": "戻る", + "reset": "リセット", "finish": "完了", "cancel": "キャンセル", "delete": "削除" @@ -226,10 +227,14 @@ }, "browser_recording": { "modal": { - "confirm_discard": "録画を破棄してもよろしいですか?" + "confirm_discard": "録画を破棄してもよろしいですか?", + "confirm_reset": "リセットしてもよろしいですか?", + "reset_warning": "現在のキャプチャーがすべてクリアされ、ホームページに戻ります。録画は破棄されません。" }, "notifications": { - "terminated": "現在の録画は終了しました" + "terminated": "現在の録画は終了しました", + "environment_reset": "ブラウザー環境がリセットされました", + "reset_successful": "すべてのキャプチャーを正常にリセットし、初期状態に戻りました" } }, "interpretation_log": { diff --git a/public/locales/zh.json b/public/locales/zh.json index a19fe4391..e16ab7ead 100644 --- a/public/locales/zh.json +++ b/public/locales/zh.json @@ -163,6 +163,7 @@ "confirm_limit": "确认", "finish_capture": "完成捕获", "back": "返回", + "reset": "重置", "finish": "完成", "cancel": "取消", "delete": "删除" @@ -226,10 +227,14 @@ }, "browser_recording": { "modal": { - "confirm_discard": "您确定要放弃录制吗?" + "confirm_discard": "您确定要放弃此录制吗?", + "confirm_reset": "您确定要重置吗?", + "reset_warning": "这将清除所有当前捕获并返回首页。您的录制不会被放弃。" }, "notifications": { - "terminated": "当前录制已终止" + "terminated": "当前录制已终止", + "environment_reset": "浏览器环境已重置", + "reset_successful": "已成功重置所有捕获并返回初始状态" } }, "interpretation_log": { From cc5a456e12f9e5057ebe4bad5b1bafa05c45029b Mon Sep 17 00:00:00 2001 From: RohitR311 Date: Fri, 3 Jan 2025 18:40:43 +0530 Subject: [PATCH 05/11] feat: set workflow as empty on performing reset --- src/components/molecules/BrowserRecordingSave.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/components/molecules/BrowserRecordingSave.tsx b/src/components/molecules/BrowserRecordingSave.tsx index e837e8dd2..2e13a673a 100644 --- a/src/components/molecules/BrowserRecordingSave.tsx +++ b/src/components/molecules/BrowserRecordingSave.tsx @@ -8,6 +8,8 @@ import { stopRecording } from "../../api/recording"; import { useNavigate } from 'react-router-dom'; import { GenericModal } from "../atoms/GenericModal"; import { useTranslation } from 'react-i18next'; +import { emptyWorkflow } from '../../shared/constants'; +import { useSocketStore } from '../../context/socket'; const BrowserRecordingSave = () => { const { t } = useTranslation(); @@ -16,6 +18,8 @@ const BrowserRecordingSave = () => { const { recordingName, browserId, setBrowserId, notify, setCurrentWorkflowActionsState, resetInterpretationLog } = useGlobalInfoStore(); const navigate = useNavigate(); + const { socket } = useSocketStore(); + const { stopGetText, stopGetList, @@ -28,6 +32,7 @@ const BrowserRecordingSave = () => { updateCustomLimit, setShowLimitOptions, setShowPaginationOptions, + setWorkflow, } = useActionContext(); const { browserSteps, deleteBrowserStep } = useBrowserSteps(); @@ -62,6 +67,8 @@ const BrowserRecordingSave = () => { hasScrapeSchemaAction: false }); + setWorkflow(emptyWorkflow); + resetInterpretationLog(); // Clear all browser steps From 1a292a0f4b6db9230f2ee5c098452c9f9ee344e5 Mon Sep 17 00:00:00 2001 From: RohitR311 Date: Fri, 3 Jan 2025 18:45:30 +0530 Subject: [PATCH 06/11] feat: do not set workflow data on workflow reset --- src/components/organisms/RightSidePanel.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/components/organisms/RightSidePanel.tsx b/src/components/organisms/RightSidePanel.tsx index a44a6ad08..f8457ff24 100644 --- a/src/components/organisms/RightSidePanel.tsx +++ b/src/components/organisms/RightSidePanel.tsx @@ -44,7 +44,6 @@ interface RightSidePanelProps { } export const RightSidePanel: React.FC = ({ onFinishCapture }) => { - const [workflow, setWorkflow] = useState(emptyWorkflow); const [textLabels, setTextLabels] = useState<{ [id: string]: string }>({}); const [errors, setErrors] = useState<{ [id: string]: string }>({}); const [confirmedTextSteps, setConfirmedTextSteps] = useState<{ [id: string]: boolean }>({}); @@ -60,7 +59,7 @@ export const RightSidePanel: React.FC = ({ onFinishCapture const [isCaptureListConfirmed, setIsCaptureListConfirmed] = useState(false); const { lastAction, notify, currentWorkflowActionsState, setCurrentWorkflowActionsState, resetInterpretationLog } = useGlobalInfoStore(); - const { getText, startGetText, stopGetText, getScreenshot, startGetScreenshot, stopGetScreenshot, getList, startGetList, stopGetList, startPaginationMode, stopPaginationMode, paginationType, updatePaginationType, limitType, customLimit, updateLimitType, updateCustomLimit, stopLimitMode, startLimitMode, captureStage, setCaptureStage, showPaginationOptions, setShowPaginationOptions, showLimitOptions, setShowLimitOptions } = useActionContext(); + const { getText, startGetText, stopGetText, getScreenshot, startGetScreenshot, stopGetScreenshot, getList, startGetList, stopGetList, startPaginationMode, stopPaginationMode, paginationType, updatePaginationType, limitType, customLimit, updateLimitType, updateCustomLimit, stopLimitMode, startLimitMode, captureStage, setCaptureStage, showPaginationOptions, setShowPaginationOptions, showLimitOptions, setShowLimitOptions, workflow, setWorkflow } = useActionContext(); const { browserSteps, updateBrowserTextStepLabel, deleteBrowserStep, addScreenshotStep, updateListTextFieldLabel, removeListTextField } = useBrowserSteps(); const { id, socket } = useSocketStore(); const { t } = useTranslation(); @@ -68,7 +67,7 @@ export const RightSidePanel: React.FC = ({ onFinishCapture const workflowHandler = useCallback((data: WorkflowFile) => { setWorkflow(data); //setRecordingLength(data.workflow.length); - }, [workflow]) + }, []) useEffect(() => { if (socket) { From 8d012aa426edd9efaa60aeb08d7e07d0d63f5aa0 Mon Sep 17 00:00:00 2001 From: RohitR311 Date: Fri, 3 Jan 2025 18:46:24 +0530 Subject: [PATCH 07/11] feat: add action to set workflow --- src/context/browserActions.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/context/browserActions.tsx b/src/context/browserActions.tsx index 4854911d2..c8e6b238c 100644 --- a/src/context/browserActions.tsx +++ b/src/context/browserActions.tsx @@ -1,5 +1,7 @@ import React, { createContext, useContext, useState, ReactNode } from 'react'; import { useSocketStore } from './socket'; +import { WorkflowFile } from 'maxun-core'; +import { emptyWorkflow } from '../shared/constants'; export type PaginationType = 'scrollDown' | 'scrollUp' | 'clickNext' | 'clickLoadMore' | 'none' | ''; export type LimitType = '10' | '100' | 'custom' | ''; @@ -13,10 +15,12 @@ interface ActionContextProps { limitMode: boolean; paginationType: PaginationType; limitType: LimitType; + workflow: WorkflowFile; customLimit: string; captureStage: CaptureStage; showPaginationOptions: boolean; showLimitOptions: boolean; + setWorkflow: (workflow: WorkflowFile) => void; setShowPaginationOptions: (show: boolean) => void; setShowLimitOptions: (show: boolean) => void; setCaptureStage: (stage: CaptureStage) => void; @@ -38,6 +42,7 @@ interface ActionContextProps { const ActionContext = createContext(undefined); export const ActionProvider = ({ children }: { children: ReactNode }) => { + const [workflow, setWorkflow] = useState(emptyWorkflow); const [getText, setGetText] = useState(false); const [getList, setGetList] = useState(false); const [getScreenshot, setGetScreenshot] = useState(false); @@ -100,10 +105,12 @@ export const ActionProvider = ({ children }: { children: ReactNode }) => { limitMode, paginationType, limitType, + workflow, customLimit, captureStage, showPaginationOptions, showLimitOptions, + setWorkflow, setShowPaginationOptions, setShowLimitOptions, setCaptureStage, From a27e8440a1d3e41a1911951f5355b60a41927119 Mon Sep 17 00:00:00 2001 From: RohitR311 Date: Fri, 3 Jan 2025 19:37:06 +0530 Subject: [PATCH 08/11] feat: navigate to initial url on reset --- src/components/molecules/BrowserRecordingSave.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/components/molecules/BrowserRecordingSave.tsx b/src/components/molecules/BrowserRecordingSave.tsx index 2e13a673a..2e67451b5 100644 --- a/src/components/molecules/BrowserRecordingSave.tsx +++ b/src/components/molecules/BrowserRecordingSave.tsx @@ -15,7 +15,7 @@ const BrowserRecordingSave = () => { const { t } = useTranslation(); const [openDiscardModal, setOpenDiscardModal] = useState(false); const [openResetModal, setOpenResetModal] = useState(false); - const { recordingName, browserId, setBrowserId, notify, setCurrentWorkflowActionsState, resetInterpretationLog } = useGlobalInfoStore(); + const { recordingName, browserId, initialUrl, setRecordingUrl, setBrowserId, notify, setCurrentWorkflowActionsState, resetInterpretationLog } = useGlobalInfoStore(); const navigate = useNavigate(); const { socket } = useSocketStore(); @@ -75,6 +75,13 @@ const BrowserRecordingSave = () => { browserSteps.forEach(step => { deleteBrowserStep(step.id); }); + + if (socket) { + socket?.emit('new-recording'); + socket.emit('input:url', initialUrl); + // Update the URL in the navbar to match + setRecordingUrl(initialUrl); + } // Close the reset confirmation modal setOpenResetModal(false); From fcd9c2f484733b8b318410237c70298deb75e31f Mon Sep 17 00:00:00 2001 From: RohitR311 Date: Fri, 3 Jan 2025 19:41:20 +0530 Subject: [PATCH 09/11] feat: set first url as recording url and initial url --- src/components/molecules/RecordingsTable.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/components/molecules/RecordingsTable.tsx b/src/components/molecules/RecordingsTable.tsx index f8a0ba37d..37f0fd72c 100644 --- a/src/components/molecules/RecordingsTable.tsx +++ b/src/components/molecules/RecordingsTable.tsx @@ -85,7 +85,7 @@ export const RecordingsTable = ({ handleEditRecording, handleRunRecording, handl }, ]; - const { notify, setRecordings, browserId, setBrowserId, recordingUrl, setRecordingUrl, recordingName, setRecordingName, recordingId, setRecordingId } = useGlobalInfoStore(); + const { notify, setRecordings, browserId, setBrowserId, setInitialUrl, recordingUrl, setRecordingUrl, recordingName, setRecordingName, recordingId, setRecordingId } = useGlobalInfoStore(); const navigate = useNavigate(); const handleChangePage = (event: unknown, newPage: number) => { @@ -142,6 +142,11 @@ export const RecordingsTable = ({ handleEditRecording, handleRunRecording, handl handleStartRecording(); }; + const setBrowserRecordingUrl = (event: React.ChangeEvent) => { + setInitialUrl(event.target.value); + setRecordingUrl(event.target.value); + } + useEffect(() => { if (rows.length === 0) { fetchRecordings(); @@ -307,7 +312,7 @@ export const RecordingsTable = ({ handleEditRecording, handleRunRecording, handl variant="outlined" fullWidth value={recordingUrl} - onChange={(e: any) => setRecordingUrl(e.target.value)} + onChange={setBrowserRecordingUrl} style={{ marginBottom: '20px', marginTop: '20px' }} /> {/* Reset Button */} - + + + + { setOpenResetModal(true); handleClose(); }}> + {t('right_panel.buttons.reset')} + +