@erpsquad/common 1.10.8-test → 1.10.9-test
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{ai-summary-D9QajB4_.js → ai-summary-4NVNEHfi.js} +2 -2
- package/dist/chunks/{ai-summary-D9QajB4_.js.map → ai-summary-4NVNEHfi.js.map} +1 -1
- package/dist/chunks/{ai-summary-FqAUpafL.esm.js → ai-summary-f8clWLbW.esm.js} +65 -44
- package/dist/chunks/{ai-summary-FqAUpafL.esm.js.map → ai-summary-f8clWLbW.esm.js.map} +1 -1
- package/dist/chunks/{android-12-switch-BVabRCje.esm.js → android-12-switch-BUbQYnRQ.esm.js} +53 -35
- package/dist/chunks/{android-12-switch-BVabRCje.esm.js.map → android-12-switch-BUbQYnRQ.esm.js.map} +1 -1
- package/dist/chunks/android-12-switch-CphTHRb8.js +2 -0
- package/dist/chunks/{android-12-switch-DMaoWQwq.js.map → android-12-switch-CphTHRb8.js.map} +1 -1
- package/dist/chunks/{appbar-6Ucw59ku.js → appbar-C6Es9HGk.js} +2 -2
- package/dist/chunks/{appbar-6Ucw59ku.js.map → appbar-C6Es9HGk.js.map} +1 -1
- package/dist/chunks/{appbar-mDf1LZ0u.esm.js → appbar-CKrHdx9n.esm.js} +2 -2
- package/dist/chunks/{appbar-mDf1LZ0u.esm.js.map → appbar-CKrHdx9n.esm.js.map} +1 -1
- package/dist/chunks/{default-data-CwLgBvlI.esm.js → default-data-BsZWgQGR.esm.js} +3 -3
- package/dist/chunks/{default-data-CwLgBvlI.esm.js.map → default-data-BsZWgQGR.esm.js.map} +1 -1
- package/dist/chunks/{default-data-D2cqOmp4.js → default-data-Dsjlvwev.js} +2 -2
- package/dist/chunks/{default-data-D2cqOmp4.js.map → default-data-Dsjlvwev.js.map} +1 -1
- package/dist/chunks/{fullScreen-VlXxoepU.js → fullScreen-BBpaDn-A.js} +2 -2
- package/dist/chunks/{fullScreen-VlXxoepU.js.map → fullScreen-BBpaDn-A.js.map} +1 -1
- package/dist/chunks/{fullScreen-B9d2_kak.esm.js → fullScreen-Dn-3Tkwm.esm.js} +2 -2
- package/dist/chunks/{fullScreen-B9d2_kak.esm.js.map → fullScreen-Dn-3Tkwm.esm.js.map} +1 -1
- package/dist/chunks/index-B9CFxEZ9.js +2 -0
- package/dist/chunks/index-B9CFxEZ9.js.map +1 -0
- package/dist/chunks/{index-iPYNYnNP.esm.js → index-wf5q5BST.esm.js} +73 -66
- package/dist/chunks/{index-iPYNYnNP.esm.js.map → index-wf5q5BST.esm.js.map} +1 -1
- package/dist/chunks/{migration-utils-TYitNMC7.js → migration-utils-9IXhe_fj.js} +2 -2
- package/dist/chunks/{migration-utils-TYitNMC7.js.map → migration-utils-9IXhe_fj.js.map} +1 -1
- package/dist/chunks/{migration-utils-BRjncD-b.esm.js → migration-utils-DGoEzQUj.esm.js} +2 -2
- package/dist/chunks/{migration-utils-BRjncD-b.esm.js.map → migration-utils-DGoEzQUj.esm.js.map} +1 -1
- package/dist/chunks/{sidebar-DJREtRnK.js → sidebar-B3SExDRU.js} +2 -2
- package/dist/chunks/{sidebar-DJREtRnK.js.map → sidebar-B3SExDRU.js.map} +1 -1
- package/dist/chunks/{sidebar-D_3INLNa.esm.js → sidebar-n9Y25HU-.esm.js} +2 -2
- package/dist/chunks/{sidebar-D_3INLNa.esm.js.map → sidebar-n9Y25HU-.esm.js.map} +1 -1
- package/dist/chunks/{sidebarScreen-CUf5Onkp.js → sidebarScreen-Dxb_e58p.js} +2 -2
- package/dist/chunks/{sidebarScreen-CUf5Onkp.js.map → sidebarScreen-Dxb_e58p.js.map} +1 -1
- package/dist/chunks/{sidebarScreen-CLjYZOzQ.esm.js → sidebarScreen-_Zt2pSOx.esm.js} +3 -3
- package/dist/chunks/{sidebarScreen-CLjYZOzQ.esm.js.map → sidebarScreen-_Zt2pSOx.esm.js.map} +1 -1
- package/dist/components/index.esm.js +121 -103
- package/dist/components/index.js +1 -1
- package/dist/index.esm.js +218 -200
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/layout/index.esm.js +2 -2
- package/dist/layout/index.js +1 -1
- package/dist/src/components/index.d.ts +18 -1
- package/dist/utils/index.esm.js +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/views/index.esm.js +5 -5
- package/dist/views/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunks/android-12-switch-DMaoWQwq.js +0 -2
- package/dist/chunks/index-BQ2NBHDS.js +0 -2
- package/dist/chunks/index-BQ2NBHDS.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-data-D2cqOmp4.js","sources":["../../src/components/material-table/components/number-aggregation.tsx","../../src/views/404.tsx","../../src/views/privateRoute.tsx","../../src/views/afterAuth/page-view/redux/actionCreator.ts","../../src/views/afterAuth/page-view/utils/default-data.ts","../../src/views/afterAuth/page-view/utils/local-data.ts","../../src/views/afterAuth/page-view/redux/state.ts","../../src/views/afterAuth/page-view/redux/reducer.ts","../../src/views/beforeAuth/change-password/change-password.tsx","../../src/views/beforeAuth/components/calendar-data/calendar-data.ts","../../src/views/beforeAuth/components/grid-data/grid-data.ts","../../src/views/beforeAuth/components/list-content/column-raw.tsx","../../src/views/form-builder/field_properties.ts","../../src/views/form-builder/element-edit-forms/field-select.tsx","../../src/views/form-builder/element-edit-forms/text.tsx","../../src/views/form-builder/element-edit-forms/select.tsx","../../src/views/form-builder/element-edit-forms/section.tsx","../../src/views/form-builder/element-edit-forms/checkbox.tsx","../../src/views/form-builder/element-edit-forms/table-form.tsx","../../src/views/form-builder/form-fields.tsx","../../src/views/form-builder/utils/common.ts","../../src/views/form-builder/custom-form.tsx","../../src/views/template-editor/services/CSSScopingService.ts","../../src/views/template-editor/utils/common.ts","../../src/views/template-editor/components/EditorHeader.tsx","../../src/views/template-editor/edit-section-modal/edit-section-modal.tsx","../../src/views/template-editor/utils/style-extractor.ts","../../src/views/template-editor/hooks/useDebouncedUpdate.ts","../../src/views/template-editor/components/EditorSection.tsx","../../src/views/template-editor/components/controllers/AlignmentControl.tsx","../../src/views/template-editor/components/controllers/TextControls.tsx","../../src/views/template-editor/components/controllers/ButtonControls.tsx","../../src/views/template-editor/components/controllers/border-control.tsx","../../src/views/template-editor/components/controllers/ImageControls.tsx","../../src/views/template-editor/components/controllers/DividerControls.tsx","../../src/views/template-editor/components/controllers/TableControls.tsx","../../src/views/template-editor/components/controllers/SignatureControls.tsx","../../src/views/template-editor/components/controllers/CodeControls.tsx","../../src/views/template-editor/components/SectionFormatPanel.tsx","../../src/views/template-editor/components/EditorSidebar.tsx","../../src/views/template-editor/components/EditorCanvas.tsx","../../src/views/template-editor/template-name-modal/template-name-modal.tsx","../../src/views/template-editor/components/SectionFlowEditor.tsx","../../src/views/template-editor/add-template/add-template.tsx","../../src/views/template-editor/template-modal/html-thumbnail-preview.tsx","../../src/views/template-editor/template-modal/html-thumbnail-preview-full.tsx","../../src/views/template-editor/template-modal/template-modal.tsx","../../src/views/template-editor/company-selection-modal/company-selection-modal.tsx","../../src/views/template-editor/templates.tsx","../../src/views/form-builder/element-edit-forms/column-width.tsx","../../src/views/beforeAuth/forgot-password/forgot-password.tsx","../../src/views/beforeAuth/landing/landing.tsx","../../src/views/afterAuth/page-view/page-view.tsx","../../src/views/beforeAuth/reset-password/reset-password.tsx","../../src/views/beforeAuth/components/activity-tag-data/activity-tag-data.ts","../../src/views/beforeAuth/components/kanbann-content/kanbann-raw.ts","../../src/views/template-editor/utils/default-data.ts","../../src/views/beforeAuth/components/multiline-data/multiline-data.ts","../../src/views/beforeAuth/components/list-content/list-data.tsx","../../src/views/beforeAuth/components/tabs-data/tabs-data.ts","../../src/views/template-editor/routes.tsx","../../src/views/beforeAuth/components/user-dropdown-data/user-dropdown-data.ts"],"sourcesContent":["import React, { useEffect } from \"react\";\nimport { aggregationFns } from \"../aggregation-fns\";\nimport Typography from \"../../typography/typography\";\nimport { MenuItem } from \"@mui/material\";\nimport Menu from \"../../menu/menu\";\nimport { MRT_RowData } from \"material-react-table\";\n\ntype aggregationType =\n | \"none\"\n | \"avg\"\n | \"min\"\n | \"max\"\n | \"count_empty\"\n | \"count_full\"\n | \"sum\"\n | \"percentage_empty\"\n | \"percentage_full\";\n\ninterface IAggregation {\n label: string;\n value: aggregationType;\n}\n\nconst allAggregations: IAggregation[] = [\n {\n label: \"Average\",\n value: \"avg\",\n },\n {\n label: \"Sum\",\n value: \"sum\",\n },\n {\n label: \"Min\",\n value: \"min\",\n },\n {\n label: \"Max\",\n value: \"max\",\n },\n {\n label: \"Count Empty\",\n value: \"count_empty\",\n },\n {\n label: \"Count Full\",\n value: \"count_full\",\n },\n {\n label: \"Percentage Full\",\n value: \"percentage_full\",\n },\n {\n label: \"Percentage Empty\",\n value: \"percentage_empty\",\n },\n {\n label: \"None\",\n value: \"none\",\n },\n];\n\nconst nonNumberAggregations: IAggregation[] = [\n {\n label: \"Count Empty\",\n value: \"count_empty\",\n },\n {\n label: \"Count Full\",\n value: \"count_full\",\n },\n {\n label: \"Percentage Full\",\n value: \"percentage_full\",\n },\n {\n label: \"Percentage Empty\",\n value: \"percentage_empty\",\n },\n {\n label: \"None\",\n value: \"none\",\n },\n];\n\nconst aggregationFnsLookup = {\n avg: aggregationFns.average,\n sum: aggregationFns.sum,\n max: aggregationFns.max,\n count_empty: aggregationFns.countEmpty,\n count_full: aggregationFns.countFull,\n percentage_empty: aggregationFns.percentageEmpty,\n percentage_full: aggregationFns.percentageFull,\n min: aggregationFns.min,\n none: aggregationFns.none,\n};\n\ninterface INumberAggregation {\n data: MRT_RowData[];\n column: string;\n type?: string;\n}\n\nconst NumberAggregation = ({ data, column, type }: INumberAggregation) => {\n const [selectedType, setSelectedType] =\n React.useState<aggregationType>(\"none\");\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const [calculatedValue, setCalculatedValue] = React.useState<string | null>();\n const open = Boolean(anchorEl);\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const handleAggregationType = (val: aggregationType) => {\n setSelectedType(val);\n handleClose();\n };\n\n useEffect(() => {\n const func = aggregationFnsLookup[selectedType];\n setCalculatedValue(func(data, column));\n }, [selectedType, column, data]);\n\n const aggregations =\n type === \"number\" ? allAggregations : nonNumberAggregations;\n\n return (\n <>\n <Typography\n onClick={handleClick}\n sx={{ cursor: \"pointer\" }}\n type=\"s4\"\n weight=\"normal\"\n color={calculatedValue ? \"theme.secondary.1000\" : \"theme.secondary.500\"}\n >\n {calculatedValue || \"+ Add Calculation\"}\n </Typography>\n <Menu\n id=\"basic-menu\"\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n >\n {aggregations?.map((aggr) => (\n <MenuItem\n key={aggr.value}\n selected={selectedType == aggr?.value}\n onClick={() => handleAggregationType(aggr?.value)}\n >\n <Typography color=\"theme.secondary.1000\" type=\"s4\">\n {aggr?.label}\n </Typography>\n </MenuItem>\n ))}\n </Menu>\n </>\n );\n};\n\nexport { NumberAggregation };\nexport default NumberAggregation;\n","import { Component } from \"react\";\r\n\r\nclass NotFound extends Component {\r\n componentDidMount() {\r\n setTimeout(() => {\r\n // this.props.history.push('/');\r\n }, 2000);\r\n }\r\n\r\n render() {\r\n return (\r\n <div\r\n style={{\r\n textAlign: \"center\",\r\n position: \"absolute\",\r\n top: \"50%\",\r\n left: \"50%\",\r\n transform: \"translate(-50%, -50%)\",\r\n }}\r\n >\r\n <strong>\r\n <p>404</p>\r\n </strong>\r\n <hr />\r\n <p>Not Found</p>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default NotFound;\r\n","import React from \"react\";\r\nimport { Navigate, Outlet } from \"react-router-dom\";\r\n\r\nimport { Pathname } from \"../constants/pathnames/pathname\";\r\nimport { useAuth } from \"../hooks/useAuth\";\r\nimport Loader from \"../components/loader\";\r\n\r\nexport const PrivateRoute = () => {\r\n const { user, loading } = useAuth();\r\n\r\n return loading ? (\r\n <Loader />\r\n ) : user ? (\r\n <Outlet />\r\n ) : (\r\n <Navigate to={Pathname.LOGIN} />\r\n );\r\n};\r\n\r\nexport default PrivateRoute;\r\n","import { createAsyncThunk } from \"@reduxjs/toolkit\";\r\n\r\nexport const fetchPage = createAsyncThunk(\r\n \"pageView/fetchPage\",\r\n (pageId: number, { getState }) => {\r\n const { pages }: any = getState();\r\n const { data } = pages.pages.find((p: any) => p?.value === pageId);\r\n return data;\r\n },\r\n);\r\n","const rows = [\r\n {\r\n name: \"John\",\r\n age: 30,\r\n gender: \"Male\",\r\n company: \"NASA\",\r\n location: \"USA\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n];\r\n\r\nconst columns = [\r\n {\r\n header: \"Name\",\r\n type: \"string\",\r\n accessorKey: \"name\",\r\n },\r\n {\r\n type: \"number\",\r\n header: \"Age\",\r\n accessorKey: \"age\",\r\n },\r\n {\r\n header: \"Gender\",\r\n type: \"string\",\r\n accessorKey: \"gender\",\r\n },\r\n {\r\n header: \"Company\",\r\n type: \"string\",\r\n accessorKey: \"company\",\r\n },\r\n {\r\n header: \"Location\",\r\n type: \"string\",\r\n accessorKey: \"location\", //simple recommended way to define a column\r\n },\r\n {\r\n header: \"Price\",\r\n type: \"number\",\r\n accessorKey: \"price\",\r\n },\r\n];\r\n\r\nconst columnOrder = [\"name\", \"age\", \"gender\", \"company\", \"location\", \"price\"];\r\n\r\nexport const defaultData = { rows, columns, columnOrder };\r\n","const rows = [\r\n {\r\n name: \"John\",\r\n age: 30,\r\n gender: \"Male\",\r\n company: \"NASA\",\r\n location: \"USA\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n];\r\n\r\nconst columns = [\r\n {\r\n type: \"number\",\r\n header: \"Age\",\r\n accessorKey: \"age\",\r\n },\r\n {\r\n header: \"Gender\",\r\n type: \"string\",\r\n accessorKey: \"gender\",\r\n },\r\n {\r\n header: \"Company\",\r\n type: \"string\",\r\n accessorKey: \"company\",\r\n },\r\n {\r\n header: \"Name\",\r\n type: \"string\",\r\n accessorKey: \"name\",\r\n },\r\n {\r\n header: \"Location\",\r\n type: \"string\",\r\n accessorKey: \"location\", //simple recommended way to define a column\r\n },\r\n {\r\n header: \"Price\",\r\n type: \"number\",\r\n accessorKey: \"price\",\r\n },\r\n];\r\n\r\nconst columnOrder = [\"age\", \"gender\", \"company\", \"name\", \"location\", \"price\"];\r\n\r\nexport const local = { rows, columns, columnOrder };\r\n","import { defaultData } from \"../utils/default-data\";\r\nimport { local } from \"../utils/local-data\";\r\n\r\nexport const state = {\r\n currentPage: 1,\r\n rows: [],\r\n columns: [],\r\n columnOrder: [],\r\n loading: true,\r\n error: \"\",\r\n pages: [\r\n {\r\n name: \"Default\",\r\n _id: 1,\r\n data: defaultData,\r\n },\r\n {\r\n name: \"Local\",\r\n _id: 2,\r\n data: local,\r\n },\r\n ],\r\n paginationModel: {\r\n pageNo: 1,\r\n limit: 10,\r\n },\r\n};\r\n\r\nexport default state;\r\n","import { createSlice } from \"@reduxjs/toolkit\";\r\nimport initialState from \"./state\";\r\n\r\nimport { fetchPage } from \"./actionCreator\";\r\n\r\nexport const pageViewSlice = createSlice({\r\n name: \"pageView\",\r\n initialState,\r\n reducers: {\r\n changeCurrentPage(state, action) {\r\n state.currentPage = action.payload;\r\n },\r\n setPages(state, action) {\r\n state.pages = action.payload;\r\n },\r\n setPaginationModel(state, action) {\r\n state.paginationModel = action.payload;\r\n },\r\n setColumnOrder(state, action) {\r\n state.columnOrder = action.payload;\r\n },\r\n setRowData(state, { payload }) {\r\n const rows = JSON.parse(JSON.stringify(state.rows));\r\n const row = rows[payload.rowId];\r\n row[payload.columnId] = payload.value;\r\n state.rows = rows;\r\n },\r\n },\r\n extraReducers: (builder) => {\r\n builder.addCase(fetchPage.pending, (state) => {\r\n state.loading = true;\r\n });\r\n builder.addCase(fetchPage.fulfilled, (state, action) => {\r\n state.loading = false;\r\n state.error = \"\";\r\n state.rows = action.payload.rows;\r\n state.columns = action.payload.columns;\r\n state.columnOrder = action.payload.columnOrder;\r\n });\r\n builder.addCase(fetchPage.rejected, (state) => {\r\n state.loading = false;\r\n state.rows = [];\r\n state.columns = [];\r\n state.error = \"Unable to get data\";\r\n });\r\n },\r\n});\r\n\r\nconst {\r\n changeCurrentPage: pageViewChangeCurrentPage,\r\n setPages: setPageViewPages,\r\n setPaginationModel: setPageViewPaginationModel,\r\n setColumnOrder,\r\n setRowData,\r\n} = pageViewSlice.actions;\r\n\r\nexport {\r\n pageViewChangeCurrentPage,\r\n setPageViewPages,\r\n setPageViewPaginationModel,\r\n setColumnOrder,\r\n setRowData,\r\n};\r\n\r\nexport default pageViewSlice.reducer;\r\n","import { useState } from \"react\";\r\n// import { useNavigate } from \"react-router-dom\";\r\nimport { Pathname } from \"../../../constants/pathnames/pathname\";\r\nimport { Box, Grid, styled } from \"@mui/material\";\r\n// import { styled } from \"@mui/material/styles\";\r\nimport images from \"../../../assets/images\";\r\nimport DynamicInput from \"../../../components/form-control/form-builder/form-builder-element/text\";\r\nimport { useForm } from \"react-hook-form\";\r\nimport Typography from \"../../../components/typography/typography\";\r\nimport Button from \"../../../components/button/button\";\r\n// import DynamicCheckBox from \"../../../components/form-control/form-builder/form-builder-element/checkbox\";\r\nimport { Eye, EyeOff } from \"../../../components/icons\";\r\nimport { LoginFormValues } from \"../../../contexts/AuthContext\";\r\n// import { useAuth } from \"../../../hooks/useAuth\";\r\nimport Toast from \"../../../components/toast/toast\";\r\nimport * as Yup from \"yup\";\r\nimport { yupResolver } from \"@hookform/resolvers/yup\";\r\nimport { useAuth } from \"../../../hooks/useAuth\";\r\nimport { useLocation, useNavigate } from \"react-router-dom\";\r\nimport { getApiConfig } from \"@/utils\";\r\n\r\n\r\nconst LoginContainer = styled(Grid)(() => ({\r\n height: \"100vh\",\r\n }));\r\n \r\n const LeftGrid = styled(Grid)(({ theme }) => ({\r\n [theme.breakpoints.down(\"sm\")]: {\r\n display: \"none\",\r\n },\r\n backgroundImage: `url(${images.login.LoginLeftBg})`,\r\n backgroundRepeat: \"no-repeat\",\r\n backgroundSize: \"cover\",\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n [theme.breakpoints.down(\"lg\")]: {\r\n \"& img\": {\r\n width: 350,\r\n height: 350,\r\n },\r\n },\r\n [theme.breakpoints.down(\"md\")]: {\r\n \"& img\": {\r\n width: 300,\r\n height: 300,\r\n },\r\n },\r\n }));\r\n \r\n const RightGrid = styled(Grid)(() => ({\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n padding: \"1rem\",\r\n }));\r\n\r\n const FlexBox = styled(Box)(() => ({\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n }));\r\n\r\n interface FormValeus {\r\n login: LoginFormValues;\r\n }\r\n\r\n const validationSchema = Yup.object({\r\n login: Yup.object({\r\n password: Yup.string()\r\n .required(\"Please enter password\")\r\n .min(8, \"Password must be at least 8 characters\")\r\n .matches(/[A-Z]/, \"Password must contain at least one uppercase letter\")\r\n .matches(/[!@#$%^&*(),.?\":{}|<>]/, \"Password must contain at least one special character\"),\r\n confirm_password: Yup.string().required(\"Please enter confirm password\").oneOf([Yup.ref('password')], \"Passwords must match\"),\r\n }),\r\n });\r\n\r\nexport const ChangePassword = () => {\r\n\r\n const { control, handleSubmit } = useForm<FormValeus>({\r\n resolver: yupResolver(validationSchema),\r\n mode: \"all\",\r\n });\r\n const [toast, setToast] = useState<IToast | null>(null);\r\n\r\n const [showPassword, setShowPassword] = useState<boolean>(false);\r\n const handleShowPassword = () => setShowPassword(!showPassword);\r\n const { changePassword } = useAuth();\r\n const location = useLocation();\r\n const navigate = useNavigate();\r\n\r\n const onSubmit = async (values: FormValeus) => {\r\n const token = location.state?.token;\r\n if (!token) {\r\n setToast({ message: 'Token missing', type: \"alert\" });\r\n return;\r\n } else {\r\n values.login.token = token;\r\n await changePassword(values.login, () => {\r\n setToast({ message: 'Password changed successfully', type: \"normal\" });\r\n setTimeout(() => {\r\n navigate(Pathname.LOGIN);\r\n }, 2000);\r\n });\r\n return values;\r\n }\r\n };\r\n\r\n const appLogo = getApiConfig().appLogo || images.erp_logo\r\n\r\n\r\n return (\r\n <Box>\r\n <LoginContainer container>\r\n <LeftGrid item sm={6}>\r\n <img src={images.login.LoginLeftSiteImage} />\r\n </LeftGrid>\r\n <RightGrid item sm={6} xs={12}>\r\n <FlexBox\r\n display=\"flex\"\r\n flexDirection=\"column\"\r\n gap={4}\r\n sx={(theme) => ({\r\n minWidth: 400,\r\n [theme.breakpoints.down(\"md\")]: {\r\n minWidth: 300,\r\n },\r\n [theme.breakpoints.down(\"sm\")]: {\r\n minWidth: 300,\r\n },\r\n })}\r\n >\r\n <Box textAlign=\"center\">\r\n <img src={appLogo} width={160} height={55}/>\r\n </Box>\r\n <form onSubmit={handleSubmit(onSubmit)}>\r\n <FlexBox gap={4}>\r\n <FlexBox gap={3}>\r\n <Box>\r\n <Typography\r\n align=\"center\"\r\n type=\"h1\"\r\n weight=\"medium\"\r\n color=\"theme.secondary.1000\"\r\n >\r\n Change Password\r\n </Typography>\r\n <Typography\r\n align=\"center\"\r\n type=\"h5\"\r\n weight=\"normal\"\r\n color=\"theme.secondary81000\"\r\n >\r\n Enter Details below\r\n </Typography>\r\n </Box>\r\n <FlexBox gap={2}>\r\n <Box>\r\n <DynamicInput\r\n formControl={control}\r\n label=\"Password\"\r\n name=\"password\"\r\n type={\"password\"}\r\n placeholder=\"Enter Password\"\r\n fieldArrayName=\"login\"\r\n />\r\n </Box>\r\n <Box>\r\n <DynamicInput\r\n formControl={control}\r\n label=\"Confirm Password\"\r\n name=\"confirm_password\"\r\n type={showPassword ? \"text\" : \"password\"}\r\n fieldArrayName=\"login\"\r\n endIcon={\r\n <>\r\n {showPassword ? (\r\n <Eye fontSize=\"small\" htmlColor=\"#292D32\" />\r\n ) : (\r\n <EyeOff fontSize=\"small\" htmlColor=\"#292D32\" />\r\n )}\r\n </>\r\n }\r\n onIconClick={handleShowPassword}\r\n placeholder=\"Enter confirm password\"\r\n />\r\n </Box>\r\n </FlexBox>\r\n </FlexBox>\r\n <FlexBox gap={2}>\r\n <Button type=\"submit\" size=\"large\" variant=\"contained\">\r\n Change Password\r\n </Button>\r\n </FlexBox>\r\n </FlexBox>\r\n </form>\r\n </FlexBox>\r\n </RightGrid>\r\n </LoginContainer>\r\n <Toast\r\n open={Boolean(toast)}\r\n message={toast?.message}\r\n type={toast?.type}\r\n handleClose={() => setToast(null)}\r\n anchorOrigin={{ horizontal: \"right\", vertical: \"bottom\" }}\r\n autoHideDuration={3000}\r\n />\r\n </Box>\r\n );\r\n};","// export const calendarData = {\r\n// events: [\r\n// { id: 1, title: \"event 1\", date: \"2019-12-01\" },\r\n// {\r\n// title: \"event 2\",\r\n// start: \"2019-12-01\",\r\n// end: \"2019-12-05\",\r\n// allDay: true,\r\n// HostName: \"William\",\r\n// },\r\n// {\r\n// title: \"event 3\",\r\n// start: \"2019-12-05\",\r\n// end: \"2019-12-07\",\r\n// allDay: true,\r\n// },\r\n// {\r\n// title: \"event 4\",\r\n// start: \"2019-12-05\",\r\n// end: \"2019-12-07\",\r\n// allDay: true,\r\n// },\r\n// {\r\n// title: \"event 5\",\r\n// start: \"2019-12-05\",\r\n// end: \"2019-12-07\",\r\n// allDay: true,\r\n// },\r\n// {\r\n// title: \"event 6\",\r\n// start: \"2019-12-05\",\r\n// end: \"2019-12-07\",\r\n// allDay: true,\r\n// },\r\n// ],\r\n// };\r\n\r\nexport const calendarData = {\r\n events: [\r\n { title: \"All Day Event\", start: getDate(\"YEAR-MONTH-01\") },\r\n {\r\n title: \"Long Event\",\r\n start: getDate(\"YEAR-MONTH-07\"),\r\n end: getDate(\"YEAR-MONTH-10\"),\r\n // allDay: true,\r\n // HostName: \"William\",\r\n },\r\n {\r\n groupId: \"999\",\r\n title: \"Repeating Event\",\r\n start: getDate(\"YEAR-MONTH-09T16:00:00+00:00\"),\r\n },\r\n {\r\n groupId: \"999\",\r\n title: \"Repeating Event\",\r\n start: getDate(\"YEAR-MONTH-16T16:00:00+00:00\"),\r\n },\r\n {\r\n title: \"Conference\",\r\n start: \"YEAR-MONTH-17\",\r\n end: getDate(\"YEAR-MONTH-19\"),\r\n },\r\n {\r\n title: \"Meeting\",\r\n start: getDate(\"YEAR-MONTH-18T10:30:00+00:00\"),\r\n end: getDate(\"YEAR-MONTH-18T12:30:00+00:00\"),\r\n },\r\n { title: \"Lunch\", start: getDate(\"YEAR-MONTH-18T12:00:00+00:00\") },\r\n { title: \"Birthday Party\", start: getDate(\"YEAR-MONTH-19T07:00:00+00:00\") },\r\n { title: \"Meeting\", start: getDate(\"YEAR-MONTH-18T14:30:00+00:00\") },\r\n { title: \"Happy Hour\", start: getDate(\"YEAR-MONTH-18T17:30:00+00:00\") },\r\n { title: \"Dinner\", start: getDate(\"YEAR-MONTH-18T20:00:00+00:00\") },\r\n ],\r\n};\r\n\r\nfunction getDate(dayString: any) {\r\n const today = new Date();\r\n const year = today.getFullYear().toString();\r\n let month = (today.getMonth() + 1).toString();\r\n\r\n if (month.length === 1) {\r\n month = \"0\" + month;\r\n }\r\n\r\n return dayString.replace(\"YEAR\", year).replace(\"MONTH\", month);\r\n}\r\n","const data = [\r\n {\r\n name: \"Naidu Setti\",\r\n company: \"ERP Force\",\r\n status: \"Paid\",\r\n email: \"naidu@gmail.com\",\r\n amount: \"$1,00,000\",\r\n },\r\n {\r\n name: \"Shashank Yadav\",\r\n company: \"Antino Labs\",\r\n status: \"Pending\",\r\n email: \"shashank@gmail.com\",\r\n amount: \"$50,000\",\r\n },\r\n {\r\n name: \"Tarun Prajapati\",\r\n company: \"Goldenflitch\",\r\n status: \"Lost\",\r\n email: \"tarun@gmail.com\",\r\n amount: \"$60,000\",\r\n },\r\n {\r\n name: \"Rajneesh Kumar\",\r\n company: \"ERP Force\",\r\n status: \"Lost\",\r\n email: \"rajneesh@gmail.com\",\r\n amount: \"$10,000\",\r\n },\r\n {\r\n name: \"Radhakanth\",\r\n company: \"Antino\",\r\n status: \"Upcomming\",\r\n email: \"radhakanth@gmail.com\",\r\n amount: \"$1,00,000\",\r\n },\r\n];\r\n\r\nexport { data };\nexport default data;\r\n","import { GridColumnIcon } from \"@glideapps/glide-data-grid\";\r\n\r\nexport const column = [\r\n {\r\n title: \"Name\",\r\n id: \"name\",\r\n hasMenu: true,\r\n icon: GridColumnIcon.HeaderString,\r\n },\r\n {\r\n title: \"Company\",\r\n id: \"company\",\r\n hasMenu: true,\r\n dataType: \"Bubble\",\r\n },\r\n {\r\n title: \"Age\",\r\n id: \"age\",\r\n hasMenu: true,\r\n dataType: \"Number\",\r\n },\r\n {\r\n title: \"Image dd\",\r\n id: \"image\",\r\n key: \"image\",\r\n dataType: \"Image\",\r\n },\r\n {\r\n title: \"Email\",\r\n id: \"email\",\r\n hasMenu: true,\r\n },\r\n {\r\n title: \"Date\",\r\n id: \"date\",\r\n hasMenu: true,\r\n dataType: \"DatePicker\",\r\n },\r\n {\r\n title: \"Phone\",\r\n id: \"phone\",\r\n },\r\n {\r\n title: \"Address\",\r\n id: \"address\",\r\n },\r\n {\r\n title: \"about\",\r\n id: \"about\",\r\n },\r\n];\r\n","import { MRT_ColumnDef, MRT_RowData } from \"material-react-table\";\r\n\r\nexport interface IProperty {\r\n field_type: string;\r\n label: string;\r\n placeholder: string;\r\n default_value?: string;\r\n float_step?: string;\r\n min_length?: number;\r\n max_length?: number;\r\n is_multiline?: boolean;\r\n is_required?: boolean;\r\n is_negative?: boolean;\r\n is_unique?: boolean;\r\n is_checked?: boolean;\r\n // options?: Array<{ text: string; value: string }>;\r\n // is_multiselect?: boolean,\r\n id?: string;\r\n is_future_dates_allowed?: boolean;\r\n is_past_dates_allowed?: boolean;\r\n option?: string;\r\n max_size?: number;\r\n section_id?: string;\r\n section_name?: string;\r\n title_position?: \"start\" | \"end\"\r\n title?:string,\r\n table_columns?:MRT_ColumnDef<MRT_RowData>[]\r\n table?:string\r\n module?:string\r\n field?:string\r\n is_country_code_separate?: boolean;\r\n country_code_field_name?: string;\r\n}\r\n\r\ninterface IMultiOption {\r\n value: string;\r\n label: string;\r\n is_checked: boolean;\r\n}\r\n\r\nexport interface IMultiOptionsProperty extends IProperty {\r\n options: IMultiOption[];\r\n display?: \"row\" | \"column\";\r\n}\r\n\r\nexport interface ISelectProperty {\r\n field_type: string;\r\n label: string;\r\n placeholder: string;\r\n default_value: string;\r\n is_required?: boolean;\r\n is_unique?: boolean;\r\n options: ISelectOption[];\r\n is_multiselect?: boolean;\r\n id?: string;\r\n section_id?: string;\r\n section_name?: string;\r\n}\r\n\r\nexport interface ISwitcherForms {\r\n value?: string;\r\n name: string;\r\n id: string | number | null;\r\n}\r\n\r\nexport interface ISectionProperty {\r\n field_type: string;\r\n label: string;\r\n is_accordion: boolean;\r\n id?: string;\r\n section_order?: string;\r\n section_id?: string;\r\n section_name?: string;\r\n section_type: \"Default\" | \"Form switcher section\";\r\n form_switcher_label?: string;\r\n form_switcher_name?: string;\r\n switcher_forms?: ISwitcherForms[];\r\n members: IProperty[] | ISelectProperty[];\r\n}\r\n\r\n\r\ninterface ISelectOption {\r\n text: string;\r\n value: string;\r\n}\r\n\r\nconst text: IProperty = {\r\n field_type: \"text\",\r\n label: \"label\",\r\n placeholder: \"Enter text\",\r\n default_value: \"\",\r\n min_length: 2,\r\n max_length: 30,\r\n is_multiline: false,\r\n is_required: true,\r\n is_unique: false,\r\n};\r\n\r\nconst number: IProperty = {\r\n field_type: \"number\",\r\n label: \"label\",\r\n placeholder: \"Enter number\",\r\n default_value: \"\",\r\n float_step: \"0.001\", // \"0.001\",\r\n min_length: 0,\r\n max_length: 1000,\r\n is_negative: false,\r\n is_required: true,\r\n is_unique: false,\r\n};\r\n\r\nconst email: IProperty = {\r\n field_type: \"email\",\r\n label: \"label\",\r\n placeholder: \"Enter email\",\r\n default_value: \"\",\r\n is_required: false,\r\n is_unique: false,\r\n};\r\n\r\nconst phone: IProperty = {\r\n field_type: \"phone\",\r\n label: \"label\",\r\n placeholder: \"Enter phone\",\r\n default_value: \"\",\r\n is_required: false,\r\n is_unique: false,\r\n};\r\n\r\nconst select: ISelectProperty = {\r\n field_type: \"select\",\r\n label: \"Select\",\r\n placeholder: \"Choose option\",\r\n default_value: \"\",\r\n options: [],\r\n is_multiselect: false,\r\n is_required: true,\r\n is_unique: false,\r\n};\r\n\r\nconst date: IProperty = {\r\n field_type: \"date\",\r\n label: \"label\",\r\n placeholder: \"Select Date\",\r\n default_value: \"\",\r\n is_future_dates_allowed: false,\r\n is_past_dates_allowed: false,\r\n is_required: false,\r\n is_unique: false,\r\n};\r\n\r\nconst time: IProperty = {\r\n field_type: \"time\",\r\n label: \"label\",\r\n placeholder: \"Select Time\",\r\n default_value: \"\",\r\n is_required: false,\r\n is_unique: false,\r\n option: \"12hr\",\r\n};\r\n\r\nconst url: IProperty = {\r\n field_type: \"url\",\r\n label: \"label\",\r\n placeholder: \"Enter URL\",\r\n default_value: \"\",\r\n is_required: false,\r\n is_unique: false,\r\n};\r\n\r\nconst currency: IProperty = {\r\n field_type: \"currency\",\r\n label: \"label\",\r\n placeholder: \"Enter Currency\",\r\n default_value: \"\",\r\n is_required: false,\r\n is_unique: false,\r\n option: \"inr\",\r\n};\r\n\r\nconst file: IProperty = {\r\n field_type: \"file\",\r\n label: \"label\",\r\n placeholder: \"Upload File or Media\",\r\n is_required: false,\r\n is_unique: false,\r\n max_size: 20,\r\n default_value: \"\",\r\n};\r\n\r\nconst image: IProperty = {\r\n field_type: \"image\",\r\n label: \"label\",\r\n placeholder: \"Upload Image\",\r\n is_required: false,\r\n is_unique: false,\r\n max_size: 20,\r\n default_value: \"\",\r\n};\r\n\r\nconst geoLocation: IProperty = {\r\n field_type: \"geoLocation\",\r\n label: \"label\",\r\n placeholder: \"Enter geo location\",\r\n default_value: \"\",\r\n is_required: false,\r\n is_unique: false,\r\n};\r\n\r\nconst section: ISectionProperty = {\r\n field_type: \"section\",\r\n label: \"section\",\r\n section_type: \"Default\",\r\n form_switcher_label: \"Form section\",\r\n form_switcher_name: \"\",\r\n switcher_forms: [{\r\n value: \"\",\r\n name: \"Form 1\",\r\n id: null,\r\n }],\r\n is_accordion: false,\r\n members: [],\r\n};\r\n\r\nconst info: IProperty = {\r\n field_type: \"info\",\r\n label: \"label\",\r\n placeholder: \"Add Label Text\",\r\n default_value: \"\",\r\n};\r\n\r\nconst relation: IProperty = {\r\n field_type: \"relation\",\r\n label: \"label\",\r\n placeholder: \"Add Label Text\",\r\n is_required: false,\r\n is_unique: false,\r\n module: \"\",\r\n field: \"\",\r\n default_value: \"\",\r\n};\r\n\r\nconst checkbox: IProperty = {\r\n field_type: \"checkbox\",\r\n label: \"label\",\r\n placeholder: \"Add Label Text\",\r\n is_required: false,\r\n is_checked: false,\r\n title_position:'end',\r\n title:\"Checkbox\"\r\n};\r\n\r\nconst toggleButton: IProperty = {\r\n field_type: \"toggleButton\",\r\n label: \"label\",\r\n placeholder: \"Add Label Text\",\r\n is_required: false,\r\n is_checked: false,\r\n title_position:'end',\r\n title:\"Toggle\"\r\n};\r\n\r\nconst table: IProperty = {\r\n field_type: \"table\",\r\n label: \"label\",\r\n placeholder: \"Add Label Text\",\r\n is_required: false,\r\n table_columns: [],\r\n table: \"custom\",\r\n};\r\nconst radioButton: IMultiOptionsProperty = {\r\n field_type: \"radioButton\",\r\n placeholder: \"\",\r\n label: \"label\",\r\n title: \"\",\r\n is_required: false,\r\n title_position:'end',\r\n options: [],\r\n display: \"row\",\r\n default_value: \"\",\r\n};\r\nconst tagsInput: IProperty = {\r\n field_type: \"tagsInput\",\r\n label: \"label\",\r\n placeholder: \"Enter tagsInput\",\r\n default_value: \"\",\r\n min_length: 2,\r\n max_length: 30,\r\n is_multiline: false,\r\n is_required: true,\r\n is_unique: false,\r\n};\r\n\r\nexport const element = {\r\n text,\r\n number,\r\n email,\r\n phone,\r\n select,\r\n date,\r\n time,\r\n url,\r\n currency,\r\n file,\r\n geoLocation,\r\n image,\r\n section,\r\n info,\r\n relation,\r\n checkbox,\r\n toggleButton,\r\n radioButton,\r\n table,\r\n tagsInput\r\n};\r\n","// React imports\r\nimport { useEffect, useState } from \"react\";\r\n\r\n// Material UI imports\r\nimport { MenuItem, SelectProps, Stack } from \"@mui/material\";\r\n\r\n// ERP Common imports\r\nimport {\r\n ArrowCircleDown,\r\n Calendar,\r\n CheckboxSquare,\r\n Clock,\r\n DollarCircle,\r\n Email,\r\n Grid,\r\n Hashtag,\r\n Image,\r\n InfoCircle,\r\n Link,\r\n LinkHorizontal,\r\n Location,\r\n PaperClip,\r\n Paragraph,\r\n Phone,\r\n RadioButton,\r\n ToggleSwitch,\r\n} from \"@/components/icons\";\r\nimport Select from \"@/components/select/select\";\r\nimport Typography from \"@/components/typography/typography\";\r\n\r\ninterface IField {\r\n label: string;\r\n value: string;\r\n icon: typeof Paragraph | string;\r\n}\r\n\r\nconst fields: IField[] = [\r\n { label: \"Text\", value: \"text\", icon: Paragraph },\r\n { label: \"Number\", value: \"number\", icon: Hashtag },\r\n { label: \"Select\", value: \"select\", icon: ArrowCircleDown },\r\n { label: \"Date\", value: \"date\", icon: Calendar },\r\n { label: \"Files & Media\", value: \"file\", icon: PaperClip },\r\n { label: \"URL\", value: \"url\", icon: Link },\r\n { label: \"Email\", value: \"email\", icon: Email },\r\n { label: \"Phone\", value: \"phone\", icon: Phone },\r\n { label: \"Currency\", value: \"currency\", icon: DollarCircle },\r\n { label: \"Time\", value: \"time\", icon: Clock },\r\n { label: \"Table\", value: \"table\", icon: Grid },\r\n { label: \"Geolocation\", value: \"geoLocation\", icon: Location },\r\n { label: \"Check Box\", value: \"checkbox\", icon: CheckboxSquare },\r\n { label: \"Image Upload\", value: \"image\", icon: Image },\r\n { label: \"Relation Field\", value: \"relation\", icon: LinkHorizontal },\r\n { label: \"Info Card\", value: \"info\", icon: InfoCircle },\r\n { label: \"Toggle Button\", value: \"toggleButton\", icon: ToggleSwitch },\r\n { label: \"Radio Button\", value: \"radioButton\", icon: RadioButton },\r\n { label: \"tagsInput\", value: \"tagsInput\", icon: Paragraph },\r\n];\r\n\r\nconst FieldSelect: React.FC<SelectProps> = (props) => {\r\n const [selectFields, setSelectFields] = useState<IField[]>(fields);\r\n const [search, setSearch] = useState<string>(\"\");\r\n\r\n const handleSearch = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setSearch(event.target.value);\r\n };\r\n\r\n const handleSearchFields = (searchVal: string) => {\r\n if (searchVal) {\r\n setSelectFields([\r\n ...fields.filter((field) => field.value.includes(searchVal)),\r\n ]);\r\n } else {\r\n setSelectFields(fields);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n handleSearchFields(search);\r\n }, [search]);\r\n\r\n return (\r\n <Select\r\n fullWidth\r\n placeholder=\"Select Field\"\r\n size=\"small\"\r\n labelName=\"Field Type\"\r\n renderValue={(value: string) =>\r\n fields.find((field) => field.value === value)?.label\r\n }\r\n handleSearch={() => handleSearch}\r\n searchPlaceholder=\"Search Attributes\"\r\n searchValue={search}\r\n {...props}\r\n >\r\n {selectFields.map((field) => (\r\n <MenuItem value={field.value} onKeyDown={(e) => e.stopPropagation()}>\r\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\r\n {field.icon && <field.icon fontSize=\"small\" />}\r\n <Typography type=\"s3\" color=\"theme.secondary.1000\">\r\n {field.label}\r\n </Typography>\r\n </Stack>\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n );\r\n};\r\n\r\nexport default FieldSelect;\r\n","// React imports\r\nimport { useCallback, useEffect, useState, useMemo, useRef } from \"react\";\r\n\r\n// Material UI imports\r\nimport {\r\n DialogActions,\r\n DialogContent,\r\n DialogTitle,\r\n IconButton,\r\n MenuItem,\r\n Box,\r\n FormControlLabel,\r\n FormControl,\r\n Slider,\r\n} from \"@mui/material\";\r\nimport { Add, Close } from \"@mui/icons-material\";\r\n\r\n// ERP Common imports\r\nimport Button from \"@/components/button/button\";\r\nimport Modal from \"@/components/modal/modal\";\r\nimport Typography from \"@/components/typography/typography\";\r\nimport TextField from \"@/components/text-field/text-field\";\r\nimport Select from \"@/components/select/select\";\r\nimport Checkbox from \"@/components/checkbox/checkbox\";\r\nimport formatText from \"@/utils/format-text\";\r\n\r\n// Local imports\r\nimport FieldSelect from \"./field-select\";\r\nimport { IElementJson } from \"../custom-form\";\r\nimport { ApiFormFields } from \"../../Redux/state\";\r\nimport \"../custom-form.scss\";\r\n\r\ninterface Option {\r\n label: string;\r\n value: string;\r\n}\r\n\r\ninterface ITextEditFormProps {\r\n handleWidthChange: (value?: number) => void;\r\n handleColumnSelect: (value?: number) => void;\r\n handlePropertyValueUpdate: (\r\n event?: React.ChangeEvent<HTMLInputElement>,\r\n numberValue?: number,\r\n value?: any,\r\n fieldType?: string,\r\n ) => void;\r\n element: IElementJson | null;\r\n fields: ApiFormFields | null;\r\n}\r\n\r\n// Constants moved outside to prevent re-creation\r\nconst COLUMN_PER_ROW_OPTIONS = [1, 2, 3, 4, 5, 6] as const;\r\nconst SELECT_OPTIONS = [\r\n { text: \"12 Hour\", value: \"12hr\" },\r\n { text: \"24 Hour\", value: \"24hr\" },\r\n] as const;\r\nconst CURRENCY_OPTIONS = [\r\n { text: \"INR (India)\", value: \"inr\" },\r\n { text: \"USD (US)\", value: \"usd\" },\r\n] as const;\r\n\r\nconst FIELDS_WITHOUT_PLACEHOLDER = new Set([\r\n \"time\", \"file\", \"geoLocation\", \"image\", \"info\", \"relation\"\r\n]);\r\nconst FIELDS_WITH_MIN_MAX = new Set([\"text\", \"number\"]);\r\n\r\n// Memoized components to prevent unnecessary re-renders\r\nconst MemoizedMenuItem = ({ option, index, prefix }: { option: any; index: number; prefix: string }) => (\r\n <MenuItem key={`${prefix}-${index}`} value={option.value}>\r\n {option.text || option.label}\r\n </MenuItem>\r\n);\r\n\r\nconst MemoizedRelationMenuItem = ({ option, index, prefix }: { option: Option; index: number; prefix: string }) => (\r\n <MenuItem key={`${prefix}-${index}`} value={option.value}>\r\n <Typography type=\"s3\" color=\"theme.secondary.1000\">\r\n {option.label}\r\n </Typography>\r\n </MenuItem>\r\n);\r\n\r\nexport function TextEditForm(props: ITextEditFormProps) {\r\n const { \r\n handlePropertyValueUpdate, \r\n handleColumnSelect, \r\n handleWidthChange, \r\n fields, \r\n element \r\n } = props;\r\n\r\n // State management - optimized to prevent unnecessary re-renders\r\n const [elementJSON, setElementJSON] = useState<IElementJson | null>(element);\r\n const [openModal, setOpenModal] = useState(false);\r\n const [relationFields, setRelationFields] = useState<Option[]>([]);\r\n const [functionValue, setFunctionValue] = useState(\"\");\r\n \r\n // Use refs to track previous values and prevent unnecessary updates\r\n const prevElementRef = useRef<IElementJson | null>(element);\r\n const prevFieldsRef = useRef<ApiFormFields | null>(fields);\r\n\r\n // Memoized relation modules with deep comparison prevention\r\n const relationModulesOptions = useMemo(() => {\r\n if (!fields || fields === prevFieldsRef.current) {\r\n if (prevFieldsRef.current && fields) return prevFieldsRef.current;\r\n }\r\n \r\n prevFieldsRef.current = fields;\r\n \r\n if (!fields) return [];\r\n return Object.keys(fields).map((key) => ({\r\n label: formatText(key),\r\n value: key,\r\n }));\r\n }, [fields]);\r\n\r\n // Optimized relation fields setter with memoization\r\n const setRelationFieldsOptions = useCallback(\r\n (moduleValue?: string) => {\r\n if (!fields || !moduleValue) {\r\n setRelationFields(prev => prev.length > 0 ? [] : prev);\r\n return;\r\n }\r\n\r\n const fieldsArr = fields[moduleValue];\r\n if (fieldsArr?.length) {\r\n const options = fieldsArr.map((field) => ({\r\n label: field.field,\r\n value: field.field,\r\n }));\r\n \r\n // Only update if options actually changed\r\n setRelationFields(prev => {\r\n if (prev.length !== options.length) return options;\r\n const isDifferent = prev.some((item, idx) => \r\n item.value !== options[idx]?.value || item.label !== options[idx]?.label\r\n );\r\n return isDifferent ? options : prev;\r\n });\r\n } else {\r\n setRelationFields(prev => prev.length > 0 ? [] : prev);\r\n }\r\n },\r\n [fields]\r\n );\r\n\r\n // Memoized event handlers to prevent child re-renders\r\n const handleSave = useCallback((value: string) => {\r\n if (!elementJSON) return;\r\n \r\n // Only update if value actually changed\r\n if (elementJSON.default_value !== value) {\r\n const updatedElement = { ...elementJSON, default_value: value };\r\n setElementJSON(updatedElement);\r\n handlePropertyValueUpdate(null, null, value);\r\n }\r\n \r\n if (value) {\r\n setFunctionValue(\"\");\r\n setOpenModal(false);\r\n }\r\n }, [elementJSON, handlePropertyValueUpdate]);\r\n\r\n const handleFieldUpdate = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n if (!elementJSON) return;\r\n \r\n const fieldType = e.target.value;\r\n if (elementJSON.field_type !== fieldType) {\r\n const updatedElement = { ...elementJSON, field_type: fieldType };\r\n setElementJSON(updatedElement);\r\n handlePropertyValueUpdate(null, null, null, e.target.value);\r\n }\r\n }, [elementJSON, handlePropertyValueUpdate]);\r\n\r\n const handleSelectUpdate = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n if (!elementJSON) return;\r\n \r\n const option = e.target.value;\r\n if (elementJSON.option !== option) {\r\n const updatedElement = { ...elementJSON, option };\r\n setElementJSON(updatedElement);\r\n handlePropertyValueUpdate(null, null, option);\r\n }\r\n }, [elementJSON, handlePropertyValueUpdate]);\r\n\r\n const handleModuleSelect = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n const moduleValue = e.target.value;\r\n if (elementJSON?.module !== moduleValue) {\r\n setRelationFieldsOptions(moduleValue);\r\n handlePropertyValueUpdate(e);\r\n }\r\n }, [elementJSON?.module, setRelationFieldsOptions, handlePropertyValueUpdate]);\r\n\r\n const handleWidthSliderChange = useCallback((_: Event, value: number | number[]) => {\r\n if (!elementJSON) return;\r\n \r\n const widthValue = Array.isArray(value) ? value[0] : value;\r\n if (elementJSON.custom_width !== widthValue) {\r\n const updatedElement = { ...elementJSON, custom_width: widthValue };\r\n setElementJSON(updatedElement);\r\n handleWidthChange(widthValue);\r\n }\r\n }, [elementJSON, handleWidthChange]);\r\n\r\n const handleFullWidthChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n if (!elementJSON) return;\r\n \r\n const isFullWidth = e.target.checked;\r\n if (elementJSON.is_fullwidth !== isFullWidth) {\r\n const updatedElement = { ...elementJSON, is_fullwidth: isFullWidth };\r\n setElementJSON(updatedElement);\r\n handlePropertyValueUpdate(e);\r\n }\r\n }, [elementJSON, handlePropertyValueUpdate]);\r\n\r\n const handleColumnSelectChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n const columnValue = Number(e.target.value);\r\n handleColumnSelect(columnValue);\r\n }, [handleColumnSelect]);\r\n\r\n // Memoized helper functions\r\n const getDefaultValue = useCallback((elementJSON: IElementJson) => {\r\n if ([\"number\", \"currency\", \"geoLocation\"].includes(elementJSON.field_type)) {\r\n return elementJSON.default_value?.toString().replace(/[^0-9]/g, \"\") || \"\";\r\n }\r\n return elementJSON.default_value || \"\";\r\n }, []);\r\n\r\n const getMinMaxLabels = useCallback((fieldType: string) => {\r\n return fieldType === \"text\" \r\n ? { min: \"Min character count (with spaces)\", max: \"Max character count (with spaces)\" }\r\n : { min: \"Min number\", max: \"Max number\" };\r\n }, []);\r\n\r\n // Modal handlers\r\n const handleOpenModal = useCallback(() => setOpenModal(true), []);\r\n const handleCloseModal = useCallback(() => {\r\n setOpenModal(false);\r\n setFunctionValue(\"\");\r\n }, []);\r\n\r\n const handleFunctionValueChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n setFunctionValue(e.target.value);\r\n }, []);\r\n\r\n // Optimized effects with proper dependency arrays\r\n useEffect(() => {\r\n // Only update if element actually changed\r\n if (element !== prevElementRef.current) {\r\n setElementJSON(element);\r\n prevElementRef.current = element;\r\n \r\n if (element?.module) {\r\n setRelationFieldsOptions(element.module);\r\n }\r\n }\r\n }, [element, setRelationFieldsOptions]);\r\n\r\n // Memoized render sections to prevent unnecessary re-computation\r\n const currencySelectSection = useMemo(() => {\r\n if (elementJSON?.field_type !== \"currency\") return null;\r\n \r\n return (\r\n <Box>\r\n <FormControl fullWidth>\r\n <Select\r\n fullWidth\r\n placeholder=\"Select Currency\"\r\n size=\"small\"\r\n onChange={handleSelectUpdate}\r\n defaultValue={elementJSON.option}\r\n label=\"Currency\"\r\n name=\"option\"\r\n variant=\"outlined\"\r\n >\r\n {CURRENCY_OPTIONS.map((option, index) => (\r\n <MemoizedMenuItem \r\n key={`currency-${index}`}\r\n option={option} \r\n index={index} \r\n prefix=\"currency\" \r\n />\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Box>\r\n );\r\n }, [elementJSON?.field_type, elementJSON?.option, handleSelectUpdate]);\r\n\r\n const timeSelectSection = useMemo(() => {\r\n if (elementJSON?.field_type !== \"time\") return null;\r\n \r\n return (\r\n <Box>\r\n <FormControl fullWidth>\r\n <Select\r\n fullWidth\r\n placeholder=\"Select Time Format\"\r\n size=\"small\"\r\n onChange={handleSelectUpdate}\r\n defaultValue={elementJSON.option}\r\n label=\"Time Format\"\r\n name=\"option\"\r\n variant=\"outlined\"\r\n >\r\n {SELECT_OPTIONS.map((option, index) => (\r\n <MemoizedMenuItem \r\n key={`time-${index}`}\r\n option={option} \r\n index={index} \r\n prefix=\"time\" \r\n />\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Box>\r\n );\r\n }, [elementJSON?.field_type, elementJSON?.option, handleSelectUpdate]);\r\n\r\n const relationSelectSection = useMemo(() => {\r\n if (elementJSON?.field_type !== \"relation\") return null;\r\n \r\n return (\r\n <>\r\n <Box>\r\n <FormControl fullWidth>\r\n <Select\r\n fullWidth\r\n placeholder={\r\n relationModulesOptions.length\r\n ? \"Select Relation Module\"\r\n : \"No data available\"\r\n }\r\n size=\"small\"\r\n onChange={handleModuleSelect}\r\n value={elementJSON.module || \"\"}\r\n label=\"Relation Module\"\r\n name=\"module\"\r\n >\r\n {relationModulesOptions.length ? (\r\n relationModulesOptions.map((option, index) => (\r\n <MemoizedRelationMenuItem \r\n key={`module-${index}`}\r\n option={option} \r\n index={index} \r\n prefix=\"module\" \r\n />\r\n ))\r\n ) : (\r\n <MenuItem disabled>\r\n <Typography type=\"s3\" color=\"theme.secondary.1000\">\r\n <em>No data available</em>\r\n </Typography>\r\n </MenuItem>\r\n )}\r\n </Select>\r\n </FormControl>\r\n </Box>\r\n\r\n <Box>\r\n <FormControl fullWidth>\r\n <Select\r\n fullWidth\r\n placeholder={\r\n !elementJSON.module\r\n ? \"Select Module First\"\r\n : relationFields.length\r\n ? \"Select Relation Field\"\r\n : \"No data available\"\r\n }\r\n size=\"small\"\r\n onChange={handlePropertyValueUpdate}\r\n value={elementJSON.field || \"\"}\r\n label=\"Relation Field\"\r\n disabled={!elementJSON.module}\r\n name=\"field\"\r\n >\r\n {relationFields.length ? (\r\n relationFields.map((option, index) => (\r\n <MemoizedRelationMenuItem \r\n key={`field-${index}`}\r\n option={option} \r\n index={index} \r\n prefix=\"field\" \r\n />\r\n ))\r\n ) : (\r\n <MenuItem disabled>\r\n <Typography type=\"s3\" color=\"theme.secondary.1000\">\r\n <em>No data available</em>\r\n </Typography>\r\n </MenuItem>\r\n )}\r\n </Select>\r\n </FormControl>\r\n </Box>\r\n </>\r\n );\r\n }, [\r\n elementJSON?.field_type, \r\n elementJSON?.module, \r\n elementJSON?.field,\r\n relationModulesOptions, \r\n relationFields, \r\n handleModuleSelect, \r\n handlePropertyValueUpdate\r\n ]);\r\n\r\n // Early return if no element\r\n if (!elementJSON) {\r\n return null;\r\n }\r\n\r\n const { field_type } = elementJSON;\r\n const minMaxLabels = getMinMaxLabels(field_type);\r\n\r\n return (\r\n <Box className=\"formSection--FieldContainer\">\r\n {/* Field Type Selection */}\r\n <Box>\r\n <FieldSelect\r\n variant=\"outlined\"\r\n onChange={handleFieldUpdate}\r\n defaultValue={field_type}\r\n label=\"Field Type\"\r\n disabled={elementJSON.type === \"system\" || !elementJSON.is_new}\r\n />\r\n </Box>\r\n\r\n {/* Label Field */}\r\n <Box>\r\n <TextField\r\n fullWidth\r\n label=\"Label\"\r\n is_required\r\n name=\"label\"\r\n type=\"text\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={elementJSON.label}\r\n />\r\n </Box>\r\n\r\n {/* File/Image Max Size */}\r\n {(field_type === \"file\" || field_type === \"image\") && (\r\n <Box>\r\n <TextField\r\n fullWidth\r\n label=\"Max File Size (in MB)\"\r\n name=\"max_size\"\r\n type=\"number\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={elementJSON.max_size}\r\n />\r\n </Box>\r\n )}\r\n\r\n {/* Currency Selection - Memoized */}\r\n {currencySelectSection}\r\n\r\n {/* Placeholder and Default Value */}\r\n {!FIELDS_WITHOUT_PLACEHOLDER.has(field_type) && (\r\n <>\r\n <Box>\r\n <TextField\r\n fullWidth\r\n label=\"Placeholder\"\r\n name=\"placeholder\"\r\n type=\"text\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={elementJSON.placeholder}\r\n />\r\n </Box>\r\n <Box>\r\n <TextField\r\n fullWidth\r\n label=\"Default Value\"\r\n placeholder=\"Default Value\"\r\n name=\"default_value\"\r\n type={field_type === \"phone\" ? \"tel\" : field_type === \"number\" ? \"number\" : \"text\"}\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={getDefaultValue(elementJSON)}\r\n />\r\n </Box>\r\n </>\r\n )}\r\n\r\n {/* Time Format Selection - Memoized */}\r\n {timeSelectSection}\r\n\r\n {/* Relation Module and Field Selection - Memoized */}\r\n {relationSelectSection}\r\n\r\n {/* Min/Max Length for Text and Number Fields */}\r\n {FIELDS_WITH_MIN_MAX.has(field_type) && (\r\n <>\r\n <Box>\r\n <TextField\r\n fullWidth\r\n label={minMaxLabels.min}\r\n name=\"min_length\"\r\n type=\"number\"\r\n onChange={(e) => handlePropertyValueUpdate(e, Number(e.target.value))}\r\n defaultValue={elementJSON.min_length || elementJSON.min || 1}\r\n />\r\n </Box>\r\n <Box>\r\n <TextField\r\n fullWidth\r\n label={minMaxLabels.max}\r\n name=\"max_length\"\r\n type=\"number\"\r\n onChange={(e) => handlePropertyValueUpdate(e, Number(e.target.value))}\r\n defaultValue={\r\n elementJSON.max_length || \r\n elementJSON.max || \r\n (field_type === 'number' ? 10000 : 255)\r\n }\r\n />\r\n </Box>\r\n </>\r\n )}\r\n\r\n {/* Column Per Row Selection */}\r\n <Box>\r\n <FormControl fullWidth>\r\n <Select\r\n fullWidth\r\n placeholder=\"Select Column Per Row\"\r\n size=\"small\"\r\n onChange={handleColumnSelectChange}\r\n value={elementJSON.columns_per_row || 1}\r\n label=\"Select Column Per Row\"\r\n name=\"columns_per_row\"\r\n variant=\"outlined\"\r\n >\r\n {COLUMN_PER_ROW_OPTIONS.map((option, index) => (\r\n <MenuItem key={`column-${index}`} value={option}>\r\n {option}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Box>\r\n\r\n {/* Width Adjustment Slider */}\r\n <Box>\r\n <Typography sx={{ color: 'black', mb: 1 }}>\r\n Adjust Width:\r\n </Typography>\r\n <Slider\r\n value={elementJSON.custom_width || 12}\r\n name=\"custom_width\"\r\n min={1}\r\n max={12}\r\n step={1}\r\n onChange={handleWidthSliderChange}\r\n aria-labelledby=\"width-slider\"\r\n sx={{ color: \"#4AC08C\" }}\r\n disabled={elementJSON.is_fullwidth}\r\n marks\r\n valueLabelDisplay=\"auto\"\r\n />\r\n </Box>\r\n\r\n {/* Number Field Specific Options */}\r\n {field_type === \"number\" && (\r\n <>\r\n <Box>\r\n <TextField\r\n fullWidth\r\n label=\"Float Step\"\r\n name=\"float_step\"\r\n type=\"number\"\r\n step=\"0.01\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={elementJSON.float_step}\r\n />\r\n </Box>\r\n <Box>\r\n <FormControlLabel\r\n name=\"is_negative\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={elementJSON.is_negative || false}\r\n label=\"Allow Negative Numbers\"\r\n />\r\n </Box>\r\n </>\r\n )}\r\n\r\n {/* Date Field Specific Options */}\r\n {field_type === \"date\" && (\r\n <>\r\n <Box>\r\n <FormControlLabel\r\n name=\"is_future_dates_allowed\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={elementJSON.is_future_dates_allowed || false}\r\n label=\"Allow Future Dates\"\r\n />\r\n </Box>\r\n <Box>\r\n <FormControlLabel\r\n name=\"is_past_dates_allowed\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={elementJSON.is_past_dates_allowed || false}\r\n label=\"Allow Past Dates\"\r\n />\r\n </Box>\r\n </>\r\n )}\r\n\r\n {/* Required Field Checkbox */}\r\n {field_type !== \"info\" && (\r\n <Box>\r\n <FormControlLabel\r\n name=\"is_required\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={elementJSON.is_required || false}\r\n label=\"This field is required\"\r\n />\r\n </Box>\r\n )}\r\n\r\n {/* Email Unique Checkbox */}\r\n {field_type === \"email\" && (\r\n <Box>\r\n <FormControlLabel\r\n name=\"is_unique\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={elementJSON.is_unique || false}\r\n label=\"Is Unique\"\r\n />\r\n </Box>\r\n )}\r\n\r\n {/* Text Multiline Checkbox */}\r\n {field_type === \"text\" && (\r\n <Box>\r\n <FormControlLabel\r\n name=\"is_multiline\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={elementJSON.is_multiline || false}\r\n label=\"Is Multiline\"\r\n />\r\n </Box>\r\n )}\r\n\r\n {/* Full Width Checkbox */}\r\n <Box>\r\n <FormControlLabel\r\n name=\"is_fullwidth\"\r\n control={<Checkbox />}\r\n onChange={handleFullWidthChange}\r\n checked={elementJSON.is_fullwidth || false}\r\n label=\"Full Width\"\r\n />\r\n </Box>\r\n\r\n {/* Info Field Function Button */}\r\n {field_type === \"info\" && (\r\n <Box>\r\n <Button\r\n variant=\"outlined\"\r\n startIcon={<Add />}\r\n onClick={handleOpenModal}\r\n className=\"formSection--PreviewButton\"\r\n >\r\n Add Function\r\n </Button>\r\n </Box>\r\n )}\r\n\r\n {/* Function Modal */}\r\n <Modal fullWidth onClose={handleCloseModal} open={openModal}>\r\n <DialogTitle>\r\n <Typography type=\"s3\" weight=\"medium\" color=\"theme.secondary.1000\">\r\n Add Function\r\n </Typography>\r\n <IconButton\r\n edge=\"end\"\r\n onClick={handleCloseModal}\r\n size=\"small\"\r\n >\r\n <Close fontSize=\"inherit\" />\r\n </IconButton>\r\n </DialogTitle>\r\n <DialogContent dividers>\r\n <Typography weight=\"medium\" type=\"s3\" color=\"theme.secondary.700\" sx={{ mb: 2 }}>\r\n Label: <span style={{ color: \"#1F2125\" }}>{elementJSON.label}</span>\r\n </Typography>\r\n <TextField\r\n name=\"default_value\"\r\n fullWidth\r\n placeholder=\"Add a function\"\r\n multiline\r\n minRows={4}\r\n defaultValue={elementJSON.default_value}\r\n onChange={handleFunctionValueChange}\r\n value={functionValue}\r\n />\r\n </DialogContent>\r\n <DialogActions>\r\n <Button\r\n variant=\"outlined\"\r\n onClick={handleCloseModal}\r\n style={{ color: \"black\" }}\r\n >\r\n Cancel\r\n </Button>\r\n <Button onClick={() => handleSave(functionValue)}>\r\n Save\r\n </Button>\r\n </DialogActions>\r\n </Modal>\r\n </Box>\r\n );\r\n}\r\n\r\nexport default TextEditForm;","// React imports\r\nimport React, { useEffect, useState, useCallback, useMemo } from \"react\";\r\n\r\n// Material UI imports\r\nimport { \r\n MenuItem, \r\n Box, \r\n FormControlLabel, \r\n Slider, \r\n FormControl, \r\n IconButton\r\n} from \"@mui/material\";\r\nimport { Add } from \"@mui/icons-material\";\r\n\r\n// Third-party imports\r\nimport { enqueueSnackbar } from \"notistack\";\r\n\r\n// ERP Common imports\r\nimport Checkbox from \"@/components/checkbox/checkbox\";\r\nimport Select from \"@/components/select/select\";\r\nimport TextField from \"@/components/text-field/text-field\";\r\nimport Typography from \"@/components/typography/typography\";\r\nimport Button from \"@/components/button/button\";\r\nimport { Trash } from \"@/components/icons\";\r\n\r\n// Local imports\r\nimport FieldSelect from \"./field-select\";\r\nimport \"../custom-form.scss\";\r\n\r\ninterface Option {\r\n label: string;\r\n value: string;\r\n [key: string]: string;\r\n}\r\n\r\ninterface ElementJSON {\r\n id: string;\r\n field_type: string;\r\n label: string;\r\n placeholder: string;\r\n default_value: string | null;\r\n is_multiselect: boolean;\r\n is_required: boolean;\r\n is_unique: boolean;\r\n is_fullwidth: boolean;\r\n custom_width: number;\r\n type?: string;\r\n is_new?: boolean;\r\n options: Option[];\r\n}\r\n\r\ninterface SelectEditFormProps {\r\n element: ElementJSON;\r\n handlePropertyValueUpdate: (\r\n event: React.ChangeEvent<HTMLInputElement> | null,\r\n name?: string | null,\r\n value?: any,\r\n fieldType?: string\r\n ) => void;\r\n handleSelectOptionValueUpdate: (options: Option[]) => void;\r\n handleColumnSelect: (event: React.ChangeEvent<{ value: unknown }>) => void;\r\n handleWidthChange: (value: number | number[]) => void;\r\n}\r\n\r\nconst COLUMN_PER_ROW_OPTIONS = [1, 2, 3, 4, 5, 6] as const;\r\n\r\nexport const SelectEditForm: React.FC<SelectEditFormProps> = React.memo(({\r\n element,\r\n handlePropertyValueUpdate,\r\n handleSelectOptionValueUpdate,\r\n handleColumnSelect,\r\n handleWidthChange\r\n}) => {\r\n // Local state management\r\n const [selectOptions, setSelectOptions] = useState<Option[]>(element.options || []);\r\n const [newOption, setNewOption] = useState<Option>({ label: \"\", value: \"\" });\r\n const [isAddingOption, setIsAddingOption] = useState(false);\r\n\r\n // Sync options with parent element when element changes\r\n useEffect(() => {\r\n if (JSON.stringify(selectOptions) !== JSON.stringify(element.options || [])) {\r\n setSelectOptions(element.options || []);\r\n }\r\n }, [element.options, selectOptions]);\r\n\r\n // Memoized computed values\r\n const isFieldDisabled = useMemo(() => \r\n element.type === \"system\" || !element.is_new, \r\n [element.type, element.is_new]\r\n );\r\n\r\n const selectedOptionLabel = useMemo(() => {\r\n const selectedOption = selectOptions.find(option => option.value === element.default_value);\r\n return selectedOption?.label || \"Select Default\";\r\n }, [selectOptions, element.default_value]);\r\n\r\n // Optimized event handlers with useCallback\r\n const handleFieldUpdate = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n handlePropertyValueUpdate(null, null, null, e.target.value);\r\n }, [handlePropertyValueUpdate]);\r\n\r\n const handleSelectUpdate = useCallback((e: React.ChangeEvent<{ value: unknown }>) => {\r\n handlePropertyValueUpdate(null, null, e.target.value);\r\n }, [handlePropertyValueUpdate]);\r\n\r\n const handleMultiSelect = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n const isChecked = e.target.checked;\r\n // Reset default value when enabling multiselect\r\n const defaultValue = isChecked ? null : element.default_value;\r\n \r\n // Create a synthetic event for the property update\r\n const syntheticEvent = {\r\n target: {\r\n name: 'is_multiselect',\r\n checked: isChecked,\r\n value: isChecked\r\n }\r\n } as React.ChangeEvent<HTMLInputElement>;\r\n \r\n handlePropertyValueUpdate(syntheticEvent);\r\n \r\n // If enabling multiselect, also clear the default value\r\n if (isChecked && element.default_value) {\r\n handlePropertyValueUpdate(null, 'default_value', null);\r\n }\r\n }, [handlePropertyValueUpdate, element.default_value]);\r\n\r\n const handleNewOptionChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n const { name, value } = e.target;\r\n setNewOption(prev => ({ ...prev, [name]: value }));\r\n }, []);\r\n\r\n const handleAddOption = useCallback(() => {\r\n if (!newOption.label.trim() || !newOption.value.trim()) {\r\n return; // Don't add empty options\r\n }\r\n\r\n // Check for duplicate values\r\n const isDuplicate = selectOptions.some(option => \r\n option.value === newOption.value || option.label === newOption.label\r\n );\r\n \r\n if (isDuplicate) {\r\n // Could show an error message here\r\n enqueueSnackbar(\"Option with this value or label already exists.\", { variant: \"error\" });\r\n return;\r\n }\r\n\r\n const updatedOptions = [...selectOptions, { ...newOption }];\r\n setSelectOptions(updatedOptions);\r\n handleSelectOptionValueUpdate(updatedOptions);\r\n \r\n // Reset form\r\n setNewOption({ label: \"\", value: \"\" });\r\n setIsAddingOption(false);\r\n }, [newOption, selectOptions, handleSelectOptionValueUpdate]);\r\n\r\n const handleRemoveOption = useCallback((indexToRemove: number) => {\r\n const updatedOptions = selectOptions.filter((_, index) => index !== indexToRemove);\r\n setSelectOptions(updatedOptions);\r\n handleSelectOptionValueUpdate(updatedOptions);\r\n \r\n // Clear default value if the removed option was selected\r\n const removedOption = selectOptions[indexToRemove];\r\n if (element.default_value === removedOption?.value) {\r\n handlePropertyValueUpdate(null, 'default_value', null);\r\n }\r\n }, [selectOptions, handleSelectOptionValueUpdate, element.default_value, handlePropertyValueUpdate]);\r\n\r\n const handleWidthChangeCallback = useCallback((\r\n _: Event, \r\n newValue: number | number[]\r\n ) => {\r\n handleWidthChange(newValue);\r\n }, [handleWidthChange]);\r\n\r\n return (\r\n <Box className=\"formSection--FieldContainer\">\r\n {/* Field Type Selection */}\r\n <Box>\r\n <FieldSelect\r\n variant=\"outlined\"\r\n onChange={handleFieldUpdate}\r\n defaultValue={element.field_type}\r\n label=\"Field Type\"\r\n disabled={isFieldDisabled}\r\n />\r\n </Box>\r\n\r\n {/* Label Field */}\r\n <Box>\r\n <TextField\r\n fullWidth\r\n label=\"Label\"\r\n is_required\r\n name=\"label\"\r\n type=\"text\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={element.label}\r\n />\r\n </Box>\r\n\r\n {/* Placeholder Field */}\r\n <Box>\r\n <TextField\r\n fullWidth\r\n label=\"Placeholder\"\r\n is_required\r\n name=\"placeholder\"\r\n type=\"text\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={element.placeholder}\r\n />\r\n </Box>\r\n\r\n {/* Default Value Selection */}\r\n <Box>\r\n <Select\r\n fullWidth\r\n placeholder=\"Select Default\"\r\n size=\"small\"\r\n name=\"default_value\"\r\n onChange={handleSelectUpdate}\r\n value={element.default_value || \"\"}\r\n label=\"Default\"\r\n variant=\"outlined\"\r\n disabled={element.is_multiselect}\r\n renderValue={() => selectedOptionLabel}\r\n >\r\n {selectOptions.map((option, index) => (\r\n <MenuItem key={`${option.value}-${index}`} value={option.value}>\r\n {option.label}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </Box>\r\n\r\n {/* Column Per Row Selection */}\r\n <Box>\r\n <FormControl fullWidth>\r\n <Select\r\n fullWidth\r\n placeholder=\"Select Column Per Row\"\r\n size=\"small\"\r\n onChange={handleColumnSelect}\r\n label=\"Select Column Per Row\"\r\n name=\"columnPerRow\"\r\n variant=\"outlined\"\r\n >\r\n {COLUMN_PER_ROW_OPTIONS.map((option) => (\r\n <MenuItem key={option} value={option}>\r\n {option}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Box>\r\n\r\n {/* Width Slider */}\r\n <Box>\r\n <Typography sx={{ color: 'black', mb: 1 }}>\r\n Adjust Width:\r\n </Typography>\r\n <Box pr={2}>\r\n <Slider\r\n value={element.custom_width || 6}\r\n min={1}\r\n max={12}\r\n step={1}\r\n onChange={handleWidthChangeCallback}\r\n aria-labelledby=\"width-slider\"\r\n sx={{ color: \"#4AC08C\" }}\r\n marks\r\n valueLabelDisplay=\"auto\"\r\n />\r\n </Box>\r\n </Box>\r\n\r\n {/* Options Management */}\r\n <Box className=\"formSection--SelectOption\">\r\n <Typography \r\n type=\"s5\" \r\n weight=\"medium\" \r\n color=\"theme.secondary.800\"\r\n sx={{ mb: 0.5 }}\r\n >\r\n Options\r\n </Typography>\r\n \r\n {/* Existing Options */}\r\n {selectOptions.map((option, index) => (\r\n <Box key={`option-${index}`} sx={{ mb: 1, display: 'flex', gap: 1 }}>\r\n <TextField\r\n fullWidth\r\n value={`${option.label} (${option.value})`}\r\n InputProps={{ readOnly: true }}\r\n />\r\n <IconButton\r\n color=\"error\"\r\n size=\"small\"\r\n onClick={() => handleRemoveOption(index)}\r\n >\r\n <Trash />\r\n </IconButton>\r\n </Box>\r\n ))}\r\n\r\n {/* Add New Option Form */}\r\n {isAddingOption && (\r\n <Box className=\"formSection--SelectOption\" sx={{ mt:0.5, p: 2, border: '1px solid #ddd', borderRadius: 1 }}>\r\n <Box sx={{ mb: 2 }}>\r\n <TextField\r\n fullWidth\r\n label=\"Option Label\"\r\n is_required\r\n name=\"label\"\r\n type=\"text\"\r\n placeholder=\"Enter option label\"\r\n value={newOption.label}\r\n onChange={handleNewOptionChange}\r\n />\r\n </Box>\r\n <Box sx={{ mb: 2 }}>\r\n <TextField\r\n fullWidth\r\n label=\"Option Value\"\r\n placeholder=\"Enter option value\"\r\n is_required\r\n name=\"value\"\r\n type=\"text\"\r\n value={newOption.value}\r\n onChange={handleNewOptionChange}\r\n />\r\n </Box>\r\n <Box sx={{ display: 'flex', gap: 1 }}>\r\n <Button\r\n onClick={handleAddOption}\r\n // className=\"formSection--Button\"\r\n startIcon={<Add />}\r\n disabled={!newOption.label.trim() || !newOption.value.trim()}\r\n >\r\n Add Option\r\n </Button>\r\n <Button\r\n onClick={() => {\r\n setIsAddingOption(false);\r\n setNewOption({ label: \"\", value: \"\" });\r\n }}\r\n variant=\"outlined\"\r\n >\r\n Cancel\r\n </Button>\r\n </Box>\r\n </Box>\r\n )}\r\n\r\n {/* Add Option Button */}\r\n {!isAddingOption && (\r\n <Button\r\n onClick={() => setIsAddingOption(true)}\r\n variant=\"outlined\"\r\n className=\"formSection--Button\"\r\n startIcon={<Add />}\r\n sx={{ mt: 1 }}\r\n >\r\n Add Option\r\n </Button>\r\n )}\r\n </Box>\r\n\r\n {/* Form Controls */}\r\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\r\n <FormControlLabel\r\n name=\"is_multiselect\"\r\n control={<Checkbox />}\r\n onChange={handleMultiSelect}\r\n checked={element.is_multiselect}\r\n label=\"Enable Multi Select\"\r\n />\r\n\r\n <FormControlLabel\r\n name=\"is_required\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={element.is_required}\r\n label=\"This field is required\"\r\n />\r\n\r\n <FormControlLabel\r\n name=\"is_unique\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={element.is_unique}\r\n label=\"Is Unique\"\r\n />\r\n\r\n <FormControlLabel\r\n name=\"is_fullwidth\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={element.is_fullwidth}\r\n label=\"Full Width\"\r\n />\r\n </Box>\r\n </Box>\r\n );\r\n});\r\n\r\nSelectEditForm.displayName = 'SelectEditForm';\r\n\r\nexport default SelectEditForm;","// React imports\r\nimport { useEffect, useMemo, useState } from \"react\";\r\n\r\n// Material UI imports\r\nimport { MenuItem, Box, FormControlLabel } from \"@mui/material\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport { Add } from \"@mui/icons-material\";\r\n\r\n// ERP Common imports\r\nimport Select from \"@/components/select/select\";\r\nimport Button from \"@/components/button/button\";\r\nimport Typography from \"@/components/typography/typography\";\r\nimport TextField from \"@/components/text-field/text-field\";\r\nimport Checkbox from \"@/components/checkbox/checkbox\";\r\nimport { generateRandomId } from \"@/utils/common\";\r\nimport { SECTION_TYPES } from \"@/utils/constant\";\r\n\r\n// Local imports\r\nimport { ISwitcherForms } from \"../field_properties\";\r\nimport \"../custom-form.scss\";\r\n\r\nconst SectionEditForm = (props: any) => {\r\n const { handlePropertyValueUpdate } = props;\r\n const [elementJSON, setElementJSON] = useState(props.element);\r\n const [addForm, setAddForm] = useState<boolean>(false);\r\n const [newForm, setNewForm] = useState<string>(\"\");\r\n const selectOption = [\"section\"];\r\n\r\n const isDuplicateFormName = useMemo(\r\n () =>\r\n elementJSON.switcher_forms?.map((ele: any) => ele.name).includes(newForm),\r\n [elementJSON.switcher_forms, newForm]\r\n );\r\n\r\n useEffect(() => {\r\n setElementJSON(props.element);\r\n }, [props.element]);\r\n\r\n return (\r\n <Box className=\"formSection--FieldContainer\" key={elementJSON.id}>\r\n <div>\r\n <Select\r\n key={elementJSON.id}\r\n fullWidth\r\n placeholder=\"Select Field\"\r\n size=\"small\"\r\n disabled\r\n defaultValue={elementJSON.field_type}\r\n label=\"Field Type\"\r\n variant=\"outlined\"\r\n >\r\n {selectOption?.map((item) => (\r\n <MenuItem value={item}>{item}</MenuItem>\r\n ))}\r\n </Select>\r\n </div>\r\n <div>\r\n <Select\r\n key={elementJSON.id}\r\n fullWidth\r\n placeholder=\"Select Field\"\r\n size=\"small\"\r\n name=\"section_type\"\r\n defaultValue={elementJSON.section_type}\r\n label=\"Section Type\"\r\n variant=\"outlined\"\r\n onChange={(e: any) => handlePropertyValueUpdate(e)}\r\n >\r\n {Object.values(SECTION_TYPES).map((type) => {\r\n return (\r\n <MenuItem key={type} value={type}>\r\n {type}\r\n </MenuItem>\r\n );\r\n })}\r\n </Select>\r\n </div>\r\n <div>\r\n <TextField\r\n fullWidth\r\n label=\"Label\"\r\n is_required\r\n key={elementJSON.id}\r\n name=\"label\"\r\n type=\"text\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={elementJSON.label}\r\n />\r\n </div>\r\n <FormControlLabel\r\n key={elementJSON.id}\r\n name=\"is_accordion\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={elementJSON.is_accordion}\r\n label=\"Is Accordion\"\r\n />\r\n {elementJSON.section_type === SECTION_TYPES.FORM_SWITCH_SECTION ? (\r\n <div className=\"formSection--SubFieldContainer\">\r\n <div>\r\n <TextField\r\n fullWidth\r\n label=\"Form label\"\r\n is_required\r\n key={elementJSON.id}\r\n name=\"form_switcher_label\"\r\n type=\"text\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={elementJSON.form_switcher_label}\r\n />\r\n </div>\r\n <div>\r\n <Typography\r\n type=\"s5\"\r\n weight={\"medium\"}\r\n color={\"theme.secondary.800\"}\r\n >\r\n Forms\r\n </Typography>\r\n {elementJSON?.switcher_forms?.map(\r\n (ele: ISwitcherForms) => (\r\n <div className=\"formSection--MultiOptions\" key={elementJSON.id}>\r\n <TextField\r\n fullWidth\r\n key={ele.id}\r\n value={ele.name}\r\n style={{ marginBottom: \"10px\" }}\r\n name=\"switcher_forms\"\r\n onChange={(e: any) => {\r\n const newVal = elementJSON.switcher_forms?.map(\r\n (formEle: ISwitcherForms) =>\r\n ele.id === formEle.id\r\n ? { ...formEle, name: e.target.value }\r\n : { ...formEle }\r\n );\r\n\r\n handlePropertyValueUpdate(e, newVal);\r\n }}\r\n />\r\n <CloseIcon\r\n style={{ fontSize: \"1rem\", color: \"#656669\" }}\r\n onClick={(e: any) => {\r\n const newVal = [...elementJSON.switcher_forms].filter(\r\n (item) => item.id !== ele.id\r\n );\r\n e.target.name = \"switcher_forms\";\r\n handlePropertyValueUpdate(e, newVal);\r\n }}\r\n />\r\n </div>\r\n )\r\n )}\r\n </div>\r\n {addForm ? (\r\n <div>\r\n <div\r\n className=\"formSection--MultiOptions formSection--FullWidth\"\r\n key={elementJSON.id}\r\n >\r\n <div className=\"formSection--FullWidth\">\r\n <TextField\r\n fullWidth\r\n label=\"Form section name\"\r\n placeholder=\"Form section name\"\r\n is_required\r\n key={elementJSON.id}\r\n type=\"text\"\r\n value={newForm}\r\n error={isDuplicateFormName}\r\n helperText={\r\n isDuplicateFormName\r\n ? \"Form section name can not duplicate\"\r\n : \"\"\r\n }\r\n onChange={(e: any) => setNewForm(e.target.value)}\r\n />\r\n </div>\r\n <CloseIcon\r\n style={{ fontSize: \"1rem\", color: \"#656669\" }}\r\n onClick={() => {\r\n setAddForm(false);\r\n setNewForm(\"\");\r\n }}\r\n />\r\n </div>\r\n <Button\r\n onClick={(e: any) => {\r\n const { uniqueStringId: id } = generateRandomId();\r\n const newVal = [\r\n ...elementJSON.switcher_forms,\r\n { name: newForm, id },\r\n ];\r\n handlePropertyValueUpdate(e, newVal);\r\n setNewForm(\"\");\r\n setAddForm(false);\r\n }}\r\n name=\"switcher_forms\"\r\n variant=\"text\"\r\n className=\"formSection--Button\"\r\n disabled={isDuplicateFormName || !newForm}\r\n startIcon={<Add />}\r\n >\r\n Add\r\n </Button>\r\n </div>\r\n ) : null}\r\n {!addForm ? (\r\n <Button\r\n onClick={() => setAddForm(true)}\r\n variant=\"text\"\r\n className=\"formSection--Button\"\r\n startIcon={<Add />}\r\n >\r\n Add forms\r\n </Button>\r\n ) : null}\r\n </div>\r\n ) : null}\r\n </Box>\r\n );\r\n};\r\n\r\nexport { SectionEditForm };\nexport default SectionEditForm;\r\n","// React imports\r\nimport { useEffect, useState } from \"react\";\r\n\r\n// Material UI imports\r\nimport {\r\n MenuItem,\r\n Box,\r\n FormControlLabel,\r\n FormControl,\r\n RadioGroup,\r\n Button,\r\n Select,\r\n InputLabel,\r\n Slider,\r\n} from \"@mui/material\";\r\nimport { Add } from \"@mui/icons-material\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\n// ERP Common imports\r\nimport Checkbox from \"@/components/checkbox/checkbox\";\r\nimport Radio from \"@/components/radio/radio\";\r\nimport TextField from \"@/components/text-field/text-field\";\r\nimport Typography from \"@/components/typography/typography\";\r\n\r\n// Local imports\r\nimport FieldSelect from \"./field-select\";\r\nimport \"../custom-form.scss\";\r\n\r\ninterface Option {\r\n label: string;\r\n value: string;\r\n is_checked: boolean;\r\n [key: string]: string | boolean; // Index signature to allow any string property\r\n}\r\n\r\nexport function CheckboxEditForm(props: any) {\r\n const [isAddSelectOption, setAddSelectOption] = useState(false);\r\n const { handlePropertyValueUpdate, handleSelectOptionValueUpdate , handleColumnSelect , handleWidthChange } = props;\r\n const columnPerRowOptions = [1, 2, 3, 4, 5, 6];\r\n const [selectOptions, setSelectOptions] = useState(\r\n props.element.options || [],\r\n );\r\n const [elementJSON, setElementJSON] = useState(props.element);\r\n\r\n const allowLabelPositionModification =\r\n elementJSON.field_type !== \"radioButton\";\r\n\r\n const [newOptions, setNewOptions] = useState<Option>({\r\n label: \"\",\r\n value: \"\",\r\n is_checked: false,\r\n });\r\n\r\n\r\n\r\n const handleAddNewOption = (e: any) => {\r\n const label: string = e.target.name;\r\n const value: string = e.target.value;\r\n const option: Option = { ...newOptions };\r\n option[label] = value;\r\n setNewOptions(option);\r\n };\r\n\r\n const handleFieldUpdate = (e: any) => {\r\n elementJSON.field_type = e.target.value;\r\n handlePropertyValueUpdate(null, null, null, e.target.value);\r\n };\r\n\r\n const handleSelectUpdate = (e: any) => {\r\n elementJSON.default_value = e.target.value;\r\n handlePropertyValueUpdate(null, null, e.target.value);\r\n };\r\n\r\n useEffect(() => {\r\n setElementJSON(props.element);\r\n setSelectOptions(props.element.options || []);\r\n }, [props.element]);\r\n\r\n useEffect(() => {\r\n setNewOptions({ label: \"\", value: \"\", is_checked: false });\r\n setAddSelectOption(false);\r\n handleSelectOptionValueUpdate(selectOptions);\r\n // eslint-disable-next-line\r\n }, [selectOptions]);\r\n\r\n return (\r\n <Box className=\"formSection--FieldContainer\" key={elementJSON.id}>\r\n <div key={elementJSON.id}>\r\n <FieldSelect\r\n key={elementJSON.id}\r\n variant=\"outlined\"\r\n onChange={handleFieldUpdate}\r\n defaultValue={elementJSON.field_type}\r\n label=\"Field Type\"\r\n disabled={elementJSON.type === \"system\" || !elementJSON.is_new}\r\n />\r\n </div>\r\n <div key={elementJSON.id}>\r\n <TextField\r\n fullWidth\r\n label=\"Label\"\r\n is_required\r\n key={elementJSON.id}\r\n name=\"label\"\r\n type=\"text\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={elementJSON.label}\r\n />\r\n </div>\r\n\r\n <div key={elementJSON.id}>\r\n <Select\r\n variant=\"outlined\"\r\n key={elementJSON.id}\r\n fullWidth\r\n placeholder=\"Select Default\"\r\n size=\"small\"\r\n name=\"options\"\r\n onChange={() => handleSelectUpdate}\r\n defaultValue={elementJSON.default_value}\r\n label=\"Default\"\r\n disabled={!selectOptions.length}\r\n >\r\n {selectOptions?.map((option: any, index: number) => (\r\n <MenuItem key={index} value={option.value}>\r\n {option.label}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </div>\r\n <FormControl>\r\n <Select\r\n key={elementJSON.id}\r\n fullWidth\r\n placeholder=\"Select Column Per Row\"\r\n size=\"small\"\r\n onChange={handleColumnSelect} // need to change\r\n // defaultValue= {} // need to change\r\n label=\"Select Column Per Row\"\r\n name=\"option\"\r\n variant=\"outlined\"\r\n >\r\n {columnPerRowOptions?.map((option: any, index: number) => (\r\n <MenuItem key={index} value={option}>\r\n {option}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n <Box>\r\n <Typography sx={{ color: 'black' }}>Adjust Width:</Typography>\r\n <Slider\r\n value = {elementJSON?.custom_width}\r\n name = \"custom_width\"\r\n min={1}\r\n max={12}\r\n step={1}\r\n onChange={(_, newValue) => handleWidthChange(newValue)}\r\n aria-labelledby=\"width-slider\"\r\n sx = {{color : \"#4AC08C\"}}\r\n />\r\n </Box>\r\n \r\n\r\n <div className=\"formSection--SelectOption\">\r\n <Typography type=\"s5\" weight={\"medium\"} color={\"theme.secondary.800\"}>\r\n Options\r\n </Typography>\r\n {selectOptions.map((option: any, index: number) => (\r\n <div className=\"formSection--MultiOptions\">\r\n <TextField\r\n fullWidth\r\n key={index}\r\n value={`${option.label} (${option.value})`}\r\n InputProps={{\r\n readOnly: true,\r\n }}\r\n />\r\n <CloseIcon\r\n style={{ fontSize: \"1rem\", color: \"#656669\" }}\r\n onClick={() => {\r\n setSelectOptions([\r\n ...selectOptions.filter(\r\n (_: any, filterIndex: number) => filterIndex !== index,\r\n ),\r\n ]);\r\n }}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n {isAddSelectOption ? (\r\n <div className=\"formSection--SelectOption\">\r\n <div>\r\n <TextField\r\n fullWidth\r\n label=\"Label\"\r\n is_required\r\n name=\"label\"\r\n type=\"text\"\r\n placeholder=\"Label\"\r\n defaultValue={newOptions.label}\r\n onChange={handleAddNewOption}\r\n />\r\n </div>\r\n <div>\r\n <TextField\r\n fullWidth\r\n label=\"Value\"\r\n placeholder=\"Value\"\r\n is_required\r\n name=\"value\"\r\n type=\"text\"\r\n defaultValue={newOptions.value}\r\n onChange={handleAddNewOption}\r\n />\r\n </div>\r\n <Button\r\n onClick={() =>\r\n setSelectOptions([...selectOptions, { ...newOptions }])\r\n }\r\n disabled={\r\n !!selectOptions.find(\r\n (ele: Option) => ele.value === newOptions.value,\r\n )\r\n }\r\n variant=\"text\"\r\n className=\"formSection--Button\"\r\n startIcon={<Add />}\r\n >\r\n Add\r\n </Button>\r\n </div>\r\n ) : (\r\n <Button\r\n onClick={() => setAddSelectOption(true)}\r\n variant=\"text\"\r\n className=\"formSection--Button\"\r\n startIcon={<Add />}\r\n >\r\n Add Option\r\n </Button>\r\n )}\r\n\r\n <FormControl>\r\n <Typography type=\"s4\" color=\"theme.secondary.800\">\r\n Display style\r\n </Typography>\r\n <RadioGroup\r\n key={elementJSON.id}\r\n row\r\n aria-labelledby=\"demo-radio-buttons-group-label\"\r\n name=\"display\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={elementJSON.display}\r\n >\r\n <FormControlLabel\r\n value=\"row\"\r\n control={<Radio size=\"small\" />}\r\n label=\"Row\"\r\n slotProps={{ typography: { variant: \"body2\" } }}\r\n />\r\n <FormControlLabel\r\n value=\"column\"\r\n control={<Radio size=\"small\" />}\r\n label=\"Column\"\r\n slotProps={{ typography: { variant: \"body2\" } }}\r\n />\r\n </RadioGroup>\r\n </FormControl>\r\n\r\n <div key={elementJSON.id}>\r\n <TextField\r\n key={elementJSON.id}\r\n fullWidth\r\n label=\"Title\"\r\n is_required\r\n name=\"title\"\r\n type=\"text\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={elementJSON.title}\r\n />\r\n </div>\r\n\r\n <FormControl disabled={!allowLabelPositionModification}>\r\n <Typography type=\"s4\" color=\"theme.secondary.800\">\r\n Title Position\r\n </Typography>\r\n <RadioGroup\r\n key={elementJSON.id}\r\n row\r\n aria-labelledby=\"demo-radio-buttons-group-label\"\r\n name=\"title_position\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={allowLabelPositionModification ? \"end\" : \"\"}\r\n >\r\n <FormControlLabel\r\n value=\"start\"\r\n control={<Radio size=\"small\" />}\r\n label=\"Start\"\r\n slotProps={{ typography: { variant: \"body2\" } }}\r\n />\r\n <FormControlLabel\r\n value=\"end\"\r\n control={<Radio size=\"small\" />}\r\n label=\"End\"\r\n slotProps={{ typography: { variant: \"body2\" } }}\r\n />\r\n </RadioGroup>\r\n </FormControl>\r\n\r\n <FormControlLabel\r\n key={elementJSON.id}\r\n name=\"is_required\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={elementJSON.is_required}\r\n label=\"This field is required\"\r\n />\r\n <FormControlLabel\r\n key={elementJSON.id}\r\n name=\"is_unique\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={elementJSON.is_unique}\r\n label=\"Is Unique\"\r\n />\r\n\r\n <FormControlLabel\r\n key={elementJSON.id}\r\n name=\"is_fullwidth\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate} // need to change this\r\n checked={elementJSON?.is_fullwidth}// need to change \r\n label=\"Full Width \"\r\n />\r\n </Box>\r\n );\r\n}\r\n\r\nexport default CheckboxEditForm;\r\n","// React imports\r\nimport React, { useEffect, useState } from 'react';\r\n\r\n// Material UI imports\r\nimport { MenuItem, Box, SelectChangeEvent } from '@mui/material';\r\n\r\n// Third-party imports\r\nimport { MRT_ColumnDef, MRT_RowData } from 'material-react-table';\r\n\r\n// ERP Common imports\r\nimport Select from '@/components/select/select';\r\nimport TextField from '@/components/text-field/text-field';\r\nimport formatText from '@/utils/format-text';\r\n\r\n// Local imports\r\nimport { IElementJson } from '../custom-form';\r\nimport { ApiFormFields } from '../../Redux/state';\r\nimport FieldSelect from './field-select';\r\nimport '../custom-form.scss';\r\n\r\ninterface ITableEditForm {\r\n\thandlePropertyValueUpdate: (\r\n\t\tevent?: any,\r\n\t\tnumberValue?: any,\r\n\t\tval?: any,\r\n\t\tfieldType?: any\r\n\t) => void;\r\n\thandleColumnsUpdate: (columns: MRT_ColumnDef<MRT_RowData>[]) => void;\r\n\telement: IElementJson | null;\r\n\tfields: ApiFormFields | null;\r\n}\r\n\r\ninterface TableOption {\r\n\tlabel: string;\r\n\tvalue: string;\r\n}\r\n\r\nconst TableEditForm: React.FC<ITableEditForm> = ({\r\n\thandlePropertyValueUpdate,\r\n\telement,\r\n\thandleColumnsUpdate,\r\n\tfields\r\n}) => {\r\n\t/* Local States */\r\n\tconst [elementJSON, setElementJSON] = useState<IElementJson | null>(element);\r\n\tconst [tables, setTables] = useState<TableOption[]>([]);\r\n\r\n\t/* Local Functions */\r\n\tconst handleFieldUpdate = (event: SelectChangeEvent<unknown>) => {\r\n\t\tif (elementJSON) {\r\n\t\t\telementJSON.field_type = event.target.value as string;\r\n\t\t\thandlePropertyValueUpdate(null, null, null, event.target.value as string);\r\n\t\t}\r\n\t};\r\n\tconst handleTableSelect = (event: SelectChangeEvent<unknown>) => {\r\n\t\thandlePropertyValueUpdate(event);\r\n\t};\r\n\r\n\t/* Use Effects */\r\n\tuseEffect(() => {\r\n\t\tsetElementJSON(element);\r\n\t}, [element]);\r\n\tuseEffect(() => {\r\n\t\tif (elementJSON && elementJSON.table && fields) {\r\n\t\t\tconst fieldsArr = fields[elementJSON.table];\r\n\t\t\tlet columns: any[] = [];\r\n\t\t\tif (fieldsArr && fieldsArr?.length) {\r\n\t\t\t\tcolumns = fieldsArr.map((field, index) => ({\r\n\t\t\t\t\theader: formatText(field.field),\r\n\t\t\t\t\taccessorKey: field.field,\r\n\t\t\t\t\tvisible: index > 3 ? false : true,\r\n\t\t\t\t\ttype: field.type\r\n\t\t\t\t}));\r\n\t\t\t} else {\r\n\t\t\t\tcolumns = [\r\n\t\t\t\t\t{ header: 'Column 1', accessorKey: 'column_1', visible: true },\r\n\t\t\t\t\t{ header: 'Column 2', accessorKey: 'column_1', visible: true }\r\n\t\t\t\t];\r\n\t\t\t}\r\n\t\t\tcolumns && handleColumnsUpdate(columns);\r\n\t\t}\r\n\t}, [elementJSON?.table]);\r\n\tuseEffect(() => {\r\n\t\tif (fields) {\r\n\t\t\tconst options = Object.keys(fields).map((key) => ({\r\n\t\t\t\tlabel: formatText(key),\r\n\t\t\t\tvalue: key\r\n\t\t\t}));\r\n\t\t\tsetTables(options);\r\n\t\t}\r\n\t}, [fields]);\r\n\r\n\tif (!elementJSON) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\treturn (\r\n\t\t<Box className='formSection--FieldContainer' key={elementJSON.id}>\r\n\t\t\t<div key={elementJSON.id}>\r\n\t\t\t\t<FieldSelect\r\n\t\t\t\t\tkey={elementJSON.id}\r\n\t\t\t\t\tvariant='outlined'\r\n\t\t\t\t\tonChange={handleFieldUpdate}\r\n\t\t\t\t\tdefaultValue={elementJSON.field_type}\r\n\t\t\t\t\tdisabled={elementJSON.type === 'system' || !elementJSON.is_new}\r\n\t\t\t\t/>\r\n\t\t\t</div>\r\n\t\t\t<div key={elementJSON.id}>\r\n\t\t\t\t<TextField\r\n\t\t\t\t\tfullWidth\r\n\t\t\t\t\tlabel='Label'\r\n\t\t\t\t\tis_required\r\n\t\t\t\t\tkey={elementJSON.id}\r\n\t\t\t\t\tname='label'\r\n\t\t\t\t\ttype='text'\r\n\t\t\t\t\tonChange={handlePropertyValueUpdate}\r\n\t\t\t\t\tdefaultValue={elementJSON.label}\r\n\t\t\t\t/>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div key={elementJSON.id}>\r\n\t\t\t\t<Select\r\n\t\t\t\t\tkey={elementJSON.id}\r\n\t\t\t\t\tvariant='outlined'\r\n\t\t\t\t\tlabel='Table'\r\n\t\t\t\t\tfullWidth\r\n\t\t\t\t\tplaceholder='Select Table'\r\n\t\t\t\t\tsize='small'\r\n\t\t\t\t\tname='table'\r\n\t\t\t\t\tdefaultValue={elementJSON.table}\r\n\t\t\t\t\tdisabled={elementJSON.type === 'system'}\r\n\t\t\t\t\tonChange={handleTableSelect}\r\n\t\t\t\t\trenderValue={(value: string) =>\r\n\t\t\t\t\t\ttables.find((option) => option.value === value)?.label\r\n\t\t\t\t\t}>\r\n\t\t\t\t\t{tables?.map((item) => (\r\n\t\t\t\t\t\t<MenuItem value={item.value}>{item.label}</MenuItem>\r\n\t\t\t\t\t))}\r\n\t\t\t\t</Select>\r\n\t\t\t</div>\r\n\t\t</Box>\r\n\t);\r\n};\r\n\r\nexport default TableEditForm;\r\n","// React imports\r\nimport React, { memo, useMemo, useCallback } from 'react';\r\n\r\n// Material UI imports\r\nimport { Grid } from '@mui/material';\r\n\r\n// ERP Common imports - Form builder elements\r\nimport DynamicInput from '@/components/form-control/form-builder/form-builder-element/text';\r\nimport DynamicCheckBox from '@/components/form-control/form-builder/form-builder-element/checkbox';\r\nimport DynamicTable from '@/components/form-control/form-builder/form-builder-element/table';\r\nimport DynamicElementHOC from '@/components/form-control/form-builder/form-builder-element/dynamic-element-hoc';\r\nimport DynamicRadioButton from '@/components/form-control/form-builder/form-builder-element/radio-button';\r\nimport DynamicToggleButton from '@/components/form-control/form-builder/form-builder-element/toggle-button';\r\nimport DynamicInfo from '@/components/form-control/form-builder/form-builder-element/info';\r\nimport DynamicMedia from '@/components/form-control/form-builder/form-builder-element/media';\r\nimport DynamicTime from '@/components/form-control/form-builder/form-builder-element/time';\r\nimport DynamicDate from '@/components/form-control/form-builder/form-builder-element/date';\r\nimport DynamicSelect from '@/components/form-control/form-builder/form-builder-element/select';\r\nimport DynamicPhone from '@/components/form-control/form-builder/form-builder-element/phone';\r\n\r\n// Types\r\ninterface IField {\r\n id: string;\r\n field_type: string;\r\n placeholder?: string;\r\n label: string;\r\n default_value?: any;\r\n is_multiline?: boolean;\r\n is_required?: boolean;\r\n min_length?: number;\r\n max_length?: number;\r\n is_fullwidth?: boolean;\r\n custom_width?: number;\r\n options?: any[];\r\n is_multiselect?: boolean;\r\n is_future_dates_allowed?: boolean;\r\n is_past_dates_allowed?: boolean;\r\n option?: any;\r\n max_size?: number;\r\n title?: string;\r\n display?: string;\r\n title_position?: string;\r\n table_columns?: any[];\r\n float_step?: number;\r\n type: string;\r\n}\r\n\r\ninterface FormFieldsProps {\r\n sectionMembers: IField[];\r\n // Add other required props with proper types\r\n members: IField[];\r\n activeMember?: number;\r\n control: any;\r\n t: (key: string) => string;\r\n element: any;\r\n images: any;\r\n elementJSON?: any;\r\n remove: (index: number) => void;\r\n move: (from: number, to: number) => void;\r\n handleElementSelection: (e: any) => void;\r\n setElementSwap: (value: boolean) => void;\r\n handleDuplicateElement: (index: number) => void;\r\n setSelectedHoc: (value: string) => void;\r\n setActiveMember: (value: number | undefined) => void;\r\n}\r\n\r\n// Field type mapping for better maintainability\r\nconst FIELD_TYPE_MAP = {\r\n TEXT: 'text',\r\n EMAIL: 'email',\r\n NUMBER: 'number',\r\n PHONE: 'phone',\r\n SELECT: 'select',\r\n DATE: 'date',\r\n TIME: 'time',\r\n URL: 'url',\r\n CURRENCY: 'currency',\r\n FILE: 'file',\r\n IMAGE: 'image',\r\n GEO_LOCATION: 'geoLocation',\r\n RELATION: 'relation',\r\n INFO: 'info',\r\n TOGGLE_BUTTON: 'toggleButton',\r\n RADIO_BUTTON: 'radioButton',\r\n TAGS_INPUT: 'tagsInput',\r\n CHECKBOX: 'checkbox',\r\n TABLE: 'table'\r\n} as const;\r\n\r\n// Memoized individual field component\r\nconst FormField = memo<{\r\n field: IField;\r\n index: number;\r\n gridItemSize: number;\r\n activeMember?: number;\r\n control: any;\r\n t: (key: string) => string;\r\n element: any;\r\n images: any;\r\n elementJSON?: any;\r\n remove: (index: number) => void;\r\n move: (from: number, to: number) => void;\r\n handleElementSelection: (e: any) => void;\r\n setElementSwap: (value: boolean) => void;\r\n handleDuplicateElement: (index: number) => void;\r\n setSelectedHoc: (value: string) => void;\r\n setActiveMember: (value: number | undefined) => void;\r\n}>(({\r\n field,\r\n index,\r\n gridItemSize,\r\n activeMember,\r\n control,\r\n t,\r\n element,\r\n images,\r\n elementJSON,\r\n remove,\r\n move,\r\n handleElementSelection,\r\n setElementSwap,\r\n handleDuplicateElement,\r\n setSelectedHoc,\r\n setActiveMember\r\n}) => {\r\n // Common HOC props - memoized to prevent unnecessary re-renders\r\n const hocProps = useMemo(() => ({\r\n activeIndex: activeMember === index,\r\n removeElement: remove,\r\n index,\r\n onClick: handleElementSelection,\r\n swap: move,\r\n elementSwap: () => setElementSwap(true),\r\n handleDuplicate: handleDuplicateElement,\r\n setElementHoc: () => {\r\n setSelectedHoc(\"\");\r\n setActiveMember(undefined);\r\n }\r\n }), [\r\n activeMember, \r\n index, \r\n remove, \r\n handleElementSelection, \r\n move, \r\n setElementSwap, \r\n handleDuplicateElement, \r\n setSelectedHoc, \r\n setActiveMember\r\n ]);\r\n\r\n // Common field props - memoized to prevent unnecessary re-renders\r\n const commonFieldProps = useMemo(() => ({\r\n key: field.id,\r\n position: index,\r\n placeholder: t(field.placeholder || ''),\r\n label: t(field.label),\r\n formControl: control,\r\n name: \"message\",\r\n fieldArrayName: \"members\",\r\n required: field.is_required,\r\n formType: \"builder\" as const,\r\n typeOfField: field.type,\r\n disabled: true\r\n }), [field.id, field.placeholder, field.label, field.is_required, field.type, index, t, control]);\r\n\r\n // Render field based on type\r\n const renderFieldContent = useCallback(() => {\r\n const { field_type } = field;\r\n\r\n switch (field_type) {\r\n case element.text.field_type:\r\n return (\r\n <DynamicInput\r\n {...commonFieldProps}\r\n type={field_type}\r\n defaultValue={field.default_value}\r\n is_multiline={field.is_multiline}\r\n min={field.min_length}\r\n max={field.max_length}\r\n />\r\n );\r\n\r\n case element.email.field_type:\r\n return (\r\n <DynamicInput\r\n {...commonFieldProps}\r\n type={field_type}\r\n defaultValue={field.default_value}\r\n endIcon={<img src={images.sms} alt=\"email\" />}\r\n />\r\n );\r\n\r\n case element.number.field_type:\r\n return (\r\n <DynamicInput\r\n {...commonFieldProps}\r\n type={field_type}\r\n defaultValue={field.default_value}\r\n min={field.min_length}\r\n max={field.max_length}\r\n float_step={field.float_step}\r\n />\r\n );\r\n\r\n case element.phone.field_type:\r\n return (\r\n <DynamicPhone\r\n {...commonFieldProps}\r\n type={field_type}\r\n default_value={field.default_value}\r\n />\r\n );\r\n\r\n case element.select.field_type:\r\n return (\r\n <DynamicSelect\r\n {...commonFieldProps}\r\n options={field.options}\r\n defaultValue={field.default_value}\r\n is_multiselect={field.is_multiselect}\r\n />\r\n );\r\n\r\n case element.date.field_type:\r\n return (\r\n <DynamicDate\r\n {...commonFieldProps}\r\n defaultValue={field.default_value}\r\n is_future_dates_allowed={field.is_future_dates_allowed}\r\n is_past_dates_allowed={field.is_past_dates_allowed}\r\n disable={true}\r\n />\r\n );\r\n\r\n case element.time.field_type:\r\n return (\r\n <DynamicTime\r\n {...commonFieldProps}\r\n option={field.option}\r\n />\r\n );\r\n\r\n case element.url.field_type:\r\n return (\r\n <DynamicInput\r\n {...commonFieldProps}\r\n type={field_type}\r\n defaultValue={field.default_value}\r\n endIcon={<img src={images.url} alt=\"url\" />}\r\n />\r\n );\r\n\r\n case element.currency.field_type:\r\n return (\r\n <DynamicInput\r\n {...commonFieldProps}\r\n type={field_type}\r\n defaultValue={field.default_value}\r\n endIcon={<img src={images.dollar} alt=\"currency\" />}\r\n />\r\n );\r\n\r\n case element.file.field_type:\r\n case element.image.field_type:\r\n return (\r\n <DynamicMedia\r\n {...commonFieldProps}\r\n type={field_type}\r\n max_size={field.max_size}\r\n />\r\n );\r\n\r\n case element.geoLocation.field_type:\r\n return (\r\n <DynamicInput\r\n {...commonFieldProps}\r\n type={field_type}\r\n defaultValue={field.default_value}\r\n endIcon={<img src={images.location} alt=\"location\" />}\r\n />\r\n );\r\n\r\n case element.relation.field_type:\r\n return (\r\n <DynamicInput\r\n {...commonFieldProps}\r\n type={field_type}\r\n defaultValue={field.default_value}\r\n is_multiline={field.is_multiline}\r\n min={field.min_length}\r\n max={field.max_length}\r\n label={\r\n <span\r\n className=\"formSection--Relation\"\r\n data-position={index}\r\n data-name={`members.${index}.message`}\r\n >\r\n {t(field.label)}\r\n <img src={images.relation} alt=\"relation\" />\r\n </span>\r\n }\r\n />\r\n );\r\n\r\n case element.info.field_type:\r\n return (\r\n <DynamicInfo\r\n {...commonFieldProps}\r\n defaultValue={field.default_value}\r\n />\r\n );\r\n\r\n case element.toggleButton.field_type:\r\n return (\r\n <DynamicToggleButton\r\n {...commonFieldProps}\r\n title={t(field.title || '')}\r\n titlePosition={elementJSON?.title_position}\r\n />\r\n );\r\n\r\n case element.radioButton.field_type:\r\n return (\r\n <DynamicRadioButton\r\n {...commonFieldProps}\r\n options={field.options}\r\n display={field.display}\r\n titlePosition={elementJSON?.title_position}\r\n />\r\n );\r\n\r\n case element.tagsInput.field_type:\r\n return (\r\n <DynamicInput\r\n {...commonFieldProps}\r\n type={field_type}\r\n defaultValue={field.default_value}\r\n is_multiline={field.is_multiline}\r\n min={field.min_length}\r\n max={field.max_length}\r\n />\r\n );\r\n\r\n case element.checkbox.field_type:\r\n return (\r\n <DynamicCheckBox\r\n {...commonFieldProps}\r\n title={t(field.title || '')}\r\n titlePosition={field.title_position}\r\n />\r\n );\r\n\r\n case element.table.field_type:\r\n return (\r\n <DynamicTable\r\n {...commonFieldProps}\r\n columns={field.table_columns || elementJSON?.table_columns || []}\r\n />\r\n );\r\n\r\n default:\r\n console.warn(`Unknown field type: ${field_type}`);\r\n return null;\r\n }\r\n }, [field, commonFieldProps, element, images, elementJSON, t, index]);\r\n\r\n return (\r\n <Grid item xs={gridItemSize}>\r\n <DynamicElementHOC\r\n {...hocProps}\r\n element={field.field_type}\r\n >\r\n {renderFieldContent()}\r\n </DynamicElementHOC>\r\n </Grid>\r\n );\r\n});\r\n\r\nFormField.displayName = 'FormField';\r\n\r\n// Main component\r\nconst FormFields: React.FC<FormFieldsProps> = memo(({\r\n sectionMembers,\r\n members,\r\n activeMember,\r\n control,\r\n t,\r\n element,\r\n images,\r\n elementJSON,\r\n remove,\r\n move,\r\n handleElementSelection,\r\n setElementSwap,\r\n handleDuplicateElement,\r\n setSelectedHoc,\r\n setActiveMember\r\n}) => {\r\n // Memoize grid item size calculation\r\n const calculateGridSize = useCallback((field: IField): number => {\r\n if (field.is_fullwidth || field.field_type === \"table\") return 12;\r\n if (field.custom_width) return field.custom_width;\r\n return 6;\r\n }, []);\r\n\r\n // Memoize the rendered fields\r\n const renderedFields = useMemo(() => {\r\n return sectionMembers.map((field: IField) => {\r\n const index = members.findIndex(member => member === field);\r\n const gridItemSize = calculateGridSize(field);\r\n\r\n return (\r\n <FormField\r\n key={`${field.id}-${index}`} // Better key for React reconciliation\r\n field={field}\r\n index={index}\r\n gridItemSize={gridItemSize}\r\n activeMember={activeMember}\r\n control={control}\r\n t={t}\r\n element={element}\r\n images={images}\r\n elementJSON={elementJSON}\r\n remove={remove}\r\n move={move}\r\n handleElementSelection={handleElementSelection}\r\n setElementSwap={setElementSwap}\r\n handleDuplicateElement={handleDuplicateElement}\r\n setSelectedHoc={setSelectedHoc}\r\n setActiveMember={setActiveMember}\r\n />\r\n );\r\n });\r\n }, [\r\n sectionMembers,\r\n members,\r\n activeMember,\r\n control,\r\n t,\r\n element,\r\n images,\r\n elementJSON,\r\n remove,\r\n move,\r\n handleElementSelection,\r\n setElementSwap,\r\n handleDuplicateElement,\r\n setSelectedHoc,\r\n setActiveMember,\r\n calculateGridSize,\r\n elementJSON?.field_type\r\n ]);\r\n\r\n return <>{renderedFields}</>;\r\n});\r\n\r\nFormFields.displayName = 'FormFields';\r\n\r\nexport { FormField };\nexport default FormFields;","// React imports\r\nimport { useEffect, useMemo } from \"react\";\r\n\r\n// ERP Common imports\r\nimport formBuilderDeConversion from \"@/utils/form-builder-deconversion\";\r\n\r\n// Module pathname imports\r\nimport { PathnameAccounting } from \"../../../constants/pathnames/pathname.accounting\";\r\nimport { PathnameCrm } from \"../../../constants/pathnames/pathname.crm\";\r\nimport { PathnameInventory } from \"../../../constants/pathnames/pathname.inventory\";\r\nimport { PathnameManufacturing } from \"../../../constants/pathnames/pathname.manufacturing\";\r\nimport { PathnamePurchase } from \"../../../constants/pathnames/pathname.procurement\";\r\nimport { PathnameRental } from \"../../../constants/pathnames/pathname.rental\";\r\nimport { PathnameUsers } from \"../../../constants/pathnames/pathname.user\";\r\nimport { PathnameHrms } from \"../../../constants/pathnames/pathname.hrms\";\r\n\r\n// Types for better type safety\r\nexport interface TableColumn {\r\n header: string;\r\n accessorKey: string;\r\n visible: boolean;\r\n}\r\n\r\nexport interface FormMember {\r\n field_type: string;\r\n table?: string;\r\n table_columns?: TableColumn[];\r\n [key: string]: any;\r\n}\r\n\r\nexport interface FormSection {\r\n field_type: string;\r\n label: string;\r\n is_accordion: boolean;\r\n id: string;\r\n remove_section: boolean;\r\n form_switcher_label?: string;\r\n form_switcher_name?: string;\r\n is_section_field?: boolean;\r\n section_type?: string;\r\n switcher_forms?: any;\r\n members: FormMember[];\r\n}\r\n\r\nexport interface TabData {\r\n tab_order: number;\r\n data: FormSection[];\r\n}\r\n\r\nexport interface ProcessedData {\r\n tab?: TabData[];\r\n section?: FormSection[];\r\n tabsData?: TabData[];\r\n}\r\n\r\n// Constants for module paths\r\nconst MODULE_PATHS = {\r\n accounting: PathnameAccounting.FORMS,\r\n inventory: PathnameInventory.FORMS,\r\n manufacturing: PathnameManufacturing.FORMS,\r\n procurement: PathnamePurchase.FORMS,\r\n crm: PathnameCrm.FORMS,\r\n rental: PathnameRental.FORMS,\r\n user: PathnameUsers.FORMS,\r\n hrms: PathnameHrms.FORMS,\r\n} as const;\r\n\r\nexport type ModuleType = keyof typeof MODULE_PATHS;\r\n\r\n// Helper function to format text (converts snake_case to Title Case)\r\nexport const formatText = (text: string): string => {\r\n return text\r\n .split('_')\r\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\r\n .join(' ');\r\n};\r\n\r\n// Helper function to get redirection path\r\nconst getRedirectionPath = (currentModule: string): string => {\r\n if (!isValidModule(currentModule)) {\r\n throw new Error(`Invalid module: ${currentModule}`);\r\n }\r\n return MODULE_PATHS[currentModule as ModuleType];\r\n};\r\n\r\n// Type guard for module validation\r\nconst isValidModule = (module: string): module is ModuleType => {\r\n return module in MODULE_PATHS;\r\n};\r\n\r\n// Helper function to create default table columns\r\nexport const createDefaultTableColumns = (): TableColumn[] => [\r\n { header: \"Column 1\", accessorKey: \"column_1\", visible: true },\r\n { header: \"Column 2\", accessorKey: \"column_2\", visible: true },\r\n];\r\n\r\n// Helper function to process table columns\r\nexport const processTableColumns = (\r\n member: FormMember,\r\n formBuilder: any\r\n): TableColumn[] => {\r\n // Return existing columns if they exist\r\n if (member.table_columns?.length) {\r\n return member.table_columns;\r\n }\r\n\r\n // Check if table exists and has fields\r\n if (!member.table || !formBuilder.fields?.[member.table]) {\r\n return createDefaultTableColumns();\r\n }\r\n\r\n const fields = formBuilder.fields[member.table];\r\n if (!Array.isArray(fields) || fields.length === 0) {\r\n return createDefaultTableColumns();\r\n }\r\n\r\n return fields.map((field: any, index: number) => ({\r\n header: formatText(field.field),\r\n accessorKey: field.field,\r\n visible: index <= 3, // Show first 4 columns by default\r\n }));\r\n};\r\n\r\n// Helper function to process members\r\nexport const processMembers = (\r\n sections: FormSection[],\r\n formBuilder: any\r\n): FormMember[] => {\r\n return sections.flatMap((section) =>\r\n section.members.map((member) => {\r\n if (member.field_type === \"table\") {\r\n return {\r\n ...member,\r\n table_columns: processTableColumns(member, formBuilder),\r\n };\r\n }\r\n return { ...member };\r\n })\r\n );\r\n};\r\n\r\n// Helper function to extract sections data\r\nexport const extractSections = (sections: FormSection[]): Omit<FormSection, 'members'>[] => {\r\n return sections.map(({\r\n field_type,\r\n label,\r\n is_accordion,\r\n id,\r\n remove_section,\r\n form_switcher_label,\r\n form_switcher_name,\r\n is_section_field,\r\n section_type,\r\n switcher_forms,\r\n }) => ({\r\n field_type,\r\n label,\r\n is_accordion,\r\n id,\r\n remove_section,\r\n form_switcher_label,\r\n form_switcher_name,\r\n is_section_field,\r\n section_type,\r\n switcher_forms,\r\n }));\r\n};\r\n\r\n// Main processing function\r\nconst processData = (\r\n data: ProcessedData,\r\n activeTabId: number = 0,\r\n formBuilder: any,\r\n tabsData: TabData[] | null,\r\n // Callback functions\r\n callbacks: {\r\n removeSection: () => void;\r\n remove: () => void;\r\n setTabsData: (data: TabData[]) => void;\r\n append: (members: FormMember[]) => void;\r\n appendSection: (sections: Omit<FormSection, 'members'>[]) => void;\r\n }\r\n): void => {\r\n const { removeSection, remove, setTabsData, append, appendSection } = callbacks;\r\n\r\n try {\r\n // Clear existing data\r\n removeSection();\r\n remove();\r\n\r\n if (data.tab) {\r\n processTabData(data.tab, activeTabId, formBuilder, callbacks);\r\n } else if (data.section) {\r\n processSectionData(data.section, formBuilder, callbacks);\r\n } else if (data.tabsData && tabsData) {\r\n processExistingTabsData(tabsData, activeTabId, callbacks);\r\n } else {\r\n throw new Error(\"Invalid data format: Missing required properties (tab, section, or tabsData)\");\r\n }\r\n } catch (error) {\r\n console.error(\"Error processing data:\", error);\r\n // You might want to show a user-friendly error message instead of alert\r\n alert(error instanceof Error ? error.message : \"An error occurred while processing data\");\r\n }\r\n};\r\n\r\n// Process tab data\r\nconst processTabData = (\r\n tabs: TabData[],\r\n activeTabId: number,\r\n formBuilder: any,\r\n callbacks: {\r\n setTabsData: (data: TabData[]) => void;\r\n append: (members: FormMember[]) => void;\r\n appendSection: (sections: Omit<FormSection, 'members'>[]) => void;\r\n }\r\n): void => {\r\n const { setTabsData, append, appendSection } = callbacks;\r\n\r\n setTabsData(tabs);\r\n\r\n const activeTab = tabs.find(tab => tab.tab_order === activeTabId + 1);\r\n if (!activeTab?.data) {\r\n console.warn(`No active tab found for tab order: ${activeTabId + 1}`);\r\n return;\r\n }\r\n\r\n const sections = extractSections(activeTab.data);\r\n const members = processMembers(activeTab.data, formBuilder);\r\n\r\n append(members);\r\n appendSection(sections);\r\n};\r\n\r\n// Process section data\r\nconst processSectionData = (\r\n sections: FormSection[],\r\n formBuilder: any,\r\n callbacks: {\r\n append: (members: FormMember[]) => void;\r\n appendSection: (sections: Omit<FormSection, 'members'>[]) => void;\r\n }\r\n): void => {\r\n const { append, appendSection } = callbacks;\r\n\r\n const extractedSections = extractSections(sections);\r\n const members = processMembers(sections, formBuilder);\r\n\r\n append(members);\r\n appendSection(extractedSections);\r\n};\r\n\r\n// Process existing tabs data\r\nconst processExistingTabsData = (\r\n tabsData: TabData[],\r\n activeTabId: number,\r\n callbacks: {\r\n append: (members: FormMember[]) => void;\r\n appendSection: (sections: Omit<FormSection, 'members'>[]) => void;\r\n }\r\n): void => {\r\n const { append, appendSection } = callbacks;\r\n\r\n const activeTab = tabsData.find(tab => tab.tab_order === activeTabId + 1);\r\n if (!activeTab?.data) {\r\n console.warn(`No active tab found for tab order: ${activeTabId + 1}`);\r\n return;\r\n }\r\n\r\n const sections = extractSections(activeTab.data);\r\n const members = activeTab.data.flatMap(section =>\r\n section.members.map(member => ({ ...member }))\r\n );\r\n\r\n if (members.length > 0) append(members);\r\n if (sections.length > 0) appendSection(sections);\r\n};\r\n\r\n// Custom hook for form data processing\r\nexport const useFormDataProcessor = (\r\n formBuilder: any,\r\n tabsData: TabData[],\r\n activeTabValue: number,\r\n callbacks: {\r\n removeSection: () => void;\r\n remove: () => void;\r\n setTabsData: (data: TabData[]) => void;\r\n append: (members: FormMember[]) => void;\r\n appendSection: (sections: Omit<FormSection, 'members'>[]) => void;\r\n }\r\n) => {\r\n const { removeSection, remove, append } = callbacks;\r\n\r\n // Memoize the serialized form data to avoid unnecessary re-renders\r\n const serializedFormData = useMemo(() =>\r\n JSON.stringify(formBuilder?.formData),\r\n [formBuilder?.formData]\r\n );\r\n\r\n // Memoize the initial data processing\r\n const initialData = useMemo(() => {\r\n if (!formBuilder?.formData?.length) return null;\r\n\r\n try {\r\n return formBuilderDeConversion(formBuilder.formData);\r\n } catch (error) {\r\n console.error('Error processing form data:', error);\r\n return null;\r\n }\r\n }, [serializedFormData]);\r\n\r\n useEffect(() => {\r\n // Handle case when there's no initial data\r\n if (!initialData) {\r\n removeSection();\r\n remove();\r\n append([]);\r\n return;\r\n }\r\n\r\n // Determine processing strategy based on available data\r\n try {\r\n if (tabsData.length > 0) {\r\n // Process existing tabs data\r\n processData(\r\n { tabsData: tabsData },\r\n activeTabValue,\r\n formBuilder,\r\n tabsData,\r\n callbacks\r\n );\r\n } else if (initialData.tab) {\r\n // Process new tab data\r\n processData(\r\n initialData,\r\n activeTabValue,\r\n formBuilder,\r\n tabsData,\r\n callbacks\r\n );\r\n } else if (initialData.section) {\r\n // Process section data\r\n processData(\r\n initialData,\r\n 0, // No active tab for section-only data\r\n formBuilder,\r\n tabsData,\r\n callbacks\r\n );\r\n } else {\r\n console.warn('No valid data structure found in initialData');\r\n removeSection();\r\n remove();\r\n append([]);\r\n }\r\n } catch (error) {\r\n console.error('Error in form data processing:', error);\r\n // Reset to clean state on error\r\n removeSection();\r\n remove();\r\n append([]);\r\n }\r\n }, [activeTabValue, serializedFormData, tabsData.length, initialData, callbacks, formBuilder]);\r\n\r\n return { initialData };\r\n};\r\n\r\n// Alternative: Direct useEffect implementation (if you prefer not to use custom hook)\r\nexport const useFormDataEffect = (\r\n formBuilder: any,\r\n tabsData: TabData[],\r\n activeTabValue: number = 0,\r\n callbacks: {\r\n removeSection: () => void;\r\n remove: () => void;\r\n setTabsData: (data: TabData[]) => void;\r\n append: (members: FormMember[]) => void;\r\n appendSection: (sections: Omit<FormSection, 'members'>[]) => void;\r\n }\r\n) => {\r\n const { removeSection, remove, append } = callbacks;\r\n\r\n useEffect(() => {\r\n let initialData: ProcessedData | null = null;\r\n\r\n // Process initial data\r\n if (formBuilder?.formData?.length) {\r\n try {\r\n initialData = formBuilderDeConversion(formBuilder.formData);\r\n } catch (error) {\r\n console.error('Error converting form data:', error);\r\n }\r\n }\r\n\r\n // Handle empty initial data\r\n if (!initialData) {\r\n removeSection();\r\n remove();\r\n append([]);\r\n return;\r\n }\r\n\r\n // Process data based on available structure\r\n try {\r\n if (tabsData.length > 0) {\r\n processData(\r\n { tabsData: tabsData },\r\n activeTabValue,\r\n formBuilder,\r\n tabsData,\r\n callbacks\r\n );\r\n } else if (initialData.tab) {\r\n processData(\r\n initialData,\r\n activeTabValue,\r\n formBuilder,\r\n tabsData,\r\n callbacks\r\n );\r\n } else if (initialData.section) {\r\n processData(\r\n initialData,\r\n 0,\r\n formBuilder,\r\n tabsData,\r\n callbacks\r\n );\r\n } else {\r\n console.warn('Invalid data structure in initialData');\r\n removeSection();\r\n remove();\r\n append([]);\r\n }\r\n } catch (error) {\r\n console.error('Error processing form data:', error);\r\n // Reset to clean state on error\r\n removeSection();\r\n remove();\r\n append([]);\r\n }\r\n }, [activeTabValue, JSON.stringify(formBuilder?.formData), tabsData.length]);\r\n};\r\n\r\n// Usage example:\r\n/*\r\n// Option 1: Using custom hook\r\nconst { initialData } = useFormDataProcessor(\r\n formBuilder,\r\n tabsData,\r\n activeTabValue,\r\n {\r\n removeSection,\r\n remove,\r\n setTabsData,\r\n append,\r\n appendSection\r\n }\r\n);\r\n\r\n// Option 2: Using direct useEffect\r\nuseFormDataEffect(\r\n formBuilder,\r\n tabsData,\r\n activeTabValue,\r\n {\r\n removeSection,\r\n remove,\r\n setTabsData,\r\n append,\r\n appendSection\r\n }\r\n);\r\n*/\r\n\r\n// Path generation utility (separate from the effect)\r\nexport const generateModulePath = (currentModule: string): string => {\r\n try {\r\n const redirectionPath = getRedirectionPath(currentModule);\r\n return `/dashboard/${currentModule}${redirectionPath}`;\r\n } catch (error) {\r\n console.error('Error generating module path:', error);\r\n throw error;\r\n }\r\n};\r\n\r\nexport const generateCustomFormPath = (currentModule,redirectionPath): any => {\r\n try {\r\n return `/dashboard/${currentModule}${redirectionPath}`;\r\n } catch (error) {\r\n console.error('Error generating module path:', error);\r\n throw error;\r\n }\r\n};","// React imports\r\nimport { useState, useEffect, useMemo, useCallback } from \"react\";\r\n\r\n// React Router imports\r\nimport { useLocation, useNavigate } from \"react-router-dom\";\r\n\r\n// React Hook Form imports\r\nimport { useForm, useFieldArray } from \"react-hook-form\";\r\n\r\n// Material UI imports\r\nimport { Box, FormControlLabel, Grid, RadioGroup } from \"@mui/material\";\r\nimport { Add } from \"@mui/icons-material\";\r\n\r\n// Third-party imports\r\nimport { DndProvider } from \"react-dnd\";\r\nimport { HTML5Backend } from \"react-dnd-html5-backend\";\r\nimport { MRT_ColumnDef, MRT_RowData } from \"material-react-table\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { enqueueSnackbar } from \"notistack\";\r\n\r\n// ERP Common imports\r\nimport DynamicSectionHOC from \"@/components/form-control/form-builder/form-builder-element/section\";\r\nimport Button from \"@/components/form-control/form-builder/form-builder-element/button\";\r\nimport TabBar from \"@/components/tabs/tabs\";\r\nimport images from \"@/assets/images\";\r\nimport { Pathname } from \"@/constants\";\r\nimport FormHeader from \"@/components/form-header/form-header\";\r\nimport Typography from \"@/components/typography/typography\";\r\nimport formBuilderConversion from \"@/utils/form-builder-conversion\";\r\nimport { useAppDispatch, useAppSelector } from \"@/redux/hooks\";\r\nimport { formatLabel } from \"@/utils/format-text\";\r\nimport Toast from \"@/components/toast/toast\";\r\nimport Radio from \"@/components/radio/radio\";\r\nimport { SECTION_TYPES } from \"@/utils/constant\";\r\nimport ErpLoader from \"@/components/loaders/erp-loader\";\r\nimport { getErrorMessage } from \"@/utils/common\";\r\nimport FormParser from \"@/components/form-control/form-parser/form-parser\";\r\nimport { Eye, EyeOff } from \"@/components/icons\";\r\n\r\n// Redux actions\r\nimport {\r\n patchFormDataById,\r\n getFormDataById,\r\n getFieldsByFormId,\r\n} from \"../form-builder/redux/actionCreator\";\r\n\r\n// Local imports\r\nimport {\r\n IProperty,\r\n ISectionProperty,\r\n ISelectProperty,\r\n element,\r\n} from \"./field_properties\";\r\nimport TextEditForm from \"./element-edit-forms/text\";\r\nimport SelectEditForm from \"./element-edit-forms/select\";\r\nimport SectionEditForm from \"./element-edit-forms/section\";\r\nimport CheckboxEditForm from \"./element-edit-forms/checkbox\";\r\nimport TableEditForm from \"./element-edit-forms/table-form\";\r\nimport FormFields from \"./form-fields\";\r\nimport { generateModulePath, useFormDataEffect } from \"./utils/common\";\r\nimport \"./custom-form.scss\";\r\n\r\nexport interface IElementJson extends IProperty {\r\n type: string;\r\n}\r\n\r\nconst FIELD_TYPES = {\r\n TEXT: 'text',\r\n NUMBER: 'number',\r\n EMAIL: 'email',\r\n PHONE: 'phone',\r\n SELECT: 'select',\r\n DATE: 'date',\r\n TIME: 'time',\r\n URL: 'url',\r\n CURRENCY: 'currency',\r\n FILE: 'file',\r\n GEO_LOCATION: 'geoLocation',\r\n IMAGE: 'image',\r\n SECTION: 'section',\r\n INFO: 'info',\r\n RELATION: 'relation',\r\n CHECKBOX: 'checkbox',\r\n TOGGLE_BUTTON: 'toggleButton',\r\n TAGS_INPUT: 'tagsInput'\r\n} as const;\r\n\r\nconst DEFAULT_GRID_COLUMNS = 12;\r\nconst DEFAULT_COLUMN_WIDTH = 2;\r\nconst DEFAULT_TAB_TITLE = 'data';\r\n\r\nconst isValidNumber = (value: any): boolean => !isNaN(Number(value)) && isFinite(Number(value));\r\nconst deepClone = (obj: T): T => JSON.parse(JSON.stringify(obj));\r\nconst generateUniqueId = (separator = ''): { uniqueStringId: string } => {\r\n return { uniqueStringId: `${Date.now()}${separator}${Math.random().toString(36).substr(2, 9)}` };\r\n};\r\n\r\n\r\nexport function CustomForm({redirectionPath}:any) {\r\n const { t } = useTranslation();\r\n const dispatch = useAppDispatch();\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n const rowData = location.state ?? [];\r\n\r\n const formBuilder = useAppSelector((state) => state.formBuilder);\r\n\r\n const { control } = useForm({\r\n reValidateMode: \"onBlur\",\r\n });\r\n\r\n const {\r\n fields: members,\r\n append,\r\n remove,\r\n update,\r\n move,\r\n insert,\r\n } = useFieldArray({\r\n control,\r\n name: \"members\",\r\n });\r\n\r\n const {\r\n fields: section,\r\n append: appendSection,\r\n remove: removeSection,\r\n update: updateSection,\r\n } = useFieldArray({\r\n control,\r\n name: \"section\",\r\n });\r\n\r\n const [selectedHoc, setSelectedHoc] = useState(\"\");\r\n const [activeSection, setActiveSection] = useState<number>();\r\n const [activeMember, setActiveMember] = useState<number>();\r\n\r\n const [formJSON, setFormJSON] = useState<object[]>([]);\r\n const [elementJSON, setElementJSON] = useState<any>(null);\r\n const [positionEditedElement, setPositionEditedElement] = useState<\r\n number | undefined\r\n >();\r\n\r\n const [sectionFormJSON, setSectionFormJSON] = useState<object[]>([]);\r\n const [sectionJSON, setSectionJSON] = useState<any>({});\r\n const [sectionPositionEditedElement, setSectionPositionEditedElement] =\r\n useState<number | undefined>();\r\n const [removeSectionActionPerformed, setRemoveSectionActionPerformed] =\r\n useState(false);\r\n const [removeSectionMembersPerformed, setRemoveSectionMembersPerformed] =\r\n useState(false);\r\n const [removeSectionPosition, setRemoveSectionPosition] = useState<\r\n number | undefined\r\n >();\r\n const [initialLoading, setInitialLoading] = useState(true);\r\n const [tabsData, setTabsData] = useState<any[]>([]);\r\n const [activeTabValue, setActiveTabValue] = useState<number | undefined>(0);\r\n\r\n const [elementSwap, setElementSwap] = useState(false);\r\n const [modifyAccordion, setModifyAccordion] = useState(false);\r\n const [toast, setToast] = useState<IToast | null>(null);\r\n const [previewFieldsData, setPreviewFields] = useState<any>(null);\r\n const [_, setFormParserMethods] = useState<any>();\r\n\r\n let elementPerColumn: any;\r\n\r\n const currentModule = location.pathname.split('/')[2]\r\n\r\n const path =redirectionPath?redirectionPath: generateModulePath(currentModule)\r\n\r\n useFormDataEffect(\r\n formBuilder,\r\n tabsData,\r\n activeTabValue,\r\n {\r\n removeSection,\r\n remove,\r\n setTabsData,\r\n append,\r\n appendSection\r\n }\r\n );\r\n\r\n const pickPropertyEditForm = useCallback((type: string): React.ReactElement => {\r\n try {\r\n if (!type || typeof type !== 'string') {\r\n console.warn('Invalid field type provided to pickPropertyEditForm');\r\n return <div className=\"text-gray-500 p-4\">Select a field to edit</div>;\r\n }\r\n\r\n const normalizedType = type.toLowerCase().trim();\r\n\r\n // Define form type groups for better maintainability\r\n const formGroups = {\r\n text: [\r\n 'text', 'number', 'email', 'phone', 'date', 'time',\r\n 'url', 'currency', 'file', 'geolocation', 'image',\r\n 'relation', 'info', 'tagsinput'\r\n ],\r\n select: ['select'],\r\n section: ['section'],\r\n checkbox: ['checkbox', 'togglebutton', 'radiobutton'],\r\n table: ['table']\r\n };\r\n\r\n // Common props for reusability\r\n const commonTextProps = {\r\n element: elementJSON,\r\n handlePropertyValueUpdate,\r\n handleWidthChange,\r\n handleColumnSelect,\r\n fields: formBuilder?.fields || []\r\n };\r\n\r\n const commonSelectProps = {\r\n element: elementJSON,\r\n handlePropertyValueUpdate,\r\n handleSelectOptionValueUpdate,\r\n handleWidthChange,\r\n handleColumnSelect\r\n };\r\n\r\n // Determine form type and render appropriate component\r\n if (formGroups.text.includes(normalizedType)) {\r\n return (\r\n <TextEditForm\r\n {...commonTextProps}\r\n key={`text-form-${elementJSON?.id || 'default'}`}\r\n />\r\n );\r\n }\r\n\r\n if (formGroups.select.includes(normalizedType)) {\r\n return (\r\n <SelectEditForm\r\n {...commonSelectProps}\r\n key={`select-form-${elementJSON?.id || 'default'}`}\r\n />\r\n );\r\n }\r\n\r\n if (formGroups.section.includes(normalizedType)) {\r\n return (\r\n <SectionEditForm\r\n element={sectionJSON}\r\n handlePropertyValueUpdate={handleSectionPropertyValueUpdate}\r\n key={`section-form-${sectionJSON?.id || 'default'}`}\r\n />\r\n );\r\n }\r\n\r\n if (formGroups.checkbox.includes(normalizedType)) {\r\n return (\r\n <CheckboxEditForm\r\n {...commonSelectProps}\r\n key={`checkbox-form-${elementJSON?.id || 'default'}`}\r\n />\r\n );\r\n }\r\n\r\n if (formGroups.table.includes(normalizedType)) {\r\n return (\r\n <TableEditForm\r\n element={elementJSON}\r\n handlePropertyValueUpdate={handlePropertyValueUpdate}\r\n handleColumnsUpdate={handleColumnsUpdate}\r\n fields={formBuilder?.fields || []}\r\n key={`table-form-${elementJSON?.id || 'default'}`}\r\n />\r\n );\r\n }\r\n\r\n // Default fallback with helpful message\r\n console.warn(`Unknown field type: ${type}`);\r\n return (\r\n <div className=\"text-gray-500 p-4 border border-gray-200 rounded\">\r\n <p className=\"font-medium\">Unknown Field Type</p>\r\n <p className=\"text-sm mt-1\">\r\n Field type \"{type}\" is not supported. Please select a valid field to edit.\r\n </p>\r\n </div>\r\n );\r\n\r\n } catch (error) {\r\n console.error('Error in pickPropertyEditForm:', error);\r\n return (\r\n <div className=\"text-red-500 p-4 border border-red-200 rounded bg-red-50\">\r\n <p className=\"font-medium\">Error Loading Form</p>\r\n <p className=\"text-sm mt-1\">\r\n There was an error loading the property edit form. Please try again.\r\n </p>\r\n </div>\r\n );\r\n }\r\n }, [elementJSON, sectionJSON, formBuilder]);\r\n\r\n const addNewSection = useCallback((): void => {\r\n try {\r\n if (!element?.section) {\r\n console.error('Element section template is not available');\r\n return;\r\n }\r\n\r\n const { uniqueStringId: id } = generateUniqueId('-');\r\n const newSection: ISectionProperty = {\r\n ...deepClone(element.section),\r\n id: id,\r\n };\r\n\r\n // Update switcher forms with new ID if they exist\r\n if (newSection.switcher_forms) {\r\n newSection.switcher_forms = newSection.switcher_forms.map(form => ({\r\n ...form,\r\n id: generateUniqueId('-').uniqueStringId\r\n }));\r\n }\r\n\r\n const newSectionIndex = section.length;\r\n\r\n appendSection(newSection);\r\n setActiveSection(newSectionIndex);\r\n setSelectedHoc('section');\r\n\r\n const sectionData: ISectionProperty = {\r\n field_type: newSection.field_type,\r\n section_type: newSection.section_type,\r\n switcher_forms: newSection.switcher_forms,\r\n form_switcher_label: newSection.form_switcher_label,\r\n form_switcher_name: newSection.form_switcher_name,\r\n label: newSection.label,\r\n is_accordion: newSection.is_accordion,\r\n id: newSection.id ?? newSectionIndex,\r\n };\r\n\r\n setSectionJSON(sectionData);\r\n setSectionPositionEditedElement(newSectionIndex);\r\n pickPropertyEditForm(newSection.field_type);\r\n } catch (error) {\r\n console.error('Error adding new section:', error);\r\n }\r\n }, [element, section, appendSection, setActiveSection, setSelectedHoc, setSectionJSON, setSectionPositionEditedElement, pickPropertyEditForm]);\r\n\r\n /**\r\n * Enhanced handleAddTab with better validation and error handling\r\n */\r\n const handleAddTab = useCallback((): void => {\r\n try {\r\n const formWithMembers = deepClone(sectionFormJSON);\r\n\r\n // Populate sections with their members\r\n formWithMembers.forEach((section: ISectionProperty, sectionIndex: number) => {\r\n section.members = members.filter(\r\n (member: IProperty) => member?.section_order === sectionIndex\r\n );\r\n });\r\n\r\n const hasSystemMembers = formWithMembers.some((section: ISectionProperty) =>\r\n section.members?.some((member: IProperty) => Boolean(member?.is_system_field))\r\n );\r\n\r\n const shouldRemoveTab = !tabsData?.length && hasSystemMembers;\r\n\r\n const newTab: TabData = {\r\n tab_order: tabsData.length + 1,\r\n title: DEFAULT_TAB_TITLE,\r\n remove_tab: shouldRemoveTab,\r\n data: tabsData?.length ? [] : formWithMembers\r\n };\r\n\r\n setTabsData(prevTabs => [...prevTabs, newTab]);\r\n } catch (error) {\r\n console.error('Error adding new tab:', error);\r\n }\r\n }, [sectionFormJSON, members, tabsData, setTabsData]);\r\n\r\n const handleEditTabTitle = useCallback((tabId: number, newTitle: string): void => {\r\n try {\r\n if (!isValidNumber(tabId) || !newTitle?.trim()) {\r\n console.error('Invalid tab ID or title provided');\r\n return;\r\n }\r\n\r\n setTabsData(prevTabs =>\r\n prevTabs.map((tab: TabData) =>\r\n tab.tab_order === tabId ? { ...tab, title: newTitle.trim() } : tab\r\n )\r\n );\r\n } catch (error) {\r\n console.error('Error editing tab title:', error);\r\n }\r\n }, [setTabsData]);\r\n\r\n const handleRemoveTab = useCallback((id: number): void => {\r\n try {\r\n if (!isValidNumber(id)) {\r\n console.error('Invalid tab ID provided');\r\n return;\r\n }\r\n\r\n const filteredTabs = tabsData.filter((tab: TabData) => tab.tab_order !== id);\r\n\r\n // Reorder remaining tabs\r\n const reorderedTabs = filteredTabs.map((tab: TabData) => ({\r\n ...tab,\r\n tab_order: tab.tab_order > id ? tab.tab_order - 1 : tab.tab_order,\r\n }));\r\n\r\n setTabsData(reorderedTabs);\r\n if (activeTabValue == id) {\r\n setActiveTabValue(reorderedTabs?.length - 1)\r\n }\r\n\r\n if (reorderedTabs.length > 0) {\r\n const activeTab = reorderedTabs.find(\r\n (tab: TabData) => tab.tab_order === (activeTabValue ?? 0) + 1\r\n );\r\n\r\n if (activeTab?.data) {\r\n const sections = activeTab.data.map(\r\n ({ field_type, label, is_accordion, id, remove_section }) => ({\r\n field_type,\r\n label,\r\n is_accordion,\r\n id,\r\n remove_section,\r\n })\r\n );\r\n\r\n const membersList = activeTab.data.flatMap((section: ISectionProperty) =>\r\n section.members?.map((member: IProperty) => ({ ...member })) || []\r\n );\r\n\r\n // Clear current data and add new data\r\n remove();\r\n removeSection();\r\n membersList.forEach(member => append(member));\r\n sections.forEach(section => appendSection(section));\r\n }\r\n } else {\r\n // Clear all data if no tabs remain\r\n remove();\r\n removeSection();\r\n }\r\n } catch (error) {\r\n console.error('Error removing tab:', error);\r\n }\r\n }, [tabsData, activeTabValue, setTabsData, remove, removeSection, append, appendSection]);\r\n\r\n const handleElementSelection = useCallback((e: React.MouseEvent<HTMLElement>): void => {\r\n try {\r\n const target = e.target as HTMLElement;\r\n const elementPositionIndex = target.dataset.position;\r\n\r\n if (!elementPositionIndex || !isValidNumber(elementPositionIndex)) {\r\n console.error('Invalid element position index');\r\n return;\r\n }\r\n\r\n const positionIndex = Number(elementPositionIndex);\r\n\r\n if (positionIndex < 0 || positionIndex >= formJSON.length) {\r\n console.error('Element position index out of bounds');\r\n return;\r\n }\r\n\r\n setActiveMember(positionIndex);\r\n\r\n const elementDetails = deepClone(formJSON[positionIndex]);\r\n setPositionEditedElement(positionIndex);\r\n setElementJSON(elementDetails);\r\n setSelectedHoc('element');\r\n } catch (error) {\r\n console.error('Error selecting element:', error);\r\n }\r\n }, [formJSON, setActiveMember, setPositionEditedElement, setElementJSON, setSelectedHoc]);\r\n\r\n const handleSectionSelection = useCallback((e: React.MouseEvent<HTMLElement>): void => {\r\n try {\r\n const target = e.target as HTMLElement;\r\n const sectionPositionIndex = target.dataset.position;\r\n\r\n if (!sectionPositionIndex || !isValidNumber(sectionPositionIndex)) {\r\n console.error('Invalid section position index');\r\n return;\r\n }\r\n\r\n const positionIndex = Number(sectionPositionIndex);\r\n\r\n if (positionIndex < 0 || positionIndex >= sectionFormJSON.length) {\r\n console.error('Section position index out of bounds');\r\n return;\r\n }\r\n\r\n setActiveSection(positionIndex);\r\n\r\n const sectionDetails = deepClone(sectionFormJSON[positionIndex]);\r\n setSectionPositionEditedElement(positionIndex);\r\n setSectionJSON(sectionDetails);\r\n setSelectedHoc('section');\r\n } catch (error) {\r\n console.error('Error selecting section:', error);\r\n }\r\n }, [sectionFormJSON, setActiveSection, setSectionPositionEditedElement, setSectionJSON, setSelectedHoc]);\r\n\r\n const handleAddMember = useCallback((\r\n e: React.SyntheticEvent<HTMLElement>,\r\n otherProperties?: Record<string, any>\r\n ): void => {\r\n try {\r\n const target = e.currentTarget as HTMLElement;\r\n const sectionPositionIndex = target?.dataset?.position;\r\n\r\n if (sectionPositionIndex === undefined || !isValidNumber(sectionPositionIndex)) {\r\n console.error('Invalid section position index for adding member');\r\n return;\r\n }\r\n\r\n const positionIndex = Number(sectionPositionIndex);\r\n\r\n if (positionIndex < 0) {\r\n console.error('Section position index cannot be negative');\r\n return;\r\n }\r\n\r\n if (!element?.text) {\r\n console.error('Element text template is not available');\r\n return;\r\n }\r\n\r\n const newMember: IProperty = {\r\n ...deepClone(element.text),\r\n ...otherProperties,\r\n section_order: positionIndex,\r\n type: 'custom',\r\n is_new: true,\r\n custom_width: Math.floor(DEFAULT_GRID_COLUMNS / DEFAULT_COLUMN_WIDTH),\r\n is_fullwidth: false,\r\n is_system_field: Boolean(otherProperties?.is_system_field),\r\n id: generateUniqueId().uniqueStringId,\r\n };\r\n\r\n setActiveSection(positionIndex);\r\n append(newMember);\r\n\r\n const elementPositionIndex = members.length;\r\n setActiveMember(elementPositionIndex);\r\n setSelectedHoc('element');\r\n setPositionEditedElement(elementPositionIndex);\r\n setElementJSON(newMember);\r\n pickPropertyEditForm(newMember.field_type);\r\n } catch (error) {\r\n console.error('Error adding new member:', error);\r\n }\r\n }, [element, members, setActiveSection, append, setActiveMember, setSelectedHoc, setPositionEditedElement, setElementJSON, pickPropertyEditForm]);\r\n\r\n\r\n const handleSectionPropertyValueUpdate = useCallback((\r\n e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>,\r\n overrideValue?: any\r\n ): void => {\r\n try {\r\n const { name, type, checked, value } = e.target;\r\n\r\n if (!name) {\r\n console.error('Property name is required for update');\r\n return;\r\n }\r\n\r\n const updatedValue = overrideValue !== undefined ? overrideValue : (type === 'checkbox' ? checked : value);\r\n\r\n // Only update if value actually changed\r\n if (sectionJSON[name] !== updatedValue) {\r\n setSectionJSON(prev => ({ ...prev, [name]: updatedValue }));\r\n }\r\n } catch (error) {\r\n console.error('Error updating section property:', error);\r\n }\r\n }, [sectionJSON, setSectionJSON]);\r\n\r\n const handleWidthChange = useCallback((newCustomWidth: number): void => {\r\n try {\r\n if (!isValidNumber(newCustomWidth) || newCustomWidth < 1 || newCustomWidth > DEFAULT_GRID_COLUMNS) {\r\n console.error('Invalid width value provided');\r\n return;\r\n }\r\n\r\n setElementJSON(prevData => ({\r\n ...prevData,\r\n custom_width: newCustomWidth,\r\n }));\r\n } catch (error) {\r\n console.error('Error updating width:', error);\r\n }\r\n }, [setElementJSON]);\r\n\r\n const handleColumnSelect = useCallback((e: React.ChangeEvent<HTMLSelectElement>): void => {\r\n try {\r\n const columnValue = Number(e.target.value);\r\n\r\n if (!isValidNumber(columnValue) || columnValue <= 0) {\r\n console.error('Invalid column value provided');\r\n return;\r\n }\r\n\r\n const elementPerColumn = Math.floor(DEFAULT_GRID_COLUMNS / columnValue);\r\n\r\n if (elementPerColumn <= 0) {\r\n console.error('Calculated element per column is invalid');\r\n return;\r\n }\r\n\r\n // Batch update all members\r\n members.forEach((field: IProperty, index: number) => {\r\n update(index, { ...field, custom_width: elementPerColumn });\r\n });\r\n } catch (error) {\r\n console.error('Error updating column selection:', error);\r\n }\r\n }, [members, update]);\r\n\r\n const handlePropertyValueUpdate = useCallback((\r\n e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>,\r\n numberValue?: number,\r\n val?: string,\r\n fieldType?: keyof typeof FIELD_TYPES\r\n ): void => {\r\n try {\r\n const getValue = (): any => {\r\n if (fieldType) return fieldType;\r\n if (val !== undefined) return val;\r\n if (numberValue !== undefined) return numberValue;\r\n return e?.target?.value;\r\n };\r\n\r\n const value = getValue();\r\n const elementJSONCopy = deepClone(elementJSON);\r\n\r\n if (e?.target?.name) {\r\n elementJSONCopy[e.target.name] = e.target.type === 'checkbox' ? e.target.checked : value;\r\n }\r\n // Only update if there's an actual change\r\n if (fieldType) {\r\n const { uniqueStringId: uniqueId } = generateUniqueId();\r\n const copyOfUpdatedElement: IProperty = {\r\n ...element[fieldType],\r\n section_form_id: elementJSONCopy?.section_form_id,\r\n is_form_switcher_section: elementJSONCopy?.is_form_switcher_section,\r\n section_order: elementJSONCopy.section_order,\r\n id: uniqueId,\r\n type: 'custom',\r\n is_system_field: Boolean(elementJSONCopy?.is_system_field),\r\n is_new: true,\r\n column_width: elementJSONCopy?.column_width || 6,\r\n custom_width: elementJSONCopy?.custom_width || 6\r\n };\r\n setElementJSON(copyOfUpdatedElement);\r\n } else if (JSON.stringify(elementJSON) !== JSON.stringify(elementJSONCopy)) {\r\n setElementJSON({ ...elementJSON, ...elementJSONCopy });\r\n }\r\n } catch (error) {\r\n console.error('Error updating property value:', error);\r\n }\r\n }, [elementJSON, element, setElementJSON]);\r\n\r\n const handleSelectOptionValueUpdate = useCallback((options: any[]): void => {\r\n try {\r\n if (!Array.isArray(options)) {\r\n console.error('Options must be an array');\r\n return;\r\n }\r\n\r\n const elementJSONCopy = deepClone(elementJSON);\r\n elementJSONCopy.options = [...options];\r\n const { uniqueStringId: uniqueId } = generateUniqueId('-');\r\n\r\n if (JSON.stringify(elementJSON.options) !== JSON.stringify(options)) {\r\n setElementJSON({ ...elementJSON, ...elementJSONCopy, id: uniqueId });\r\n }\r\n } catch (error) {\r\n console.error('Error updating select options:', error);\r\n }\r\n }, [elementJSON, setElementJSON]);\r\n\r\n const handleColumnsUpdate = useCallback((columns: MRT_ColumnDef<MRT_RowData>[]): void => {\r\n try {\r\n if (!Array.isArray(columns)) {\r\n console.error('Columns must be an array');\r\n return;\r\n }\r\n\r\n const elementJSONCopy = deepClone(elementJSON);\r\n elementJSONCopy.table_columns = [...columns];\r\n const { uniqueStringId: uniqueId } = generateUniqueId('-');\r\n\r\n if (JSON.stringify(elementJSON.table_columns) !== JSON.stringify(columns)) {\r\n setElementJSON({ ...elementJSON, ...elementJSONCopy, id: uniqueId });\r\n }\r\n } catch (error) {\r\n console.error('Error updating table columns:', error);\r\n }\r\n }, [elementJSON, setElementJSON]);\r\n\r\n const handleRemoveSection = useCallback((sectionIndex: number): void => {\r\n try {\r\n if (!isValidNumber(sectionIndex) || sectionIndex < 0 || sectionIndex >= section.length) {\r\n console.error('Invalid section index for removal');\r\n return;\r\n }\r\n\r\n setRemoveSectionPosition(sectionIndex);\r\n removeSection(sectionIndex);\r\n\r\n // Remove associated members in reverse order to maintain indices\r\n const membersToRemove: number[] = [];\r\n members.forEach((member: IProperty, index: number) => {\r\n if (member?.section_order === sectionIndex) {\r\n membersToRemove.push(index);\r\n }\r\n });\r\n\r\n // Remove members in reverse order to maintain correct indices\r\n membersToRemove.reverse().forEach(memberIndex => {\r\n remove(memberIndex);\r\n });\r\n\r\n setRemoveSectionActionPerformed(true);\r\n } catch (error) {\r\n console.error('Error removing section:', error);\r\n }\r\n }, [section, members, setRemoveSectionPosition, removeSection, remove, setRemoveSectionActionPerformed]);\r\n\r\n const handleMakeAccordion = useCallback((sectionIndex: number): void => {\r\n try {\r\n if (!isValidNumber(sectionIndex) || sectionIndex < 0 || sectionIndex >= section.length) {\r\n console.error('Invalid section index for accordion conversion');\r\n return;\r\n }\r\n\r\n setModifyAccordion(true);\r\n setSectionPositionEditedElement(sectionIndex);\r\n setActiveSection(sectionIndex);\r\n\r\n const copyOfSection: ISectionProperty = {\r\n ...deepClone(section[sectionIndex]),\r\n is_accordion: true\r\n };\r\n\r\n updateSection(sectionIndex, copyOfSection);\r\n setSelectedHoc('section');\r\n setSectionJSON(copyOfSection);\r\n pickPropertyEditForm(copyOfSection.field_type);\r\n } catch (error) {\r\n console.error('Error making section accordion:', error);\r\n }\r\n }, [section, setModifyAccordion, setSectionPositionEditedElement, setActiveSection, updateSection, setSelectedHoc, setSectionJSON, pickPropertyEditForm]);\r\n\r\n const handleTabData = useCallback((): void => {\r\n try {\r\n const formWithMembers = deepClone(sectionFormJSON);\r\n\r\n formWithMembers.forEach((section: ISectionProperty, sectionIndex: number) => {\r\n section.members = members.filter(\r\n (member: IProperty) => member?.section_order === sectionIndex\r\n );\r\n });\r\n\r\n const hasSystemMembers = formWithMembers.some((section: ISectionProperty) =>\r\n section.members?.some((member: IProperty) => Boolean(member?.is_system_field))\r\n );\r\n\r\n const activeTabIndex = Number(activeTabValue);\r\n if (isValidNumber(activeTabIndex) && activeTabIndex >= 0 && activeTabIndex < tabsData.length) {\r\n const updatedTabsData = [...tabsData];\r\n updatedTabsData[activeTabIndex] = {\r\n ...updatedTabsData[activeTabIndex],\r\n data: formWithMembers,\r\n remove_tab: hasSystemMembers,\r\n };\r\n setTabsData(updatedTabsData)\r\n remove();\r\n removeSection();\r\n setActiveMember(undefined);\r\n setSelectedHoc(\"\");\r\n setActiveSection(undefined);\r\n }\r\n } catch (error) {\r\n console.error('Error updating tab data:', error);\r\n }\r\n }, [sectionFormJSON, members, activeTabValue, tabsData, setTabsData]);\r\n\r\n // const handlePreview = () => {\r\n // const formWithMembers = JSON.parse(JSON.stringify(sectionFormJSON));\r\n\r\n // formWithMembers.forEach(\r\n // (section: ISectionProperty, sectionIndex: number) => {\r\n // section.members = members.filter(\r\n // (member: any) => member?.section_order === sectionIndex,\r\n // ) as (IProperty | ISelectProperty)[];\r\n // },\r\n // );\r\n // const state = tabsData?.length\r\n // ? { tab: tabsData }\r\n // : { section: formWithMembers };\r\n\r\n // const FormBuilderConversion = state && formBuilderConversion(state);\r\n\r\n // setPreviewFields(FormBuilderConversion);\r\n // };\r\n\r\n // Option 1: Using useMemo to memoize the expensive computation\r\n const formWithMembers = useMemo(() => {\r\n if (!sectionFormJSON || !members) return null;\r\n\r\n return sectionFormJSON.map((section: ISectionProperty, sectionIndex: number) => ({\r\n ...section,\r\n members: members.filter(\r\n (member: any) => member?.section_order === sectionIndex,\r\n ) as (IProperty | ISelectProperty)[]\r\n }));\r\n }, [sectionFormJSON, members]);\r\n\r\n const previewState = useMemo(() => {\r\n if (!formWithMembers) return null;\r\n\r\n return tabsData?.length\r\n ? { tab: tabsData }\r\n : { section: formWithMembers };\r\n }, [tabsData, formWithMembers]);\r\n\r\n const previewFields = useMemo(() => {\r\n if (!previewState) return null;\r\n return formBuilderConversion(previewState);\r\n }, [previewState]);\r\n\r\n\r\n // Option 2: Optimized handlePreview function using useCallback\r\n const showPreview = useCallback(() => {\r\n if (previewFields) {\r\n setPreviewFields(previewFields);\r\n }\r\n }, [previewFields, setPreviewFields]);\r\n const hidePreview = useCallback(() => {\r\n setPreviewFields(null);\r\n }, []);\r\n\r\n // Enhanced handleFormUpdate with proper error handling and validation\r\n const handleFormUpdate = useCallback(async (): void => {\r\n try {\r\n\r\n\r\n\r\n // Early validation checks\r\n if (!sectionFormJSON || !Array.isArray(sectionFormJSON)) {\r\n console.warn('Invalid sectionFormJSON provided');\r\n return;\r\n }\r\n\r\n if (!members || !Array.isArray(members)) {\r\n console.warn('Invalid members array provided');\r\n return;\r\n }\r\n\r\n if (!rowData?._id) {\r\n console.warn('Missing rowData._id for form update');\r\n return;\r\n }\r\n\r\n // Deep clone with proper error handling\r\n let formWithMembers: IEnhancedSectionProperty[];\r\n\r\n try {\r\n formWithMembers = structuredClone(sectionFormJSON);\r\n } catch (cloneError) {\r\n // Fallback to JSON method if structuredClone is not available\r\n formWithMembers = JSON.parse(JSON.stringify(sectionFormJSON));\r\n }\r\n\r\n // Enhanced member filtering with better type safety and validation\r\n formWithMembers.forEach((section: IEnhancedSectionProperty, sectionIndex: number) => {\r\n // Validate section object\r\n if (!section || typeof section !== 'object') {\r\n console.warn(`Invalid section at index ${sectionIndex}`);\r\n return;\r\n }\r\n\r\n // Filter members with proper type checking and validation\r\n section.members = members.filter((member: IMember) => {\r\n // Validate member object and section_order\r\n return (\r\n member &&\r\n typeof member === 'object' &&\r\n typeof member.section_order === 'number' &&\r\n member.section_order === sectionIndex\r\n );\r\n }) as (IProperty | ISelectProperty)[];\r\n });\r\n\r\n const hasSystemMembers = formWithMembers.some((section: ISectionProperty) =>\r\n section.members?.some((member: IProperty) => Boolean(member?.is_system_field))\r\n );\r\n\r\n const activeTabIndex = Number(activeTabValue);\r\n let updatedTabsData = [...tabsData];\r\n if (isValidNumber(activeTabIndex) && activeTabIndex >= 0 && activeTabIndex < tabsData.length) {\r\n updatedTabsData = [...tabsData];\r\n updatedTabsData[activeTabIndex] = {\r\n ...updatedTabsData[activeTabIndex],\r\n data: formWithMembers,\r\n remove_tab: hasSystemMembers,\r\n };\r\n\r\n setTabsData(updatedTabsData)\r\n }\r\n\r\n // Build state object with proper validation\r\n const state: IFormState = updatedTabsData?.length > 0\r\n ? { tab: updatedTabsData }\r\n : { section: formWithMembers };\r\n\r\n // Validate formBuilderConversion function exists\r\n if (typeof formBuilderConversion !== 'function') {\r\n console.error('formBuilderConversion is not a function');\r\n return;\r\n }\r\n\r\n // Execute conversion with error handling\r\n let formBuilderConversionResult: any;\r\n try {\r\n formBuilderConversionResult = formBuilderConversion(state);\r\n } catch (conversionError) {\r\n console.error('Error during form builder conversion:', conversionError);\r\n return;\r\n }\r\n\r\n // Validate conversion result\r\n if (!formBuilderConversionResult) {\r\n console.warn('Form builder conversion returned empty result');\r\n return;\r\n }\r\n\r\n // Validate elementPerColumn\r\n // if (typeof elementPerColumn !== 'number' || elementPerColumn <= 0) {\r\n\r\n // console.warn('Invalid elementPerColumn value');\r\n // return;\r\n // }\r\n\r\n // Prepare payload with validation\r\n const updatePayload: IFormUpdatePayload = {\r\n gridCol: elementPerColumn || 2,\r\n fields: formBuilderConversionResult\r\n };\r\n\r\n // Dispatch update action\r\n const updateRes = await dispatch(\r\n patchFormDataById({\r\n id: rowData._id,\r\n data: updatePayload\r\n })\r\n );\r\n if (updateRes.meta.requestStatus === 'rejected') {\r\n\r\n const m = getErrorMessage(updateRes?.error?.message);\r\n enqueueSnackbar(m, { variant: 'error' });\r\n } else {\r\n enqueueSnackbar(\"Form updated successfully\", { variant: 'success' });\r\n navigate(path);\r\n }\r\n\r\n } catch (error) {\r\n const m = error?.message || 'Something went wrong while updating the form';\r\n enqueueSnackbar(m, { variant: 'error' });\r\n }\r\n }, [\r\n sectionFormJSON,\r\n members,\r\n tabsData,\r\n rowData?._id,\r\n elementPerColumn,\r\n dispatch,\r\n formBuilderConversion\r\n ]);\r\n\r\n const handleDuplicateElement = (index: number) => {\r\n const copyOfMember: any = { ...members[index], type: \"custom\" };\r\n copyOfMember && insert(index + 1, copyOfMember);\r\n setActiveMember(index + 1);\r\n setSelectedHoc(\"element\");\r\n setPositionEditedElement(index + 1);\r\n setElementJSON(copyOfMember);\r\n pickPropertyEditForm(copyOfMember.field_type);\r\n };\r\n\r\n const breadCrumbPath = [\r\n {\r\n link: path,\r\n label: \"Forms\",\r\n },\r\n {\r\n link: \"\",\r\n label: formatLabel(rowData?.name),\r\n },\r\n {\r\n link: \"\",\r\n label: \"Edit Form\",\r\n },\r\n ];\r\n\r\n\r\n useEffect(() => {\r\n if (removeSectionActionPerformed) {\r\n members.forEach((member: any, index: number) => {\r\n if (\r\n removeSectionPosition !== undefined &&\r\n Boolean(removeSectionPosition?.toString) &&\r\n member.section_order > removeSectionPosition\r\n ) {\r\n update(index, { ...member, section_order: member.section_order - 1 });\r\n }\r\n });\r\n setRemoveSectionActionPerformed(false);\r\n setRemoveSectionMembersPerformed(true);\r\n setRemoveSectionPosition(undefined);\r\n setSelectedHoc(\"\");\r\n }\r\n\r\n // eslint-disable-next-line\r\n }, [removeSectionActionPerformed]);\r\n\r\n useEffect(() => {\r\n formBuilder.isSuccess && navigate(path);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [formBuilder.isSuccess]);\r\n\r\n useEffect(() => {\r\n if (formBuilder.isError) {\r\n setToast({\r\n type: 'alert',\r\n message: formBuilder.error\r\n });\r\n }\r\n }, [formBuilder.error, formBuilder.isError]);\r\n\r\n useEffect(() => {\r\n if (\r\n typeof positionEditedElement !== \"number\" ||\r\n typeof positionEditedElement !== \"string\"\r\n ) {\r\n const index = Number(positionEditedElement);\r\n if (formJSON[index]) {\r\n const copyOfUpdatedFormJson = JSON.parse(\r\n JSON.stringify(formJSON[index]),\r\n );\r\n update(index, { ...copyOfUpdatedFormJson });\r\n }\r\n }\r\n // eslint-disable-next-line\r\n }, [formJSON]);\r\n\r\n useEffect(() => {\r\n const updatedFormJSON = formJSON.map((obj: any, index: number) => {\r\n if (index === Number(positionEditedElement)) {\r\n return { ...elementJSON };\r\n } else {\r\n return { ...obj };\r\n }\r\n });\r\n setFormJSON(updatedFormJSON);\r\n\r\n // eslint-disable-next-line\r\n }, [elementJSON]);\r\n\r\n useEffect(() => {\r\n if (members.length !== formJSON.length) {\r\n setFormJSON(JSON.parse(JSON.stringify(members)));\r\n }\r\n if (\r\n Boolean(elementSwap) &&\r\n JSON.stringify(members) !== JSON.stringify(formJSON)\r\n ) {\r\n setFormJSON(JSON.parse(JSON.stringify(members)));\r\n setElementSwap(false);\r\n const newMember: any =\r\n positionEditedElement && members[positionEditedElement];\r\n newMember && setSelectedHoc(\"element\");\r\n newMember && setElementJSON(newMember);\r\n newMember && pickPropertyEditForm(newMember.field_type);\r\n }\r\n if (\r\n removeSectionMembersPerformed &&\r\n JSON.stringify(members) !== JSON.stringify(formJSON)\r\n ) {\r\n setFormJSON(JSON.parse(JSON.stringify(members)));\r\n setRemoveSectionMembersPerformed(false);\r\n }\r\n // eslint-disable-next-line\r\n }, [members, elementSwap]);\r\n\r\n useEffect(() => {\r\n if (\r\n typeof sectionPositionEditedElement !== \"number\" ||\r\n typeof sectionPositionEditedElement !== \"string\"\r\n ) {\r\n const index = Number(sectionPositionEditedElement);\r\n if (sectionFormJSON[index]) {\r\n const copyOfUpdatedFormJson = JSON.parse(\r\n JSON.stringify(sectionFormJSON[index]),\r\n );\r\n updateSection(index, { ...copyOfUpdatedFormJson });\r\n }\r\n }\r\n // eslint-disable-next-line\r\n }, [sectionFormJSON]);\r\n\r\n useEffect(() => {\r\n const updatedFormJSON = sectionFormJSON.map((obj: any, index: number) => {\r\n if (index === Number(sectionPositionEditedElement)) {\r\n return { ...obj, ...sectionJSON };\r\n } else {\r\n return { ...obj };\r\n }\r\n });\r\n setSectionFormJSON(updatedFormJSON);\r\n // eslint-disable-next-line\r\n }, [sectionJSON]);\r\n\r\n useEffect(() => {\r\n if (section.length !== sectionFormJSON.length) {\r\n setSectionFormJSON(JSON.parse(JSON.stringify(section)));\r\n }\r\n if (\r\n JSON.stringify(sectionFormJSON) !== JSON.stringify(section) &&\r\n modifyAccordion\r\n ) {\r\n setSectionFormJSON(JSON.parse(JSON.stringify(section)));\r\n setModifyAccordion(false);\r\n }\r\n // eslint-disable-next-line\r\n }, [section]);\r\n\r\n useEffect(() => {\r\n () => setInitialLoading(true);\r\n }, [])\r\n\r\n const handleFormData = useCallback(async () => {\r\n setInitialLoading(true)\r\n try {\r\n if (rowData?._id) {\r\n setTabsData([])\r\n await dispatch(getFormDataById(rowData?._id));\r\n await dispatch(getFieldsByFormId({ id: rowData?._id }));\r\n\r\n }\r\n } finally {\r\n setInitialLoading(false);\r\n }\r\n\r\n }, [rowData?._id])\r\n\r\n useEffect(() => {\r\n handleFormData();\r\n }, [handleFormData]);\r\n\r\n type SelectedHoc = \"element\" | \"section\" | null;\r\n\r\n // Constants\r\n const DEFAULT_FIELD_TYPE = \"text\";\r\n const HOC_TYPES = {\r\n ELEMENT: \"element\",\r\n SECTION: \"section\"\r\n } as const;\r\n\r\n // Helper function to check if object has meaningful content\r\n const hasValidContent = (obj: Record<string, any>): boolean => {\r\n return obj && Object.keys(obj).length > 0;\r\n };\r\n\r\n const EmptyStateMessage = () => (\r\n <Typography type=\"s5\" color={\"theme.secondary.800\"} className=\"formSection--Text\">Select a field to edit its properties.</Typography>\r\n )\r\n\r\n // Helper function to get field type with fallback\r\n const getFieldTypeWithFallback = (\r\n json: ElementJSON | SectionJSON | null | undefined,\r\n fallback: string = DEFAULT_FIELD_TYPE\r\n ): string => {\r\n return json?.field_type || fallback;\r\n };\r\n\r\n const memoizedForm = useMemo(() => {\r\n // Early return for empty state\r\n if (!selectedHoc) {\r\n\r\n return <EmptyStateMessage />;\r\n }\r\n\r\n // Handle element selection\r\n if (selectedHoc === HOC_TYPES.ELEMENT) {\r\n if (!hasValidContent(members)) {\r\n console.warn('Element selected but no members data available');\r\n return <EmptyStateMessage />;\r\n }\r\n\r\n const fieldType = getFieldTypeWithFallback(elementJSON);\r\n return pickPropertyEditForm(fieldType);\r\n }\r\n\r\n // Handle section selection\r\n if (selectedHoc === HOC_TYPES.SECTION) {\r\n if (!hasValidContent(section)) {\r\n console.warn('Section selected but no section data available');\r\n return <EmptyStateMessage />;\r\n }\r\n\r\n const fieldType = getFieldTypeWithFallback(sectionJSON);\r\n return pickPropertyEditForm(fieldType);\r\n }\r\n\r\n // Fallback for unknown selection type\r\n console.warn(`Unknown selectedHoc type: ${selectedHoc}`);\r\n return <EmptyStateMessage />;\r\n }, [\r\n // Core dependencies\r\n selectedHoc,\r\n\r\n // Data dependencies\r\n Object.keys(members).length,\r\n Object.keys(section).length,\r\n\r\n // JSON dependencies with deep comparison consideration\r\n elementJSON?.field_type,\r\n elementJSON?.field_properties,\r\n sectionJSON?.field_type,\r\n sectionJSON?.field_properties,\r\n\r\n // Function dependency\r\n pickPropertyEditForm\r\n ]);\r\n\r\n return (\r\n // <FullScreenLayout className=\"formSection--Layout\">\r\n <Box position='relative'>\r\n {initialLoading ? <ErpLoader /> :\r\n <DndProvider backend={HTML5Backend}>\r\n <FormHeader breadCrumbPath={breadCrumbPath}>\r\n <div className=\"formSection--Buttons\">\r\n <Button\r\n variant=\"outlined\"\r\n className=\"formSection--PreviewButton\"\r\n text=\"Preview\"\r\n onClick={() => { !previewFieldsData ? showPreview() : hidePreview() }}\r\n disable={!members?.length}\r\n startIcon={previewFieldsData ? <EyeOff /> : <Eye />}\r\n />\r\n <Button\r\n variant=\"contained\"\r\n type=\"submit\"\r\n text=\"Update\"\r\n onClick={handleFormUpdate}\r\n disable={previewFieldsData}\r\n />\r\n </div>\r\n </FormHeader>\r\n {!previewFieldsData ?\r\n <Grid className=\"formSection--Grid\" container>\r\n <Grid\r\n item\r\n xs={9}\r\n component=\"form\"\r\n sx={{\r\n position: \"relative\",\r\n background: \"#F5F6F5\",\r\n padding: \"0.75rem\",\r\n }}\r\n >\r\n <Grid className=\"formSection--GridContainer\">\r\n <Box className=\"formSection--Tab\">\r\n {tabsData && (\r\n <TabBar\r\n tabs={tabsData}\r\n onEditTabTitle={handleEditTabTitle}\r\n activeValue={activeTabValue}\r\n setActiveValue={setActiveTabValue}\r\n handleTabChange={() => {\r\n handleTabData()\r\n }}\r\n handleRemoveTab={handleRemoveTab}\r\n containerProps={{ mb: 0 }}\r\n />\r\n )}\r\n <Button\r\n variant=\"outlined\"\r\n text=\"Add Tab\"\r\n onClick={handleAddTab}\r\n style={{ color: \"#292D32\", margin: \"0.5rem\" }}\r\n />\r\n </Box>\r\n <div className=\"formSection--Form\">\r\n {section?.map((item: any, i: number) => {\r\n const sectionMembers = members.filter(\r\n (member: any) => member.section_order === i,\r\n );\r\n const isFormSwitcher = item.section_type === SECTION_TYPES.FORM_SWITCH_SECTION\r\n const switchForms = item?.switcher_forms?.map((form: any) => ({\r\n ...form,\r\n formMembers: members.filter(\r\n (member: any) => member.section_form_id === form.id,\r\n )\r\n }))\r\n\r\n return (\r\n <DynamicSectionHOC\r\n index={i}\r\n label={t(item.label)}\r\n onClick={handleSectionSelection}\r\n position={i}\r\n fieldArrayName=\"section\"\r\n isFormSwitcher={isFormSwitcher}\r\n activeIndex={activeSection === i}\r\n removeSection={() => handleRemoveSection(i)}\r\n handleAccordion={() => handleMakeAccordion(i)}\r\n handleAddButton={(e) => handleAddMember(e)}\r\n remove_section={item.remove_section}\r\n >\r\n {isFormSwitcher ? (\r\n <div style={{ width: '100%' }} >\r\n <Typography type=\"s5\" style={{ fontWeight: 500 }} color={\"theme.secondary.800\"}>\r\n {item.form_switcher_label}\r\n </Typography>\r\n <RadioGroup\r\n aria-labelledby=\"theme-radio-buttons-group-label\"\r\n name={item.form_switcher_name || item.form_switcher_label}\r\n >\r\n\r\n {switchForms?.map(({ name, id, formMembers }: { name: string, id: number, formMembers: any }) => (\r\n <>\r\n <div>\r\n <FormControlLabel\r\n key={id}\r\n value={name}\r\n control={<Radio />}\r\n label={t(name)}\r\n disabled\r\n />\r\n </div>\r\n\r\n <Grid container sx={{ mb: 3 }}>\r\n <FormFields\r\n sectionMembers={formMembers || []}\r\n members={members}\r\n activeMember={activeMember}\r\n control={control}\r\n t={t}\r\n element={element}\r\n images={images}\r\n elementJSON={elementJSON}\r\n remove={remove}\r\n move={move}\r\n handleElementSelection={handleElementSelection}\r\n setElementSwap={setElementSwap}\r\n handleDuplicateElement={handleDuplicateElement}\r\n setSelectedHoc={setSelectedHoc}\r\n setActiveMember={setActiveMember}\r\n />\r\n </Grid>\r\n <Button\r\n text=\"Add\"\r\n variant=\"outlined\"\r\n className=\"formSection--PreviewButton\"\r\n data-position={i}\r\n onClick={(e) => handleAddMember(e, {\r\n section_form_id: id,\r\n is_form_switcher_section: true\r\n })}\r\n startIcon={<Add />}\r\n />\r\n </>\r\n ))}\r\n </RadioGroup>\r\n </div>\r\n ) : null}\r\n {!isFormSwitcher &&\r\n <FormFields\r\n sectionMembers={sectionMembers || []}\r\n members={members}\r\n activeMember={activeMember}\r\n control={control}\r\n t={t}\r\n element={element}\r\n images={images}\r\n elementJSON={elementJSON}\r\n remove={remove}\r\n move={move}\r\n handleElementSelection={handleElementSelection}\r\n setElementSwap={setElementSwap}\r\n handleDuplicateElement={handleDuplicateElement}\r\n setSelectedHoc={setSelectedHoc}\r\n setActiveMember={setActiveMember}\r\n />\r\n }\r\n </DynamicSectionHOC>\r\n );\r\n })}\r\n <div className=\"formSection--Section\">\r\n <Button\r\n text=\"Add a section\"\r\n variant=\"outlined\"\r\n className=\"formSection--PreviewButton\"\r\n onClick={addNewSection}\r\n startIcon={<Add />}\r\n />\r\n </div>\r\n </div>\r\n </Grid>\r\n\r\n </Grid>\r\n <Grid\r\n item\r\n xs={3}\r\n className={\r\n Boolean(selectedHoc) && (members?.length || section.length)\r\n ? \"formSection--RightGrid\"\r\n : \"formSection--RightGrid formSection--Text\"\r\n }\r\n >\r\n {memoizedForm}\r\n </Grid>\r\n </Grid>\r\n :\r\n <FormParser\r\n data={previewFieldsData || []}\r\n handleFormSubmit={(data) => console.log(\"Preview Data\", data)}\r\n className='form-container'\r\n fieldArrayName='form-builder-preview'\r\n getFormMethods={(methods: any) =>\r\n setFormParserMethods({ ...methods })\r\n }\r\n />\r\n }\r\n <Toast\r\n open={Boolean(toast)}\r\n type={toast?.type}\r\n message={toast?.message}\r\n handleClose={() => setToast(null)}\r\n anchorOrigin={{ horizontal: 'right', vertical: 'bottom' }}\r\n />\r\n </DndProvider>}\r\n </Box>\r\n // </FullScreenLayout>\r\n );\r\n}\r\n\r\nexport default CustomForm;\r\n","/**\r\n * CSS Scoping Service\r\n * \r\n * Provides utilities for generating unique scope identifiers and scoping CSS\r\n * to prevent style conflicts between different email templates.\r\n */\r\n\r\nexport interface ScopedResult {\r\n scopeId: string;\r\n scopedCSS: string;\r\n wrappedHTML: string;\r\n}\r\n\r\nexport class CSSScopingService {\r\n /**\r\n * Generate a unique scope identifier using timestamp and random string\r\n * Format: email-tpl-{timestamp}-{random}\r\n */\r\n generateScopeId(): string {\r\n const timestamp = Date.now();\r\n const random = Math.random().toString(36).substring(2, 11);\r\n return `email-tpl-${timestamp}-${random}`;\r\n }\r\n\r\n /**\r\n * Scope CSS selectors by prefixing them with the scope identifier\r\n * Skips :root and :host pseudo-classes\r\n * \r\n * @param css - The CSS stylesheet to scope\r\n * @param scopeId - The unique scope identifier\r\n * @returns Scoped CSS with prefixed selectors\r\n */\r\n scopeCSS(css: string, scopeId: string): string {\r\n if (!css || !scopeId) return css;\r\n\r\n // Split CSS into rules\r\n const rules = this.parseCSS(css);\r\n const scopedRules = rules.map(rule => this.scopeRule(rule, scopeId));\r\n \r\n return scopedRules.join('\\n');\r\n }\r\n\r\n /**\r\n * Parse CSS into individual rules\r\n * Simple parser that handles basic CSS syntax\r\n */\r\n private parseCSS(css: string): string[] {\r\n const rules: string[] = [];\r\n let currentRule = '';\r\n let braceCount = 0;\r\n let inComment = false;\r\n\r\n for (let i = 0; i < css.length; i++) {\r\n const char = css[i];\r\n const nextChar = css[i + 1];\r\n\r\n // Handle comments\r\n if (char === '/' && nextChar === '*') {\r\n inComment = true;\r\n currentRule += char;\r\n continue;\r\n }\r\n if (inComment && char === '*' && nextChar === '/') {\r\n inComment = false;\r\n currentRule += char;\r\n continue;\r\n }\r\n\r\n currentRule += char;\r\n\r\n if (!inComment) {\r\n if (char === '{') {\r\n braceCount++;\r\n } else if (char === '}') {\r\n braceCount--;\r\n \r\n if (braceCount === 0 && currentRule.trim()) {\r\n rules.push(currentRule.trim());\r\n currentRule = '';\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Handle any remaining content\r\n if (currentRule.trim()) {\r\n rules.push(currentRule.trim());\r\n }\r\n\r\n return rules;\r\n }\r\n\r\n /**\r\n * Scope a single CSS rule\r\n */\r\n private scopeRule(rule: string, scopeId: string): string {\r\n // Extract selector and body\r\n const braceIndex = rule.indexOf('{');\r\n if (braceIndex === -1) return rule;\r\n\r\n const selector = rule.substring(0, braceIndex).trim();\r\n const body = rule.substring(braceIndex);\r\n\r\n // Split multiple selectors (comma-separated)\r\n const selectors = selector.split(',').map(s => s.trim());\r\n const scopedSelectors = selectors.map(sel => this.scopeSelector(sel, scopeId));\r\n\r\n return `${scopedSelectors.join(', ')} ${body}`;\r\n }\r\n\r\n /**\r\n * Scope a single selector\r\n * Skip :root, :host, and other pseudo-classes that shouldn't be scoped\r\n */\r\n private scopeSelector(selector: string, scopeId: string): string {\r\n // Don't scope :root or :host\r\n if (selector.startsWith(':root') || selector.startsWith(':host')) {\r\n return selector;\r\n }\r\n\r\n // Don't scope @-rules (like @media, @keyframes)\r\n if (selector.startsWith('@')) {\r\n return selector;\r\n }\r\n\r\n // Prefix the selector with the scope class\r\n return `.${scopeId} ${selector}`;\r\n }\r\n\r\n /**\r\n * Wrap HTML content with a scope wrapper div\r\n * \r\n * @param html - The HTML content to wrap\r\n * @param scopeId - The unique scope identifier\r\n * @returns HTML wrapped with scope div\r\n */\r\n wrapHTMLWithScope(html: string, scopeId: string): string {\r\n if (!html || !scopeId) return html;\r\n \r\n return `<div class=\"${scopeId}\">\\n${html}\\n</div>`;\r\n }\r\n\r\n /**\r\n * Extract inline styles from HTML elements\r\n * Returns a map of element identifiers to their inline styles\r\n */\r\n extractInlineStyles(html: string): Map<string, Record<string, string>> {\r\n const styleMap = new Map<string, Record<string, string>>();\r\n \r\n // Create a temporary DOM element to parse HTML\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(html, 'text/html');\r\n \r\n // Find all elements with inline styles\r\n const elementsWithStyles = doc.querySelectorAll('[style]');\r\n \r\n elementsWithStyles.forEach((element, index) => {\r\n const styleAttr = element.getAttribute('style');\r\n if (styleAttr) {\r\n const styles = this.parseInlineStyles(styleAttr);\r\n // Use element tag + index as identifier\r\n const identifier = `${element.tagName.toLowerCase()}-${index}`;\r\n styleMap.set(identifier, styles);\r\n }\r\n });\r\n \r\n return styleMap;\r\n }\r\n\r\n /**\r\n * Parse inline style attribute into an object\r\n */\r\n private parseInlineStyles(styleAttr: string): Record<string, string> {\r\n const styles: Record<string, string> = {};\r\n \r\n const declarations = styleAttr.split(';').filter(d => d.trim());\r\n \r\n declarations.forEach(declaration => {\r\n const colonIndex = declaration.indexOf(':');\r\n if (colonIndex > -1) {\r\n const property = declaration.substring(0, colonIndex).trim();\r\n const value = declaration.substring(colonIndex + 1).trim();\r\n styles[property] = value;\r\n }\r\n });\r\n \r\n return styles;\r\n }\r\n\r\n /**\r\n * Merge two style objects, with override taking precedence\r\n */\r\n mergeStyles(\r\n base: Record<string, string>,\r\n override: Record<string, string>\r\n ): Record<string, string> {\r\n return { ...base, ...override };\r\n }\r\n\r\n /**\r\n * Complete scoping workflow: generate scope ID, scope CSS, and wrap HTML\r\n * \r\n * @param html - The HTML content\r\n * @param css - The CSS stylesheet\r\n * @returns Object containing scopeId, scopedCSS, and wrappedHTML\r\n */\r\n scopeTemplate(html: string, css: string = ''): ScopedResult {\r\n const scopeId = this.generateScopeId();\r\n const scopedCSS = css ? this.scopeCSS(css, scopeId) : '';\r\n const wrappedHTML = this.wrapHTMLWithScope(html, scopeId);\r\n\r\n return {\r\n scopeId,\r\n scopedCSS,\r\n wrappedHTML\r\n };\r\n }\r\n}\r\n\r\n// Export singleton instance\r\nexport const cssScopingService = new CSSScopingService();\r\n","/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { ElementType, EnhancedSectionData } from '../types/editor';\r\nimport { initialStyles, TEMPLATE_EDITOR_PATHS } from './constant';\r\nimport { cssScopingService } from '../services/CSSScopingService';\r\n\r\n\r\nexport const templateRoutes = (modulePath: string, type: string) => {\r\n const list = `${modulePath}${TEMPLATE_EDITOR_PATHS.TEMPLATES_LIST(type)}`\r\n const add = `${modulePath}${TEMPLATE_EDITOR_PATHS.TEMPLATES_ADD(type)}`\r\n const edit = `${modulePath}${TEMPLATE_EDITOR_PATHS.TEMPLATES_EDIT(type)}`\r\n return {\r\n LIST: list,\r\n ADD_TEMPLATE: (id: string) => add.replace(':id', id),\r\n EDIT_TEMPLATE: (id: string, templateId: string) => edit.replace(':id', id).replace(':template_id', templateId),\r\n }\r\n};\r\n\r\n\r\nexport const generateEmailPreview = (sections: EnhancedSectionData[], headerSections?: EnhancedSectionData[] = [], footerSections?: EnhancedSectionData[] = [], isSaving = false, scopeId?: string) => {\r\n const headerHtml = (headerSections && headerSections?.length) ? generateHeaderFooterPreview(headerSections, 'header') : '';\r\n const footerHtml = (footerSections && footerSections?.length) ? generateHeaderFooterPreview(footerSections, 'footer') : '';\r\n \r\n // Generate or use provided scope ID\r\n const templateScopeId = scopeId || cssScopingService.generateScopeId();\r\n \r\n let html = `\r\n <html>\r\n <head>\r\n <style>\r\n .email-container {\r\n margin: 0 auto;\r\n margin-bottom: 20px;\r\n background-color: #fff;\r\n border-radius: 8px;\r\n max-width: ${isSaving ? '65%' : '800px'};\r\n width: 100%;\r\n }\r\n a {\r\n color: #007bff !important;\r\n text-decoration: none !important;\r\n }\r\n a:hover {\r\n text-decoration: underline;\r\n }\r\n * {\r\n margin: 0;\r\n padding: 0;\r\n box-sizing: border-box;\r\n }\r\n\r\n body {\r\n font-family: \"Inter\", sans-serif !important;\r\n font-size: 16px;\r\n font-weight: 400;\r\n color: #00011c;\r\n font-style: normal;\r\n }\r\n\r\n img {\r\n display: block;\r\n height: auto;\r\n }\r\n\r\n table,\r\n tr,\r\n td {\r\n border-collapse: collapse;\r\n }\r\n\r\n a {\r\n text-decoration: none;\r\n }\r\n\r\n table.our-details,\r\n .our-details td,\r\n .our-details th {\r\n border: 1px solid #d3d3d4;\r\n }\r\n\r\n table.amount-word-table,\r\n table.amount-word-table td,\r\n table.amount-word-table th {\r\n border: 1px solid #d6d6d6;\r\n }\r\n\r\n .amount-word-table thead th {\r\n background-color: #f5f6f5;\r\n }\r\n\r\n .amount-word-table thead td {\r\n background-color: #f5f6f5;\r\n }\r\n\r\n .amount-word-table tbody tr:nth-child(even) {\r\n background-color: #f5f6f5;\r\n }\r\n\r\n .amount-word-table tbody tr td {\r\n border-top: 0;\r\n border-bottom: 0;\r\n }\r\n\r\n .deliver-table thead th {\r\n background-color: transparent;\r\n }\r\n </style>\r\n </head>\r\n <body>\r\n <div class=\"email-container ${templateScopeId}\">\r\n ${headerHtml}\r\n ${headerHtml ? '<hr/>' : ''}\r\n `;\r\n\r\n // Group sections by splitGroupId\r\n const groupedSections = [];\r\n let currentGroup = [];\r\n let lastSplitGroupId = null;\r\n\r\n for (const section of sections) {\r\n if (section.isSplitPair && section.splitGroupId !== 0) {\r\n if (lastSplitGroupId !== section.splitGroupId && currentGroup.length > 0) {\r\n groupedSections.push(currentGroup);\r\n currentGroup = [];\r\n }\r\n currentGroup.push(section);\r\n lastSplitGroupId = section.splitGroupId;\r\n } else {\r\n if (currentGroup.length > 0) {\r\n groupedSections.push(currentGroup);\r\n currentGroup = [];\r\n lastSplitGroupId = null;\r\n }\r\n groupedSections.push([section]);\r\n }\r\n }\r\n if (currentGroup.length > 0) {\r\n groupedSections.push(currentGroup);\r\n }\r\n\r\n // Generate HTML\r\n for (const group of groupedSections) {\r\n if (group.length === 1 && !group[0].isSplitPair) {\r\n // Concatenate normal section content directly\r\n html += `<div style=\"padding: 10px;\">${group[0].content}</div>`;\r\n } else {\r\n // Generate table for split sections\r\n html += '<table style=\"width: 100%; border-collapse: collapse;\"><tr>';\r\n for (const section of group) {\r\n html += `<td style=\"width: ${section.splitWidth}%; vertical-align: top; padding: 10px;\">\r\n ${section.content}\r\n </td>`;\r\n }\r\n html += '</tr></table>';\r\n }\r\n }\r\n\thtml += `\r\n ${footerHtml ? '<hr/>' : ''}\r\n ${footerHtml}\r\n </div></body></html>`;\r\n\r\n return html;\r\n}\r\nexport const generateHeaderFooterPreview = (sections: EnhancedSectionData[], type = 'header', scopeId?: string) => {\r\n const scopeClass = scopeId ? ` ${scopeId}` : '';\r\n let html = `<${type} class=\"${type}${scopeClass}\">`;\r\n\r\n // Group sections by splitGroupId\r\n const groupedSections = [];\r\n let currentGroup = [];\r\n let lastSplitGroupId = null;\r\n\r\n for (const section of sections) {\r\n if (section.isSplitPair && section.splitGroupId !== 0) {\r\n if (lastSplitGroupId !== section.splitGroupId && currentGroup.length > 0) {\r\n groupedSections.push(currentGroup);\r\n currentGroup = [];\r\n }\r\n currentGroup.push(section);\r\n lastSplitGroupId = section.splitGroupId;\r\n } else {\r\n if (currentGroup.length > 0) {\r\n groupedSections.push(currentGroup);\r\n currentGroup = [];\r\n lastSplitGroupId = null;\r\n }\r\n groupedSections.push([section]);\r\n }\r\n }\r\n if (currentGroup.length > 0) {\r\n groupedSections.push(currentGroup);\r\n }\r\n\r\n // Generate HTML\r\n for (const group of groupedSections) {\r\n if (group.length === 1 && !group[0].isSplitPair) {\r\n // Concatenate normal section content directly\r\n html += `<div style=\"padding: 10px;\">${group[0].content}</div>`;\r\n } else {\r\n // Generate table for split sections\r\n html += '<table style=\"width: 100%; border-collapse: collapse;\"><tr>';\r\n for (const section of group) {\r\n html += `<td style=\"width: ${section.splitWidth}%; vertical-align: top; padding: 10px;\">\r\n ${section.content}\r\n </td>`;\r\n }\r\n html += '</tr></table>';\r\n }\r\n }\r\n\thtml += `</${type}>`;\r\n\r\n return html;\r\n}\r\n\r\nexport const extractStyles = (html: string, sectionType: string) => {\r\n // Create a temporary div to parse the HTML\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = html;\r\n \r\n // Get the first element (our styled element)\r\n const element = tempDiv.firstChild as HTMLElement;\r\n \r\n if (!element) return {};\r\n\r\n if(element?.getAttribute instanceof Function === false) {\r\n return {};\r\n }\r\n \r\n // Get the inline styles\r\n const styleAttr = element?.getAttribute('style');\r\n\r\n const allAttributes = element?.attributes || [];\r\n \r\n // const attrObj: Record<string, any> = {};\r\n const attrObj = Array.from(allAttributes).reduce((obj, attr) => {\r\n obj[attr.name] = attr.value;\r\n return obj;\r\n }, {});\r\n\r\n if (!styleAttr) return {};\r\n \r\n // Parse the style attribute into an object\r\n const styleObj: Record<string, any> = {};\r\n const stylePairs = styleAttr.split(';').filter(pair => pair.trim() !== '');\r\n \r\n stylePairs.forEach(pair => {\r\n const [prop, value] = pair.split(':').map(part => part.trim());\r\n if (prop && value) {\r\n // Convert CSS property names to camelCase for React\r\n const propName = prop.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\r\n styleObj[propName] = value;\r\n }\r\n });\r\n attrObj.styles = styleObj\r\n return attrObj\r\n}\r\n\r\n\r\ntype StyleValue = string | number | boolean | null | undefined | StyleObject;\r\ninterface StyleObject {\r\n [key: string]: StyleValue;\r\n}\r\n\r\nconst EMAIL_SAFE_PROPERTIES = new Set([\r\n 'background', 'background-color',\r\n 'border', 'border-style', 'border-collapse', 'border-top', 'border-right', 'border-bottom', 'border-left', 'border-color', 'border-radius',\r\n 'color', 'display', 'font', 'font-family', 'font-size', 'font-style', 'font-weight',\r\n 'height', 'line-height',\r\n 'margin', 'margin-top', 'margin-right', 'margin-bottom', 'margin-left',\r\n 'padding', 'padding-top', 'padding-right', 'padding-bottom', 'padding-left',\r\n 'text-align', 'text-decoration',\r\n 'vertical-align', 'width',\r\n 'max-width', 'min-width', 'max-height', 'min-height'\r\n]);\r\n\r\nexport const generateInlineStyles = (\r\n styles: StyleObject,\r\n parentKey = ''\r\n): string => {\r\n if (!styles || typeof styles !== 'object') return '';\r\n\r\n const styleEntries = Object.entries(styles).reduce<string[]>((acc, [key, value]) => {\r\n if (value === undefined || value === null) return acc;\r\n\r\n const fullKey = parentKey ? `${parentKey}-${key}` : key;\r\n\r\n // Recursively flatten nested objects\r\n if (typeof value === 'object' && !Array.isArray(value)) {\r\n acc.push(generateInlineStyles(value as StyleObject, fullKey));\r\n return acc;\r\n }\r\n\r\n // Convert camelCase to kebab-case\r\n const cssKey = fullKey.replace(/([A-Z])/g, '-$1').toLowerCase();\r\n\r\n // Skip non-email-safe properties\r\n if (!EMAIL_SAFE_PROPERTIES.has(cssKey) && key !== 'fullWidth' && key !== 'alignment') {\r\n return acc;\r\n }\r\n\r\n // Special case: fullWidth\r\n if (key === 'fullWidth' && value === true) {\r\n acc.push('width: 100%');\r\n return acc;\r\n }\r\n\r\n // Special case: alignment (converted to text-align)\r\n if (key === 'alignment' && typeof value === 'string') {\r\n acc.push(`text-align: ${value}`);\r\n return acc;\r\n }\r\n\r\n // Ignore other boolean values\r\n if (typeof value === 'boolean') return acc;\r\n\r\n const cssValue =\r\n typeof value === 'number' && !['z-index', 'opacity', 'line-height'].includes(key)\r\n ? `${value}px`\r\n : value;\r\n\r\n acc.push(`${cssKey}: ${cssValue}`);\r\n return acc;\r\n }, []);\r\n\r\n return styleEntries.filter(Boolean).join('; ');\r\n};\r\n\r\nexport const getInitialSectionData = (type: ElementType, attrs: Record<string, any> = {}): EnhancedSectionData => {\r\n let content = '';\r\n const styles = initialStyles[type] || {};\r\n const inlineStyles: string = generateInlineStyles(styles);\r\n\r\n switch (type) {\r\n case 'heading':\r\n content = `<h1 style=\"${inlineStyles}\">Heading 1</h1>`;\r\n break;\r\n case 'heading-2':\r\n content = `<h2 style=\"${inlineStyles}\">Heading 2</h2>`;\r\n break;\r\n case 'heading-3':\r\n content = `<h3 style=\"${inlineStyles}\">Heading 3</h3>`;\r\n break;\r\n case 'heading-4':\r\n content = `<h4 style=\"${inlineStyles}\">Heading 4</h4>`;\r\n break;\r\n case 'text':\r\n content = `<p style=\"${inlineStyles}\">Hello, enter your text here...</p>`;\r\n break;\r\n case 'image':\r\n content = `<img src=\"${attrs?.src || ''}\" alt=\"${attrs?.alt || ''}\" style=\"${inlineStyles};\" />`;\r\n break;\r\n case 'buttons':\r\n attrs.text = attrs?.text || 'Button text';\r\n content = `<button style=\"${inlineStyles}\">${attrs.text}</button>`;\r\n break;\r\n case 'divider':\r\n content = `<hr style=\"${inlineStyles}\" />`;\r\n break;\r\n case 'table': {\r\n const { border, borderStyle, borderColor, ...rest } = styles;\r\n const tInlineStyles = generateInlineStyles(styles.is_bordered ? styles : rest);\r\n const tHeadInlineStyles: string = generateInlineStyles(styles.tHead);\r\n const tBodyInlineStyles: string = generateInlineStyles(styles.tBody);\r\n const thCellInlineStyles: string = generateInlineStyles({...styles.thCells, border, borderStyle, borderColor });\r\n const tbCellInlineStyles: string = generateInlineStyles({...styles.tbCells, border, borderStyle, borderColor});\r\n content = `\r\n <table style=\"${tInlineStyles}\">\r\n <thead style=\"${tHeadInlineStyles}\">\r\n <tr style=\"background-color: #f5f5f5;\">\r\n <th style=\"${thCellInlineStyles}\"></th>\r\n <th style=\"${thCellInlineStyles}\"></th>\r\n <th style=\"${thCellInlineStyles}\"></th>\r\n </tr>\r\n </thead>\r\n <tbody style=\"${tBodyInlineStyles}\">\r\n <tr>\r\n <td style=\"${tbCellInlineStyles}\"></td>\r\n <td style=\"${tbCellInlineStyles}\"></td>\r\n <td style=\"${tbCellInlineStyles}\"></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n `;\r\n break;\r\n }\r\n case 'signature':\r\n content = `<div style=\"${inlineStyles}\">Signature: <input type='text' style=\"border:0; border-bottom:1px solid black\" class='signature-input'/></div>`;\r\n break;\r\n case 'qr-code':\r\n attrs.placeholder = attrs?.placeholder || '{{qr_data}}';\r\n content = `<div style=\"background-color: #f5f5f5; padding: 16px; text-align: center; color: #666666;\">${attrs.placeholder}</div>`;\r\n break;\r\n case 'bar-code':\r\n attrs.placeholder = attrs?.placeholder || '{{barcode_data}}';\r\n content = `<div style=\"background-color: #f5f5f5; padding: 16px; text-align: center; color: #666666;\">${attrs.placeholder}</div>`;\r\n break;\r\n default:\r\n content = '<p style=\"font-size: 16px; color: #333333; line-height: 1.5;\">New section</p>';\r\n }\r\n\r\n let attributes: Record<string, any> = {};\r\n attributes = extractStyles(content, type);\r\n\r\n return {\r\n content, \r\n type, \r\n attributes: {...(attrs || {}), styles}\r\n };\r\n};\r\n\r\n","/* eslint-disable react-hooks/exhaustive-deps */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React from 'react';\r\nimport {\r\n AppBar,\r\n Toolbar,\r\n Box,\r\n Link,\r\n Stack,\r\n IconButton,\r\n Divider,\r\n} from '@mui/material';\r\nimport { ZoomIn, ZoomOut, ZoomOutMap } from '@mui/icons-material';\r\nimport Button from '../../../components/button/button';\r\nimport Typography from '../../../components/typography/typography';\r\nimport { Edit, Eye, EyeOff } from '../../../components/icons';\r\nimport CodeOutlinedIcon from '@mui/icons-material/CodeOutlined';\r\nimport { Link as RouterLink } from 'react-router-dom';\r\nimport { templateRoutes } from '../utils/common';\r\nimport { EnhancedSectionData } from '../types/editor';\r\n\r\ninterface EditorHeaderProps {\r\n onSave: () => void;\r\n onPreview: () => void;\r\n preview: boolean;\r\n editHtml: boolean;\r\n onEditHtml: () => void;\r\n onEditModeChange?: () => void;\r\n sections: EnhancedSectionData[];\r\n isEditingHeaderFooter: boolean;\r\n setIsEditingHeaderFooter: (value: boolean) => void;\r\n onSaveHeaderFooter: (value: boolean) => void;\r\n modulePath: string;\r\n type: string;\r\n mode: 'add' | 'edit';\r\n templateData: Record<string, any> | null;\r\n isSaving?: boolean;\r\n editMode: boolean;\r\n fromPreview?: boolean;\r\n zoom: number;\r\n onZoomIn: () => void;\r\n onZoomOut: () => void;\r\n onResetZoom: () => void;\r\n}\r\n\r\nconst EditorHeader: React.FC<EditorHeaderProps> = ({\r\n onSave,\r\n onPreview,\r\n preview,\r\n editHtml,\r\n onEditHtml,\r\n sections,\r\n isEditingHeaderFooter,\r\n onEditModeChange,\r\n setIsEditingHeaderFooter,\r\n onSaveHeaderFooter,\r\n modulePath,\r\n type,\r\n mode = 'add',\r\n templateData,\r\n isSaving = false,\r\n editMode,\r\n fromPreview = false,\r\n zoom,\r\n onZoomIn,\r\n onZoomOut,\r\n onResetZoom,\r\n}) => {\r\n const ROUTES = templateRoutes(modulePath, type);\r\n return (\r\n <AppBar\r\n position=\"static\"\r\n color=\"default\"\r\n elevation={0}\r\n sx={{\r\n borderColor: 'divider',\r\n bgcolor: 'background.paper'\r\n }}\r\n >\r\n <Toolbar variant=\"dense\" sx={{ justifyContent: 'space-between', p: 3 }}>\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\r\n <Link\r\n component={RouterLink}\r\n to={ROUTES.LIST}\r\n underline=\"hover\"\r\n color=\"text.secondary\"\r\n sx={{ fontSize: '0.875rem' }}\r\n >\r\n <Typography type=\"s5\" color='theme.secondary.800'>{type === 'email' ? 'Emails' : 'PDF'}</Typography>\r\n </Link>\r\n <Typography type=\"s5\" weight='medium' color='theme.secondary.1000'>/</Typography>\r\n <Typography type=\"s5\" weight='medium' color='theme.secondary.1000'>\r\n {mode === 'add' ? 'Add New' : editMode ? 'Edit' : 'Preview'} Template\r\n </Typography>\r\n {templateData && templateData?.name &&\r\n <>\r\n <Typography type=\"s5\" weight='medium' color='theme.secondary.1000'>/</Typography>\r\n <Typography type=\"s5\" weight='medium' color='theme.secondary.1000'>\r\n {templateData?.name}\r\n </Typography>\r\n </>\r\n }\r\n </Box>\r\n\r\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\r\n {/* Zoom Controls - Only show in preview mode */}\r\n {preview && (\r\n <>\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 1,\r\n borderRadius: 1,\r\n bgcolor: 'rgba(74, 192, 140, 0.08)',\r\n border: '1px solid rgba(74, 192, 140, 0.2)',\r\n }}\r\n >\r\n <IconButton\r\n size=\"small\"\r\n onClick={onZoomOut}\r\n disabled={zoom <= 50}\r\n color='#4AC08C'\r\n sx={{\r\n color: '#4AC08C',\r\n '&:hover': {\r\n bgcolor: 'rgba(74, 192, 140, 0.15)',\r\n },\r\n '&.Mui-disabled': {\r\n opacity: 0.3,\r\n color: '#4AC08C'\r\n }\r\n }}\r\n >\r\n <ZoomOut fontSize=\"small\" />\r\n </IconButton>\r\n\r\n <Typography\r\n type=\"s5\"\r\n weight='medium'\r\n sx={{\r\n minWidth: '50px',\r\n textAlign: 'center',\r\n color: '#4AC08C'\r\n }}\r\n >\r\n {zoom}%\r\n </Typography>\r\n\r\n <IconButton\r\n size=\"small\"\r\n onClick={onZoomIn}\r\n disabled={zoom >= 150}\r\n sx={{\r\n color: '#4AC08C',\r\n '&:hover': {\r\n bgcolor: 'rgba(74, 192, 140, 0.15)',\r\n },\r\n '&.Mui-disabled': {\r\n opacity: 0.3,\r\n color: '#4AC08C'\r\n }\r\n }}\r\n >\r\n <ZoomIn fontSize=\"small\" />\r\n </IconButton>\r\n\r\n <Divider\r\n orientation=\"vertical\"\r\n flexItem\r\n sx={{\r\n mx: 0.5,\r\n bgcolor: 'rgba(74, 192, 140, 0.3)'\r\n }}\r\n />\r\n\r\n <IconButton\r\n size=\"small\"\r\n onClick={onResetZoom}\r\n disabled={zoom === 100}\r\n title=\"Reset Zoom\"\r\n sx={{\r\n color: '#4AC08C',\r\n '&:hover': {\r\n bgcolor: 'rgba(74, 192, 140, 0.15)',\r\n },\r\n '&.Mui-disabled': {\r\n opacity: 0.3,\r\n color: '#4AC08C'\r\n }\r\n }}\r\n >\r\n <ZoomOutMap fontSize=\"small\" />\r\n </IconButton>\r\n </Box>\r\n\r\n <Divider orientation=\"vertical\" flexItem sx={{ mx: 1 }} />\r\n </>\r\n )}\r\n\r\n {!fromPreview ? (\r\n <>\r\n <Button\r\n onClick={() => setIsEditingHeaderFooter(true)}\r\n size=\"small\"\r\n variant='outlined'\r\n sx={(theme) => ({ color: `${theme.palette.theme.secondary[1000]} !important` })}\r\n startIcon={<Edit fontSize='small' />}\r\n disabled={preview}\r\n >\r\n Edit Header/Footer\r\n </Button>\r\n <Button\r\n onClick={onPreview}\r\n size=\"small\"\r\n variant='outlined'\r\n sx={(theme) => ({ color: `${theme.palette.theme.secondary[1000]} !important` })}\r\n startIcon={preview ? <EyeOff fontSize='small' /> : <Eye fontSize='small' />}\r\n disabled={!sections?.length}\r\n >\r\n Preview\r\n </Button>\r\n <Button\r\n onClick={onEditHtml}\r\n size=\"small\"\r\n variant={editHtml ? 'contained' : 'outlined'}\r\n color={editHtml ? 'primary' : 'inherit'}\r\n sx={(theme) => ({ color: editHtml ? undefined : `${theme.palette.theme.secondary[1000]} !important` })}\r\n startIcon={<CodeOutlinedIcon fontSize='small' />}\r\n disabled={!sections?.length || preview}\r\n >\r\n {editHtml ? 'Exit HTML Edit' : 'Edit HTML'}\r\n </Button>\r\n <Button\r\n variant=\"contained\"\r\n onClick={onSave}\r\n size=\"small\"\r\n sx={{ boxShadow: 'none' }}\r\n disabled={!sections?.length || isSaving}\r\n >\r\n {isSaving ? 'Saving...' : 'Save'}\r\n </Button>\r\n </>\r\n ) : (\r\n editMode ? (\r\n <>\r\n {isEditingHeaderFooter ? (\r\n <>\r\n <Button\r\n onClick={() => setIsEditingHeaderFooter(false)}\r\n size=\"small\"\r\n variant='outlined'\r\n sx={(theme) => ({ color: `${theme.palette.theme.secondary[1000]} !important` })}\r\n >\r\n Cancel Editing\r\n </Button>\r\n <Button\r\n variant=\"contained\"\r\n onClick={onSaveHeaderFooter}\r\n size=\"small\"\r\n sx={{ boxShadow: 'none' }}\r\n >\r\n Save Changes\r\n </Button>\r\n </>\r\n ) : (\r\n <>\r\n <Button\r\n onClick={() => setIsEditingHeaderFooter(true)}\r\n size=\"small\"\r\n variant='outlined'\r\n sx={(theme) => ({ color: `${theme.palette.theme.secondary[1000]} !important` })}\r\n startIcon={<Edit fontSize='small' />}\r\n disabled={preview}\r\n >\r\n Edit Header/Footer\r\n </Button>\r\n <Button\r\n onClick={onPreview}\r\n size=\"small\"\r\n variant='outlined'\r\n sx={(theme) => ({ color: `${theme.palette.theme.secondary[1000]} !important` })}\r\n startIcon={preview ? <EyeOff fontSize='small' /> : <Eye fontSize='small' />}\r\n disabled={!sections?.length}\r\n >\r\n Preview\r\n </Button>\r\n <Button\r\n variant=\"contained\"\r\n onClick={onSave}\r\n size=\"small\"\r\n sx={{ boxShadow: 'none' }}\r\n disabled={!sections?.length}\r\n >\r\n Save\r\n </Button>\r\n <Button\r\n onClick={() => onEditModeChange && onEditModeChange()}\r\n size=\"small\"\r\n variant='outlined'\r\n sx={(theme) => ({ color: `${theme.palette.theme.secondary[1000]} !important` })}\r\n >\r\n Cancel\r\n </Button>\r\n </>\r\n )}\r\n </>\r\n ) : (\r\n <Button\r\n variant=\"contained\"\r\n onClick={() => onEditModeChange && onEditModeChange()}\r\n size=\"small\"\r\n sx={{ boxShadow: 'none' }}\r\n startIcon={<Edit fontSize='small' />}\r\n disabled={!sections?.length}\r\n >\r\n Edit\r\n </Button>\r\n )\r\n )}\r\n </Stack>\r\n </Toolbar>\r\n </AppBar>\r\n );\r\n};\r\n\r\nexport default EditorHeader;","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n/* eslint-disable react-hooks/exhaustive-deps */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React, { lazy, Suspense } from 'react';\r\n\r\nimport Modal from '../../../components/modal/modal';\r\nimport Typography from '../../../components/typography/typography';\r\nimport Button from '../../../components/button/button';\r\nimport Select from '../../../components/select/select';\r\n\r\nimport {\r\n\tBox,\r\n\tDialogActions,\r\n\tDialogContent,\r\n\tDialogProps,\r\n\tDialogTitle,\r\n\tIconButton,\r\n\tMenuItem\r\n} from '@mui/material';\r\nimport Close from '@mui/icons-material/Close';\r\n\r\nimport './edit-section-modal.scss';\r\nimport { IEmail } from '../utils/types';\r\nconst CustomEditor = lazy(() => import('../../../components/editor/custom-editor'));\r\nimport { SectionData } from '../types/editor';\r\n\r\ninterface EditSectionModalProps {\r\n\tisOpen: boolean;\r\n\tsetIsOpen: (value: boolean) => void;\r\n\tmodalProps: DialogProps;\r\n\tsection: SectionData;\r\n\tplaceholders: Record<string, any>[];\r\n\thandleSave: (e: any) => void;\r\n\thandleAddPlaceholder: (placeholder: string) => void;\r\n\thandleEditorReady: (placeholder: string) => void;\r\n}\r\n\r\nconst EditSectionModal: React.FC<EditSectionModalProps> = ({\r\n\tisOpen,\r\n\tsetIsOpen,\r\n\tmodalProps,\r\n\tsection,\r\n\tplaceholders,\r\n\thandleSave,\r\n\thandleAddPlaceholder,\r\n\thandleEditorReady,\r\n}) => {\r\n\r\n\tconst handleModalClose = () => {\r\n\t\tsetIsOpen(null);\r\n\t};\r\n\r\n\tconst handleContinue = (e) => {\r\n\t\thandleSave(e)\r\n\t}\r\n\r\n\treturn (\r\n\t\t<Modal\r\n\t\t\topen={isOpen}\r\n\t\t\tonClose={handleModalClose}\r\n\t\t\tmaxWidth='lg'\r\n\t\t\tmaxHeight='md'\r\n\t\t\tfullWidth\r\n\t\t\t{...modalProps}>\r\n\t\t\t<DialogTitle className='editSectionModal--DialogTitle'>\r\n\t\t\t\t<Typography type='s3' color='inherit' weight='medium'>\r\n\t\t\t\t\tEdit Content\r\n\t\t\t\t</Typography>\r\n\t\t\t\t<Box display='flex' alignItems={'center'} gap={1} position='absolute' right='1%' top='4px'>\r\n\t\t\t\t\t<Select\r\n\t\t\t\t\t\tdisplayEmpty\r\n\t\t\t\t\t\tvalue=''\r\n\t\t\t\t\t\tsize='small'\r\n\t\t\t\t\t\trenderValue={() => 'Add placeholder'}\r\n\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tbgcolor: 'white',\r\n\t\t\t\t\t\t\tborderRadius: 1,\r\n\t\t\t\t\t\t\t'& .MuiSelect-select': { py: 0.75 }\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonChange={(e) => {\r\n\t\t\t\t\t\t\tif (e.target.value) {\r\n\t\t\t\t\t\t\t\thandleAddPlaceholder(e.target.value as string);\r\n\t\t\t\t\t\t\t\te.target.value = '';\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}}>\r\n\t\t\t\t\t\t{placeholders.map((option) => (\r\n\t\t\t\t\t\t\t<MenuItem key={option.value} value={option.value}>\r\n\t\t\t\t\t\t\t\t<Typography type='s4' color='theme.secondary.1000'>{option.label}</Typography>\r\n\t\t\t\t\t\t\t</MenuItem>\r\n\t\t\t\t\t\t))}\r\n\t\t\t\t\t</Select>\r\n\t\t\t\t\t<IconButton onClick={handleModalClose}>\r\n\t\t\t\t\t\t<Close fontSize='small' />\r\n\t\t\t\t\t</IconButton>\r\n\t\t\t\t</Box>\r\n\t\t\t</DialogTitle>\r\n\t\t\t<DialogContent className='editSectionModal--DialogContents'>\r\n\t\t\t\t<Suspense>\r\n\t\t\t\t\t<CustomEditor handleEditorReady={handleEditorReady} data={section.content}/>\r\n\t\t\t\t</Suspense>\r\n\t\t\t</DialogContent>\r\n\t\t\t<DialogActions className='editSectionModal--DialogAction'>\r\n\t\t\t\t<Box display='flex' gap={1.5}>\r\n\t\t\t\t\t<Button className='editSectionModal--DialogAction--WhiteBtn' onClick={handleModalClose}>Cancel</Button>\r\n\t\t\t\t\t<Button onClick={(e) => handleContinue(e)}>Save</Button>\r\n\t\t\t\t</Box>\r\n\t\t\t</DialogActions>\r\n\t\t</Modal>\r\n\t);\r\n};\r\n\r\nexport default EditSectionModal;\r\n","/* eslint-disable unused-imports/no-unused-vars */\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\n\r\nimport { useCallback, useMemo } from 'react';\r\n\r\n// Enhanced Custom hook for CKEditor style extraction and reverse conversion\r\nexport const useCKEditorStyleExtractor = () => {\r\n // HTML tag to CSS style mappings\r\n const tagStyleMap = useMemo(() => ({\r\n 'i': { fontStyle: 'italic' },\r\n 'em': { fontStyle: 'italic' },\r\n 'b': { fontWeight: 'bold' },\r\n 'strong': { fontWeight: 'bold' },\r\n 'u': { textDecoration: 'underline' },\r\n 's': { textDecoration: 'line-through' },\r\n 'strike': { textDecoration: 'line-through' },\r\n 'del': { textDecoration: 'line-through' },\r\n 'sup': { verticalAlign: 'super', fontSize: 'smaller' },\r\n 'sub': { verticalAlign: 'sub', fontSize: 'smaller' },\r\n 'small': { fontSize: 'smaller' },\r\n 'big': { fontSize: 'larger' },\r\n 'mark': { backgroundColor: 'yellow' },\r\n 'code': { fontFamily: 'monospace' },\r\n 'kbd': { fontFamily: 'monospace', backgroundColor: '#f1f1f1', padding: '2px 4px', borderRadius: '3px' },\r\n 'samp': { fontFamily: 'monospace' },\r\n 'var': { fontStyle: 'italic', fontFamily: 'monospace' }\r\n }), []);\r\n\r\n // Reverse mapping: CSS styles to HTML tags (for reverse conversion)\r\n const styleTagMap = useMemo(() => {\r\n const reverseMap = {};\r\n \r\n // Create reverse mapping with priority for semantic tags\r\n const tagPriority = {\r\n 'fontStyle-italic': 'i',\r\n 'fontWeight-bold': 'b',\r\n 'textDecoration-underline': 'u',\r\n 'textDecoration-line-through': 's',\r\n 'verticalAlign-super': 'sup',\r\n 'verticalAlign-sub': 'sub',\r\n 'fontSize-smaller': 'small',\r\n 'fontSize-larger': 'big',\r\n 'backgroundColor-yellow': 'mark'\r\n };\r\n\r\n Object.entries(tagPriority).forEach(([styleKey, tag]) => {\r\n reverseMap[styleKey] = tag;\r\n });\r\n\r\n return reverseMap;\r\n }, []);\r\n\r\n // CSS property mappings for camelCase conversion\r\n const cssPropertyMap = useMemo(() => ({\r\n 'font-family': 'fontFamily',\r\n 'font-size': 'fontSize',\r\n 'font-weight': 'fontWeight',\r\n 'font-style': 'fontStyle',\r\n 'text-align': 'textAlign',\r\n 'text-decoration': 'textDecoration',\r\n 'text-transform': 'textTransform',\r\n 'line-height': 'lineHeight',\r\n 'letter-spacing': 'letterSpacing',\r\n 'word-spacing': 'wordSpacing',\r\n 'color': 'color',\r\n 'background-color': 'backgroundColor',\r\n 'background-image': 'backgroundImage',\r\n 'background-size': 'backgroundSize',\r\n 'background-position': 'backgroundPosition',\r\n 'background-repeat': 'backgroundRepeat',\r\n 'border': 'border',\r\n 'border-color': 'borderColor',\r\n 'border-width': 'borderWidth',\r\n 'border-style': 'borderStyle',\r\n 'border-radius': 'borderRadius',\r\n 'margin': 'margin',\r\n 'margin-top': 'marginTop',\r\n 'margin-right': 'marginRight',\r\n 'margin-bottom': 'marginBottom',\r\n 'margin-left': 'marginLeft',\r\n 'padding': 'padding',\r\n 'padding-top': 'paddingTop',\r\n 'padding-right': 'paddingRight',\r\n 'padding-bottom': 'paddingBottom',\r\n 'padding-left': 'paddingLeft',\r\n 'width': 'width',\r\n 'height': 'height',\r\n 'max-width': 'maxWidth',\r\n 'max-height': 'maxHeight',\r\n 'min-width': 'minWidth',\r\n 'min-height': 'minHeight',\r\n 'display': 'display',\r\n 'position': 'position',\r\n 'top': 'top',\r\n 'right': 'right',\r\n 'bottom': 'bottom',\r\n 'left': 'left',\r\n 'float': 'float',\r\n 'clear': 'clear',\r\n 'overflow': 'overflow',\r\n 'opacity': 'opacity',\r\n 'z-index': 'zIndex',\r\n 'box-shadow': 'boxShadow',\r\n 'text-shadow': 'textShadow',\r\n 'vertical-align': 'verticalAlign'\r\n }), []);\r\n\r\n // Convert CSS property to camelCase\r\n const toCamelCase = useCallback((property) => {\r\n return cssPropertyMap[property] || \r\n property.replace(/-([a-z])/g, (match, letter) => letter.toUpperCase());\r\n }, [cssPropertyMap]);\r\n\r\n // Convert camelCase to kebab-case\r\n const toKebabCase = useCallback((property) => {\r\n return property.replace(/([A-Z])/g, '-$1').toLowerCase();\r\n }, []);\r\n\r\n // Parse inline styles from element.style object\r\n const parseInlineStyles = useCallback((styleDeclaration) => {\r\n const styles = {};\r\n\r\n for (let i = 0; i < styleDeclaration.length; i++) {\r\n const property = styleDeclaration[i];\r\n const value = styleDeclaration.getPropertyValue(property);\r\n \r\n if (value) {\r\n const camelCaseProperty = toCamelCase(property);\r\n styles[camelCaseProperty] = value.trim();\r\n }\r\n }\r\n\r\n return styles;\r\n }, [toCamelCase]);\r\n\r\n // Extract styles based on semantic HTML tags\r\n const extractTagStyles = useCallback((element) => {\r\n const tagName = element.tagName.toLowerCase();\r\n return tagStyleMap[tagName] || {};\r\n }, [tagStyleMap]);\r\n\r\n // Extract nested/inherited styles from parent elements\r\n const extractNestedStyles = useCallback((element) => {\r\n const nestedStyles = {};\r\n let currentElement = element.parentElement;\r\n\r\n // Traverse up the DOM tree to collect inherited styles\r\n while (currentElement && currentElement.tagName !== 'BODY') {\r\n const tagName = currentElement.tagName.toLowerCase();\r\n \r\n // Add tag-based styles from parents\r\n if (tagStyleMap[tagName]) {\r\n Object.entries(tagStyleMap[tagName]).forEach(([prop, value]) => {\r\n // Only add if not already defined (child takes precedence)\r\n if (!nestedStyles[prop]) {\r\n nestedStyles[prop] = value;\r\n }\r\n });\r\n }\r\n\r\n // Add inline styles from parents that can be inherited\r\n if (currentElement.style.length > 0) {\r\n const inheritableProps = ['color', 'fontFamily', 'fontSize', 'lineHeight', 'textAlign'];\r\n const parentStyles = parseInlineStyles(currentElement.style);\r\n \r\n inheritableProps.forEach(prop => {\r\n if (parentStyles[prop] && !nestedStyles[prop]) {\r\n nestedStyles[prop] = parentStyles[prop];\r\n }\r\n });\r\n }\r\n\r\n currentElement = currentElement.parentElement;\r\n }\r\n\r\n return nestedStyles;\r\n }, [tagStyleMap, parseInlineStyles]);\r\n\r\n // Extract image-specific styles\r\n const extractImageStyles = useCallback((imgElement, styleData) => {\r\n const imageStyles = {};\r\n\r\n if (imgElement.width) imageStyles.width = `${imgElement.width}px`;\r\n if (imgElement.height) imageStyles.height = `${imgElement.height}px`;\r\n if (imgElement.getAttribute('align')) {\r\n imageStyles.textAlign = imgElement.getAttribute('align');\r\n }\r\n\r\n // Merge with existing styles\r\n Object.assign(styleData.styles, imageStyles);\r\n \r\n // Add image-specific metadata\r\n styleData.src = imgElement.src;\r\n styleData.alt = imgElement.alt;\r\n }, []);\r\n\r\n // Main extraction function\r\n const extractStyles = useCallback((editorContent, options = {}) => {\r\n const {\r\n includeInlineStyles = true,\r\n includeTagStyles = true,\r\n includeComputedStyles = false,\r\n groupByElement = false,\r\n filterEmptyStyles = true,\r\n mergeNestedStyles = true\r\n } = options;\r\n\r\n // Create a temporary DOM element to parse the content\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = editorContent;\r\n\r\n const results = [];\r\n const elements = tempDiv.querySelectorAll('*');\r\n\r\n elements.forEach((element, index) => {\r\n const styleData = {\r\n elementType: element.tagName.toLowerCase(),\r\n elementIndex: index,\r\n className: element.className || null,\r\n id: element.id || null,\r\n styles: {},\r\n textContent: element.textContent?.trim() || null\r\n };\r\n\r\n // Extract inline styles\r\n if (includeInlineStyles && element.style.length > 0) {\r\n styleData.styles = { ...styleData.styles, ...parseInlineStyles(element.style) };\r\n }\r\n\r\n // Extract semantic tag styles (like <i>, <b>, etc.)\r\n if (includeTagStyles) {\r\n const tagStyles = extractTagStyles(element);\r\n styleData.styles = { ...styleData.styles, ...tagStyles };\r\n }\r\n\r\n // Extract nested styling context\r\n if (mergeNestedStyles) {\r\n const nestedStyles = extractNestedStyles(element);\r\n styleData.styles = { ...styleData.styles, ...nestedStyles };\r\n styleData.inheritedStyles = nestedStyles;\r\n }\r\n\r\n // Handle special cases for images\r\n if (element.tagName.toLowerCase() === 'img') {\r\n extractImageStyles(element, styleData);\r\n }\r\n\r\n // Filter empty styles if requested\r\n if (filterEmptyStyles && Object.keys(styleData.styles).length === 0 && !styleData.textContent) {\r\n return;\r\n }\r\n\r\n results.push(styleData);\r\n });\r\n\r\n return results;\r\n }, [parseInlineStyles, extractTagStyles, extractNestedStyles, extractImageStyles]);\r\n\r\n // Extract styles specifically for formatting tags\r\n const extractFormattingStyles = useCallback((editorContent) => {\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = editorContent;\r\n \r\n const formattingTags = ['i', 'em', 'b', 'strong', 'u', 's', 'strike', 'del', 'sup', 'sub'];\r\n const formattingStyles = {};\r\n\r\n formattingTags.forEach(tag => {\r\n const elements = tempDiv.querySelectorAll(tag);\r\n elements.forEach((element, index) => {\r\n const key = `${tag}_${index}`;\r\n formattingStyles[key] = {\r\n ...tagStyleMap[tag],\r\n textContent: element.textContent,\r\n };\r\n });\r\n });\r\n\r\n return formattingStyles;\r\n }, [tagStyleMap]);\r\n\r\n // NEW: Convert styles object to HTML with semantic tags\r\n const stylesToHtml = useCallback((text, styles = {}, options = {}) => {\r\n const {\r\n preferSemanticTags = true,\r\n wrapInParagraph = true,\r\n preserveWhitespace = true\r\n } = options;\r\n\r\n if (!text || typeof text !== 'string') {\r\n return '';\r\n }\r\n\r\n let wrappedText = text;\r\n const inlineStyles = {};\r\n\r\n // Process each style property\r\n Object.entries(styles).forEach(([property, value]) => {\r\n const styleKey = `${property}-${value}`;\r\n \r\n // Check if this style can be converted to a semantic tag\r\n if (preferSemanticTags && styleTagMap[styleKey]) {\r\n const tag = styleTagMap[styleKey];\r\n wrappedText = `<${tag}>${wrappedText}</${tag}>`;\r\n } else {\r\n // Add to inline styles for non-semantic styles\r\n inlineStyles[property] = value;\r\n }\r\n });\r\n\r\n // Apply remaining inline styles\r\n if (Object.keys(inlineStyles).length > 0) {\r\n const styleAttr = Object.entries(inlineStyles)\r\n .map(([prop, val]) => `${toKebabCase(prop)}: ${val}`)\r\n .join('; ');\r\n \r\n wrappedText = `<span style=\"${styleAttr}\">${wrappedText}</span>`;\r\n }\r\n\r\n // Wrap in paragraph if requested\r\n if (wrapInParagraph) {\r\n wrappedText = `<p>${wrappedText}</p>`;\r\n }\r\n\r\n return wrappedText;\r\n }, [styleTagMap, toKebabCase]);\r\n\r\n // NEW: Convert multiple styled text segments to HTML\r\n const multipleStylesToHtml = useCallback((segments, options = {}) => {\r\n const {\r\n wrapInContainer = true,\r\n containerTag = 'div',\r\n separateElements = false\r\n } = options;\r\n\r\n if (!Array.isArray(segments)) {\r\n return '';\r\n }\r\n\r\n const htmlSegments = segments.map(segment => {\r\n const { text, styles = {}, wrapInParagraph = false } = segment;\r\n return stylesToHtml(text, styles, { ...options, wrapInParagraph });\r\n });\r\n\r\n let result = separateElements ? htmlSegments.join('\\n') : htmlSegments.join(' ');\r\n\r\n if (wrapInContainer) {\r\n result = `<${containerTag}>${result}</${containerTag}>`;\r\n }\r\n\r\n return result;\r\n }, [stylesToHtml]);\r\n\r\n // NEW: Apply styles to existing HTML content\r\n const applyStylesToHtml = useCallback((htmlContent, styles = {}, targetSelector = '*') => {\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = htmlContent;\r\n\r\n const targetElements = targetSelector === '*' \r\n ? tempDiv.querySelectorAll('*') \r\n : tempDiv.querySelectorAll(targetSelector);\r\n\r\n targetElements.forEach(element => {\r\n Object.entries(styles).forEach(([property, value]) => {\r\n const styleKey = `${property}-${value}`;\r\n \r\n // Check if this style should be converted to semantic tag\r\n if (styleTagMap[styleKey]) {\r\n const tag = styleTagMap[styleKey];\r\n const wrapper = document.createElement(tag);\r\n \r\n // Move the element's content to the wrapper\r\n while (element.firstChild) {\r\n wrapper.appendChild(element.firstChild);\r\n }\r\n \r\n element.appendChild(wrapper);\r\n } else {\r\n // Apply as inline style\r\n const kebabProperty = toKebabCase(property);\r\n element.style[kebabProperty] = value;\r\n }\r\n });\r\n });\r\n\r\n return tempDiv.innerHTML;\r\n }, [styleTagMap, toKebabCase]);\r\n\r\n // NEW: Extract and convert - one-step process\r\n const extractAndConvert = useCallback((editorContent, targetStyles = {}) => {\r\n const extracted = extractStyles(editorContent);\r\n const converted = {};\r\n\r\n extracted.forEach(item => {\r\n const key = item.className || item.id || `${item.elementType}_${item.elementIndex}`;\r\n const mergedStyles = { ...item.styles, ...targetStyles };\r\n \r\n if (item.textContent) {\r\n converted[key] = stylesToHtml(item.textContent, mergedStyles, { wrapInParagraph: false });\r\n }\r\n });\r\n\r\n return converted;\r\n }, [extractStyles, stylesToHtml]);\r\n\r\n // Generate CSS string from extracted styles\r\n const generateCSS = useCallback((extractedStyles) => {\r\n let css = '';\r\n \r\n extractedStyles.forEach((item, index) => {\r\n const selector = item.className \r\n ? `.${item.className}` \r\n : item.id \r\n ? `#${item.id}` \r\n : `${item.elementType}-${index}`;\r\n\r\n const styleRules = Object.entries(item.styles)\r\n .map(([prop, value]) => ` ${toKebabCase(prop)}: ${value};`)\r\n .join('\\n');\r\n\r\n if (styleRules) {\r\n css += `${selector} {\\n${styleRules}\\n}\\n\\n`;\r\n }\r\n });\r\n\r\n return css;\r\n }, [toKebabCase]);\r\n\r\n // Get flattened styles object\r\n const getFlattenedStyles = useCallback((extractedStyles) => {\r\n const flattened = {};\r\n \r\n extractedStyles.forEach((item, index) => {\r\n const prefix = item.className || item.id || `${item.elementType}_${index}`;\r\n Object.entries(item.styles).forEach(([prop, value]) => {\r\n flattened[`${prefix}_${prop}`] = value;\r\n });\r\n });\r\n\r\n return flattened;\r\n }, []);\r\n\r\n const getSingleStyles = useCallback((extractedStyles) => {\r\n const flattened = {};\r\n \r\n extractedStyles.forEach((item, index) => {\r\n // const prefix = item.className || item.id || `${item.elementType}_${index}`;\r\n Object.entries(item.styles).forEach(([prop, value]) => {\r\n flattened[prop] = value;\r\n });\r\n });\r\n\r\n return flattened;\r\n }, []);\r\n\r\n return {\r\n // Original functions\r\n extractStyles,\r\n extractFormattingStyles,\r\n generateCSS,\r\n getFlattenedStyles,\r\n getSingleStyles,\r\n \r\n \r\n // New reverse conversion functions\r\n stylesToHtml,\r\n multipleStylesToHtml,\r\n applyStylesToHtml,\r\n extractAndConvert\r\n };\r\n};","import { useCallback, useRef } from 'react';\r\n\r\n/**\r\n * Custom hook for debouncing section content updates\r\n * @param callback - The function to debounce\r\n * @param delay - Delay in milliseconds (default: 300ms)\r\n * @returns Debounced function\r\n */\r\nexport const useDebouncedUpdate = <T extends (...args: any[]) => void>(\r\n callback: T,\r\n delay: number = 300\r\n): T => {\r\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\r\n\r\n const debouncedCallback = useCallback(\r\n (...args: Parameters<T>) => {\r\n // Clear existing timeout\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n\r\n // Set new timeout\r\n timeoutRef.current = setTimeout(() => {\r\n callback(...args);\r\n }, delay);\r\n },\r\n [callback, delay]\r\n ) as T;\r\n\r\n return debouncedCallback;\r\n};\r\n","/* eslint-disable react-hooks/exhaustive-deps */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React, { useRef, useState, lazy, Suspense, useCallback, useMemo } from 'react';\r\nimport { useDraggable, useDroppable } from '@dnd-kit/core';\r\nimport {\r\n\tBox,\r\n\tPaper,\r\n\tMenuItem,\r\n\tFormControl,\r\n\tIconButton,\r\n\tFade,\r\n\tFormControlLabel,\r\n\tSkeleton\r\n} from '@mui/material';\r\nimport DragIndicatorIcon from '@mui/icons-material/DragIndicator';\r\nimport SplitIcon from '@mui/icons-material/CallSplit';\r\nimport { SectionData } from '../types/editor';\r\nimport { Edit, Save, Trash } from '../../../components/icons';\r\nimport Select from '../../../components/select/select';\r\nimport Typography from '../../../components/typography/typography';\r\nimport EditSectionModal from '../edit-section-modal/edit-section-modal';\r\nimport Checkbox from '../../../components/checkbox/checkbox';\r\nimport Chip from '../../../components/chip/chip';\r\nimport Close from '@mui/icons-material/Close';\r\nimport { useCKEditorStyleExtractor } from '../utils/style-extractor';\r\nimport { useDebouncedUpdate } from '../hooks/useDebouncedUpdate';\r\n\r\nconst CustomEditor = lazy(() => import('../../../components/editor/custom-editor'));\r\n\r\ninterface EditorSectionProps {\r\n\tsection: SectionData;\r\n\tisSelected: boolean;\r\n\tisDragging: boolean;\r\n\tisOver: boolean;\r\n\tonSelect: () => void;\r\n\tonUpdate: (content: string, options?: any) => void;\r\n\tonSplit: (content1: string, content2: string) => void;\r\n\tonDelete: () => void;\r\n\tplaceholders: Array<{ value: string; label: string }>;\r\n\tsetIsSectionEditing:(value: boolean)=> void;\r\n}\r\n\r\nconst editableSections = ['text', 'text-block', 'heading', 'heading-1', 'heading-2', 'heading-3', 'heading-4'];\r\n\r\nconst EditorSection: React.FC<EditorSectionProps> = ({\r\n\tsection,\r\n\tisSelected,\r\n\tisDragging,\r\n\tisOver,\r\n\tonSelect,\r\n\tonUpdate,\r\n\tonSplit,\r\n\tonDelete,\r\n\tplaceholders,\r\n\tsetIsSectionEditing\r\n}) => {\r\n\tconst { extractStyles, getSingleStyles } = useCKEditorStyleExtractor();\r\n\r\n\tconst {\r\n\t\tattributes,\r\n\t\tlisteners,\r\n\t\tsetNodeRef: setDraggableRef,\r\n\t\ttransform\r\n\t} = useDraggable({ id: section.id });\r\n\r\n\tconst { setNodeRef: setDroppableRef } = useDroppable({ id: section.id });\r\n\tconst [isEditing, setIsEditing] = useState(false);\r\n\tconst [isHovered, setIsHovered] = useState(false);\r\n\tconst [isOpenEditSectionModal, setIsOpenEditSectionModal] = useState(false);\r\n\tconst [isEditedFromSource, setIsEditedFromSource] = useState(Boolean(section?.is_edited_from_source));\r\n\tconst [localContent, setLocalContent] = useState(section.content);\r\n\tconst [hasUserEdited, setHasUserEdited] = useState(false); // Track if user actually made changes\r\n\tconst editorRef = useRef<any>(null);\r\n\tconst mouseHoverTimeoutRef = useRef<number | null>(null);\r\n\tconst cursorPositionRef = useRef<{ from: number; to: number } | null>(null);\r\n\tconst isRestoringCursorRef = useRef(false);\r\n\t\r\n\t// Ref-based content tracking for contentEditable optimization\r\n\t// This ref tracks content changes without triggering re-renders during editing,\r\n\t// improving performance and preventing cursor position loss\r\n\tconst contentRef = useRef<string>(section.content);\r\n\tconst originalContentRef = useRef<string>(section.content); // Store original content\r\n\r\n\t// Create debounced version of onUpdate with 300ms delay\r\n\tconst debouncedUpdate = useDebouncedUpdate(onUpdate, 300);\r\n\r\n\t// Memoize style calculation\r\n\tconst style = useMemo(() => {\r\n\t\treturn transform\r\n\t\t\t? {\r\n\t\t\t\t\ttransform: `translate3d(${transform.x}px, ${transform.y}px, 0)`,\r\n\t\t\t\t\ttransition: 'none'\r\n\t\t\t\t}\r\n\t\t\t: { transition: 'all 0.2s ease' };\r\n\t}, [transform]);\r\n\r\n\t// Memoize sx prop for Paper to prevent re-creation\r\n\tconst paperSx = useMemo(() => ({\r\n\t\tposition: 'relative',\r\n\t\tborder: '1px dashed',\r\n\t\tborderColor: isSelected ? 'primary.main' : isOver ? 'primary.main' : 'grey.400',\r\n\t\tborderRadius: 1,\r\n\t\tbgcolor: 'white',\r\n\t\topacity: isDragging ? 0.7 : 1,\r\n\t\tboxShadow: 'none',\r\n\t\ttransition: 'all 0.2s ease',\r\n\t\t'&:hover': {\r\n\t\t\tboxShadow: 'none'\r\n\t\t},\r\n\t\t...(isOver && { borderColor: 'primary.main', boxShadow: 'none' })\r\n\t}), [isSelected, isOver, isDragging]);\r\n\r\n\t// Memoize merged ref to prevent re-creation\r\n\tconst mergedRef = useCallback((node: HTMLElement | null) => {\r\n\t\tsetDraggableRef(node);\r\n\t\tsetDroppableRef(node);\r\n\t}, [setDraggableRef, setDroppableRef]);\r\n\r\n\t// Memoize event handlers\r\n\tconst handleDblClick = useCallback(() => {\r\n\t\tif (editableSections.includes(section.type)) {\r\n\t\t\thandleEditing();\r\n\t\t}\r\n\t}, [section.type]);\r\n\r\n\tconst handleEditing = useCallback(() => {\r\n\t\t// Store original content when entering edit mode\r\n\t\toriginalContentRef.current = section.content;\r\n\t\tsetHasUserEdited(false);\r\n\t\t\r\n\t\tif (section?.isSplitPair) {\r\n\t\t\tsetIsOpenEditSectionModal(true);\r\n\t\t} else {\r\n\t\t\tsetIsEditing(true);\r\n\t\t\tsetIsSectionEditing(true);\r\n\t\t}\r\n\t}, [section?.isSplitPair, section.content, setIsSectionEditing]);\r\n\r\n\tconst handleEditorReady = useCallback((editor: any) => {\r\n\t\teditorRef.current = editor;\r\n\t\t\r\n\t\t// Track cursor position changes in the editor\r\n\t\tif (editor?._tiptap) {\r\n\t\t\teditor._tiptap.on('selectionUpdate', () => {\r\n\t\t\t\tif (!isRestoringCursorRef.current && editor._tiptap) {\r\n\t\t\t\t\tconst { from, to } = editor._tiptap.state.selection;\r\n\t\t\t\t\tcursorPositionRef.current = { from, to };\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\t\r\n\t\t\t// Track when user actually makes changes\r\n\t\t\teditor._tiptap.on('update', ({ transaction }) => {\r\n\t\t\t\t// Only mark as edited if the transaction actually changed the document\r\n\t\t\t\tif (transaction.docChanged) {\r\n\t\t\t\t\tsetHasUserEdited(true);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst handleSave = useCallback((e: React.MouseEvent) => {\r\n\t\te.stopPropagation();\r\n\t\tif (editorRef.current) {\r\n\t\t\t// Save cursor position before getting content\r\n\t\t\tif (editorRef.current._tiptap) {\r\n\t\t\t\tconst { from, to } = editorRef.current._tiptap.state.selection;\r\n\t\t\t\tcursorPositionRef.current = { from, to };\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// Get content from editor\r\n\t\t\t// Use getData() which returns sourceCodeRef.current from CustomEditor\r\n\t\t\t// This preserves the HTML structure better than getHTML()\r\n\t\t\tconst content = editorRef.current.getData();\r\n\t\t\t\r\n\t\t\t// Update ref immediately for instant tracking\r\n\t\t\tcontentRef.current = content;\r\n\t\t\t\r\n\t\t\t// Update local state for UI feedback\r\n\t\t\tsetLocalContent(content);\r\n\t\t\t\r\n\t\t\tconst styles = extractStyles(section.content, {\r\n\t\t\t\tincludeTagStyles: true,\r\n\t\t\t\tincludeInlineStyles: true,\r\n\t\t\t\tmergeNestedStyles: true,\r\n\t\t\t\tfilterEmptyStyles: true\r\n\t\t\t});\r\n\t\t\tconst single = getSingleStyles(styles);\r\n\t\t\t// Merge styles safely\r\n\t\t\tconst mergedStyles = {\r\n\t\t\t\t...(section.attributes?.styles || {}),\r\n\t\t\t\t...single\r\n\t\t\t};\r\n\t\r\n\t\t\t// Merge attributes, giving priority to new props\r\n\t\t\tconst mergedAttributes = {\r\n\t\t\t\t...(section.attributes || {}),\r\n\t\t\t\tstyles: mergedStyles,\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\t// Use debounced update to prevent excessive re-renders and API calls\r\n\t\t\tdebouncedUpdate(content, { is_edited_from_source: isEditedFromSource, attributes: mergedAttributes });\r\n\t\t}\r\n\t\tsetIsEditing(false);\r\n\t\tsetIsSectionEditing(false)\r\n\t\tsetIsOpenEditSectionModal(false);\r\n\t\tsetHasUserEdited(false); // Reset edit flag\r\n\t}, [debouncedUpdate, isEditedFromSource, extractStyles, getSingleStyles, section.content, section.attributes, setIsSectionEditing, hasUserEdited]);\r\n\r\n\tconst handleSplit = useCallback(() => {\r\n\t\tconst content = section.content || '';\r\n\t\tconst firstHalf = content;\r\n\t\tconst secondHalf = '';\r\n\t\tonSplit(firstHalf, secondHalf);\r\n\t}, [section.content, onSplit]);\r\n\r\n\tconst handleAddPlaceholder = useCallback((placeholder: string) => {\r\n\t\tif (editorRef.current) {\r\n\t\t\tconst viewFragment = editorRef.current.data.processor.toView(\r\n\t\t\t\t`{{${placeholder}}}`\r\n\t\t\t);\r\n\t\t\tconst modelFragment = editorRef.current.data.toModel(viewFragment);\r\n\t\t\teditorRef.current.model.insertContent(modelFragment);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst handleMouseEnter = useCallback(() => {\r\n\t\tif (mouseHoverTimeoutRef.current !== null) {\r\n\t\t\twindow.clearTimeout(mouseHoverTimeoutRef.current);\r\n\t\t}\r\n\t\tmouseHoverTimeoutRef.current = window.setTimeout(() => {\r\n\t\t\tsetIsHovered(true);\r\n\t\t}, 50);\r\n\t}, []);\r\n\r\n\tconst handleMouseLeave = useCallback(() => {\r\n\t\tif (mouseHoverTimeoutRef.current !== null) {\r\n\t\t\twindow.clearTimeout(mouseHoverTimeoutRef.current);\r\n\t\t}\r\n\t\tmouseHoverTimeoutRef.current = window.setTimeout(() => {\r\n\t\t\tsetIsHovered(false);\r\n\t\t}, 50);\r\n\t}, []);\r\n\r\n\tconst handleClick = useCallback((e: React.MouseEvent) => {\r\n\t\te.stopPropagation();\r\n\t\tonSelect();\r\n\t}, [onSelect]);\r\n\r\n\tconst handleDeleteClick = useCallback((e: React.MouseEvent) => {\r\n\t\te.stopPropagation();\r\n\t\tonDelete();\r\n\t}, [onDelete]);\r\n\r\n\tconst handleCancelEdit = useCallback(() => {\r\n\t\tsetIsEditing(false);\r\n\t\tsetIsSectionEditing(false)\r\n\t}, [setIsSectionEditing]);\r\n\r\n\tconst handleCheckboxChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n\t\tsetIsEditedFromSource(e.target.checked);\r\n\t}, []);\r\n\r\n\tconst handleSelectChange = useCallback((e: any) => {\r\n\t\tif (e.target.value) {\r\n\t\t\thandleAddPlaceholder(e.target.value as string);\r\n\t\t\te.target.value = '';\r\n\t\t}\r\n\t}, [handleAddPlaceholder]);\r\n\r\n\t// Cleanup function for hover timeout\r\n\tReact.useEffect(() => {\r\n\t\treturn () => {\r\n\t\t\tif (mouseHoverTimeoutRef.current !== null) {\r\n\t\t\t\twindow.clearTimeout(mouseHoverTimeoutRef.current);\r\n\t\t\t}\r\n\t\t};\r\n\t}, []);\r\n\r\n\t// Sync local content with section content when it changes externally\r\n\t// and restore cursor position if editor is focused\r\n\tReact.useEffect(() => {\r\n\t\t// Only update if content actually changed from external source\r\n\t\t// Skip if we're currently editing (content changes come from user input)\r\n\t\tif (contentRef.current === section.content) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t\r\n\t\t// Update both ref and state for consistency\r\n\t\tcontentRef.current = section.content;\r\n\t\tsetLocalContent(section.content);\r\n\t\t\r\n\t\t// Only restore cursor position if:\r\n\t\t// 1. Editor is active (isEditing)\r\n\t\t// 2. Content change came from external source (not from user typing)\r\n\t\t// 3. We're not currently in the middle of restoring cursor\r\n\t\tif (isEditing && editorRef.current?._tiptap && cursorPositionRef.current && !isRestoringCursorRef.current) {\r\n\t\t\tconst editor = editorRef.current._tiptap;\r\n\t\t\tconst { from, to } = cursorPositionRef.current;\r\n\t\t\t\r\n\t\t\t// Use requestAnimationFrame to ensure DOM has updated\r\n\t\t\trequestAnimationFrame(() => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tisRestoringCursorRef.current = true;\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Validate that the cursor position is still valid after content update\r\n\t\t\t\t\tconst docSize = editor.state.doc.content.size;\r\n\t\t\t\t\tconst validFrom = Math.min(from, docSize);\r\n\t\t\t\t\tconst validTo = Math.min(to, docSize);\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Restore selection\r\n\t\t\t\t\teditor.commands.setTextSelection({ from: validFrom, to: validTo });\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Ensure editor maintains focus\r\n\t\t\t\t\tif (!editor.isFocused) {\r\n\t\t\t\t\t\teditor.commands.focus();\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\tconsole.warn('Failed to restore cursor position:', error);\r\n\t\t\t\t} finally {\r\n\t\t\t\t\tisRestoringCursorRef.current = false;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}, [section.content, isEditing]);\r\n\r\n\t// Memoize content rendering to prevent unnecessary re-renders\r\n\t// Only re-render when isEditing state changes or when not editing and localContent changes\r\n\tconst contentRenderer = useMemo(() => {\r\n\t\tif (isEditing) {\r\n\t\t\treturn (\r\n\t\t\t\t<Suspense fallback={<Skeleton />}>\r\n\t\t\t\t\t<CustomEditor \r\n\t\t\t\t\t\tkey={`editor-${section.id}`}\r\n\t\t\t\t\t\teditorRef={editorRef}\r\n\t\t\t\t\t\thandleEditorReady={handleEditorReady} \r\n\t\t\t\t\t\tdata={localContent}\r\n\t\t\t\t\t\tonError={(error: Error) => console.error('Editor error:', error)}\r\n\t\t\t\t\t/>\r\n\t\t\t\t</Suspense>\r\n\t\t\t);\r\n\t\t}\r\n\t\t\r\n\t\treturn (\r\n\t\t\t<Box\r\n\t\t\t\tdangerouslySetInnerHTML={{ __html: localContent }}\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tposition: 'relative',\r\n\t\t\t\t\tpy: section.type === 'divider' ? 1 : 0,\r\n\t\t\t\t\tlineHeight: 1.6,\r\n\t\t\t\t\t'& p': { margin: 0 }\r\n\t\t\t\t}}\r\n\t\t\t/>\r\n\t\t);\r\n\t}, [isEditing, localContent, section.type, section.id]);\r\n\r\n\t// Memoize placeholder options\r\n\tconst placeholderOptions = useMemo(() => \r\n\t\tplaceholders.map((option) => (\r\n\t\t\t<MenuItem key={option.value} value={option.value}>\r\n\t\t\t\t<Typography type='s4' color='theme.secondary.1000'>{option.label}</Typography>\r\n\t\t\t</MenuItem>\r\n\t\t))\r\n\t, [placeholders]);\r\n\r\n\treturn (\r\n\t\t<Paper\r\n\t\t\tref={mergedRef}\r\n\t\t\tstyle={style}\r\n\t\t\televation={isHovered || isSelected ? 3 : 1}\r\n\t\t\tsx={paperSx}\r\n\t\t\tonClick={handleClick}\r\n\t\t\tonDoubleClick={handleDblClick}\r\n\t\t\tonMouseEnter={handleMouseEnter}\r\n\t\t\tonMouseLeave={handleMouseLeave}>\r\n\t\t\t{isOver && !isDragging && (\r\n\t\t\t\t<Box\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\tposition: 'absolute',\r\n\t\t\t\t\t\ttop: 0,\r\n\t\t\t\t\t\tleft: 0,\r\n\t\t\t\t\t\tright: 0,\r\n\t\t\t\t\t\tbottom: 0,\r\n\t\t\t\t\t\tborder: '2px dashed',\r\n\t\t\t\t\t\tborderColor: 'primary.main',\r\n\t\t\t\t\t\tborderRadius: 1,\r\n\t\t\t\t\t\tbgcolor: 'rgba(25, 118, 210, 0.04)',\r\n\t\t\t\t\t\tzIndex: 10,\r\n\t\t\t\t\t\tdisplay: 'flex',\r\n\t\t\t\t\t\talignItems: 'center',\r\n\t\t\t\t\t\tjustifyContent: 'center',\r\n\t\t\t\t\t\tpointerEvents: 'none'\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t<Typography type='s2' color='primary' weight='medium'>Drop here</Typography>\r\n\t\t\t\t</Box>\r\n\t\t\t)}\r\n\t\t\t<Box\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tbgcolor: 'grey.50',\r\n\t\t\t\t\tp: 1,\r\n\t\t\t\t\tdisplay: 'flex',\r\n\t\t\t\t\talignItems: 'center',\r\n\t\t\t\t\tjustifyContent: 'space-between',\r\n\t\t\t\t\tborderBottom: '1px solid',\r\n\t\t\t\t\tborderColor: 'grey.200'\r\n\t\t\t\t}}>\r\n\t\t\t\t<Box\r\n\t\t\t\t\t{...listeners}\r\n\t\t\t\t\t{...attributes}\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\tdisplay: 'flex',\r\n\t\t\t\t\t\talignItems: 'center',\r\n\t\t\t\t\t\tcursor: 'grab',\r\n\t\t\t\t\t\tpx: 1,\r\n\t\t\t\t\t\tpy: 0.5,\r\n\t\t\t\t\t\tborderRadius: 1,\r\n\t\t\t\t\t\ttransition: 'background-color 0.2s ease',\r\n\t\t\t\t\t\t'&:hover': { bgcolor: 'grey.100' },\r\n\t\t\t\t\t\t'&:active': { cursor: 'grabbing' }\r\n\t\t\t\t\t}}>\r\n\t\t\t\t\t<DragIndicatorIcon\r\n\t\t\t\t\t\tsx={{ color: 'grey.600', fontSize: '1.2rem', mr: 0.5 }}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<Typography type='s3' color='theme.secondary.600' weight='medium'>Move</Typography>\r\n\t\t\t\t</Box>\r\n\t\t\t\t<Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\r\n\t\t\t\t\t{isEditing ? (\r\n\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t<FormControlLabel control={\r\n\t\t\t\t\t\t\t\t<Checkbox \r\n\t\t\t\t\t\t\t\t\tonChange={handleCheckboxChange} \r\n\t\t\t\t\t\t\t\t\tdefaultChecked={isEditedFromSource}/>} \r\n\t\t\t\t\t\t\t\t\tlabel={<Typography type='s2' color='theme.secondary.1000'>Edited from source</Typography>} />\r\n\t\t\t\t\t\t\t<FormControl size='small' sx={{ minWidth: 160 }}>\r\n\t\t\t\t\t\t\t\t<Select\r\n\t\t\t\t\t\t\t\t\tdisplayEmpty\r\n\t\t\t\t\t\t\t\t\tvalue=''\r\n\t\t\t\t\t\t\t\t\tsize='small'\r\n\t\t\t\t\t\t\t\t\trenderValue={() => 'Add placeholder...'}\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tbgcolor: 'white',\r\n\t\t\t\t\t\t\t\t\t\tborderRadius: 1,\r\n\t\t\t\t\t\t\t\t\t\t'& .MuiSelect-select': { py: 0.75 }\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\tonChange={handleSelectChange}>\r\n\t\t\t\t\t\t\t\t\t{placeholderOptions}\r\n\t\t\t\t\t\t\t\t</Select>\r\n\t\t\t\t\t\t\t</FormControl>\r\n\t\t\t\t\t\t\t<Box>\r\n\t\t\t\t\t\t\t\t<IconButton size='small' onClick={handleSave}>\r\n\t\t\t\t\t\t\t\t\t<Save fontSize='small' color='inherit' />\r\n\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t\t<IconButton size='small' onClick={handleCancelEdit} color='error'>\r\n\t\t\t\t\t\t\t\t\t<Close fontSize='small' color='inherit' />\r\n\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t</>\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<Fade in={isHovered || isSelected} timeout={200}>\r\n\t\t\t\t\t\t\t<Box sx={{ display: 'flex', gap: 0.5 }}>\r\n\t\t\t\t\t\t\t\t{section?.is_edited_from_source && (\r\n\t\t\t\t\t\t\t\t\t<Chip\r\n\t\t\t\t\t\t\t\t\t\tlabel=\"Edited From Source\"\r\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\t\tsx={(theme) => ({ \r\n\t\t\t\t\t\t\t\t\t\t\ttextTransform: 'capitalize', \r\n\t\t\t\t\t\t\t\t\t\t\tbackgroundColor: theme.palette.theme?.tertiary1?.[200], \r\n\t\t\t\t\t\t\t\t\t\t\tcolor: theme.palette.theme?.tertiary1?.[900]\r\n\t\t\t\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t{editableSections.includes(section.type) &&\r\n\t\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\t\tsize='small'\r\n\t\t\t\t\t\t\t\t\t\tonClick={handleEditing}\r\n\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\tbgcolor: 'grey.100',\r\n\t\t\t\t\t\t\t\t\t\t\t'&:hover': { bgcolor: 'grey.200' }\r\n\t\t\t\t\t\t\t\t\t\t}}>\r\n\t\t\t\t\t\t\t\t\t\t<Edit fontSize='small' sx={{ color: 'theme.secondary.1000' }} />\r\n\t\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\tsize='small'\r\n\t\t\t\t\t\t\t\t\tonClick={handleSplit}\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tbgcolor: 'grey.100',\r\n\t\t\t\t\t\t\t\t\t\t'&:hover': { bgcolor: 'grey.200' },\r\n\t\t\t\t\t\t\t\t\t\topacity: section?.splitWidth === 25 ? 0.5 : 1\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\tdisabled={section?.splitWidth === 25}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<SplitIcon fontSize='small' color='primary' />\r\n\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\tsize='small'\r\n\t\t\t\t\t\t\t\t\tonClick={handleDeleteClick}\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tbgcolor: 'grey.100',\r\n\t\t\t\t\t\t\t\t\t\t'&:hover': { bgcolor: 'grey.200' }\r\n\t\t\t\t\t\t\t\t\t}}>\r\n\t\t\t\t\t\t\t\t\t<Trash fontSize='small' sx={{ color: 'theme.error.500' }} />\r\n\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t</Fade>\r\n\t\t\t\t\t)}\r\n\t\t\t\t</Box>\r\n\t\t\t</Box>\r\n\t\t\t<Box sx={{ p: 3, bgcolor: 'white' }}>\r\n\t\t\t\t<style>\r\n {`\r\n\t\t\t\t\t\ta {\r\n\t\t\t\t\t\t\tcolor: #007bff !important;\r\n\t\t\t\t\t\t\ttext-decoration: none !important;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\ta:hover {\r\n\t\t\t\t\t\t\ttext-decoration: underline;\r\n\t\t\t\t\t\t}\r\n `}\r\n </style>\r\n\t\t\t\t{contentRenderer}\r\n\t\t\t</Box>\r\n\t\t\t{isOpenEditSectionModal && <EditSectionModal\r\n\t\t\t\tisOpen={isOpenEditSectionModal}\r\n\t\t\t\tsetIsOpen={setIsOpenEditSectionModal}\r\n\t\t\t\tmodalProps={{ open: isOpenEditSectionModal }}\r\n\t\t\t\tplaceholders={placeholders}\r\n\t\t\t\thandleSave={handleSave}\r\n\t\t\t\thandleAddPlaceholder={handleAddPlaceholder}\r\n\t\t\t\thandleEditorReady={handleEditorReady}\r\n\t\t\t\tsection={section}\r\n\t\t\t/>}\r\n\t\t</Paper>\r\n\t);\r\n};\r\n\r\n// Custom comparison function to prevent unnecessary re-renders\r\n// Return true if props are equal (skip re-render), false if different (re-render)\r\nconst arePropsEqual = (prevProps: EditorSectionProps, nextProps: EditorSectionProps): boolean => {\r\n\t// Check if section data has changed\r\n\tif (prevProps.section.id !== nextProps.section.id) return false;\r\n\tif (prevProps.section.content !== nextProps.section.content) return false;\r\n\tif (prevProps.section.type !== nextProps.section.type) return false;\r\n\tif (prevProps.section.is_edited_from_source !== nextProps.section.is_edited_from_source) return false;\r\n\tif (prevProps.section.isSplitPair !== nextProps.section.isSplitPair) return false;\r\n\tif (prevProps.section.splitWidth !== nextProps.section.splitWidth) return false;\r\n\t\r\n\t// Check if interaction states have changed\r\n\tif (prevProps.isSelected !== nextProps.isSelected) return false;\r\n\tif (prevProps.isDragging !== nextProps.isDragging) return false;\r\n\tif (prevProps.isOver !== nextProps.isOver) return false;\r\n\t\r\n\t// Check if placeholders array reference has changed\r\n\tif (prevProps.placeholders !== nextProps.placeholders) return false;\r\n\t\r\n\t// Deep comparison for section attributes (styles, etc.)\r\n\tconst prevAttrs = JSON.stringify(prevProps.section.attributes);\r\n\tconst nextAttrs = JSON.stringify(nextProps.section.attributes);\r\n\tif (prevAttrs !== nextAttrs) return false;\r\n\t\r\n\t// All props are equal, skip re-render\r\n\treturn true;\r\n};\r\n\r\n// Wrap component with React.memo and custom comparison function\r\nconst MemoizedEditorSection = React.memo(EditorSection, arePropsEqual);\r\nMemoizedEditorSection.displayName = 'EditorSection';\r\n\r\nexport default MemoizedEditorSection;","/* eslint-disable unused-imports/no-unused-vars */\r\nimport { Box, ToggleButton, ToggleButtonGroup, Tooltip, styled, toggleButtonGroupClasses } from \"@mui/material\";\r\nimport FormatAlignLeftIcon from '@mui/icons-material/FormatAlignLeft';\r\nimport FormatAlignCenterIcon from '@mui/icons-material/FormatAlignCenter';\r\nimport FormatAlignRightIcon from '@mui/icons-material/FormatAlignRight';\r\nimport FormatAlignJustifyIcon from '@mui/icons-material/FormatAlignJustify';\r\nimport Typography from \"../../../../components/typography/typography\";\r\n\r\nconst StyledToggleButtonGroup = styled(ToggleButtonGroup)(({ theme, item }) => ({\r\n display: 'grid',\r\n borderRadius: 4,\r\n border: `1px solid #e3e3e3`,\r\n width: `100%`,\r\n gridTemplateColumns: `repeat(${item || 4}, 1fr)`,\r\n [`& .${toggleButtonGroupClasses.grouped}`]: {\r\n margin: theme.spacing(0.5),\r\n border: 0,\r\n borderRadius: theme.shape.borderRadius,\r\n [`&.${toggleButtonGroupClasses.disabled}`]: {\r\n border: 0,\r\n },\r\n },\r\n [`& .${toggleButtonGroupClasses.middleButton},& .${toggleButtonGroupClasses.lastButton}`]:\r\n {\r\n marginLeft: -1,\r\n borderLeft: '1px solid transparent',\r\n },\r\n [`& .${toggleButtonGroupClasses.selected}`] : {\r\n backgroundColor: `${theme.palette.theme.primary[800]}!important`,\r\n color: `#fff !important`\r\n }\r\n}))\r\n\r\ninterface AlignmentControlProps {\r\n alignment: string;\r\n onAlignmentChange: (event: React.MouseEvent<HTMLElement>, newAlignment: string | null) => void;\r\n displayLabel?: boolean;\r\n}\r\n\r\nconst AlignmentControl: React.FC<AlignmentControlProps> = ({\r\n alignment,\r\n onAlignmentChange,\r\n displayLabel = false,\r\n // disableJustify = false\r\n}) => {\r\n return (\r\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1, mb: 2 }}>\r\n {displayLabel &&\r\n <Typography type=\"s5\" weight=\"medium\" color={\"theme.secondary.800\"}>Alignment</Typography>\r\n }\r\n <StyledToggleButtonGroup\r\n value={alignment}\r\n exclusive\r\n onChange={onAlignmentChange}\r\n aria-label=\"text alignment\"\r\n size=\"small\"\r\n >\r\n <Tooltip title=\"Align Left\">\r\n <ToggleButton value=\"left\" aria-label=\"left aligned\">\r\n <FormatAlignLeftIcon fontSize=\"small\" />\r\n </ToggleButton>\r\n </Tooltip>\r\n <Tooltip title=\"Align Center\">\r\n <ToggleButton value=\"center\" aria-label=\"centered\">\r\n <FormatAlignCenterIcon fontSize=\"small\" />\r\n </ToggleButton>\r\n </Tooltip>\r\n <Tooltip title=\"Align Right\">\r\n <ToggleButton value=\"right\" aria-label=\"right aligned\">\r\n <FormatAlignRightIcon fontSize=\"small\" />\r\n </ToggleButton>\r\n </Tooltip>\r\n {/* {!disableJustify && */}\r\n <Tooltip title=\"Justify\">\r\n <ToggleButton value=\"justify\" aria-label=\"justified\">\r\n <FormatAlignJustifyIcon fontSize=\"small\" />\r\n </ToggleButton>\r\n </Tooltip>\r\n {/* } */}\r\n </StyledToggleButtonGroup>\r\n </Box>\r\n );\r\n}\r\n \r\nexport default AlignmentControl;","/* eslint-disable react-hooks/exhaustive-deps */\r\nimport React, { useCallback, useMemo } from 'react';\r\nimport {\r\n Box,\r\n TextField,\r\n ToggleButtonGroup,\r\n ToggleButton,\r\n InputAdornment,\r\n Tooltip,\r\n FormControl,\r\n MenuItem,\r\n styled,\r\n toggleButtonGroupClasses\r\n} from '@mui/material';\r\nimport FormatBoldIcon from '@mui/icons-material/FormatBold';\r\nimport FormatItalicIcon from '@mui/icons-material/FormatItalic';\r\nimport FormatUnderlinedIcon from '@mui/icons-material/FormatUnderlined';\r\nimport ColorLensIcon from '@mui/icons-material/ColorLens';\r\nimport { debounce } from 'lodash';\r\nimport Select from '../../../../components/select/select';\r\nimport AlignmentControl from './AlignmentControl';\r\n\r\n// Styled component with better typing\r\nconst StyledToggleButtonGroup = styled(ToggleButtonGroup)<{ item?: number }>(\r\n ({ theme, item = 4 }) => ({\r\n display: 'grid',\r\n borderRadius: 4,\r\n border: `1px solid #e3e3e3`,\r\n width: '100%',\r\n gridTemplateColumns: `repeat(${item}, 1fr)`,\r\n [`& .${toggleButtonGroupClasses.grouped}`]: {\r\n margin: theme.spacing(0.5),\r\n border: 0,\r\n borderRadius: theme.shape.borderRadius,\r\n [`&.${toggleButtonGroupClasses.disabled}`]: {\r\n border: 0,\r\n },\r\n },\r\n [`& .${toggleButtonGroupClasses.middleButton}, & .${toggleButtonGroupClasses.lastButton}`]:\r\n {\r\n marginLeft: -1,\r\n borderLeft: '1px solid transparent',\r\n },\r\n [`& .${toggleButtonGroupClasses.selected}`]: {\r\n backgroundColor: `${theme.palette.theme.primary[800]} !important`,\r\n color: '#fff !important',\r\n },\r\n })\r\n);\r\n\r\n// Type definitions\r\ninterface TextStyles {\r\n fontFamily?: string;\r\n fontSize?: number;\r\n lineHeight?: string | number;\r\n textAlign?: string;\r\n fontWeight?: string;\r\n fontStyle?: string;\r\n textDecoration?: string;\r\n color?: string;\r\n}\r\n\r\ninterface TextControlsProps {\r\n attrs: {\r\n styles?: TextStyles;\r\n [key: string]: any;\r\n };\r\n updateAttrs: (attr: Record<string, any>) => void;\r\n}\r\n\r\ntype FormatType = 'bold' | 'italic' | 'underline';\r\n\r\n// Constants\r\nconst FONT_SIZES = [10, 12, 14, 16, 20, 24, 28, 32] as const;\r\nconst LINE_HEIGHTS = [1, 1.2, 1.5, 2] as const;\r\nconst FONT_FAMILIES = [\r\n 'Arial',\r\n 'Times New Roman', \r\n 'Roboto',\r\n 'Helvetica',\r\n 'Georgia',\r\n 'Courier New'\r\n] as const;\r\n\r\nconst DEBOUNCE_DELAY = 300;\r\n\r\nconst TextControls: React.FC<TextControlsProps> = ({ attrs, updateAttrs }) => {\r\n const styles = useMemo(() => attrs.styles || {}, [JSON.stringify(attrs.styles)]);\r\n \r\n // Derive format options from current styles instead of separate state\r\n const formatOptions = useMemo(() => {\r\n const options: FormatType[] = [];\r\n if (styles.fontWeight === 'bold') options.push('bold');\r\n if (styles.fontStyle === 'italic') options.push('italic');\r\n if (styles.textDecoration === 'underline') options.push('underline');\r\n return options;\r\n }, [styles.fontWeight, styles.fontStyle, styles.textDecoration]);\r\n\r\n // Stable update function using useCallback\r\n const updateStyles = useCallback(\r\n (newStyles: Partial<TextStyles>) => {\r\n updateAttrs({ \r\n styles: { \r\n ...styles, \r\n ...newStyles \r\n } \r\n });\r\n },\r\n [styles, updateAttrs]\r\n );\r\n\r\n // Fixed debounced color update function\r\n const debouncedColorUpdate = useCallback(\r\n debounce((color: string) => {\r\n updateStyles({color});\r\n }, DEBOUNCE_DELAY),\r\n [updateStyles]\r\n );\r\n\r\n // Format toggle handler\r\n const toggleFormat = useCallback(\r\n (format: FormatType) => {\r\n const isCurrentlyApplied = formatOptions.includes(format);\r\n \r\n const formatStyleMap: Record<FormatType, Partial<TextStyles>> = {\r\n bold: { fontWeight: isCurrentlyApplied ? 'normal' : 'bold' },\r\n italic: { fontStyle: isCurrentlyApplied ? 'normal' : 'italic' },\r\n underline: { textDecoration: isCurrentlyApplied ? 'none' : 'underline' }\r\n };\r\n\r\n updateStyles(formatStyleMap[format]);\r\n },\r\n [formatOptions, updateStyles]\r\n );\r\n\r\n // Alignment change handler\r\n const handleAlignmentChange = useCallback(\r\n (event: React.MouseEvent<HTMLElement>, newAlignment: string | null) => {\r\n if (newAlignment !== null) {\r\n updateStyles({ textAlign: newAlignment });\r\n }\r\n },\r\n [updateStyles]\r\n );\r\n\r\n // Color change handler\r\n const handleColorChange = useCallback(\r\n (event: React.ChangeEvent<HTMLInputElement>) => {\r\n debouncedColorUpdate(event.target.value);\r\n },\r\n [debouncedColorUpdate]\r\n );\r\n\r\n // Generic style change handlers\r\n const handleFontFamilyChange = useCallback(\r\n (event: any) => updateStyles({ fontFamily: event.target.value }),\r\n [updateStyles]\r\n );\r\n\r\n const handleFontSizeChange = useCallback(\r\n (event: any) => updateStyles({ fontSize: Number(event.target.value) }),\r\n [updateStyles]\r\n );\r\n\r\n const handleLineHeightChange = useCallback(\r\n (event: any) => updateStyles({ lineHeight: String(event.target.value) }),\r\n [updateStyles]\r\n );\r\n\r\n return (\r\n <>\r\n {/* Font Family Selection */}\r\n <Box sx={{ mb: 2 }}>\r\n <FormControl size=\"small\" fullWidth>\r\n <Select\r\n value={styles.fontFamily || ''}\r\n onChange={handleFontFamilyChange}\r\n displayEmpty\r\n label=\"Select Font\"\r\n >\r\n {FONT_FAMILIES.map((family) => (\r\n <MenuItem key={family} value={family}>\r\n {family}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Box>\r\n\r\n {/* Font Size and Line Height */}\r\n <Box sx={{ mb: 2, display: 'flex', gap: 1 }}>\r\n <FormControl size=\"small\" fullWidth>\r\n <Select\r\n value={styles.fontSize || ''}\r\n onChange={handleFontSizeChange}\r\n renderValue={(v) => `${v}px`}\r\n label=\"Size\"\r\n displayEmpty\r\n >\r\n {FONT_SIZES.map((size) => (\r\n <MenuItem key={size} value={size}>\r\n {size}px\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n\r\n <FormControl size=\"small\" fullWidth>\r\n <Select\r\n value={styles.lineHeight || ''}\r\n onChange={handleLineHeightChange}\r\n renderValue={(v) => `${v}x`}\r\n label=\"Line Height\"\r\n displayEmpty\r\n >\r\n {LINE_HEIGHTS.map((height) => (\r\n <MenuItem key={height} value={height}>\r\n {height}x\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Box>\r\n\r\n {/* Text Alignment */}\r\n <AlignmentControl \r\n alignment={styles.textAlign} \r\n onAlignmentChange={handleAlignmentChange} \r\n />\r\n\r\n {/* Format Options */}\r\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1, mb: 2 }}>\r\n <StyledToggleButtonGroup item={3}>\r\n <Tooltip title=\"Bold\">\r\n <ToggleButton\r\n value=\"bold\"\r\n selected={formatOptions.includes('bold')}\r\n onClick={() => toggleFormat('bold')}\r\n aria-label=\"bold\"\r\n size=\"small\"\r\n sx={{ borderRadius: 1 }}\r\n >\r\n <FormatBoldIcon fontSize=\"small\" />\r\n </ToggleButton>\r\n </Tooltip>\r\n\r\n <Tooltip title=\"Italic\">\r\n <ToggleButton\r\n value=\"italic\"\r\n selected={formatOptions.includes('italic')}\r\n onClick={() => toggleFormat('italic')}\r\n aria-label=\"italic\"\r\n size=\"small\"\r\n sx={{ borderRadius: 1 }}\r\n >\r\n <FormatItalicIcon fontSize=\"small\" />\r\n </ToggleButton>\r\n </Tooltip>\r\n\r\n <Tooltip title=\"Underline\">\r\n <ToggleButton\r\n value=\"underline\"\r\n selected={formatOptions.includes('underline')}\r\n onClick={() => toggleFormat('underline')}\r\n aria-label=\"underline\"\r\n size=\"small\"\r\n sx={{ borderRadius: 1 }}\r\n >\r\n <FormatUnderlinedIcon fontSize=\"small\" />\r\n </ToggleButton>\r\n </Tooltip>\r\n </StyledToggleButtonGroup>\r\n </Box>\r\n\r\n {/* Color Picker */}\r\n <Box sx={{ mb: 2, width: '100%' }}>\r\n <TextField\r\n label=\"Text Color\"\r\n variant=\"outlined\"\r\n type=\"color\"\r\n value={styles.color || '#000000'}\r\n onChange={handleColorChange}\r\n size=\"small\"\r\n fullWidth\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <ColorLensIcon fontSize=\"small\" />\r\n </InputAdornment>\r\n ),\r\n }}\r\n />\r\n </Box>\r\n </>\r\n );\r\n};\r\n\r\nexport default React.memo(TextControls);","/* eslint-disable unused-imports/no-unused-vars */\r\nimport React from 'react';\r\nimport {\r\n Box,\r\n FormControl,\r\n MenuItem,\r\n Slider,\r\n} from '@mui/material';\r\nimport Typography from '../../../../components/typography/typography';\r\nimport TextField from '../../../../components/text-field/text-field';\r\nimport AlignmentControl from './AlignmentControl';\r\nimport Select from '../../../../components/select/select';\r\nimport ColorPickerInput from '../../../../components/color-picker-input/color-picker-input';\r\n\r\ninterface ButtonControlsProps {\r\n attrs: Record<string, any>;\r\n updateAttrs: (attr: Record<string, any>) => void;\r\n}\r\n\r\nconst borderOptions = [\r\n {label: 'None', value: 'none'},\r\n {value: '1px solid #e0e0e0', label: 'Solid'},\r\n {value: '1px dashed #e0e0e0', label: 'Dashed'},\r\n {value: '1px dotted #e0e0e0', label: 'Dotted'},\r\n]\r\n\r\nconst ButtonControls: React.FC<ButtonControlsProps> = ({\r\n attrs,\r\n updateAttrs\r\n}) => {\r\n\r\n const { text, styles } = attrs\r\n const handleAlignmentChange = (\r\n event: React.MouseEvent<HTMLElement>,\r\n newAlignment: string | null,\r\n ) => {\r\n if(newAlignment) {\r\n let margin = '0';\r\n switch (newAlignment) {\r\n \r\n case 'justify':\r\n margin = '0 auto';\r\n break;\r\n case 'right':\r\n margin = '0 0 0 auto';\r\n break;\r\n case 'center':\r\n margin = '0 auto';\r\n break;\r\n case 'left':\r\n margin = 'auto 0 0 0';\r\n break;\r\n default:\r\n margin = '0 auto';\r\n break;\r\n }\r\n updateAttrs({ styles : { margin } });\r\n }\r\n };\r\n\r\n const getAlignment = () => {\r\n if (styles?.margin === '0 auto') {\r\n return 'center';\r\n } else if (styles?.margin === '0 0 0 auto') {\r\n return 'right';\r\n } else if (styles?.margin === 'auto 0 0 0') {\r\n return 'left';\r\n } else {\r\n return 'justify';\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <TextField\r\n label=\"Button Text\"\r\n fullWidth\r\n value={text}\r\n onChange={(e) => updateAttrs({ text: e.target.value })}\r\n size=\"small\"\r\n sx={{ mb: 2 }}\r\n />\r\n <Box sx={{ mb: 2 }}>\r\n <ColorPickerInput\r\n value={styles?.backgroundColor || '#333333'}\r\n onChange={(color) => updateAttrs({ styles :{ backgroundColor: color }})}\r\n label='Background Color'\r\n />\r\n </Box>\r\n <Box sx={{ mb: 2 }}>\r\n <ColorPickerInput\r\n value={styles?.color || '#333333'}\r\n onChange={(color) => updateAttrs({ styles :{ color: color }})}\r\n label='Text Color'\r\n // sx={{ maxWidth: 150 }}\r\n />\r\n </Box>\r\n <FormControl fullWidth size=\"small\" sx={{ mb: 2 }}>\r\n <Select\r\n value={styles?.border}\r\n renderValue={(value) => borderOptions.find((option) => option.value === value)?.label || 'None'}\r\n onChange={(e) => updateAttrs({ styles :{ border :e.target.value }})}\r\n label='Border'\r\n >\r\n <MenuItem value=\"none\">None</MenuItem>\r\n <MenuItem value=\"1px solid #e0e0e0\">Solid</MenuItem>\r\n <MenuItem value=\"1px dashed #e0e0e0\">Dashed</MenuItem>\r\n </Select>\r\n </FormControl>\r\n <Box sx={{ mb: 2 }}>\r\n <Typography type=\"s3\" color='theme.neutral.800'>\r\n Border Radius\r\n </Typography>\r\n <Slider\r\n value={styles?.borderRadius}\r\n onChange={(_, value) => updateAttrs({ styles :{ borderRadius: value as number }})}\r\n min={0}\r\n max={20}\r\n step={1}\r\n valueLabelDisplay=\"auto\"\r\n size=\"small\"\r\n marks\r\n sx={(theme) => ({\r\n '& .MuiSlider-rail': {\r\n color: theme.palette.theme.primary[500],\r\n },\r\n '& .MuiSlider-thumb': {\r\n color: theme.palette.theme.primary[800],\r\n },\r\n '& .MuiSlider-track': {\r\n color: theme.palette.theme.primary[600],\r\n },\r\n })}\r\n />\r\n </Box>\r\n <Box sx={{ mb: 2 }}>\r\n <Typography type=\"s3\" color='theme.neutral.800'>\r\n Font Size\r\n </Typography>\r\n <Slider\r\n value={styles?.fontSize}\r\n onChange={(_, value) => updateAttrs({ styles :{ fontSize: value as number }})}\r\n min={10}\r\n max={20}\r\n step={1}\r\n valueLabelDisplay=\"auto\"\r\n size=\"small\"\r\n marks\r\n sx={(theme) => ({\r\n '& .MuiSlider-rail': {\r\n color: theme.palette.theme.primary[500],\r\n },\r\n '& .MuiSlider-thumb': {\r\n color: theme.palette.theme.primary[800],\r\n },\r\n '& .MuiSlider-track': {\r\n color: theme.palette.theme.primary[600],\r\n },\r\n })}\r\n />\r\n </Box>\r\n <AlignmentControl alignment={getAlignment()} onAlignmentChange={handleAlignmentChange}/>\r\n </>\r\n );\r\n};\r\n\r\nexport default ButtonControls;","/* eslint-disable react-hooks/exhaustive-deps */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport { FormControl, FormControlLabel, Grid, MenuItem, Slider, Switch, styled } from \"@mui/material\";\r\nimport ColorPickerInput from \"../../../../components/color-picker-input/color-picker-input\";\r\nimport Select from \"../../../../components/select/select\";\r\nimport Typography from \"../../../../components/typography/typography\";\r\nimport formatText from \"../../../../utils/format-text\";\r\nimport { useEffect } from \"react\";\r\n\r\nconst Android12Switch = styled(Switch)(({ theme }) => ({\r\n padding: 8,\r\n '& .MuiSwitch-track': {\r\n borderRadius: 22 / 2,\r\n '&::before, &::after': {\r\n content: '\"\"',\r\n position: 'absolute',\r\n top: '50%',\r\n transform: 'translateY(-50%)',\r\n width: 16,\r\n height: 16,\r\n },\r\n '&::before': {\r\n backgroundImage: `url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"16\" width=\"16\" viewBox=\"0 0 24 24\"><path fill=\"${encodeURIComponent(\r\n theme.palette.getContrastText(theme.palette.primary.main),\r\n )}\" d=\"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z\"/></svg>')`,\r\n left: 12,\r\n },\r\n '&::after': {\r\n backgroundImage: `url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"16\" width=\"16\" viewBox=\"0 0 24 24\"><path fill=\"${encodeURIComponent(\r\n theme.palette.getContrastText(theme.palette.primary.main),\r\n )}\" d=\"M19,13H5V11H19V13Z\" /></svg>')`,\r\n right: 12,\r\n },\r\n },\r\n '& .MuiSwitch-thumb': {\r\n boxShadow: 'none',\r\n width: 16,\r\n height: 16,\r\n margin: 2,\r\n // color: theme.palette.theme.primary[800]\r\n },\r\n '& .Mui-checked': {\r\n color: `${theme.palette.theme.primary[800]} !important`,\r\n },\r\n '& .Mui-checked+.MuiSwitch-track': {\r\n backgroundColor: `${theme.palette.theme.primary[800]} !important`,\r\n },\r\n}));\r\n\r\nexport interface BorderControlProps {\r\n styles: Record<string, any>,\r\n onChange: (key: string, value: any) => void\r\n isBordered: boolean;\r\n disableWidth?: boolean;\r\n disableStyle?: boolean;\r\n disableColor?: boolean;\r\n disableCollapse?: boolean;\r\n disableRadius?: boolean;\r\n initiateStyles?: (styles: Record<string, any>) => void;\r\n}\r\n\r\nconst borderStyles = [\r\n 'none',\r\n 'solid',\r\n 'dashed',\r\n 'dotted',\r\n 'double',\r\n 'groove',\r\n 'ridge',\r\n 'inset',\r\n 'outset'\r\n];\r\n\r\nconst BorderControl:React.FC<BorderControlProps> = ({\r\n styles,\r\n onChange,\r\n isBordered,\r\n disableWidth = false,\r\n disableStyle = false,\r\n disableColor = false,\r\n disableCollapse = false,\r\n disableRadius = false,\r\n initiateStyles\r\n}) => {\r\n\r\n useEffect(() => {\r\n if(initiateStyles instanceof Function) {\r\n if (!isBordered) {\r\n initiateStyles({\r\n 'border': 0,\r\n 'borderStyle':'none',\r\n 'borderColor':'#000000',\r\n 'borderCollapse':'separate',\r\n 'borderRadius':0,\r\n });\r\n } else{\r\n initiateStyles({\r\n 'border': 1,\r\n 'borderStyle':'solid',\r\n 'borderColor':'#000000',\r\n 'borderCollapse':'collapse',\r\n 'borderRadius':0,\r\n });\r\n }\r\n }\r\n }, [isBordered]);\r\n return (\r\n <Grid container spacing={2}>\r\n <Grid item xs={12}>\r\n <FormControlLabel\r\n control={\r\n <Android12Switch\r\n checked={isBordered}\r\n onChange={(e) => onChange('is_bordered', e.target.checked)}\r\n />\r\n }\r\n label={<Typography type='s5' weight='medium' color='theme.secondary.800'>Bordered Table</Typography>}\r\n labelPlacement=\"start\"\r\n sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', margin: 'auto'}}\r\n />\r\n </Grid>\r\n \r\n {isBordered && (\r\n <>\r\n {/* Width */}\r\n {!disableWidth && (\r\n <Grid item xs={6}>\r\n <Select\r\n value={styles.border || 1}\r\n onChange={(e) => onChange('border', e.target.value)}\r\n label=\"Border Width\"\r\n fullWidth\r\n size=\"small\"\r\n >\r\n {[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map((wd) => (\r\n <MenuItem key={wd} value={wd}>\r\n <Typography type='s5' color='theme.secondary.1000'>{wd}</Typography>\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </Grid>\r\n )}\r\n \r\n {/* Style */}\r\n {!disableStyle && ( \r\n <Grid item xs={6}>\r\n <FormControl fullWidth size=\"small\">\r\n <Select\r\n value={styles.borderStyle || 'solid'}\r\n onChange={(e) => onChange('borderStyle', e.target.value)}\r\n renderValue={(value) => formatText(value)}\r\n label=\"Border Style\"\r\n >\r\n {borderStyles.map((style) => (\r\n <MenuItem key={style} value={style}>\r\n <Typography type='s5' color='theme.secondary.1000'>{formatText(style)}</Typography>\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Grid>\r\n )}\r\n \r\n {/* Color */}\r\n {!disableColor && ( \r\n <Grid item xs={6}>\r\n <Typography type='s5' weight='medium' color='theme.secondary.800' mb={0.5}>Border Color</Typography>\r\n <ColorPickerInput\r\n value={styles.borderColor || '#e0e0e0'}\r\n onChange={(color) => onChange('borderColor', color)}\r\n fullWidth\r\n />\r\n </Grid>\r\n )}\r\n\r\n {/* Collapse */}\r\n {!disableCollapse && ( \r\n <Grid item xs={6}>\r\n <FormControl fullWidth size=\"small\">\r\n <Select\r\n value={styles.borderCollapse || 'collapse'}\r\n onChange={(e) => onChange('borderCollapse', e.target.value)}\r\n label=\"Border Collapse\"\r\n renderValue={(value) => formatText(value)}\r\n >\r\n <MenuItem value=\"collapse\"><Typography type='s5' color='theme.secondary.1000'>Collapse</Typography></MenuItem>\r\n <MenuItem value=\"separate\"><Typography type='s5' color='theme.secondary.1000'>Separate</Typography></MenuItem>\r\n </Select>\r\n </FormControl>\r\n </Grid>\r\n )}\r\n\r\n {/* Radius */}\r\n {!disableRadius && (\r\n <Grid item xs={12}>\r\n <Typography type='s5' weight='medium' color='theme.secondary.800' variant=\"caption\">Border Radius</Typography>\r\n <Slider\r\n value={typeof styles.borderRadius === 'number' ? styles.borderRadius : 1}\r\n min={0}\r\n max={20}\r\n step={1}\r\n marks\r\n onChange={(_, value) => onChange('borderRadius', value)}\r\n valueLabelDisplay=\"auto\"\r\n sx={(theme) => ({\r\n '& .MuiSlider-rail': {\r\n color: theme.palette.theme.primary[500],\r\n },\r\n '& .MuiSlider-thumb': {\r\n color: theme.palette.theme.primary[800],\r\n },\r\n '& .MuiSlider-track': {\r\n color: theme.palette.theme.primary[600],\r\n },\r\n })}\r\n />\r\n </Grid>\r\n )}\r\n </>\r\n )}\r\n \r\n </Grid>\r\n );\r\n}\r\n \r\nexport default BorderControl;","/* eslint-disable unused-imports/no-unused-vars */\r\nimport React from 'react';\r\nimport {\r\n Box,\r\n FormControl,\r\n // Select,\r\n MenuItem,\r\n styled,\r\n Switch,\r\n Grid,\r\n FormControlLabel\r\n} from '@mui/material';\r\nimport TextField from '../../../../components/text-field/text-field';\r\nimport Select from '../../../../components/select/select';\r\nimport Typography from '../../../../components/typography/typography';\r\nimport AlignmentControl from './AlignmentControl';\r\nimport BorderControl from './border-control';\r\n\r\nconst Android12Switch = styled(Switch)(({ theme }) => ({\r\n padding: 8,\r\n '& .MuiSwitch-track': {\r\n borderRadius: 22 / 2,\r\n '&::before, &::after': {\r\n content: '\"\"',\r\n position: 'absolute',\r\n top: '50%',\r\n transform: 'translateY(-50%)',\r\n width: 16,\r\n height: 16,\r\n },\r\n '&::before': {\r\n backgroundImage: `url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"16\" width=\"16\" viewBox=\"0 0 24 24\"><path fill=\"${encodeURIComponent(\r\n theme.palette.getContrastText(theme.palette.primary.main),\r\n )}\" d=\"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z\"/></svg>')`,\r\n left: 12,\r\n },\r\n '&::after': {\r\n backgroundImage: `url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"16\" width=\"16\" viewBox=\"0 0 24 24\"><path fill=\"${encodeURIComponent(\r\n theme.palette.getContrastText(theme.palette.primary.main),\r\n )}\" d=\"M19,13H5V11H19V13Z\" /></svg>')`,\r\n right: 12,\r\n },\r\n },\r\n '& .MuiSwitch-thumb': {\r\n boxShadow: 'none',\r\n width: 16,\r\n height: 16,\r\n margin: 2,\r\n // color: theme.palette.theme.primary[800]\r\n },\r\n '& .Mui-checked': {\r\n color: theme.palette.theme.primary[800]\r\n },\r\n '& .Mui-checked+.MuiSwitch-track': {\r\n backgroundColor: `${theme.palette.theme.primary[700]}`,\r\n },\r\n}));\r\n\r\ninterface ImageControlsProps {\r\n attrs: Record<string, any>;\r\n updateAttrs: (attr: Record<string, any>) => void;\r\n}\r\n\r\nconst ImageControls: React.FC<ImageControlsProps> = ({\r\n attrs,\r\n updateAttrs\r\n}) => {\r\n const { src, alt, styles } = attrs || {}\r\n\r\n const handleAlignmentChange = (\r\n event: React.MouseEvent<HTMLElement>,\r\n newAlignment: string | null,\r\n ) => {\r\n if(newAlignment) {\r\n let margin = '0';\r\n switch (newAlignment) {\r\n case 'justify':\r\n margin = '0 auto';\r\n break;\r\n case 'right':\r\n margin = '0 0 0 auto';\r\n break;\r\n case 'center':\r\n margin = '0 auto';\r\n break;\r\n case 'left':\r\n margin = 'auto 0 0 0';\r\n break;\r\n default:\r\n margin = '0 auto';\r\n break;\r\n }\r\n updateAttrs({ styles : { margin, alignment: newAlignment } });\r\n\r\n }\r\n };\r\n\r\n const getAlignment = () => {\r\n if (styles?.margin === '0 auto' || styles?.alignment === 'center') {\r\n return 'center';\r\n } else if (styles?.margin === '0 0 0 auto' || styles?.alignment === 'right') {\r\n return 'right';\r\n } else if (styles?.margin === 'auto 0 0 0' || styles?.alignment === 'left') {\r\n return 'left';\r\n } else {\r\n return 'justify';\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n {/* Image URL */}\r\n <TextField\r\n label=\"Image URL\"\r\n fullWidth\r\n value={src}\r\n onChange={(e) => updateAttrs({ src: e.target.value })}\r\n size=\"small\"\r\n sx={{ mb: 2 }}\r\n />\r\n\r\n {/* Alt Text */}\r\n <TextField\r\n label=\"Alt Text\"\r\n fullWidth\r\n value={alt}\r\n onChange={(e) => updateAttrs({ alt: e.target.value })}\r\n size=\"small\"\r\n sx={{ mb: 2 }}\r\n />\r\n <FormControlLabel\r\n control={<Android12Switch defaultChecked checked={Boolean(styles?.fullWidth)}/>}\r\n label={<Typography type=\"s5\" color=\"theme.secondary.800\" weight='medium'>Full Width</Typography>}\r\n labelPlacement=\"start\"\r\n value={Boolean(styles?.fullWidth)}\r\n onClick={(e) => {\r\n const checked = e.target.checked\r\n updateAttrs({ styles: { fullWidth: checked, width: checked ? 100 : 150, height: checked ? 'auto' : 150 }})\r\n }}\r\n sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', margin: 'auto', mb:2 }}\r\n />\r\n\r\n {/* Width Input */}\r\n <Grid container spacing={2}>\r\n <Grid item xs={6}>\r\n <TextField\r\n label=\"Width (px)\"\r\n type=\"number\"\r\n fullWidth\r\n value={styles?.fullWidth ? '' : styles?.width}\r\n onChange={(e) =>\r\n updateAttrs({ styles: { width: Number(e.target.value) }})\r\n }\r\n size=\"small\"\r\n sx={{ mb: 2 }}\r\n inputProps={{ min: 1 }}\r\n disabled={styles?.fullWidth}\r\n />\r\n </Grid>\r\n <Grid item xs={6}>\r\n {/* Height Input */}\r\n <TextField\r\n label=\"Height (px)\"\r\n type=\"number\"\r\n fullWidth\r\n value={styles?.fullWidth ? '' : styles?.height}\r\n onChange={(e) =>\r\n updateAttrs({ styles: { height: Number(e.target.value) }})\r\n }\r\n size=\"small\"\r\n sx={{ mb: 2 }}\r\n inputProps={{ min: 1 }}\r\n disabled={styles?.fullWidth}\r\n />\r\n\r\n </Grid>\r\n\r\n </Grid>\r\n\r\n\r\n {/* Object Fit Dropdown */}\r\n <Box sx={{ mb: 2 }}>\r\n <FormControl size=\"small\" fullWidth>\r\n <Select\r\n label='Object Fit'\r\n value={styles?.objectFit}\r\n onChange={(e) =>\r\n updateAttrs({ styles: { objectFit: e.target.value }})\r\n }\r\n displayEmpty\r\n >\r\n <MenuItem value=\"contain\">Contain</MenuItem>\r\n <MenuItem value=\"cover\">Cover</MenuItem>\r\n <MenuItem value=\"fill\">Fill</MenuItem>\r\n <MenuItem value=\"none\">None</MenuItem>\r\n <MenuItem value=\"scale-down\">Scale Down</MenuItem>\r\n </Select>\r\n </FormControl>\r\n </Box>\r\n\r\n {/* Alignment Toggle Buttons */}\r\n <AlignmentControl\r\n alignment={getAlignment()}\r\n onAlignmentChange={handleAlignmentChange}\r\n displayLabel\r\n />\r\n\r\n <BorderControl\r\n styles={styles}\r\n onChange={(key, value) => updateAttrs({ styles: { [key]: value } })}\r\n isBordered={styles?.is_bordered}\r\n disableCollapse\r\n initiateStyles={(styles) => updateAttrs({ styles })}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nexport default ImageControls;","/* eslint-disable unused-imports/no-unused-vars */\r\nimport React from 'react';\r\nimport {\r\n Box,\r\n FormControl,\r\n MenuItem,\r\n Slider,\r\n InputAdornment,\r\n} from '@mui/material';\r\nimport ColorLensIcon from '@mui/icons-material/ColorLens';\r\nimport Typography from '../../../../components/typography/typography';\r\nimport TextField from '../../../../components/text-field/text-field';\r\nimport Select from '../../../../components/select/select';\r\nimport formatText from '../../../../utils/format-text';\r\n\r\ninterface DividerControlsProps {\r\n attrs: Record<string, any>;\r\n updateAttrs: (attr: Record<string, any>) => void;\r\n}\r\n\r\nconst DividerControls: React.FC<DividerControlsProps> = ({\r\n attrs,\r\n updateAttrs,\r\n}) => {\r\n const { styles } = attrs\r\n return (\r\n <>\r\n <FormControl fullWidth size=\"small\" sx={{ mb: 2 }}>\r\n <Select\r\n label='Style'\r\n value={styles?.borderStyle}\r\n onChange={(e) => updateAttrs({ styles: { borderStyle: e.target.value } })}\r\n renderValue={(value) => formatText(value)}\r\n >\r\n <MenuItem value=\"solid\">Solid</MenuItem>\r\n <MenuItem value=\"dashed\">Dashed</MenuItem>\r\n <MenuItem value=\"dotted\">Dotted</MenuItem>\r\n </Select>\r\n </FormControl>\r\n <Box sx={{ mb: 1 }}>\r\n <Typography type=\"s5\" color='theme.secondary.800' weight='medium'>\r\n Thickness (px)\r\n </Typography>\r\n <Slider\r\n value={styles?.borderWidth}\r\n onChange={(_, value) => updateAttrs({ styles: { borderWidth: value as number }})}\r\n min={1}\r\n max={10}\r\n step={1}\r\n valueLabelDisplay=\"auto\"\r\n size=\"small\"\r\n sx={(theme) => ({\r\n '& .MuiSlider-rail': {\r\n color: theme.palette.theme.primary[500],\r\n },\r\n '& .MuiSlider-thumb': {\r\n color: theme.palette.theme.primary[800],\r\n },\r\n '& .MuiSlider-track': {\r\n color: theme.palette.theme.primary[600],\r\n },\r\n })}\r\n />\r\n </Box>\r\n <Box sx={{ mb: 2 }}>\r\n <TextField\r\n label=\"Divider Color\"\r\n type=\"color\"\r\n value={styles?.borderColor}\r\n onChange={(e) => updateAttrs({ styles: { borderColor: e.target.value }})}\r\n size=\"small\"\r\n fullWidth\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <ColorLensIcon fontSize=\"small\" />\r\n </InputAdornment>\r\n ),\r\n }}\r\n />\r\n </Box>\r\n </>\r\n );\r\n};\r\n\r\nexport default DividerControls;","/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable react-hooks/exhaustive-deps */\r\n/* eslint-disable no-mixed-spaces-and-tabs */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React, { useEffect, useMemo, useState } from 'react';\r\nimport {\r\n Box,\r\n MenuItem,\r\n Accordion as MuiAccordion,\r\n AccordionSummary,\r\n AccordionDetails,\r\n Grid,\r\n FormControlLabel,\r\n Tabs,\r\n Tab,\r\n AccordionProps,\r\n styled,\r\n Divider,\r\n IconButton,\r\n Chip,\r\n Alert,\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n DialogActions,\r\n Table,\r\n TableHead,\r\n TableBody,\r\n TableRow,\r\n TableCell,\r\n} from '@mui/material';\r\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\r\nimport AddIcon from '@mui/icons-material/Add';\r\nimport RefreshIcon from '@mui/icons-material/Refresh';\r\nimport MergeIcon from '@mui/icons-material/MergeType';\r\nimport SplitIcon from '@mui/icons-material/CallSplit';\r\nimport ColorPickerInput from '../../../../components/color-picker-input/color-picker-input';\r\nimport TextField from '../../../../components/text-field/text-field';\r\nimport Select from '../../../../components/select/select';\r\nimport formatText from '../../../../utils/format-text';\r\nimport Typography from '../../../../components/typography/typography';\r\nimport Android12Switch from '../../../../components/switches/android-12-switch';\r\nimport BorderControl from './border-control';\r\nimport Button from '../../../../components/button/button';\r\nimport Checkbox from '../../../../components/checkbox/checkbox';\r\nimport { Trash } from '../../../../components/icons';\r\nimport SearchableSelect from '../../../../components/searchable-select';\r\n\r\n// Type definitions\r\ninterface TableColumn {\r\n id: string;\r\n header: string;\r\n}\r\n\r\ninterface TableRow {\r\n [key: string]: string;\r\n}\r\n\r\ninterface CellMerge {\r\n section: 'thead' | 'tbody';\r\n rowStart: number;\r\n rowEnd: number;\r\n colStart: number;\r\n colEnd: number;\r\n value: string;\r\n}\r\n\r\ninterface TableData {\r\n columns: TableColumn[];\r\n rows: TableRow[];\r\n mergedCells?: CellMerge[];\r\n}\r\n\r\nconst Accordion = styled(\r\n (props: AccordionProps) => (\r\n <MuiAccordion disableGutters elevation={0} square {...props} />\r\n )\r\n)(({ theme }) => ({\r\n border: `1px solid ${theme.palette.divider}`,\r\n borderRadius: 0,\r\n '&:not(:last-child)': {\r\n borderBottom: 0,\r\n },\r\n '&::before': {\r\n display: 'none',\r\n },\r\n}));\r\n\r\ninterface TableControlsProps {\r\n tableData: TableData;\r\n setTableData: (value: TableData) => void;\r\n attrs: any;\r\n updateAttrs: (value: any) => void;\r\n placeholders: Record<string, any>[];\r\n handleSave?: () => void;\r\n setParentRowLevel?: (value: boolean) => void;\r\n levelType?: boolean;\r\n relation_table?: any;\r\n}\r\n\r\nconst textAlignOptions = ['left', 'center', 'right', 'justify'];\r\nconst fontWeightOptions = ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'];\r\nconst fontFamilyOptions = [\r\n 'Arial, sans-serif',\r\n 'Helvetica, sans-serif',\r\n 'Times New Roman, serif',\r\n 'Georgia, serif',\r\n 'Courier New, monospace',\r\n 'Verdana, sans-serif',\r\n 'Tahoma, sans-serif',\r\n 'Trebuchet MS, sans-serif'\r\n];\r\n\r\nconst TableControls: React.FC<TableControlsProps> = ({\r\n tableData,\r\n setTableData,\r\n attrs,\r\n updateAttrs,\r\n placeholders,\r\n handleSave,\r\n setParentRowLevel,\r\n levelType,\r\n relation_table\r\n}) => {\r\n\r\n const [tabValue, setTabValue] = useState(0);\r\n const [expanded, setExpanded] = useState('tableBasic');\r\n const [autoPopulateEnabled, setAutoPopulateEnabled] = useState(true);\r\n const [mergeDialogOpen, setMergeDialogOpen] = useState(false);\r\n const [selectedCells, setSelectedCells] = useState<{section: 'thead' | 'tbody', row: number, col: number}[]>([]);\r\n const [mergeValue, setMergeValue] = useState('');\r\n const [rowLevel, setRowLevel] = useState(false);\r\n const { placeholders: tPlaceholders } = attrs;\r\n const [selectedTable, setSelectedTable] = useState<string | null>(null);\r\n // Fix: Change customText to an object type\r\n const [customText, setCustomText] = useState<{ [rowIndex: number]: { [columnId: string]: string } }>({});\r\n // New state to track row-level placeholder assignments\r\n const [rowPlaceholders, setRowPlaceholders] = useState<{ [rowIndex: number]: { [columnId: string]: string } }>({});\r\n // Initialize merged cells from attrs\r\n const mergedCells = tableData.mergedCells || [];\r\nconst [isUpdating, setIsUpdating] = useState(false);\r\n\r\nconst getAttributes = (tableId: string) => {\r\n\r\n if (!relation_table || !Array.isArray(relation_table)) {\r\n return [];\r\n }\r\n \r\n const table = relation_table.find((table: any) => {\r\n return table?.dataKey == tableId\r\n })\r\n if (!table || !table.fields || !Array.isArray(table.fields)) {\r\n return [];\r\n }\r\n\r\n return table.fields\r\n // .map(field => {\r\n // const fieldName = field.key;\r\n // return {\r\n // label: fieldName?.replace(/_id$/, '') || '', \r\n // value: field?.select,\r\n // };\r\n // });\r\n};\r\n\r\nconst tableAttributes = useMemo(() => \r\n selectedTable ? getAttributes(selectedTable) : placeholders,\r\n [placeholders, selectedTable, relation_table] \r\n)\r\n // Initialize styles from attrs or use default styles\r\n const [tableStyles, setTableStyles] = useState(attrs?.styles || {\r\n is_bordered: true,\r\n border: 1,\r\n borderStyle: 'solid',\r\n borderColor: '#e0e0e0',\r\n borderCollapse: 'collapse',\r\n width: '100%',\r\n thCells: {\r\n padding: 8\r\n },\r\n tbCells: {\r\n padding: 8\r\n },\r\n tHead: {\r\n backgroundColor: '#f5f5f5',\r\n color: '#333333',\r\n fontSize: 14,\r\n fontWeight: 'bold',\r\n fontFamily: 'Arial, sans-serif',\r\n textAlign: 'left',\r\n margin: '0.5em 0',\r\n },\r\n tBody: {\r\n backgroundColor: '#ffffff',\r\n color: '#333333',\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n fontFamily: 'Arial, sans-serif',\r\n textAlign: 'left',\r\n }\r\n });\r\n\r\n // Apply styles to attrs when tableStyles change\r\n useEffect(() => {\r\n updateAttrs({ styles: tableStyles });\r\n }, [JSON.stringify(tableStyles)]);\r\n\r\n // Auto-populate rows when placeholders change\r\n useEffect(() => {\r\n if (autoPopulateEnabled && (tPlaceholders || rowLevel)) {\r\n populateRowsWithPlaceholders();\r\n }\r\n }, [tPlaceholders, autoPopulateEnabled, rowLevel, rowPlaceholders]);\r\n\r\n // Generate unique column ID\r\n const generateColumnId = () => {\r\n const existingIds = tableData.columns.map(col => col.id);\r\n let counter = 1;\r\n while (existingIds.includes(`col${counter}`)) {\r\n counter++;\r\n }\r\n return `col${counter}`;\r\n };\r\n\r\n // Get placeholder value by key\r\n const getPlaceholderValue = (placeholderKey: string): string => {\r\n const placeholder = tableAttributes.find(p => p.value === placeholderKey);\r\n if (!placeholder) return '';\r\n \r\n // Return the placeholder syntax for row-level mode\r\n if (rowLevel) {\r\n return `{{${placeholder.value}}}`;\r\n }\r\n \r\n // Return the actual value or a sample value if it's dynamic\r\n if (typeof placeholder.actualValue !== 'undefined') {\r\n return String(placeholder.actualValue);\r\n }\r\n \r\n // For dynamic placeholders, return a sample/preview value\r\n switch (placeholder.type) {\r\n case 'date':\r\n return new Date().toLocaleDateString();\r\n case 'datetime':\r\n return new Date().toLocaleString();\r\n case 'number':\r\n return '123';\r\n case 'currency':\r\n return '$1,234.56';\r\n case 'email':\r\n return 'example@domain.com';\r\n case 'phone':\r\n return '+1 (555) 123-4567';\r\n case 'url':\r\n return 'https://example.com';\r\n default:\r\n return `{{${placeholder.value}}}` || placeholder.label;\r\n }\r\n };\r\n\r\n // Modified: Populate rows with placeholder values for both column and row level\r\n const populateRowsWithPlaceholders = () => {\r\n if (!tPlaceholders && !rowLevel) return;\r\n\r\n setTableData(prev => ({\r\n ...prev,\r\n name:selectedTable||'',\r\n rows: prev.rows.map((row, rowIndex) => {\r\n const updatedRow = { ...row };\r\n \r\n prev.columns.forEach(column => {\r\n let placeholderKey: string | undefined;\r\n \r\n // Priority: Row-level placeholders take precedence when rowLevel is true\r\n if (rowLevel && rowPlaceholders[rowIndex]?.[column.id]) {\r\n placeholderKey = rowPlaceholders[rowIndex][column.id];\r\n } else if (tPlaceholders?.[column.id]) {\r\n placeholderKey = tPlaceholders[column.id];\r\n }\r\n\r\n if (placeholderKey) {\r\n updatedRow[column.id] = getPlaceholderValue(placeholderKey);\r\n // Preserve static text in the _static field\r\n const staticText = customText[rowIndex]?.[column.id] || '';\r\n if (staticText) {\r\n updatedRow[`${column.id}_static`] = `${staticText} ${updatedRow[column.id]}`;\r\n }\r\n }\r\n });\r\n \r\n return updatedRow;\r\n })\r\n }));\r\n setIsUpdating(false);\r\n };\r\n\r\n // Check if a cell is merged or covered by a merge\r\n const getCellMergeInfo = (section: 'thead' | 'tbody', rowIndex: number, colIndex: number) => {\r\n const merge = mergedCells?.find(m => \r\n m.section === section &&\r\n rowIndex >= m.rowStart && rowIndex <= m.rowEnd &&\r\n colIndex >= m.colStart && colIndex <= m.colEnd\r\n );\r\n \r\n if (!merge) return null;\r\n \r\n return {\r\n merge,\r\n isTopLeft: rowIndex === merge.rowStart && colIndex === merge.colStart,\r\n isCovered: !(rowIndex === merge.rowStart && colIndex === merge.colStart)\r\n };\r\n };\r\n\r\n // Check if cell is selected for merging\r\n const isCellSelected = (section: 'thead' | 'tbody', rowIndex: number, colIndex: number) => {\r\n return selectedCells.some(cell => \r\n cell.section === section && cell.row === rowIndex && cell.col === colIndex\r\n );\r\n };\r\n\r\n // Toggle cell selection for merging\r\n const toggleCellSelection = (section: 'thead' | 'tbody', rowIndex: number, colIndex: number) => {\r\n const cellKey = { section, row: rowIndex, col: colIndex };\r\n const isSelected = isCellSelected(section, rowIndex, colIndex);\r\n \r\n if (isSelected) {\r\n setSelectedCells(prev => prev.filter(cell => \r\n !(cell.section === section && cell.row === rowIndex && cell.col === colIndex)\r\n ));\r\n } else {\r\n // Prevent mixing header and body cells in the same merge\r\n const hasDifferentSection = selectedCells.some(cell => cell.section !== section);\r\n if (hasDifferentSection) {\r\n alert('Cannot select cells from both header and body for the same merge');\r\n return;\r\n }\r\n setSelectedCells(prev => [...prev, cellKey]);\r\n }\r\n };\r\n\r\n // Open merge dialog\r\n const openMergeDialog = () => {\r\n if (selectedCells.length < 2) {\r\n alert('Please select at least 2 cells to merge');\r\n return;\r\n }\r\n \r\n // Get value from first selected cell\r\n const firstCell = selectedCells[0];\r\n let firstCellValue = '';\r\n let customTextValue = '';\r\n\r\n if (firstCell.section === 'tbody') {\r\n const columnId = tableData.columns[firstCell.col]?.id;\r\n firstCellValue = tableData.rows[firstCell.row]?.[columnId] || '';\r\n if (rowLevel) {\r\n customTextValue = customText[firstCell.row]?.[columnId] || '';\r\n }\r\n } else {\r\n firstCellValue = tableData.columns[firstCell.col]?.header || '';\r\n }\r\n\r\n // Combine customText with cell value only in row-level mode\r\n const initialMergeValue = rowLevel && customTextValue \r\n ? `${customTextValue} ${firstCellValue}`.trim() \r\n : firstCellValue;\r\n\r\n setMergeValue(initialMergeValue);\r\n setMergeDialogOpen(true);\r\n};\r\n\r\n // Perform cell merge\r\n const mergeCells = () => {\r\n if (selectedCells.length < 2) return;\r\n\r\n const section = selectedCells[0].section;\r\n const rowIndices = selectedCells.map(cell => cell.row);\r\n const colIndices = selectedCells.map(cell => cell.col);\r\n \r\n const rowStart = Math.min(...rowIndices);\r\n const rowEnd = Math.max(...rowIndices);\r\n const colStart = Math.min(...colIndices);\r\n const colEnd = Math.max(...colIndices);\r\n\r\n // Check if selection forms a rectangle\r\n const expectedCells = (rowEnd - rowStart + 1) * (colEnd - colStart + 1);\r\n if (selectedCells.length !== expectedCells) {\r\n alert('Please select a rectangular area of cells to merge');\r\n return;\r\n }\r\n\r\n // Check for overlapping merges\r\n const hasOverlap = mergedCells.some(existing => \r\n existing.section === section &&\r\n !(rowEnd < existing.rowStart || rowStart > existing.rowEnd ||\r\n colEnd < existing.colStart || colStart > existing.colEnd)\r\n );\r\n\r\n if (hasOverlap) {\r\n alert('Cannot merge cells that overlap with existing merged cells');\r\n return;\r\n }\r\n\r\n const newMerge: CellMerge = {\r\n section,\r\n rowStart,\r\n rowEnd,\r\n colStart,\r\n colEnd,\r\n value: mergeValue\r\n };\r\n\r\n setTableData(prev => ({\r\n ...prev,\r\n name:selectedTable||'',\r\n mergedCells: [...(prev.mergedCells || []), newMerge],\r\n columns: section === 'thead' ? prev.columns.map((col, index) => \r\n index === colStart ? { ...col, header: mergeValue } : col\r\n ) : prev.columns\r\n }));\r\n\r\n setSelectedCells([]);\r\n setMergeValue('');\r\n setMergeDialogOpen(false);\r\n };\r\n\r\n // Split merged cell\r\n const splitMergedCell = (mergeIndex: number) => {\r\n const merge = mergedCells[mergeIndex];\r\n \r\n setTableData(prev => {\r\n const updatedRows = [...prev.rows];\r\n const updatedColumns = [...prev.columns];\r\n \r\n if (merge.section === 'tbody') {\r\n for (let row = merge.rowStart; row <= merge.rowEnd; row++) {\r\n for (let col = merge.colStart; col <= merge.colEnd; col++) {\r\n const columnId = prev.columns[col]?.id;\r\n if (columnId && updatedRows[row]) {\r\n updatedRows[row][columnId] = merge.value;\r\n }\r\n }\r\n }\r\n } else {\r\n if (updatedColumns[merge.colStart]) {\r\n updatedColumns[merge.colStart].header = merge.value;\r\n }\r\n }\r\n \r\n return {\r\n ...prev,\r\n rows: updatedRows,\r\n name:selectedTable||'',\r\n columns: updatedColumns,\r\n mergedCells: prev.mergedCells?.filter((_, index) => index !== mergeIndex) || []\r\n };\r\n });\r\n };\r\n\r\n // Add new column\r\n const addColumn = () => {\r\n const newColumnId = generateColumnId();\r\n const newColumn: TableColumn = {\r\n id: newColumnId,\r\n header: `Column ${tableData.columns.length + 1}`\r\n };\r\n\r\n setTableData(prev => ({\r\n ...prev,\r\n name:selectedTable||'',\r\n columns: [...prev.columns, newColumn],\r\n rows: prev.rows.map(row => ({\r\n ...row,\r\n [newColumnId]: ''\r\n })),\r\n mergedCells: prev.mergedCells?.map(merge => ({\r\n ...merge\r\n })) || []\r\n }));\r\n };\r\n\r\n // Remove column\r\n const removeColumn = (columnId: string) => {\r\n const columnIndex = tableData.columns.findIndex(col => col.id === columnId);\r\n \r\n setTableData(prev => ({\r\n ...prev,\r\n name:selectedTable||'',\r\n columns: prev.columns.filter(col => col.id !== columnId),\r\n rows: prev.rows.map(row => {\r\n const { [columnId]: removed, ...rest } = row;\r\n return rest;\r\n }),\r\n mergedCells: prev.mergedCells\r\n ?.filter(merge => !(merge.colStart <= columnIndex && merge.colEnd >= columnIndex))\r\n .map(merge => ({\r\n ...merge,\r\n colStart: merge.colStart > columnIndex ? merge.colStart - 1 : merge.colStart,\r\n colEnd: merge.colEnd > columnIndex ? merge.colEnd - 1 : merge.colEnd\r\n })) || []\r\n }));\r\n\r\n if (tPlaceholders && tPlaceholders[columnId]) {\r\n const updatedPlaceholders = { ...tPlaceholders };\r\n delete updatedPlaceholders[columnId];\r\n updateAttrs({ placeholders: updatedPlaceholders });\r\n }\r\n };\r\n\r\n // Update column header\r\n const updateColumnHeader = (columnId: string, newHeader: string) => {\r\n setTableData(prev => ({\r\n ...prev,\r\n columns: prev.columns.map(col =>\r\n col.id === columnId ? { ...col, header: newHeader } : col\r\n )\r\n }));\r\n };\r\n\r\n // Add new row\r\nconst addRow = () => {\r\n const newRow: TableRow = {};\r\n\r\n tableData.columns.forEach(col => {\r\n if (tPlaceholders?.[col.id]) {\r\n const placeholderKey = tPlaceholders[col.id];\r\n newRow[col.id] = `{{${placeholderKey}}}`;\r\n if(rowLevel){\r\n newRow[`${col.id}_static`] = newRow[col.id];\r\n }\r\n \r\n } else if (tableData.rows.length > 0) {\r\n // Copy first row's data if no placeholder\r\n newRow[col.id] = tableData.rows[0][col.id] || '';\r\n if(rowLevel){\r\n newRow[`${col.id}_static`] = tableData.rows[0][`${col.id}_static`] || ''\r\n }\r\n } else {\r\n // Default to empty\r\n if(rowLevel){\r\n newRow[`${col.id}_static`] = '';\r\n }\r\n newRow[col.id] = '';\r\n }\r\n });\r\n\r\n setTableData(prev => {\r\n const updatedRows = [...prev.rows, newRow];\r\n return {\r\n ...prev,\r\n rows: updatedRows,\r\n name:selectedTable||'',\r\n mergedCells: prev.mergedCells?.map(merge => ({ ...merge })) || []\r\n };\r\n });\r\n handleSave()\r\n};\r\n\r\n // Remove row\r\n const removeRow = (rowIndex: number) => {\r\n setTableData(prev => ({\r\n ...prev,\r\n name:selectedTable||'',\r\n rows: prev.rows.filter((_, index) => index !== rowIndex),\r\n mergedCells: prev.mergedCells\r\n ?.filter(merge => !(merge.section === 'tbody' && merge.rowStart <= rowIndex && merge.rowEnd >= rowIndex))\r\n .map(merge => ({\r\n ...merge,\r\n rowStart: merge.section === 'tbody' && merge.rowStart > rowIndex ? merge.rowStart - 1 : merge.rowStart,\r\n rowEnd: merge.section === 'tbody' && merge.rowEnd > rowIndex ? merge.rowEnd - 1 : merge.rowEnd\r\n })) || []\r\n }));\r\n\r\n // Clean up rowPlaceholders and customText for the removed row\r\n setRowPlaceholders(prev => {\r\n const updated = { ...prev };\r\n delete updated[rowIndex];\r\n return updated;\r\n });\r\n setCustomText(prev => {\r\n const updated = { ...prev };\r\n delete updated[rowIndex];\r\n return updated;\r\n });\r\n };\r\n\r\n // Modified: Update cell value and trigger placeholder population\r\nconst updateRowCellValue = (rowIndex: number, columnId: string, value: string) => {\r\n setIsUpdating(true);\r\n const colIndex = tableData.columns.findIndex(col => col.id === columnId);\r\n const mergeInfo = getCellMergeInfo('tbody', rowIndex, colIndex);\r\n const staticText = rowLevel ? (customText[rowIndex]?.[columnId] || '') : '';\r\n\r\n if (mergeInfo) {\r\n setTableData(prev => ({\r\n ...prev,\r\n name:selectedTable||'',\r\n mergedCells: prev.mergedCells?.map(merge => \r\n merge === mergeInfo.merge ? { ...merge, value } : merge\r\n ) || []\r\n }));\r\n } else {\r\n if (rowLevel && value) {\r\n setRowPlaceholders(prev => {\r\n const updated = { ...prev };\r\n if (!updated[rowIndex]) {\r\n updated[rowIndex] = {};\r\n }\r\n updated[rowIndex][columnId] = value;\r\n return updated;\r\n });\r\n } else if (rowLevel && !value) {\r\n setRowPlaceholders(prev => {\r\n const updated = { ...prev };\r\n if (updated[rowIndex]?.[columnId]) {\r\n delete updated[rowIndex][columnId];\r\n if (Object.keys(updated[rowIndex]).length === 0) {\r\n delete updated[rowIndex];\r\n }\r\n }\r\n return updated;\r\n });\r\n }\r\n\r\n setTableData(prev => ({\r\n ...prev,\r\n name:selectedTable||'',\r\n rows: prev.rows.map((row, idx) =>\r\n idx === rowIndex ? { \r\n ...row, \r\n [columnId]: rowLevel ? (value ? `{{${value}}}` : '') : (value ? getPlaceholderValue(value) : ''),\r\n [`${columnId}_static`]: staticText ? `${staticText} ${value ? getPlaceholderValue(value) : ''}`.trim() : (value ? getPlaceholderValue(value) : '')\r\n } : row\r\n )\r\n }));\r\n\r\n populateRowsWithPlaceholders();\r\n }\r\n };\r\nconst updateCellValue = (rowIndex: number, columnId: string, value: string) => {\r\n setIsUpdating(true);\r\n const colIndex = tableData.columns.findIndex(col => col.id === columnId);\r\n const mergeInfo = getCellMergeInfo('tbody', rowIndex, colIndex);\r\n const staticText = customText[rowIndex]?.[columnId] || '';\r\n\r\n if (mergeInfo) {\r\n setTableData(prev => ({\r\n ...prev,\r\n name:selectedTable||'',\r\n mergedCells: prev.mergedCells?.map(merge => \r\n merge === mergeInfo.merge ? { ...merge, value } : merge\r\n ) || []\r\n }));\r\n } else {\r\n if (rowLevel) {\r\n setRowPlaceholders(prev => {\r\n const updated = { ...prev };\r\n if (!updated[rowIndex]) {\r\n updated[rowIndex] = {};\r\n }\r\n if (value) {\r\n updated[rowIndex][columnId] = value;\r\n } else {\r\n delete updated[rowIndex][columnId];\r\n if (Object.keys(updated[rowIndex]).length === 0) {\r\n delete updated[rowIndex];\r\n }\r\n }\r\n return updated;\r\n });\r\n }\r\n\r\n setTableData(prev => ({\r\n ...prev,\r\n name:selectedTable||'',\r\n rows: prev.rows.map((row, idx) =>\r\n idx === rowIndex ? { \r\n ...row, \r\n [columnId]: rowLevel ? (value ? `{{${value}}}` : '') : value,\r\n [`${columnId}_static`]: staticText ? `${staticText} ${value || ''}`.trim() : (value || '')\r\n } : row\r\n )\r\n }));\r\n\r\n if (rowLevel || (autoPopulateEnabled && tPlaceholders?.[columnId])) {\r\n populateRowsWithPlaceholders();\r\n }\r\n setIsUpdating(false);\r\n }\r\n };\r\n\r\n // Modified: Update column placeholder\r\n const updateColumnPlaceholder = (columnId: string, placeholderValue: string) => {\r\n setIsUpdating(true);\r\n const updatedPlaceholders = {\r\n ...tPlaceholders,\r\n [columnId]: placeholderValue\r\n };\r\n \r\n if (!placeholderValue) {\r\n delete updatedPlaceholders[columnId];\r\n }\r\n \r\n updateAttrs({ placeholders: updatedPlaceholders });\r\n\r\n if (autoPopulateEnabled) {\r\n const newCellValue = placeholderValue ? getPlaceholderValue(placeholderValue) : '';\r\n setTableData(prev => ({\r\n ...prev,\r\n name:selectedTable||'',\r\n rows: prev.rows.map(row => ({\r\n ...row,\r\n [columnId]: newCellValue\r\n }))\r\n }));\r\n }\r\n setIsUpdating(false);\r\n };\r\n\r\n // Refresh all rows with current placeholder values\r\n const refreshPlaceholderData = () => {\r\n populateRowsWithPlaceholders();\r\n };\r\n\r\n // Get placeholder info for display\r\n const getPlaceholderInfo = (placeholderKey: string) => {\r\n const placeholder = placeholders.find(p => p.value === placeholderKey);\r\n return placeholder ? {\r\n label: placeholder.label,\r\n type: placeholder.type || 'text',\r\n description: placeholder.description || ''\r\n } : null;\r\n };\r\n\r\n const handleTabChange = (event: React.SyntheticEvent, newValue: number) => {\r\n setTabValue(newValue);\r\n };\r\n\r\n const handleAccordionChange = (panel: string) => (event: React.SyntheticEvent, isExpanded: boolean) => {\r\n setExpanded(isExpanded ? panel : '');\r\n };\r\n\r\n const updateTableStyle = (key: string, value: any) => {\r\n setTableStyles(prev => ({\r\n ...prev,\r\n [key]: value\r\n }));\r\n };\r\n\r\n const updateHeaderStyle = (key: string, value: any) => {\r\n setTableStyles(prev => ({\r\n ...prev,\r\n tHead: {\r\n ...prev.tHead,\r\n [key]: value\r\n }\r\n }));\r\n };\r\n\r\n const updateHeaderCellStyle = (key: string, value: any) => {\r\n setTableStyles(prev => ({\r\n ...prev,\r\n thCells: {\r\n ...prev.thCells,\r\n [key]: value\r\n }\r\n }));\r\n };\r\n\r\n const updateBodyStyle = (key: string, value: any) => {\r\n setTableStyles(prev => ({\r\n ...prev,\r\n tBody: {\r\n ...prev.tBody,\r\n [key]: value\r\n }\r\n }));\r\n };\r\n\r\n const updateBodyCellStyle = (key: string, value: any) => {\r\n setTableStyles(prev => ({\r\n ...prev,\r\n tbCells: {\r\n ...prev.tbCells,\r\n [key]: value\r\n }\r\n }));\r\n };\r\n\r\n const resetTable=()=>{\r\n setTableData((prev: TableData) => ({\r\n ...prev,\r\n name:selectedTable||'',\r\n rows: prev.rows.map((row: TableRow) => {\r\n return {...Object.fromEntries(prev.columns.map((col: TableColumn) => [col?.id, '']))\r\n \t}\r\n })\r\n }));\r\n }\r\n // Count columns with placeholders\r\n const columnsWithPlaceholders = tPlaceholders ? Object.keys(tPlaceholders).length : 0;\r\nuseEffect(() => {\r\n // Determine if rowLevel should be enabled\r\n setRowLevel(levelType);\r\n setSelectedTable(tableData?.name || null); // Set default table if available\r\n // Update custom text by extracting values from _static fields\r\n setCustomText((prev: { [rowIndex: number]: { [columnId: string]: string } }) => {\r\n const updated: { [rowIndex: number]: { [columnId: string]: string } } = {}; // Fixed missing bracket here\r\n \r\n tableData.rows.forEach((row, rowIndex) => {\r\n Object.keys(row).forEach(columnId => {\r\n if (columnId.endsWith('_static')) {\r\n const originalColumnId = columnId.replace('_static', '');\r\n if (!updated[rowIndex]) {\r\n updated[rowIndex] = {};\r\n }\r\n\r\n // Get the original column value (without _static suffix)\r\n const columnValue = row[originalColumnId] || '';\r\n \r\n // Get the static value and remove the original column value if it appears\r\n let staticValue = row[columnId] || '';\r\n if (columnValue && staticValue.includes(columnValue)) {\r\n staticValue = staticValue.replace(columnValue, '').trim();\r\n }\r\n \r\n // Also remove any {{value}} placeholders\r\n staticValue = staticValue.replace(/\\{\\{\\s*value\\s*\\}\\}/g, '').trim();\r\n \r\n updated[rowIndex][originalColumnId] = staticValue;\r\n }\r\n });\r\n });\r\n \r\n return updated;\r\n });\r\n\r\n}, [tableData]);\r\n\r\nuseEffect(()=>{\r\n if(!selectedTable) {\r\n resetTable()\r\n }\r\n\r\n},[selectedTable]);\r\n return (\r\n <>\r\n <Box sx={{ mb: 2, borderBottom: 1,paddingBottom: 5, borderColor: 'divider' }}>\r\n <Tabs value={tabValue} onChange={handleTabChange} variant=\"fullWidth\" sx={(theme) => ({\r\n '& .MuiTabs-indicator': {\r\n backgroundColor: theme.palette.theme?.primary[700]\r\n },\r\n '& .MuiTab-root.Mui-selected': {\r\n color: theme.palette.theme?.primary[700],\r\n },\r\n '& .MuiTab-root': {\r\n textTransform: 'none'\r\n },\r\n })}>\r\n <Tab label=\"Content\" />\r\n <Tab label=\"Styles\" />\r\n <Tab label=\"Cell Merging\" />\r\n </Tabs>\r\n </Box>\r\n\r\n {tabValue === 0 && (\r\n <>\r\n <Box sx={{ mb: 2, p: 2, bgcolor: 'grey.50', borderRadius: 1, border: '1px solid', borderColor: 'divider' }}>\r\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 1 }}>\r\n <Typography type=\"s4\" weight=\"medium\" color=\"theme.primary.700\">\r\n Dynamic Data Settings\r\n </Typography>\r\n <Chip \r\n label={`${columnsWithPlaceholders} columns linked`} \r\n size=\"small\" \r\n color=\"primary\" \r\n variant=\"outlined\"\r\n sx={theme => ({\r\n color: theme.palette.theme?.primary[700],\r\n borderColor: theme.palette.theme?.primary[700]\r\n })}\r\n />\r\n </Box>\r\n \r\n <FormControlLabel\r\n control={\r\n <Android12Switch\r\n checked={autoPopulateEnabled}\r\n onChange={(e) => setAutoPopulateEnabled(e.target.checked)}\r\n />\r\n }\r\n label={\r\n <Typography type=\"s5\" color=\"theme.secondary.800\">\r\n Auto-populate rows with placeholder data\r\n </Typography>\r\n }\r\n />\r\n <FormControlLabel\r\n control={\r\n <Android12Switch\r\n checked={rowLevel}\r\n onChange={(e) => {\r\n setRowLevel(e.target.checked);\r\n setSelectedTable(null); // Reset selected table when toggling row level\r\n setParentRowLevel(e.target.checked);\r\n resetTable();\r\n }}\r\n />\r\n }\r\n label={\r\n <Typography type=\"s5\" color=\"theme.secondary.800\">\r\n Row Level Management\r\n </Typography>\r\n }\r\n />\r\n \r\n {autoPopulateEnabled && (\r\n <Box sx={{ mt: 1 }}>\r\n <Button\r\n variant=\"outlined\"\r\n size=\"small\"\r\n onClick={refreshPlaceholderData}\r\n startIcon={<RefreshIcon />}\r\n className='black-outlined-btn'\r\n >\r\n Refresh Data\r\n </Button>\r\n </Box>\r\n )}\r\n </Box>\r\n\r\n <Box sx={{ mb: 2 }}>\r\n <Typography type=\"s3\" weight=\"medium\" color=\"theme.secondary.1000\" sx={{ mb: 1 }}>\r\n Columns\r\n </Typography>\r\n {tableData.columns?.map((column, index) => (\r\n <Box key={column.id} sx={{ mb: 1, display: 'flex', alignItems: 'center', gap: 1 }}>\r\n <TextField\r\n label={`Column ${index + 1} Header`}\r\n value={column.header}\r\n onChange={(e) => updateColumnHeader(column.id, e.target.value)}\r\n size=\"small\"\r\n sx={{ flex: 1 }}\r\n />\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => removeColumn(column.id)}\r\n disabled={tableData.columns.length <= 1}\r\n color=\"error\"\r\n >\r\n <Trash />\r\n </IconButton>\r\n </Box>\r\n ))}\r\n <Button\r\n variant=\"outlined\"\r\n size=\"small\"\r\n onClick={addColumn}\r\n startIcon={<AddIcon />}\r\n sx={{ mt: 1 }}\r\n className='black-outlined-btn'\r\n >\r\n Add Column\r\n </Button>\r\n </Box>\r\n\r\n <Divider sx={{ my: 2 }} />\r\n\r\n <Box sx={{ mb: 2 }}>\r\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 1 }}>\r\n <Typography type=\"s3\" weight=\"medium\" color=\"theme.secondary.1000\">\r\n Rows ({tableData.rows.length})\r\n </Typography>\r\n <Button\r\n variant=\"outlined\"\r\n size=\"small\"\r\n disabled={selectedTable}\r\n onClick={() => addRow()}\r\n startIcon={<AddIcon />}\r\n className='black-outlined-btn'\r\n >\r\n Add Row\r\n </Button>\r\n </Box>\r\n {!rowLevel &&\r\n <Box sx={{ mb: 2 }}>\r\n <SearchableSelect\r\n value={selectedTable || ''}\r\n label={'Select Table'}\r\n options={relation_table?.map(table=>(\r\n { value: table?.dataKey, label: (table.name.charAt(0).toUpperCase() + table.name.slice(1)).replaceAll('_', ' ') }\r\n )) || []}\r\n onChange={(e) => {\r\n setSelectedTable(e.target.value);\r\n }}\r\n />\r\n </Box>\r\n\r\n }\r\n {tableData.rows.map((row, rowIndex) => (\r\n <Box key={rowIndex} sx={{ mb: 2, p: 2, border: 1, borderColor: 'divider', borderRadius: 1 }}>\r\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 1 }}>\r\n <Typography type=\"s4\" weight=\"medium\" color=\"theme.secondary.800\">\r\n Row {rowIndex + 1}\r\n </Typography>\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => removeRow(rowIndex)}\r\n disabled={tableData.rows.length <= 1}\r\n color=\"error\"\r\n >\r\n <Trash />\r\n </IconButton>\r\n </Box>\r\n <Grid container spacing={1}>\r\n \r\n {tableData.columns.map((column, colIndex) => {\r\n const hasPlaceholder = rowLevel ? rowPlaceholders[rowIndex]?.[column.id] : tPlaceholders?.[column.id];\r\n const placeholderInfo = hasPlaceholder ? getPlaceholderInfo(tPlaceholders?.[column.id] || rowPlaceholders[rowIndex]?.[column.id]) : null;\r\n const mergeInfo = getCellMergeInfo('tbody', rowIndex, colIndex);\r\n\r\n return (\r\n <Grid item xs={12} key={column.id}>\r\n \r\n {rowLevel ? (\r\n <>\r\n <Typography type=\"s4\" weight=\"medium\" color=\"theme.secondary.800\"> {column.header} </Typography>\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n flexDirection: 'row',\r\n gap: 1,\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n }}\r\n >\r\n <TextField\r\n value={customText[rowIndex]?.[column.id] || ''}\r\n onChange={(e) => {\r\n const newValue = e.target.value;\r\n setCustomText(prev => {\r\n const updated = { ...prev };\r\n if (!updated[rowIndex]) {\r\n updated[rowIndex] = {};\r\n }\r\n updated[rowIndex][column.id] = newValue;\r\n return updated;\r\n });\r\n\r\n // Update table data on custom text change\r\n setTableData(prev => ({\r\n ...prev,\r\n rows: prev.rows.map((row, idx) =>\r\n idx === rowIndex\r\n ? {\r\n ...row,\r\n [`${column.id}_static`]: newValue\r\n ? `${newValue} ${row[column.id] || ''}`.trim()\r\n : '',\r\n }\r\n : row\r\n ),\r\n }));\r\n }}\r\n size=\"small\"\r\n placeholder=\"Enter custom text...\"\r\n sx={{ flex: 1, minWidth: 150 }}\r\n />\r\n <Box sx={{ flex: 1, minWidth: 150 }}>\r\n <SearchableSelect\r\n value={mergeInfo ? mergeInfo.merge.value : (rowPlaceholders[rowIndex]?.[column.id] ||row[column.id]|| '')}\r\n onChange={(e) => updateRowCellValue(rowIndex, column.id, e.target.value)}\r\n size=\"small\"\r\n options={placeholders || []}\r\n // disabled={isUpdating}\r\n sx={{\r\n flex: 1,\r\n maxWidth: 150,\r\n minWidth: 150,\r\n '& .MuiInputBase-input': {\r\n bgcolor:\r\n hasPlaceholder && autoPopulateEnabled\r\n ? 'grey.100'\r\n : mergeInfo\r\n ? 'blue.50'\r\n : 'transparent',\r\n width: 150,\r\n \r\n },\r\n }}\r\n />\r\n </Box>\r\n </Box>\r\n </>\r\n ) : (\r\n <TextField\r\n label={column.header}\r\n value={mergeInfo ? mergeInfo.merge.value : (row[column.id] || '')}\r\n onChange={(e) => updateCellValue(rowIndex, column.id, e.target.value)}\r\n size=\"small\"\r\n fullWidth\r\n disabled={autoPopulateEnabled || hasPlaceholder}\r\n helperText={\r\n mergeInfo\r\n ? `Merged cell (${mergeInfo.merge.rowEnd - mergeInfo.merge.rowStart + 1}×${mergeInfo.merge.colEnd - mergeInfo.merge.colStart + 1})`\r\n : hasPlaceholder && placeholderInfo\r\n ? `Linked to: ${placeholderInfo.label}`\r\n : undefined\r\n }\r\n sx={{\r\n '& .MuiInputBase-input': {\r\n bgcolor:\r\n hasPlaceholder && autoPopulateEnabled\r\n ? 'grey.100'\r\n : mergeInfo\r\n ? 'blue.50'\r\n : 'transparent',\r\n },\r\n }}\r\n />\r\n )}\r\n </Grid>\r\n );\r\n })}\r\n </Grid>\r\n </Box>\r\n ))}\r\n </Box>\r\n\r\n <Divider sx={{ my: 2 }} />\r\n\r\n <Typography type=\"s3\" weight=\"medium\" color=\"theme.secondary.1000\" sx={{ mb: 1 }}>\r\n Column Data Sources\r\n </Typography>\r\n \r\n {placeholders.length === 0 && (\r\n <Alert severity=\"info\" sx={{ mb: 2 }}>\r\n No placeholders available. Add placeholders to dynamically populate table data.\r\n </Alert>\r\n )}\r\n \r\n <Grid container spacing={1} alignItems='center'>\r\n {tableData.columns.map((column) => {\r\n const currentPlaceholder =tPlaceholders?.[column.id]|| tableData.rows?.[0]?.[column.id];\r\n\r\n const placeholderInfo = currentPlaceholder ? getPlaceholderInfo(currentPlaceholder) : null;\r\n \r\n return (\r\n <React.Fragment key={column.id}>\r\n <Grid item xs={4}>\r\n <Typography type=\"s5\" weight=\"medium\" color=\"theme.secondary.800\">\r\n {column.header}\r\n </Typography>\r\n {placeholderInfo && (\r\n <Typography type=\"s6\" color=\"theme.secondary.600\" sx={{ fontStyle: 'italic' }}>\r\n {placeholderInfo.type}\r\n </Typography>\r\n )}\r\n </Grid>\r\n <Grid item xs={8}>\r\n <SearchableSelect\r\n value={rowLevel ? '' : (currentPlaceholder || '')}\r\n onChange={(e) => {\r\n updateColumnPlaceholder(column.id, e.target.value as string)\r\n }}\r\n size=\"small\"\r\n options={tableAttributes.map(attr => ({\r\n value: attr.value,\r\n label: attr.label,\r\n // Include description if available in your tableAttributes\r\n description: attr.description \r\n }))}\r\n disabled={isUpdating || rowLevel}\r\n sx={{\r\n flex: 1,\r\n maxWidth: 150,\r\n minWidth: 150,\r\n '& .MuiInputBase-input': {\r\n bgcolor: 'transparent',\r\n width: 150,\r\n },\r\n }}\r\n renderOption={(props, option) => (\r\n <MenuItem {...props} key={option.value}>\r\n <Box>\r\n <Typography type=\"s5\" color=\"theme.secondary.1000\">\r\n {option.label}\r\n </Typography>\r\n {option.description && (\r\n <Typography type=\"s6\" color=\"theme.secondary.600\" sx={{ fontStyle: 'italic' }}>\r\n {option.description}\r\n </Typography>\r\n )}\r\n </Box>\r\n </MenuItem>\r\n )}\r\n noOptionsText={\r\n <MenuItem disabled>\r\n <Typography type=\"s5\" color=\"theme.secondary.600\">\r\n No Data Source\r\n </Typography>\r\n </MenuItem>\r\n }\r\n />\r\n {/* <Select\r\n value={rowLevel ? '' : (currentPlaceholder || '')}\r\n onChange={(e) => updateColumnPlaceholder(column.id, e.target.value as string)}\r\n renderValue={(value) => {\r\n if (!value) return 'Select Data Source';\r\n const placeholder = placeholders.find(p => p.value === value);\r\n return placeholder?.label||currentPlaceholder || 'Unknown Placeholder';\r\n }}\r\n fullWidth\r\n disabled={isUpdating}\r\n size=\"small\"\r\n displayEmpty\r\n disabled={rowLevel}\r\n >\r\n <MenuItem value=\"\">\r\n <Typography type=\"s5\" color=\"theme.secondary.600\">No Data Source</Typography>\r\n </MenuItem>\r\n {tableAttributes.map((placeholder) => (\r\n <MenuItem key={placeholder.value} value={placeholder.value}>\r\n <Box>\r\n <Typography type=\"s5\" color=\"theme.secondary.1000\">\r\n {placeholder.label}\r\n </Typography>\r\n {placeholder.description && (\r\n <Typography type=\"s6\" color=\"theme.secondary.600\" sx={{ fontStyle: 'italic' }}>\r\n {placeholder.description}\r\n </Typography>\r\n )}\r\n </Box>\r\n </MenuItem>\r\n ))}\r\n </Select> */}\r\n </Grid>\r\n </React.Fragment>\r\n );\r\n })}\r\n </Grid>\r\n </>\r\n )}\r\n\r\n {tabValue === 1 && (\r\n <Box sx={{\r\n '& >:first-child': { borderTopLeftRadius: 8, borderTopRightRadius: 8 },\r\n '& >:last-child': { borderBottomLeftRadius: 8, borderBottomRightRadius: 8 }\r\n }}>\r\n <Accordion \r\n expanded={expanded === 'tableBasic'} \r\n onChange={handleAccordionChange('tableBasic')}\r\n disableGutters\r\n >\r\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\r\n <Typography type='s3' color='theme.secondary.1000'>Table Basic Properties</Typography>\r\n </AccordionSummary>\r\n <AccordionDetails>\r\n <BorderControl\r\n styles={tableStyles}\r\n onChange={(key, value) => updateTableStyle(key, value)}\r\n isBordered={tableStyles.is_bordered}\r\n disableRadius\r\n />\r\n </AccordionDetails>\r\n </Accordion>\r\n\r\n <Accordion \r\n expanded={expanded === 'tableHeader'} \r\n onChange={handleAccordionChange('tableHeader')}\r\n disableGutters\r\n >\r\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\r\n <Typography type='s3' color='theme.secondary.1000'>Table Header Styles</Typography>\r\n </AccordionSummary>\r\n <AccordionDetails>\r\n <Grid container spacing={2}>\r\n <Grid item xs={12}>\r\n <ColorPickerInput\r\n value={tableStyles.tHead?.backgroundColor || '#f5f5f5'}\r\n onChange={(color) => updateHeaderStyle('backgroundColor', color)}\r\n fullWidth\r\n label='Background Color'\r\n />\r\n </Grid>\r\n \r\n <Grid item xs={12}>\r\n <ColorPickerInput\r\n value={tableStyles.tHead?.color || '#333333'}\r\n onChange={(color) => updateHeaderStyle('color', color)}\r\n fullWidth\r\n label='Text Color'\r\n />\r\n </Grid>\r\n\r\n <Grid item xs={6}>\r\n <TextField\r\n label='Font Size'\r\n type='number'\r\n value={tableStyles.tHead?.fontSize || 14}\r\n onChange={(e) => updateHeaderStyle('fontSize', parseInt(e.target.value) || 14)}\r\n size='small'\r\n fullWidth\r\n />\r\n </Grid>\r\n\r\n <Grid item xs={6}>\r\n <Select\r\n value={tableStyles.tHead?.fontWeight || 'bold'}\r\n onChange={(e) => updateHeaderStyle('fontWeight', e.target.value)}\r\n fullWidth\r\n size='small'\r\n label='Font Weight'\r\n >\r\n {fontWeightOptions.map(weight => (\r\n <MenuItem key={weight} value={weight}>\r\n {formatText(weight)}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </Grid>\r\n\r\n <Grid item xs={12}>\r\n <Select\r\n value={tableStyles.tHead?.fontFamily || 'Arial, sans-serif'}\r\n onChange={(e) => updateHeaderStyle('fontFamily', e.target.value)}\r\n fullWidth\r\n size='small'\r\n label='Font Family'\r\n >\r\n {fontFamilyOptions.map(font => (\r\n <MenuItem key={font} value={font}>\r\n {font.split(',')[0]}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </Grid>\r\n\r\n <Grid item xs={6}>\r\n <Select\r\n value={tableStyles.tHead?.textAlign || 'left'}\r\n onChange={(e) => updateHeaderStyle('textAlign', e.target.value)}\r\n fullWidth\r\n size='small'\r\n label='Text Align'\r\n >\r\n {textAlignOptions.map(align => (\r\n <MenuItem key={align} value={align}>\r\n {formatText(align)}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </Grid>\r\n\r\n <Grid item xs={6}>\r\n <TextField\r\n label='Cell Padding'\r\n type='number'\r\n value={tableStyles.thCells?.padding || 8}\r\n onChange={(e) => updateHeaderCellStyle('padding', parseInt(e.target.value) || 8)}\r\n size='small'\r\n fullWidth\r\n />\r\n </Grid>\r\n\r\n <Grid item xs={12}>\r\n <FormControlLabel\r\n control={\r\n <Android12Switch\r\n checked={!!tableStyles.tBody?.zebraStriping}\r\n onChange={(e) => updateBodyStyle('zebraStriping', e.target.checked)}\r\n />\r\n }\r\n label=\"Zebra Striping\"\r\n />\r\n </Grid>\r\n\r\n {tableStyles.tBody?.zebraStriping && (\r\n <Grid item xs={12}>\r\n <Typography type='s5' weight='medium' color='theme.secondary.1000' variant=\"caption\">Alternating Row Color</Typography>\r\n <ColorPickerInput\r\n value={tableStyles.tBody?.alternateRowColor || '#f9f9f9'}\r\n onChange={(color) => updateBodyStyle('alternateRowColor', color)}\r\n fullWidth\r\n />\r\n </Grid>\r\n )}\r\n </Grid>\r\n </AccordionDetails>\r\n </Accordion>\r\n\r\n <Accordion \r\n expanded={expanded === 'tableBody'} \r\n onChange={handleAccordionChange('tableBody')}\r\n disableGutters\r\n >\r\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\r\n <Typography type='s3' color='theme.secondary.1000'>Table Body Styles</Typography>\r\n </AccordionSummary>\r\n <AccordionDetails>\r\n <Grid container spacing={2}>\r\n <Grid item xs={12}>\r\n <ColorPickerInput\r\n value={tableStyles.tBody?.backgroundColor || '#ffffff'}\r\n onChange={(color) => updateBodyStyle('backgroundColor', color)}\r\n fullWidth\r\n label='Background Color'\r\n />\r\n </Grid>\r\n \r\n <Grid item xs={12}>\r\n <ColorPickerInput\r\n value={tableStyles.tBody?.color || '#333333'}\r\n onChange={(color) => updateBodyStyle('color', color)}\r\n fullWidth\r\n label='Text Color'\r\n />\r\n </Grid>\r\n\r\n <Grid item xs={6}>\r\n <TextField\r\n label='Font Size'\r\n type='number'\r\n value={tableStyles.tBody?.fontSize || 14}\r\n onChange={(e) => updateBodyStyle('fontSize', parseInt(e.target.value) || 14)}\r\n size='small'\r\n fullWidth\r\n />\r\n </Grid>\r\n\r\n <Grid item xs={6}>\r\n <Select\r\n value={tableStyles.tBody?.fontWeight || 'normal'}\r\n onChange={(e) => updateBodyStyle('fontWeight', e.target.value)}\r\n fullWidth\r\n size='small'\r\n label='Font Weight'\r\n >\r\n {fontWeightOptions.map(weight => (\r\n <MenuItem key={weight} value={weight}>\r\n {formatText(weight)}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </Grid>\r\n\r\n <Grid item xs={12}>\r\n <Select\r\n value={tableStyles.tBody?.fontFamily || 'Arial, sans-serif'}\r\n onChange={(e) => updateBodyStyle('fontFamily', e.target.value)}\r\n fullWidth\r\n size='small'\r\n label='Font Family'\r\n >\r\n {fontFamilyOptions.map(font => (\r\n <MenuItem key={font} value={font}>\r\n {font.split(',')[0]}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </Grid>\r\n\r\n <Grid item xs={6}>\r\n <Select\r\n value={tableStyles.tBody?.textAlign || 'left'}\r\n onChange={(e) => updateBodyStyle('textAlign', e.target.value)}\r\n fullWidth\r\n size='small'\r\n label='Text Align'\r\n >\r\n {textAlignOptions.map(align => (\r\n <MenuItem key={align} value={align}>\r\n {formatText(align)}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </Grid>\r\n\r\n <Grid item xs={6}>\r\n <TextField\r\n label='Cell Padding'\r\n type='number'\r\n value={tableStyles.tbCells?.padding || 8}\r\n onChange={(e) => updateBodyCellStyle('padding', parseInt(e.target.value) || 8)}\r\n size='small'\r\n fullWidth\r\n />\r\n </Grid>\r\n </Grid>\r\n </AccordionDetails>\r\n </Accordion>\r\n </Box>\r\n )}\r\n\r\n {tabValue === 2 && (\r\n <Box>\r\n <Box sx={{ mb: 3 }}>\r\n <Typography type=\"s3\" weight=\"medium\" color=\"theme.secondary.1000\" sx={{ mb: 2 }}>\r\n Cell Selection & Merging\r\n </Typography>\r\n \r\n <Alert severity=\"info\" sx={{ mb: 2 }}>\r\n Click on cells in the table below to select them for merging. Selected cells will be highlighted. You can merge cells within the header or body, but not across both.\r\n </Alert>\r\n\r\n <Box sx={{ display: 'flex', gap: 1, mb: 2, flexWrap: 'wrap' }}>\r\n <Button\r\n variant=\"contained\"\r\n size=\"small\"\r\n onClick={openMergeDialog}\r\n startIcon={<MergeIcon />}\r\n disabled={selectedCells.length < 2}\r\n color=\"primary\"\r\n >\r\n Merge Selected ({selectedCells.length})\r\n </Button>\r\n \r\n <Button\r\n variant=\"outlined\"\r\n size=\"small\"\r\n onClick={() => setSelectedCells([])}\r\n disabled={selectedCells.length === 0}\r\n className='black-outlined-btn'\r\n >\r\n Clear Selection\r\n </Button>\r\n </Box>\r\n\r\n <Box sx={{ \r\n border: 1, \r\n borderColor: 'divider', \r\n borderRadius: 1, \r\n overflow: 'auto',\r\n maxHeight: 400\r\n }}>\r\n <Table size=\"small\" sx={{ minWidth: 300 }}>\r\n <TableHead>\r\n <TableRow>\r\n {tableData.columns.map((column, colIndex) => {\r\n const mergeInfo = getCellMergeInfo('thead', 0, colIndex);\r\n const isSelected = isCellSelected('thead', 0, colIndex);\r\n \r\n if (mergeInfo?.isCovered) {\r\n return null;\r\n }\r\n\r\n const cellContent = mergeInfo ? mergeInfo.merge.value : column.header;\r\n const rowSpan = mergeInfo ? mergeInfo.merge.rowEnd - mergeInfo.merge.rowStart + 1 : 1;\r\n const colSpan = mergeInfo ? mergeInfo.merge.colEnd - mergeInfo.merge.colStart + 1 : 1;\r\n\r\n return (\r\n <TableCell \r\n key={column.id}\r\n rowSpan={rowSpan}\r\n colSpan={colSpan}\r\n onClick={() => !mergeInfo && toggleCellSelection('thead', 0, colIndex)}\r\n sx={(theme) => ({ \r\n fontWeight: 'bold',\r\n bgcolor: mergeInfo ? 'blue.50' : \r\n isSelected ? 'primary.100' : 'grey.100',\r\n position: 'sticky',\r\n top: 0,\r\n zIndex: 1,\r\n cursor: mergeInfo ? 'default' : 'pointer',\r\n border: isSelected ? 2 : 1,\r\n borderColor: isSelected ? theme.palette.theme.primary[800] : 'divider',\r\n '&:hover': mergeInfo ? {} : {\r\n bgcolor: isSelected ? 'primary.200' : 'grey.50'\r\n }\r\n })}\r\n >\r\n {cellContent}\r\n {mergeInfo && (\r\n <Chip\r\n label={`${rowSpan}×${colSpan}`}\r\n size=\"small\"\r\n color=\"primary\"\r\n variant=\"outlined\"\r\n sx={(theme) => ({\r\n position: 'absolute',\r\n top: 2,\r\n right: 2,\r\n fontSize: '0.6rem',\r\n height: 16,\r\n color: theme.palette.theme.primary[800],\r\n borderColor: theme.palette.theme.primary[800]\r\n })}\r\n />\r\n )}\r\n {isSelected && (\r\n <Checkbox\r\n checked={true}\r\n size=\"small\"\r\n sx={{\r\n position: 'absolute',\r\n top: 2,\r\n left: 2,\r\n padding: 0\r\n }}\r\n />\r\n )}\r\n </TableCell>\r\n );\r\n })}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {tableData.rows.map((row, rowIndex) => (\r\n <TableRow key={rowIndex}>\r\n {tableData.columns.map((column, colIndex) => {\r\n const mergeInfo = getCellMergeInfo('tbody', rowIndex, colIndex);\r\n const isSelected = isCellSelected('tbody', rowIndex, colIndex);\r\n \r\n if (mergeInfo?.isCovered) {\r\n return null;\r\n }\r\n\r\n // Get customText for the cell\r\n const customTextValue = customText[rowIndex]?.[column.id] || '';\r\n // Combine customText with cell value or merge value\r\n const cellContent = mergeInfo \r\n ? mergeInfo.merge.value // Already includes customText from mergeCells\r\n : customTextValue \r\n ? `${customTextValue} ${row[column.id] || ''}`.trim() \r\n : row[column.id] || '';\r\n\r\n const rowSpan = mergeInfo ? mergeInfo.merge.rowEnd - mergeInfo.merge.rowStart + 1 : 1;\r\n const colSpan = mergeInfo ? mergeInfo.merge.colEnd - mergeInfo.merge.colStart + 1 : 1;\r\n\r\n return (\r\n <TableCell\r\n key={column.id}\r\n rowSpan={rowSpan}\r\n colSpan={colSpan}\r\n onClick={() => !mergeInfo && toggleCellSelection('tbody', rowIndex, colIndex)}\r\n sx={(theme) => ({ \r\n cursor: mergeInfo ? 'default' : 'pointer',\r\n bgcolor: mergeInfo ? 'blue.50' : \r\n isSelected ? 'primary.100' : \r\n 'transparent',\r\n border: isSelected ? 2 : 1,\r\n borderColor: isSelected ? theme.palette.theme?.primary[800] : 'divider',\r\n '&:hover': mergeInfo ? {} : {\r\n bgcolor: isSelected ? 'primary.200' : 'grey.50'\r\n },\r\n position: 'relative'\r\n })}\r\n >\r\n {cellContent}\r\n {mergeInfo && (\r\n <Chip\r\n label={`${rowSpan}×${colSpan}`}\r\n size=\"small\"\r\n color=\"primary\"\r\n variant=\"outlined\"\r\n sx={(theme) => ({\r\n position: 'absolute',\r\n top: 2,\r\n right: 2,\r\n fontSize: '0.6rem',\r\n height: 16,\r\n color: theme.palette.theme?.primary[800],\r\n borderColor: theme.palette.theme?.primary[800]\r\n })}\r\n />\r\n )}\r\n {isSelected && (\r\n <Checkbox\r\n checked={true}\r\n size=\"small\"\r\n sx={{\r\n position: 'absolute',\r\n top: 2,\r\n left: 2,\r\n padding: 0\r\n }}\r\n />\r\n )}\r\n </TableCell>\r\n );\r\n })}\r\n </TableRow>\r\n ))}\r\n</TableBody>\r\n </Table>\r\n </Box>\r\n </Box>\r\n\r\n {mergedCells.length > 0 && (\r\n <Box sx={{ mt: 3 }}>\r\n <Typography type=\"s3\" weight=\"medium\" color=\"theme.secondary.1000\" sx={{ mb: 2 }}>\r\n Merged Cells ({mergedCells.length})\r\n </Typography>\r\n \r\n {mergedCells.map((merge, index) => (\r\n <Box \r\n key={index}\r\n sx={{ \r\n p: 2, \r\n mb: 1, \r\n border: 1, \r\n borderColor: 'divider', \r\n borderRadius: 1,\r\n bgcolor: 'blue.25'\r\n }}\r\n >\r\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', mb: 1 }}>\r\n <Box>\r\n <Typography type=\"s4\" weight=\"medium\" color=\"theme.secondary.900\">\r\n Merge {index + 1}: {merge.rowEnd - merge.rowStart + 1}×{merge.colEnd - merge.colStart + 1} cells ({merge.section})\r\n </Typography>\r\n <Typography type=\"s5\" color=\"theme.secondary.700\">\r\n Rows {merge.rowStart + 1}-{merge.rowEnd + 1}, Columns {merge.colStart + 1}-{merge.colEnd + 1}\r\n </Typography>\r\n </Box>\r\n <Button\r\n variant=\"outlined\"\r\n size=\"small\"\r\n onClick={() => splitMergedCell(index)}\r\n startIcon={<SplitIcon />}\r\n className='black-outlined-btn'\r\n >\r\n Split\r\n </Button>\r\n </Box>\r\n \r\n <TextField\r\n label=\"Merged Cell Value\"\r\n value={merge.value}\r\n onChange={(e) => {\r\n setTableData(prev => ({\r\n ...prev,\r\n mergedCells: prev.mergedCells?.map((m, i) => \r\n i === index ? { ...m, value: e.target.value } : m\r\n ) || []\r\n }));\r\n }}\r\n size=\"small\"\r\n fullWidth\r\n multiline\r\n rows={2}\r\n />\r\n </Box>\r\n ))}\r\n </Box>\r\n )}\r\n </Box>\r\n )}\r\n\r\n <Dialog\r\n open={mergeDialogOpen}\r\n onClose={() => setMergeDialogOpen(false)}\r\n maxWidth=\"sm\"\r\n fullWidth\r\n >\r\n <DialogTitle>\r\n <Typography type=\"s2\" weight=\"medium\">\r\n Merge Selected Cells\r\n </Typography>\r\n </DialogTitle>\r\n <DialogContent>\r\n <Typography type=\"s4\" color=\"theme.secondary.700\" sx={{ mb: 2 }}>\r\n You are about to merge {selectedCells.length} selected cells in {selectedCells[0]?.section}. \r\n Enter the value for the merged cell:\r\n </Typography>\r\n \r\n <TextField\r\n label=\"Merged Cell Value\"\r\n value={mergeValue}\r\n onChange={(e) => setMergeValue(e.target.value)}\r\n fullWidth\r\n multiline\r\n rows={3}\r\n sx={{ mt: 1 }}\r\n />\r\n \r\n <Alert severity=\"info\" sx={{ mt: 2 }}>\r\n The merged cell will span from row {Math.min(...selectedCells.map(c => c.row)) + 1} to {Math.max(...selectedCells.map(c => c.row)) + 1} \r\n and column {Math.min(...selectedCells.map(c => c.col)) + 1} to {Math.max(...selectedCells.map(c => c.col)) + 1} in {selectedCells[0]?.section}.\r\n </Alert>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button onClick={() => setMergeDialogOpen(false)}>\r\n Cancel\r\n </Button>\r\n <Button \r\n onClick={mergeCells}\r\n variant=\"contained\"\r\n color=\"primary\"\r\n >\r\n Merge Cells\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n </>\r\n );\r\n};\r\n\r\nexport default TableControls;","/* eslint-disable unused-imports/no-unused-vars */\r\nimport React from 'react';\r\nimport {\r\n Box,\r\n Slider,\r\n InputAdornment,\r\n} from '@mui/material';\r\nimport ColorLensIcon from '@mui/icons-material/ColorLens';\r\nimport Typography from '../../../../components/typography/typography';\r\nimport TextField from '../../../../components/text-field/text-field';\r\n\r\ninterface SignatureControlsProps {\r\n attrs: Record<string, any>;\r\n updateAttrs: (attr: Record<string, any>) => void;\r\n}\r\n\r\nconst SignatureControls: React.FC<SignatureControlsProps> = ({\r\n attrs,\r\n updateAttrs,\r\n}) => {\r\n const { styles } = attrs\r\n return (\r\n <>\r\n <Box sx={{ mb: 1 }}>\r\n <Typography type=\"s5\" color='theme.secondary.800' weight='medium'>\r\n Font Size\r\n </Typography>\r\n <Slider\r\n value={styles?.fontSize}\r\n onChange={(_, value) => updateAttrs({ styles :{ fontSize: value as number }})}\r\n min={10}\r\n max={20}\r\n step={1}\r\n valueLabelDisplay=\"auto\"\r\n size=\"small\"\r\n sx={(theme) => ({\r\n '& .MuiSlider-rail': {\r\n color: theme.palette.theme.primary[500],\r\n },\r\n '& .MuiSlider-thumb': {\r\n color: theme.palette.theme.primary[800],\r\n },\r\n '& .MuiSlider-track': {\r\n color: theme.palette.theme.primary[600],\r\n },\r\n })}\r\n />\r\n </Box>\r\n <Box sx={{ mb: 2, }}>\r\n <TextField\r\n label=\"Text Color\"\r\n type=\"color\"\r\n value={styles?.color}\r\n onChange={(e) => updateAttrs({ styles :{ color: e.target.value }})}\r\n fullWidth\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <ColorLensIcon fontSize=\"small\" />\r\n </InputAdornment>\r\n ),\r\n }}\r\n />\r\n </Box>\r\n </>\r\n );\r\n};\r\n\r\nexport default SignatureControls;","/* eslint-disable unused-imports/no-unused-vars */\r\nimport React from 'react';\r\nimport { Box, Slider} from '@mui/material';\r\nimport Typography from '../../../../components/typography/typography';\r\nimport AlignmentControl from './AlignmentControl';\r\n\r\ninterface CodeControlsProps {\r\n // type: 'qr-code' | 'bar-code';\r\n attrs: Record<string, any>;\r\n updateAttrs: (attr: Record<string, any>) => void;\r\n}\r\n\r\nconst CodeControls: React.FC<CodeControlsProps> = ({\r\n // type,\r\n attrs,\r\n updateAttrs,\r\n}) => {\r\n const { styles } = attrs\r\n\r\n const updateStyles = (styles: Record<string, any>) => {\r\n updateAttrs({ styles });\r\n }\r\n\r\n const handleAlignmentChange = (\r\n event: React.MouseEvent<HTMLElement>,\r\n newAlignment: string | null,\r\n ) => {\r\n if (newAlignment !== null) {\r\n updateStyles({ textAlign: newAlignment });\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <Box sx={{ mb: 2 }}>\r\n <Typography type=\"s3\" color='theme.neutral.800'>\r\n Size (px)\r\n </Typography>\r\n <Slider\r\n value={styles.fontSize}\r\n onChange={(_, value) => updateStyles({ fontSize: value as number })}\r\n min={10}\r\n max={25}\r\n step={5}\r\n valueLabelDisplay=\"auto\"\r\n size=\"small\"\r\n sx={(theme) => ({\r\n '& .MuiSlider-rail': {\r\n color: theme.palette.theme.primary[500],\r\n },\r\n '& .MuiSlider-thumb': {\r\n color: theme.palette.theme.primary[800],\r\n },\r\n '& .MuiSlider-track': {\r\n color: theme.palette.theme.primary[600],\r\n },\r\n })}\r\n />\r\n </Box>\r\n <AlignmentControl alignment={styles?.textAlign} onAlignmentChange={handleAlignmentChange} displayLabel/>\r\n </>\r\n );\r\n};\r\n\r\nexport default CodeControls;","/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable react-hooks/exhaustive-deps */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React, { useState, useEffect, useMemo, useCallback } from 'react';\r\nimport {\r\n Box,\r\n Paper,\r\n IconButton,\r\n FormControl,\r\n MenuItem,\r\n Tooltip,\r\n} from '@mui/material';\r\nimport CloseIcon from '@mui/icons-material/Close';\r\nimport { Save } from '../../../components/icons';\r\nimport Typography from '../../../components/typography/typography';\r\n\r\n// Import sub-components\r\nimport TextControls from './controllers/TextControls';\r\nimport ButtonControls from './controllers/ButtonControls';\r\nimport ImageControls from './controllers/ImageControls';\r\nimport DividerControls from './controllers/DividerControls';\r\nimport TableControls from './controllers/TableControls';\r\nimport SignatureControls from './controllers/SignatureControls';\r\nimport CodeControls from './controllers/CodeControls';\r\nimport Select from '../../../components/select/select';\r\nimport { EnhancedSectionData, ElementType } from '../types/editor';\r\nimport { initialStyles } from '../utils/constant';\r\nimport { extractStyles, generateInlineStyles, getInitialSectionData } from '../utils/common';\r\n// import { useCKEditorStyleExtractor } from '../utils/style-extractor';\r\n\r\n// Shared types for SectionFormatPanel and sub-components\r\nexport interface TableColumn {\r\n id: string;\r\n header: string;\r\n placeholder?: string;\r\n}\r\n\r\nexport interface TableRow {\r\n [key: string]: string | number | boolean;\r\n}\r\n\r\nexport interface CellMerge {\r\n section: 'thead' | 'tbody';\r\n rowStart: number;\r\n rowEnd: number;\r\n colStart: number;\r\n colEnd: number;\r\n value: string;\r\n}\r\n\r\nexport interface TableData {\r\n name?: string; // Added name property for #each iteration\r\n columns: TableColumn[];\r\n rows: TableRow[];\r\n border: boolean;\r\n mergedCells?: CellMerge[];\r\n}\r\n\r\ninterface SectionData {\r\n type: 'text' | 'text-block' | 'heading' | 'heading-2' | 'heading-3' | 'heading-4' | 'buttons' | 'image' | 'divider' | 'table' | 'signature' | 'qr-code' | 'bar-code';\r\n content: string;\r\n attributes?: {\r\n styles?: any;\r\n placeholders?: Record<string, string>;\r\n tableData?: TableData;\r\n [key: string]: any;\r\n };\r\n}\r\n\r\ninterface SectionFormatPanelProps {\r\n section: SectionData | undefined;\r\n onClose: () => void;\r\n onUpdate: (data: Partial<EnhancedSectionData>) => void;\r\n placeholders: Record<string, any>[];\r\n relation_table?:any;\r\n handleSave?: () => void;\r\n}\r\n\r\nconst sectionTypes = ['text','text-block','heading','heading-2','heading-3','heading-4','buttons','image','divider','table','signature','qr-code','bar-code']\r\n\r\nconst SectionFormatPanel: React.FC<SectionFormatPanelProps> = ({ \r\n section, \r\n onClose, \r\n onUpdate,\r\n placeholders,\r\n relation_table,\r\n handleSave }) => {\r\n // const { applyStylesToHtml } = useCKEditorStyleExtractor()\r\n // const [plainContent, setPlainContent] = useState('');\r\n const sectionType = useMemo(() => section?.type || 'text', [section?.type]);\r\n const content = useMemo(() => section?.content || 'text', [section?.content]);\r\n const [formatOptions, setFormatOptions] = useState<string[]>([]);\r\n const[rowLevel, setRowLevel] = useState<boolean>((section?.attributes as any)?.rowLevel || false);\r\n const [tableData, setTableData] = useState<TableData>({\r\n name: '', // Initialize with empty name\r\n columns: [\r\n { id: 'col1', header: 'Column 1' },\r\n { id: 'col2', header: 'Column 2' },\r\n { id: 'col3', header: 'Column 3' }\r\n ],\r\n rows: [\r\n { col1: '', col2: '', col3: '' }\r\n ],\r\n border: true,\r\n mergedCells: []\r\n });\r\n const [isInitialLoad, setIsInitialLoad] = useState(true);\r\n const [selectedContentAttrObj, setSelectedContentAttrObj] = useState(extractStyles(content, section?.type));\r\n\r\n // Initialize table data from section attributes\r\n useEffect(() => {\r\n if (section && section.type === 'table') {\r\n // If section has stored table data, use it\r\n if (section.attributes?.tableData) {\r\n setTableData(section.attributes.tableData);\r\n } else {\r\n // Try to extract table data from HTML content\r\n const extractedTableData = extractTableDataFromHTML(section.content);\r\n if (extractedTableData) {\r\n setTableData(extractedTableData);\r\n setRowLevel((section?.attributes as any)?.rowLevel || false);\r\n }\r\n }\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (section && !isInitialLoad) {\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = section.content;\r\n const text = tempDiv.textContent || '';\r\n // setPlainContent(text);\r\n setSelectedContentAttrObj(extractStyles(section.content, section?.type)?.styles)\r\n setIsInitialLoad(false);\r\n }\r\n }, [section]);\r\n\r\n // Extract table data from HTML content\r\n const extractTableDataFromHTML = (htmlContent: string): TableData | null => {\r\n try {\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(htmlContent, 'text/html');\r\n const table = doc.querySelector('table');\r\n \r\n if (!table) return null;\r\n\r\n const headerRows = table.querySelectorAll('thead tr');\r\n const bodyRows = table.querySelectorAll('tbody tr');\r\n\r\n if (headerRows.length === 0) return null;\r\n\r\n // Extract columns from the first header row\r\n const headerCells = headerRows[0].querySelectorAll('th');\r\n const columns: TableColumn[] = Array.from(headerCells).map((th, index) => ({\r\n id: `col${index + 1}`,\r\n header: th.textContent?.trim() || `Column ${index + 1}`\r\n }));\r\n\r\n // Extract merged cells from thead\r\n const mergedCells: CellMerge[] = [];\r\n Array.from(headerRows).forEach((row, rowIndex) => {\r\n const cells = row.querySelectorAll('th');\r\n cells.forEach((cell, colIndex) => {\r\n const rowSpan = parseInt(cell.getAttribute('rowspan') || '1');\r\n const colSpan = parseInt(cell.getAttribute('colspan') || '1');\r\n if (rowSpan > 1 || colSpan > 1) {\r\n mergedCells.push({\r\n section: 'thead',\r\n rowStart: rowIndex,\r\n rowEnd: rowIndex + rowSpan - 1,\r\n colStart: colIndex,\r\n colEnd: colIndex + colSpan - 1,\r\n value: cell.textContent?.trim() || ''\r\n });\r\n }\r\n });\r\n });\r\n\r\n // Extract rows\r\n const rows: TableRow[] = Array.from(bodyRows).map(row => {\r\n const cells = row.querySelectorAll('td');\r\n const rowData: TableRow = {};\r\n \r\n cells.forEach((cell, index) => {\r\n if (index < columns.length) {\r\n rowData[columns[index].id] = cell.textContent?.trim() || '';\r\n }\r\n });\r\n \r\n return rowData;\r\n });\r\n\r\n // Extract merged cells from tbody\r\n Array.from(bodyRows).forEach((row, rowIndex) => {\r\n const cells = row.querySelectorAll('td');\r\n cells.forEach((cell, colIndex) => {\r\n const rowSpan = parseInt(cell.getAttribute('rowspan') || '1');\r\n const colSpan = parseInt(cell.getAttribute('colspan') || '1');\r\n if (rowSpan > 1 || colSpan > 1) {\r\n mergedCells.push({\r\n section: 'tbody',\r\n rowStart: rowIndex,\r\n rowEnd: rowIndex + rowSpan - 1,\r\n colStart: colIndex,\r\n colEnd: colIndex + colSpan - 1,\r\n value: cell.textContent?.trim() || ''\r\n });\r\n }\r\n });\r\n });\r\n\r\n return {\r\n name: '', // Default empty name\r\n columns,\r\n rows: rows.length > 0 ? rows : [{}],\r\n border: true,\r\n mergedCells\r\n };\r\n } catch (error) {\r\n return null;\r\n }\r\n };\r\n\r\n // Get placeholder value for table generation\r\n const getPlaceholderValue = (placeholderKey: string): string => {\r\n const placeholder = placeholders.find(p => p.value === placeholderKey);\r\n if (!placeholder) return '';\r\n \r\n // Return actual value or generate sample based on type\r\n if (typeof placeholder.actualValue !== 'undefined') {\r\n return String(placeholder.actualValue);\r\n }\r\n \r\n switch (placeholder.type) {\r\n case 'date':\r\n return new Date().toLocaleDateString();\r\n case 'datetime':\r\n return new Date().toLocaleString();\r\n case 'number':\r\n return '123';\r\n case 'currency':\r\n return '$1,234.56';\r\n case 'email':\r\n return 'example@domain.com';\r\n case 'phone':\r\n return '+1 (555) 123-4567';\r\n case 'url':\r\n return 'https://example.com';\r\n default:\r\n return placeholder.label || placeholder.value;\r\n }\r\n };\r\n\r\n const generateContent = useCallback((attrs?: Record<any, any>): string => {\r\n const { src, alt, styles: eStyles, text, placeholder, placeholders: tPlaceholders } = attrs || section?.attributes || selectedContentAttrObj || {}\r\n const styles = {\r\n ...initialStyles[sectionType],\r\n ...eStyles,\r\n ...selectedContentAttrObj?.styles,\r\n ...attrs?.styles\r\n }\r\n\r\n const inlineStyles = generateInlineStyles(styles);\r\n \r\n // For buttons, images, dividers, and codes - use the existing logic\r\n if (sectionType === 'buttons') {\r\n return `<button style=\"${inlineStyles}\">${text || 'Button Text'}</button>`;\r\n } else if (sectionType === 'image') {\r\n let imgInlineStyles: string = inlineStyles;\r\n if(styles?.is_bordered) {\r\n styles.padding = '10px';\r\n imgInlineStyles = generateInlineStyles(styles);\r\n } else{\r\n styles.padding = '0';\r\n imgInlineStyles = generateInlineStyles(styles);\r\n }\r\n return `<img src=\"${src || ''}\" alt=\"${alt || ''}\" style=\"${imgInlineStyles}\" />`;\r\n } else if (sectionType === 'divider') {\r\n return `<hr style=\"${inlineStyles}\" />`;\r\n } else if (sectionType === 'table') {\r\n const { border, borderStyle, borderColor, ...rest } = styles;\r\n const tInlineStyles = generateInlineStyles(styles.is_bordered ? styles : rest); \r\n const tHeadInlineStyles: string = generateInlineStyles(styles.tHead || {});\r\n const tBodyInlineStyles: string = generateInlineStyles(styles.tBody || {});\r\n const thCellInlineStyles: string = generateInlineStyles({\r\n ...(styles.thCells || {}), \r\n ...(styles.is_bordered ? { border, borderStyle, borderColor } : {}) \r\n });\r\n const tbCellInlineStyles: string = generateInlineStyles({\r\n ...(styles.tbCells || {}), \r\n ...(styles.is_bordered ? { border, borderStyle, borderColor } : {})\r\n });\r\n\r\n // Helper function to check if a cell is part of a merge\r\n const getCellMergeInfo = (section: 'thead' | 'tbody', rowIndex: number, colIndex: number) => {\r\n return tableData.mergedCells?.find(m => \r\n m.section === section &&\r\n rowIndex >= m.rowStart && rowIndex <= m.rowEnd &&\r\n colIndex >= m.colStart && colIndex <= m.colEnd\r\n );\r\n };\r\n\r\n // Generate header row with merge support\r\n const headerCellsHTML = tableData.columns.map((column, colIndex) => {\r\n const mergeInfo = getCellMergeInfo('thead', 0, colIndex);\r\n \r\n if (mergeInfo && (colIndex !== mergeInfo.colStart)) {\r\n return '';\r\n }\r\n\r\n const mergeAttributes = mergeInfo ? \r\n ` rowspan=\"${mergeInfo.rowEnd - mergeInfo.rowStart + 1}\" colspan=\"${mergeInfo.colEnd - mergeInfo.colStart + 1}\"` : '';\r\n \r\n const cellValue = mergeInfo ? mergeInfo.value : column.header;\r\n\r\n return `<th style=\"${thCellInlineStyles}\"${mergeAttributes}>${cellValue}</th>`;\r\n }).filter(cell => cell !== '').join('');\r\n\r\n // Generate table body with #each loop using tableData.name\r\n let tableRowsHTML = '';\r\n \r\n // Check if we should use #each loop with tableData.name\r\n if (tableData.name) {\r\n // Generate template with #each handlebars syntax\r\n const rowTemplate = tableData.columns.map((column, colIndex) => {\r\n const mergeInfo = getCellMergeInfo('tbody', 0, colIndex); // Use first row as template\r\n \r\n if (mergeInfo && (colIndex !== mergeInfo.colStart)) {\r\n return '';\r\n }\r\n\r\n const mergeAttributes = mergeInfo ? \r\n ` rowspan=\"${mergeInfo.rowEnd - mergeInfo.rowStart + 1}\" colspan=\"${mergeInfo.colEnd - mergeInfo.colStart + 1}\"` : '';\r\n \r\n // Use handlebars template syntax for dynamic content\r\n let cellTemplate = '';\r\n \r\n // Handle special cases\r\n if (column.id === 'index' || column.id === 'incrementIndex') {\r\n cellTemplate = `{{incrementIndex @index}}`;\r\n } else if (column.id.includes('.')) {\r\n // Handle nested properties (like items.sku, tax_code_data.[0].rate)\r\n const cellValue = tableData?.rows?.[0][column.id];\r\n cellTemplate = typeof cellValue === 'string' ? cellValue.replace(tableData.name + '.', '') : String(cellValue || '');\r\n } else {\r\n // Direct property access\r\n const cellValue = tableData?.rows?.[0][column.id];\r\n cellTemplate = typeof cellValue === 'string' ? cellValue.replace(tableData.name + '.', '') : String(cellValue || '');\r\n }\r\n\r\n return `<td style=\"${tbCellInlineStyles}\"${mergeAttributes}>${cellTemplate}</td>`;\r\n }).filter(cell => cell !== '').join('');\r\n\r\n // Add zebra striping logic if enabled\r\n const rowStyleTemplate = styles.tBody?.zebraStriping \r\n ? `{{#if (isOdd @index)}}${tBodyInlineStyles}; background-color: ${styles.tBody.alternateRowColor || '#f9f9f9'}{{else}}${tBodyInlineStyles}{{/if}}`\r\n : tBodyInlineStyles;\r\n\r\n tableRowsHTML = `{{#each ${tableData.name}}}\r\n <tr style=\"${rowStyleTemplate}\">\r\n ${rowTemplate}\r\n </tr>\r\n {{/each}}`;\r\n \r\n } else {\r\n // Fallback to static rows when no tableData.name is provided\r\n tableRowsHTML = tableData.rows.map((row, rowIndex) => {\r\n const rowStyleAddition = styles.tBody?.zebraStriping && rowIndex % 2 === 1 \r\n ? `; background-color: ${styles.tBody.alternateRowColor || '#f9f9f9'}` \r\n : '';\r\n \r\n const cellsHTML = tableData.columns.map((column, colIndex) => {\r\n const mergeInfo = getCellMergeInfo('tbody', rowIndex, colIndex);\r\n \r\n if (mergeInfo && (rowIndex !== mergeInfo.rowStart || colIndex !== mergeInfo.colStart)) {\r\n return '';\r\n }\r\n\r\n let cellValue = row[column.id] || '';\r\n const keys = Object.keys(row)\r\n if(keys.includes(`${column.id}_static`)) {\r\n cellValue = row[`${column.id}_static`] || '';\r\n }\r\n if (!cellValue && tPlaceholders?.[column.id]) {\r\n cellValue = getPlaceholderValue(tPlaceholders[column.id]);\r\n }\r\n\r\n const mergeAttributes = mergeInfo ? \r\n ` rowspan=\"${mergeInfo.rowEnd - mergeInfo.rowStart + 1}\" colspan=\"${mergeInfo.colEnd - mergeInfo.colStart + 1}\"` : '';\r\n \r\n const finalCellValue = mergeInfo ? mergeInfo.value : cellValue;\r\n\r\n return `<td style=\"${tbCellInlineStyles}\"${mergeAttributes}>${finalCellValue}</td>`;\r\n }).filter(cell => cell !== '').join('');\r\n \r\n return `<tr style=\"${tBodyInlineStyles}${rowStyleAddition}\">${cellsHTML}</tr>`;\r\n }).join('');\r\n }\r\n \r\n return `\r\n <table style=\"${tInlineStyles}\">\r\n <thead>\r\n <tr style=\"${tHeadInlineStyles}\">\r\n ${headerCellsHTML}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n ${tableRowsHTML}\r\n </tbody>\r\n </table>\r\n `;\r\n } else if (sectionType === 'qr-code' || sectionType === 'bar-code') {\r\n return `<div style=\"${inlineStyles}\">${placeholder}</div>`;\r\n }\r\n \r\n // For text-based sections, parse and apply styles to existing HTML tags\r\n const hasHtmlTags = /<\\/?[a-z][\\s\\S]*>/i.test(content);\r\n \r\n if (!hasHtmlTags) {\r\n // If no HTML tags, wrap according to section type\r\n switch (sectionType) {\r\n case 'text':\r\n case 'text-block':\r\n return `<p style=\"${inlineStyles}\">${content}</p>`;\r\n case 'heading':\r\n return `<h1 style=\"${inlineStyles}\">${content}</h1>`;\r\n case 'heading-2':\r\n return `<h2 style=\"${inlineStyles}\">${content}</h2>`;\r\n case 'heading-3':\r\n return `<h3 style=\"${inlineStyles}\">${content}</h3>`;\r\n case 'heading-4':\r\n return `<h4 style=\"${inlineStyles}\">${content}</h4>`;\r\n case 'signature':\r\n return `<div style=\"${inlineStyles}\">${content}</div>`;\r\n default:\r\n return `<p style=\"${inlineStyles}\">${content}</p>`;\r\n }\r\n } else {\r\n // Create a temporary DOM element to manipulate the HTML\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(`<div>${content}</div>`, 'text/html');\r\n const container = doc.body.firstChild as Element;\r\n \r\n // Process all child elements\r\n if (container && container.nodeType === Node.ELEMENT_NODE) {\r\n const elements = container.querySelectorAll('*');\r\n\r\n elements.forEach(element => {\r\n // Skip processing script tags or other special elements\r\n if (element.tagName === 'SCRIPT' || element.tagName === 'STYLE') {\r\n return;\r\n }\r\n \r\n // Get existing style and merge with new style\r\n const existingStyle = element.getAttribute('style') || '';\r\n \r\n // Extract properties from existing style\r\n const existingProps = {};\r\n existingStyle.split(';').forEach(prop => {\r\n const [key, value] = prop.split(':').map(item => item.trim());\r\n if (key && value) {\r\n existingProps[key] = value;\r\n }\r\n });\r\n \r\n // Parse the base style and prepare for merging\r\n const newStyleProps = {};\r\n inlineStyles.split(';').forEach(prop => {\r\n const [key, value] = prop.split(':').map(item => item.trim());\r\n if (key && value) {\r\n newStyleProps[key] = value;\r\n }\r\n });\r\n \r\n // Additional styles based on tag type\r\n if (element.tagName === 'P' || element.tagName === 'DIV') {\r\n newStyleProps['line-height'] = '1.5';\r\n } else if (['H1', 'H2', 'H3', 'H4', 'H5', 'H6'].includes(element.tagName)) {\r\n newStyleProps['line-height'] = '1.2';\r\n newStyleProps['margin'] = '0.5em 0';\r\n }\r\n \r\n // Merge styles, new styles override existing ones\r\n const mergedProps = { ...existingProps, ...newStyleProps };\r\n \r\n // Convert back to style string\r\n const mergedStyle = Object.entries(mergedProps)\r\n .filter(([key, value]) => key && value)\r\n .map(([key, value]) => `${key}: ${value}`)\r\n .join('; ');\r\n \r\n element.setAttribute('style', mergedStyle);\r\n });\r\n \r\n return container.innerHTML;\r\n }\r\n \r\n // Fallback to original content if parsing fails\r\n return content;\r\n }\r\n }, [JSON.stringify(section)]);\r\n\r\n // Local save function - renamed to avoid conflict with handleSave prop\r\n const saveSection = () => {\r\n const updatedContent = generateContent();\r\n \r\n const updatedSection = {\r\n content: updatedContent, \r\n type: sectionType as ElementType,\r\n rowLevel: rowLevel,\r\n name: tableData.name || '',\r\n attributes: {\r\n ...(section?.attributes || {}),\r\n ...(sectionType === 'table' ? { tableData } : {})\r\n },\r\n is_edited_from_source: (section as EnhancedSectionData)?.is_edited_from_source || false\r\n };\r\n \r\n onUpdate(updatedSection);\r\n };\r\nuseEffect(() => {\r\n saveSection();\r\n},[tableData])\r\n /**\r\n * Updates section attributes and triggers content regeneration.\r\n * Optimized to avoid unnecessary property spreading and glitches.\r\n */\r\n const updateAttrs = (prop: Record<string, any>) => {\r\n if (!section) return;\r\n\r\n // Merge styles safely\r\n const mergedStyles = {\r\n ...(section.attributes?.styles || {}),\r\n ...(prop.styles || {})\r\n };\r\n\r\n // Merge attributes, giving priority to new props\r\n const mergedAttributes = {\r\n ...(section.attributes || {}),\r\n ...prop,\r\n styles: mergedStyles,\r\n ...(sectionType === 'table' ? { tableData } : {})\r\n };\r\n\r\n // Prepare updated section object (exclude 'id' if present)\r\n const { id, ...sectionRest } = section as any;\r\n\r\n // Generate updated content based on new attributes\r\n const updatedContent = generateContent(mergedAttributes);\r\n setSelectedContentAttrObj(mergedAttributes)\r\n\r\n // Compose the update payload, omitting unknown properties\r\n onUpdate({\r\n ...sectionRest,\r\n content: updatedContent,\r\n attributes: mergedAttributes\r\n });\r\n };\r\n\r\n // Update table data and trigger content regeneration\r\n const handleTableDataUpdate = (newTableData: TableData) => {\r\n setTableData(newTableData);\r\n \r\n // Trigger immediate update with new table data\r\n const updatedAttrs = {\r\n ...(section?.attributes || {}),\r\n tableData: newTableData\r\n };\r\n \r\n // const updatedContent = generateContent(updatedAttrs);\r\n // onUpdate({\r\n // ...section,\r\n // content: updatedContent,\r\n // attributes: updatedAttrs\r\n // });\r\n saveSection();\r\n };\r\n\r\n const handleTypeChange = (t) => {\r\n const dt = getInitialSectionData(t)\r\n \r\n onUpdate({ \r\n ...section, \r\n ...dt\r\n });\r\n \r\n // Reset table data when switching types\r\n if (t === 'table') {\r\n setTableData({\r\n name: '', // Initialize with empty name\r\n columns: [\r\n { id: 'col1', header: 'Column 1' },\r\n { id: 'col2', header: 'Column 2' },\r\n { id: 'col3', header: 'Column 3' }\r\n ],\r\n rows: [\r\n { col1: '', col2: '', col3: '' }\r\n ],\r\n border: true,\r\n mergedCells: []\r\n });\r\n }\r\n }\r\n\r\n return (\r\n <Paper\r\n elevation={3}\r\n sx={{\r\n width: { xs: '100%', sm: 320, lg: 390 },\r\n height: '100%',\r\n overflow: 'auto',\r\n borderLeft: '1px solid',\r\n borderColor: 'divider',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n bgcolor: 'background.paper',\r\n boxShadow: 'none',\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n p: 2,\r\n borderBottom: '1px solid',\r\n borderColor: 'divider',\r\n bgcolor: 'grey.50',\r\n }}\r\n >\r\n <Typography type=\"s1\" weight='bold' color='theme.neutral.1000'>\r\n Format {sectionType ? sectionType?.charAt(0)?.toUpperCase() + sectionType?.slice(1).replace(/-/g, ' ') : ''}\r\n </Typography>\r\n <Tooltip title=\"Save and Close\">\r\n <Box>\r\n <IconButton size=\"small\" onClick={() => {\r\n saveSection();\r\n handleSave?.();\r\n onClose();\r\n }} aria-label=\"Save\">\r\n <Save fontSize=\"small\" />\r\n </IconButton>\r\n <IconButton size=\"small\" onClick={onClose} aria-label=\"Close\">\r\n <CloseIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Box>\r\n </Tooltip>\r\n </Box>\r\n\r\n <Box sx={{ p: 2, flex: 1,pb:10, overflowY: 'auto' }}>\r\n <Box sx={{ mb: 2 }}>\r\n <FormControl size=\"small\" fullWidth>\r\n <Select\r\n value={section?.type}\r\n onChange={(e) => handleTypeChange(e.target.value)}\r\n renderValue={v => v ? v.charAt(0).toUpperCase() + v.slice(1).replace(/-/g, ' ') : ''}\r\n label='Select Preset'\r\n displayEmpty\r\n >\r\n {sectionTypes.map((type) => (\r\n <MenuItem key={type} value={type}>\r\n <Typography type='s4' color='theme.secondary.1000'>{type.charAt(0).toUpperCase() + type.slice(1).replace(/-/g, ' ')}</Typography>\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Box>\r\n \r\n {section && (sectionType === 'text' || \r\n sectionType === 'heading' || \r\n sectionType === 'heading-2' || \r\n sectionType === 'heading-3' || \r\n sectionType === 'heading-4') && (\r\n <TextControls\r\n attrs={section?.attributes || {}}\r\n updateAttrs={updateAttrs}\r\n />\r\n )}\r\n {sectionType === 'buttons' && (\r\n <ButtonControls\r\n attrs={section?.attributes || {}}\r\n updateAttrs={updateAttrs}\r\n />\r\n )}\r\n {sectionType === 'image' && (\r\n <ImageControls\r\n attrs={section?.attributes || {}}\r\n updateAttrs={updateAttrs}\r\n />\r\n )}\r\n {sectionType === 'divider' && (\r\n <DividerControls\r\n attrs={section?.attributes || {}}\r\n updateAttrs={updateAttrs}\r\n />\r\n )}\r\n {sectionType === 'table' && (\r\n <TableControls\r\n tableData={{\r\n ...tableData,\r\n rows: tableData.rows.map(row => {\r\n const convertedRow: Record<string, string> = {};\r\n Object.keys(row).forEach(key => {\r\n convertedRow[key] = String(row[key] ?? '');\r\n });\r\n return convertedRow;\r\n })\r\n }}\r\n setTableData={(value) => {\r\n handleTableDataUpdate({\r\n ...value,\r\n border: tableData.border,\r\n name: tableData.name || ''\r\n });\r\n }}\r\n attrs={section?.attributes || {}}\r\n updateAttrs={updateAttrs}\r\n placeholders={placeholders}\r\n handleSave={handleSave}\r\n setParentRowLevel={setRowLevel}\r\n levelType={rowLevel}\r\n relation_table={relation_table}\r\n />\r\n )}\r\n {sectionType === 'signature' && (\r\n <SignatureControls\r\n attrs={section?.attributes || {}}\r\n updateAttrs={updateAttrs}\r\n />\r\n )}\r\n {section && (sectionType === 'qr-code' || sectionType === 'bar-code') && (\r\n <CodeControls\r\n attrs={section?.attributes || {}}\r\n updateAttrs={updateAttrs}\r\n />\r\n )}\r\n </Box>\r\n </Paper>\r\n );\r\n};\r\n\r\nexport default SectionFormatPanel;","/* eslint-disable react-hooks/exhaustive-deps */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React, { useState, useCallback, useEffect } from 'react';\r\nimport { useDraggable } from '@dnd-kit/core';\r\nimport { useDropzone } from 'react-dropzone';\r\nimport {\r\n Box,\r\n Divider,\r\n ListItem,\r\n ListItemIcon,\r\n ListItemText,\r\n Grid,\r\n Accordion,\r\n AccordionSummary,\r\n AccordionDetails,\r\n Typography,\r\n CircularProgress,\r\n Alert,\r\n} from '@mui/material';\r\nimport {\r\n Heading,\r\n Text as TextIcon,\r\n Image as ImageIcon,\r\n Table as TableIcon,\r\n Blocks as SignatureIcon,\r\n QrCode as QrCodeIcon,\r\n Barcode as BarcodeIcon,\r\n FileCode,\r\n} from 'lucide-react';\r\nimport { styled } from '@mui/material/styles';\r\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\r\nimport { getV1Drive, postV1Drive } from '../../../api-client/api.drive/api';\r\nimport SearchBar from '../../../components/search-bar/search-bar';\r\nimport { getToken, uploadFiles } from '../../../utils/common';\r\nimport { getApiConfig } from '@/utils';\r\nimport Button from '../../../components/button/button';\r\n\r\nconst StyledListItem = styled(ListItem)(({ theme }) => ({\r\n padding: theme.spacing(1.5),\r\n cursor: 'grab',\r\n borderRadius: theme.shape.borderRadius,\r\n '&:hover': {\r\n backgroundColor: theme.palette.grey[100],\r\n },\r\n '&.dragging': {\r\n opacity: 0.5,\r\n },\r\n}));\r\n\r\nconst DropzoneBox = styled(Box)(({ theme }) => ({\r\n border: `2px dashed ${theme.palette.grey[400]}`,\r\n borderRadius: theme.shape.borderRadius,\r\n padding: theme.spacing(2),\r\n textAlign: 'center',\r\n backgroundColor: theme.palette.grey[50],\r\n cursor: 'pointer',\r\n '&:hover': {\r\n backgroundColor: theme.palette.grey[100],\r\n },\r\n}));\r\n\r\nconst SidebarItem = ({ id, icon, label, imageUrl }: { id: string; icon?: React.ReactElement; label: string; imageUrl?: string }) => {\r\n // Extract the element type from the sidebar item id\r\n const elementType = typeof id === 'string' ? id.replace('sidebar-', '') : id;\r\n\r\n const { attributes, listeners, setNodeRef, isDragging } = useDraggable({\r\n id,\r\n data: {\r\n // Pass the correct type based on the id\r\n type: imageUrl ? 'image' : elementType,\r\n imageUrl,\r\n label,\r\n },\r\n });\r\n\r\n return (\r\n <StyledListItem\r\n ref={setNodeRef}\r\n {...listeners}\r\n {...attributes}\r\n className={isDragging ? 'dragging' : ''}\r\n sx={{ border: '1px solid', borderColor: 'grey.200', p: 0.75 }}\r\n >\r\n {imageUrl ? (\r\n <img\r\n src={imageUrl}\r\n alt={label}\r\n style={{ width: '100%', height: 140, objectFit: 'cover', marginRight: 8 }}\r\n />\r\n ) : (\r\n <>\r\n <ListItemIcon sx={{ minWidth: 40 }}>{icon}</ListItemIcon>\r\n <ListItemText primary={label} primaryTypographyProps={{ variant: 'body2' }} />\r\n </>\r\n )}\r\n </StyledListItem>\r\n );\r\n};\r\n\r\ninterface EditorSidebarProps {\r\n onHtmlUpload?: (html: string) => void;\r\n}\r\n\r\nconst EditorSidebar = ({ onHtmlUpload }: EditorSidebarProps) => {\r\n const [expanded, setExpanded] = useState('text');\r\n const [uploadedImages, setUploadedImages] = useState([]);\r\n const [uploading, setUploading] = useState(false);\r\n const [uploadingHtml, setUploadingHtml] = useState(false);\r\n const [error, setError] = useState(null);\r\n\r\n const handleChange = (panel) => (event, isExpanded) => {\r\n setExpanded(isExpanded ? panel : false);\r\n };\r\n\r\n const onDrop = useCallback(async (acceptedFiles) => {\r\n setUploading(true);\r\n setError(null);\r\n try {\r\n for (const file of acceptedFiles) {\r\n const uFiles = await uploadFiles([file], \"document\");\r\n const token = getToken();\r\n const payload = {\r\n ...token,\r\n \"x-timezone\": String(token[\"x-timezone\"] || \"\"),\r\n \"title\": file?.name.split(\".\")[0],\r\n \"path\": \"/\",\r\n \"is_private\": true,\r\n \"is_directory\": false,\r\n \"file_size\": file.size,\r\n \"is_child\": false,\r\n \"file_extension\": file?.name.split(\".\")[1],\r\n \"type\": \"image\",\r\n \"mime_type\": file.type,\r\n \"url\": `${getApiConfig().s3BucketUrl}${uFiles[0]}`\r\n }\r\n // Replace with your actual API endpoint\r\n await postV1Drive(payload);\r\n\r\n setUploadedImages((prev) => [\r\n ...prev,\r\n {\r\n id: `uploaded-image-${Date.now()}-${Math.random()}`,\r\n url: `${getApiConfig().s3BucketUrl}${uFiles[0]}`, // Assume API returns imageUrl\r\n name: file.name,\r\n },\r\n ]);\r\n }\r\n } catch (err) {\r\n setError('Failed to upload image. Please try again.');\r\n } finally {\r\n setUploading(false);\r\n }\r\n }, []);\r\n\r\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\r\n onDrop,\r\n accept: { 'image/*': ['.jpeg', '.png', '.jpg', '.gif'] },\r\n multiple: true,\r\n });\r\n\r\n const onHtmlDrop = useCallback(async (acceptedFiles) => {\r\n if (!onHtmlUpload) return;\r\n \r\n setUploadingHtml(true);\r\n setError(null);\r\n \r\n try {\r\n const file = acceptedFiles[0];\r\n if (!file) return;\r\n\r\n const reader = new FileReader();\r\n \r\n reader.onload = (e) => {\r\n const htmlContent = e.target?.result as string;\r\n if (htmlContent) {\r\n onHtmlUpload(htmlContent);\r\n setUploadingHtml(false);\r\n }\r\n };\r\n\r\n reader.onerror = () => {\r\n setError('Failed to read HTML file. Please try again.');\r\n setUploadingHtml(false);\r\n };\r\n\r\n reader.readAsText(file);\r\n } catch (err) {\r\n setError('Failed to process HTML file. Please try again.');\r\n setUploadingHtml(false);\r\n }\r\n }, [onHtmlUpload]);\r\n\r\n const { getRootProps: getHtmlRootProps, getInputProps: getHtmlInputProps, isDragActive: isHtmlDragActive } = useDropzone({\r\n onDrop: onHtmlDrop,\r\n accept: { 'text/html': ['.html', '.htm'] },\r\n multiple: false,\r\n maxFiles: 1,\r\n });\r\n\r\n const sections = [\r\n {\r\n id: 'html-upload',\r\n icon: <FileCode size={18} />,\r\n label: 'Upload HTML',\r\n content: (\r\n <Box sx={{ mt: 2 }}>\r\n <DropzoneBox {...getHtmlRootProps()}>\r\n <input {...getHtmlInputProps()} />\r\n {isHtmlDragActive ? (\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n Drop the HTML file here...\r\n </Typography>\r\n ) : (\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n Drag and drop HTML file here, or click to select\r\n </Typography>\r\n )}\r\n {uploadingHtml && (\r\n <Box sx={{ mt: 1 }}>\r\n <CircularProgress size={20} />\r\n </Box>\r\n )}\r\n </DropzoneBox>\r\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ mt: 1, display: 'block' }}>\r\n Upload an HTML file to replace current sections with the file content\r\n </Typography>\r\n </Box>\r\n ),\r\n },\r\n {\r\n id: 'text',\r\n icon: <TextIcon size={18} />,\r\n label: 'Text',\r\n content: (\r\n <Box sx={{ display: 'grid', gridTemplateColumns: 'repeat(2, 1fr)', gap: 1 }}>\r\n <SidebarItem id=\"sidebar-heading\" icon={<Heading size={20} />} label=\"Heading 1\" />\r\n <SidebarItem id=\"sidebar-heading-2\" icon={<Heading size={18} />} label=\"Heading 2\" />\r\n <SidebarItem id=\"sidebar-heading-3\" icon={<Heading size={16} />} label=\"Heading 3\" />\r\n <SidebarItem id=\"sidebar-heading-4\" icon={<Heading size={14} />} label=\"Heading 4\" />\r\n <SidebarItem id=\"sidebar-text\" icon={<TextIcon size={20} />} label=\"Body\" />\r\n <SidebarItem id=\"sidebar-text-block\" icon={<TextIcon size={20} />} label=\"Text Block\" />\r\n </Box>\r\n ),\r\n },\r\n {\r\n id: 'images',\r\n icon: <ImageIcon size={18} />,\r\n label: 'Images',\r\n content: (\r\n <Box sx={{ mt: 2 }}>\r\n <Box sx={{ mt: 2 }}>\r\n <DropzoneBox {...getRootProps()}>\r\n <input {...getInputProps()} />\r\n {isDragActive ? (\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n Drop the images here...\r\n </Typography>\r\n ) : (\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n Drag and drop images here, or click to select\r\n </Typography>\r\n )}\r\n {uploading && (\r\n <Box sx={{ mt: 1 }}>\r\n <CircularProgress size={20} />\r\n </Box>\r\n )}\r\n </DropzoneBox>\r\n {error && (\r\n <Alert severity=\"error\" sx={{ mt: 2 }}>\r\n {error}\r\n </Alert>\r\n )}\r\n {uploadedImages.length > 0 && (\r\n <Box sx={{ mt: 2 }}>\r\n <Typography variant=\"body2\" sx={{ mb: 1, color: 'grey.500' }}>\r\n Uploaded Images\r\n </Typography>\r\n <Grid container spacing={1}>\r\n {uploadedImages.map((image) => (\r\n <Grid item xs={6} key={image.id}>\r\n <SidebarItem\r\n id={image.id}\r\n label={image.name}\r\n imageUrl={image.url}\r\n />\r\n </Grid>\r\n ))}\r\n </Grid>\r\n </Box>\r\n )}\r\n </Box>\r\n </Box>\r\n ),\r\n },\r\n {\r\n id: 'buttons',\r\n icon: (\r\n <Box\r\n sx={{\r\n width: 16,\r\n height: 16,\r\n bgcolor: 'grey.400',\r\n borderRadius: 1,\r\n color: 'white',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '8px',\r\n }}\r\n >\r\n BTN\r\n </Box>\r\n ),\r\n label: 'Buttons',\r\n content: (\r\n <Box sx={{ mt: 2 }}>\r\n <SidebarItem\r\n id=\"sidebar-buttons\"\r\n icon={\r\n <Box\r\n sx={{\r\n width: 20,\r\n height: 20,\r\n bgcolor: 'success.main',\r\n borderRadius: 1,\r\n color: 'white',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '10px',\r\n }}\r\n >\r\n BTN\r\n </Box>\r\n }\r\n label=\"Buttons\"\r\n />\r\n </Box>\r\n ),\r\n },\r\n {\r\n id: 'divider',\r\n icon: <Divider sx={{ width: 18 }} />,\r\n label: 'Divider',\r\n content: (\r\n <Box sx={{ mt: 2 }}>\r\n <SidebarItem id=\"sidebar-divider\" icon={<Divider sx={{ width: 20 }} />} label=\"Divider\" />\r\n </Box>\r\n ),\r\n },\r\n {\r\n id: 'table',\r\n icon: <TableIcon size={18} />,\r\n label: 'Table',\r\n content: (\r\n <Box sx={{ mt: 2 }}>\r\n <SidebarItem id=\"sidebar-table\" icon={<TableIcon size={20} />} label=\"Table\" />\r\n </Box>\r\n ),\r\n },\r\n {\r\n id: 'signature',\r\n icon: <SignatureIcon size={18} />,\r\n label: 'Signature',\r\n content: (\r\n <Box sx={{ mt: 2 }}>\r\n <SidebarItem id=\"sidebar-signature\" icon={<SignatureIcon size={20} />} label=\"Signature\" />\r\n </Box>\r\n ),\r\n },\r\n {\r\n id: 'qr-code',\r\n icon: <QrCodeIcon size={18} />,\r\n label: 'QR Code',\r\n content: (\r\n <Box sx={{ mt: 2 }}>\r\n <SidebarItem id=\"sidebar-qr-code\" icon={<QrCodeIcon size={20} />} label=\"QR Code\" />\r\n </Box>\r\n ),\r\n },\r\n {\r\n id: 'bar-code',\r\n icon: <BarcodeIcon size={18} />,\r\n label: 'Bar Code',\r\n content: (\r\n <Box sx={{ mt: 2 }}>\r\n <SidebarItem id=\"sidebar-bar-code\" icon={<BarcodeIcon size={20} />} label=\"Bar Code\" />\r\n </Box>\r\n ),\r\n },\r\n ];\r\n\r\n const getDriveFiles = async () => {\r\n try {\r\n const token = getToken();\r\n const response = await getV1Drive({\r\n ...token,\r\n \"x-timezone\": String(token[\"x-timezone\"] || \"\"),\r\n skip: 0,\r\n limit: 10,\r\n filters: `(is_directory.eq=0)`\r\n });\r\n // Check if response is successful and has data\r\n if ('data' in response && response.data && typeof response.data === 'object' && 'drive' in response.data) {\r\n const files = (response.data as any).drive || [];\r\n setUploadedImages(files);\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n getDriveFiles()\r\n }, [])\r\n\r\n return (\r\n <Box\r\n sx={{\r\n bgcolor: 'background.paper',\r\n borderRight: 1,\r\n borderColor: 'grey.200',\r\n width: 390,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: 'calc(100vh - 104px)',\r\n boxShadow: '0 2px 8px rgba(0,0,0,0.05)',\r\n fontFamily: 'Inter, system-ui, Avenir, Helvetica, Arial, sans-serif',\r\n }}\r\n >\r\n <Box sx={{ p: 2, borderBottom: 1, borderColor: 'grey.200' }}>\r\n <SearchBar\r\n handleSearch={(key) => console.log('Search:', key)}\r\n sx={{ backgroundColor: \"#fff !important\", border: \"1px solid grey\" }}\r\n />\r\n </Box>\r\n <Box sx={{ flexGrow: 1, overflowY: 'auto', p: 1 }}>\r\n {sections.map((section) => (\r\n <Accordion\r\n key={section.id}\r\n expanded={expanded === section.id}\r\n onChange={handleChange(section.id)}\r\n sx={{\r\n border: 'none',\r\n boxShadow: 'none',\r\n backgroundColor: 'transparent',\r\n '&:before': { display: 'none' },\r\n marginBottom: 1,\r\n }}\r\n >\r\n <AccordionSummary\r\n expandIcon={<ExpandMoreIcon sx={{ color: 'grey.600' }} />}\r\n sx={{\r\n borderRadius: '8px',\r\n padding: '0 12px',\r\n backgroundColor: expanded === section.id ? 'grey.200' : 'grey.50',\r\n '&:hover': {\r\n backgroundColor: 'grey.50',\r\n },\r\n transition: 'background-color 0.2s ease',\r\n minHeight: 42,\r\n '& .MuiAccordionSummary-content': {\r\n alignItems: 'center',\r\n margin: '8px 0',\r\n },\r\n '&.Mui-expanded': {\r\n minHeight: 42,\r\n },\r\n }}\r\n >\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\r\n {section.icon}\r\n <Typography\r\n variant=\"body2\"\r\n sx={{ fontWeight: 500, color: 'text.primary' }}\r\n >\r\n {section.label}\r\n </Typography>\r\n </Box>\r\n </AccordionSummary>\r\n <AccordionDetails sx={{ padding: '8px 16px' }}>\r\n {section.content}\r\n </AccordionDetails>\r\n </Accordion>\r\n ))}\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport { EditorSidebar };\r\nexport default EditorSidebar;","/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable react-hooks/exhaustive-deps */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React, { useState, useEffect, useRef, useMemo, useCallback } from 'react';\r\nimport { useDroppable } from '@dnd-kit/core';\r\nimport EditorSection from './EditorSection';\r\nimport { Box, Container, Paper, Tooltip } from '@mui/material';\r\nimport Typography from '../../../components/typography/typography';\r\nimport SectionFormatPanel from './SectionFormatPanel';\r\nimport EditorSidebar from './EditorSidebar';\r\nimport { generateEmailPreview, generateHeaderFooterPreview } from '../utils/common';\r\nimport { EnhancedSectionData } from '../types/editor';\r\nimport Button from '../../../components/button/button';\r\nimport CheckIcon from '@mui/icons-material/Check';\r\nimport CloseIcon from '@mui/icons-material/Close';\r\n\r\nconst CANVAS_TYPES = {\r\n HEADER: 'header',\r\n MAIN: 'main',\r\n FOOTER: 'footer'\r\n};\r\n\r\ninterface DropPosition {\r\n id: string | null;\r\n type: 'before' | 'after' | 'inside' | 'left' | 'right';\r\n canvasType: string;\r\n}\r\n\r\ninterface EditorCanvasProps {\r\n sections: EnhancedSectionData[];\r\n headerSections: EnhancedSectionData[];\r\n footerSections: EnhancedSectionData[];\r\n activeId: string | null;\r\n overSection: string | null;\r\n selectedSection: string | null;\r\n onSelectSection: (id: string | null) => void;\r\n onUpdateSection: (id: string, data: any, canvasType?: string) => void;\r\n onSplitSection: (id: string, content1: string, content2: string, canvasType?: string) => void;\r\n onDeleteSection: (id: string, canvasType?: string) => void;\r\n preview: boolean;\r\n editHtml: boolean;\r\n onApplyHtmlEdit: (html: string) => void;\r\n onCancelHtmlEdit: () => void;\r\n editMode: boolean;\r\n isFromPreview: boolean;\r\n zoom?: number;\r\n placeholders: Record<string, any>[];\r\n isEditingHeaderFooter: boolean;\r\n relation_table: any[];\r\n handleSave?: () => Promise<void>;\r\n}\r\n\r\nconst EditorCanvas: React.FC<EditorCanvasProps> = ({\r\n sections,\r\n headerSections,\r\n footerSections,\r\n activeId,\r\n selectedSection,\r\n onSelectSection,\r\n onUpdateSection,\r\n onSplitSection,\r\n onDeleteSection,\r\n preview,\r\n editHtml,\r\n onApplyHtmlEdit,\r\n onCancelHtmlEdit,\r\n editMode,\r\n isFromPreview,\r\n placeholders,\r\n isEditingHeaderFooter,\r\n handleSave,\r\n relation_table,\r\n zoom = 100\r\n}) => {\r\n // Convert placeholders to the expected format\r\n const formattedPlaceholders = useMemo(() => {\r\n return placeholders.map((p: Record<string, any>) => ({\r\n value: p.value || p.key || '',\r\n label: p.label || p.name || String(p.value || p.key || '')\r\n }));\r\n }, [placeholders]);\r\n\r\n const { setNodeRef: setMainCanvasRef } = useDroppable({ id: 'main-canvas' });\r\n const { setNodeRef: setHeaderCanvasRef } = useDroppable({ id: 'header-canvas' });\r\n const { setNodeRef: setFooterCanvasRef } = useDroppable({ id: 'footer-canvas' });\r\n\r\n const selectedSectionData = useMemo(() => {\r\n return [...sections, ...headerSections, ...footerSections].find((section) => section.id === selectedSection);\r\n }, [sections, selectedSection]);\r\n\r\n const [dropTarget, setDropTarget] = useState<DropPosition>({\r\n id: null,\r\n type: 'inside',\r\n canvasType: CANVAS_TYPES.MAIN\r\n });\r\n const [isDraggingFromSidebar, setIsDraggingFromSidebar] = useState(false);\r\n const [isSectionEditing, setIsSectionEditing] = useState(false);\r\n const [htmlEditValue, setHtmlEditValue] = useState('');\r\n\r\n // Sync textarea content when entering HTML edit mode\r\n useEffect(() => {\r\n if (editHtml) {\r\n setHtmlEditValue(generateEmailPreview(sections, headerSections, footerSections));\r\n }\r\n }, [editHtml]);\r\n\r\n const lastUpdateTimeRef = useRef(0);\r\n const lastPositionRef = useRef({ x: 0, y: 0 });\r\n const activeIdRef = useRef<string | null>(null);\r\n const mainCanvasRef = useRef<HTMLDivElement | null>(null);\r\n const headerCanvasRef = useRef<HTMLDivElement | null>(null);\r\n const footerCanvasRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const DEBOUNCE_MS = 50;\r\n const MIN_MOUSE_MOVE = 5;\r\n const POSITION_HYSTERESIS = 0.1;\r\n\r\n const getTargetSections = (canvasType: string) => {\r\n switch (canvasType) {\r\n case CANVAS_TYPES.HEADER:\r\n return headerSections;\r\n case CANVAS_TYPES.FOOTER:\r\n return footerSections;\r\n default:\r\n return sections;\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n activeIdRef.current = activeId;\r\n\r\n if (activeId && String(activeId).includes('sidebar-')) {\r\n setIsDraggingFromSidebar(true);\r\n\r\n if (sections?.length > 0) {\r\n updateDropTarget(sections[0].id, 'before', CANVAS_TYPES.MAIN);\r\n } else if (headerSections?.length > 0 && isEditingHeaderFooter) {\r\n updateDropTarget(headerSections[0].id, 'before', CANVAS_TYPES.HEADER);\r\n } else if (footerSections?.length > 0 && isEditingHeaderFooter) {\r\n updateDropTarget(footerSections[0].id, 'before', CANVAS_TYPES.FOOTER);\r\n } else {\r\n updateDropTarget(null, 'inside', CANVAS_TYPES.MAIN);\r\n }\r\n } else if (!activeId) {\r\n setIsDraggingFromSidebar(false);\r\n setDropTarget({ id: null, type: 'inside', canvasType: CANVAS_TYPES.MAIN });\r\n }\r\n }, [activeId, sections, headerSections, footerSections, isEditingHeaderFooter]);\r\n\r\n const updateDropTarget = useCallback((id: string | null, type: DropPosition['type'], canvasType: string) => {\r\n const now = Date.now();\r\n if (now - lastUpdateTimeRef.current < DEBOUNCE_MS) return;\r\n\r\n // Prevent state updates if position hasn't actually changed\r\n setDropTarget(prev => {\r\n if (prev.id === id && prev.type === type && prev.canvasType === canvasType) {\r\n return prev; // Return same reference to prevent re-render\r\n }\r\n lastUpdateTimeRef.current = now;\r\n return { id, type, canvasType };\r\n });\r\n }, []);\r\n\r\n const handleMouseMove = useCallback((e: React.MouseEvent, canvasType: string) => {\r\n if (!activeIdRef.current) return;\r\n if (canvasType !== CANVAS_TYPES.MAIN && !isEditingHeaderFooter) return;\r\n\r\n const dx = e.clientX - lastPositionRef.current.x;\r\n const dy = e.clientY - lastPositionRef.current.y;\r\n const distance = Math.sqrt(dx * dx + dy * dy);\r\n\r\n if (distance < MIN_MOUSE_MOVE) return;\r\n\r\n lastPositionRef.current = { x: e.clientX, y: e.clientY };\r\n\r\n const elementsUnderCursor = document.elementsFromPoint(e.clientX, e.clientY);\r\n const sectionElement = elementsUnderCursor.find(el =>\r\n el.hasAttribute('data-section-id')\r\n );\r\n\r\n const targetSections = getTargetSections(canvasType);\r\n\r\n if (!sectionElement) {\r\n if (targetSections.length === 0) {\r\n updateDropTarget(null, 'inside', canvasType);\r\n } else if (isDraggingFromSidebar) {\r\n updateDropTarget(targetSections[targetSections.length - 1].id, 'after', canvasType);\r\n }\r\n return;\r\n }\r\n\r\n const sectionId = sectionElement.getAttribute('data-section-id');\r\n if (!sectionId) return;\r\n\r\n const sectionCanvasType = sectionElement.hasAttribute('data-canvas-type')\r\n ? sectionElement.getAttribute('data-canvas-type') as string\r\n : canvasType;\r\n\r\n const rect = sectionElement.getBoundingClientRect();\r\n const relativeY = e.clientY - rect.top;\r\n const relativeX = e.clientX - rect.left;\r\n const sectionHeight = rect.height;\r\n const sectionWidth = rect.width;\r\n\r\n const canvasSections = getTargetSections(sectionCanvasType);\r\n const section = canvasSections.find(s => s.id === sectionId);\r\n\r\n const isSplitGroup = sectionId.startsWith('split-group-');\r\n\r\n if (isSplitGroup || (section && section.isSplitPair)) {\r\n if (relativeX < sectionWidth * (0.5 - POSITION_HYSTERESIS)) {\r\n updateDropTarget(sectionId, 'left', sectionCanvasType);\r\n } else if (relativeX > sectionWidth * (0.5 + POSITION_HYSTERESIS)) {\r\n updateDropTarget(sectionId, 'right', sectionCanvasType);\r\n } else {\r\n updateDropTarget(sectionId, 'inside', sectionCanvasType);\r\n }\r\n } else {\r\n let position: DropPosition['type'] = 'inside';\r\n if (relativeY < sectionHeight * (0.3 - POSITION_HYSTERESIS)) {\r\n position = 'before';\r\n } else if (relativeY > sectionHeight * (0.7 + POSITION_HYSTERESIS)) {\r\n position = 'after';\r\n } else {\r\n position = 'inside';\r\n }\r\n updateDropTarget(sectionId, position, sectionCanvasType);\r\n }\r\n }, [isEditingHeaderFooter, isDraggingFromSidebar, updateDropTarget]);\r\n\r\n const handleMouseEnter = useCallback((e: React.MouseEvent, canvasType: string) => {\r\n if (!activeIdRef.current || !isDraggingFromSidebar) return;\r\n if (canvasType !== CANVAS_TYPES.MAIN && !isEditingHeaderFooter) return;\r\n\r\n const targetSections = getTargetSections(canvasType);\r\n\r\n if (targetSections.length > 0) {\r\n updateDropTarget(targetSections[0].id, 'before', canvasType);\r\n } else {\r\n updateDropTarget(null, 'inside', canvasType);\r\n }\r\n\r\n lastPositionRef.current = { x: e.clientX, y: e.clientY };\r\n }, [isDraggingFromSidebar, isEditingHeaderFooter, updateDropTarget]);\r\n\r\n const renderSectionsForCanvas = useCallback((canvasSections: EnhancedSectionData[], canvasType: string) => {\r\n const result: React.ReactNode[] = [];\r\n const processedGroups = new Set<string>();\r\n let i = 0;\r\n\r\n const renderDropIndicator = (key: string, isHorizontal = false) => (\r\n <Box\r\n key={key}\r\n sx={{\r\n [isHorizontal ? 'width' : 'height']: '50px',\r\n border: '2px dashed',\r\n borderColor: 'primary.main',\r\n borderRadius: 1,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n bgcolor: 'rgba(25, 118, 210, 0.04)',\r\n [isHorizontal ? 'mx' : 'mb']: 2,\r\n opacity: 0,\r\n animation: 'fadeIn 0.3s ease-in-out forwards',\r\n '@keyframes fadeIn': {\r\n '0%': { opacity: 0, transform: isHorizontal ? 'translateX(-10px)' : 'translateY(-10px)' },\r\n '100%': { opacity: 1, transform: 'translate(0)' },\r\n },\r\n }}\r\n >\r\n <Typography type='s2' color='primary' weight='medium'>\r\n Drop here\r\n </Typography>\r\n </Box>\r\n );\r\n\r\n if (isDraggingFromSidebar &&\r\n canvasSections?.length > 0 &&\r\n dropTarget.type === 'before' &&\r\n dropTarget.id === canvasSections[0].id &&\r\n dropTarget.canvasType === canvasType) {\r\n result.push(renderDropIndicator(`drop-before-first-${canvasType}`));\r\n }\r\n\r\n while (i < canvasSections?.length) {\r\n const section = canvasSections[i];\r\n const sectionId = section.id;\r\n\r\n if (dropTarget.id === sectionId &&\r\n dropTarget.type === 'before' &&\r\n dropTarget.canvasType === canvasType &&\r\n !(isDraggingFromSidebar && i === 0)) {\r\n result.push(renderDropIndicator(`drop-before-${sectionId}-${canvasType}`));\r\n }\r\n\r\n if (!section.isSplitPair) {\r\n result.push(\r\n <Box\r\n key={section.id}\r\n data-section-id={section.id}\r\n data-canvas-type={canvasType}\r\n >\r\n <EditorSection\r\n section={section}\r\n isSelected={selectedSection === section.id}\r\n isDragging={activeId === section.id}\r\n isOver={dropTarget.id === section.id && dropTarget.type === 'inside' && dropTarget.canvasType === canvasType}\r\n onSelect={() => onSelectSection(section.id)}\r\n onUpdate={(content, extra) => {\r\n onUpdateSection(section.id, { content, ...extra }, canvasType);\r\n onSelectSection(null);\r\n }}\r\n onSplit={(content1, content2) => onSplitSection(section.id, content1, content2, canvasType)}\r\n onDelete={() => onDeleteSection(section.id, canvasType)}\r\n placeholders={formattedPlaceholders}\r\n setIsSectionEditing={setIsSectionEditing}\r\n />\r\n </Box>\r\n );\r\n i++;\r\n } else {\r\n const splitGroupId = section.splitGroupId;\r\n if (splitGroupId && processedGroups.has(splitGroupId)) {\r\n i++;\r\n continue;\r\n }\r\n\r\n const splitSections = canvasSections.filter(s => s.splitGroupId === splitGroupId);\r\n if (splitSections.length > 0) {\r\n if (splitGroupId) processedGroups.add(splitGroupId);\r\n\r\n // Split sections use stable keys based on section IDs and splitGroupId\r\n // This ensures React doesn't unnecessarily re-render or lose component state\r\n // when sections are reordered or updated\r\n const splitRow = (\r\n <Box\r\n key={`split-row-${splitGroupId}`}\r\n sx={{\r\n display: 'flex',\r\n gap: 2,\r\n mb: 2,\r\n bgcolor: 'rgba(0, 0, 0, 0.02)',\r\n p: 1,\r\n borderRadius: 1\r\n }}\r\n data-section-id={`split-group-${splitGroupId}`}\r\n data-canvas-type={canvasType}\r\n >\r\n {splitSections.map((splitSection, index) => (\r\n <React.Fragment key={splitSection.id}>\r\n {dropTarget.id === splitSection.id &&\r\n dropTarget.type === 'left' &&\r\n dropTarget.canvasType === canvasType && (\r\n renderDropIndicator(`drop-left-${splitSection.id}-${canvasType}`, true)\r\n )}\r\n <Box\r\n sx={{\r\n width: splitSection.splitWidth ? `${splitSection.splitWidth}%` : `${100 / splitSections.length}%`,\r\n transition: 'width 0.3s ease-in-out',\r\n }}\r\n data-section-id={splitSection.id}\r\n data-canvas-type={canvasType}\r\n >\r\n <EditorSection\r\n section={splitSection}\r\n isSelected={selectedSection === splitSection.id}\r\n isDragging={activeId === splitSection.id}\r\n isOver={dropTarget.id === splitSection.id && dropTarget.type === 'inside' && dropTarget.canvasType === canvasType}\r\n onSelect={() => onSelectSection(splitSection.id)}\r\n onUpdate={(content, extra) => {\r\n onUpdateSection(splitSection.id, { content, ...extra }, canvasType);\r\n onSelectSection(null);\r\n }}\r\n onSplit={(content1, content2) => onSplitSection(splitSection.id, content1, content2, canvasType)}\r\n onDelete={() => onDeleteSection(splitSection.id, canvasType)}\r\n placeholders={formattedPlaceholders}\r\n setIsSectionEditing={setIsSectionEditing}\r\n />\r\n </Box>\r\n {dropTarget.id === splitSection.id &&\r\n dropTarget.type === 'right' &&\r\n dropTarget.canvasType === canvasType && (\r\n renderDropIndicator(`drop-right-${splitSection.id}-${canvasType}`, true)\r\n )}\r\n </React.Fragment>\r\n ))}\r\n </Box>\r\n );\r\n result.push(splitRow);\r\n i += splitSections.length;\r\n } else {\r\n i++;\r\n }\r\n }\r\n\r\n if (dropTarget.id === sectionId &&\r\n dropTarget.type === 'after' &&\r\n dropTarget.canvasType === canvasType) {\r\n result.push(renderDropIndicator(`drop-after-${sectionId}-${canvasType}`));\r\n }\r\n }\r\n\r\n if ((canvasSections?.length === 0 && activeId && dropTarget.canvasType === canvasType) ||\r\n (canvasSections?.length === 0 && isDraggingFromSidebar && dropTarget.canvasType === canvasType)) {\r\n result.push(renderDropIndicator(`drop-empty-canvas-${canvasType}`));\r\n }\r\n\r\n return result;\r\n }, [\r\n isDraggingFromSidebar,\r\n dropTarget,\r\n activeId,\r\n selectedSection,\r\n onSelectSection,\r\n onUpdateSection,\r\n onSplitSection,\r\n onDeleteSection,\r\n formattedPlaceholders\r\n ]);\r\n\r\n const renderedMainSections = useMemo(() =>\r\n renderSectionsForCanvas(sections, CANVAS_TYPES.MAIN),\r\n [sections, dropTarget, activeId, isDraggingFromSidebar, selectedSection]\r\n );\r\n\r\n const renderedHeaderSections = useMemo(() =>\r\n renderSectionsForCanvas(headerSections, CANVAS_TYPES.HEADER),\r\n [headerSections, dropTarget, activeId, isDraggingFromSidebar, selectedSection, isEditingHeaderFooter]\r\n );\r\n\r\n const renderedFooterSections = useMemo(() =>\r\n renderSectionsForCanvas(footerSections, CANVAS_TYPES.FOOTER),\r\n [footerSections, dropTarget, activeId, isDraggingFromSidebar, selectedSection, isEditingHeaderFooter]\r\n );\r\n\r\n const renderPreview = () => {\r\n return (\r\n <Box\r\n sx={{\r\n transform: `scale(${zoom / 100})`,\r\n transformOrigin: 'top center',\r\n transition: 'transform 0.2s ease-in-out',\r\n bgcolor: 'white',\r\n p: 2,\r\n borderRadius: 1,\r\n boxShadow: 1,\r\n }}\r\n >\r\n <Box dangerouslySetInnerHTML={{ __html: generateEmailPreview(sections, headerSections, footerSections) }} />\r\n </Box>\r\n );\r\n };\r\n\r\n const renderHtmlEditor = () => (\r\n <Box sx={{ display: 'flex', flexDirection: 'column', height: '100%' }}>\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n px: 2,\r\n py: 1,\r\n bgcolor: '#1e1e1e',\r\n borderBottom: '1px solid #333',\r\n borderRadius: '4px 4px 0 0',\r\n }}\r\n >\r\n <Typography type='s3' sx={{ color: '#ccc', fontFamily: 'monospace' }}>\r\n HTML Source Editor — changes will replace current sections\r\n </Typography>\r\n <Box sx={{ display: 'flex', gap: 1 }}>\r\n <Button\r\n size='small'\r\n variant='contained'\r\n color='primary'\r\n startIcon={<CheckIcon fontSize='small' />}\r\n onClick={() => onApplyHtmlEdit(htmlEditValue)}\r\n sx={{ boxShadow: 'none' }}\r\n >\r\n Apply\r\n </Button>\r\n <Button\r\n size='small'\r\n variant='outlined'\r\n startIcon={<CloseIcon fontSize='small' />}\r\n onClick={() => onCancelHtmlEdit()}\r\n sx={(theme) => ({ color: `${theme.palette.theme.secondary[1000]} !important`, borderColor: '#555 !important' })}\r\n >\r\n Cancel\r\n </Button>\r\n </Box>\r\n </Box>\r\n <textarea\r\n value={htmlEditValue}\r\n onChange={(e) => setHtmlEditValue(e.target.value)}\r\n spellCheck={false}\r\n style={{\r\n flex: 1,\r\n width: '100%',\r\n minHeight: 'calc(100vh - 220px)',\r\n padding: '16px',\r\n fontFamily: '\"Fira Code\", \"Cascadia Code\", \"Consolas\", monospace',\r\n fontSize: '13px',\r\n lineHeight: '1.6',\r\n color: '#d4d4d4',\r\n backgroundColor: '#1e1e1e',\r\n border: 'none',\r\n outline: 'none',\r\n resize: 'none',\r\n boxSizing: 'border-box',\r\n borderRadius: '0 0 4px 4px',\r\n tabSize: 2,\r\n }}\r\n />\r\n </Box>\r\n );\r\n\r\n const renderCanvas = (\r\n title: string,\r\n canvasType: string,\r\n renderedSections: React.ReactNode[],\r\n setCanvasRef: (node: HTMLElement | null) => void,\r\n ref: React.MutableRefObject<HTMLDivElement | null>,\r\n visible: boolean = true\r\n ) => {\r\n if (!visible) return null;\r\n\r\n return (\r\n <Box sx={{ mb: 3 }}>\r\n {CANVAS_TYPES.MAIN === canvasType && visible && headerSections.length > 0 && (\r\n <>\r\n {/* <Accordion\r\n sx= {{\r\n boxShadow: 'none !important',\r\n \".MuiAccordionSummary-root\": {\r\n backgroundColor: '#fafafa !important',\r\n border: `0 !important`,\r\n p: 0,\r\n pb: 1,\r\n // mb: 1,\r\n m:0,\r\n minHeight: 'unset'\r\n }\r\n }}\r\n >\r\n <AccordionSummary\r\n expandIcon={<ExpandMoreIcon />}\r\n aria-controls=\"panel1-content\"\r\n id=\"panel1-header\"\r\n > */}\r\n <Typography type=\"h4\" weight='bold' color={'theme.secondary.800'}>Header</Typography>\r\n {/* </AccordionSummary> */}\r\n <Paper sx={{ mb: 1, boxShadow: 'none', opacity: 0.5 }} dangerouslySetInnerHTML={{ __html: generateHeaderFooterPreview(headerSections) }} />\r\n {/* </Accordion> */}\r\n </>\r\n )}\r\n <Typography type=\"h4\" weight='bold' color={'theme.secondary.800'} sx={{ mb: 1 }}>{title}</Typography>\r\n <Paper\r\n ref={(node) => {\r\n setCanvasRef(node);\r\n ref.current = node;\r\n }}\r\n elevation={0}\r\n sx={{\r\n p: 4,\r\n border: '1px dashed',\r\n borderColor: isDraggingFromSidebar && dropTarget.canvasType === canvasType\r\n ? 'primary.main'\r\n : 'primary.light',\r\n borderRadius: 1,\r\n bgcolor: 'background.paper',\r\n position: 'relative',\r\n minHeight: title === 'Header' || title === 'Footer' ? '100px' : '200px',\r\n transition: 'border-color 0.3s ease, background-color 0.3s ease',\r\n '&:hover': {\r\n bgcolor: isDraggingFromSidebar && dropTarget.canvasType === canvasType\r\n ? 'rgba(25, 118, 210, 0.04)'\r\n : 'background.paper',\r\n },\r\n pointerEvents: (canvasType === CANVAS_TYPES.HEADER || canvasType === CANVAS_TYPES.FOOTER) && !isEditingHeaderFooter\r\n ? 'none'\r\n : 'auto',\r\n opacity: (canvasType === CANVAS_TYPES.HEADER || canvasType === CANVAS_TYPES.FOOTER) && !isEditingHeaderFooter\r\n ? 0.5\r\n : 1,\r\n }}\r\n onClick={() => {\r\n if ((canvasType === CANVAS_TYPES.HEADER || canvasType === CANVAS_TYPES.FOOTER) && !isEditingHeaderFooter) return;\r\n onSelectSection(null);\r\n }}\r\n onMouseMove={(e) => handleMouseMove(e, canvasType)}\r\n onMouseEnter={(e) => handleMouseEnter(e, canvasType)}\r\n >\r\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\r\n {renderedSections}\r\n {getTargetSections(canvasType)?.length === 0 &&\r\n !activeId &&\r\n !isDraggingFromSidebar && (\r\n <Box sx={{ borderRadius: 1, p: 2, textAlign: 'center', color: 'text.secondary' }}>\r\n <Typography type='s2' color='theme.secondary.600' weight='medium'>\r\n Drag Sections from side panel to start building the {title.toLowerCase()}\r\n </Typography>\r\n </Box>\r\n )}\r\n </Box>\r\n </Paper>\r\n {CANVAS_TYPES.MAIN === canvasType && visible && footerSections.length > 0 && (\r\n <>\r\n {/* <Accordion\r\n sx= {{\r\n boxShadow: 'none !important',\r\n \".MuiAccordionSummary-root\": {\r\n backgroundColor: '#fafafa !important',\r\n border: `0 !important`,\r\n p: 0,\r\n pb: 1,\r\n // mb: 1,\r\n m:0,\r\n minHeight: 'unset'\r\n }\r\n }}\r\n >\r\n <AccordionSummary\r\n expandIcon={<ExpandMoreIcon />}\r\n aria-controls=\"panel1-content\"\r\n id=\"panel1-header\"\r\n > */}\r\n <Typography type=\"h4\" weight='bold' color={'theme.secondary.800'} sx={{ mt: 1 }}>Footer</Typography>\r\n {/* </AccordionSummary> */}\r\n <Paper sx={{ mb: 1, boxShadow: 'none', opacity: 0.5 }} dangerouslySetInnerHTML={{ __html: generateHeaderFooterPreview(footerSections) }} />\r\n {/* </Accordion> */}\r\n </>\r\n )}\r\n </Box>\r\n );\r\n };\r\n\r\n return (\r\n <Box sx={{ display: 'flex', flex: 1, overflow: 'hidden' }}>\r\n <Box sx={{ flex: 1, overflow: 'auto', height: 'calc(100vh - 104px)' }}>\r\n <Container maxWidth={editHtml ? false : 'lg'} sx={{ py: editHtml ? 0 : 4, height: editHtml ? '100%' : undefined }}>\r\n {editHtml ? (\r\n renderHtmlEditor()\r\n ) : preview ? (\r\n renderPreview()\r\n ) : (\r\n <>\r\n {renderCanvas(\r\n 'Header',\r\n CANVAS_TYPES.HEADER,\r\n renderedHeaderSections,\r\n setHeaderCanvasRef,\r\n headerCanvasRef,\r\n isEditingHeaderFooter\r\n )}\r\n {renderCanvas(\r\n 'Content',\r\n CANVAS_TYPES.MAIN,\r\n renderedMainSections,\r\n setMainCanvasRef,\r\n mainCanvasRef,\r\n !isEditingHeaderFooter\r\n )}\r\n {renderCanvas(\r\n 'Footer',\r\n CANVAS_TYPES.FOOTER,\r\n renderedFooterSections,\r\n setFooterCanvasRef,\r\n footerCanvasRef,\r\n isEditingHeaderFooter\r\n )}\r\n </>\r\n )}\r\n </Container>\r\n </Box >\r\n {!editHtml && (\r\n <Box\r\n sx={{\r\n width: isFromPreview ? (editMode ? 400 : 0) : 400,\r\n flexShrink: 0,\r\n position: 'sticky',\r\n top: 0,\r\n alignSelf: 'flex-start',\r\n height: 'calc(100vh - 104px)',\r\n overflowY: 'auto',\r\n borderLeft: '1px solid',\r\n borderColor: 'divider',\r\n bgcolor: 'background.paper',\r\n zIndex: 1,\r\n }}\r\n >\r\n {(selectedSection && !selectedSectionData?.is_edited_from_source && !isSectionEditing) ? (\r\n <SectionFormatPanel\r\n section={selectedSectionData}\r\n onClose={() => onSelectSection(null)}\r\n onUpdate={(data) => {\r\n if (selectedSection) {\r\n const canvasType = headerSections.some(s => s.id === selectedSection)\r\n ? CANVAS_TYPES.HEADER\r\n : footerSections.some(s => s.id === selectedSection)\r\n ? CANVAS_TYPES.FOOTER\r\n : CANVAS_TYPES.MAIN;\r\n onUpdateSection(selectedSection, data, canvasType);\r\n }\r\n }}\r\n placeholders={placeholders}\r\n handleSave={handleSave}\r\n relation_table={relation_table}\r\n />\r\n ) : (\r\n isFromPreview ? (editMode && <EditorSidebar />) : <EditorSidebar />\r\n )}\r\n </Box>\r\n )}\r\n </Box >\r\n );\r\n};\r\n\r\nexport default EditorCanvas;","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React, { useEffect, useState } from 'react';\r\n\r\nimport Modal from '../../../components/modal/modal';\r\nimport Typography from '../../../components/typography/typography';\r\nimport Button from '../../../components/button/button';\r\n\r\nimport {\r\n\tBox,\r\n\tCircularProgress,\r\n\tDialogActions,\r\n\tDialogContent,\r\n\tDialogProps,\r\n\tDialogTitle,\r\n\tIconButton,\r\n} from '@mui/material';\r\nimport Close from '@mui/icons-material/Close';\r\n\r\nimport './template-name-modal.scss';\r\nimport { IEmail } from '../utils/types';\r\nimport { enqueueSnackbar } from 'notistack';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport DynamicInput from '../../../components/form-control/form-builder/form-builder-element/text';\r\nimport { useForm } from 'react-hook-form';\r\nimport { patchV1TemplatesId, postV1Templates } from '../../../api-client/api.system-feature/api';\r\nimport * as Yup from 'yup';\r\nimport { yupResolver } from '@hookform/resolvers/yup';\r\n\r\ninterface TemplateNameModalProps {\r\n\tisOpen: boolean;\r\n\tsetIsOpen: (value: IEmail | null) => void;\r\n\tmodalProps?: DialogProps;\r\n\ttemplateRoutes: Record<string, any>;\r\n\tpayload: Record<string, any>;\r\n\tmode: 'add' | 'edit';\r\n\ttemplateData: Record<string, any> | null;\r\n\tonSaveSuccess?: () => void;\r\n\tonSaveError?: () => void;\r\n\tisSaving?: boolean;\r\n}\r\n\r\nconst generateValidationSchema = () => {\r\n\treturn yupResolver(\r\n\t\tYup.object().shape({\r\n\t\t\ttemplate_name: Yup.object().shape({\r\n\t\t\t\tname: Yup.string().trim().required('Template name is required'),\r\n\t\t\t})\r\n\t\t})\r\n\t)\r\n}\r\n\r\nconst TemplateNameModal: React.FC<TemplateNameModalProps> = ({\r\n\tisOpen,\r\n\tsetIsOpen,\r\n\tmodalProps,\r\n\ttemplateRoutes,\r\n\tpayload,\r\n\tmode = 'add',\r\n\ttemplateData,\r\n\tonSaveSuccess,\r\n\tonSaveError,\r\n\tisSaving: parentIsSaving = false,\r\n}) => {\r\n\tconsole.log(\"is saving...........\",parentIsSaving)\r\n\tconst { handleSubmit, control, setValue } = useForm({ mode: 'all', resolver: generateValidationSchema() });\r\n\tconst navigate = useNavigate();\r\n\tconst [isSubmitting, setIsSubmitting] = useState<boolean>(false);\r\n\tconsole.log(\"isSubmitting............\",isSubmitting)\r\n\r\n\tconst handleModalClose = () => {\r\n\t\tif (!isSubmitting && !parentIsSaving) {\r\n\t\t\tsetIsOpen(null);\r\n\t\t}\r\n\t};\r\n\r\n\tconst onSubmit = async (values: any) => {\r\n\t\tsetIsSubmitting(true);\r\n\t\ttry {\r\n\t\t\tconst { name = ''} = values?.template_name || {}\r\n\t\t\tpayload.name = name\r\n\t\t\tconst res = await (mode === 'edit' ? patchV1TemplatesId(payload) : postV1Templates(payload));\r\n\t\t\tif(res.status_code === 200) {\r\n\t\t\t\tenqueueSnackbar('Template saved successfully', { variant: 'success' });\r\n\t\t\t\tonSaveSuccess?.();\r\n\t\t\t\tnavigate(templateRoutes.LIST);\r\n\t\t\t}\r\n\t\t\tsetIsSubmitting(false);\r\n\t\t} catch (error) {\r\n\t\t\tconst m = error?.message || 'Something went wrong'\r\n\t\t\tsetIsSubmitting(false);\r\n\t\t\tenqueueSnackbar(m, { variant: 'error' });\r\n\t\t\tonSaveError?.();\r\n\t\t}\r\n\t}\r\n\r\n\tuseEffect(() => {\r\n\t\tif(templateData && templateData?.name) {\r\n\t\t\tsetValue('template_name.name', templateData?.name)\r\n\t\t}\r\n\t}, [setValue, templateData])\r\n\r\n\treturn (\r\n\t\t<Modal\r\n\t\t\topen={isOpen}\r\n\t\t\tonClose={handleModalClose}\r\n\t\t\tmaxWidth='xs'\r\n\t\t\tfullWidth\r\n\t\t\t{...modalProps}>\r\n\t\t\t<DialogTitle className='companySelectionModal--DialogTitle'>\r\n\t\t\t\t<Typography type='s3' color='inherit' weight='medium'>\r\n\t\t\t\t\t{parentIsSaving ? 'Saving Template...' : 'Template Name'}\r\n\t\t\t\t</Typography>\r\n\t\t\t\t<IconButton onClick={handleModalClose} disabled={isSubmitting || parentIsSaving}>\r\n\t\t\t\t\t<Close fontSize='small' />\r\n\t\t\t\t</IconButton>\r\n\t\t\t</DialogTitle>\r\n\t\t\t<DialogContent className='companySelectionModal--DialogContents'>\r\n\t\t\t\t<form onSubmit={handleSubmit(onSubmit)} id='template_name'>\r\n\t\t\t\t\t<DynamicInput \r\n\t\t\t\t\t\tlabel={'Name'}\r\n\t\t\t\t\t\tname='name'\r\n\t\t\t\t\t\tplaceholder={'Enter Name'}\r\n\t\t\t\t\t\tfieldArrayName='template_name'\r\n\t\t\t\t\t\tformControl={control}\r\n\t\t\t\t\t\trequired\r\n\t\t\t\t\t/>\r\n\t\t\t\t</form>\r\n\t\t\t</DialogContent>\r\n\t\t\t<DialogActions className='companySelectionModal--DialogAction'>\r\n\t\t\t\t<Box display='flex' gap={1.5}>\r\n\t\t\t\t\t<Button className='companySelectionModal--DialogAction--WhiteBtn' onClick={handleModalClose} disabled={isSubmitting || parentIsSaving}>Cancel</Button>\r\n\t\t\t\t\t<Button type='submit' form='template_name' disabled={isSubmitting || parentIsSaving} endIcon={(isSubmitting || parentIsSaving) && <CircularProgress size={15}/>}>\r\n\t\t\t\t\t\t{parentIsSaving ? 'Saving...' : 'Save'}\r\n\t\t\t\t\t</Button>\r\n\t\t\t\t</Box>\r\n\t\t\t</DialogActions>\r\n\t\t</Modal>\r\n\t);\r\n};\r\n\r\nexport default TemplateNameModal;\r\n","/* eslint-disable no-case-declarations */\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable react-hooks/exhaustive-deps */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React, { useState, useEffect, useCallback, useMemo } from 'react';\r\nimport EditorHeader from './EditorHeader';\r\nimport EditorCanvas from './EditorCanvas';\r\nimport {\r\n DndContext,\r\n DragEndEvent,\r\n DragOverEvent,\r\n DragStartEvent,\r\n pointerWithin,\r\n} from '@dnd-kit/core';\r\nimport { SectionData, ElementType } from '../types/editor';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { enqueueSnackbar } from 'notistack';\r\nimport { Box } from '@mui/material';\r\nimport { useLocation, useParams } from 'react-router-dom';\r\nimport { getErrorMessage, getToken } from '../../../utils/common';\r\nimport { getV1FormBuilderRelationalSchemaFieldsName, getV1SubjectsId, getV1TemplateHeaderFooterCompanyIdHeaderFooter, getV1TemplatesId, patchV1TemplateHeaderFooterId, postV1TemplateHeaderFooter } from '../../../api-client/api.system-feature/api';\r\nimport { templateRoutes, extractStyles, generateEmailPreview, generateHeaderFooterPreview, generateInlineStyles } from '../utils/common';\r\nimport { initialStyles } from '../utils/constant';\r\nimport _ from 'lodash';\r\nimport formatText from '../../../utils/format-text';\r\nimport TemplateNameModal from \"../template-name-modal/template-name-modal\";\r\nimport { useDebouncedUpdate } from '../hooks/useDebouncedUpdate';\r\n\r\ninterface EnhancedSectionData extends SectionData {\r\n isSplitPair?: boolean;\r\n splitGroupId?: string;\r\n splitWidth?: number;\r\n}\r\n\r\ninterface SectionFlowEditorProps {\r\n modulePath: string;\r\n module: string;\r\n type: string;\r\n}\r\n\r\nconst SectionFlowEditor: React.FC<SectionFlowEditorProps> = ({ modulePath, module, type }) => {\r\n const { id, template_id } = useParams();\r\n const { state: locationState } = useLocation();\r\n\r\n const [sections, setSections] = useState<EnhancedSectionData[]>([]);\r\n const [headerSections, setHeaderSections] = useState<EnhancedSectionData[]>([]);\r\n const [footerSections, setFooterSections] = useState<EnhancedSectionData[]>([]);\r\n const [activeId, setActiveId] = useState<string | null>(null);\r\n const [editMode, setEditMode] = useState<true | false>(false);\r\n const [fromPreview, setFromPreview] = useState<boolean>(false);\r\n const [selectedSection, setSelectedSection] = useState<string | null>(null);\r\n const [overSection, setOverSection] = useState<string | null>(null);\r\n const [preview, setPreview] = useState<boolean>(locationState?.fromPreview ? true : false);\r\n const [editHtml, setEditHtml] = useState<boolean>(false);\r\n const [placeholders, setPlaceholders] = useState<Record<string, any>[]>([]);\r\n const [activeCanvas, setActiveCanvas] = useState<'main' | 'header' | 'footer'>('main');\r\n const [isEditingHeaderFooter, setIsEditingHeaderFooter] = useState<boolean>(false);\r\n const [payload, setPayload] = useState<any>(null);\r\n const [headerFooterId, setHeaderFooterId] = useState<string>('');\r\n const ROUTES = templateRoutes(modulePath, type);\r\n const [relation_table, setRelationTable] = useState<any[]>([]);\r\n const [templateData, setTemplateData] = useState<Record<string, any> | null>(null);\r\n\r\n // Optimistic update state\r\n const [isSaving, setIsSaving] = useState<boolean>(false);\r\n const [savedSnapshot, setSavedSnapshot] = useState<{\r\n sections: EnhancedSectionData[];\r\n headerSections: EnhancedSectionData[];\r\n footerSections: EnhancedSectionData[];\r\n } | null>(null);\r\n const [zoom, setZoom] = useState<number>(100);\r\n\r\n const handleZoomIn = () => {\r\n setZoom(prev => Math.min(prev + 10, 150));\r\n };\r\n\r\n const handleZoomOut = () => {\r\n setZoom(prev => Math.max(prev - 10, 50));\r\n };\r\n\r\n const handleResetZoom = () => {\r\n setZoom(100);\r\n };\r\n // History state for undo/redo functionality\r\n const [history, setHistory] = useState<{\r\n past: Array<{ sections: EnhancedSectionData[]; headerSections: EnhancedSectionData[]; footerSections: EnhancedSectionData[] }>;\r\n future: Array<{ sections: EnhancedSectionData[]; headerSections: EnhancedSectionData[]; footerSections: EnhancedSectionData[] }>;\r\n }>({\r\n past: [],\r\n future: [],\r\n });\r\n const MAX_HISTORY_SIZE = 50;\r\n\r\n // Memoize placeholders to prevent recreation on every render\r\n const memoizedPlaceholders = useMemo(() => placeholders, [JSON.stringify(placeholders)]);\r\n\r\n // Helper function to save current state to history\r\n const saveToHistory = useCallback(() => {\r\n setHistory((prev) => {\r\n const newPast = [\r\n ...prev.past,\r\n {\r\n sections: [...sections],\r\n headerSections: [...headerSections],\r\n footerSections: [...footerSections],\r\n },\r\n ].slice(-MAX_HISTORY_SIZE); // Keep only last 50 operations\r\n\r\n return {\r\n past: newPast,\r\n future: [], // Clear future when new action is performed\r\n };\r\n });\r\n }, [sections, headerSections, footerSections]);\r\n\r\n // Undo handler\r\n const handleUndo = useCallback(() => {\r\n if (history.past.length === 0) return;\r\n\r\n const previous = history.past[history.past.length - 1];\r\n const newPast = history.past.slice(0, -1);\r\n\r\n setHistory({\r\n past: newPast,\r\n future: [\r\n {\r\n sections: [...sections],\r\n headerSections: [...headerSections],\r\n footerSections: [...footerSections],\r\n },\r\n ...history.future,\r\n ].slice(0, MAX_HISTORY_SIZE),\r\n });\r\n\r\n setSections(previous.sections);\r\n setHeaderSections(previous.headerSections);\r\n setFooterSections(previous.footerSections);\r\n }, [history, sections, headerSections, footerSections]);\r\n\r\n // Redo handler\r\n const handleRedo = useCallback(() => {\r\n if (history.future.length === 0) return;\r\n\r\n const next = history.future[0];\r\n const newFuture = history.future.slice(1);\r\n\r\n setHistory({\r\n past: [\r\n ...history.past,\r\n {\r\n sections: [...sections],\r\n headerSections: [...headerSections],\r\n footerSections: [...footerSections],\r\n },\r\n ].slice(-MAX_HISTORY_SIZE),\r\n future: newFuture,\r\n });\r\n\r\n setSections(next.sections);\r\n setHeaderSections(next.headerSections);\r\n setFooterSections(next.footerSections);\r\n }, [history, sections, headerSections, footerSections]);\r\n\r\n // Keyboard shortcuts for undo/redo\r\n useEffect(() => {\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n // Ctrl+Z or Cmd+Z for undo\r\n if ((event.ctrlKey || event.metaKey) && event.key === 'z' && !event.shiftKey) {\r\n event.preventDefault();\r\n handleUndo();\r\n }\r\n // Ctrl+Y or Cmd+Shift+Z for redo\r\n else if (\r\n ((event.ctrlKey || event.metaKey) && event.key === 'y') ||\r\n ((event.ctrlKey || event.metaKey) && event.shiftKey && event.key === 'z')\r\n ) {\r\n event.preventDefault();\r\n handleRedo();\r\n }\r\n };\r\n\r\n window.addEventListener('keydown', handleKeyDown);\r\n return () => {\r\n window.removeEventListener('keydown', handleKeyDown);\r\n };\r\n }, [handleUndo, handleRedo]);\r\n\r\n const createNewSection = useCallback((type: ElementType, attrs: Record<string, any> = {}): EnhancedSectionData => {\r\n let content = '';\r\n const styles = initialStyles[type] || {};\r\n const inlineStyles: string = generateInlineStyles(styles);\r\n\r\n const idPrefix = activeCanvas === 'header' && isEditingHeaderFooter ? 'header-' :\r\n activeCanvas === 'footer' && isEditingHeaderFooter ? 'footer-' : '';\r\n\r\n switch (type) {\r\n case 'heading':\r\n content = `<h1 style=\"${inlineStyles}\">Heading 1</h1>`;\r\n break;\r\n case 'heading-2':\r\n content = `<h2 style=\"${inlineStyles}\">Heading 2</h2>`;\r\n break;\r\n case 'heading-3':\r\n content = `<h3 style=\"${inlineStyles}\">Heading 3</h3>`;\r\n break;\r\n case 'heading-4':\r\n content = `<h4 style=\"${inlineStyles}\">Heading 4</h4>`;\r\n break;\r\n case 'text':\r\n content = `<p style=\"${inlineStyles}\">Hello, enter your text here...</p>`;\r\n break;\r\n case 'image':\r\n content = `<img src=\"${attrs.src}\" alt=\"${attrs.alt}\" style=\"${inlineStyles};\" />`;\r\n break;\r\n case 'buttons':\r\n attrs.text = attrs?.text || 'Button text';\r\n content = `<button style=\"${inlineStyles}\">${attrs.text}</button>`;\r\n break;\r\n case 'divider':\r\n content = `<hr style=\"${inlineStyles}\" />`;\r\n break;\r\n case 'table':\r\n const tableStyles = styles as any;\r\n const { border, borderStyle, borderColor, ...rest } = tableStyles;\r\n const tInlineStyles = generateInlineStyles(tableStyles.is_bordered ? tableStyles : rest);\r\n const tHeadInlineStyles: string = generateInlineStyles(tableStyles.tHead);\r\n const tBodyInlineStyles: string = generateInlineStyles(tableStyles.tBody);\r\n const thCellInlineStyles: string = generateInlineStyles({ ...tableStyles.thCells, border, borderStyle, borderColor });\r\n const tbCellInlineStyles: string = generateInlineStyles({ ...tableStyles.tbCells, border, borderStyle, borderColor });\r\n content = `\r\n <table style=\"${tInlineStyles}\">\r\n <thead style=\"${tHeadInlineStyles}\">\r\n <tr style=\"background-color: #f5f5f5;\">\r\n <th style=\"${thCellInlineStyles}\"></th>\r\n <th style=\"${thCellInlineStyles}\"></th>\r\n <th style=\"${thCellInlineStyles}\"></th>\r\n </tr>\r\n </thead>\r\n <tbody style=\"${tBodyInlineStyles}\">\r\n <tr>\r\n <td style=\"${tbCellInlineStyles}\"></td>\r\n <td style=\"${tbCellInlineStyles}\"></td>\r\n <td style=\"${tbCellInlineStyles}\"></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n `;\r\n break;\r\n case 'signature':\r\n content = `<div style=\"${inlineStyles}\">Signature: <input type='text' style=\"border:0; border-bottom:1px solid black\" class='signature-input'/></div>`;\r\n break;\r\n case 'qr-code':\r\n attrs.placeholder = attrs?.placeholder || '{{qr_data}}';\r\n content = `<div style=\"background-color: #f5f5f5; padding: 16px; text-align: center; color: #666666;\">${attrs.placeholder}</div>`;\r\n break;\r\n case 'bar-code':\r\n attrs.placeholder = attrs?.placeholder || '{{barcode_data}}';\r\n content = `<div style=\"background-color: #f5f5f5; padding: 16px; text-align: center; color: #666666;\">${attrs.placeholder}</div>`;\r\n break;\r\n default:\r\n content = '<p style=\"font-size: 16px; color: #333333; line-height: 1.5;\">New section</p>';\r\n }\r\n\r\n let attributes: Record<string, any> = {};\r\n attributes = extractStyles(content, type);\r\n\r\n return {\r\n id: `${idPrefix}section-${uuidv4()}`,\r\n content,\r\n type,\r\n attributes: { ...(attrs || {}), styles },\r\n is_edited_from_source: false\r\n };\r\n }, [activeCanvas, isEditingHeaderFooter]);\r\n\r\n const handleDragStart = useCallback((event: DragStartEvent) => {\r\n const { active } = event;\r\n setActiveId(active.id as string);\r\n }, []);\r\n\r\n const handleDragOver = useCallback((event: DragOverEvent) => {\r\n const { /* active, */ over } = event;\r\n\r\n if (!over) {\r\n setOverSection(null);\r\n return;\r\n }\r\n\r\n if (over.id === 'header-canvas' && isEditingHeaderFooter) {\r\n setActiveCanvas('header');\r\n } else if (over.id === 'footer-canvas' && isEditingHeaderFooter) {\r\n setActiveCanvas('footer');\r\n } else if (over.id === 'main-canvas') {\r\n setActiveCanvas('main');\r\n }\r\n\r\n if (over.id !== 'header-canvas' && over.id !== 'main-canvas' && over.id !== 'footer-canvas') {\r\n setOverSection(over.id as string);\r\n }\r\n }, [isEditingHeaderFooter]);\r\n\r\n const handleDragEnd = useCallback((event: DragEndEvent) => {\r\n const { active, over } = event;\r\n\r\n setActiveId(null);\r\n setOverSection(null);\r\n\r\n if (!over) return;\r\n\r\n let targetSections = sections;\r\n let setTargetSections = setSections;\r\n\r\n if ((over.id === 'header-canvas' || overSection?.startsWith('header-')) && isEditingHeaderFooter) {\r\n targetSections = headerSections;\r\n setTargetSections = setHeaderSections;\r\n setActiveCanvas('header');\r\n } else if ((over.id === 'footer-canvas' || overSection?.startsWith('footer-')) && isEditingHeaderFooter) {\r\n targetSections = footerSections;\r\n setTargetSections = setFooterSections;\r\n setActiveCanvas('footer');\r\n } else {\r\n setActiveCanvas('main');\r\n }\r\n\r\n if (active.data.current?.type === 'image') {\r\n saveToHistory(); // Save state before adding image section\r\n const imageUrl = active.data.current.imageUrl;\r\n const newSection: EnhancedSectionData = createNewSection('image', { src: imageUrl, alt: 'Image' });\r\n\r\n const overIndex = targetSections.findIndex((section) => section.id === over.id);\r\n const newSections = [...targetSections];\r\n\r\n if (over.id === 'header-canvas' || over.id === 'main-canvas' || over.id === 'footer-canvas' || overIndex === -1) {\r\n setTargetSections([...targetSections, newSection]);\r\n } else {\r\n newSections.splice(overIndex, 0, newSection);\r\n setTargetSections(newSections);\r\n }\r\n\r\n enqueueSnackbar('Added uploaded image section');\r\n return;\r\n }\r\n\r\n if (typeof active.id === 'string' && active.id.startsWith('sidebar-')) {\r\n saveToHistory(); // Save state before adding new section\r\n const type = active.id.replace('sidebar-', '') as ElementType;\r\n const newSection = createNewSection(type);\r\n\r\n const overIndex = targetSections.findIndex((section) => section.id === over.id);\r\n const isOverSection = overIndex !== -1;\r\n\r\n if (!isOverSection || over.id === 'header-canvas' || over.id === 'main-canvas' || over.id === 'footer-canvas') {\r\n setTargetSections([...targetSections, newSection]);\r\n } else {\r\n const targetSection = targetSections[overIndex];\r\n const isEmpty =\r\n !targetSection.content ||\r\n targetSection.content.includes('Click to add') ||\r\n targetSection.content.includes('enter your text');\r\n\r\n if (isEmpty) {\r\n const updatedSections = [...targetSections];\r\n updatedSections[overIndex] = {\r\n ...targetSection,\r\n type,\r\n content: newSection.content,\r\n };\r\n setTargetSections(updatedSections);\r\n // enqueueSnackbar(`Changed section to ${type}`);\r\n } else {\r\n const updatedSections = [...targetSections];\r\n updatedSections.splice(overIndex, 0, newSection);\r\n setTargetSections(updatedSections);\r\n // enqueueSnackbar(`Added new ${type} section`);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n if (\r\n active.id !== over.id &&\r\n typeof active.id === 'string' &&\r\n typeof over.id === 'string'\r\n ) {\r\n saveToHistory(); // Save state before reordering sections\r\n let sourceSections: EnhancedSectionData[] = [];\r\n let sourceSetSections: React.Dispatch<React.SetStateAction<EnhancedSectionData[]>> | null = null;\r\n let canvasId = '';\r\n\r\n if (active.id.startsWith('header-') && isEditingHeaderFooter) {\r\n sourceSections = headerSections;\r\n sourceSetSections = setHeaderSections;\r\n canvasId = 'header-canvas';\r\n } else if (active.id.startsWith('footer-') && isEditingHeaderFooter) {\r\n sourceSections = footerSections;\r\n sourceSetSections = setFooterSections;\r\n canvasId = 'footer-canvas';\r\n } else {\r\n sourceSections = sections;\r\n sourceSetSections = setSections;\r\n canvasId = 'main-canvas';\r\n }\r\n\r\n const cleanActiveId = active.id.replace(/^(header-|footer-)/, '');\r\n\r\n const oldIndex = sourceSections.findIndex((section) =>\r\n section.id === cleanActiveId || section.id === active.id\r\n );\r\n\r\n let newIndex = targetSections.findIndex((section) =>\r\n section.id === String(over.id).replace(/^(header-|footer-)/, '')\r\n );\r\n\r\n if (over.id === 'header-canvas' || over.id === 'main-canvas' || over.id === 'footer-canvas') {\r\n newIndex = targetSections.length;\r\n }\r\n\r\n if (oldIndex !== -1 && newIndex !== -1) {\r\n if (sourceSections === targetSections) {\r\n const newSections = [...sourceSections];\r\n const [movedSection] = newSections.splice(oldIndex, 1);\r\n\r\n if (movedSection.isSplitPair && movedSection.splitGroupId) {\r\n const groupId = movedSection.splitGroupId;\r\n const groupSections = [movedSection, ...sourceSections.filter(\r\n s => s.splitGroupId === groupId && s.id !== movedSection.id\r\n )];\r\n\r\n const cleaned = newSections.filter(s => s.splitGroupId !== groupId);\r\n cleaned.splice(newIndex, 0, ...groupSections);\r\n sourceSetSections(cleaned);\r\n } else {\r\n newSections.splice(newIndex, 0, movedSection);\r\n sourceSetSections(newSections);\r\n }\r\n } else {\r\n const originalSection = sourceSections[oldIndex];\r\n\r\n const newSourceSections = [...sourceSections];\r\n newSourceSections.splice(oldIndex, 1);\r\n sourceSetSections(newSourceSections);\r\n\r\n const newTargetSections = [...targetSections];\r\n\r\n const movedSection = { ...originalSection };\r\n\r\n if ((over.id === 'header-canvas' || over.id.startsWith('header-')) && isEditingHeaderFooter) {\r\n if (!movedSection.id.startsWith('header-')) {\r\n movedSection.id = `header-${movedSection.id}`;\r\n }\r\n } else if ((over.id === 'footer-canvas' || over.id.startsWith('footer-')) && isEditingHeaderFooter) {\r\n if (!movedSection.id.startsWith('footer-')) {\r\n movedSection.id = `footer-${movedSection.id}`;\r\n }\r\n } else {\r\n movedSection.id = movedSection.id.replace(/^(header-|footer-)/, '');\r\n }\r\n\r\n newTargetSections.splice(newIndex, 0, movedSection);\r\n setTargetSections(newTargetSections);\r\n }\r\n }\r\n }\r\n }, [sections, headerSections, footerSections, overSection, isEditingHeaderFooter, activeCanvas, createNewSection, saveToHistory]);\r\n\r\n const getRelevantSections = useCallback((canvasType: string) => {\r\n if (canvasType === 'header' && isEditingHeaderFooter) return headerSections;\r\n if (canvasType === 'footer' && isEditingHeaderFooter) return footerSections;\r\n return sections;\r\n }, [sections, headerSections, footerSections, isEditingHeaderFooter]);\r\n\r\n const getRelevantSetSections = useCallback((canvasType: string) => {\r\n if (canvasType === 'header' && isEditingHeaderFooter) return setHeaderSections;\r\n if (canvasType === 'footer' && isEditingHeaderFooter) return setFooterSections;\r\n return setSections;\r\n }, [isEditingHeaderFooter]);\r\n\r\n // Internal update function (not debounced)\r\n const updateSectionImmediate = useCallback((id: string, data: Partial<EnhancedSectionData>, canvasType: string) => {\r\n const relevantSections = getRelevantSections(canvasType);\r\n const relevantSetSections = getRelevantSetSections(canvasType);\r\n\r\n const cleanId = id.replace(/^(header-|footer-)/, '');\r\n\r\n relevantSetSections(\r\n relevantSections.map((section) =>\r\n section.id === cleanId || section.id === id ? { ...section, ...data } : section\r\n )\r\n );\r\n }, [getRelevantSections, getRelevantSetSections]);\r\n\r\n // Debounced version for section content updates (300ms delay)\r\n const handleUpdateSectionDebounced = useDebouncedUpdate(updateSectionImmediate, 300);\r\n\r\n // Main handler that decides whether to debounce\r\n const handleUpdateSection = useCallback((id: string, data: Partial<EnhancedSectionData>, canvasType: string) => {\r\n // Only debounce content updates, apply other updates immediately\r\n if (data.content !== undefined && Object.keys(data).length === 1) {\r\n handleUpdateSectionDebounced(id, data, canvasType);\r\n } else {\r\n updateSectionImmediate(id, data, canvasType);\r\n }\r\n }, [updateSectionImmediate, handleUpdateSectionDebounced]);\r\n\r\n const handleSplitSection = useCallback((id: string, content1: string, content2: string, canvasType: string) => {\r\n saveToHistory(); // Save state before splitting section\r\n\r\n const relevantSections = getRelevantSections(canvasType);\r\n const relevantSetSections = getRelevantSetSections(canvasType);\r\n\r\n const cleanId = id.replace(/^(header-|footer-)/, '');\r\n\r\n const index = relevantSections.findIndex((section) => section.id === cleanId || section.id === id);\r\n if (index === -1) return;\r\n\r\n const section = relevantSections[index];\r\n const newSections = [...relevantSections];\r\n\r\n const sectionPrefix = canvasType === 'header' ? 'header-' : canvasType === 'footer' ? 'footer-' : '';\r\n\r\n if (section.isSplitPair && section.splitGroupId) {\r\n const splitGroupId = section.splitGroupId;\r\n const splitSections = newSections.filter(s => s.splitGroupId === splitGroupId);\r\n const totalSections = splitSections.length + 1;\r\n const newWidth = 100 / totalSections;\r\n\r\n newSections[index] = {\r\n ...section,\r\n content: content1,\r\n splitWidth: newWidth\r\n };\r\n\r\n const newSection: EnhancedSectionData = {\r\n id: `${sectionPrefix}section-${uuidv4()}`,\r\n content: content2,\r\n type: section.type,\r\n isSplitPair: true,\r\n splitGroupId: splitGroupId,\r\n splitWidth: newWidth,\r\n attributes: section.attributes,\r\n is_edited_from_source: false\r\n };\r\n\r\n newSections.splice(index + 1, 0, newSection);\r\n\r\n for (let i = 0; i < newSections.length; i++) {\r\n if (newSections[i].splitGroupId === splitGroupId) {\r\n newSections[i].splitWidth = newWidth;\r\n }\r\n }\r\n } else {\r\n const splitGroupId = uuidv4();\r\n const initialWidth = 50;\r\n\r\n newSections[index] = {\r\n ...section,\r\n content: content1,\r\n isSplitPair: true,\r\n splitGroupId,\r\n splitWidth: initialWidth\r\n };\r\n\r\n const newSection: EnhancedSectionData = {\r\n id: `${sectionPrefix}section-${uuidv4()}`,\r\n content: content2,\r\n type: section.type,\r\n isSplitPair: true,\r\n splitGroupId,\r\n splitWidth: initialWidth,\r\n attributes: section.attributes,\r\n is_edited_from_source: false\r\n };\r\n\r\n newSections.splice(index + 1, 0, newSection);\r\n }\r\n\r\n relevantSetSections(newSections);\r\n // enqueueSnackbar('Section split successfully');\r\n }, [getRelevantSections, getRelevantSetSections, activeCanvas, isEditingHeaderFooter, saveToHistory]);\r\n\r\n const handleDeleteSection = useCallback((id: string, canvasType: string) => {\r\n saveToHistory(); // Save state before deleting section\r\n\r\n const relevantSections = getRelevantSections(canvasType);\r\n const relevantSetSections = getRelevantSetSections(canvasType);\r\n\r\n const cleanId = id.replace(/^(header-|footer-)/, '');\r\n\r\n const sectionToDelete = relevantSections.find(s => s.id === cleanId || s.id === id);\r\n\r\n if (!sectionToDelete) return;\r\n\r\n if (sectionToDelete.isSplitPair && sectionToDelete.splitGroupId) {\r\n const splitSections = relevantSections.filter(s => s.splitGroupId === sectionToDelete.splitGroupId);\r\n\r\n if (splitSections.length <= 2) {\r\n const remainingSection = splitSections.find(s => s.id !== cleanId && s.id !== id);\r\n if (remainingSection) {\r\n remainingSection.isSplitPair = false;\r\n remainingSection.splitGroupId = undefined;\r\n remainingSection.splitWidth = undefined;\r\n }\r\n relevantSetSections(relevantSections.filter(s => s.id !== cleanId && s.id !== id));\r\n } else {\r\n const remainingSplitSections = splitSections.filter(s => s.id !== cleanId && s.id !== id);\r\n const newWidth = 100 / remainingSplitSections.length;\r\n\r\n const updatedSections = relevantSections.filter(section => section.id !== cleanId && section.id !== id).map(section => {\r\n if (section.splitGroupId === sectionToDelete.splitGroupId) {\r\n return { ...section, splitWidth: newWidth };\r\n }\r\n return section;\r\n });\r\n\r\n relevantSetSections(updatedSections);\r\n // enqueueSnackbar('Section removed from split group');\r\n }\r\n } else {\r\n relevantSetSections(relevantSections.filter(section => section.id !== cleanId && section.id !== id));\r\n // enqueueSnackbar('Section deleted');\r\n }\r\n\r\n if (selectedSection === id) {\r\n setSelectedSection(null);\r\n }\r\n }, [getRelevantSections, getRelevantSetSections, selectedSection, saveToHistory]);\r\n\r\n useEffect(() => {\r\n if (locationState?.fromPreview) {\r\n setEditMode(locationState?.isViewOnly ? false : true);\r\n setFromPreview(true);\r\n }\r\n document.body.style.overflow = 'hidden';\r\n const main = document.getElementsByTagName('main')?.[0];\r\n if (main) {\r\n main.style.marginTop = '4.125rem';\r\n }\r\n return () => {\r\n document.body.removeAttribute('style');\r\n }\r\n }, []);\r\n\r\n const getData = async () => {\r\n if (id) {\r\n const token = getToken();\r\n const subjRes = await getV1SubjectsId({\r\n ...token,\r\n 'x-timezone': token['x-timezone']?.toString() || '',\r\n id\r\n });\r\n\r\n if ('data' in subjRes && subjRes.data && typeof subjRes.data === 'object' && 'resource' in subjRes.data) {\r\n const resource = (subjRes.data as any).resource;\r\n const token2 = getToken();\r\n const fRes = await getV1FormBuilderRelationalSchemaFieldsName({\r\n ...token2,\r\n 'x-timezone': token2['x-timezone']?.toString() || '',\r\n name: resource,\r\n });\r\n const schemaFields = ('data' in fRes && fRes.data && typeof fRes.data === 'object' && 'fields' in fRes.data)\r\n ? ((fRes.data as any).fields || [])\r\n : [];\r\n const relation_table = ('data' in fRes && fRes.data && typeof fRes.data === 'object' && 'relational_fields' in fRes.data)\r\n ? ((fRes.data as any).relational_fields || [])\r\n : [];\r\n\r\n // Process main schema fields\r\n const updatedFields = schemaFields\r\n .map((field) => ({\r\n ...field,\r\n key: field.key.replace('__replaceKey', ''),\r\n }))\r\n .filter((field) => !field.is_inner_join && field.alias !== 'id' && !field?.alias?.includes('_id'));\r\n\r\n // Process relation tables - separate array and object types\r\n const arrayRelationTables = [];\r\n const objectRelationFields = [];\r\n\r\n relation_table.forEach((table) => {\r\n if (!table) return;\r\n\r\n const updatedTableFields = (table.fields || []).map((field) => {\r\n const updatedField = {\r\n ...field,\r\n key: field.key.replace('__replaceKey', ''),\r\n alias: field?.templateKey ? field?.templateKey : field.alias,\r\n };\r\n\r\n // Prepend dataKey to field keys for object types\r\n if (table.type === 'object' && table.dataKey) {\r\n updatedField.key = `${table.dataKey}.${updatedField.key}`;\r\n }\r\n\r\n return updatedField;\r\n }).filter(\r\n (field) =>\r\n !field.is_inner_join &&\r\n field.alias !== 'id' &&\r\n !field.alias.includes('_id')\r\n );\r\n\r\n const uniqueTableFields = _.differenceWith(\r\n updatedTableFields,\r\n updatedTableFields,\r\n (fieldA: any, fieldB: any) => fieldA.key === fieldB?.joinKey\r\n );\r\n\r\n const tableFields = uniqueTableFields.map((f: any) => {\r\n const field = formatText(f.alias.replace(/_data$/, '').replace(/_/g, ' '));\r\n const value = table.type === 'object' && table.dataKey\r\n ? `${table.dataKey}.${f.alias.replace(/ /g, '_').toLowerCase()}`\r\n : f.alias.replace(/ /g, '_').toLowerCase();\r\n\r\n return {\r\n label: field,\r\n value: value\r\n };\r\n });\r\n\r\n if (table.type === 'object') {\r\n // Merge object type fields into main fields\r\n objectRelationFields.push(...tableFields);\r\n } else {\r\n // Keep array types separate\r\n arrayRelationTables.push({\r\n ...table,\r\n fields: tableFields\r\n });\r\n }\r\n });\r\n\r\n // Combine main fields and object relation fields\r\n const allFields = [\r\n ...updatedFields.map((f) => {\r\n const n = f?.alias || f?.key\r\n const field = formatText(n.replace(/_data$/, '').replace(/_/g, ' '));\r\n return {\r\n label: field,\r\n value: field.replace(/ /g, '_').toLowerCase()\r\n };\r\n }),\r\n ...objectRelationFields\r\n ];\r\n\r\n const uniqueAllFields = _.uniqBy(allFields, 'value');\r\n\r\n setPlaceholders(uniqueAllFields);\r\n setRelationTable(arrayRelationTables);\r\n }\r\n }\r\n\r\n // Rest of the function remains the same...\r\n if (template_id) {\r\n const token3 = getToken();\r\n const res = await getV1TemplatesId({\r\n ...token3,\r\n 'x-timezone': token3['x-timezone']?.toString() || '',\r\n id: template_id\r\n });\r\n const templateSections = ('data' in res && res.data && typeof res.data === 'object' && 'sections' in res.data)\r\n ? ((res.data as any).sections || [])\r\n : [];\r\n const mainSecs = templateSections.map((s: any) => ({\r\n ...s,\r\n id: s.id || `section-${uuidv4()}`,\r\n attributes: {\r\n ...s.attributes,\r\n styles: s.attributes?.styles || initialStyles[s.type] || {}\r\n }\r\n }));\r\n setTemplateData(('data' in res && res.data) ? res.data as any : null);\r\n\r\n setSections(mainSecs);\r\n }\r\n\r\n if (locationState?.company_id) {\r\n const token4 = getToken();\r\n const res = await getV1TemplateHeaderFooterCompanyIdHeaderFooter({\r\n ...token4,\r\n 'x-timezone': token4['x-timezone']?.toString() || '',\r\n company_id: locationState.company_id,\r\n });\r\n const resData = ('data' in res && res.data && typeof res.data === 'object') ? res.data as any : null;\r\n setHeaderFooterId(resData?._id || '');\r\n const headerSections = resData?.header_sections || [];\r\n const footerSections = resData?.footer_sections || [];\r\n const headerSecs = headerSections.map((s) => ({\r\n ...s,\r\n id: s.id || `header-section-${uuidv4()}`,\r\n attributes: {\r\n ...s.attributes,\r\n styles: s.attributes?.styles || initialStyles[s.type] || {}\r\n }\r\n }));\r\n const footerSecs = footerSections.map((s) => ({\r\n ...s,\r\n id: s.id || `footer-section-${uuidv4()}`,\r\n attributes: {\r\n ...s.attributes,\r\n styles: s.attributes?.styles || initialStyles[s.type] || {}\r\n }\r\n }));\r\n\r\n setHeaderSections(headerSecs);\r\n setFooterSections(footerSecs);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n getData();\r\n }, [template_id, id, locationState?.company_id]);\r\n\r\n const handleApplyHtmlEdit = useCallback((html: string) => {\r\n saveToHistory(); // Save state before applying HTML edit\r\n const newSection: EnhancedSectionData = {\r\n id: `section-${uuidv4()}`,\r\n content: html,\r\n type: 'text',\r\n is_edited_from_source: true,\r\n };\r\n setSections([newSection]);\r\n setEditHtml(false);\r\n }, [saveToHistory]);\r\n\r\n const handleCancelHtmlEdit = useCallback(() => {\r\n setEditHtml(false);\r\n }, []);\r\n\r\n const handleSave = useCallback(async () => {\r\n if (sections.length === 0 && headerSections.length === 0 && footerSections.length === 0) {\r\n enqueueSnackbar('Please add at least one section');\r\n return;\r\n }\r\n\r\n // Save snapshot for potential rollback\r\n setSavedSnapshot({\r\n sections: [...sections],\r\n headerSections: [...headerSections],\r\n footerSections: [...footerSections],\r\n });\r\n\r\n const mainHtml = generateEmailPreview(sections, headerSections, footerSections, true);\r\n try {\r\n const p = {\r\n ...getToken(),\r\n ...(template_id ? { id: template_id } : { subject_id: id, is_default: false, company_id: locationState.company_id }),\r\n sections: sections.map(s => ({ ...s, attributes: s.attributes })),\r\n contents: mainHtml\r\n }\r\n setPayload(p);\r\n } catch (error) {\r\n const m = getErrorMessage(error?.message);\r\n enqueueSnackbar(m, { variant: 'error' });\r\n setSavedSnapshot(null);\r\n }\r\n }, [sections, headerSections, footerSections, template_id, id, locationState]);\r\n\r\n const handleSaveHeaderFooter = useCallback(async () => {\r\n if (sections.length === 0 && headerSections.length === 0 && footerSections.length === 0) {\r\n enqueueSnackbar('Please add at least one section', { variant: 'error' });\r\n return;\r\n } else if (!locationState?.company_id) {\r\n enqueueSnackbar('Company has not been selected', { variant: 'error' });\r\n return;\r\n }\r\n\r\n // Save snapshot for potential rollback\r\n setSavedSnapshot({\r\n sections: [...sections],\r\n headerSections: [...headerSections],\r\n footerSections: [...footerSections],\r\n });\r\n\r\n // Show loading state immediately (optimistic update)\r\n setIsSaving(true);\r\n\r\n const headerHtml = generateHeaderFooterPreview(headerSections, 'header');\r\n const footerHtml = generateHeaderFooterPreview(footerSections, 'footer');\r\n const combinedHtml = `${headerHtml}${footerHtml}`;\r\n\r\n // Convert splitWidth from number to string for API\r\n const convertSectionForApi = (section: EnhancedSectionData) => ({\r\n id: section.id,\r\n content: section.content,\r\n type: section.type,\r\n isSplitPair: section.isSplitPair,\r\n splitGroupId: section.splitGroupId,\r\n splitWidth: section.splitWidth !== undefined ? String(section.splitWidth) : undefined,\r\n attributes: section.attributes,\r\n });\r\n\r\n const convertedHeaderSections = headerSections.map(convertSectionForApi);\r\n const convertedFooterSections = footerSections.map(convertSectionForApi);\r\n\r\n try {\r\n if (headerFooterId) {\r\n const token5 = getToken();\r\n const res = await patchV1TemplateHeaderFooterId({\r\n ...token5,\r\n 'x-timezone': token5['x-timezone']?.toString() || '',\r\n id: headerFooterId,\r\n header_sections: convertedHeaderSections,\r\n footer_sections: convertedFooterSections,\r\n contents: combinedHtml\r\n });\r\n if (res.status_code === 200) {\r\n enqueueSnackbar('Header/Footer saved successfully', { variant: 'success' });\r\n setIsEditingHeaderFooter(false);\r\n setSavedSnapshot(null);\r\n }\r\n } else {\r\n const token6 = getToken();\r\n const res = await postV1TemplateHeaderFooter({\r\n ...token6,\r\n 'x-timezone': token6['x-timezone']?.toString() || '',\r\n header_sections: convertedHeaderSections,\r\n footer_sections: convertedFooterSections,\r\n contents: combinedHtml,\r\n company_id: locationState.company_id\r\n });\r\n if (res.status_code === 200) {\r\n enqueueSnackbar('Header/Footer saved successfully', { variant: 'success' });\r\n setIsEditingHeaderFooter(false);\r\n setSavedSnapshot(null);\r\n }\r\n }\r\n } catch (error) {\r\n const m = getErrorMessage(error?.message);\r\n enqueueSnackbar(m, { variant: 'error' });\r\n\r\n // Revert to saved snapshot on error\r\n if (savedSnapshot) {\r\n setSections(savedSnapshot.sections);\r\n setHeaderSections(savedSnapshot.headerSections);\r\n setFooterSections(savedSnapshot.footerSections);\r\n enqueueSnackbar('Changes reverted due to save error', { variant: 'warning' });\r\n }\r\n } finally {\r\n setIsSaving(false);\r\n setSavedSnapshot(null);\r\n }\r\n }, [sections, headerSections, footerSections, headerFooterId, locationState, savedSnapshot]);\r\n\r\n const toggleHeaderFooterEditing = useCallback(() => {\r\n setIsEditingHeaderFooter(!isEditingHeaderFooter);\r\n if (isEditingHeaderFooter) {\r\n setActiveCanvas('main');\r\n }\r\n }, [isEditingHeaderFooter]);\r\n\r\n // Handle save success from TemplateNameModal\r\n const handleSaveSuccess = useCallback(() => {\r\n setSavedSnapshot(null);\r\n setPayload(null);\r\n }, []);\r\n\r\n // Handle save error from TemplateNameModal\r\n const handleSaveError = useCallback(() => {\r\n // Revert to saved snapshot on error\r\n if (savedSnapshot) {\r\n setSections(savedSnapshot.sections);\r\n setHeaderSections(savedSnapshot.headerSections);\r\n setFooterSections(savedSnapshot.footerSections);\r\n enqueueSnackbar('Changes reverted due to save error', { variant: 'warning' });\r\n }\r\n\r\n setSavedSnapshot(null);\r\n setPayload(null);\r\n }, [savedSnapshot]);\r\n\r\n const toggleEditMode = () => {\r\n setEditMode(!editMode);\r\n if (editMode) {\r\n setPreview(true);\r\n } else {\r\n setPreview(false);\r\n }\r\n }\r\n\r\n return (\r\n <Box sx={{ display: 'flex', flexDirection: 'column', height: '100vh' }}>\r\n <EditorHeader\r\n fromPreview={fromPreview}\r\n onPreview={() => setPreview(!preview)}\r\n onSave={handleSave}\r\n onEditModeChange={toggleEditMode}\r\n zoom={zoom}\r\n onZoomIn={handleZoomIn}\r\n onZoomOut={handleZoomOut}\r\n onResetZoom={handleResetZoom}\r\n editMode={editMode}\r\n preview={preview}\r\n editHtml={editHtml}\r\n onEditHtml={() => setEditHtml(!editHtml)}\r\n sections={sections}\r\n isEditingHeaderFooter={isEditingHeaderFooter}\r\n setIsEditingHeaderFooter={toggleHeaderFooterEditing}\r\n onSaveHeaderFooter={handleSaveHeaderFooter}\r\n modulePath={modulePath}\r\n type={type}\r\n mode={template_id ? 'edit' : 'add'}\r\n templateData={templateData}\r\n isSaving={isSaving}\r\n />\r\n <Box sx={{ display: 'flex', flex: 1, overflow: 'hidden' }}>\r\n <DndContext\r\n onDragStart={handleDragStart}\r\n onDragOver={handleDragOver}\r\n onDragEnd={handleDragEnd}\r\n collisionDetection={pointerWithin}\r\n >\r\n <EditorCanvas\r\n sections={sections}\r\n headerSections={headerSections}\r\n footerSections={footerSections}\r\n activeId={activeId}\r\n overSection={overSection}\r\n selectedSection={selectedSection}\r\n onSelectSection={setSelectedSection}\r\n onUpdateSection={handleUpdateSection}\r\n onSplitSection={handleSplitSection}\r\n onDeleteSection={handleDeleteSection}\r\n preview={preview}\r\n editHtml={editHtml}\r\n onApplyHtmlEdit={handleApplyHtmlEdit}\r\n onCancelHtmlEdit={handleCancelHtmlEdit}\r\n zoom={zoom}\r\n editMode={editMode}\r\n isFromPreview={fromPreview}\r\n handleSave={handleSave}\r\n placeholders={memoizedPlaceholders}\r\n isEditingHeaderFooter={isEditingHeaderFooter}\r\n relation_table={relation_table}\r\n />\r\n </DndContext>\r\n </Box>\r\n {payload !== null &&\r\n <TemplateNameModal\r\n isOpen={payload !== null}\r\n setIsOpen={() => setPayload(null)}\r\n payload={payload}\r\n templateRoutes={ROUTES}\r\n mode={template_id ? 'edit' : 'add'}\r\n templateData={templateData}\r\n onSaveSuccess={handleSaveSuccess}\r\n onSaveError={handleSaveError}\r\n isSaving={isSaving}\r\n />\r\n }\r\n </Box>\r\n );\r\n};\r\n\r\nexport default SectionFlowEditor;","/* eslint-disable unused-imports/no-unused-vars */\r\nimport { Box } from '@mui/material';\r\nimport SectionFlowEditor from '../components/SectionFlowEditor';\r\nimport './add-template.scss';\r\nimport { ITemplateFormProps } from '../utils/types';\r\n\r\nconst AddTemplate: React.FC<ITemplateFormProps> = ({ modulePath, module, type}) => {\r\n return (\r\n <Box sx={{ minHeight: '100vh', bgcolor: 'grey.50' }}>\r\n <SectionFlowEditor modulePath={modulePath} module={module} type={type}/>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default AddTemplate;","/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React, { useState, useRef, useEffect, useCallback } from 'react';\r\nimport { Box, Skeleton, IconButton, Tooltip, Divider, Fade } from '@mui/material';\r\nimport { ZoomIn, ZoomOut, Refresh } from '@mui/icons-material';\r\nimport { Trash } from '../../../components/icons';\r\nimport Typography from '../../../components/typography/typography';\r\n\r\nconst HtmlThumbnailPreview = ({ \r\n template, \r\n width = 300, \r\n height = 200, \r\n scale = 0.25,\r\n showControls = false,\r\n onClick = null,\r\n selectedTemplateId = '',\r\n isFetching = false,\r\n onDelete,\r\n minScale = 0.1,\r\n maxScale = 1,\r\n scaleStep = 1.2,\r\n loadingDelay = 500,\r\n refreshDelay = 300,\r\n normalView = false,\r\n}) => {\r\n const [isLoading, setIsLoading] = useState(isFetching || true);\r\n const [currentScale, setCurrentScale] = useState(scale);\r\n const [error, setError] = useState(null);\r\n const [isHovered, setIsHovered] = useState(false);\r\n const containerRef = useRef(null);\r\n const contentRef = useRef(null);\r\n const loadingTimeoutRef = useRef(null);\r\n const refreshTimeoutRef = useRef(null);\r\n\r\n // Calculate dimensions based on scale\r\n const scaledWidth = width / currentScale;\r\n const scaledHeight = height / currentScale;\r\n\r\n // Cleanup timeouts on unmount\r\n useEffect(() => {\r\n return () => {\r\n if (loadingTimeoutRef.current) {\r\n clearTimeout(loadingTimeoutRef.current);\r\n }\r\n if (refreshTimeoutRef.current) {\r\n clearTimeout(refreshTimeoutRef.current);\r\n }\r\n };\r\n }, []);\r\n\r\n // Handle initial loading\r\n useEffect(() => {\r\n if (loadingTimeoutRef.current) {\r\n clearTimeout(loadingTimeoutRef.current);\r\n }\r\n \r\n loadingTimeoutRef.current = setTimeout(() => {\r\n setIsLoading(false);\r\n }, loadingDelay);\r\n\r\n return () => {\r\n if (loadingTimeoutRef.current) {\r\n clearTimeout(loadingTimeoutRef.current);\r\n }\r\n };\r\n }, [template.contents, loadingDelay]);\r\n\r\n // Handle external loading state\r\n useEffect(() => {\r\n setIsLoading(isFetching);\r\n }, [isFetching]);\r\n\r\n // Memoized event handlers\r\n const handleZoomIn = useCallback(() => {\r\n setCurrentScale(prev => Math.min(prev * scaleStep, maxScale));\r\n }, [scaleStep, maxScale]);\r\n\r\n const handleZoomOut = useCallback(() => {\r\n setCurrentScale(prev => Math.max(prev / scaleStep, minScale));\r\n }, [scaleStep, minScale]);\r\n\r\n const handleRefresh = useCallback(() => {\r\n setIsLoading(true);\r\n setError(null);\r\n \r\n if (refreshTimeoutRef.current) {\r\n clearTimeout(refreshTimeoutRef.current);\r\n }\r\n \r\n refreshTimeoutRef.current = setTimeout(() => {\r\n setIsLoading(false);\r\n }, refreshDelay);\r\n }, [refreshDelay]);\r\n\r\n const handleClick = useCallback(() => {\r\n if (onClick && !isLoading) {\r\n onClick(template);\r\n }\r\n }, [onClick, template, isLoading]);\r\n\r\n const handleDelete = useCallback((e) => {\r\n e.stopPropagation(); // Prevent triggering onClick\r\n if (onDelete && !template?.is_default) {\r\n onDelete(template);\r\n }\r\n }, [onDelete, template]);\r\n\r\n const handleMouseEnter = useCallback(() => {\r\n setIsHovered(true);\r\n }, []);\r\n\r\n const handleMouseLeave = useCallback(() => {\r\n setIsHovered(false);\r\n }, []);\r\n\r\n // Loading state\r\n if (isLoading) {\r\n return (\r\n <Box \r\n sx={{ \r\n width, \r\n height,\r\n borderRadius: 1,\r\n overflow: 'hidden',\r\n border: '1px solid',\r\n borderColor: 'divider'\r\n }}\r\n >\r\n <Skeleton \r\n variant=\"rectangular\" \r\n width=\"100%\" \r\n height=\"100%\" \r\n animation=\"wave\"\r\n />\r\n </Box>\r\n );\r\n }\r\n\r\n // Error state\r\n if (error) {\r\n return (\r\n <Box \r\n sx={{ \r\n width, \r\n height,\r\n borderRadius: 1,\r\n overflow: 'hidden',\r\n border: '1px solid',\r\n borderColor: 'error.main',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n backgroundColor: 'error.light',\r\n color: 'error.contrastText'\r\n }}\r\n >\r\n Failed to load template\r\n </Box>\r\n );\r\n }\r\n\r\n const isSelected = selectedTemplateId === template._id;\r\n const canZoomIn = currentScale < maxScale;\r\n const canZoomOut = currentScale > minScale;\r\n const canDelete = !template?.is_default;\r\n\r\n return (\r\n <Box \r\n sx={{ position: 'relative', display: 'inline-block' }}\r\n onMouseEnter={handleMouseEnter}\r\n onMouseLeave={handleMouseLeave}\r\n >\r\n {/* Main Container */}\r\n <Box\r\n ref={containerRef}\r\n onClick={handleClick}\r\n sx={(theme) => ({\r\n width,\r\n height,\r\n border: '1px solid',\r\n borderRadius: 1,\r\n overflow: 'hidden',\r\n position: 'relative',\r\n cursor: onClick ? 'pointer' : 'default',\r\n backgroundColor: '#fff',\r\n // boxShadow: '0 2px 8px rgba(0,0,0,0.1)',\r\n transition: 'all 0.2s ease-in-out',\r\n '&:hover': onClick ? {\r\n boxShadow: '0 4px 16px rgba(0,0,0,0.15)',\r\n transform: 'translateY(-1px)',\r\n } : {},\r\n borderColor: normalView && isSelected ? theme.palette.theme.primary[800] : 'grey.300',\r\n borderWidth: isSelected ? 2 : 1,\r\n })}\r\n >\r\n {/* Scaled Content Wrapper */}\r\n <Box\r\n sx={{\r\n width: scaledWidth,\r\n height: scaledHeight,\r\n transform: `scale(${currentScale})`,\r\n transformOrigin: 'top left',\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n overflow: 'hidden',\r\n }}\r\n >\r\n {/* HTML Content */}\r\n <Box\r\n ref={contentRef}\r\n sx={{\r\n width: '100%',\r\n height: '100%',\r\n userSelect: 'none',\r\n pointerEvents: 'none',\r\n pt: 2,\r\n '& *': {\r\n maxWidth: '100% !important',\r\n boxSizing: 'border-box !important',\r\n },\r\n // Reset common problematic styles\r\n '& body': {\r\n margin: '0 !important',\r\n padding: '0 !important',\r\n overflow: 'hidden !important',\r\n },\r\n // Handle images\r\n '& img': {\r\n maxWidth: '100% !important',\r\n height: 'auto !important',\r\n },\r\n // Handle tables\r\n '& table': {\r\n width: '100% !important',\r\n tableLayout: 'fixed !important',\r\n },\r\n // Prevent absolute positioning issues\r\n '& *[style*=\"position: absolute\"]': {\r\n position: 'relative !important',\r\n },\r\n '& .email-container': {\r\n width: '85% !important',\r\n }\r\n }}\r\n dangerouslySetInnerHTML={{ __html: template.contents }}\r\n />\r\n </Box>\r\n\r\n {/* Loading Overlay */}\r\n {isLoading && (\r\n <Box\r\n sx={{\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n backgroundColor: 'rgba(255,255,255,0.8)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: 2,\r\n }}\r\n >\r\n <Skeleton variant=\"rectangular\" width=\"90%\" height=\"90%\" />\r\n </Box>\r\n )}\r\n\r\n {/* Selection Indicator */}\r\n {template?.is_default && (\r\n <Box\r\n sx={(theme) => ({\r\n position: 'absolute',\r\n top: 8,\r\n left: 8,\r\n width: 12,\r\n height: 12,\r\n borderRadius: '50%',\r\n backgroundColor: theme.palette.theme?.primary[800],\r\n zIndex: 3,\r\n })}\r\n />\r\n )}\r\n </Box>\r\n {template?.name && <Typography type='s3' weight='medium' color='theme.secondary.1000' align='center' sx={{width, mt:0.5}}>{template?.name}</Typography>}\r\n\r\n {/* Hover Controls */}\r\n {showControls && (\r\n <Fade in={isHovered} timeout={200}>\r\n <Box\r\n sx={{\r\n position: 'absolute',\r\n top: -8,\r\n right: -8,\r\n display: 'flex',\r\n gap: 0.5,\r\n zIndex: 4,\r\n backgroundColor: 'rgba(255,255,255,0.95)',\r\n border: '1px solid',\r\n borderColor: 'grey.300',\r\n borderRadius: 2,\r\n padding: 0.5,\r\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\r\n backdropFilter: 'blur(4px)',\r\n }}\r\n >\r\n <Tooltip title={`Zoom In (${Math.round(currentScale * 100)}%)`} arrow>\r\n <span>\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleZoomIn}\r\n disabled={!canZoomIn}\r\n sx={{\r\n backgroundColor: 'transparent',\r\n '&:hover': { \r\n backgroundColor: 'primary.light',\r\n color: 'primary.contrastText' \r\n },\r\n '&:disabled': {\r\n opacity: 0.5\r\n }\r\n }}\r\n >\r\n <ZoomIn fontSize=\"small\" />\r\n </IconButton>\r\n </span>\r\n </Tooltip>\r\n\r\n <Divider orientation=\"vertical\" variant=\"middle\" flexItem />\r\n\r\n <Tooltip title={`Zoom Out (${Math.round(currentScale * 100)}%)`} arrow>\r\n <span>\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleZoomOut}\r\n disabled={!canZoomOut}\r\n sx={{\r\n backgroundColor: 'transparent',\r\n '&:hover': { \r\n backgroundColor: 'primary.light',\r\n color: 'primary.contrastText' \r\n },\r\n '&:disabled': {\r\n opacity: 0.5\r\n }\r\n }}\r\n >\r\n <ZoomOut fontSize=\"small\" />\r\n </IconButton>\r\n </span>\r\n </Tooltip>\r\n\r\n <Divider orientation=\"vertical\" variant=\"middle\" flexItem />\r\n\r\n <Tooltip title=\"Refresh Preview\" arrow>\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleRefresh}\r\n sx={{\r\n backgroundColor: 'transparent',\r\n '&:hover': { \r\n backgroundColor: 'primary.light',\r\n color: 'primary.contrastText' \r\n },\r\n }}\r\n >\r\n <Refresh fontSize=\"small\" />\r\n </IconButton>\r\n </Tooltip>\r\n\r\n {onDelete && (\r\n <>\r\n <Divider orientation=\"vertical\" variant=\"middle\" flexItem />\r\n <Tooltip \r\n title={canDelete ? \"Delete Template\" : \"Cannot delete default template\"} \r\n arrow\r\n >\r\n <span>\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleDelete}\r\n disabled={!canDelete}\r\n sx={{\r\n backgroundColor: 'transparent',\r\n '&:hover': !canDelete ? {} : { \r\n backgroundColor: 'error.light',\r\n color: 'error.contrastText' \r\n },\r\n '&:disabled': {\r\n opacity: 0.5\r\n }\r\n }}\r\n >\r\n <Trash fontSize=\"small\" />\r\n </IconButton>\r\n </span>\r\n </Tooltip>\r\n </>\r\n )}\r\n </Box>\r\n </Fade>\r\n )}\r\n </Box>\r\n );\r\n};\r\n\r\nexport { HtmlThumbnailPreview };\r\nexport default HtmlThumbnailPreview;","/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React, { useState, useRef, useEffect, useCallback } from 'react';\r\nimport { Box, Skeleton, IconButton, Tooltip, Divider, Fade } from '@mui/material';\r\nimport { ZoomIn, ZoomOut, Refresh } from '@mui/icons-material';\r\nimport { Trash } from '../../../components/icons';\r\nimport Typography from '../../../components/typography/typography';\r\n\r\ninterface HtmlThumbnailPreviewProps {\r\n template: any;\r\n width?: number | string; \r\n height?: number;\r\n scale?: number;\r\n showControls?: boolean;\r\n onClick?: (template: any) => void;\r\n selectedTemplateId?: string;\r\n isFetching?: boolean;\r\n onDelete?: (template: any) => void;\r\n normalView?: boolean;\r\n minScale?: number;\r\n maxScale?: number;\r\n scaleStep?: number;\r\n loadingDelay?: number;\r\n refreshDelay?: number;\r\n}\r\n\r\nconst HtmlThumbnailPreviewFull: React.FC<HtmlThumbnailPreviewProps> = ({\r\n template,\r\n width = '100%',\r\n height = 800,\r\n scale = 0.25,\r\n showControls = false,\r\n onClick = null,\r\n selectedTemplateId = '',\r\n isFetching = false,\r\n onDelete,\r\n normalView = false,\r\n minScale = 0.1,\r\n maxScale = 1,\r\n scaleStep = 1.2,\r\n loadingDelay = 500,\r\n refreshDelay = 300,\r\n}) => {\r\n const [isLoading, setIsLoading] = useState(isFetching || true);\r\n const [currentScale, setCurrentScale] = useState(scale);\r\n const [error, setError] = useState<null | string>(null);\r\n const [isHovered, setIsHovered] = useState(false);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const contentRef = useRef<HTMLDivElement>(null);\r\n const loadingTimeoutRef = useRef<any>(null);\r\n const refreshTimeoutRef = useRef<any>(null);\r\n\r\n const [containerPixelWidth, setContainerPixelWidth] = useState<number>(typeof width === 'number' ? width : 800);\r\n\r\n // Measure container width for responsive scaling\r\n useEffect(() => {\r\n const updateWidth = () => {\r\n if (containerRef.current) {\r\n const newWidth = containerRef.current.offsetWidth;\r\n setContainerPixelWidth(newWidth);\r\n }\r\n };\r\n updateWidth();\r\n window.addEventListener('resize', updateWidth);\r\n return () => window.removeEventListener('resize', updateWidth);\r\n }, []);\r\n\r\n const scaledWidth = containerPixelWidth / currentScale;\r\n const scaledHeight = height / currentScale;\r\n\r\n useEffect(() => {\r\n return () => {\r\n clearTimeout(loadingTimeoutRef.current);\r\n clearTimeout(refreshTimeoutRef.current);\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n clearTimeout(loadingTimeoutRef.current);\r\n loadingTimeoutRef.current = setTimeout(() => setIsLoading(false), loadingDelay);\r\n return () => clearTimeout(loadingTimeoutRef.current);\r\n }, [template.contents, loadingDelay]);\r\n\r\n useEffect(() => setIsLoading(isFetching), [isFetching]);\r\n\r\n const handleZoomIn = useCallback(() => setCurrentScale(prev => Math.min(prev * scaleStep, maxScale)), [scaleStep, maxScale]);\r\n const handleZoomOut = useCallback(() => setCurrentScale(prev => Math.max(prev / scaleStep, minScale)), [scaleStep, minScale]);\r\n const handleRefresh = useCallback(() => {\r\n setIsLoading(true);\r\n setError(null);\r\n clearTimeout(refreshTimeoutRef.current);\r\n refreshTimeoutRef.current = setTimeout(() => setIsLoading(false), refreshDelay);\r\n }, [refreshDelay]);\r\n\r\n const handleClick = useCallback(() => {\r\n if (onClick && !isLoading) onClick(template);\r\n }, [onClick, template, isLoading]);\r\n\r\n const handleDelete = useCallback((e: React.MouseEvent<HTMLButtonElement>) => {\r\n e.stopPropagation();\r\n if (onDelete && !template?.is_default) onDelete(template);\r\n }, [onDelete, template]);\r\n\r\n const handleMouseEnter = useCallback(() => setIsHovered(true), []);\r\n const handleMouseLeave = useCallback(() => setIsHovered(false), []);\r\n\r\n if (isLoading) return (\r\n <Box sx={{ width, height, borderRadius: 1, overflow: 'hidden', border: '1px solid', borderColor: 'divider' }}>\r\n <Skeleton variant=\"rectangular\" width=\"100%\" height=\"100%\" animation=\"wave\" />\r\n </Box>\r\n );\r\n\r\n if (error) return (\r\n <Box sx={{\r\n width, height, borderRadius: 1, overflow: 'hidden', border: '1px solid',\r\n borderColor: 'error.main', display: 'flex', alignItems: 'center', justifyContent: 'center',\r\n backgroundColor: 'error.light', color: 'error.contrastText'\r\n }}>\r\n Failed to load template\r\n </Box>\r\n );\r\n\r\n const isSelected = selectedTemplateId === template._id;\r\n const canZoomIn = currentScale < maxScale;\r\n const canZoomOut = currentScale > minScale;\r\n const canDelete = !template?.is_default;\r\n\r\n return (\r\n <Box\r\n ref={containerRef}\r\n sx={{ position: 'relative', width, marginInline: 'auto', display: 'inline-block' }}\r\n onMouseEnter={handleMouseEnter}\r\n onMouseLeave={handleMouseLeave}\r\n >\r\n <Box\r\n onClick={handleClick}\r\n sx={(theme) => ({\r\n width: '100%',\r\n height,\r\n marginBlock: 0,\r\n overflow: 'hidden',\r\n position: 'relative',\r\n backgroundColor: '#fff',\r\n transition: 'all 0.2s ease-in-out',\r\n '&:hover': onClick ? { boxShadow: '0 4px 16px rgba(0,0,0,0.15)', transform: 'translateY(-1px)' } : {},\r\n })}\r\n >\r\n <Box\r\n sx={{\r\n width: '100%',\r\n height: '100%',\r\n display: 'flex',\r\n justifyContent: 'center', \r\n alignItems: 'center', \r\n overflow: 'auto',\r\n backgroundColor: '#fff',\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n transform: `scale(${currentScale})`,\r\n transformOrigin: 'top left',\r\n pointerEvents: 'none',\r\n userSelect: 'none',\r\n width: containerPixelWidth,\r\n height: height,\r\n }}\r\n >\r\n <Box\r\n ref={contentRef}\r\n sx={{\r\n width: '100%',\r\n height: '100%',\r\n '& *': { maxWidth: '100% !important', boxSizing: 'border-box !important' },\r\n '& body': { margin: 0, padding: 0, overflow: 'hidden' },\r\n '& img': { maxWidth: '100% !important', height: 'auto !important' },\r\n '& table': { width: '100% !important', tableLayout: 'fixed !important' },\r\n '& *[style*=\"position: absolute\"]': { position: 'relative !important' },\r\n '& .email-container': { width: '85% !important' },\r\n }}\r\n dangerouslySetInnerHTML={{ __html: template.contents }}\r\n />\r\n </Box>\r\n </Box>\r\n\r\n {template?.is_default && (\r\n <Box sx={(theme) => ({ position: 'absolute', top: 8, left: 8, width: 12, height: 12, borderRadius: '50%', backgroundColor: theme.palette.theme.primary[800], zIndex: 3 })} />\r\n )}\r\n </Box>\r\n\r\n {template?.name && <Typography type='s3' weight='medium' color='theme.secondary.1000' align='center' sx={{ width, mt: 0.5 }}>{template?.name}</Typography>}\r\n\r\n {showControls && (\r\n <Fade in={isHovered} timeout={200}>\r\n <Box sx={{ position: 'absolute', top: -8, right: -8, display: 'flex', gap: 0.5, zIndex: 4, backgroundColor: 'rgba(255,255,255,0.95)', border: '1px solid', borderColor: 'grey.300', borderRadius: 2, padding: 0.5, boxShadow: '0 4px 12px rgba(0,0,0,0.15)', backdropFilter: 'blur(4px)' }}>\r\n <Tooltip title={`Zoom In (${Math.round(currentScale * 100)}%)`} arrow>\r\n <span><IconButton size=\"small\" onClick={handleZoomIn} disabled={!canZoomIn}><ZoomIn fontSize=\"small\" /></IconButton></span>\r\n </Tooltip>\r\n <Divider orientation=\"vertical\" flexItem />\r\n <Tooltip title={`Zoom Out (${Math.round(currentScale * 100)}%)`} arrow>\r\n <span><IconButton size=\"small\" onClick={handleZoomOut} disabled={!canZoomOut}><ZoomOut fontSize=\"small\" /></IconButton></span>\r\n </Tooltip>\r\n <Divider orientation=\"vertical\" flexItem />\r\n <Tooltip title=\"Refresh Preview\" arrow>\r\n <IconButton size=\"small\" onClick={handleRefresh}><Refresh fontSize=\"small\" /></IconButton>\r\n </Tooltip>\r\n {onDelete && <>\r\n <Divider orientation=\"vertical\" flexItem />\r\n <Tooltip title={canDelete ? \"Delete Template\" : \"Cannot delete default template\"} arrow>\r\n <span><IconButton size=\"small\" onClick={handleDelete} disabled={!canDelete}><Trash fontSize=\"small\" /></IconButton></span>\r\n </Tooltip>\r\n </>}\r\n </Box>\r\n </Fade>\r\n )}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default HtmlThumbnailPreviewFull;","/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable react-hooks/exhaustive-deps */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React, { useEffect, useState } from 'react';\r\nimport { \r\n DialogTitle, \r\n DialogContent, \r\n DialogActions,\r\n IconButton,\r\n Box,\r\n MenuItem\r\n} from '@mui/material';\r\nimport CloseIcon from '@mui/icons-material/Close';\r\nimport Typography from '../../../components/typography/typography';\r\nimport Modal from '../../../components/modal/modal';\r\nimport { deleteV1TemplatesId, getV1Templates, patchV1TemplatesIdSetDefault } from '../../../api-client/api.system-feature/api';\r\nimport { getErrorMessage, getToken } from '../../../utils/common';\r\nimport Button from '../../../components/button/button';\r\n// import ModalLoader from '../../../components/loader/modal-loader';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { enqueueSnackbar } from 'notistack';\r\nimport Select from '../../../components/select/select';\r\nimport HtmlThumbnailPreview from './html-thumbnail-preview';\r\nimport HtmlThumbnailPreviewFull from './html-thumbnail-preview-full';\r\nimport ConfirmPopUp from '../../../components/confirm-modal/confirm-modal';\r\n\r\nconst TemplateModal = ({ email, onClose, open, companies = [], templateRoutes, source = 'add' }) => {\r\n const [templates, setTemplates] = useState([]);\r\n const [selectedTemplate, setSelectedTemplate] = useState('');\r\n const [defaultTemplate, setDefaultTemplate] = useState('');\r\n const [loading, setLoding] = useState(true);\r\n const [selectedCompany, setSelectedCompany] = React.useState<number>(companies?.[0]?.id || 0);\r\n const [templateToDelete, setTemplateToDelete] = React.useState<Record<string, any> | null>(null);\r\n const [selectedTemplateForPreview, setSelectedTemplateForPreview] = useState(null);\r\n\r\n const navigate = useNavigate();\r\n\r\n const handleClose = () => {\r\n onClose();\r\n };\r\n\r\n const handleViewTemplate = () => {\r\n navigate(templateRoutes.EDIT_TEMPLATE(email._id, selectedTemplate), { \r\n state: { company_id: selectedCompany, isViewOnly: true, fromPreview: true }\r\n });\r\n };\r\n\r\n const handleTemplateSelect = (id: any) => {\r\n if (source === 'view') {\r\n const template = templates.find((t: any) => t?._id === id);\r\n setSelectedTemplateForPreview(template);\r\n setSelectedTemplate(id);\r\n handleViewTemplate();\r\n } else {\r\n setSelectedTemplate(id);\r\n }\r\n }\r\n\r\n const getTemplatesViaSubject = async () => {\r\n setLoding(true)\r\n const res = await getV1Templates({ ...getToken(), filters: `(company_id.eq=${selectedCompany}&subject_id.eq=${email._id})` })\r\n if(res?.data) {\r\n const dTemplate = res?.data?.find(t => t.is_default === true)\r\n setDefaultTemplate(dTemplate)\r\n setSelectedTemplate(dTemplate?._id)\r\n setTemplates(res?.data)\r\n }\r\n\r\n setLoding(false)\r\n }\r\n\r\n const handleDefaultTemplate = async () => {\r\n try {\r\n await patchV1TemplatesIdSetDefault({ ...getToken(), id: selectedTemplate })\r\n enqueueSnackbar('Template has been set as default');\r\n } catch (error) {\r\n const m = getErrorMessage(error?.message);\r\n enqueueSnackbar(m, { variant: 'error' });\r\n }\r\n }\r\n\r\n const handleDeleteTemplate = async () => {\r\n try {\r\n if(templateToDelete) {\r\n await deleteV1TemplatesId({ ...getToken(), id: templateToDelete?._id })\r\n enqueueSnackbar('Template has been deleted');\r\n setTemplateToDelete(null)\r\n await getTemplatesViaSubject()\r\n }\r\n } catch (error) {\r\n const m = getErrorMessage(error?.message);\r\n enqueueSnackbar(m, { variant: 'error' });\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n getTemplatesViaSubject()\r\n return () => { setLoding(true) }\r\n }, [selectedCompany])\r\n\r\n return (\r\n <div>\r\n <Modal \r\n open={open} \r\n onClose={handleClose} \r\n maxWidth=\"lg\" \r\n fullWidth\r\n aria-labelledby=\"email-template-selection\"\r\n sx={{\r\n '& .MuiDialog-paper': {\r\n height: '85vh',\r\n display: 'flex',\r\n flexDirection: 'column'\r\n }\r\n }}\r\n >\r\n\r\n {console.log(source, \"soure in modal +++++++++++++++++++++++debug\")}\r\n {/* {loading && <ModalLoader/>} */}\r\n <DialogTitle sx={{ marginBottom: '1rem', padding: '0.75rem 1rem 0.75rem 1.5rem', borderBottom: '1px solid #D3D3D4'}}>\r\n <Box display='flex' alignItems='center' gap={2}>\r\n {selectedTemplateForPreview && (\r\n <IconButton\r\n onClick={() => setSelectedTemplateForPreview(null)}\r\n size='small'\r\n sx={{ color: (theme) => theme.palette.grey[700] }}\r\n >\r\n <Typography>← Back</Typography>\r\n </IconButton>\r\n )}\r\n <Typography type='s1' weight='medium' color='theme.secondary.1000' sx={{ flex: 1, textAlign: 'center' }}> \r\n {selectedTemplateForPreview ? 'Template Preview' : (source === 'view' ? 'Template Preview' : 'Select Template')}\r\n </Typography>\r\n </Box>\r\n <Box display='flex' alignItems={'center'} gap={1} position='absolute' right='1%' top='4px'>\r\n <Typography type='s3' weight='medium' color='theme.secondary.800'> Company</Typography>\r\n <Select\r\n displayEmpty\r\n value={selectedCompany}\r\n size='small'\r\n renderValue={(value) => value ? companies.find((option) => option.value === value)?.label : 'Select Company'}\r\n // fullWidth\r\n // sx={{\r\n // bgcolor: 'white',\r\n // borderRadius: 1,\r\n // '& .MuiSelect-select': { py: 0.75 }\r\n // }}\r\n onChange={(e) => {\r\n if (e.target.value) {\r\n setSelectedCompany(e.target.value as number);\r\n }\r\n }}>\r\n {companies.map((option) => (\r\n <MenuItem key={option.value} value={option.value}>\r\n <Typography type='s3' color='theme.secondary.1000'>{option.label}</Typography>\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n <IconButton\r\n aria-label=\"close\"\r\n onClick={handleClose}\r\n size='small'\r\n sx={{\r\n color: (theme) => theme.palette.grey[500],\r\n }}\r\n >\r\n <CloseIcon fontSize='small'/>\r\n </IconButton>\r\n </Box>\r\n </DialogTitle>\r\n \r\n {\r\n selectedTemplateForPreview ? (\r\n <DialogContent sx={{ display: 'flex', flexDirection: 'column', gap: 3, width: '100%', p: 3, flex: 1, overflow: 'auto', scrollbarWidth: 'none', msOverflowStyle: 'none', '&::-webkit-scrollbar': { display: 'none' } }}>\r\n {/* Main Preview */}\r\n <Box sx={{ width: '100%', display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}>\r\n <HtmlThumbnailPreviewFull\r\n template={selectedTemplateForPreview}\r\n width={'100%'}\r\n height={600}\r\n scale={1}\r\n showControls={true}\r\n isFetching={loading}\r\n normalView={true}\r\n />\r\n </Box>\r\n </DialogContent>\r\n ) : (\r\n <DialogContent sx={{ flex: 1, overflow: 'auto', display: 'flex', flexDirection: 'column', scrollbarWidth: 'none', msOverflowStyle: 'none', '&::-webkit-scrollbar': { display: 'none' } }}>\r\n {/* <Grid container spacing={6}> */}\r\n {!templates.length && (\r\n // <Grid item xs={12} sx={{ minHeight: 350}}>\r\n <Box display='flex' alignItems='center' width='100%' height='100%' justifyContent='center'>\r\n {!loading && <Typography type='s1' weight='medium' color='theme.secondary.1000' sx={{ textAlign: 'center' }}>No templates found</Typography>}\r\n </Box>\r\n // </Grid>\r\n )}\r\n <Box sx={{ \r\n display: 'grid', \r\n gridTemplateColumns: 'repeat(auto-fill, minmax(300px, 1fr))', \r\n gap: 2, \r\n p: 2,\r\n justifyItems: 'center',\r\n alignItems: 'center'\r\n }}>\r\n {templates.map((template, index) => (\r\n <HtmlThumbnailPreview\r\n key={template._id || index}\r\n template={template}\r\n width={300}\r\n height={200}\r\n showControls={source === 'add'}\r\n selectedTemplateId={selectedTemplate}\r\n onClick={(template: any) => {\r\n handleTemplateSelect(template._id)\r\n }}\r\n normalView={source === 'add'}\r\n isFetching={loading}\r\n onDelete={(template: any) => setTemplateToDelete(template)}\r\n />\r\n ))}\r\n </Box>\r\n </DialogContent>\r\n )}\r\n {source === 'add' && (\r\n <DialogActions sx={{ p: 2, justifyContent: 'center', borderTop: '1px solid #D3D3D4' }}>\r\n <Button\r\n onClick={() => navigate(templateRoutes.EDIT_TEMPLATE(email._id, selectedTemplate), { state: { company_id: selectedCompany } })}\r\n disabled={!selectedTemplate}\r\n >\r\n Continue\r\n </Button>\r\n <Button\r\n onClick={() => handleDefaultTemplate()}\r\n disabled={!selectedTemplate || defaultTemplate?._id === selectedTemplate}\r\n >\r\n Set to Default\r\n </Button>\r\n </DialogActions>\r\n )}\r\n </Modal>\r\n <ConfirmPopUp\r\n open={templateToDelete !== null}\r\n onClose={() => setTemplateToDelete(null)}\r\n title='Remove Template'\r\n description='Are you sure you want to delete ?'\r\n onConfirm={() => handleDeleteTemplate()}\r\n loading={loading}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport { TemplateModal };\r\nexport default TemplateModal;","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React from 'react';\r\n\r\nimport Modal from '../../../components/modal/modal';\r\nimport Typography from '../../../components/typography/typography';\r\nimport Button from '../../../components/button/button';\r\nimport Select from '../../../components/select/select';\r\n\r\nimport {\r\n\tBox,\r\n\tDialogActions,\r\n\tDialogContent,\r\n\tDialogProps,\r\n\tDialogTitle,\r\n\tIconButton,\r\n\tMenuItem\r\n} from '@mui/material';\r\nimport Close from '@mui/icons-material/Close';\r\n\r\nimport './company-selection-modal.scss';\r\nimport { IEmail } from '../utils/types';\r\nimport { enqueueSnackbar } from 'notistack';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\ninterface CompanySelectionModalProps {\r\n\tisOpen: boolean;\r\n\tsetIsOpen: (value: IEmail | null) => void;\r\n\tmodalProps?: DialogProps;\r\n\temail: IEmail;\r\n\tcompanies: Record<string, any>[];\r\n\ttemplateRoutes: Record<string, any>\r\n}\r\n\r\nconst CompanySelectionModal: React.FC<CompanySelectionModalProps> = ({\r\n\tisOpen,\r\n\tsetIsOpen,\r\n\tmodalProps,\r\n\tcompanies,\r\n\temail,\r\n\ttemplateRoutes\r\n}) => {\r\n\r\n\tconst navigate = useNavigate();\r\n\tconst [selectedCompany, setSelectedCompany] = React.useState<number>(0);\r\n\r\n\tconst handleModalClose = () => {\r\n\t\tsetIsOpen(null);\r\n\t};\r\n\r\n\tconst handleContinue = () => {\r\n\t\tif(!selectedCompany) {\r\n\t\t\tenqueueSnackbar('Please select a company', { variant: 'error' });\r\n\t\t\treturn;\r\n\t\t} else if(!email) {\r\n\t\t\tenqueueSnackbar('Something went wrong for a subject', { variant: 'error' });\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tnavigate(templateRoutes.ADD_TEMPLATE(email._id), { state: { company_id: selectedCompany }})\r\n\t}\r\n\r\n\treturn (\r\n\t\t<Modal\r\n\t\t\topen={isOpen}\r\n\t\t\tonClose={handleModalClose}\r\n\t\t\tmaxWidth='xs'\r\n\t\t\tfullWidth\r\n\t\t\t{...modalProps}>\r\n\t\t\t<DialogTitle className='companySelectionModal--DialogTitle'>\r\n\t\t\t\t<Typography type='s3' color='inherit' weight='medium'>\r\n\t\t\t\t\tSelect Company\r\n\t\t\t\t</Typography>\r\n\t\t\t\t<IconButton onClick={handleModalClose}>\r\n\t\t\t\t\t<Close fontSize='small' />\r\n\t\t\t\t</IconButton>\r\n\t\t\t</DialogTitle>\r\n\t\t\t<DialogContent className='companySelectionModal--DialogContents'>\r\n\t\t\t\t<Select\r\n\t\t\t\t\tdisplayEmpty\r\n\t\t\t\t\tvalue={selectedCompany}\r\n\t\t\t\t\tsize='small'\r\n\t\t\t\t\trenderValue={(value) => value ? companies.find((option) => option.value === value)?.label : 'Select Company'}\r\n\t\t\t\t\tfullWidth\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\tbgcolor: 'white',\r\n\t\t\t\t\t\tborderRadius: 1,\r\n\t\t\t\t\t\t'& .MuiSelect-select': { py: 0.75 }\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tonChange={(e) => {\r\n\t\t\t\t\t\tif (e.target.value) {\r\n\t\t\t\t\t\t\tsetSelectedCompany(e.target.value as number);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}>\r\n\t\t\t\t\t{companies.map((option) => (\r\n\t\t\t\t\t\t<MenuItem key={option.value} value={option.value}>\r\n\t\t\t\t\t\t\t<Typography type='s4' color='theme.secondary.1000'>{option.label}</Typography>\r\n\t\t\t\t\t\t</MenuItem>\r\n\t\t\t\t\t))}\r\n\t\t\t\t</Select>\r\n\t\t\t</DialogContent>\r\n\t\t\t<DialogActions className='companySelectionModal--DialogAction'>\r\n\t\t\t\t<Box display='flex' gap={1.5}>\r\n\t\t\t\t\t<Button className='companySelectionModal--DialogAction--WhiteBtn' onClick={handleModalClose}>Cancel</Button>\r\n\t\t\t\t\t<Button onClick={() => handleContinue()} disabled={!selectedCompany}>Continue</Button>\r\n\t\t\t\t</Box>\r\n\t\t\t</DialogActions>\r\n\t\t</Modal>\r\n\t);\r\n};\r\n\r\nexport default CompanySelectionModal;\r\n","/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable react-hooks/exhaustive-deps */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport { useCallback, useEffect, useMemo, useState } from 'react';\r\n\r\nimport ActionBar from '../../components/action-bar/action-bar';\r\nimport viewTypes from '../../constants/action-bar';\r\nimport MaterialTable, { MaterialTableColumnProps } from '../../components/material-table/material-table';\r\nimport Typography from '../../components/typography/typography';\r\nimport Fallback from '../../components/fallback/fallback';\r\nimport Menu from '../../components/menu/menu';\r\nimport Footer from '../../components/footer/footer';\r\nimport useDeepMemo from '../../hooks/use-deep-memo';\r\nimport { PageState } from '../../contexts/page-context';\r\nimport { usePages } from '../../hooks/use-pages';\r\nimport { transformTableColumns } from '../../utils/common-utility';\r\nimport { appendConditionSafely, defaultCurrencySymbol, getToken } from '../../utils/common';\r\nimport logo from '../../assets/images';\r\nimport { IPaginationModel } from '../../@types/pagination-model';\r\nimport { fetchApi } from '../../utils/api';\r\n\r\nimport { MenuItem } from '@mui/material';\r\n\r\n// import GridCard from './grid-view/grid-view';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { enqueueSnackbar } from 'notistack';\r\n\r\nimport { templateRoutes } from './utils/common';\r\nimport { IEmail, ITemplateProps, Pagination } from './utils/types';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\nimport { usePermissions } from '../../hooks/use-permissions';\r\nimport { getV1Subjects } from '../../api-client/api.system-feature/api';\r\nimport TemplateModal from './template-modal/template-modal';\r\nimport CompanySelectionModal from './company-selection-modal/company-selection-modal';\r\n\r\nimport './templates.scss';\r\n\r\n\r\ninterface ActionData {\r\n\tlabel: string;\r\n\tposition: number;\r\n}\r\n\r\nconst Templates: React.FC<ITemplateProps> = ({ type, module, modulePath }) => {\r\n\tconst { t } = useTranslation();\r\n\tconst {\r\n\t\tactivePage: aPage,\r\n\t\tupdatePageInfo,\r\n\t\tschemaFields,\r\n\t\tgeneratedColumns,\r\n\t\tupdateGeneratedColumns,\r\n\t\t// error: pageError\r\n\t} = usePages();\r\n\tconst activePage = useDeepMemo<PageState>(aPage);\r\n\t/* LOCAL STATES */\r\n\tconst [actionAnchorEl, setActionAnchorEl] = useState<null | HTMLElement>(null);\r\n\tconst viewEmails = localStorage.getItem('email-subjects-view');\r\n\tconst [actionBarData, setActionBarData] = useState<ActionData[]>(viewEmails ? JSON.parse(viewEmails) : [{ label: 'Table', position: 0 }]);\r\n\r\n\tconst [actionBarActiveTab, setActionBarActiveTab] = useState<string>(viewTypes.TABLE);\r\n\tconst [paginationModel, setPaginationModel] = useState<Pagination>({ pageNo: 1, limit: 10, totalCount: 0, skip: 0 });\r\n\tconst [rows, setRows] = useState<any[]>([]);\r\n\tconst [isFetching, setIsFetching] = useState<boolean>(false);\r\n\tconst [selectedRow, setSelectedRow] = useState([]);\r\n\tconst [showTemplateModal, setShowTemplateModal] = useState<IEmail | null>(null);\r\n\tconst [templateModalSource, setTemplateModalSource] = useState<'view' | 'add'>('add');\r\n\tconst [showCompanySelectionModal, setShowCompanySelectionModal] = useState<IEmail | null>(null);\r\n\tconst [companies, setCompanies] = useState<Record<string, any>[]>([]);\r\n\t/* VARS */\r\n\tconst navigate = useNavigate();\r\n\tconst { pageNo, limit: pLimit, totalCount } = paginationModel;\r\n\tconst limit = activePage.page_size || pLimit;\r\n\tconst total = limit ? Math.ceil(totalCount / limit) : 0;\r\n\tconst skip = limit * (pageNo - 1);\r\n\tconst permissions = usePermissions();\r\n\tconst ROUTES = templateRoutes(modulePath, type);\r\n\r\n\tconst SubjectPermissions = permissions?.Subjects || {};\r\n\tconst ConditionsImport = permissions?.RentalTerms?.ConditionsImport || {};\r\n\r\n\tconst {\r\n\t\tcanAdd = false,\r\n\t\tcanEdit = false,\r\n\t\tcanDelete = false,\r\n\t} = SubjectPermissions;\r\n\r\n\tconst { canAdd: canImport = false } = ConditionsImport;\r\n\r\n\tconst handleNewEmail = (email) => {\r\n\t\tif (!companies?.length) {\r\n\t\t\tenqueueSnackbar('Please add a company first', { variant: 'error' })\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tif (companies?.length > 1) {\r\n\t\t\tsetShowCompanySelectionModal(email)\r\n\t\t} else {\r\n\t\t\tnavigate(ROUTES.ADD_TEMPLATE(email._id), { state: { company_id: companies[0]?.id || companies[0]?.value } })\r\n\t\t}\r\n\t};\r\n\r\n\tconst rowActionMenu = [\r\n\t\t{\r\n\t\t\tlabel: 'New Template',\r\n\t\t\thandleAction: (email: IEmail) => handleNewEmail(email),\r\n\t\t\tdisabled: (row: any) => !canEdit\r\n\t\t},\r\n\t\t{\r\n\t\t\tlabel: 'Add From Template',\r\n\t\t\thandleAction: (email: IEmail) => {\r\n setTemplateModalSource('add'); \r\n setShowTemplateModal(email); },\r\n\t\t\tdisabled: (row: any) => !canAdd\r\n\t\t}\r\n\t];\r\n\r\n\t/* LOCAL FUNCTIONS */\r\n\tconst getEmails = useCallback(\r\n\t\tasync () => {\r\n\t\t\tconst { sort, filterQueryString, search } = activePage;\r\n\t\t\tconst searchFiters = search ? `&subject.like=${search}` : '';\r\n\t\t\tconst types = [];\r\n\t\t\ttypes.push(type)\r\n\t\t\tif (type == \"email\") {\r\n\t\t\t\ttypes.push(\"approval_email\")\r\n\t\t\t}\r\n\t\t\tconst uFilters = appendConditionSafely(filterQueryString, `&type.in=[${types.join(\",\")}]&module.eq=${module}${searchFiters}`);\r\n\r\n\t\t\tconst response = await getV1Subjects({\r\n\t\t\t\t...getToken(),\r\n\t\t\t\tskip,\r\n\t\t\t\tlimit,\r\n\t\t\t\t// search,\r\n\t\t\t\t...(sort && { order: `${sort.id}:${sort.desc ? -1 : 1}` }),\r\n\t\t\t\t...(uFilters && uFilters !== '()' && { filters: uFilters })\r\n\t\t\t});\r\n\r\n\t\t\tsetRows(response?.data || []);\r\n\t\t\tsetPaginationModel({ ...paginationModel, ...(response?.pagination || {}) });\r\n\t\t},\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t\t[\r\n\t\t\tlimit,\r\n\t\t\tskip,\r\n\t\t\tactivePage?.search,\r\n\t\t\tactivePage?.filterQueryString,\r\n\t\t\tactivePage?.sort\r\n\t\t]\r\n\t);\r\n\r\n\tconst getCopmanies = async () => {\r\n\t\tconst companiesArr = await fetchApi({ apiKey: 'company', filters: { skip: 0, limit: 100, order: \"id:1\" } });\r\n\t\tsetCompanies(companiesArr?.data || []);\r\n\t}\r\n\r\n\tconst tableRows = useMemo(() => rows || [], [rows]);\r\n\r\n\tconst tableColumns = useMemo(\r\n\t\t() =>\r\n\t\t\ttransformTableColumns({\r\n\t\t\t\tcolumns: generatedColumns.columns,\r\n\t\t\t\tcurrencySymbol: (row) =>\r\n\t\t\t\t\trow.original?.currency_data?.symbol || defaultCurrencySymbol(),\r\n\t\t\t\ttranslationFn: t,\r\n\t\t\t\tenableFooter: true,\r\n\t\t\t\t// redirectionLink: ROUTES.VIEW,\r\n\t\t\t\t// redirectionLinkState: (row) => ({ termsAndCondition: row.original }),\r\n\t\t\t\trows: tableRows,\r\n\t\t\t\tstatusClasses: ``,\r\n\t\t\t}),\r\n\t\t[tableRows, t, generatedColumns.columns]\r\n\t);\r\n\r\n\tconst handlePaginationModel = (model: IPaginationModel) => {\r\n\t\tif (activePage.page_size != model?.limit) {\r\n\t\t\tupdatePageInfo({ page_size: model.limit });\r\n\t\t}\r\n\t\tsetPaginationModel(model);\r\n\t};\r\n\r\n\tconst cleanUp = () => {\r\n\t\tconst pModel = { pageNo: 1, limit: 10, totalCount: 0 };\r\n\t\tsetPaginationModel(pModel);\r\n\t};\r\n\r\n\t/* USE EFFECTS */\r\n\tuseEffect(() => {\r\n\t\tgetEmails();\r\n\t}, [getEmails]);\r\n\r\n\r\n\tuseEffect(() => {\r\n\t\tgetCopmanies();\r\n\t\treturn cleanUp;\r\n\t}, []);\r\n\tuseEffect(() => {\r\n\t\tif (actionBarData?.length) {\r\n\t\t\tlocalStorage.setItem('email-subjects-view', JSON.stringify(actionBarData));\r\n\t\t}\r\n\t}, [actionBarData]);\r\n\r\n\t/* JSX STRUCTURE STARTED */\r\n\treturn (\r\n\t\t<section className='templates'>\r\n\t\t\t<ActionBar\r\n\t\t\t\ttitle={type === 'email' ? 'Emails' : 'PDFs'}\r\n\t\t\t\tdata={actionBarData}\r\n\t\t\t\tsetData={setActionBarData}\r\n\t\t\t\tactive={actionBarActiveTab}\r\n\t\t\t\tsetActive={setActionBarActiveTab}\r\n\t\t\t\thandleSearch={(search) => {\r\n\t\t\t\t\tupdatePageInfo({ search });\r\n\t\t\t\t\tsetPaginationModel({ ...paginationModel, pageNo: 1 });\r\n\t\t\t\t}}\r\n\t\t\t\tdisabledViews={['Kanban', 'Calendar', 'Gantt', viewTypes.GRID]}\r\n\t\t\t\tfields={schemaFields}\r\n\t\t\t\tselectedIds={selectedRow}\r\n\t\t\t\tbutton={false}\r\n\t\t\t/>\r\n\t\t\t{actionBarActiveTab === viewTypes.TABLE && (\r\n\t\t\t\t<MaterialTable\r\n\t\t\t\t\trows={tableRows || []}\r\n\t\t\t\t\tcolumns={tableColumns}\r\n\t\t\t\t\tpaginationModel={paginationModel}\r\n\t\t\t\t\ttotalPages={total}\r\n\t\t\t\t\tcolumnOrder={['mrt-row-select', ...generatedColumns.orderKeys]}\r\n\t\t\t\t\tstates={{ isLoading: isFetching }}\r\n\t\t\t\t\tonSortingChange={(sort) => updatePageInfo({ sort })}\r\n\t\t\t\t\tenableColumnDragging={false}\r\n\t\t\t\t\tenableEditing={false}\r\n\t\t\t\t\tonSelectRow={(r) =>\r\n\t\t\t\t\t\tsetSelectedRow(r.map((ele) => ele.original.id))\r\n\t\t\t\t\t}\r\n\t\t\t\t\tenableAddCustomField={false}\r\n\t\t\t\t\trowActionMenu={rowActionMenu}\r\n\t\t\t\t\tisResetRow={false}\r\n\t\t\t\t\thandleColumnOrdering={(colOrder) =>\r\n\t\t\t\t\t\tupdateGeneratedColumns({ orderKeys: colOrder.slice(1) })\r\n\t\t\t\t\t}\r\n\t\t\t\t\tonColumnVisibility={(columns: MaterialTableColumnProps[]) =>\r\n\t\t\t\t\t\tupdateGeneratedColumns({ columns: columns })\r\n\t\t\t\t\t}\r\n\t\t\t\t\tshowPreview={true}\r\n\t\t\t\t\t\t\thandlePreview={(item) => {\r\n\t\t\t\t\t\t\t\t\tsetTemplateModalSource('view');\r\n\t\t\t\t\t\t\t\t\tsetShowTemplateModal(item);\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t)}\r\n\t\t\t{actionBarActiveTab === viewTypes.GRID && (\r\n\t\t\t\t<GridCard\r\n\t\t\t\t\tdata={tableRows}\r\n\t\t\t\t\trowActionMenu={rowActionMenu}\r\n\t\t\t\t/>\r\n\t\t\t)}\r\n\r\n\t\t\t{!actionBarActiveTab && (\r\n\t\t\t\t<Fallback\r\n\t\t\t\t\theading={t('rental.settings.termsAndConditions.title')}\r\n\t\t\t\t\tsubHeading='No data available'\r\n\t\t\t\t\ticon={<img src={logo.invoiceFallback} />}>\r\n\t\t\t\t</Fallback>\r\n\t\t\t)}\r\n\r\n\t\t\t<Footer\r\n\t\t\t\ttotal={total}\r\n\t\t\t\tpaginationModel={{\r\n\t\t\t\t\t...paginationModel,\r\n\t\t\t\t\tlimit: activePage.page_size\r\n\t\t\t\t}}\r\n\t\t\t\thandlePaginationModel={handlePaginationModel}\r\n\t\t\t\tresource=''\r\n\t\t\t/>\r\n\r\n\t\t\t{/* Action Menu */}\r\n\t\t\t<Menu\r\n\t\t\t\tanchorEl={actionAnchorEl}\r\n\t\t\t\topen={Boolean(actionAnchorEl)}\r\n\t\t\t\tonClose={() => setActionAnchorEl(null)}>\r\n\t\t\t\t<MenuItem>\r\n\t\t\t\t\t<Typography type='s4' color='theme.secondary.1000'>\r\n\t\t\t\t\t\t{t('common.upload')}\r\n\t\t\t\t\t</Typography>\r\n\t\t\t\t</MenuItem>\r\n\t\t\t\t<MenuItem>\r\n\t\t\t\t\t<Typography type='s4' color='theme.secondary.1000'>\r\n\t\t\t\t\t\t{t('common.print')}\r\n\t\t\t\t\t</Typography>\r\n\t\t\t\t</MenuItem>\r\n\t\t\t</Menu>\r\n\t\t\t{showTemplateModal && (\r\n\t\t\t\t<TemplateModal\r\n\t\t\t\t\temail={showTemplateModal}\r\n\t\t\t\t\tonClose={() => setShowTemplateModal(null)}\r\n\t\t\t\t\topen={showTemplateModal !== null}\r\n\t\t\t\t\tcompanies={companies}\r\n\t\t\t\t\ttemplateRoutes={ROUTES}\r\n\t\t\t\t\tsource={templateModalSource}\r\n\t\t\t\t/>\r\n\t\t\t)}\r\n\t\t\t{showCompanySelectionModal && (\r\n\t\t\t\t<CompanySelectionModal\r\n\t\t\t\t\tisOpen={showCompanySelectionModal !== null}\r\n\t\t\t\t\tsetIsOpen={setShowCompanySelectionModal}\r\n\t\t\t\t\tcompanies={companies}\r\n\t\t\t\t\temail={showCompanySelectionModal}\r\n\t\t\t\t\ttemplateRoutes={ROUTES}\r\n\t\t\t\t/>\r\n\t\t\t)}\r\n\t\t</section>\r\n\t);\r\n};\r\n\r\nexport default Templates;\r\n","// React imports\r\nimport React, { useEffect, useState } from 'react';\r\n\r\n// Material UI imports\r\nimport { Box, IconButton, TextField, InputAdornment } from '@mui/material';\r\nimport { Add, Remove } from '@mui/icons-material';\r\n\r\nexport interface IColumnWidthProps {\r\n onChange: (value: number) => void;\r\n}\r\n\r\nexport const ColumnWidth = ({onChange}: IColumnWidthProps) => {\r\n const [value, setValue] = useState(6);\r\n\r\n const handleIncrement = () => {\r\n setValue(prev => prev + 1);\r\n };\r\n\r\n const handleDecrement = () => {\r\n setValue(prev => Math.max(0, prev - 1)); // Prevent negative values\r\n };\r\n\r\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const newValue = Number.parseInt(event.target.value) || 0;\r\n setValue(Math.max(0, newValue));\r\n };\r\n\r\n useEffect(() => {\r\n onChange(value);\r\n }, [value]);\r\n\r\n return (\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2, p: 4 }}>\r\n <TextField\r\n value={value}\r\n onChange={handleInputChange}\r\n name='custom_width'\r\n size=\"small\"\r\n sx={{\r\n width: '120px',\r\n '& .MuiOutlinedInput-root': {\r\n paddingLeft: 0,\r\n paddingRight: 0,\r\n '& input': {\r\n textAlign: 'center',\r\n padding: '8px 4px',\r\n }\r\n }\r\n }}\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <IconButton\r\n onClick={handleDecrement}\r\n size=\"small\"\r\n sx={{\r\n marginLeft: '-4px',\r\n borderRadius: '4px 0 0 4px',\r\n border: 'none',\r\n '&:hover': {\r\n backgroundColor: 'rgba(0, 0, 0, 0.04)'\r\n }\r\n }}\r\n >\r\n <Remove fontSize=\"small\" />\r\n </IconButton>\r\n </InputAdornment>\r\n ),\r\n endAdornment: (\r\n <InputAdornment position=\"end\">\r\n <IconButton\r\n onClick={handleIncrement}\r\n size=\"small\"\r\n sx={{\r\n marginRight: '-4px',\r\n borderRadius: '0 4px 4px 0',\r\n border: 'none',\r\n '&:hover': {\r\n backgroundColor: 'rgba(0, 0, 0, 0.04)'\r\n }\r\n }}\r\n >\r\n <Add fontSize=\"small\" />\r\n </IconButton>\r\n </InputAdornment>\r\n ),\r\n }}\r\n inputProps={{\r\n type: 'number',\r\n min: 0,\r\n }}\r\n />\r\n \r\n <Box sx={{ ml: 2, color: 'text.secondary' }}>\r\n Current value: {value}\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default ColumnWidth;","import { useEffect, useState } from \"react\";\r\n// import { useNavigate } from \"react-router-dom\";\r\nimport { Pathname } from \"../../../constants/pathnames/pathname\";\r\nimport { Box, Grid } from \"@mui/material\";\r\nimport { styled } from \"@mui/material/styles\";\r\nimport images from \"../../../assets/images\";\r\nimport DynamicInput from \"../../../components/form-control/form-builder/form-builder-element/text\";\r\nimport { useForm } from \"react-hook-form\";\r\nimport Typography from \"../../../components/typography/typography\";\r\nimport Button from \"../../../components/button/button\";\r\n// import DynamicCheckBox from \"../../../components/form-control/form-builder/form-builder-element/checkbox\";\r\n// import { Eye, EyeOff } from \"../../../components/icons\";\r\n// import { LoginFormValues } from \"../../../contexts/AuthContext\";\r\n// import { useAuth } from \"../../../hooks/useAuth\";\r\nimport Toast from \"../../../components/toast/toast\";\r\nimport * as Yup from \"yup\";\r\nimport { yupResolver } from \"@hookform/resolvers/yup\";\r\nimport { useAuth } from \"../../../hooks/useAuth\";\r\nimport { useNavigate } from \"react-router-dom\";\r\nimport { getApiConfig } from \"@/utils\";\r\n\r\nexport const ForgotPassword = () => {\r\n const { forgotPassword } = useAuth();\r\n const LoginContainer = styled(Grid)(() => ({\r\n height: \"100vh\",\r\n }));\r\n const navigate = useNavigate();\r\n interface IToast {\r\n message: string;\r\n type: \"normal\" | \"alert\";\r\n }\r\n const [toast, setToast] = useState<IToast | null>(null);\r\n\r\n const validationSchema = Yup.object({\r\n login: Yup.object({\r\n email: Yup.string()\r\n .required(\"Please enter email\")\r\n .email(\"Provided email is invalid\")\r\n }),\r\n });\r\n\r\n const { control, handleSubmit } = useForm<FormValeus>({\r\n resolver: yupResolver(validationSchema),\r\n mode: \"all\",\r\n });\r\n\r\n const LeftGrid = styled(Grid)(({ theme }) => ({\r\n [theme.breakpoints.down(\"sm\")]: {\r\n display: \"none\",\r\n },\r\n backgroundImage: `url(${images.login.LoginLeftBg})`,\r\n backgroundRepeat: \"no-repeat\",\r\n backgroundSize: \"cover\",\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n [theme.breakpoints.down(\"lg\")]: {\r\n \"& img\": {\r\n width: 350,\r\n height: 350,\r\n },\r\n },\r\n [theme.breakpoints.down(\"md\")]: {\r\n \"& img\": {\r\n width: 300,\r\n height: 300,\r\n },\r\n },\r\n }));\r\n\r\n const RightGrid = styled(Grid)(() => ({\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n padding: \"1rem\",\r\n }));\r\n \r\n const FlexBox = styled(Box)(() => ({\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n }));\r\n\r\n const onSubmit = async (values: FormValeus) => {\r\n await forgotPassword(values.login, (type, message) => {\r\n if (type) {\r\n setToast({ message: message, type: \"normal\" });\r\n setTimeout(() => {\r\n navigate(Pathname.LOGIN);\r\n }, 1500);\r\n } else {\r\n setToast({ message: message, type: \"alert\" });\r\n }\r\n });\r\n return values;\r\n };\r\n\r\n const handleBackToLogin = () => {\r\n navigate(Pathname.LOGIN);\r\n }\r\n\r\n useEffect(() => {});\r\n\r\n const appLogo = getApiConfig().appLogo || images.erp_logo\r\n\r\n return (\r\n <Box>\r\n <LoginContainer container>\r\n <LeftGrid item sm={6}>\r\n <img src={images.login.LoginLeftSiteImage} />\r\n </LeftGrid>\r\n <RightGrid item sm={6} xs={12}>\r\n <FlexBox\r\n display=\"flex\"\r\n flexDirection=\"column\"\r\n gap={4}\r\n sx={(theme) => ({\r\n minWidth: 400,\r\n [theme.breakpoints.down(\"md\")]: {\r\n minWidth: 300,\r\n },\r\n [theme.breakpoints.down(\"sm\")]: {\r\n minWidth: 300,\r\n },\r\n })}\r\n >\r\n <Box textAlign=\"center\">\r\n <img src={appLogo} width={160} height={55}/>\r\n </Box>\r\n <form onSubmit={handleSubmit(onSubmit)}>\r\n <FlexBox gap={4}>\r\n <FlexBox gap={3}>\r\n <Box>\r\n <Typography\r\n align=\"center\"\r\n type=\"h1\"\r\n weight=\"medium\"\r\n color=\"theme.secondary.1000\"\r\n >\r\n Forgot Password\r\n </Typography>\r\n <Typography\r\n align=\"center\"\r\n type=\"h5\"\r\n weight=\"normal\"\r\n color=\"theme.secondary81000\"\r\n >\r\n Enter your email to reset password\r\n </Typography>\r\n </Box>\r\n <FlexBox gap={2}>\r\n <Box>\r\n <DynamicInput\r\n formControl={control}\r\n label=\"Email\"\r\n name=\"email\"\r\n placeholder=\"Enter email\"\r\n fieldArrayName=\"login\"\r\n />\r\n </Box>\r\n </FlexBox>\r\n </FlexBox>\r\n <FlexBox gap={2}>\r\n <Button type=\"submit\" size=\"large\" variant=\"contained\">\r\n Reset Password\r\n </Button>\r\n <Button\r\n variant=\"text\"\r\n sx={(theme) => ({\r\n color: `${theme.palette.theme?.primary[\"700\"]} !important`,\r\n })}\r\n onClick = {handleBackToLogin}\r\n >\r\n Back to login\r\n </Button>\r\n </FlexBox>\r\n </FlexBox>\r\n </form>\r\n </FlexBox>\r\n </RightGrid>\r\n </LoginContainer>\r\n <Toast\r\n open={Boolean(toast)}\r\n message={toast?.message}\r\n type={toast?.type}\r\n handleClose={() => setToast(null)}\r\n anchorOrigin={{ horizontal: \"right\", vertical: \"bottom\" }}\r\n autoHideDuration={3000}\r\n />\r\n </Box>\r\n )\r\n}","import \"./landing.scss\";\r\n// import MetaComponent from '../../../utils/metaComponent';\r\n\r\nexport function Landing() {\r\n return (\r\n <div className=\"Landing\">\r\n {/* <MetaComponent\r\n\t\t\t\ttitle=\"Hi, This is dummy page title\"\r\n\t\t\t\tdescription=\"This is the dummy page description\"\r\n\t\t\t\tkeywords=\"dummy, keywords, dummy keywords, frontend template, frontend template by antino\"\r\n\t\t\t\tlocation={window.location}\r\n\t\t\t\timage=\"og_image.png\"\r\n\t\t\t/> */}\r\n <div className=\"Landing--Home\" id=\"home\">\r\n <div className=\"Landing--HomeAnimation\">\r\n <video\r\n className=\"Landing--HomeAnimationVideo\"\r\n autoPlay={true}\r\n muted\r\n loop={true}\r\n playsInline\r\n >\r\n <source\r\n src=\"https://ak.picdn.net/shutterstock/videos/1063309405/preview/stock-footage-modern-office-portrait-of-beautiful-authentic-specialist-with-short-pink-hair-standing-holding.webm\"\r\n type=\"video/mp4\"\r\n />\r\n </video>\r\n </div>\r\n <div className=\"Landing--HomeContent\">\r\n <div className=\"Landing--HomeContentTop\">\r\n <h1 className=\"Landing--SubTitle\">\r\n Introducing Dummy\r\n <span style={{ fontWeight: \"700\" }}> Land, </span>\r\n </h1>\r\n <h1 className=\"Landing--Para\">\r\n This is the hero section.Lorem ipsum dolor sit amet, consectetur\r\n adipisicing elit.Dicta fugiat perspiciatis temporibus ut impedit\r\n expedita maiores officiis porro ? At commodi suscipit atque\r\n eligendi cumque ? Impedit magnam eligendi fugiat.Non, quam.\r\n </h1>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default Landing;\r\n","import { useEffect, useMemo } from \"react\";\r\nimport Footer from \"../../../components/footer/footer\";\r\nimport MaterialTable from \"../../../components/material-table/material-table\";\r\nimport { useAppDispatch, useAppSelector } from \"../../../redux/hooks\";\r\nimport { fetchPage } from \"./redux/actionCreator\";\r\nimport {\r\n pageViewChangeCurrentPage,\r\n setColumnOrder,\r\n setPageViewPages,\r\n setPageViewPaginationModel,\r\n setRowData,\r\n} from \"./redux/reducer\";\r\nimport { IPaginationModel } from \"../../../@types/pagination-model\";\r\nimport NumberAggregation from \"../../../components/material-table/components/number-aggregation\";\r\nimport DefaultAggregation from \"../../../components/material-table/components/default-aggregation\";\r\n// import HeaderCell from \"../../../components/material-table/components/header-cell\";\r\nimport { IPage } from \"../../../@types/page\";\r\nimport Button from \"../../../components/button/button\";\r\n// import Filter from \"../../../components/filter/filter\";\r\n\r\nconst PageView = () => {\r\n // const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\r\n const dispatch = useAppDispatch();\r\n const { pages, currentPage, rows, columns, columnOrder, paginationModel } =\r\n useAppSelector((store) => store?.pages);\r\n const { pageNo, limit } = paginationModel;\r\n\r\n useEffect(() => {\r\n dispatch(fetchPage(1));\r\n }, [dispatch]);\r\n\r\n const handleChangePage = (page: number) =>\r\n dispatch(pageViewChangeCurrentPage(page));\r\n\r\n const handleSetPages = (updatedPages: IPage[]) =>\r\n dispatch(setPageViewPages(updatedPages));\r\n\r\n useEffect(() => {\r\n dispatch(fetchPage(currentPage));\r\n }, [dispatch, currentPage]);\r\n\r\n const tableRows = useMemo(() => {\r\n const start = limit * (pageNo - 1);\r\n return rows.slice(start, start + limit);\r\n }, [rows, pageNo, limit]);\r\n\r\n const tableColumns = useMemo(() => {\r\n return columns?.map((col: any) => {\r\n let updatedCol = {\r\n ...col,\r\n // Header: ({ column }: any) => <HeaderCell column={column} />,\r\n enableSorting: true,\r\n };\r\n\r\n if (col?.type === \"number\") {\r\n updatedCol = {\r\n ...updatedCol,\r\n muiEditTextFieldProps: {\r\n type: \"number\",\r\n },\r\n Footer: ({ column }: any) => {\r\n return <NumberAggregation data={tableRows} column={column?.id} />;\r\n },\r\n };\r\n } else if (col.type === \"string\") {\r\n updatedCol = {\r\n ...updatedCol,\r\n Footer: ({ column }: any) => (\r\n <DefaultAggregation data={tableRows} column={column.id} />\r\n ),\r\n };\r\n }\r\n\r\n return updatedCol;\r\n });\r\n }, [tableRows, columns]);\r\n\r\n const handlePaginationModel = (model: IPaginationModel) => {\r\n dispatch(setPageViewPaginationModel(model));\r\n };\r\n\r\n const total = limit ? Math.ceil(rows.length / limit) : 0;\r\n\r\n const handleColumnOrdering = (colOrder: string[]) => {\r\n dispatch(setColumnOrder(colOrder.slice(1)));\r\n };\r\n\r\n const updateData = (value: string, column: any, rowId: string) => {\r\n const payload = {\r\n value: column?.columnDef?.type === \"number\" ? Number(value) : value,\r\n columnId: column.id,\r\n rowId,\r\n };\r\n\r\n dispatch(setRowData(payload));\r\n };\r\n\r\n // const handleOpenFilter = (event: React.MouseEvent<HTMLButtonElement>) =>\r\n // setAnchorEl(event.currentTarget);\r\n\r\n // const handleCloseFilter = () => setAnchorEl(null);\r\n\r\n return (\r\n <>\r\n <Button>Open Filter</Button>\r\n <MaterialTable\r\n rows={tableRows}\r\n columns={tableColumns}\r\n paginationModel={paginationModel}\r\n totalPages={total}\r\n columnOrder={[\"mrt-row-select\", ...columnOrder]}\r\n handleColumnOrdering={handleColumnOrdering}\r\n updateData={updateData}\r\n />\r\n <Footer\r\n pages={pages}\r\n setPages={handleSetPages}\r\n currentPage={currentPage}\r\n setCurrentPage={handleChangePage}\r\n total={total}\r\n paginationModel={paginationModel}\r\n handlePaginationModel={handlePaginationModel}\r\n />\r\n\r\n {/* {anchorEl && <Filter anchorEl={anchorEl} onClose={handleCloseFilter} />} */}\r\n </>\r\n );\r\n};\r\n\r\nexport { PageView };\r\nexport default PageView;\r\n","import { useEffect } from \"react\";\r\n// // import { useNavigate } from \"react-router-dom\";\r\nimport { Pathname } from \"../../../constants/pathnames/pathname\";\r\nimport { Box } from \"@mui/material\";\r\nimport { useSearchParams } from \"react-router-dom\";\r\nimport { useNavigate } from \"react-router-dom\";\r\nimport { useAuth } from \"../../../hooks/useAuth\";\r\n\r\n\r\nexport const ResetPassword = () => {\r\n const { resetPassword } = useAuth();\r\n const [searchParams] = useSearchParams();\r\n const navigate = useNavigate();\r\n\r\n useEffect(() => {\r\n const tokenParam = searchParams.get(\"token\");\r\n\r\n if (!tokenParam) {\r\n navigate(Pathname.LOGIN);\r\n } else {\r\n resetPassword({ token: tokenParam }, (response) => {\r\n console.log(\"response \",response)\r\n if (!response) {\r\n navigate(Pathname.LOGIN);\r\n } else {\r\n if (response && response?.data && response?.data?.isValid) {\r\n navigate(Pathname.CHANGE_PASSWORD, { state: { token: tokenParam } });\r\n }\r\n }\r\n });\r\n }\r\n }, [searchParams, resetPassword, navigate]);\r\n\r\n return <Box>Resetting password, please wait...</Box>;\r\n};","export const activityTag = {\r\n comments: [\r\n {\r\n name: \"You\",\r\n dateTime: \"01-11-2024 12:45:10\",\r\n text: \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\",\r\n },\r\n {\r\n name: \"Siddhant\",\r\n dateTime: \"01-12-2024 15:05:22\",\r\n text: \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\",\r\n },\r\n ],\r\n activities: [\r\n {\r\n dateTime: \"12-27-2023 19:17:10\",\r\n text: \"Prasun assigned HR Admin role to Avneet Singh.\",\r\n },\r\n {\r\n dateTime: \"12-27-2023 19:15:10\",\r\n text: \"Prasun created a new user Avneet Singh\",\r\n },\r\n {\r\n dateTime: \"12-27-2023 15:17:10\",\r\n text: \"Prasun created a new role HR Admin\",\r\n },\r\n {\r\n dateTime: \"12-27-2023 14:17:10\",\r\n text: \"Prasun updated a role UI/UX Designer ‣ Product Designer\",\r\n },\r\n {\r\n dateTime: \"12-27-2023 14:17:10\",\r\n text: \"Amrit updated resources for UI/UX Designer role.\",\r\n },\r\n {\r\n dateTime: \"12-27-2023 14:17:10\",\r\n text: \"Amrit updated user Prashant Singh ‣ Prasun Singh\",\r\n },\r\n {\r\n dateTime: \"12-27-2023 14:17:10\",\r\n text: \"Amrit updated user Prashant Singh ‣ Prasun Singh\",\r\n },\r\n ],\r\n};\r\n","export const board = {\r\n columns: [\r\n {\r\n id: 1,\r\n title: \"Backlog\",\r\n cards: [\r\n {\r\n id: 1.1,\r\n title: \"Card title 1\",\r\n description: \"Card content\",\r\n },\r\n {\r\n id: 1.2,\r\n title: \"Card title 2\",\r\n description: \"Card content\",\r\n },\r\n {\r\n id: 1.3,\r\n title: \"Card title 3\",\r\n description: \"Card content\",\r\n },\r\n ],\r\n },\r\n {\r\n id: 2,\r\n title: \"Doing\",\r\n cards: [\r\n {\r\n id: 2.1,\r\n title: \"Card title 9\",\r\n description: \"Card content\",\r\n },\r\n ],\r\n },\r\n {\r\n id: 3,\r\n title: \"Q&A\",\r\n cards: [\r\n {\r\n id: 3.1,\r\n title: \"Card title 10\",\r\n description: \"Card content\",\r\n },\r\n {\r\n id: 3.2,\r\n title: \"Card title 11\",\r\n description: \"Card content\",\r\n },\r\n ],\r\n },\r\n {\r\n id: 4,\r\n title: \"Production\",\r\n cards: [\r\n {\r\n id: 4.1,\r\n title: \"Card title 12\",\r\n description: \"Card content\",\r\n },\r\n {\r\n id: 4.2,\r\n title: \"Card title 13\",\r\n description: \"Card content\",\r\n },\r\n ],\r\n },\r\n ],\r\n};\r\n","import { MaterialTableColumnProps } from \"../../../components/material-table/material-table\";\r\n\r\nexport const textOptions = [\r\n { label: 'Heading 1', value: 'heading' },\r\n { label: 'Heading 2', value: 'heading-2' },\r\n { label: 'Heading 3', value: 'heading-3' },\r\n { label: 'Heading 4', value: 'heading-4' },\r\n { label: 'Body', value: 'text' },\r\n { label: 'Text Block', value: 'text-block' },\r\n]\r\n\r\nexport const emailColumns:MaterialTableColumnProps[] = [\r\n {\r\n header: 'ID',\r\n accessorKey: '_id',\r\n visible: true,\r\n type: 'string'\r\n },\r\n {\r\n header: 'Date',\r\n accessorKey: 'created_at',\r\n visible: true,\r\n type: 'date'\r\n },\r\n {\r\n header: 'Subject',\r\n accessorKey: 'subject',\r\n visible: true,\r\n type: 'string'\r\n },\r\n]","export const multilineData = [\r\n {\r\n id: 1,\r\n name: \"Customer\",\r\n role: \"Selling\",\r\n },\r\n {\r\n id: 2,\r\n name: \"Producer\",\r\n role: \"sdf\",\r\n },\r\n {\r\n id: 3,\r\n name: \"Director\",\r\n role: \"wer\",\r\n },\r\n];\r\n","export const tableData = [\r\n {\r\n age: 33,\r\n name: \"Delaney Cortez\",\r\n company: \"IZZBY\",\r\n email: \"delaneycortez@izzby.com\",\r\n phone: \"+1 (844) 567-3740\",\r\n image: \"https://picsum.photos/id/74/900/900\",\r\n address: \"870 Hegeman Avenue, Crawfordsville, Kentucky, 2953\",\r\n about:\r\n \"Nostrud labore esse labore aliquip. Qui excepteur sint exercitation adipisicing deserunt ad veniam sunt ipsum nulla deserunt dolor est culpa. Eu deserunt nostrud ipsum mollit consectetur mollit et. Commodo mollit qui Lorem fugiat eiusmod dolore amet est officia aliqua. Est tempor veniam sit magna. Ullamco veniam eiusmod nostrud sit dolor. Est proident cupidatat proident ullamco irure commodo nisi fugiat adipisicing ullamco adipisicing ad officia.\\r\\n\",\r\n date: \"2023-01-10T09:02:53.870Z\",\r\n },\r\n {\r\n age: 24,\r\n name: \"Williamson Davenport\",\r\n company: \"ONTAGENE\",\r\n email: \"williamsondavenport@ontagene.com\",\r\n phone: \"+1 (844) 564-3345\",\r\n image: \"https://picsum.photos/id/40/900/900\",\r\n address: \"274 Forest Place, Vowinckel, Maine, 9510\",\r\n about:\r\n \"Quis ipsum ad deserunt cillum consequat do ex laboris sit eiusmod pariatur occaecat voluptate. Laborum ea sit duis mollit est sunt culpa ut et commodo consectetur veniam adipisicing amet. Ipsum mollit proident ea deserunt veniam Lorem duis aliquip dolor duis proident ut. Velit esse officia occaecat exercitation magna consequat ullamco ea nisi. Ad ea deserunt occaecat quis occaecat eiusmod ad do. Elit veniam quis aliquip qui nostrud laborum irure minim aute irure fugiat. Ullamco aliquip dolor est sit nulla consectetur.\\r\\n\",\r\n date: \"2023-01-10T09:02:53.870Z\",\r\n },\r\n {\r\n age: 30,\r\n name: \"Alexander Wong\",\r\n company: \"QUADEEBO\",\r\n email: \"alexanderwong@quadeebo.com\",\r\n phone: \"+1 (834) 497-2624\",\r\n image: \"https://picsum.photos/id/8/900/900\",\r\n address: \"420 Borinquen Pl, Kenvil, Vermont, 7377\",\r\n about:\r\n \"Dolor mollit elit est ex. Sit mollit laboris ad pariatur magna est amet veniam ad ad velit incididunt eu. Minim ipsum qui labore eiusmod magna veniam in magna pariatur Lorem.\\r\\n\",\r\n date: \"2023-01-10T09:02:53.870Z\",\r\n },\r\n {\r\n age: 24,\r\n name: \"Blanca Schultz\",\r\n company: \"CUJO\",\r\n email: \"blancaschultz@cujo.com\",\r\n phone: \"+1 (954) 412-2870\",\r\n image: \"https://picsum.photos/id/42/900/900\",\r\n address: \"144 Albemarle Terrace, Watchtower, Delaware, 2829\",\r\n about:\r\n \"Pariatur sunt dolore nostrud cillum cupidatat culpa. Ipsum laborum laboris reprehenderit Lorem culpa. Consequat duis do occaecat ipsum cupidatat sunt minim minim cillum commodo in qui culpa anim. Et ullamco nisi eiusmod laboris veniam laborum ullamco reprehenderit aliqua nulla labore. Elit excepteur sunt exercitation anim sint non ea.\\r\\n\",\r\n date: \"2023-01-10T09:02:53.870Z\",\r\n },\r\n {\r\n age: 34,\r\n name: \"Eunice Romero\",\r\n company: \"CENTREGY\",\r\n email: \"euniceromero@centregy.com\",\r\n phone: \"+1 (949) 568-3290\",\r\n image: \"https://picsum.photos/id/3/900/900\",\r\n address: \"698 Clermont Avenue, Harmon, Washington, 1094\",\r\n about:\r\n \"Nulla aute enim incididunt labore aute id officia fugiat tempor aliqua. Fugiat incididunt sint nisi eiusmod fugiat magna minim in. Officia eu enim magna magna pariatur deserunt esse amet veniam sint consequat est sit.\\r\\n\",\r\n date: \"2023-01-10T09:02:53.870Z\",\r\n },\r\n];\r\n","export const tabsData = [\r\n {\r\n tab_order: 1,\r\n title: \"Tab One\",\r\n content: \"Tab one Content\",\r\n },\r\n {\r\n tab_order: 2,\r\n title: \"Tab Two\",\r\n content: \"Tab two Content\",\r\n },\r\n {\r\n tab_order: 3,\r\n title: \"Tab Three\",\r\n content: \"Tab three Content\",\r\n },\r\n];\r\n","import React from \"react\";\r\nimport AddTemplate from \"./add-template/add-template\";\r\nimport Templates from \"./templates\";\r\nimport { TEMPLATE_EDITOR_PATHS } from \"./utils/constant\";\r\n\r\nexport const templateEditorRoutes = (modulePath: string, module: string) => [\r\n\t{\r\n\t\tpath: `${TEMPLATE_EDITOR_PATHS.TEMPLATES_LIST('email')}`,\r\n\t\telement: <Templates type=\"email\" module={module} modulePath={modulePath}/>\r\n\t},\r\n\t{\r\n\t\tpath: `${TEMPLATE_EDITOR_PATHS.TEMPLATES_ADD('email')}`,\r\n\t\telement: <AddTemplate modulePath={modulePath} type=\"email\" module={module}/>\r\n\t},\r\n\t{\r\n\t\tpath: `${TEMPLATE_EDITOR_PATHS.TEMPLATES_EDIT('email')}`,\r\n\t\telement: <AddTemplate modulePath={modulePath} type=\"email\" module={module}/>\r\n\t},\r\n\t{\r\n\t\tpath: `${TEMPLATE_EDITOR_PATHS.TEMPLATES_LIST('pdf')}`,\r\n\t\telement: <Templates module={module} type=\"pdf\" modulePath={modulePath}/>\r\n\t},\r\n\t{\r\n\t\tpath: `${TEMPLATE_EDITOR_PATHS.TEMPLATES_ADD('pdf')}`,\r\n\t\telement: <AddTemplate modulePath={modulePath} type=\"pdf\" module={module}/>\r\n\t},\r\n\t{\r\n\t\tpath: `${TEMPLATE_EDITOR_PATHS.TEMPLATES_EDIT('pdf')}`,\r\n\t\telement: <AddTemplate modulePath={modulePath} type=\"pdf\" module={module}/>\r\n\t}\r\n]","export const userData = [\r\n {\r\n id: 1,\r\n name: \"Aman Gupta\",\r\n role: \"Accountant & Finance\",\r\n roleId: 2,\r\n },\r\n {\r\n id: 2,\r\n name: \"Deepak Sharma\",\r\n role: \"Sales\",\r\n roleId: 4,\r\n },\r\n {\r\n id: 3,\r\n name: \"Avhinav Dhingra\",\r\n role: \"Operation\",\r\n roleId: 3,\r\n },\r\n {\r\n id: 4,\r\n name: \"Rajiv Mehta\",\r\n role: \"Maintenance\",\r\n roleId: 1,\r\n },\r\n {\r\n id: 5,\r\n name: \"Rajiv Mehta\",\r\n role: \"Stakes\",\r\n roleId: 6,\r\n },\r\n {\r\n id: 6,\r\n name: \"Rajdeep Dutta\",\r\n role: \"Research & Development\",\r\n roleId: 5,\r\n },\r\n {\r\n id: 7,\r\n name: \"Sonia Verma\",\r\n role: \"Accountant & Finance\",\r\n roleId: 2,\r\n },\r\n {\r\n id: 8,\r\n name: \"Vikram Singh\",\r\n role: \"Sales\",\r\n roleId: 4,\r\n },\r\n {\r\n id: 9,\r\n name: \"Neha Patel\",\r\n role: \"Operation\",\r\n roleId: 3,\r\n },\r\n {\r\n id: 10,\r\n name: \"Ankit Kapoor\",\r\n role: \"Maintenance\",\r\n roleId: 1,\r\n },\r\n {\r\n id: 11,\r\n name: \"Kavita Shah\",\r\n role: \"Stakes\",\r\n roleId: 6,\r\n },\r\n {\r\n id: 12,\r\n name: \"Rohit Singh\",\r\n role: \"Research & Development\",\r\n roleId: 5,\r\n },\r\n {\r\n id: 13,\r\n name: \"Priya Agarwal\",\r\n role: \"Human Resources\",\r\n roleId: 7,\r\n },\r\n {\r\n id: 14,\r\n name: \"Amit Trivedi\",\r\n role: \"Marketing\",\r\n roleId: 8,\r\n },\r\n {\r\n id: 15,\r\n name: \"Sara Khan\",\r\n role: \"Customer Support\",\r\n roleId: 9,\r\n },\r\n {\r\n id: 16,\r\n name: \"Amit Gupta\",\r\n role: \"Accountant & Finance\",\r\n roleId: 2,\r\n },\r\n {\r\n id: 17,\r\n name: \"Neha Sharma\",\r\n role: \"Sales\",\r\n roleId: 4,\r\n },\r\n {\r\n id: 18,\r\n name: \"Rahul Verma\",\r\n role: \"Operation\",\r\n roleId: 3,\r\n },\r\n {\r\n id: 19,\r\n name: \"Meera Kapoor\",\r\n role: \"Maintenance\",\r\n roleId: 1,\r\n },\r\n {\r\n id: 20,\r\n name: \"Rajesh Khanna\",\r\n role: \"Stakes\",\r\n roleId: 6,\r\n },\r\n {\r\n id: 21,\r\n name: \"Sonia Dutta\",\r\n role: \"Research & Development\",\r\n roleId: 5,\r\n },\r\n {\r\n id: 22,\r\n name: \"Alok Gupta\",\r\n role: \"Human Resources\",\r\n roleId: 7,\r\n },\r\n {\r\n id: 23,\r\n name: \"Preeti Singh\",\r\n role: \"Marketing\",\r\n roleId: 8,\r\n },\r\n {\r\n id: 24,\r\n name: \"Anuj Kumar\",\r\n role: \"Customer Support\",\r\n roleId: 9,\r\n },\r\n {\r\n id: 25,\r\n name: \"Deepa Patel\",\r\n role: \"IT Support\",\r\n roleId: 10,\r\n },\r\n {\r\n id: 26,\r\n name: \"Vishal Kapoor\",\r\n role: \"Legal\",\r\n roleId: 11,\r\n },\r\n {\r\n id: 27,\r\n name: \"Asha Singh\",\r\n role: \"Quality Assurance\",\r\n roleId: 12,\r\n },\r\n {\r\n id: 28,\r\n name: \"Rajeev Sharma\",\r\n role: \"Logistics\",\r\n roleId: 13,\r\n },\r\n {\r\n id: 29,\r\n name: \"Kavita Trivedi\",\r\n role: \"Public Relations\",\r\n roleId: 14,\r\n },\r\n {\r\n id: 30,\r\n name: \"Alok Singh\",\r\n role: \"Training and Development\",\r\n roleId: 15,\r\n },\r\n {\r\n id: 31,\r\n name: \"Pooja Kapoor\",\r\n role: \"Accountant & Finance\",\r\n roleId: 2,\r\n },\r\n {\r\n id: 32,\r\n name: \"Rohit Verma\",\r\n role: \"Sales\",\r\n roleId: 4,\r\n },\r\n {\r\n id: 33,\r\n name: \"Sanjay Mehta\",\r\n role: \"Operation\",\r\n roleId: 3,\r\n },\r\n {\r\n id: 34,\r\n name: \"Nisha Khanna\",\r\n role: \"Maintenance\",\r\n roleId: 1,\r\n },\r\n {\r\n id: 35,\r\n name: \"Varun Dutta\",\r\n role: \"Stakes\",\r\n roleId: 6,\r\n },\r\n {\r\n id: 36,\r\n name: \"Sapna Gupta\",\r\n role: \"Research & Development\",\r\n roleId: 5,\r\n },\r\n {\r\n id: 37,\r\n name: \"Vikas Sharma\",\r\n role: \"Human Resources\",\r\n roleId: 7,\r\n },\r\n {\r\n id: 38,\r\n name: \"Ritu Verma\",\r\n role: \"Marketing\",\r\n roleId: 8,\r\n },\r\n {\r\n id: 39,\r\n name: \"Manish Singh\",\r\n role: \"Customer Support\",\r\n roleId: 9,\r\n },\r\n {\r\n id: 40,\r\n name: \"Neha Patel\",\r\n role: \"IT Support\",\r\n roleId: 10,\r\n },\r\n {\r\n id: 41,\r\n name: \"Anil Kapoor\",\r\n role: \"Legal\",\r\n roleId: 11,\r\n },\r\n {\r\n id: 42,\r\n name: \"Priya Dutta\",\r\n role: \"Quality Assurance\",\r\n roleId: 12,\r\n },\r\n {\r\n id: 43,\r\n name: \"Rahul Sharma\",\r\n role: \"Logistics\",\r\n roleId: 13,\r\n },\r\n {\r\n id: 44,\r\n name: \"Sneha Trivedi\",\r\n role: \"Public Relations\",\r\n roleId: 14,\r\n },\r\n {\r\n id: 45,\r\n name: \"Anita Singh\",\r\n role: \"Training and Development\",\r\n roleId: 15,\r\n },\r\n {\r\n id: 46,\r\n name: \"Amit Trivedi\",\r\n role: \"Accountant & Finance\",\r\n roleId: 2,\r\n },\r\n {\r\n id: 47,\r\n name: \"Priyanka Sharma\",\r\n role: \"Sales\",\r\n roleId: 4,\r\n },\r\n {\r\n id: 48,\r\n name: \"Rajat Verma\",\r\n role: \"Operation\",\r\n roleId: 3,\r\n },\r\n {\r\n id: 49,\r\n name: \"Anu Khanna\",\r\n role: \"Maintenance\",\r\n roleId: 1,\r\n },\r\n {\r\n id: 50,\r\n name: \"Sumit Dutta\",\r\n role: \"Stakes\",\r\n roleId: 6,\r\n },\r\n];\r\n"],"names":["allAggregations","label","value","nonNumberAggregations","aggregationFnsLookup","avg","aggregationFns","average","sum","max","count_empty","countEmpty","count_full","countFull","percentage_empty","percentageEmpty","percentage_full","percentageFull","min","none","NumberAggregation","data","column","type","selectedType","setSelectedType","React","useState","anchorEl","setAnchorEl","calculatedValue","setCalculatedValue","open","Boolean","handleClose","useEffect","func","aggregations","jsxs","Fragment","children","jsx","Typography","onClick","event","currentTarget","sx","cursor","weight","color","Menu","id","onClose","map","aggr","MenuItem","selected","handleAggregationType","val","NotFound","Component","componentDidMount","setTimeout","render","style","textAlign","position","top","left","transform","fetchPage","createAsyncThunk","pageId","getState","pages","find","p","defaultData","rows","name","age","gender","company","location","price","columns","header","accessorKey","local","columnOrder","state","currentPage","loading","error","_id","paginationModel","pageNo","limit","pageViewSlice","createSlice","initialState","reducers","changeCurrentPage","action","payload","setPages","setPaginationModel","setColumnOrder","setRowData","JSON","parse","stringify","rowId","columnId","extraReducers","builder","addCase","pending","fulfilled","rejected","pageViewChangeCurrentPage","setPageViewPages","setPageViewPaginationModel","actions","reducer","LoginContainer","styled","Grid","height","LeftGrid","theme","breakpoints","down","display","backgroundImage","images","login","LoginLeftBg","backgroundRepeat","backgroundSize","justifyContent","alignItems","width","RightGrid","padding","FlexBox","Box","flexDirection","validationSchema","Yup","object","password","string","required","matches","confirm_password","oneOf","ref","calendarData","events","title","start","getDate","end","groupId","dayString","today","Date","year","getFullYear","toString","month","getMonth","length","replace","hasMenu","icon","GridColumnIcon","HeaderString","dataType","key","element","text","field_type","placeholder","default_value","min_length","max_length","is_multiline","is_required","is_unique","number","float_step","is_negative","email","phone","select","options","is_multiselect","date","is_future_dates_allowed","is_past_dates_allowed","time","option","url","currency","file","max_size","geoLocation","image","section","section_type","form_switcher_label","form_switcher_name","switcher_forms","is_accordion","members","info","relation","module","field","checkbox","is_checked","title_position","toggleButton","radioButton","table","table_columns","tagsInput","fields","Paragraph","Hashtag","ArrowCircleDown","Calendar","PaperClip","Link","Email","Phone","DollarCircle","Clock","Location","CheckboxSquare","Image","LinkHorizontal","InfoCircle","ToggleSwitch","RadioButton","FieldSelect","props","selectFields","setSelectFields","search","setSearch","handleSearch","target","searchVal","filter","includes","Select","fullWidth","size","labelName","renderValue","_a","searchPlaceholder","searchValue","onKeyDown","e","stopPropagation","Stack","direction","spacing","fontSize","COLUMN_PER_ROW_OPTIONS","SELECT_OPTIONS","CURRENCY_OPTIONS","FIELDS_WITHOUT_PLACEHOLDER","Set","FIELDS_WITH_MIN_MAX","MemoizedMenuItem","index","prefix","MemoizedRelationMenuItem","TextEditForm","handlePropertyValueUpdate","handleColumnSelect","handleWidthChange","elementJSON","setElementJSON","openModal","setOpenModal","relationFields","setRelationFields","functionValue","setFunctionValue","prevElementRef","useRef","prevFieldsRef","relationModulesOptions","useMemo","current","Object","keys","formatText","setRelationFieldsOptions","useCallback","moduleValue","prev","fieldsArr","some","item","idx","_b","handleSave","updatedElement","handleFieldUpdate","fieldType","handleSelectUpdate","handleModuleSelect","handleWidthSliderChange","_","widthValue","Array","isArray","custom_width","handleFullWidthChange","isFullWidth","checked","is_fullwidth","handleColumnSelectChange","columnValue","Number","getDefaultValue","getMinMaxLabels","handleOpenModal","handleCloseModal","handleFunctionValueChange","currencySelectSection","FormControl","onChange","defaultValue","variant","timeSelectSection","relationSelectSection","disabled","minMaxLabels","className","is_new","TextField","has","columns_per_row","mb","Slider","step","marks","valueLabelDisplay","FormControlLabel","control","Checkbox","Button","startIcon","Add","Modal","DialogTitle","IconButton","edge","Close","DialogContent","dividers","multiline","minRows","DialogActions","SelectEditForm","memo","handleSelectOptionValueUpdate","selectOptions","setSelectOptions","newOption","setNewOption","isAddingOption","setIsAddingOption","isFieldDisabled","selectedOptionLabel","selectedOption","handleMultiSelect","isChecked","handleNewOptionChange","handleAddOption","trim","enqueueSnackbar","updatedOptions","handleRemoveOption","indexToRemove","removedOption","handleWidthChangeCallback","newValue","pr","gap","InputProps","readOnly","Trash","mt","border","borderRadius","displayName","SectionEditForm","addForm","setAddForm","newForm","setNewForm","selectOption","isDuplicateFormName","ele","values","SECTION_TYPES","FORM_SWITCH_SECTION","marginBottom","newVal","formEle","CloseIcon","helperText","uniqueStringId","generateRandomId","CheckboxEditForm","isAddSelectOption","setAddSelectOption","columnPerRowOptions","allowLabelPositionModification","newOptions","setNewOptions","handleAddNewOption","filterIndex","RadioGroup","row","Radio","slotProps","typography","TableEditForm","handleColumnsUpdate","tables","setTables","visible","FormField","gridItemSize","activeMember","t","remove","move","handleElementSelection","setElementSwap","handleDuplicateElement","setSelectedHoc","setActiveMember","hocProps","activeIndex","removeElement","swap","elementSwap","handleDuplicate","setElementHoc","commonFieldProps","formControl","fieldArrayName","formType","typeOfField","renderFieldContent","DynamicInput","endIcon","src","sms","alt","DynamicPhone","DynamicSelect","DynamicDate","disable","DynamicTime","dollar","DynamicMedia","DynamicInfo","DynamicToggleButton","titlePosition","DynamicRadioButton","DynamicCheckBox","DynamicTable","console","warn","xs","DynamicElementHOC","FormFields","sectionMembers","calculateGridSize","renderedFields","findIndex","member","MODULE_PATHS","accounting","PathnameAccounting","FORMS","inventory","PathnameInventory","manufacturing","PathnameManufacturing","procurement","PathnamePurchase","crm","PathnameCrm","rental","PathnameRental","user","PathnameUsers","hrms","PathnameHrms","split","word","charAt","toUpperCase","slice","toLowerCase","join","processTableColumns","formBuilder","processMembers","sections","flatMap","extractSections","remove_section","is_section_field","processData","activeTabId","tabsData","callbacks","removeSection","tab","processTabData","processSectionData","Error","processExistingTabsData","alert","message","tabs","setTabsData","append","appendSection","activeTab","tab_order","extractedSections","useFormDataEffect","activeTabValue","initialData","formData","formBuilderDeConversion","generateModulePath","currentModule","redirectionPath","getRedirectionPath","isValidNumber","isNaN","isFinite","deepClone","obj","generateUniqueId","separator","now","Math","random","substr","cssScopingService","generateScopeId","substring","scopeCSS","css","scopeId","this","parseCSS","rule","scopeRule","rules","currentRule","braceCount","inComment","i","char","nextChar","push","braceIndex","indexOf","selector","body","s","sel","scopeSelector","startsWith","wrapHTMLWithScope","html","extractInlineStyles","styleMap","Map","DOMParser","parseFromString","querySelectorAll","forEach","styleAttr","getAttribute","styles","parseInlineStyles","identifier","tagName","set","d","declaration","colonIndex","property","mergeStyles","base","override","scopeTemplate","scopedCSS","wrappedHTML","templateRoutes","modulePath","list","TEMPLATE_EDITOR_PATHS","TEMPLATES_LIST","add","TEMPLATES_ADD","edit","TEMPLATES_EDIT","LIST","ADD_TEMPLATE","EDIT_TEMPLATE","templateId","generateEmailPreview","headerSections","footerSections","isSaving","headerHtml","generateHeaderFooterPreview","footerHtml","groupedSections","currentGroup","lastSplitGroupId","isSplitPair","splitGroupId","group","splitWidth","content","extractStyles","sectionType","tempDiv","document","createElement","innerHTML","firstChild","Function","allAttributes","attributes","attrObj","from","reduce","attr","styleObj","pair","prop","part","propName","g","EMAIL_SAFE_PROPERTIES","generateInlineStyles","parentKey","entries","acc","fullKey","cssKey","cssValue","getInitialSectionData","attrs","initialStyles","inlineStyles","borderStyle","borderColor","rest","tInlineStyles","is_bordered","tHeadInlineStyles","tHead","tBodyInlineStyles","tBody","thCellInlineStyles","thCells","tbCellInlineStyles","tbCells","EditorHeader","onSave","onPreview","preview","editHtml","onEditHtml","isEditingHeaderFooter","onEditModeChange","setIsEditingHeaderFooter","onSaveHeaderFooter","mode","templateData","editMode","fromPreview","zoom","onZoomIn","onZoomOut","onResetZoom","ROUTES","AppBar","elevation","bgcolor","Toolbar","component","RouterLink","to","underline","opacity","ZoomOut","minWidth","ZoomIn","Divider","orientation","flexItem","mx","ZoomOutMap","palette","secondary","boxShadow","Edit","EyeOff","Eye","CodeOutlinedIcon","CustomEditor","lazy","Promise","resolve","then","require","EditSectionModal","isOpen","setIsOpen","modalProps","placeholders","handleAddPlaceholder","handleEditorReady","handleModalClose","maxWidth","maxHeight","right","displayEmpty","py","Suspense","handleContinue","useCKEditorStyleExtractor","tagStyleMap","fontStyle","em","b","fontWeight","strong","u","textDecoration","strike","del","sup","verticalAlign","sub","small","big","mark","backgroundColor","code","fontFamily","kbd","samp","var","styleTagMap","reverseMap","styleKey","tag","cssPropertyMap","margin","bottom","float","clear","overflow","toCamelCase","match","letter","toKebabCase","styleDeclaration","getPropertyValue","extractTagStyles","extractNestedStyles","nestedStyles","currentElement","parentElement","inheritableProps","parentStyles","extractImageStyles","imgElement","styleData","imageStyles","assign","editorContent","includeInlineStyles","includeTagStyles","filterEmptyStyles","mergeNestedStyles","results","elementType","elementIndex","textContent","tagStyles","inheritedStyles","extractFormattingStyles","formattingStyles","stylesToHtml","preferSemanticTags","wrapInParagraph","wrappedText","multipleStylesToHtml","segments","wrapInContainer","containerTag","separateElements","htmlSegments","segment","result","applyStylesToHtml","htmlContent","targetSelector","wrapper","appendChild","kebabProperty","extractAndConvert","targetStyles","extracted","converted","mergedStyles","generateCSS","extractedStyles","styleRules","getFlattenedStyles","flattened","getSingleStyles","useDebouncedUpdate","callback","delay","timeoutRef","args","clearTimeout","editableSections","MemoizedEditorSection","isSelected","isDragging","isOver","onSelect","onUpdate","onSplit","onDelete","setIsSectionEditing","listeners","setNodeRef","setDraggableRef","useDraggable","setDroppableRef","useDroppable","isEditing","setIsEditing","isHovered","setIsHovered","isOpenEditSectionModal","setIsOpenEditSectionModal","isEditedFromSource","setIsEditedFromSource","is_edited_from_source","localContent","setLocalContent","hasUserEdited","setHasUserEdited","editorRef","mouseHoverTimeoutRef","cursorPositionRef","isRestoringCursorRef","contentRef","originalContentRef","debouncedUpdate","x","y","transition","paperSx","mergedRef","node","handleDblClick","handleEditing","editor","_tiptap","on","selection","transaction","docChanged","getData","single","mergedAttributes","handleSplit","viewFragment","processor","toView","modelFragment","toModel","model","insertContent","handleMouseEnter","window","handleMouseLeave","handleClick","handleDeleteClick","handleCancelEdit","handleCheckboxChange","handleSelectChange","requestAnimationFrame","docSize","doc","validFrom","validTo","commands","setTextSelection","isFocused","focus","contentRenderer","fallback","Skeleton","onError","dangerouslySetInnerHTML","__html","lineHeight","placeholderOptions","Paper","onDoubleClick","onMouseEnter","onMouseLeave","zIndex","pointerEvents","borderBottom","px","DragIndicatorIcon","mr","defaultChecked","Save","Fade","in","timeout","Chip","textTransform","tertiary1","_d","_c","SplitIcon","prevProps","nextProps","StyledToggleButtonGroup","ToggleButtonGroup","gridTemplateColumns","toggleButtonGroupClasses","grouped","shape","middleButton","lastButton","marginLeft","borderLeft","primary","AlignmentControl","alignment","onAlignmentChange","displayLabel","flexWrap","exclusive","Tooltip","ToggleButton","FormatAlignLeftIcon","FormatAlignCenterIcon","FormatAlignRightIcon","FormatAlignJustifyIcon","FONT_SIZES","LINE_HEIGHTS","FONT_FAMILIES","TextControls","updateAttrs","formatOptions","updateStyles","newStyles","debouncedColorUpdate","debounce","toggleFormat","format","isCurrentlyApplied","bold","italic","handleAlignmentChange","newAlignment","handleColorChange","handleFontFamilyChange","handleFontSizeChange","handleLineHeightChange","String","family","v","FormatBoldIcon","FormatItalicIcon","FormatUnderlinedIcon","startAdornment","InputAdornment","ColorLensIcon","borderOptions","ButtonControls","ColorPickerInput","Android12Switch","Switch","encodeURIComponent","getContrastText","main","borderStyles","BorderControl","isBordered","disableWidth","disableStyle","disableColor","disableCollapse","disableRadius","initiateStyles","borderCollapse","container","labelPlacement","wd","ImageControls","inputProps","objectFit","DividerControls","borderWidth","Accordion","MuiAccordion","disableGutters","square","divider","textAlignOptions","fontWeightOptions","fontFamilyOptions","TableControls","tableData","setTableData","setParentRowLevel","levelType","relation_table","tabValue","setTabValue","expanded","setExpanded","autoPopulateEnabled","setAutoPopulateEnabled","mergeDialogOpen","setMergeDialogOpen","selectedCells","setSelectedCells","mergeValue","setMergeValue","rowLevel","setRowLevel","tPlaceholders","selectedTable","setSelectedTable","customText","setCustomText","rowPlaceholders","setRowPlaceholders","mergedCells","isUpdating","setIsUpdating","tableAttributes","tableId","dataKey","getAttributes","tableStyles","setTableStyles","populateRowsWithPlaceholders","getPlaceholderValue","placeholderKey","actualValue","toLocaleDateString","toLocaleString","rowIndex","updatedRow","staticText","getCellMergeInfo","colIndex","merge","m","rowStart","rowEnd","colStart","colEnd","isTopLeft","isCovered","isCellSelected","cell","col","toggleCellSelection","cellKey","getPlaceholderInfo","description","handleAccordionChange","panel","isExpanded","updateHeaderStyle","updateBodyStyle","resetTable","fromEntries","columnsWithPlaceholders","updated","endsWith","originalColumnId","staticValue","paddingBottom","Tabs","Tab","RefreshIcon","updateColumnHeader","newHeader","flex","columnIndex","removed","updatedPlaceholders","removeColumn","newColumnId","existingIds","counter","generateColumnId","newColumn","AddIcon","my","newRow","updatedRows","addRow","SearchableSelect","replaceAll","removeRow","hasPlaceholder","placeholderInfo","mergeInfo","updateRowCellValue","updateCellValue","Alert","severity","currentPlaceholder","placeholderValue","newCellValue","updateColumnPlaceholder","renderOption","noOptionsText","borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius","AccordionSummary","expandIcon","ExpandMoreIcon","AccordionDetails","updateTableStyle","parseInt","_e","_f","font","_g","align","_h","updateHeaderCellStyle","_i","zebraStriping","_j","_k","alternateRowColor","_l","_m","_n","_o","_p","_q","_r","updateBodyCellStyle","firstCell","firstCellValue","customTextValue","initialMergeValue","MergeIcon","Table","TableHead","TableRow","cellContent","rowSpan","colSpan","TableCell","TableBody","mergeIndex","updatedColumns","splitMergedCell","Dialog","_s","c","_t","rowIndices","colIndices","expectedCells","existing","newMerge","SignatureControls","CodeControls","sectionTypes","SectionFormatPanel","col1","col2","col3","isInitialLoad","setIsInitialLoad","selectedContentAttrObj","setSelectedContentAttrObj","extractedTableData","extractTableDataFromHTML","querySelector","headerRows","bodyRows","headerCells","th","cells","rowData","generateContent","eStyles","imgInlineStyles","headerCellsHTML","mergeAttributes","cellValue","tableRowsHTML","rowTemplate","cellTemplate","rowStyleTemplate","rowStyleAddition","cellsHTML","finalCellValue","test","nodeType","Node","ELEMENT_NODE","existingStyle","existingProps","newStyleProps","mergedProps","mergedStyle","setAttribute","saveSection","updatedSection","sectionRest","updatedContent","sm","lg","pb","overflowY","dt","handleTypeChange","convertedRow","newTableData","StyledListItem","ListItem","grey","DropzoneBox","SidebarItem","imageUrl","marginRight","ListItemIcon","ListItemText","primaryTypographyProps","EditorSidebar","onHtmlUpload","uploadedImages","setUploadedImages","uploading","setUploading","uploadingHtml","setUploadingHtml","setError","onDrop","async","acceptedFiles","uFiles","uploadFiles","token","getToken","path","is_private","is_directory","file_size","is_child","file_extension","mime_type","getApiConfig","s3BucketUrl","postV1Drive","err","getRootProps","getInputProps","isDragActive","useDropzone","accept","multiple","onHtmlDrop","reader","FileReader","onload","onerror","readAsText","getHtmlRootProps","getHtmlInputProps","isHtmlDragActive","maxFiles","FileCode","CircularProgress","TextIcon","Heading","ImageIcon","TableIcon","SignatureIcon","QrCodeIcon","BarcodeIcon","response","getV1Drive","skip","filters","files","drive","log","getDriveFiles","borderRight","SearchBar","flexGrow","minHeight","CANVAS_TYPES","EditorCanvas","activeId","selectedSection","onSelectSection","onUpdateSection","onSplitSection","onDeleteSection","onApplyHtmlEdit","onCancelHtmlEdit","isFromPreview","formattedPlaceholders","setMainCanvasRef","setHeaderCanvasRef","setFooterCanvasRef","selectedSectionData","dropTarget","setDropTarget","canvasType","isDraggingFromSidebar","setIsDraggingFromSidebar","isSectionEditing","htmlEditValue","setHtmlEditValue","lastUpdateTimeRef","lastPositionRef","activeIdRef","mainCanvasRef","headerCanvasRef","footerCanvasRef","getTargetSections","updateDropTarget","handleMouseMove","dx","clientX","dy","clientY","sqrt","sectionElement","elementsFromPoint","el","hasAttribute","targetSections","sectionId","sectionCanvasType","rect","getBoundingClientRect","relativeY","relativeX","sectionHeight","sectionWidth","renderSectionsForCanvas","canvasSections","processedGroups","renderDropIndicator","isHorizontal","animation","splitSections","splitRow","splitSection","EditorSection","extra","content1","content2","renderedMainSections","renderedHeaderSections","renderedFooterSections","renderCanvas","renderedSections","setCanvasRef","onMouseMove","Container","CheckIcon","spellCheck","outline","resize","boxSizing","tabSize","transformOrigin","flexShrink","alignSelf","TemplateNameModal","onSaveSuccess","onSaveError","parentIsSaving","handleSubmit","setValue","useForm","resolver","yupResolver","template_name","navigate","useNavigate","isSubmitting","setIsSubmitting","onSubmit","patchV1TemplatesId","postV1Templates","status_code","form","SectionFlowEditor","template_id","useParams","locationState","useLocation","setSections","setHeaderSections","setFooterSections","setActiveId","setEditMode","setFromPreview","setSelectedSection","overSection","setOverSection","setPreview","setEditHtml","setPlaceholders","activeCanvas","setActiveCanvas","setPayload","headerFooterId","setHeaderFooterId","setRelationTable","setTemplateData","setIsSaving","savedSnapshot","setSavedSnapshot","setZoom","history","setHistory","past","future","memoizedPlaceholders","saveToHistory","handleUndo","previous","newPast","handleRedo","next","newFuture","handleKeyDown","ctrlKey","metaKey","shiftKey","preventDefault","addEventListener","removeEventListener","createNewSection","idPrefix","uuidv4","handleDragStart","active","handleDragOver","over","handleDragEnd","setTargetSections","newSection","overIndex","newSections","splice","targetSection","updatedSections","sourceSections","sourceSetSections","cleanActiveId","oldIndex","newIndex","movedSection","groupSections","cleaned","originalSection","newSourceSections","newTargetSections","getRelevantSections","getRelevantSetSections","updateSectionImmediate","relevantSections","relevantSetSections","cleanId","handleUpdateSectionDebounced","handleUpdateSection","handleSplitSection","sectionPrefix","newWidth","initialWidth","handleDeleteSection","sectionToDelete","remainingSection","isViewOnly","getElementsByTagName","marginTop","removeAttribute","subjRes","getV1SubjectsId","resource","token2","fRes","getV1FormBuilderRelationalSchemaFieldsName","schemaFields","relational_fields","updatedFields","is_inner_join","alias","arrayRelationTables","objectRelationFields","updatedTableFields","updatedField","templateKey","tableFields","differenceWith","fieldA","fieldB","joinKey","f","allFields","n","uniqueAllFields","uniqBy","token3","res","getV1TemplatesId","mainSecs","company_id","token4","getV1TemplateHeaderFooterCompanyIdHeaderFooter","resData","header_sections","footer_sections","headerSecs","footerSecs","handleApplyHtmlEdit","handleCancelHtmlEdit","mainHtml","subject_id","is_default","contents","getErrorMessage","handleSaveHeaderFooter","combinedHtml","convertSectionForApi","convertedHeaderSections","convertedFooterSections","token5","patchV1TemplateHeaderFooterId","token6","postV1TemplateHeaderFooter","toggleHeaderFooterEditing","handleSaveSuccess","handleSaveError","DndContext","onDragStart","onDragOver","onDragEnd","collisionDetection","pointerWithin","AddTemplate","HtmlThumbnailPreview","template","scale","showControls","selectedTemplateId","isFetching","minScale","maxScale","scaleStep","loadingDelay","refreshDelay","normalView","isLoading","setIsLoading","currentScale","setCurrentScale","containerRef","loadingTimeoutRef","refreshTimeoutRef","scaledWidth","scaledHeight","handleZoomIn","handleZoomOut","handleRefresh","handleDelete","canZoomIn","canZoomOut","canDelete","userSelect","pt","tableLayout","backdropFilter","round","arrow","Refresh","HtmlThumbnailPreviewFull","containerPixelWidth","setContainerPixelWidth","updateWidth","offsetWidth","marginInline","marginBlock","TemplateModal","companies","source","templates","setTemplates","selectedTemplate","setSelectedTemplate","defaultTemplate","setDefaultTemplate","setLoding","selectedCompany","setSelectedCompany","templateToDelete","setTemplateToDelete","selectedTemplateForPreview","setSelectedTemplateForPreview","getTemplatesViaSubject","getV1Templates","dTemplate","scrollbarWidth","msOverflowStyle","justifyItems","handleTemplateSelect","borderTop","patchV1TemplatesIdSetDefault","handleDefaultTemplate","ConfirmPopUp","onConfirm","deleteV1TemplatesId","handleDeleteTemplate","CompanySelectionModal","Templates","useTranslation","activePage","aPage","updatePageInfo","generatedColumns","updateGeneratedColumns","usePages","useDeepMemo","actionAnchorEl","setActionAnchorEl","viewEmails","localStorage","getItem","actionBarData","setActionBarData","actionBarActiveTab","setActionBarActiveTab","viewTypes","TABLE","totalCount","setRows","selectedRow","setSelectedRow","showTemplateModal","setShowTemplateModal","templateModalSource","setTemplateModalSource","showCompanySelectionModal","setShowCompanySelectionModal","setCompanies","pLimit","page_size","total","ceil","permissions","usePermissions","SubjectPermissions","Subjects","canAdd","canEdit","rowActionMenu","handleAction","handleNewEmail","getEmails","sort","filterQueryString","searchFiters","types","uFilters","appendConditionSafely","getV1Subjects","order","desc","pagination","tableRows","tableColumns","transformTableColumns","currencySymbol","original","currency_data","symbol","defaultCurrencySymbol","translationFn","enableFooter","statusClasses","cleanUp","companiesArr","fetchApi","apiKey","getCopmanies","setItem","ActionBar","setData","setActive","disabledViews","GRID","selectedIds","button","MaterialTable","totalPages","orderKeys","states","onSortingChange","enableColumnDragging","enableEditing","onSelectRow","r","enableAddCustomField","isResetRow","handleColumnOrdering","colOrder","onColumnVisibility","showPreview","handlePreview","GridCard","Fallback","heading","subHeading","logo","invoiceFallback","Footer","handlePaginationModel","toast","setToast","showPassword","setShowPassword","changePassword","useAuth","appLogo","erp_logo","LoginLeftSiteImage","Pathname","LOGIN","htmlColor","onIconClick","Toast","anchorOrigin","horizontal","vertical","autoHideDuration","paddingLeft","paddingRight","Remove","endAdornment","ml","dispatch","useAppDispatch","useAppSelector","reValidateMode","update","insert","useFieldArray","updateSection","selectedHoc","activeSection","setActiveSection","formJSON","setFormJSON","positionEditedElement","setPositionEditedElement","sectionFormJSON","setSectionFormJSON","sectionJSON","setSectionJSON","sectionPositionEditedElement","setSectionPositionEditedElement","removeSectionActionPerformed","setRemoveSectionActionPerformed","removeSectionMembersPerformed","setRemoveSectionMembersPerformed","removeSectionPosition","setRemoveSectionPosition","initialLoading","setInitialLoading","setActiveTabValue","modifyAccordion","setModifyAccordion","previewFieldsData","setPreviewFields","setFormParserMethods","pathname","pickPropertyEditForm","normalizedType","formGroups","commonTextProps","commonSelectProps","handleSectionPropertyValueUpdate","addNewSection","newSectionIndex","sectionData","handleAddTab","formWithMembers","sectionIndex","section_order","hasSystemMembers","is_system_field","shouldRemoveTab","newTab","remove_tab","prevTabs","handleEditTabTitle","tabId","newTitle","handleRemoveTab","reorderedTabs","membersList","elementPositionIndex","dataset","positionIndex","elementDetails","handleSectionSelection","sectionPositionIndex","sectionDetails","handleAddMember","otherProperties","newMember","floor","DEFAULT_GRID_COLUMNS","overrideValue","updatedValue","newCustomWidth","prevData","elementPerColumn","numberValue","elementJSONCopy","uniqueId","copyOfUpdatedElement","section_form_id","is_form_switcher_section","column_width","handleRemoveSection","membersToRemove","reverse","memberIndex","handleMakeAccordion","copyOfSection","handleTabData","activeTabIndex","updatedTabsData","previewState","previewFields","formBuilderConversion","hidePreview","handleFormUpdate","structuredClone","cloneError","formBuilderConversionResult","conversionError","updatePayload","gridCol","updateRes","patchFormDataById","meta","requestStatus","copyOfMember","breadCrumbPath","link","formatLabel","isSuccess","isError","copyOfUpdatedFormJson","updatedFormJSON","handleFormData","getFormDataById","getFieldsByFormId","hasValidContent","EmptyStateMessage","getFieldTypeWithFallback","json","memoizedForm","field_properties","ErpLoader","DndProvider","backend","HTML5Backend","FormHeader","FormParser","handleFormSubmit","getFormMethods","methods","background","TabBar","onEditTabTitle","activeValue","setActiveValue","handleTabChange","containerProps","isFormSwitcher","switchForms","formMembers","DynamicSectionHOC","handleAccordion","handleAddButton","forgotPassword","autoPlay","muted","loop","playsInline","store","updatedCol","enableSorting","muiEditTextFieldProps","DefaultAggregation","updateData","columnDef","updatedPages","setCurrentPage","page","Loader","Outlet","Navigate","resetPassword","searchParams","useSearchParams","tokenParam","get","isValid","CHANGE_PASSWORD","comments","dateTime","activities","cards","status","amount","role","address","about","serializedFormData","roleId"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"default-data-Dsjlvwev.js","sources":["../../src/components/material-table/components/number-aggregation.tsx","../../src/views/404.tsx","../../src/views/privateRoute.tsx","../../src/views/afterAuth/page-view/redux/actionCreator.ts","../../src/views/afterAuth/page-view/utils/default-data.ts","../../src/views/afterAuth/page-view/utils/local-data.ts","../../src/views/afterAuth/page-view/redux/state.ts","../../src/views/afterAuth/page-view/redux/reducer.ts","../../src/views/beforeAuth/change-password/change-password.tsx","../../src/views/beforeAuth/components/calendar-data/calendar-data.ts","../../src/views/beforeAuth/components/grid-data/grid-data.ts","../../src/views/beforeAuth/components/list-content/column-raw.tsx","../../src/views/form-builder/field_properties.ts","../../src/views/form-builder/element-edit-forms/field-select.tsx","../../src/views/form-builder/element-edit-forms/text.tsx","../../src/views/form-builder/element-edit-forms/select.tsx","../../src/views/form-builder/element-edit-forms/section.tsx","../../src/views/form-builder/element-edit-forms/checkbox.tsx","../../src/views/form-builder/element-edit-forms/table-form.tsx","../../src/views/form-builder/form-fields.tsx","../../src/views/form-builder/utils/common.ts","../../src/views/form-builder/custom-form.tsx","../../src/views/template-editor/services/CSSScopingService.ts","../../src/views/template-editor/utils/common.ts","../../src/views/template-editor/components/EditorHeader.tsx","../../src/views/template-editor/edit-section-modal/edit-section-modal.tsx","../../src/views/template-editor/utils/style-extractor.ts","../../src/views/template-editor/hooks/useDebouncedUpdate.ts","../../src/views/template-editor/components/EditorSection.tsx","../../src/views/template-editor/components/controllers/AlignmentControl.tsx","../../src/views/template-editor/components/controllers/TextControls.tsx","../../src/views/template-editor/components/controllers/ButtonControls.tsx","../../src/views/template-editor/components/controllers/border-control.tsx","../../src/views/template-editor/components/controllers/ImageControls.tsx","../../src/views/template-editor/components/controllers/DividerControls.tsx","../../src/views/template-editor/components/controllers/TableControls.tsx","../../src/views/template-editor/components/controllers/SignatureControls.tsx","../../src/views/template-editor/components/controllers/CodeControls.tsx","../../src/views/template-editor/components/SectionFormatPanel.tsx","../../src/views/template-editor/components/EditorSidebar.tsx","../../src/views/template-editor/components/EditorCanvas.tsx","../../src/views/template-editor/template-name-modal/template-name-modal.tsx","../../src/views/template-editor/components/SectionFlowEditor.tsx","../../src/views/template-editor/add-template/add-template.tsx","../../src/views/template-editor/template-modal/html-thumbnail-preview.tsx","../../src/views/template-editor/template-modal/html-thumbnail-preview-full.tsx","../../src/views/template-editor/template-modal/template-modal.tsx","../../src/views/template-editor/company-selection-modal/company-selection-modal.tsx","../../src/views/template-editor/templates.tsx","../../src/views/form-builder/element-edit-forms/column-width.tsx","../../src/views/beforeAuth/forgot-password/forgot-password.tsx","../../src/views/beforeAuth/landing/landing.tsx","../../src/views/afterAuth/page-view/page-view.tsx","../../src/views/beforeAuth/reset-password/reset-password.tsx","../../src/views/beforeAuth/components/activity-tag-data/activity-tag-data.ts","../../src/views/beforeAuth/components/kanbann-content/kanbann-raw.ts","../../src/views/template-editor/utils/default-data.ts","../../src/views/beforeAuth/components/multiline-data/multiline-data.ts","../../src/views/beforeAuth/components/list-content/list-data.tsx","../../src/views/beforeAuth/components/tabs-data/tabs-data.ts","../../src/views/template-editor/routes.tsx","../../src/views/beforeAuth/components/user-dropdown-data/user-dropdown-data.ts"],"sourcesContent":["import React, { useEffect } from \"react\";\nimport { aggregationFns } from \"../aggregation-fns\";\nimport Typography from \"../../typography/typography\";\nimport { MenuItem } from \"@mui/material\";\nimport Menu from \"../../menu/menu\";\nimport { MRT_RowData } from \"material-react-table\";\n\ntype aggregationType =\n | \"none\"\n | \"avg\"\n | \"min\"\n | \"max\"\n | \"count_empty\"\n | \"count_full\"\n | \"sum\"\n | \"percentage_empty\"\n | \"percentage_full\";\n\ninterface IAggregation {\n label: string;\n value: aggregationType;\n}\n\nconst allAggregations: IAggregation[] = [\n {\n label: \"Average\",\n value: \"avg\",\n },\n {\n label: \"Sum\",\n value: \"sum\",\n },\n {\n label: \"Min\",\n value: \"min\",\n },\n {\n label: \"Max\",\n value: \"max\",\n },\n {\n label: \"Count Empty\",\n value: \"count_empty\",\n },\n {\n label: \"Count Full\",\n value: \"count_full\",\n },\n {\n label: \"Percentage Full\",\n value: \"percentage_full\",\n },\n {\n label: \"Percentage Empty\",\n value: \"percentage_empty\",\n },\n {\n label: \"None\",\n value: \"none\",\n },\n];\n\nconst nonNumberAggregations: IAggregation[] = [\n {\n label: \"Count Empty\",\n value: \"count_empty\",\n },\n {\n label: \"Count Full\",\n value: \"count_full\",\n },\n {\n label: \"Percentage Full\",\n value: \"percentage_full\",\n },\n {\n label: \"Percentage Empty\",\n value: \"percentage_empty\",\n },\n {\n label: \"None\",\n value: \"none\",\n },\n];\n\nconst aggregationFnsLookup = {\n avg: aggregationFns.average,\n sum: aggregationFns.sum,\n max: aggregationFns.max,\n count_empty: aggregationFns.countEmpty,\n count_full: aggregationFns.countFull,\n percentage_empty: aggregationFns.percentageEmpty,\n percentage_full: aggregationFns.percentageFull,\n min: aggregationFns.min,\n none: aggregationFns.none,\n};\n\ninterface INumberAggregation {\n data: MRT_RowData[];\n column: string;\n type?: string;\n}\n\nconst NumberAggregation = ({ data, column, type }: INumberAggregation) => {\n const [selectedType, setSelectedType] =\n React.useState<aggregationType>(\"none\");\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const [calculatedValue, setCalculatedValue] = React.useState<string | null>();\n const open = Boolean(anchorEl);\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const handleAggregationType = (val: aggregationType) => {\n setSelectedType(val);\n handleClose();\n };\n\n useEffect(() => {\n const func = aggregationFnsLookup[selectedType];\n setCalculatedValue(func(data, column));\n }, [selectedType, column, data]);\n\n const aggregations =\n type === \"number\" ? allAggregations : nonNumberAggregations;\n\n return (\n <>\n <Typography\n onClick={handleClick}\n sx={{ cursor: \"pointer\" }}\n type=\"s4\"\n weight=\"normal\"\n color={calculatedValue ? \"theme.secondary.1000\" : \"theme.secondary.500\"}\n >\n {calculatedValue || \"+ Add Calculation\"}\n </Typography>\n <Menu\n id=\"basic-menu\"\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n >\n {aggregations?.map((aggr) => (\n <MenuItem\n key={aggr.value}\n selected={selectedType == aggr?.value}\n onClick={() => handleAggregationType(aggr?.value)}\n >\n <Typography color=\"theme.secondary.1000\" type=\"s4\">\n {aggr?.label}\n </Typography>\n </MenuItem>\n ))}\n </Menu>\n </>\n );\n};\n\nexport { NumberAggregation };\nexport default NumberAggregation;\n","import { Component } from \"react\";\r\n\r\nclass NotFound extends Component {\r\n componentDidMount() {\r\n setTimeout(() => {\r\n // this.props.history.push('/');\r\n }, 2000);\r\n }\r\n\r\n render() {\r\n return (\r\n <div\r\n style={{\r\n textAlign: \"center\",\r\n position: \"absolute\",\r\n top: \"50%\",\r\n left: \"50%\",\r\n transform: \"translate(-50%, -50%)\",\r\n }}\r\n >\r\n <strong>\r\n <p>404</p>\r\n </strong>\r\n <hr />\r\n <p>Not Found</p>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default NotFound;\r\n","import React from \"react\";\r\nimport { Navigate, Outlet } from \"react-router-dom\";\r\n\r\nimport { Pathname } from \"../constants/pathnames/pathname\";\r\nimport { useAuth } from \"../hooks/useAuth\";\r\nimport Loader from \"../components/loader\";\r\n\r\nexport const PrivateRoute = () => {\r\n const { user, loading } = useAuth();\r\n\r\n return loading ? (\r\n <Loader />\r\n ) : user ? (\r\n <Outlet />\r\n ) : (\r\n <Navigate to={Pathname.LOGIN} />\r\n );\r\n};\r\n\r\nexport default PrivateRoute;\r\n","import { createAsyncThunk } from \"@reduxjs/toolkit\";\r\n\r\nexport const fetchPage = createAsyncThunk(\r\n \"pageView/fetchPage\",\r\n (pageId: number, { getState }) => {\r\n const { pages }: any = getState();\r\n const { data } = pages.pages.find((p: any) => p?.value === pageId);\r\n return data;\r\n },\r\n);\r\n","const rows = [\r\n {\r\n name: \"John\",\r\n age: 30,\r\n gender: \"Male\",\r\n company: \"NASA\",\r\n location: \"USA\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n];\r\n\r\nconst columns = [\r\n {\r\n header: \"Name\",\r\n type: \"string\",\r\n accessorKey: \"name\",\r\n },\r\n {\r\n type: \"number\",\r\n header: \"Age\",\r\n accessorKey: \"age\",\r\n },\r\n {\r\n header: \"Gender\",\r\n type: \"string\",\r\n accessorKey: \"gender\",\r\n },\r\n {\r\n header: \"Company\",\r\n type: \"string\",\r\n accessorKey: \"company\",\r\n },\r\n {\r\n header: \"Location\",\r\n type: \"string\",\r\n accessorKey: \"location\", //simple recommended way to define a column\r\n },\r\n {\r\n header: \"Price\",\r\n type: \"number\",\r\n accessorKey: \"price\",\r\n },\r\n];\r\n\r\nconst columnOrder = [\"name\", \"age\", \"gender\", \"company\", \"location\", \"price\"];\r\n\r\nexport const defaultData = { rows, columns, columnOrder };\r\n","const rows = [\r\n {\r\n name: \"John\",\r\n age: 30,\r\n gender: \"Male\",\r\n company: \"NASA\",\r\n location: \"USA\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n {\r\n name: \"Sara\",\r\n age: 35,\r\n gender: \"Female\",\r\n company: \"SpaceX\",\r\n location: \"Russia\",\r\n price: 10000,\r\n },\r\n];\r\n\r\nconst columns = [\r\n {\r\n type: \"number\",\r\n header: \"Age\",\r\n accessorKey: \"age\",\r\n },\r\n {\r\n header: \"Gender\",\r\n type: \"string\",\r\n accessorKey: \"gender\",\r\n },\r\n {\r\n header: \"Company\",\r\n type: \"string\",\r\n accessorKey: \"company\",\r\n },\r\n {\r\n header: \"Name\",\r\n type: \"string\",\r\n accessorKey: \"name\",\r\n },\r\n {\r\n header: \"Location\",\r\n type: \"string\",\r\n accessorKey: \"location\", //simple recommended way to define a column\r\n },\r\n {\r\n header: \"Price\",\r\n type: \"number\",\r\n accessorKey: \"price\",\r\n },\r\n];\r\n\r\nconst columnOrder = [\"age\", \"gender\", \"company\", \"name\", \"location\", \"price\"];\r\n\r\nexport const local = { rows, columns, columnOrder };\r\n","import { defaultData } from \"../utils/default-data\";\r\nimport { local } from \"../utils/local-data\";\r\n\r\nexport const state = {\r\n currentPage: 1,\r\n rows: [],\r\n columns: [],\r\n columnOrder: [],\r\n loading: true,\r\n error: \"\",\r\n pages: [\r\n {\r\n name: \"Default\",\r\n _id: 1,\r\n data: defaultData,\r\n },\r\n {\r\n name: \"Local\",\r\n _id: 2,\r\n data: local,\r\n },\r\n ],\r\n paginationModel: {\r\n pageNo: 1,\r\n limit: 10,\r\n },\r\n};\r\n\r\nexport default state;\r\n","import { createSlice } from \"@reduxjs/toolkit\";\r\nimport initialState from \"./state\";\r\n\r\nimport { fetchPage } from \"./actionCreator\";\r\n\r\nexport const pageViewSlice = createSlice({\r\n name: \"pageView\",\r\n initialState,\r\n reducers: {\r\n changeCurrentPage(state, action) {\r\n state.currentPage = action.payload;\r\n },\r\n setPages(state, action) {\r\n state.pages = action.payload;\r\n },\r\n setPaginationModel(state, action) {\r\n state.paginationModel = action.payload;\r\n },\r\n setColumnOrder(state, action) {\r\n state.columnOrder = action.payload;\r\n },\r\n setRowData(state, { payload }) {\r\n const rows = JSON.parse(JSON.stringify(state.rows));\r\n const row = rows[payload.rowId];\r\n row[payload.columnId] = payload.value;\r\n state.rows = rows;\r\n },\r\n },\r\n extraReducers: (builder) => {\r\n builder.addCase(fetchPage.pending, (state) => {\r\n state.loading = true;\r\n });\r\n builder.addCase(fetchPage.fulfilled, (state, action) => {\r\n state.loading = false;\r\n state.error = \"\";\r\n state.rows = action.payload.rows;\r\n state.columns = action.payload.columns;\r\n state.columnOrder = action.payload.columnOrder;\r\n });\r\n builder.addCase(fetchPage.rejected, (state) => {\r\n state.loading = false;\r\n state.rows = [];\r\n state.columns = [];\r\n state.error = \"Unable to get data\";\r\n });\r\n },\r\n});\r\n\r\nconst {\r\n changeCurrentPage: pageViewChangeCurrentPage,\r\n setPages: setPageViewPages,\r\n setPaginationModel: setPageViewPaginationModel,\r\n setColumnOrder,\r\n setRowData,\r\n} = pageViewSlice.actions;\r\n\r\nexport {\r\n pageViewChangeCurrentPage,\r\n setPageViewPages,\r\n setPageViewPaginationModel,\r\n setColumnOrder,\r\n setRowData,\r\n};\r\n\r\nexport default pageViewSlice.reducer;\r\n","import { useState } from \"react\";\r\n// import { useNavigate } from \"react-router-dom\";\r\nimport { Pathname } from \"../../../constants/pathnames/pathname\";\r\nimport { Box, Grid, styled } from \"@mui/material\";\r\n// import { styled } from \"@mui/material/styles\";\r\nimport images from \"../../../assets/images\";\r\nimport DynamicInput from \"../../../components/form-control/form-builder/form-builder-element/text\";\r\nimport { useForm } from \"react-hook-form\";\r\nimport Typography from \"../../../components/typography/typography\";\r\nimport Button from \"../../../components/button/button\";\r\n// import DynamicCheckBox from \"../../../components/form-control/form-builder/form-builder-element/checkbox\";\r\nimport { Eye, EyeOff } from \"../../../components/icons\";\r\nimport { LoginFormValues } from \"../../../contexts/AuthContext\";\r\n// import { useAuth } from \"../../../hooks/useAuth\";\r\nimport Toast from \"../../../components/toast/toast\";\r\nimport * as Yup from \"yup\";\r\nimport { yupResolver } from \"@hookform/resolvers/yup\";\r\nimport { useAuth } from \"../../../hooks/useAuth\";\r\nimport { useLocation, useNavigate } from \"react-router-dom\";\r\nimport { getApiConfig } from \"@/utils\";\r\n\r\n\r\nconst LoginContainer = styled(Grid)(() => ({\r\n height: \"100vh\",\r\n }));\r\n \r\n const LeftGrid = styled(Grid)(({ theme }) => ({\r\n [theme.breakpoints.down(\"sm\")]: {\r\n display: \"none\",\r\n },\r\n backgroundImage: `url(${images.login.LoginLeftBg})`,\r\n backgroundRepeat: \"no-repeat\",\r\n backgroundSize: \"cover\",\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n [theme.breakpoints.down(\"lg\")]: {\r\n \"& img\": {\r\n width: 350,\r\n height: 350,\r\n },\r\n },\r\n [theme.breakpoints.down(\"md\")]: {\r\n \"& img\": {\r\n width: 300,\r\n height: 300,\r\n },\r\n },\r\n }));\r\n \r\n const RightGrid = styled(Grid)(() => ({\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n padding: \"1rem\",\r\n }));\r\n\r\n const FlexBox = styled(Box)(() => ({\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n }));\r\n\r\n interface FormValeus {\r\n login: LoginFormValues;\r\n }\r\n\r\n const validationSchema = Yup.object({\r\n login: Yup.object({\r\n password: Yup.string()\r\n .required(\"Please enter password\")\r\n .min(8, \"Password must be at least 8 characters\")\r\n .matches(/[A-Z]/, \"Password must contain at least one uppercase letter\")\r\n .matches(/[!@#$%^&*(),.?\":{}|<>]/, \"Password must contain at least one special character\"),\r\n confirm_password: Yup.string().required(\"Please enter confirm password\").oneOf([Yup.ref('password')], \"Passwords must match\"),\r\n }),\r\n });\r\n\r\nexport const ChangePassword = () => {\r\n\r\n const { control, handleSubmit } = useForm<FormValeus>({\r\n resolver: yupResolver(validationSchema),\r\n mode: \"all\",\r\n });\r\n const [toast, setToast] = useState<IToast | null>(null);\r\n\r\n const [showPassword, setShowPassword] = useState<boolean>(false);\r\n const handleShowPassword = () => setShowPassword(!showPassword);\r\n const { changePassword } = useAuth();\r\n const location = useLocation();\r\n const navigate = useNavigate();\r\n\r\n const onSubmit = async (values: FormValeus) => {\r\n const token = location.state?.token;\r\n if (!token) {\r\n setToast({ message: 'Token missing', type: \"alert\" });\r\n return;\r\n } else {\r\n values.login.token = token;\r\n await changePassword(values.login, () => {\r\n setToast({ message: 'Password changed successfully', type: \"normal\" });\r\n setTimeout(() => {\r\n navigate(Pathname.LOGIN);\r\n }, 2000);\r\n });\r\n return values;\r\n }\r\n };\r\n\r\n const appLogo = getApiConfig().appLogo || images.erp_logo\r\n\r\n\r\n return (\r\n <Box>\r\n <LoginContainer container>\r\n <LeftGrid item sm={6}>\r\n <img src={images.login.LoginLeftSiteImage} />\r\n </LeftGrid>\r\n <RightGrid item sm={6} xs={12}>\r\n <FlexBox\r\n display=\"flex\"\r\n flexDirection=\"column\"\r\n gap={4}\r\n sx={(theme) => ({\r\n minWidth: 400,\r\n [theme.breakpoints.down(\"md\")]: {\r\n minWidth: 300,\r\n },\r\n [theme.breakpoints.down(\"sm\")]: {\r\n minWidth: 300,\r\n },\r\n })}\r\n >\r\n <Box textAlign=\"center\">\r\n <img src={appLogo} width={160} height={55}/>\r\n </Box>\r\n <form onSubmit={handleSubmit(onSubmit)}>\r\n <FlexBox gap={4}>\r\n <FlexBox gap={3}>\r\n <Box>\r\n <Typography\r\n align=\"center\"\r\n type=\"h1\"\r\n weight=\"medium\"\r\n color=\"theme.secondary.1000\"\r\n >\r\n Change Password\r\n </Typography>\r\n <Typography\r\n align=\"center\"\r\n type=\"h5\"\r\n weight=\"normal\"\r\n color=\"theme.secondary81000\"\r\n >\r\n Enter Details below\r\n </Typography>\r\n </Box>\r\n <FlexBox gap={2}>\r\n <Box>\r\n <DynamicInput\r\n formControl={control}\r\n label=\"Password\"\r\n name=\"password\"\r\n type={\"password\"}\r\n placeholder=\"Enter Password\"\r\n fieldArrayName=\"login\"\r\n />\r\n </Box>\r\n <Box>\r\n <DynamicInput\r\n formControl={control}\r\n label=\"Confirm Password\"\r\n name=\"confirm_password\"\r\n type={showPassword ? \"text\" : \"password\"}\r\n fieldArrayName=\"login\"\r\n endIcon={\r\n <>\r\n {showPassword ? (\r\n <Eye fontSize=\"small\" htmlColor=\"#292D32\" />\r\n ) : (\r\n <EyeOff fontSize=\"small\" htmlColor=\"#292D32\" />\r\n )}\r\n </>\r\n }\r\n onIconClick={handleShowPassword}\r\n placeholder=\"Enter confirm password\"\r\n />\r\n </Box>\r\n </FlexBox>\r\n </FlexBox>\r\n <FlexBox gap={2}>\r\n <Button type=\"submit\" size=\"large\" variant=\"contained\">\r\n Change Password\r\n </Button>\r\n </FlexBox>\r\n </FlexBox>\r\n </form>\r\n </FlexBox>\r\n </RightGrid>\r\n </LoginContainer>\r\n <Toast\r\n open={Boolean(toast)}\r\n message={toast?.message}\r\n type={toast?.type}\r\n handleClose={() => setToast(null)}\r\n anchorOrigin={{ horizontal: \"right\", vertical: \"bottom\" }}\r\n autoHideDuration={3000}\r\n />\r\n </Box>\r\n );\r\n};","// export const calendarData = {\r\n// events: [\r\n// { id: 1, title: \"event 1\", date: \"2019-12-01\" },\r\n// {\r\n// title: \"event 2\",\r\n// start: \"2019-12-01\",\r\n// end: \"2019-12-05\",\r\n// allDay: true,\r\n// HostName: \"William\",\r\n// },\r\n// {\r\n// title: \"event 3\",\r\n// start: \"2019-12-05\",\r\n// end: \"2019-12-07\",\r\n// allDay: true,\r\n// },\r\n// {\r\n// title: \"event 4\",\r\n// start: \"2019-12-05\",\r\n// end: \"2019-12-07\",\r\n// allDay: true,\r\n// },\r\n// {\r\n// title: \"event 5\",\r\n// start: \"2019-12-05\",\r\n// end: \"2019-12-07\",\r\n// allDay: true,\r\n// },\r\n// {\r\n// title: \"event 6\",\r\n// start: \"2019-12-05\",\r\n// end: \"2019-12-07\",\r\n// allDay: true,\r\n// },\r\n// ],\r\n// };\r\n\r\nexport const calendarData = {\r\n events: [\r\n { title: \"All Day Event\", start: getDate(\"YEAR-MONTH-01\") },\r\n {\r\n title: \"Long Event\",\r\n start: getDate(\"YEAR-MONTH-07\"),\r\n end: getDate(\"YEAR-MONTH-10\"),\r\n // allDay: true,\r\n // HostName: \"William\",\r\n },\r\n {\r\n groupId: \"999\",\r\n title: \"Repeating Event\",\r\n start: getDate(\"YEAR-MONTH-09T16:00:00+00:00\"),\r\n },\r\n {\r\n groupId: \"999\",\r\n title: \"Repeating Event\",\r\n start: getDate(\"YEAR-MONTH-16T16:00:00+00:00\"),\r\n },\r\n {\r\n title: \"Conference\",\r\n start: \"YEAR-MONTH-17\",\r\n end: getDate(\"YEAR-MONTH-19\"),\r\n },\r\n {\r\n title: \"Meeting\",\r\n start: getDate(\"YEAR-MONTH-18T10:30:00+00:00\"),\r\n end: getDate(\"YEAR-MONTH-18T12:30:00+00:00\"),\r\n },\r\n { title: \"Lunch\", start: getDate(\"YEAR-MONTH-18T12:00:00+00:00\") },\r\n { title: \"Birthday Party\", start: getDate(\"YEAR-MONTH-19T07:00:00+00:00\") },\r\n { title: \"Meeting\", start: getDate(\"YEAR-MONTH-18T14:30:00+00:00\") },\r\n { title: \"Happy Hour\", start: getDate(\"YEAR-MONTH-18T17:30:00+00:00\") },\r\n { title: \"Dinner\", start: getDate(\"YEAR-MONTH-18T20:00:00+00:00\") },\r\n ],\r\n};\r\n\r\nfunction getDate(dayString: any) {\r\n const today = new Date();\r\n const year = today.getFullYear().toString();\r\n let month = (today.getMonth() + 1).toString();\r\n\r\n if (month.length === 1) {\r\n month = \"0\" + month;\r\n }\r\n\r\n return dayString.replace(\"YEAR\", year).replace(\"MONTH\", month);\r\n}\r\n","const data = [\r\n {\r\n name: \"Naidu Setti\",\r\n company: \"ERP Force\",\r\n status: \"Paid\",\r\n email: \"naidu@gmail.com\",\r\n amount: \"$1,00,000\",\r\n },\r\n {\r\n name: \"Shashank Yadav\",\r\n company: \"Antino Labs\",\r\n status: \"Pending\",\r\n email: \"shashank@gmail.com\",\r\n amount: \"$50,000\",\r\n },\r\n {\r\n name: \"Tarun Prajapati\",\r\n company: \"Goldenflitch\",\r\n status: \"Lost\",\r\n email: \"tarun@gmail.com\",\r\n amount: \"$60,000\",\r\n },\r\n {\r\n name: \"Rajneesh Kumar\",\r\n company: \"ERP Force\",\r\n status: \"Lost\",\r\n email: \"rajneesh@gmail.com\",\r\n amount: \"$10,000\",\r\n },\r\n {\r\n name: \"Radhakanth\",\r\n company: \"Antino\",\r\n status: \"Upcomming\",\r\n email: \"radhakanth@gmail.com\",\r\n amount: \"$1,00,000\",\r\n },\r\n];\r\n\r\nexport { data };\nexport default data;\r\n","import { GridColumnIcon } from \"@glideapps/glide-data-grid\";\r\n\r\nexport const column = [\r\n {\r\n title: \"Name\",\r\n id: \"name\",\r\n hasMenu: true,\r\n icon: GridColumnIcon.HeaderString,\r\n },\r\n {\r\n title: \"Company\",\r\n id: \"company\",\r\n hasMenu: true,\r\n dataType: \"Bubble\",\r\n },\r\n {\r\n title: \"Age\",\r\n id: \"age\",\r\n hasMenu: true,\r\n dataType: \"Number\",\r\n },\r\n {\r\n title: \"Image dd\",\r\n id: \"image\",\r\n key: \"image\",\r\n dataType: \"Image\",\r\n },\r\n {\r\n title: \"Email\",\r\n id: \"email\",\r\n hasMenu: true,\r\n },\r\n {\r\n title: \"Date\",\r\n id: \"date\",\r\n hasMenu: true,\r\n dataType: \"DatePicker\",\r\n },\r\n {\r\n title: \"Phone\",\r\n id: \"phone\",\r\n },\r\n {\r\n title: \"Address\",\r\n id: \"address\",\r\n },\r\n {\r\n title: \"about\",\r\n id: \"about\",\r\n },\r\n];\r\n","import { MRT_ColumnDef, MRT_RowData } from \"material-react-table\";\r\n\r\nexport interface IProperty {\r\n field_type: string;\r\n label: string;\r\n placeholder: string;\r\n default_value?: string;\r\n float_step?: string;\r\n min_length?: number;\r\n max_length?: number;\r\n is_multiline?: boolean;\r\n is_required?: boolean;\r\n is_negative?: boolean;\r\n is_unique?: boolean;\r\n is_checked?: boolean;\r\n // options?: Array<{ text: string; value: string }>;\r\n // is_multiselect?: boolean,\r\n id?: string;\r\n is_future_dates_allowed?: boolean;\r\n is_past_dates_allowed?: boolean;\r\n option?: string;\r\n max_size?: number;\r\n section_id?: string;\r\n section_name?: string;\r\n title_position?: \"start\" | \"end\"\r\n title?:string,\r\n table_columns?:MRT_ColumnDef<MRT_RowData>[]\r\n table?:string\r\n module?:string\r\n field?:string\r\n is_country_code_separate?: boolean;\r\n country_code_field_name?: string;\r\n}\r\n\r\ninterface IMultiOption {\r\n value: string;\r\n label: string;\r\n is_checked: boolean;\r\n}\r\n\r\nexport interface IMultiOptionsProperty extends IProperty {\r\n options: IMultiOption[];\r\n display?: \"row\" | \"column\";\r\n}\r\n\r\nexport interface ISelectProperty {\r\n field_type: string;\r\n label: string;\r\n placeholder: string;\r\n default_value: string;\r\n is_required?: boolean;\r\n is_unique?: boolean;\r\n options: ISelectOption[];\r\n is_multiselect?: boolean;\r\n id?: string;\r\n section_id?: string;\r\n section_name?: string;\r\n}\r\n\r\nexport interface ISwitcherForms {\r\n value?: string;\r\n name: string;\r\n id: string | number | null;\r\n}\r\n\r\nexport interface ISectionProperty {\r\n field_type: string;\r\n label: string;\r\n is_accordion: boolean;\r\n id?: string;\r\n section_order?: string;\r\n section_id?: string;\r\n section_name?: string;\r\n section_type: \"Default\" | \"Form switcher section\";\r\n form_switcher_label?: string;\r\n form_switcher_name?: string;\r\n switcher_forms?: ISwitcherForms[];\r\n members: IProperty[] | ISelectProperty[];\r\n}\r\n\r\n\r\ninterface ISelectOption {\r\n text: string;\r\n value: string;\r\n}\r\n\r\nconst text: IProperty = {\r\n field_type: \"text\",\r\n label: \"label\",\r\n placeholder: \"Enter text\",\r\n default_value: \"\",\r\n min_length: 2,\r\n max_length: 30,\r\n is_multiline: false,\r\n is_required: true,\r\n is_unique: false,\r\n};\r\n\r\nconst number: IProperty = {\r\n field_type: \"number\",\r\n label: \"label\",\r\n placeholder: \"Enter number\",\r\n default_value: \"\",\r\n float_step: \"0.001\", // \"0.001\",\r\n min_length: 0,\r\n max_length: 1000,\r\n is_negative: false,\r\n is_required: true,\r\n is_unique: false,\r\n};\r\n\r\nconst email: IProperty = {\r\n field_type: \"email\",\r\n label: \"label\",\r\n placeholder: \"Enter email\",\r\n default_value: \"\",\r\n is_required: false,\r\n is_unique: false,\r\n};\r\n\r\nconst phone: IProperty = {\r\n field_type: \"phone\",\r\n label: \"label\",\r\n placeholder: \"Enter phone\",\r\n default_value: \"\",\r\n is_required: false,\r\n is_unique: false,\r\n};\r\n\r\nconst select: ISelectProperty = {\r\n field_type: \"select\",\r\n label: \"Select\",\r\n placeholder: \"Choose option\",\r\n default_value: \"\",\r\n options: [],\r\n is_multiselect: false,\r\n is_required: true,\r\n is_unique: false,\r\n};\r\n\r\nconst date: IProperty = {\r\n field_type: \"date\",\r\n label: \"label\",\r\n placeholder: \"Select Date\",\r\n default_value: \"\",\r\n is_future_dates_allowed: false,\r\n is_past_dates_allowed: false,\r\n is_required: false,\r\n is_unique: false,\r\n};\r\n\r\nconst time: IProperty = {\r\n field_type: \"time\",\r\n label: \"label\",\r\n placeholder: \"Select Time\",\r\n default_value: \"\",\r\n is_required: false,\r\n is_unique: false,\r\n option: \"12hr\",\r\n};\r\n\r\nconst url: IProperty = {\r\n field_type: \"url\",\r\n label: \"label\",\r\n placeholder: \"Enter URL\",\r\n default_value: \"\",\r\n is_required: false,\r\n is_unique: false,\r\n};\r\n\r\nconst currency: IProperty = {\r\n field_type: \"currency\",\r\n label: \"label\",\r\n placeholder: \"Enter Currency\",\r\n default_value: \"\",\r\n is_required: false,\r\n is_unique: false,\r\n option: \"inr\",\r\n};\r\n\r\nconst file: IProperty = {\r\n field_type: \"file\",\r\n label: \"label\",\r\n placeholder: \"Upload File or Media\",\r\n is_required: false,\r\n is_unique: false,\r\n max_size: 20,\r\n default_value: \"\",\r\n};\r\n\r\nconst image: IProperty = {\r\n field_type: \"image\",\r\n label: \"label\",\r\n placeholder: \"Upload Image\",\r\n is_required: false,\r\n is_unique: false,\r\n max_size: 20,\r\n default_value: \"\",\r\n};\r\n\r\nconst geoLocation: IProperty = {\r\n field_type: \"geoLocation\",\r\n label: \"label\",\r\n placeholder: \"Enter geo location\",\r\n default_value: \"\",\r\n is_required: false,\r\n is_unique: false,\r\n};\r\n\r\nconst section: ISectionProperty = {\r\n field_type: \"section\",\r\n label: \"section\",\r\n section_type: \"Default\",\r\n form_switcher_label: \"Form section\",\r\n form_switcher_name: \"\",\r\n switcher_forms: [{\r\n value: \"\",\r\n name: \"Form 1\",\r\n id: null,\r\n }],\r\n is_accordion: false,\r\n members: [],\r\n};\r\n\r\nconst info: IProperty = {\r\n field_type: \"info\",\r\n label: \"label\",\r\n placeholder: \"Add Label Text\",\r\n default_value: \"\",\r\n};\r\n\r\nconst relation: IProperty = {\r\n field_type: \"relation\",\r\n label: \"label\",\r\n placeholder: \"Add Label Text\",\r\n is_required: false,\r\n is_unique: false,\r\n module: \"\",\r\n field: \"\",\r\n default_value: \"\",\r\n};\r\n\r\nconst checkbox: IProperty = {\r\n field_type: \"checkbox\",\r\n label: \"label\",\r\n placeholder: \"Add Label Text\",\r\n is_required: false,\r\n is_checked: false,\r\n title_position:'end',\r\n title:\"Checkbox\"\r\n};\r\n\r\nconst toggleButton: IProperty = {\r\n field_type: \"toggleButton\",\r\n label: \"label\",\r\n placeholder: \"Add Label Text\",\r\n is_required: false,\r\n is_checked: false,\r\n title_position:'end',\r\n title:\"Toggle\"\r\n};\r\n\r\nconst table: IProperty = {\r\n field_type: \"table\",\r\n label: \"label\",\r\n placeholder: \"Add Label Text\",\r\n is_required: false,\r\n table_columns: [],\r\n table: \"custom\",\r\n};\r\nconst radioButton: IMultiOptionsProperty = {\r\n field_type: \"radioButton\",\r\n placeholder: \"\",\r\n label: \"label\",\r\n title: \"\",\r\n is_required: false,\r\n title_position:'end',\r\n options: [],\r\n display: \"row\",\r\n default_value: \"\",\r\n};\r\nconst tagsInput: IProperty = {\r\n field_type: \"tagsInput\",\r\n label: \"label\",\r\n placeholder: \"Enter tagsInput\",\r\n default_value: \"\",\r\n min_length: 2,\r\n max_length: 30,\r\n is_multiline: false,\r\n is_required: true,\r\n is_unique: false,\r\n};\r\n\r\nexport const element = {\r\n text,\r\n number,\r\n email,\r\n phone,\r\n select,\r\n date,\r\n time,\r\n url,\r\n currency,\r\n file,\r\n geoLocation,\r\n image,\r\n section,\r\n info,\r\n relation,\r\n checkbox,\r\n toggleButton,\r\n radioButton,\r\n table,\r\n tagsInput\r\n};\r\n","// React imports\r\nimport { useEffect, useState } from \"react\";\r\n\r\n// Material UI imports\r\nimport { MenuItem, SelectProps, Stack } from \"@mui/material\";\r\n\r\n// ERP Common imports\r\nimport {\r\n ArrowCircleDown,\r\n Calendar,\r\n CheckboxSquare,\r\n Clock,\r\n DollarCircle,\r\n Email,\r\n Grid,\r\n Hashtag,\r\n Image,\r\n InfoCircle,\r\n Link,\r\n LinkHorizontal,\r\n Location,\r\n PaperClip,\r\n Paragraph,\r\n Phone,\r\n RadioButton,\r\n ToggleSwitch,\r\n} from \"@/components/icons\";\r\nimport Select from \"@/components/select/select\";\r\nimport Typography from \"@/components/typography/typography\";\r\n\r\ninterface IField {\r\n label: string;\r\n value: string;\r\n icon: typeof Paragraph | string;\r\n}\r\n\r\nconst fields: IField[] = [\r\n { label: \"Text\", value: \"text\", icon: Paragraph },\r\n { label: \"Number\", value: \"number\", icon: Hashtag },\r\n { label: \"Select\", value: \"select\", icon: ArrowCircleDown },\r\n { label: \"Date\", value: \"date\", icon: Calendar },\r\n { label: \"Files & Media\", value: \"file\", icon: PaperClip },\r\n { label: \"URL\", value: \"url\", icon: Link },\r\n { label: \"Email\", value: \"email\", icon: Email },\r\n { label: \"Phone\", value: \"phone\", icon: Phone },\r\n { label: \"Currency\", value: \"currency\", icon: DollarCircle },\r\n { label: \"Time\", value: \"time\", icon: Clock },\r\n { label: \"Table\", value: \"table\", icon: Grid },\r\n { label: \"Geolocation\", value: \"geoLocation\", icon: Location },\r\n { label: \"Check Box\", value: \"checkbox\", icon: CheckboxSquare },\r\n { label: \"Image Upload\", value: \"image\", icon: Image },\r\n { label: \"Relation Field\", value: \"relation\", icon: LinkHorizontal },\r\n { label: \"Info Card\", value: \"info\", icon: InfoCircle },\r\n { label: \"Toggle Button\", value: \"toggleButton\", icon: ToggleSwitch },\r\n { label: \"Radio Button\", value: \"radioButton\", icon: RadioButton },\r\n { label: \"tagsInput\", value: \"tagsInput\", icon: Paragraph },\r\n];\r\n\r\nconst FieldSelect: React.FC<SelectProps> = (props) => {\r\n const [selectFields, setSelectFields] = useState<IField[]>(fields);\r\n const [search, setSearch] = useState<string>(\"\");\r\n\r\n const handleSearch = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setSearch(event.target.value);\r\n };\r\n\r\n const handleSearchFields = (searchVal: string) => {\r\n if (searchVal) {\r\n setSelectFields([\r\n ...fields.filter((field) => field.value.includes(searchVal)),\r\n ]);\r\n } else {\r\n setSelectFields(fields);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n handleSearchFields(search);\r\n }, [search]);\r\n\r\n return (\r\n <Select\r\n fullWidth\r\n placeholder=\"Select Field\"\r\n size=\"small\"\r\n labelName=\"Field Type\"\r\n renderValue={(value: string) =>\r\n fields.find((field) => field.value === value)?.label\r\n }\r\n handleSearch={() => handleSearch}\r\n searchPlaceholder=\"Search Attributes\"\r\n searchValue={search}\r\n {...props}\r\n >\r\n {selectFields.map((field) => (\r\n <MenuItem value={field.value} onKeyDown={(e) => e.stopPropagation()}>\r\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\r\n {field.icon && <field.icon fontSize=\"small\" />}\r\n <Typography type=\"s3\" color=\"theme.secondary.1000\">\r\n {field.label}\r\n </Typography>\r\n </Stack>\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n );\r\n};\r\n\r\nexport default FieldSelect;\r\n","// React imports\r\nimport { useCallback, useEffect, useState, useMemo, useRef } from \"react\";\r\n\r\n// Material UI imports\r\nimport {\r\n DialogActions,\r\n DialogContent,\r\n DialogTitle,\r\n IconButton,\r\n MenuItem,\r\n Box,\r\n FormControlLabel,\r\n FormControl,\r\n Slider,\r\n} from \"@mui/material\";\r\nimport { Add, Close } from \"@mui/icons-material\";\r\n\r\n// ERP Common imports\r\nimport Button from \"@/components/button/button\";\r\nimport Modal from \"@/components/modal/modal\";\r\nimport Typography from \"@/components/typography/typography\";\r\nimport TextField from \"@/components/text-field/text-field\";\r\nimport Select from \"@/components/select/select\";\r\nimport Checkbox from \"@/components/checkbox/checkbox\";\r\nimport formatText from \"@/utils/format-text\";\r\n\r\n// Local imports\r\nimport FieldSelect from \"./field-select\";\r\nimport { IElementJson } from \"../custom-form\";\r\nimport { ApiFormFields } from \"../../Redux/state\";\r\nimport \"../custom-form.scss\";\r\n\r\ninterface Option {\r\n label: string;\r\n value: string;\r\n}\r\n\r\ninterface ITextEditFormProps {\r\n handleWidthChange: (value?: number) => void;\r\n handleColumnSelect: (value?: number) => void;\r\n handlePropertyValueUpdate: (\r\n event?: React.ChangeEvent<HTMLInputElement>,\r\n numberValue?: number,\r\n value?: any,\r\n fieldType?: string,\r\n ) => void;\r\n element: IElementJson | null;\r\n fields: ApiFormFields | null;\r\n}\r\n\r\n// Constants moved outside to prevent re-creation\r\nconst COLUMN_PER_ROW_OPTIONS = [1, 2, 3, 4, 5, 6] as const;\r\nconst SELECT_OPTIONS = [\r\n { text: \"12 Hour\", value: \"12hr\" },\r\n { text: \"24 Hour\", value: \"24hr\" },\r\n] as const;\r\nconst CURRENCY_OPTIONS = [\r\n { text: \"INR (India)\", value: \"inr\" },\r\n { text: \"USD (US)\", value: \"usd\" },\r\n] as const;\r\n\r\nconst FIELDS_WITHOUT_PLACEHOLDER = new Set([\r\n \"time\", \"file\", \"geoLocation\", \"image\", \"info\", \"relation\"\r\n]);\r\nconst FIELDS_WITH_MIN_MAX = new Set([\"text\", \"number\"]);\r\n\r\n// Memoized components to prevent unnecessary re-renders\r\nconst MemoizedMenuItem = ({ option, index, prefix }: { option: any; index: number; prefix: string }) => (\r\n <MenuItem key={`${prefix}-${index}`} value={option.value}>\r\n {option.text || option.label}\r\n </MenuItem>\r\n);\r\n\r\nconst MemoizedRelationMenuItem = ({ option, index, prefix }: { option: Option; index: number; prefix: string }) => (\r\n <MenuItem key={`${prefix}-${index}`} value={option.value}>\r\n <Typography type=\"s3\" color=\"theme.secondary.1000\">\r\n {option.label}\r\n </Typography>\r\n </MenuItem>\r\n);\r\n\r\nexport function TextEditForm(props: ITextEditFormProps) {\r\n const { \r\n handlePropertyValueUpdate, \r\n handleColumnSelect, \r\n handleWidthChange, \r\n fields, \r\n element \r\n } = props;\r\n\r\n // State management - optimized to prevent unnecessary re-renders\r\n const [elementJSON, setElementJSON] = useState<IElementJson | null>(element);\r\n const [openModal, setOpenModal] = useState(false);\r\n const [relationFields, setRelationFields] = useState<Option[]>([]);\r\n const [functionValue, setFunctionValue] = useState(\"\");\r\n \r\n // Use refs to track previous values and prevent unnecessary updates\r\n const prevElementRef = useRef<IElementJson | null>(element);\r\n const prevFieldsRef = useRef<ApiFormFields | null>(fields);\r\n\r\n // Memoized relation modules with deep comparison prevention\r\n const relationModulesOptions = useMemo(() => {\r\n if (!fields || fields === prevFieldsRef.current) {\r\n if (prevFieldsRef.current && fields) return prevFieldsRef.current;\r\n }\r\n \r\n prevFieldsRef.current = fields;\r\n \r\n if (!fields) return [];\r\n return Object.keys(fields).map((key) => ({\r\n label: formatText(key),\r\n value: key,\r\n }));\r\n }, [fields]);\r\n\r\n // Optimized relation fields setter with memoization\r\n const setRelationFieldsOptions = useCallback(\r\n (moduleValue?: string) => {\r\n if (!fields || !moduleValue) {\r\n setRelationFields(prev => prev.length > 0 ? [] : prev);\r\n return;\r\n }\r\n\r\n const fieldsArr = fields[moduleValue];\r\n if (fieldsArr?.length) {\r\n const options = fieldsArr.map((field) => ({\r\n label: field.field,\r\n value: field.field,\r\n }));\r\n \r\n // Only update if options actually changed\r\n setRelationFields(prev => {\r\n if (prev.length !== options.length) return options;\r\n const isDifferent = prev.some((item, idx) => \r\n item.value !== options[idx]?.value || item.label !== options[idx]?.label\r\n );\r\n return isDifferent ? options : prev;\r\n });\r\n } else {\r\n setRelationFields(prev => prev.length > 0 ? [] : prev);\r\n }\r\n },\r\n [fields]\r\n );\r\n\r\n // Memoized event handlers to prevent child re-renders\r\n const handleSave = useCallback((value: string) => {\r\n if (!elementJSON) return;\r\n \r\n // Only update if value actually changed\r\n if (elementJSON.default_value !== value) {\r\n const updatedElement = { ...elementJSON, default_value: value };\r\n setElementJSON(updatedElement);\r\n handlePropertyValueUpdate(null, null, value);\r\n }\r\n \r\n if (value) {\r\n setFunctionValue(\"\");\r\n setOpenModal(false);\r\n }\r\n }, [elementJSON, handlePropertyValueUpdate]);\r\n\r\n const handleFieldUpdate = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n if (!elementJSON) return;\r\n \r\n const fieldType = e.target.value;\r\n if (elementJSON.field_type !== fieldType) {\r\n const updatedElement = { ...elementJSON, field_type: fieldType };\r\n setElementJSON(updatedElement);\r\n handlePropertyValueUpdate(null, null, null, e.target.value);\r\n }\r\n }, [elementJSON, handlePropertyValueUpdate]);\r\n\r\n const handleSelectUpdate = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n if (!elementJSON) return;\r\n \r\n const option = e.target.value;\r\n if (elementJSON.option !== option) {\r\n const updatedElement = { ...elementJSON, option };\r\n setElementJSON(updatedElement);\r\n handlePropertyValueUpdate(null, null, option);\r\n }\r\n }, [elementJSON, handlePropertyValueUpdate]);\r\n\r\n const handleModuleSelect = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n const moduleValue = e.target.value;\r\n if (elementJSON?.module !== moduleValue) {\r\n setRelationFieldsOptions(moduleValue);\r\n handlePropertyValueUpdate(e);\r\n }\r\n }, [elementJSON?.module, setRelationFieldsOptions, handlePropertyValueUpdate]);\r\n\r\n const handleWidthSliderChange = useCallback((_: Event, value: number | number[]) => {\r\n if (!elementJSON) return;\r\n \r\n const widthValue = Array.isArray(value) ? value[0] : value;\r\n if (elementJSON.custom_width !== widthValue) {\r\n const updatedElement = { ...elementJSON, custom_width: widthValue };\r\n setElementJSON(updatedElement);\r\n handleWidthChange(widthValue);\r\n }\r\n }, [elementJSON, handleWidthChange]);\r\n\r\n const handleFullWidthChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n if (!elementJSON) return;\r\n \r\n const isFullWidth = e.target.checked;\r\n if (elementJSON.is_fullwidth !== isFullWidth) {\r\n const updatedElement = { ...elementJSON, is_fullwidth: isFullWidth };\r\n setElementJSON(updatedElement);\r\n handlePropertyValueUpdate(e);\r\n }\r\n }, [elementJSON, handlePropertyValueUpdate]);\r\n\r\n const handleColumnSelectChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n const columnValue = Number(e.target.value);\r\n handleColumnSelect(columnValue);\r\n }, [handleColumnSelect]);\r\n\r\n // Memoized helper functions\r\n const getDefaultValue = useCallback((elementJSON: IElementJson) => {\r\n if ([\"number\", \"currency\", \"geoLocation\"].includes(elementJSON.field_type)) {\r\n return elementJSON.default_value?.toString().replace(/[^0-9]/g, \"\") || \"\";\r\n }\r\n return elementJSON.default_value || \"\";\r\n }, []);\r\n\r\n const getMinMaxLabels = useCallback((fieldType: string) => {\r\n return fieldType === \"text\" \r\n ? { min: \"Min character count (with spaces)\", max: \"Max character count (with spaces)\" }\r\n : { min: \"Min number\", max: \"Max number\" };\r\n }, []);\r\n\r\n // Modal handlers\r\n const handleOpenModal = useCallback(() => setOpenModal(true), []);\r\n const handleCloseModal = useCallback(() => {\r\n setOpenModal(false);\r\n setFunctionValue(\"\");\r\n }, []);\r\n\r\n const handleFunctionValueChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n setFunctionValue(e.target.value);\r\n }, []);\r\n\r\n // Optimized effects with proper dependency arrays\r\n useEffect(() => {\r\n // Only update if element actually changed\r\n if (element !== prevElementRef.current) {\r\n setElementJSON(element);\r\n prevElementRef.current = element;\r\n \r\n if (element?.module) {\r\n setRelationFieldsOptions(element.module);\r\n }\r\n }\r\n }, [element, setRelationFieldsOptions]);\r\n\r\n // Memoized render sections to prevent unnecessary re-computation\r\n const currencySelectSection = useMemo(() => {\r\n if (elementJSON?.field_type !== \"currency\") return null;\r\n \r\n return (\r\n <Box>\r\n <FormControl fullWidth>\r\n <Select\r\n fullWidth\r\n placeholder=\"Select Currency\"\r\n size=\"small\"\r\n onChange={handleSelectUpdate}\r\n defaultValue={elementJSON.option}\r\n label=\"Currency\"\r\n name=\"option\"\r\n variant=\"outlined\"\r\n >\r\n {CURRENCY_OPTIONS.map((option, index) => (\r\n <MemoizedMenuItem \r\n key={`currency-${index}`}\r\n option={option} \r\n index={index} \r\n prefix=\"currency\" \r\n />\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Box>\r\n );\r\n }, [elementJSON?.field_type, elementJSON?.option, handleSelectUpdate]);\r\n\r\n const timeSelectSection = useMemo(() => {\r\n if (elementJSON?.field_type !== \"time\") return null;\r\n \r\n return (\r\n <Box>\r\n <FormControl fullWidth>\r\n <Select\r\n fullWidth\r\n placeholder=\"Select Time Format\"\r\n size=\"small\"\r\n onChange={handleSelectUpdate}\r\n defaultValue={elementJSON.option}\r\n label=\"Time Format\"\r\n name=\"option\"\r\n variant=\"outlined\"\r\n >\r\n {SELECT_OPTIONS.map((option, index) => (\r\n <MemoizedMenuItem \r\n key={`time-${index}`}\r\n option={option} \r\n index={index} \r\n prefix=\"time\" \r\n />\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Box>\r\n );\r\n }, [elementJSON?.field_type, elementJSON?.option, handleSelectUpdate]);\r\n\r\n const relationSelectSection = useMemo(() => {\r\n if (elementJSON?.field_type !== \"relation\") return null;\r\n \r\n return (\r\n <>\r\n <Box>\r\n <FormControl fullWidth>\r\n <Select\r\n fullWidth\r\n placeholder={\r\n relationModulesOptions.length\r\n ? \"Select Relation Module\"\r\n : \"No data available\"\r\n }\r\n size=\"small\"\r\n onChange={handleModuleSelect}\r\n value={elementJSON.module || \"\"}\r\n label=\"Relation Module\"\r\n name=\"module\"\r\n >\r\n {relationModulesOptions.length ? (\r\n relationModulesOptions.map((option, index) => (\r\n <MemoizedRelationMenuItem \r\n key={`module-${index}`}\r\n option={option} \r\n index={index} \r\n prefix=\"module\" \r\n />\r\n ))\r\n ) : (\r\n <MenuItem disabled>\r\n <Typography type=\"s3\" color=\"theme.secondary.1000\">\r\n <em>No data available</em>\r\n </Typography>\r\n </MenuItem>\r\n )}\r\n </Select>\r\n </FormControl>\r\n </Box>\r\n\r\n <Box>\r\n <FormControl fullWidth>\r\n <Select\r\n fullWidth\r\n placeholder={\r\n !elementJSON.module\r\n ? \"Select Module First\"\r\n : relationFields.length\r\n ? \"Select Relation Field\"\r\n : \"No data available\"\r\n }\r\n size=\"small\"\r\n onChange={handlePropertyValueUpdate}\r\n value={elementJSON.field || \"\"}\r\n label=\"Relation Field\"\r\n disabled={!elementJSON.module}\r\n name=\"field\"\r\n >\r\n {relationFields.length ? (\r\n relationFields.map((option, index) => (\r\n <MemoizedRelationMenuItem \r\n key={`field-${index}`}\r\n option={option} \r\n index={index} \r\n prefix=\"field\" \r\n />\r\n ))\r\n ) : (\r\n <MenuItem disabled>\r\n <Typography type=\"s3\" color=\"theme.secondary.1000\">\r\n <em>No data available</em>\r\n </Typography>\r\n </MenuItem>\r\n )}\r\n </Select>\r\n </FormControl>\r\n </Box>\r\n </>\r\n );\r\n }, [\r\n elementJSON?.field_type, \r\n elementJSON?.module, \r\n elementJSON?.field,\r\n relationModulesOptions, \r\n relationFields, \r\n handleModuleSelect, \r\n handlePropertyValueUpdate\r\n ]);\r\n\r\n // Early return if no element\r\n if (!elementJSON) {\r\n return null;\r\n }\r\n\r\n const { field_type } = elementJSON;\r\n const minMaxLabels = getMinMaxLabels(field_type);\r\n\r\n return (\r\n <Box className=\"formSection--FieldContainer\">\r\n {/* Field Type Selection */}\r\n <Box>\r\n <FieldSelect\r\n variant=\"outlined\"\r\n onChange={handleFieldUpdate}\r\n defaultValue={field_type}\r\n label=\"Field Type\"\r\n disabled={elementJSON.type === \"system\" || !elementJSON.is_new}\r\n />\r\n </Box>\r\n\r\n {/* Label Field */}\r\n <Box>\r\n <TextField\r\n fullWidth\r\n label=\"Label\"\r\n is_required\r\n name=\"label\"\r\n type=\"text\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={elementJSON.label}\r\n />\r\n </Box>\r\n\r\n {/* File/Image Max Size */}\r\n {(field_type === \"file\" || field_type === \"image\") && (\r\n <Box>\r\n <TextField\r\n fullWidth\r\n label=\"Max File Size (in MB)\"\r\n name=\"max_size\"\r\n type=\"number\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={elementJSON.max_size}\r\n />\r\n </Box>\r\n )}\r\n\r\n {/* Currency Selection - Memoized */}\r\n {currencySelectSection}\r\n\r\n {/* Placeholder and Default Value */}\r\n {!FIELDS_WITHOUT_PLACEHOLDER.has(field_type) && (\r\n <>\r\n <Box>\r\n <TextField\r\n fullWidth\r\n label=\"Placeholder\"\r\n name=\"placeholder\"\r\n type=\"text\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={elementJSON.placeholder}\r\n />\r\n </Box>\r\n <Box>\r\n <TextField\r\n fullWidth\r\n label=\"Default Value\"\r\n placeholder=\"Default Value\"\r\n name=\"default_value\"\r\n type={field_type === \"phone\" ? \"tel\" : field_type === \"number\" ? \"number\" : \"text\"}\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={getDefaultValue(elementJSON)}\r\n />\r\n </Box>\r\n </>\r\n )}\r\n\r\n {/* Time Format Selection - Memoized */}\r\n {timeSelectSection}\r\n\r\n {/* Relation Module and Field Selection - Memoized */}\r\n {relationSelectSection}\r\n\r\n {/* Min/Max Length for Text and Number Fields */}\r\n {FIELDS_WITH_MIN_MAX.has(field_type) && (\r\n <>\r\n <Box>\r\n <TextField\r\n fullWidth\r\n label={minMaxLabels.min}\r\n name=\"min_length\"\r\n type=\"number\"\r\n onChange={(e) => handlePropertyValueUpdate(e, Number(e.target.value))}\r\n defaultValue={elementJSON.min_length || elementJSON.min || 1}\r\n />\r\n </Box>\r\n <Box>\r\n <TextField\r\n fullWidth\r\n label={minMaxLabels.max}\r\n name=\"max_length\"\r\n type=\"number\"\r\n onChange={(e) => handlePropertyValueUpdate(e, Number(e.target.value))}\r\n defaultValue={\r\n elementJSON.max_length || \r\n elementJSON.max || \r\n (field_type === 'number' ? 10000 : 255)\r\n }\r\n />\r\n </Box>\r\n </>\r\n )}\r\n\r\n {/* Column Per Row Selection */}\r\n <Box>\r\n <FormControl fullWidth>\r\n <Select\r\n fullWidth\r\n placeholder=\"Select Column Per Row\"\r\n size=\"small\"\r\n onChange={handleColumnSelectChange}\r\n value={elementJSON.columns_per_row || 1}\r\n label=\"Select Column Per Row\"\r\n name=\"columns_per_row\"\r\n variant=\"outlined\"\r\n >\r\n {COLUMN_PER_ROW_OPTIONS.map((option, index) => (\r\n <MenuItem key={`column-${index}`} value={option}>\r\n {option}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Box>\r\n\r\n {/* Width Adjustment Slider */}\r\n <Box>\r\n <Typography sx={{ color: 'black', mb: 1 }}>\r\n Adjust Width:\r\n </Typography>\r\n <Slider\r\n value={elementJSON.custom_width || 12}\r\n name=\"custom_width\"\r\n min={1}\r\n max={12}\r\n step={1}\r\n onChange={handleWidthSliderChange}\r\n aria-labelledby=\"width-slider\"\r\n sx={{ color: \"#4AC08C\" }}\r\n disabled={elementJSON.is_fullwidth}\r\n marks\r\n valueLabelDisplay=\"auto\"\r\n />\r\n </Box>\r\n\r\n {/* Number Field Specific Options */}\r\n {field_type === \"number\" && (\r\n <>\r\n <Box>\r\n <TextField\r\n fullWidth\r\n label=\"Float Step\"\r\n name=\"float_step\"\r\n type=\"number\"\r\n step=\"0.01\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={elementJSON.float_step}\r\n />\r\n </Box>\r\n <Box>\r\n <FormControlLabel\r\n name=\"is_negative\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={elementJSON.is_negative || false}\r\n label=\"Allow Negative Numbers\"\r\n />\r\n </Box>\r\n </>\r\n )}\r\n\r\n {/* Date Field Specific Options */}\r\n {field_type === \"date\" && (\r\n <>\r\n <Box>\r\n <FormControlLabel\r\n name=\"is_future_dates_allowed\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={elementJSON.is_future_dates_allowed || false}\r\n label=\"Allow Future Dates\"\r\n />\r\n </Box>\r\n <Box>\r\n <FormControlLabel\r\n name=\"is_past_dates_allowed\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={elementJSON.is_past_dates_allowed || false}\r\n label=\"Allow Past Dates\"\r\n />\r\n </Box>\r\n </>\r\n )}\r\n\r\n {/* Required Field Checkbox */}\r\n {field_type !== \"info\" && (\r\n <Box>\r\n <FormControlLabel\r\n name=\"is_required\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={elementJSON.is_required || false}\r\n label=\"This field is required\"\r\n />\r\n </Box>\r\n )}\r\n\r\n {/* Email Unique Checkbox */}\r\n {field_type === \"email\" && (\r\n <Box>\r\n <FormControlLabel\r\n name=\"is_unique\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={elementJSON.is_unique || false}\r\n label=\"Is Unique\"\r\n />\r\n </Box>\r\n )}\r\n\r\n {/* Text Multiline Checkbox */}\r\n {field_type === \"text\" && (\r\n <Box>\r\n <FormControlLabel\r\n name=\"is_multiline\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={elementJSON.is_multiline || false}\r\n label=\"Is Multiline\"\r\n />\r\n </Box>\r\n )}\r\n\r\n {/* Full Width Checkbox */}\r\n <Box>\r\n <FormControlLabel\r\n name=\"is_fullwidth\"\r\n control={<Checkbox />}\r\n onChange={handleFullWidthChange}\r\n checked={elementJSON.is_fullwidth || false}\r\n label=\"Full Width\"\r\n />\r\n </Box>\r\n\r\n {/* Info Field Function Button */}\r\n {field_type === \"info\" && (\r\n <Box>\r\n <Button\r\n variant=\"outlined\"\r\n startIcon={<Add />}\r\n onClick={handleOpenModal}\r\n className=\"formSection--PreviewButton\"\r\n >\r\n Add Function\r\n </Button>\r\n </Box>\r\n )}\r\n\r\n {/* Function Modal */}\r\n <Modal fullWidth onClose={handleCloseModal} open={openModal}>\r\n <DialogTitle>\r\n <Typography type=\"s3\" weight=\"medium\" color=\"theme.secondary.1000\">\r\n Add Function\r\n </Typography>\r\n <IconButton\r\n edge=\"end\"\r\n onClick={handleCloseModal}\r\n size=\"small\"\r\n >\r\n <Close fontSize=\"inherit\" />\r\n </IconButton>\r\n </DialogTitle>\r\n <DialogContent dividers>\r\n <Typography weight=\"medium\" type=\"s3\" color=\"theme.secondary.700\" sx={{ mb: 2 }}>\r\n Label: <span style={{ color: \"#1F2125\" }}>{elementJSON.label}</span>\r\n </Typography>\r\n <TextField\r\n name=\"default_value\"\r\n fullWidth\r\n placeholder=\"Add a function\"\r\n multiline\r\n minRows={4}\r\n defaultValue={elementJSON.default_value}\r\n onChange={handleFunctionValueChange}\r\n value={functionValue}\r\n />\r\n </DialogContent>\r\n <DialogActions>\r\n <Button\r\n variant=\"outlined\"\r\n onClick={handleCloseModal}\r\n style={{ color: \"black\" }}\r\n >\r\n Cancel\r\n </Button>\r\n <Button onClick={() => handleSave(functionValue)}>\r\n Save\r\n </Button>\r\n </DialogActions>\r\n </Modal>\r\n </Box>\r\n );\r\n}\r\n\r\nexport default TextEditForm;","// React imports\r\nimport React, { useEffect, useState, useCallback, useMemo } from \"react\";\r\n\r\n// Material UI imports\r\nimport { \r\n MenuItem, \r\n Box, \r\n FormControlLabel, \r\n Slider, \r\n FormControl, \r\n IconButton\r\n} from \"@mui/material\";\r\nimport { Add } from \"@mui/icons-material\";\r\n\r\n// Third-party imports\r\nimport { enqueueSnackbar } from \"notistack\";\r\n\r\n// ERP Common imports\r\nimport Checkbox from \"@/components/checkbox/checkbox\";\r\nimport Select from \"@/components/select/select\";\r\nimport TextField from \"@/components/text-field/text-field\";\r\nimport Typography from \"@/components/typography/typography\";\r\nimport Button from \"@/components/button/button\";\r\nimport { Trash } from \"@/components/icons\";\r\n\r\n// Local imports\r\nimport FieldSelect from \"./field-select\";\r\nimport \"../custom-form.scss\";\r\n\r\ninterface Option {\r\n label: string;\r\n value: string;\r\n [key: string]: string;\r\n}\r\n\r\ninterface ElementJSON {\r\n id: string;\r\n field_type: string;\r\n label: string;\r\n placeholder: string;\r\n default_value: string | null;\r\n is_multiselect: boolean;\r\n is_required: boolean;\r\n is_unique: boolean;\r\n is_fullwidth: boolean;\r\n custom_width: number;\r\n type?: string;\r\n is_new?: boolean;\r\n options: Option[];\r\n}\r\n\r\ninterface SelectEditFormProps {\r\n element: ElementJSON;\r\n handlePropertyValueUpdate: (\r\n event: React.ChangeEvent<HTMLInputElement> | null,\r\n name?: string | null,\r\n value?: any,\r\n fieldType?: string\r\n ) => void;\r\n handleSelectOptionValueUpdate: (options: Option[]) => void;\r\n handleColumnSelect: (event: React.ChangeEvent<{ value: unknown }>) => void;\r\n handleWidthChange: (value: number | number[]) => void;\r\n}\r\n\r\nconst COLUMN_PER_ROW_OPTIONS = [1, 2, 3, 4, 5, 6] as const;\r\n\r\nexport const SelectEditForm: React.FC<SelectEditFormProps> = React.memo(({\r\n element,\r\n handlePropertyValueUpdate,\r\n handleSelectOptionValueUpdate,\r\n handleColumnSelect,\r\n handleWidthChange\r\n}) => {\r\n // Local state management\r\n const [selectOptions, setSelectOptions] = useState<Option[]>(element.options || []);\r\n const [newOption, setNewOption] = useState<Option>({ label: \"\", value: \"\" });\r\n const [isAddingOption, setIsAddingOption] = useState(false);\r\n\r\n // Sync options with parent element when element changes\r\n useEffect(() => {\r\n if (JSON.stringify(selectOptions) !== JSON.stringify(element.options || [])) {\r\n setSelectOptions(element.options || []);\r\n }\r\n }, [element.options, selectOptions]);\r\n\r\n // Memoized computed values\r\n const isFieldDisabled = useMemo(() => \r\n element.type === \"system\" || !element.is_new, \r\n [element.type, element.is_new]\r\n );\r\n\r\n const selectedOptionLabel = useMemo(() => {\r\n const selectedOption = selectOptions.find(option => option.value === element.default_value);\r\n return selectedOption?.label || \"Select Default\";\r\n }, [selectOptions, element.default_value]);\r\n\r\n // Optimized event handlers with useCallback\r\n const handleFieldUpdate = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n handlePropertyValueUpdate(null, null, null, e.target.value);\r\n }, [handlePropertyValueUpdate]);\r\n\r\n const handleSelectUpdate = useCallback((e: React.ChangeEvent<{ value: unknown }>) => {\r\n handlePropertyValueUpdate(null, null, e.target.value);\r\n }, [handlePropertyValueUpdate]);\r\n\r\n const handleMultiSelect = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n const isChecked = e.target.checked;\r\n // Reset default value when enabling multiselect\r\n const defaultValue = isChecked ? null : element.default_value;\r\n \r\n // Create a synthetic event for the property update\r\n const syntheticEvent = {\r\n target: {\r\n name: 'is_multiselect',\r\n checked: isChecked,\r\n value: isChecked\r\n }\r\n } as React.ChangeEvent<HTMLInputElement>;\r\n \r\n handlePropertyValueUpdate(syntheticEvent);\r\n \r\n // If enabling multiselect, also clear the default value\r\n if (isChecked && element.default_value) {\r\n handlePropertyValueUpdate(null, 'default_value', null);\r\n }\r\n }, [handlePropertyValueUpdate, element.default_value]);\r\n\r\n const handleNewOptionChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n const { name, value } = e.target;\r\n setNewOption(prev => ({ ...prev, [name]: value }));\r\n }, []);\r\n\r\n const handleAddOption = useCallback(() => {\r\n if (!newOption.label.trim() || !newOption.value.trim()) {\r\n return; // Don't add empty options\r\n }\r\n\r\n // Check for duplicate values\r\n const isDuplicate = selectOptions.some(option => \r\n option.value === newOption.value || option.label === newOption.label\r\n );\r\n \r\n if (isDuplicate) {\r\n // Could show an error message here\r\n enqueueSnackbar(\"Option with this value or label already exists.\", { variant: \"error\" });\r\n return;\r\n }\r\n\r\n const updatedOptions = [...selectOptions, { ...newOption }];\r\n setSelectOptions(updatedOptions);\r\n handleSelectOptionValueUpdate(updatedOptions);\r\n \r\n // Reset form\r\n setNewOption({ label: \"\", value: \"\" });\r\n setIsAddingOption(false);\r\n }, [newOption, selectOptions, handleSelectOptionValueUpdate]);\r\n\r\n const handleRemoveOption = useCallback((indexToRemove: number) => {\r\n const updatedOptions = selectOptions.filter((_, index) => index !== indexToRemove);\r\n setSelectOptions(updatedOptions);\r\n handleSelectOptionValueUpdate(updatedOptions);\r\n \r\n // Clear default value if the removed option was selected\r\n const removedOption = selectOptions[indexToRemove];\r\n if (element.default_value === removedOption?.value) {\r\n handlePropertyValueUpdate(null, 'default_value', null);\r\n }\r\n }, [selectOptions, handleSelectOptionValueUpdate, element.default_value, handlePropertyValueUpdate]);\r\n\r\n const handleWidthChangeCallback = useCallback((\r\n _: Event, \r\n newValue: number | number[]\r\n ) => {\r\n handleWidthChange(newValue);\r\n }, [handleWidthChange]);\r\n\r\n return (\r\n <Box className=\"formSection--FieldContainer\">\r\n {/* Field Type Selection */}\r\n <Box>\r\n <FieldSelect\r\n variant=\"outlined\"\r\n onChange={handleFieldUpdate}\r\n defaultValue={element.field_type}\r\n label=\"Field Type\"\r\n disabled={isFieldDisabled}\r\n />\r\n </Box>\r\n\r\n {/* Label Field */}\r\n <Box>\r\n <TextField\r\n fullWidth\r\n label=\"Label\"\r\n is_required\r\n name=\"label\"\r\n type=\"text\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={element.label}\r\n />\r\n </Box>\r\n\r\n {/* Placeholder Field */}\r\n <Box>\r\n <TextField\r\n fullWidth\r\n label=\"Placeholder\"\r\n is_required\r\n name=\"placeholder\"\r\n type=\"text\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={element.placeholder}\r\n />\r\n </Box>\r\n\r\n {/* Default Value Selection */}\r\n <Box>\r\n <Select\r\n fullWidth\r\n placeholder=\"Select Default\"\r\n size=\"small\"\r\n name=\"default_value\"\r\n onChange={handleSelectUpdate}\r\n value={element.default_value || \"\"}\r\n label=\"Default\"\r\n variant=\"outlined\"\r\n disabled={element.is_multiselect}\r\n renderValue={() => selectedOptionLabel}\r\n >\r\n {selectOptions.map((option, index) => (\r\n <MenuItem key={`${option.value}-${index}`} value={option.value}>\r\n {option.label}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </Box>\r\n\r\n {/* Column Per Row Selection */}\r\n <Box>\r\n <FormControl fullWidth>\r\n <Select\r\n fullWidth\r\n placeholder=\"Select Column Per Row\"\r\n size=\"small\"\r\n onChange={handleColumnSelect}\r\n label=\"Select Column Per Row\"\r\n name=\"columnPerRow\"\r\n variant=\"outlined\"\r\n >\r\n {COLUMN_PER_ROW_OPTIONS.map((option) => (\r\n <MenuItem key={option} value={option}>\r\n {option}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Box>\r\n\r\n {/* Width Slider */}\r\n <Box>\r\n <Typography sx={{ color: 'black', mb: 1 }}>\r\n Adjust Width:\r\n </Typography>\r\n <Box pr={2}>\r\n <Slider\r\n value={element.custom_width || 6}\r\n min={1}\r\n max={12}\r\n step={1}\r\n onChange={handleWidthChangeCallback}\r\n aria-labelledby=\"width-slider\"\r\n sx={{ color: \"#4AC08C\" }}\r\n marks\r\n valueLabelDisplay=\"auto\"\r\n />\r\n </Box>\r\n </Box>\r\n\r\n {/* Options Management */}\r\n <Box className=\"formSection--SelectOption\">\r\n <Typography \r\n type=\"s5\" \r\n weight=\"medium\" \r\n color=\"theme.secondary.800\"\r\n sx={{ mb: 0.5 }}\r\n >\r\n Options\r\n </Typography>\r\n \r\n {/* Existing Options */}\r\n {selectOptions.map((option, index) => (\r\n <Box key={`option-${index}`} sx={{ mb: 1, display: 'flex', gap: 1 }}>\r\n <TextField\r\n fullWidth\r\n value={`${option.label} (${option.value})`}\r\n InputProps={{ readOnly: true }}\r\n />\r\n <IconButton\r\n color=\"error\"\r\n size=\"small\"\r\n onClick={() => handleRemoveOption(index)}\r\n >\r\n <Trash />\r\n </IconButton>\r\n </Box>\r\n ))}\r\n\r\n {/* Add New Option Form */}\r\n {isAddingOption && (\r\n <Box className=\"formSection--SelectOption\" sx={{ mt:0.5, p: 2, border: '1px solid #ddd', borderRadius: 1 }}>\r\n <Box sx={{ mb: 2 }}>\r\n <TextField\r\n fullWidth\r\n label=\"Option Label\"\r\n is_required\r\n name=\"label\"\r\n type=\"text\"\r\n placeholder=\"Enter option label\"\r\n value={newOption.label}\r\n onChange={handleNewOptionChange}\r\n />\r\n </Box>\r\n <Box sx={{ mb: 2 }}>\r\n <TextField\r\n fullWidth\r\n label=\"Option Value\"\r\n placeholder=\"Enter option value\"\r\n is_required\r\n name=\"value\"\r\n type=\"text\"\r\n value={newOption.value}\r\n onChange={handleNewOptionChange}\r\n />\r\n </Box>\r\n <Box sx={{ display: 'flex', gap: 1 }}>\r\n <Button\r\n onClick={handleAddOption}\r\n // className=\"formSection--Button\"\r\n startIcon={<Add />}\r\n disabled={!newOption.label.trim() || !newOption.value.trim()}\r\n >\r\n Add Option\r\n </Button>\r\n <Button\r\n onClick={() => {\r\n setIsAddingOption(false);\r\n setNewOption({ label: \"\", value: \"\" });\r\n }}\r\n variant=\"outlined\"\r\n >\r\n Cancel\r\n </Button>\r\n </Box>\r\n </Box>\r\n )}\r\n\r\n {/* Add Option Button */}\r\n {!isAddingOption && (\r\n <Button\r\n onClick={() => setIsAddingOption(true)}\r\n variant=\"outlined\"\r\n className=\"formSection--Button\"\r\n startIcon={<Add />}\r\n sx={{ mt: 1 }}\r\n >\r\n Add Option\r\n </Button>\r\n )}\r\n </Box>\r\n\r\n {/* Form Controls */}\r\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\r\n <FormControlLabel\r\n name=\"is_multiselect\"\r\n control={<Checkbox />}\r\n onChange={handleMultiSelect}\r\n checked={element.is_multiselect}\r\n label=\"Enable Multi Select\"\r\n />\r\n\r\n <FormControlLabel\r\n name=\"is_required\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={element.is_required}\r\n label=\"This field is required\"\r\n />\r\n\r\n <FormControlLabel\r\n name=\"is_unique\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={element.is_unique}\r\n label=\"Is Unique\"\r\n />\r\n\r\n <FormControlLabel\r\n name=\"is_fullwidth\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={element.is_fullwidth}\r\n label=\"Full Width\"\r\n />\r\n </Box>\r\n </Box>\r\n );\r\n});\r\n\r\nSelectEditForm.displayName = 'SelectEditForm';\r\n\r\nexport default SelectEditForm;","// React imports\r\nimport { useEffect, useMemo, useState } from \"react\";\r\n\r\n// Material UI imports\r\nimport { MenuItem, Box, FormControlLabel } from \"@mui/material\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport { Add } from \"@mui/icons-material\";\r\n\r\n// ERP Common imports\r\nimport Select from \"@/components/select/select\";\r\nimport Button from \"@/components/button/button\";\r\nimport Typography from \"@/components/typography/typography\";\r\nimport TextField from \"@/components/text-field/text-field\";\r\nimport Checkbox from \"@/components/checkbox/checkbox\";\r\nimport { generateRandomId } from \"@/utils/common\";\r\nimport { SECTION_TYPES } from \"@/utils/constant\";\r\n\r\n// Local imports\r\nimport { ISwitcherForms } from \"../field_properties\";\r\nimport \"../custom-form.scss\";\r\n\r\nconst SectionEditForm = (props: any) => {\r\n const { handlePropertyValueUpdate } = props;\r\n const [elementJSON, setElementJSON] = useState(props.element);\r\n const [addForm, setAddForm] = useState<boolean>(false);\r\n const [newForm, setNewForm] = useState<string>(\"\");\r\n const selectOption = [\"section\"];\r\n\r\n const isDuplicateFormName = useMemo(\r\n () =>\r\n elementJSON.switcher_forms?.map((ele: any) => ele.name).includes(newForm),\r\n [elementJSON.switcher_forms, newForm]\r\n );\r\n\r\n useEffect(() => {\r\n setElementJSON(props.element);\r\n }, [props.element]);\r\n\r\n return (\r\n <Box className=\"formSection--FieldContainer\" key={elementJSON.id}>\r\n <div>\r\n <Select\r\n key={elementJSON.id}\r\n fullWidth\r\n placeholder=\"Select Field\"\r\n size=\"small\"\r\n disabled\r\n defaultValue={elementJSON.field_type}\r\n label=\"Field Type\"\r\n variant=\"outlined\"\r\n >\r\n {selectOption?.map((item) => (\r\n <MenuItem value={item}>{item}</MenuItem>\r\n ))}\r\n </Select>\r\n </div>\r\n <div>\r\n <Select\r\n key={elementJSON.id}\r\n fullWidth\r\n placeholder=\"Select Field\"\r\n size=\"small\"\r\n name=\"section_type\"\r\n defaultValue={elementJSON.section_type}\r\n label=\"Section Type\"\r\n variant=\"outlined\"\r\n onChange={(e: any) => handlePropertyValueUpdate(e)}\r\n >\r\n {Object.values(SECTION_TYPES).map((type) => {\r\n return (\r\n <MenuItem key={type} value={type}>\r\n {type}\r\n </MenuItem>\r\n );\r\n })}\r\n </Select>\r\n </div>\r\n <div>\r\n <TextField\r\n fullWidth\r\n label=\"Label\"\r\n is_required\r\n key={elementJSON.id}\r\n name=\"label\"\r\n type=\"text\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={elementJSON.label}\r\n />\r\n </div>\r\n <FormControlLabel\r\n key={elementJSON.id}\r\n name=\"is_accordion\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={elementJSON.is_accordion}\r\n label=\"Is Accordion\"\r\n />\r\n {elementJSON.section_type === SECTION_TYPES.FORM_SWITCH_SECTION ? (\r\n <div className=\"formSection--SubFieldContainer\">\r\n <div>\r\n <TextField\r\n fullWidth\r\n label=\"Form label\"\r\n is_required\r\n key={elementJSON.id}\r\n name=\"form_switcher_label\"\r\n type=\"text\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={elementJSON.form_switcher_label}\r\n />\r\n </div>\r\n <div>\r\n <Typography\r\n type=\"s5\"\r\n weight={\"medium\"}\r\n color={\"theme.secondary.800\"}\r\n >\r\n Forms\r\n </Typography>\r\n {elementJSON?.switcher_forms?.map(\r\n (ele: ISwitcherForms) => (\r\n <div className=\"formSection--MultiOptions\" key={elementJSON.id}>\r\n <TextField\r\n fullWidth\r\n key={ele.id}\r\n value={ele.name}\r\n style={{ marginBottom: \"10px\" }}\r\n name=\"switcher_forms\"\r\n onChange={(e: any) => {\r\n const newVal = elementJSON.switcher_forms?.map(\r\n (formEle: ISwitcherForms) =>\r\n ele.id === formEle.id\r\n ? { ...formEle, name: e.target.value }\r\n : { ...formEle }\r\n );\r\n\r\n handlePropertyValueUpdate(e, newVal);\r\n }}\r\n />\r\n <CloseIcon\r\n style={{ fontSize: \"1rem\", color: \"#656669\" }}\r\n onClick={(e: any) => {\r\n const newVal = [...elementJSON.switcher_forms].filter(\r\n (item) => item.id !== ele.id\r\n );\r\n e.target.name = \"switcher_forms\";\r\n handlePropertyValueUpdate(e, newVal);\r\n }}\r\n />\r\n </div>\r\n )\r\n )}\r\n </div>\r\n {addForm ? (\r\n <div>\r\n <div\r\n className=\"formSection--MultiOptions formSection--FullWidth\"\r\n key={elementJSON.id}\r\n >\r\n <div className=\"formSection--FullWidth\">\r\n <TextField\r\n fullWidth\r\n label=\"Form section name\"\r\n placeholder=\"Form section name\"\r\n is_required\r\n key={elementJSON.id}\r\n type=\"text\"\r\n value={newForm}\r\n error={isDuplicateFormName}\r\n helperText={\r\n isDuplicateFormName\r\n ? \"Form section name can not duplicate\"\r\n : \"\"\r\n }\r\n onChange={(e: any) => setNewForm(e.target.value)}\r\n />\r\n </div>\r\n <CloseIcon\r\n style={{ fontSize: \"1rem\", color: \"#656669\" }}\r\n onClick={() => {\r\n setAddForm(false);\r\n setNewForm(\"\");\r\n }}\r\n />\r\n </div>\r\n <Button\r\n onClick={(e: any) => {\r\n const { uniqueStringId: id } = generateRandomId();\r\n const newVal = [\r\n ...elementJSON.switcher_forms,\r\n { name: newForm, id },\r\n ];\r\n handlePropertyValueUpdate(e, newVal);\r\n setNewForm(\"\");\r\n setAddForm(false);\r\n }}\r\n name=\"switcher_forms\"\r\n variant=\"text\"\r\n className=\"formSection--Button\"\r\n disabled={isDuplicateFormName || !newForm}\r\n startIcon={<Add />}\r\n >\r\n Add\r\n </Button>\r\n </div>\r\n ) : null}\r\n {!addForm ? (\r\n <Button\r\n onClick={() => setAddForm(true)}\r\n variant=\"text\"\r\n className=\"formSection--Button\"\r\n startIcon={<Add />}\r\n >\r\n Add forms\r\n </Button>\r\n ) : null}\r\n </div>\r\n ) : null}\r\n </Box>\r\n );\r\n};\r\n\r\nexport { SectionEditForm };\nexport default SectionEditForm;\r\n","// React imports\r\nimport { useEffect, useState } from \"react\";\r\n\r\n// Material UI imports\r\nimport {\r\n MenuItem,\r\n Box,\r\n FormControlLabel,\r\n FormControl,\r\n RadioGroup,\r\n Button,\r\n Select,\r\n InputLabel,\r\n Slider,\r\n} from \"@mui/material\";\r\nimport { Add } from \"@mui/icons-material\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\n// ERP Common imports\r\nimport Checkbox from \"@/components/checkbox/checkbox\";\r\nimport Radio from \"@/components/radio/radio\";\r\nimport TextField from \"@/components/text-field/text-field\";\r\nimport Typography from \"@/components/typography/typography\";\r\n\r\n// Local imports\r\nimport FieldSelect from \"./field-select\";\r\nimport \"../custom-form.scss\";\r\n\r\ninterface Option {\r\n label: string;\r\n value: string;\r\n is_checked: boolean;\r\n [key: string]: string | boolean; // Index signature to allow any string property\r\n}\r\n\r\nexport function CheckboxEditForm(props: any) {\r\n const [isAddSelectOption, setAddSelectOption] = useState(false);\r\n const { handlePropertyValueUpdate, handleSelectOptionValueUpdate , handleColumnSelect , handleWidthChange } = props;\r\n const columnPerRowOptions = [1, 2, 3, 4, 5, 6];\r\n const [selectOptions, setSelectOptions] = useState(\r\n props.element.options || [],\r\n );\r\n const [elementJSON, setElementJSON] = useState(props.element);\r\n\r\n const allowLabelPositionModification =\r\n elementJSON.field_type !== \"radioButton\";\r\n\r\n const [newOptions, setNewOptions] = useState<Option>({\r\n label: \"\",\r\n value: \"\",\r\n is_checked: false,\r\n });\r\n\r\n\r\n\r\n const handleAddNewOption = (e: any) => {\r\n const label: string = e.target.name;\r\n const value: string = e.target.value;\r\n const option: Option = { ...newOptions };\r\n option[label] = value;\r\n setNewOptions(option);\r\n };\r\n\r\n const handleFieldUpdate = (e: any) => {\r\n elementJSON.field_type = e.target.value;\r\n handlePropertyValueUpdate(null, null, null, e.target.value);\r\n };\r\n\r\n const handleSelectUpdate = (e: any) => {\r\n elementJSON.default_value = e.target.value;\r\n handlePropertyValueUpdate(null, null, e.target.value);\r\n };\r\n\r\n useEffect(() => {\r\n setElementJSON(props.element);\r\n setSelectOptions(props.element.options || []);\r\n }, [props.element]);\r\n\r\n useEffect(() => {\r\n setNewOptions({ label: \"\", value: \"\", is_checked: false });\r\n setAddSelectOption(false);\r\n handleSelectOptionValueUpdate(selectOptions);\r\n // eslint-disable-next-line\r\n }, [selectOptions]);\r\n\r\n return (\r\n <Box className=\"formSection--FieldContainer\" key={elementJSON.id}>\r\n <div key={elementJSON.id}>\r\n <FieldSelect\r\n key={elementJSON.id}\r\n variant=\"outlined\"\r\n onChange={handleFieldUpdate}\r\n defaultValue={elementJSON.field_type}\r\n label=\"Field Type\"\r\n disabled={elementJSON.type === \"system\" || !elementJSON.is_new}\r\n />\r\n </div>\r\n <div key={elementJSON.id}>\r\n <TextField\r\n fullWidth\r\n label=\"Label\"\r\n is_required\r\n key={elementJSON.id}\r\n name=\"label\"\r\n type=\"text\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={elementJSON.label}\r\n />\r\n </div>\r\n\r\n <div key={elementJSON.id}>\r\n <Select\r\n variant=\"outlined\"\r\n key={elementJSON.id}\r\n fullWidth\r\n placeholder=\"Select Default\"\r\n size=\"small\"\r\n name=\"options\"\r\n onChange={() => handleSelectUpdate}\r\n defaultValue={elementJSON.default_value}\r\n label=\"Default\"\r\n disabled={!selectOptions.length}\r\n >\r\n {selectOptions?.map((option: any, index: number) => (\r\n <MenuItem key={index} value={option.value}>\r\n {option.label}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </div>\r\n <FormControl>\r\n <Select\r\n key={elementJSON.id}\r\n fullWidth\r\n placeholder=\"Select Column Per Row\"\r\n size=\"small\"\r\n onChange={handleColumnSelect} // need to change\r\n // defaultValue= {} // need to change\r\n label=\"Select Column Per Row\"\r\n name=\"option\"\r\n variant=\"outlined\"\r\n >\r\n {columnPerRowOptions?.map((option: any, index: number) => (\r\n <MenuItem key={index} value={option}>\r\n {option}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n <Box>\r\n <Typography sx={{ color: 'black' }}>Adjust Width:</Typography>\r\n <Slider\r\n value = {elementJSON?.custom_width}\r\n name = \"custom_width\"\r\n min={1}\r\n max={12}\r\n step={1}\r\n onChange={(_, newValue) => handleWidthChange(newValue)}\r\n aria-labelledby=\"width-slider\"\r\n sx = {{color : \"#4AC08C\"}}\r\n />\r\n </Box>\r\n \r\n\r\n <div className=\"formSection--SelectOption\">\r\n <Typography type=\"s5\" weight={\"medium\"} color={\"theme.secondary.800\"}>\r\n Options\r\n </Typography>\r\n {selectOptions.map((option: any, index: number) => (\r\n <div className=\"formSection--MultiOptions\">\r\n <TextField\r\n fullWidth\r\n key={index}\r\n value={`${option.label} (${option.value})`}\r\n InputProps={{\r\n readOnly: true,\r\n }}\r\n />\r\n <CloseIcon\r\n style={{ fontSize: \"1rem\", color: \"#656669\" }}\r\n onClick={() => {\r\n setSelectOptions([\r\n ...selectOptions.filter(\r\n (_: any, filterIndex: number) => filterIndex !== index,\r\n ),\r\n ]);\r\n }}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n {isAddSelectOption ? (\r\n <div className=\"formSection--SelectOption\">\r\n <div>\r\n <TextField\r\n fullWidth\r\n label=\"Label\"\r\n is_required\r\n name=\"label\"\r\n type=\"text\"\r\n placeholder=\"Label\"\r\n defaultValue={newOptions.label}\r\n onChange={handleAddNewOption}\r\n />\r\n </div>\r\n <div>\r\n <TextField\r\n fullWidth\r\n label=\"Value\"\r\n placeholder=\"Value\"\r\n is_required\r\n name=\"value\"\r\n type=\"text\"\r\n defaultValue={newOptions.value}\r\n onChange={handleAddNewOption}\r\n />\r\n </div>\r\n <Button\r\n onClick={() =>\r\n setSelectOptions([...selectOptions, { ...newOptions }])\r\n }\r\n disabled={\r\n !!selectOptions.find(\r\n (ele: Option) => ele.value === newOptions.value,\r\n )\r\n }\r\n variant=\"text\"\r\n className=\"formSection--Button\"\r\n startIcon={<Add />}\r\n >\r\n Add\r\n </Button>\r\n </div>\r\n ) : (\r\n <Button\r\n onClick={() => setAddSelectOption(true)}\r\n variant=\"text\"\r\n className=\"formSection--Button\"\r\n startIcon={<Add />}\r\n >\r\n Add Option\r\n </Button>\r\n )}\r\n\r\n <FormControl>\r\n <Typography type=\"s4\" color=\"theme.secondary.800\">\r\n Display style\r\n </Typography>\r\n <RadioGroup\r\n key={elementJSON.id}\r\n row\r\n aria-labelledby=\"demo-radio-buttons-group-label\"\r\n name=\"display\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={elementJSON.display}\r\n >\r\n <FormControlLabel\r\n value=\"row\"\r\n control={<Radio size=\"small\" />}\r\n label=\"Row\"\r\n slotProps={{ typography: { variant: \"body2\" } }}\r\n />\r\n <FormControlLabel\r\n value=\"column\"\r\n control={<Radio size=\"small\" />}\r\n label=\"Column\"\r\n slotProps={{ typography: { variant: \"body2\" } }}\r\n />\r\n </RadioGroup>\r\n </FormControl>\r\n\r\n <div key={elementJSON.id}>\r\n <TextField\r\n key={elementJSON.id}\r\n fullWidth\r\n label=\"Title\"\r\n is_required\r\n name=\"title\"\r\n type=\"text\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={elementJSON.title}\r\n />\r\n </div>\r\n\r\n <FormControl disabled={!allowLabelPositionModification}>\r\n <Typography type=\"s4\" color=\"theme.secondary.800\">\r\n Title Position\r\n </Typography>\r\n <RadioGroup\r\n key={elementJSON.id}\r\n row\r\n aria-labelledby=\"demo-radio-buttons-group-label\"\r\n name=\"title_position\"\r\n onChange={handlePropertyValueUpdate}\r\n defaultValue={allowLabelPositionModification ? \"end\" : \"\"}\r\n >\r\n <FormControlLabel\r\n value=\"start\"\r\n control={<Radio size=\"small\" />}\r\n label=\"Start\"\r\n slotProps={{ typography: { variant: \"body2\" } }}\r\n />\r\n <FormControlLabel\r\n value=\"end\"\r\n control={<Radio size=\"small\" />}\r\n label=\"End\"\r\n slotProps={{ typography: { variant: \"body2\" } }}\r\n />\r\n </RadioGroup>\r\n </FormControl>\r\n\r\n <FormControlLabel\r\n key={elementJSON.id}\r\n name=\"is_required\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={elementJSON.is_required}\r\n label=\"This field is required\"\r\n />\r\n <FormControlLabel\r\n key={elementJSON.id}\r\n name=\"is_unique\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate}\r\n checked={elementJSON.is_unique}\r\n label=\"Is Unique\"\r\n />\r\n\r\n <FormControlLabel\r\n key={elementJSON.id}\r\n name=\"is_fullwidth\"\r\n control={<Checkbox />}\r\n onChange={handlePropertyValueUpdate} // need to change this\r\n checked={elementJSON?.is_fullwidth}// need to change \r\n label=\"Full Width \"\r\n />\r\n </Box>\r\n );\r\n}\r\n\r\nexport default CheckboxEditForm;\r\n","// React imports\r\nimport React, { useEffect, useState } from 'react';\r\n\r\n// Material UI imports\r\nimport { MenuItem, Box, SelectChangeEvent } from '@mui/material';\r\n\r\n// Third-party imports\r\nimport { MRT_ColumnDef, MRT_RowData } from 'material-react-table';\r\n\r\n// ERP Common imports\r\nimport Select from '@/components/select/select';\r\nimport TextField from '@/components/text-field/text-field';\r\nimport formatText from '@/utils/format-text';\r\n\r\n// Local imports\r\nimport { IElementJson } from '../custom-form';\r\nimport { ApiFormFields } from '../../Redux/state';\r\nimport FieldSelect from './field-select';\r\nimport '../custom-form.scss';\r\n\r\ninterface ITableEditForm {\r\n\thandlePropertyValueUpdate: (\r\n\t\tevent?: any,\r\n\t\tnumberValue?: any,\r\n\t\tval?: any,\r\n\t\tfieldType?: any\r\n\t) => void;\r\n\thandleColumnsUpdate: (columns: MRT_ColumnDef<MRT_RowData>[]) => void;\r\n\telement: IElementJson | null;\r\n\tfields: ApiFormFields | null;\r\n}\r\n\r\ninterface TableOption {\r\n\tlabel: string;\r\n\tvalue: string;\r\n}\r\n\r\nconst TableEditForm: React.FC<ITableEditForm> = ({\r\n\thandlePropertyValueUpdate,\r\n\telement,\r\n\thandleColumnsUpdate,\r\n\tfields\r\n}) => {\r\n\t/* Local States */\r\n\tconst [elementJSON, setElementJSON] = useState<IElementJson | null>(element);\r\n\tconst [tables, setTables] = useState<TableOption[]>([]);\r\n\r\n\t/* Local Functions */\r\n\tconst handleFieldUpdate = (event: SelectChangeEvent<unknown>) => {\r\n\t\tif (elementJSON) {\r\n\t\t\telementJSON.field_type = event.target.value as string;\r\n\t\t\thandlePropertyValueUpdate(null, null, null, event.target.value as string);\r\n\t\t}\r\n\t};\r\n\tconst handleTableSelect = (event: SelectChangeEvent<unknown>) => {\r\n\t\thandlePropertyValueUpdate(event);\r\n\t};\r\n\r\n\t/* Use Effects */\r\n\tuseEffect(() => {\r\n\t\tsetElementJSON(element);\r\n\t}, [element]);\r\n\tuseEffect(() => {\r\n\t\tif (elementJSON && elementJSON.table && fields) {\r\n\t\t\tconst fieldsArr = fields[elementJSON.table];\r\n\t\t\tlet columns: any[] = [];\r\n\t\t\tif (fieldsArr && fieldsArr?.length) {\r\n\t\t\t\tcolumns = fieldsArr.map((field, index) => ({\r\n\t\t\t\t\theader: formatText(field.field),\r\n\t\t\t\t\taccessorKey: field.field,\r\n\t\t\t\t\tvisible: index > 3 ? false : true,\r\n\t\t\t\t\ttype: field.type\r\n\t\t\t\t}));\r\n\t\t\t} else {\r\n\t\t\t\tcolumns = [\r\n\t\t\t\t\t{ header: 'Column 1', accessorKey: 'column_1', visible: true },\r\n\t\t\t\t\t{ header: 'Column 2', accessorKey: 'column_1', visible: true }\r\n\t\t\t\t];\r\n\t\t\t}\r\n\t\t\tcolumns && handleColumnsUpdate(columns);\r\n\t\t}\r\n\t}, [elementJSON?.table]);\r\n\tuseEffect(() => {\r\n\t\tif (fields) {\r\n\t\t\tconst options = Object.keys(fields).map((key) => ({\r\n\t\t\t\tlabel: formatText(key),\r\n\t\t\t\tvalue: key\r\n\t\t\t}));\r\n\t\t\tsetTables(options);\r\n\t\t}\r\n\t}, [fields]);\r\n\r\n\tif (!elementJSON) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\treturn (\r\n\t\t<Box className='formSection--FieldContainer' key={elementJSON.id}>\r\n\t\t\t<div key={elementJSON.id}>\r\n\t\t\t\t<FieldSelect\r\n\t\t\t\t\tkey={elementJSON.id}\r\n\t\t\t\t\tvariant='outlined'\r\n\t\t\t\t\tonChange={handleFieldUpdate}\r\n\t\t\t\t\tdefaultValue={elementJSON.field_type}\r\n\t\t\t\t\tdisabled={elementJSON.type === 'system' || !elementJSON.is_new}\r\n\t\t\t\t/>\r\n\t\t\t</div>\r\n\t\t\t<div key={elementJSON.id}>\r\n\t\t\t\t<TextField\r\n\t\t\t\t\tfullWidth\r\n\t\t\t\t\tlabel='Label'\r\n\t\t\t\t\tis_required\r\n\t\t\t\t\tkey={elementJSON.id}\r\n\t\t\t\t\tname='label'\r\n\t\t\t\t\ttype='text'\r\n\t\t\t\t\tonChange={handlePropertyValueUpdate}\r\n\t\t\t\t\tdefaultValue={elementJSON.label}\r\n\t\t\t\t/>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div key={elementJSON.id}>\r\n\t\t\t\t<Select\r\n\t\t\t\t\tkey={elementJSON.id}\r\n\t\t\t\t\tvariant='outlined'\r\n\t\t\t\t\tlabel='Table'\r\n\t\t\t\t\tfullWidth\r\n\t\t\t\t\tplaceholder='Select Table'\r\n\t\t\t\t\tsize='small'\r\n\t\t\t\t\tname='table'\r\n\t\t\t\t\tdefaultValue={elementJSON.table}\r\n\t\t\t\t\tdisabled={elementJSON.type === 'system'}\r\n\t\t\t\t\tonChange={handleTableSelect}\r\n\t\t\t\t\trenderValue={(value: string) =>\r\n\t\t\t\t\t\ttables.find((option) => option.value === value)?.label\r\n\t\t\t\t\t}>\r\n\t\t\t\t\t{tables?.map((item) => (\r\n\t\t\t\t\t\t<MenuItem value={item.value}>{item.label}</MenuItem>\r\n\t\t\t\t\t))}\r\n\t\t\t\t</Select>\r\n\t\t\t</div>\r\n\t\t</Box>\r\n\t);\r\n};\r\n\r\nexport default TableEditForm;\r\n","// React imports\r\nimport React, { memo, useMemo, useCallback } from 'react';\r\n\r\n// Material UI imports\r\nimport { Grid } from '@mui/material';\r\n\r\n// ERP Common imports - Form builder elements\r\nimport DynamicInput from '@/components/form-control/form-builder/form-builder-element/text';\r\nimport DynamicCheckBox from '@/components/form-control/form-builder/form-builder-element/checkbox';\r\nimport DynamicTable from '@/components/form-control/form-builder/form-builder-element/table';\r\nimport DynamicElementHOC from '@/components/form-control/form-builder/form-builder-element/dynamic-element-hoc';\r\nimport DynamicRadioButton from '@/components/form-control/form-builder/form-builder-element/radio-button';\r\nimport DynamicToggleButton from '@/components/form-control/form-builder/form-builder-element/toggle-button';\r\nimport DynamicInfo from '@/components/form-control/form-builder/form-builder-element/info';\r\nimport DynamicMedia from '@/components/form-control/form-builder/form-builder-element/media';\r\nimport DynamicTime from '@/components/form-control/form-builder/form-builder-element/time';\r\nimport DynamicDate from '@/components/form-control/form-builder/form-builder-element/date';\r\nimport DynamicSelect from '@/components/form-control/form-builder/form-builder-element/select';\r\nimport DynamicPhone from '@/components/form-control/form-builder/form-builder-element/phone';\r\n\r\n// Types\r\ninterface IField {\r\n id: string;\r\n field_type: string;\r\n placeholder?: string;\r\n label: string;\r\n default_value?: any;\r\n is_multiline?: boolean;\r\n is_required?: boolean;\r\n min_length?: number;\r\n max_length?: number;\r\n is_fullwidth?: boolean;\r\n custom_width?: number;\r\n options?: any[];\r\n is_multiselect?: boolean;\r\n is_future_dates_allowed?: boolean;\r\n is_past_dates_allowed?: boolean;\r\n option?: any;\r\n max_size?: number;\r\n title?: string;\r\n display?: string;\r\n title_position?: string;\r\n table_columns?: any[];\r\n float_step?: number;\r\n type: string;\r\n}\r\n\r\ninterface FormFieldsProps {\r\n sectionMembers: IField[];\r\n // Add other required props with proper types\r\n members: IField[];\r\n activeMember?: number;\r\n control: any;\r\n t: (key: string) => string;\r\n element: any;\r\n images: any;\r\n elementJSON?: any;\r\n remove: (index: number) => void;\r\n move: (from: number, to: number) => void;\r\n handleElementSelection: (e: any) => void;\r\n setElementSwap: (value: boolean) => void;\r\n handleDuplicateElement: (index: number) => void;\r\n setSelectedHoc: (value: string) => void;\r\n setActiveMember: (value: number | undefined) => void;\r\n}\r\n\r\n// Field type mapping for better maintainability\r\nconst FIELD_TYPE_MAP = {\r\n TEXT: 'text',\r\n EMAIL: 'email',\r\n NUMBER: 'number',\r\n PHONE: 'phone',\r\n SELECT: 'select',\r\n DATE: 'date',\r\n TIME: 'time',\r\n URL: 'url',\r\n CURRENCY: 'currency',\r\n FILE: 'file',\r\n IMAGE: 'image',\r\n GEO_LOCATION: 'geoLocation',\r\n RELATION: 'relation',\r\n INFO: 'info',\r\n TOGGLE_BUTTON: 'toggleButton',\r\n RADIO_BUTTON: 'radioButton',\r\n TAGS_INPUT: 'tagsInput',\r\n CHECKBOX: 'checkbox',\r\n TABLE: 'table'\r\n} as const;\r\n\r\n// Memoized individual field component\r\nconst FormField = memo<{\r\n field: IField;\r\n index: number;\r\n gridItemSize: number;\r\n activeMember?: number;\r\n control: any;\r\n t: (key: string) => string;\r\n element: any;\r\n images: any;\r\n elementJSON?: any;\r\n remove: (index: number) => void;\r\n move: (from: number, to: number) => void;\r\n handleElementSelection: (e: any) => void;\r\n setElementSwap: (value: boolean) => void;\r\n handleDuplicateElement: (index: number) => void;\r\n setSelectedHoc: (value: string) => void;\r\n setActiveMember: (value: number | undefined) => void;\r\n}>(({\r\n field,\r\n index,\r\n gridItemSize,\r\n activeMember,\r\n control,\r\n t,\r\n element,\r\n images,\r\n elementJSON,\r\n remove,\r\n move,\r\n handleElementSelection,\r\n setElementSwap,\r\n handleDuplicateElement,\r\n setSelectedHoc,\r\n setActiveMember\r\n}) => {\r\n // Common HOC props - memoized to prevent unnecessary re-renders\r\n const hocProps = useMemo(() => ({\r\n activeIndex: activeMember === index,\r\n removeElement: remove,\r\n index,\r\n onClick: handleElementSelection,\r\n swap: move,\r\n elementSwap: () => setElementSwap(true),\r\n handleDuplicate: handleDuplicateElement,\r\n setElementHoc: () => {\r\n setSelectedHoc(\"\");\r\n setActiveMember(undefined);\r\n }\r\n }), [\r\n activeMember, \r\n index, \r\n remove, \r\n handleElementSelection, \r\n move, \r\n setElementSwap, \r\n handleDuplicateElement, \r\n setSelectedHoc, \r\n setActiveMember\r\n ]);\r\n\r\n // Common field props - memoized to prevent unnecessary re-renders\r\n const commonFieldProps = useMemo(() => ({\r\n key: field.id,\r\n position: index,\r\n placeholder: t(field.placeholder || ''),\r\n label: t(field.label),\r\n formControl: control,\r\n name: \"message\",\r\n fieldArrayName: \"members\",\r\n required: field.is_required,\r\n formType: \"builder\" as const,\r\n typeOfField: field.type,\r\n disabled: true\r\n }), [field.id, field.placeholder, field.label, field.is_required, field.type, index, t, control]);\r\n\r\n // Render field based on type\r\n const renderFieldContent = useCallback(() => {\r\n const { field_type } = field;\r\n\r\n switch (field_type) {\r\n case element.text.field_type:\r\n return (\r\n <DynamicInput\r\n {...commonFieldProps}\r\n type={field_type}\r\n defaultValue={field.default_value}\r\n is_multiline={field.is_multiline}\r\n min={field.min_length}\r\n max={field.max_length}\r\n />\r\n );\r\n\r\n case element.email.field_type:\r\n return (\r\n <DynamicInput\r\n {...commonFieldProps}\r\n type={field_type}\r\n defaultValue={field.default_value}\r\n endIcon={<img src={images.sms} alt=\"email\" />}\r\n />\r\n );\r\n\r\n case element.number.field_type:\r\n return (\r\n <DynamicInput\r\n {...commonFieldProps}\r\n type={field_type}\r\n defaultValue={field.default_value}\r\n min={field.min_length}\r\n max={field.max_length}\r\n float_step={field.float_step}\r\n />\r\n );\r\n\r\n case element.phone.field_type:\r\n return (\r\n <DynamicPhone\r\n {...commonFieldProps}\r\n type={field_type}\r\n default_value={field.default_value}\r\n />\r\n );\r\n\r\n case element.select.field_type:\r\n return (\r\n <DynamicSelect\r\n {...commonFieldProps}\r\n options={field.options}\r\n defaultValue={field.default_value}\r\n is_multiselect={field.is_multiselect}\r\n />\r\n );\r\n\r\n case element.date.field_type:\r\n return (\r\n <DynamicDate\r\n {...commonFieldProps}\r\n defaultValue={field.default_value}\r\n is_future_dates_allowed={field.is_future_dates_allowed}\r\n is_past_dates_allowed={field.is_past_dates_allowed}\r\n disable={true}\r\n />\r\n );\r\n\r\n case element.time.field_type:\r\n return (\r\n <DynamicTime\r\n {...commonFieldProps}\r\n option={field.option}\r\n />\r\n );\r\n\r\n case element.url.field_type:\r\n return (\r\n <DynamicInput\r\n {...commonFieldProps}\r\n type={field_type}\r\n defaultValue={field.default_value}\r\n endIcon={<img src={images.url} alt=\"url\" />}\r\n />\r\n );\r\n\r\n case element.currency.field_type:\r\n return (\r\n <DynamicInput\r\n {...commonFieldProps}\r\n type={field_type}\r\n defaultValue={field.default_value}\r\n endIcon={<img src={images.dollar} alt=\"currency\" />}\r\n />\r\n );\r\n\r\n case element.file.field_type:\r\n case element.image.field_type:\r\n return (\r\n <DynamicMedia\r\n {...commonFieldProps}\r\n type={field_type}\r\n max_size={field.max_size}\r\n />\r\n );\r\n\r\n case element.geoLocation.field_type:\r\n return (\r\n <DynamicInput\r\n {...commonFieldProps}\r\n type={field_type}\r\n defaultValue={field.default_value}\r\n endIcon={<img src={images.location} alt=\"location\" />}\r\n />\r\n );\r\n\r\n case element.relation.field_type:\r\n return (\r\n <DynamicInput\r\n {...commonFieldProps}\r\n type={field_type}\r\n defaultValue={field.default_value}\r\n is_multiline={field.is_multiline}\r\n min={field.min_length}\r\n max={field.max_length}\r\n label={\r\n <span\r\n className=\"formSection--Relation\"\r\n data-position={index}\r\n data-name={`members.${index}.message`}\r\n >\r\n {t(field.label)}\r\n <img src={images.relation} alt=\"relation\" />\r\n </span>\r\n }\r\n />\r\n );\r\n\r\n case element.info.field_type:\r\n return (\r\n <DynamicInfo\r\n {...commonFieldProps}\r\n defaultValue={field.default_value}\r\n />\r\n );\r\n\r\n case element.toggleButton.field_type:\r\n return (\r\n <DynamicToggleButton\r\n {...commonFieldProps}\r\n title={t(field.title || '')}\r\n titlePosition={elementJSON?.title_position}\r\n />\r\n );\r\n\r\n case element.radioButton.field_type:\r\n return (\r\n <DynamicRadioButton\r\n {...commonFieldProps}\r\n options={field.options}\r\n display={field.display}\r\n titlePosition={elementJSON?.title_position}\r\n />\r\n );\r\n\r\n case element.tagsInput.field_type:\r\n return (\r\n <DynamicInput\r\n {...commonFieldProps}\r\n type={field_type}\r\n defaultValue={field.default_value}\r\n is_multiline={field.is_multiline}\r\n min={field.min_length}\r\n max={field.max_length}\r\n />\r\n );\r\n\r\n case element.checkbox.field_type:\r\n return (\r\n <DynamicCheckBox\r\n {...commonFieldProps}\r\n title={t(field.title || '')}\r\n titlePosition={field.title_position}\r\n />\r\n );\r\n\r\n case element.table.field_type:\r\n return (\r\n <DynamicTable\r\n {...commonFieldProps}\r\n columns={field.table_columns || elementJSON?.table_columns || []}\r\n />\r\n );\r\n\r\n default:\r\n console.warn(`Unknown field type: ${field_type}`);\r\n return null;\r\n }\r\n }, [field, commonFieldProps, element, images, elementJSON, t, index]);\r\n\r\n return (\r\n <Grid item xs={gridItemSize}>\r\n <DynamicElementHOC\r\n {...hocProps}\r\n element={field.field_type}\r\n >\r\n {renderFieldContent()}\r\n </DynamicElementHOC>\r\n </Grid>\r\n );\r\n});\r\n\r\nFormField.displayName = 'FormField';\r\n\r\n// Main component\r\nconst FormFields: React.FC<FormFieldsProps> = memo(({\r\n sectionMembers,\r\n members,\r\n activeMember,\r\n control,\r\n t,\r\n element,\r\n images,\r\n elementJSON,\r\n remove,\r\n move,\r\n handleElementSelection,\r\n setElementSwap,\r\n handleDuplicateElement,\r\n setSelectedHoc,\r\n setActiveMember\r\n}) => {\r\n // Memoize grid item size calculation\r\n const calculateGridSize = useCallback((field: IField): number => {\r\n if (field.is_fullwidth || field.field_type === \"table\") return 12;\r\n if (field.custom_width) return field.custom_width;\r\n return 6;\r\n }, []);\r\n\r\n // Memoize the rendered fields\r\n const renderedFields = useMemo(() => {\r\n return sectionMembers.map((field: IField) => {\r\n const index = members.findIndex(member => member === field);\r\n const gridItemSize = calculateGridSize(field);\r\n\r\n return (\r\n <FormField\r\n key={`${field.id}-${index}`} // Better key for React reconciliation\r\n field={field}\r\n index={index}\r\n gridItemSize={gridItemSize}\r\n activeMember={activeMember}\r\n control={control}\r\n t={t}\r\n element={element}\r\n images={images}\r\n elementJSON={elementJSON}\r\n remove={remove}\r\n move={move}\r\n handleElementSelection={handleElementSelection}\r\n setElementSwap={setElementSwap}\r\n handleDuplicateElement={handleDuplicateElement}\r\n setSelectedHoc={setSelectedHoc}\r\n setActiveMember={setActiveMember}\r\n />\r\n );\r\n });\r\n }, [\r\n sectionMembers,\r\n members,\r\n activeMember,\r\n control,\r\n t,\r\n element,\r\n images,\r\n elementJSON,\r\n remove,\r\n move,\r\n handleElementSelection,\r\n setElementSwap,\r\n handleDuplicateElement,\r\n setSelectedHoc,\r\n setActiveMember,\r\n calculateGridSize,\r\n elementJSON?.field_type\r\n ]);\r\n\r\n return <>{renderedFields}</>;\r\n});\r\n\r\nFormFields.displayName = 'FormFields';\r\n\r\nexport { FormField };\nexport default FormFields;","// React imports\r\nimport { useEffect, useMemo } from \"react\";\r\n\r\n// ERP Common imports\r\nimport formBuilderDeConversion from \"@/utils/form-builder-deconversion\";\r\n\r\n// Module pathname imports\r\nimport { PathnameAccounting } from \"../../../constants/pathnames/pathname.accounting\";\r\nimport { PathnameCrm } from \"../../../constants/pathnames/pathname.crm\";\r\nimport { PathnameInventory } from \"../../../constants/pathnames/pathname.inventory\";\r\nimport { PathnameManufacturing } from \"../../../constants/pathnames/pathname.manufacturing\";\r\nimport { PathnamePurchase } from \"../../../constants/pathnames/pathname.procurement\";\r\nimport { PathnameRental } from \"../../../constants/pathnames/pathname.rental\";\r\nimport { PathnameUsers } from \"../../../constants/pathnames/pathname.user\";\r\nimport { PathnameHrms } from \"../../../constants/pathnames/pathname.hrms\";\r\n\r\n// Types for better type safety\r\nexport interface TableColumn {\r\n header: string;\r\n accessorKey: string;\r\n visible: boolean;\r\n}\r\n\r\nexport interface FormMember {\r\n field_type: string;\r\n table?: string;\r\n table_columns?: TableColumn[];\r\n [key: string]: any;\r\n}\r\n\r\nexport interface FormSection {\r\n field_type: string;\r\n label: string;\r\n is_accordion: boolean;\r\n id: string;\r\n remove_section: boolean;\r\n form_switcher_label?: string;\r\n form_switcher_name?: string;\r\n is_section_field?: boolean;\r\n section_type?: string;\r\n switcher_forms?: any;\r\n members: FormMember[];\r\n}\r\n\r\nexport interface TabData {\r\n tab_order: number;\r\n data: FormSection[];\r\n}\r\n\r\nexport interface ProcessedData {\r\n tab?: TabData[];\r\n section?: FormSection[];\r\n tabsData?: TabData[];\r\n}\r\n\r\n// Constants for module paths\r\nconst MODULE_PATHS = {\r\n accounting: PathnameAccounting.FORMS,\r\n inventory: PathnameInventory.FORMS,\r\n manufacturing: PathnameManufacturing.FORMS,\r\n procurement: PathnamePurchase.FORMS,\r\n crm: PathnameCrm.FORMS,\r\n rental: PathnameRental.FORMS,\r\n user: PathnameUsers.FORMS,\r\n hrms: PathnameHrms.FORMS,\r\n} as const;\r\n\r\nexport type ModuleType = keyof typeof MODULE_PATHS;\r\n\r\n// Helper function to format text (converts snake_case to Title Case)\r\nexport const formatText = (text: string): string => {\r\n return text\r\n .split('_')\r\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\r\n .join(' ');\r\n};\r\n\r\n// Helper function to get redirection path\r\nconst getRedirectionPath = (currentModule: string): string => {\r\n if (!isValidModule(currentModule)) {\r\n throw new Error(`Invalid module: ${currentModule}`);\r\n }\r\n return MODULE_PATHS[currentModule as ModuleType];\r\n};\r\n\r\n// Type guard for module validation\r\nconst isValidModule = (module: string): module is ModuleType => {\r\n return module in MODULE_PATHS;\r\n};\r\n\r\n// Helper function to create default table columns\r\nexport const createDefaultTableColumns = (): TableColumn[] => [\r\n { header: \"Column 1\", accessorKey: \"column_1\", visible: true },\r\n { header: \"Column 2\", accessorKey: \"column_2\", visible: true },\r\n];\r\n\r\n// Helper function to process table columns\r\nexport const processTableColumns = (\r\n member: FormMember,\r\n formBuilder: any\r\n): TableColumn[] => {\r\n // Return existing columns if they exist\r\n if (member.table_columns?.length) {\r\n return member.table_columns;\r\n }\r\n\r\n // Check if table exists and has fields\r\n if (!member.table || !formBuilder.fields?.[member.table]) {\r\n return createDefaultTableColumns();\r\n }\r\n\r\n const fields = formBuilder.fields[member.table];\r\n if (!Array.isArray(fields) || fields.length === 0) {\r\n return createDefaultTableColumns();\r\n }\r\n\r\n return fields.map((field: any, index: number) => ({\r\n header: formatText(field.field),\r\n accessorKey: field.field,\r\n visible: index <= 3, // Show first 4 columns by default\r\n }));\r\n};\r\n\r\n// Helper function to process members\r\nexport const processMembers = (\r\n sections: FormSection[],\r\n formBuilder: any\r\n): FormMember[] => {\r\n return sections.flatMap((section) =>\r\n section.members.map((member) => {\r\n if (member.field_type === \"table\") {\r\n return {\r\n ...member,\r\n table_columns: processTableColumns(member, formBuilder),\r\n };\r\n }\r\n return { ...member };\r\n })\r\n );\r\n};\r\n\r\n// Helper function to extract sections data\r\nexport const extractSections = (sections: FormSection[]): Omit<FormSection, 'members'>[] => {\r\n return sections.map(({\r\n field_type,\r\n label,\r\n is_accordion,\r\n id,\r\n remove_section,\r\n form_switcher_label,\r\n form_switcher_name,\r\n is_section_field,\r\n section_type,\r\n switcher_forms,\r\n }) => ({\r\n field_type,\r\n label,\r\n is_accordion,\r\n id,\r\n remove_section,\r\n form_switcher_label,\r\n form_switcher_name,\r\n is_section_field,\r\n section_type,\r\n switcher_forms,\r\n }));\r\n};\r\n\r\n// Main processing function\r\nconst processData = (\r\n data: ProcessedData,\r\n activeTabId: number = 0,\r\n formBuilder: any,\r\n tabsData: TabData[] | null,\r\n // Callback functions\r\n callbacks: {\r\n removeSection: () => void;\r\n remove: () => void;\r\n setTabsData: (data: TabData[]) => void;\r\n append: (members: FormMember[]) => void;\r\n appendSection: (sections: Omit<FormSection, 'members'>[]) => void;\r\n }\r\n): void => {\r\n const { removeSection, remove, setTabsData, append, appendSection } = callbacks;\r\n\r\n try {\r\n // Clear existing data\r\n removeSection();\r\n remove();\r\n\r\n if (data.tab) {\r\n processTabData(data.tab, activeTabId, formBuilder, callbacks);\r\n } else if (data.section) {\r\n processSectionData(data.section, formBuilder, callbacks);\r\n } else if (data.tabsData && tabsData) {\r\n processExistingTabsData(tabsData, activeTabId, callbacks);\r\n } else {\r\n throw new Error(\"Invalid data format: Missing required properties (tab, section, or tabsData)\");\r\n }\r\n } catch (error) {\r\n console.error(\"Error processing data:\", error);\r\n // You might want to show a user-friendly error message instead of alert\r\n alert(error instanceof Error ? error.message : \"An error occurred while processing data\");\r\n }\r\n};\r\n\r\n// Process tab data\r\nconst processTabData = (\r\n tabs: TabData[],\r\n activeTabId: number,\r\n formBuilder: any,\r\n callbacks: {\r\n setTabsData: (data: TabData[]) => void;\r\n append: (members: FormMember[]) => void;\r\n appendSection: (sections: Omit<FormSection, 'members'>[]) => void;\r\n }\r\n): void => {\r\n const { setTabsData, append, appendSection } = callbacks;\r\n\r\n setTabsData(tabs);\r\n\r\n const activeTab = tabs.find(tab => tab.tab_order === activeTabId + 1);\r\n if (!activeTab?.data) {\r\n console.warn(`No active tab found for tab order: ${activeTabId + 1}`);\r\n return;\r\n }\r\n\r\n const sections = extractSections(activeTab.data);\r\n const members = processMembers(activeTab.data, formBuilder);\r\n\r\n append(members);\r\n appendSection(sections);\r\n};\r\n\r\n// Process section data\r\nconst processSectionData = (\r\n sections: FormSection[],\r\n formBuilder: any,\r\n callbacks: {\r\n append: (members: FormMember[]) => void;\r\n appendSection: (sections: Omit<FormSection, 'members'>[]) => void;\r\n }\r\n): void => {\r\n const { append, appendSection } = callbacks;\r\n\r\n const extractedSections = extractSections(sections);\r\n const members = processMembers(sections, formBuilder);\r\n\r\n append(members);\r\n appendSection(extractedSections);\r\n};\r\n\r\n// Process existing tabs data\r\nconst processExistingTabsData = (\r\n tabsData: TabData[],\r\n activeTabId: number,\r\n callbacks: {\r\n append: (members: FormMember[]) => void;\r\n appendSection: (sections: Omit<FormSection, 'members'>[]) => void;\r\n }\r\n): void => {\r\n const { append, appendSection } = callbacks;\r\n\r\n const activeTab = tabsData.find(tab => tab.tab_order === activeTabId + 1);\r\n if (!activeTab?.data) {\r\n console.warn(`No active tab found for tab order: ${activeTabId + 1}`);\r\n return;\r\n }\r\n\r\n const sections = extractSections(activeTab.data);\r\n const members = activeTab.data.flatMap(section =>\r\n section.members.map(member => ({ ...member }))\r\n );\r\n\r\n if (members.length > 0) append(members);\r\n if (sections.length > 0) appendSection(sections);\r\n};\r\n\r\n// Custom hook for form data processing\r\nexport const useFormDataProcessor = (\r\n formBuilder: any,\r\n tabsData: TabData[],\r\n activeTabValue: number,\r\n callbacks: {\r\n removeSection: () => void;\r\n remove: () => void;\r\n setTabsData: (data: TabData[]) => void;\r\n append: (members: FormMember[]) => void;\r\n appendSection: (sections: Omit<FormSection, 'members'>[]) => void;\r\n }\r\n) => {\r\n const { removeSection, remove, append } = callbacks;\r\n\r\n // Memoize the serialized form data to avoid unnecessary re-renders\r\n const serializedFormData = useMemo(() =>\r\n JSON.stringify(formBuilder?.formData),\r\n [formBuilder?.formData]\r\n );\r\n\r\n // Memoize the initial data processing\r\n const initialData = useMemo(() => {\r\n if (!formBuilder?.formData?.length) return null;\r\n\r\n try {\r\n return formBuilderDeConversion(formBuilder.formData);\r\n } catch (error) {\r\n console.error('Error processing form data:', error);\r\n return null;\r\n }\r\n }, [serializedFormData]);\r\n\r\n useEffect(() => {\r\n // Handle case when there's no initial data\r\n if (!initialData) {\r\n removeSection();\r\n remove();\r\n append([]);\r\n return;\r\n }\r\n\r\n // Determine processing strategy based on available data\r\n try {\r\n if (tabsData.length > 0) {\r\n // Process existing tabs data\r\n processData(\r\n { tabsData: tabsData },\r\n activeTabValue,\r\n formBuilder,\r\n tabsData,\r\n callbacks\r\n );\r\n } else if (initialData.tab) {\r\n // Process new tab data\r\n processData(\r\n initialData,\r\n activeTabValue,\r\n formBuilder,\r\n tabsData,\r\n callbacks\r\n );\r\n } else if (initialData.section) {\r\n // Process section data\r\n processData(\r\n initialData,\r\n 0, // No active tab for section-only data\r\n formBuilder,\r\n tabsData,\r\n callbacks\r\n );\r\n } else {\r\n console.warn('No valid data structure found in initialData');\r\n removeSection();\r\n remove();\r\n append([]);\r\n }\r\n } catch (error) {\r\n console.error('Error in form data processing:', error);\r\n // Reset to clean state on error\r\n removeSection();\r\n remove();\r\n append([]);\r\n }\r\n }, [activeTabValue, serializedFormData, tabsData.length, initialData, callbacks, formBuilder]);\r\n\r\n return { initialData };\r\n};\r\n\r\n// Alternative: Direct useEffect implementation (if you prefer not to use custom hook)\r\nexport const useFormDataEffect = (\r\n formBuilder: any,\r\n tabsData: TabData[],\r\n activeTabValue: number = 0,\r\n callbacks: {\r\n removeSection: () => void;\r\n remove: () => void;\r\n setTabsData: (data: TabData[]) => void;\r\n append: (members: FormMember[]) => void;\r\n appendSection: (sections: Omit<FormSection, 'members'>[]) => void;\r\n }\r\n) => {\r\n const { removeSection, remove, append } = callbacks;\r\n\r\n useEffect(() => {\r\n let initialData: ProcessedData | null = null;\r\n\r\n // Process initial data\r\n if (formBuilder?.formData?.length) {\r\n try {\r\n initialData = formBuilderDeConversion(formBuilder.formData);\r\n } catch (error) {\r\n console.error('Error converting form data:', error);\r\n }\r\n }\r\n\r\n // Handle empty initial data\r\n if (!initialData) {\r\n removeSection();\r\n remove();\r\n append([]);\r\n return;\r\n }\r\n\r\n // Process data based on available structure\r\n try {\r\n if (tabsData.length > 0) {\r\n processData(\r\n { tabsData: tabsData },\r\n activeTabValue,\r\n formBuilder,\r\n tabsData,\r\n callbacks\r\n );\r\n } else if (initialData.tab) {\r\n processData(\r\n initialData,\r\n activeTabValue,\r\n formBuilder,\r\n tabsData,\r\n callbacks\r\n );\r\n } else if (initialData.section) {\r\n processData(\r\n initialData,\r\n 0,\r\n formBuilder,\r\n tabsData,\r\n callbacks\r\n );\r\n } else {\r\n console.warn('Invalid data structure in initialData');\r\n removeSection();\r\n remove();\r\n append([]);\r\n }\r\n } catch (error) {\r\n console.error('Error processing form data:', error);\r\n // Reset to clean state on error\r\n removeSection();\r\n remove();\r\n append([]);\r\n }\r\n }, [activeTabValue, JSON.stringify(formBuilder?.formData), tabsData.length]);\r\n};\r\n\r\n// Usage example:\r\n/*\r\n// Option 1: Using custom hook\r\nconst { initialData } = useFormDataProcessor(\r\n formBuilder,\r\n tabsData,\r\n activeTabValue,\r\n {\r\n removeSection,\r\n remove,\r\n setTabsData,\r\n append,\r\n appendSection\r\n }\r\n);\r\n\r\n// Option 2: Using direct useEffect\r\nuseFormDataEffect(\r\n formBuilder,\r\n tabsData,\r\n activeTabValue,\r\n {\r\n removeSection,\r\n remove,\r\n setTabsData,\r\n append,\r\n appendSection\r\n }\r\n);\r\n*/\r\n\r\n// Path generation utility (separate from the effect)\r\nexport const generateModulePath = (currentModule: string): string => {\r\n try {\r\n const redirectionPath = getRedirectionPath(currentModule);\r\n return `/dashboard/${currentModule}${redirectionPath}`;\r\n } catch (error) {\r\n console.error('Error generating module path:', error);\r\n throw error;\r\n }\r\n};\r\n\r\nexport const generateCustomFormPath = (currentModule,redirectionPath): any => {\r\n try {\r\n return `/dashboard/${currentModule}${redirectionPath}`;\r\n } catch (error) {\r\n console.error('Error generating module path:', error);\r\n throw error;\r\n }\r\n};","// React imports\r\nimport { useState, useEffect, useMemo, useCallback } from \"react\";\r\n\r\n// React Router imports\r\nimport { useLocation, useNavigate } from \"react-router-dom\";\r\n\r\n// React Hook Form imports\r\nimport { useForm, useFieldArray } from \"react-hook-form\";\r\n\r\n// Material UI imports\r\nimport { Box, FormControlLabel, Grid, RadioGroup } from \"@mui/material\";\r\nimport { Add } from \"@mui/icons-material\";\r\n\r\n// Third-party imports\r\nimport { DndProvider } from \"react-dnd\";\r\nimport { HTML5Backend } from \"react-dnd-html5-backend\";\r\nimport { MRT_ColumnDef, MRT_RowData } from \"material-react-table\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { enqueueSnackbar } from \"notistack\";\r\n\r\n// ERP Common imports\r\nimport DynamicSectionHOC from \"@/components/form-control/form-builder/form-builder-element/section\";\r\nimport Button from \"@/components/form-control/form-builder/form-builder-element/button\";\r\nimport TabBar from \"@/components/tabs/tabs\";\r\nimport images from \"@/assets/images\";\r\nimport { Pathname } from \"@/constants\";\r\nimport FormHeader from \"@/components/form-header/form-header\";\r\nimport Typography from \"@/components/typography/typography\";\r\nimport formBuilderConversion from \"@/utils/form-builder-conversion\";\r\nimport { useAppDispatch, useAppSelector } from \"@/redux/hooks\";\r\nimport { formatLabel } from \"@/utils/format-text\";\r\nimport Toast from \"@/components/toast/toast\";\r\nimport Radio from \"@/components/radio/radio\";\r\nimport { SECTION_TYPES } from \"@/utils/constant\";\r\nimport ErpLoader from \"@/components/loaders/erp-loader\";\r\nimport { getErrorMessage } from \"@/utils/common\";\r\nimport FormParser from \"@/components/form-control/form-parser/form-parser\";\r\nimport { Eye, EyeOff } from \"@/components/icons\";\r\n\r\n// Redux actions\r\nimport {\r\n patchFormDataById,\r\n getFormDataById,\r\n getFieldsByFormId,\r\n} from \"../form-builder/redux/actionCreator\";\r\n\r\n// Local imports\r\nimport {\r\n IProperty,\r\n ISectionProperty,\r\n ISelectProperty,\r\n element,\r\n} from \"./field_properties\";\r\nimport TextEditForm from \"./element-edit-forms/text\";\r\nimport SelectEditForm from \"./element-edit-forms/select\";\r\nimport SectionEditForm from \"./element-edit-forms/section\";\r\nimport CheckboxEditForm from \"./element-edit-forms/checkbox\";\r\nimport TableEditForm from \"./element-edit-forms/table-form\";\r\nimport FormFields from \"./form-fields\";\r\nimport { generateModulePath, useFormDataEffect } from \"./utils/common\";\r\nimport \"./custom-form.scss\";\r\n\r\nexport interface IElementJson extends IProperty {\r\n type: string;\r\n}\r\n\r\nconst FIELD_TYPES = {\r\n TEXT: 'text',\r\n NUMBER: 'number',\r\n EMAIL: 'email',\r\n PHONE: 'phone',\r\n SELECT: 'select',\r\n DATE: 'date',\r\n TIME: 'time',\r\n URL: 'url',\r\n CURRENCY: 'currency',\r\n FILE: 'file',\r\n GEO_LOCATION: 'geoLocation',\r\n IMAGE: 'image',\r\n SECTION: 'section',\r\n INFO: 'info',\r\n RELATION: 'relation',\r\n CHECKBOX: 'checkbox',\r\n TOGGLE_BUTTON: 'toggleButton',\r\n TAGS_INPUT: 'tagsInput'\r\n} as const;\r\n\r\nconst DEFAULT_GRID_COLUMNS = 12;\r\nconst DEFAULT_COLUMN_WIDTH = 2;\r\nconst DEFAULT_TAB_TITLE = 'data';\r\n\r\nconst isValidNumber = (value: any): boolean => !isNaN(Number(value)) && isFinite(Number(value));\r\nconst deepClone = (obj: T): T => JSON.parse(JSON.stringify(obj));\r\nconst generateUniqueId = (separator = ''): { uniqueStringId: string } => {\r\n return { uniqueStringId: `${Date.now()}${separator}${Math.random().toString(36).substr(2, 9)}` };\r\n};\r\n\r\n\r\nexport function CustomForm({redirectionPath}:any) {\r\n const { t } = useTranslation();\r\n const dispatch = useAppDispatch();\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n const rowData = location.state ?? [];\r\n\r\n const formBuilder = useAppSelector((state) => state.formBuilder);\r\n\r\n const { control } = useForm({\r\n reValidateMode: \"onBlur\",\r\n });\r\n\r\n const {\r\n fields: members,\r\n append,\r\n remove,\r\n update,\r\n move,\r\n insert,\r\n } = useFieldArray({\r\n control,\r\n name: \"members\",\r\n });\r\n\r\n const {\r\n fields: section,\r\n append: appendSection,\r\n remove: removeSection,\r\n update: updateSection,\r\n } = useFieldArray({\r\n control,\r\n name: \"section\",\r\n });\r\n\r\n const [selectedHoc, setSelectedHoc] = useState(\"\");\r\n const [activeSection, setActiveSection] = useState<number>();\r\n const [activeMember, setActiveMember] = useState<number>();\r\n\r\n const [formJSON, setFormJSON] = useState<object[]>([]);\r\n const [elementJSON, setElementJSON] = useState<any>(null);\r\n const [positionEditedElement, setPositionEditedElement] = useState<\r\n number | undefined\r\n >();\r\n\r\n const [sectionFormJSON, setSectionFormJSON] = useState<object[]>([]);\r\n const [sectionJSON, setSectionJSON] = useState<any>({});\r\n const [sectionPositionEditedElement, setSectionPositionEditedElement] =\r\n useState<number | undefined>();\r\n const [removeSectionActionPerformed, setRemoveSectionActionPerformed] =\r\n useState(false);\r\n const [removeSectionMembersPerformed, setRemoveSectionMembersPerformed] =\r\n useState(false);\r\n const [removeSectionPosition, setRemoveSectionPosition] = useState<\r\n number | undefined\r\n >();\r\n const [initialLoading, setInitialLoading] = useState(true);\r\n const [tabsData, setTabsData] = useState<any[]>([]);\r\n const [activeTabValue, setActiveTabValue] = useState<number | undefined>(0);\r\n\r\n const [elementSwap, setElementSwap] = useState(false);\r\n const [modifyAccordion, setModifyAccordion] = useState(false);\r\n const [toast, setToast] = useState<IToast | null>(null);\r\n const [previewFieldsData, setPreviewFields] = useState<any>(null);\r\n const [_, setFormParserMethods] = useState<any>();\r\n\r\n let elementPerColumn: any;\r\n\r\n const currentModule = location.pathname.split('/')[2]\r\n\r\n const path =redirectionPath?redirectionPath: generateModulePath(currentModule)\r\n\r\n useFormDataEffect(\r\n formBuilder,\r\n tabsData,\r\n activeTabValue,\r\n {\r\n removeSection,\r\n remove,\r\n setTabsData,\r\n append,\r\n appendSection\r\n }\r\n );\r\n\r\n const pickPropertyEditForm = useCallback((type: string): React.ReactElement => {\r\n try {\r\n if (!type || typeof type !== 'string') {\r\n console.warn('Invalid field type provided to pickPropertyEditForm');\r\n return <div className=\"text-gray-500 p-4\">Select a field to edit</div>;\r\n }\r\n\r\n const normalizedType = type.toLowerCase().trim();\r\n\r\n // Define form type groups for better maintainability\r\n const formGroups = {\r\n text: [\r\n 'text', 'number', 'email', 'phone', 'date', 'time',\r\n 'url', 'currency', 'file', 'geolocation', 'image',\r\n 'relation', 'info', 'tagsinput'\r\n ],\r\n select: ['select'],\r\n section: ['section'],\r\n checkbox: ['checkbox', 'togglebutton', 'radiobutton'],\r\n table: ['table']\r\n };\r\n\r\n // Common props for reusability\r\n const commonTextProps = {\r\n element: elementJSON,\r\n handlePropertyValueUpdate,\r\n handleWidthChange,\r\n handleColumnSelect,\r\n fields: formBuilder?.fields || []\r\n };\r\n\r\n const commonSelectProps = {\r\n element: elementJSON,\r\n handlePropertyValueUpdate,\r\n handleSelectOptionValueUpdate,\r\n handleWidthChange,\r\n handleColumnSelect\r\n };\r\n\r\n // Determine form type and render appropriate component\r\n if (formGroups.text.includes(normalizedType)) {\r\n return (\r\n <TextEditForm\r\n {...commonTextProps}\r\n key={`text-form-${elementJSON?.id || 'default'}`}\r\n />\r\n );\r\n }\r\n\r\n if (formGroups.select.includes(normalizedType)) {\r\n return (\r\n <SelectEditForm\r\n {...commonSelectProps}\r\n key={`select-form-${elementJSON?.id || 'default'}`}\r\n />\r\n );\r\n }\r\n\r\n if (formGroups.section.includes(normalizedType)) {\r\n return (\r\n <SectionEditForm\r\n element={sectionJSON}\r\n handlePropertyValueUpdate={handleSectionPropertyValueUpdate}\r\n key={`section-form-${sectionJSON?.id || 'default'}`}\r\n />\r\n );\r\n }\r\n\r\n if (formGroups.checkbox.includes(normalizedType)) {\r\n return (\r\n <CheckboxEditForm\r\n {...commonSelectProps}\r\n key={`checkbox-form-${elementJSON?.id || 'default'}`}\r\n />\r\n );\r\n }\r\n\r\n if (formGroups.table.includes(normalizedType)) {\r\n return (\r\n <TableEditForm\r\n element={elementJSON}\r\n handlePropertyValueUpdate={handlePropertyValueUpdate}\r\n handleColumnsUpdate={handleColumnsUpdate}\r\n fields={formBuilder?.fields || []}\r\n key={`table-form-${elementJSON?.id || 'default'}`}\r\n />\r\n );\r\n }\r\n\r\n // Default fallback with helpful message\r\n console.warn(`Unknown field type: ${type}`);\r\n return (\r\n <div className=\"text-gray-500 p-4 border border-gray-200 rounded\">\r\n <p className=\"font-medium\">Unknown Field Type</p>\r\n <p className=\"text-sm mt-1\">\r\n Field type \"{type}\" is not supported. Please select a valid field to edit.\r\n </p>\r\n </div>\r\n );\r\n\r\n } catch (error) {\r\n console.error('Error in pickPropertyEditForm:', error);\r\n return (\r\n <div className=\"text-red-500 p-4 border border-red-200 rounded bg-red-50\">\r\n <p className=\"font-medium\">Error Loading Form</p>\r\n <p className=\"text-sm mt-1\">\r\n There was an error loading the property edit form. Please try again.\r\n </p>\r\n </div>\r\n );\r\n }\r\n }, [elementJSON, sectionJSON, formBuilder]);\r\n\r\n const addNewSection = useCallback((): void => {\r\n try {\r\n if (!element?.section) {\r\n console.error('Element section template is not available');\r\n return;\r\n }\r\n\r\n const { uniqueStringId: id } = generateUniqueId('-');\r\n const newSection: ISectionProperty = {\r\n ...deepClone(element.section),\r\n id: id,\r\n };\r\n\r\n // Update switcher forms with new ID if they exist\r\n if (newSection.switcher_forms) {\r\n newSection.switcher_forms = newSection.switcher_forms.map(form => ({\r\n ...form,\r\n id: generateUniqueId('-').uniqueStringId\r\n }));\r\n }\r\n\r\n const newSectionIndex = section.length;\r\n\r\n appendSection(newSection);\r\n setActiveSection(newSectionIndex);\r\n setSelectedHoc('section');\r\n\r\n const sectionData: ISectionProperty = {\r\n field_type: newSection.field_type,\r\n section_type: newSection.section_type,\r\n switcher_forms: newSection.switcher_forms,\r\n form_switcher_label: newSection.form_switcher_label,\r\n form_switcher_name: newSection.form_switcher_name,\r\n label: newSection.label,\r\n is_accordion: newSection.is_accordion,\r\n id: newSection.id ?? newSectionIndex,\r\n };\r\n\r\n setSectionJSON(sectionData);\r\n setSectionPositionEditedElement(newSectionIndex);\r\n pickPropertyEditForm(newSection.field_type);\r\n } catch (error) {\r\n console.error('Error adding new section:', error);\r\n }\r\n }, [element, section, appendSection, setActiveSection, setSelectedHoc, setSectionJSON, setSectionPositionEditedElement, pickPropertyEditForm]);\r\n\r\n /**\r\n * Enhanced handleAddTab with better validation and error handling\r\n */\r\n const handleAddTab = useCallback((): void => {\r\n try {\r\n const formWithMembers = deepClone(sectionFormJSON);\r\n\r\n // Populate sections with their members\r\n formWithMembers.forEach((section: ISectionProperty, sectionIndex: number) => {\r\n section.members = members.filter(\r\n (member: IProperty) => member?.section_order === sectionIndex\r\n );\r\n });\r\n\r\n const hasSystemMembers = formWithMembers.some((section: ISectionProperty) =>\r\n section.members?.some((member: IProperty) => Boolean(member?.is_system_field))\r\n );\r\n\r\n const shouldRemoveTab = !tabsData?.length && hasSystemMembers;\r\n\r\n const newTab: TabData = {\r\n tab_order: tabsData.length + 1,\r\n title: DEFAULT_TAB_TITLE,\r\n remove_tab: shouldRemoveTab,\r\n data: tabsData?.length ? [] : formWithMembers\r\n };\r\n\r\n setTabsData(prevTabs => [...prevTabs, newTab]);\r\n } catch (error) {\r\n console.error('Error adding new tab:', error);\r\n }\r\n }, [sectionFormJSON, members, tabsData, setTabsData]);\r\n\r\n const handleEditTabTitle = useCallback((tabId: number, newTitle: string): void => {\r\n try {\r\n if (!isValidNumber(tabId) || !newTitle?.trim()) {\r\n console.error('Invalid tab ID or title provided');\r\n return;\r\n }\r\n\r\n setTabsData(prevTabs =>\r\n prevTabs.map((tab: TabData) =>\r\n tab.tab_order === tabId ? { ...tab, title: newTitle.trim() } : tab\r\n )\r\n );\r\n } catch (error) {\r\n console.error('Error editing tab title:', error);\r\n }\r\n }, [setTabsData]);\r\n\r\n const handleRemoveTab = useCallback((id: number): void => {\r\n try {\r\n if (!isValidNumber(id)) {\r\n console.error('Invalid tab ID provided');\r\n return;\r\n }\r\n\r\n const filteredTabs = tabsData.filter((tab: TabData) => tab.tab_order !== id);\r\n\r\n // Reorder remaining tabs\r\n const reorderedTabs = filteredTabs.map((tab: TabData) => ({\r\n ...tab,\r\n tab_order: tab.tab_order > id ? tab.tab_order - 1 : tab.tab_order,\r\n }));\r\n\r\n setTabsData(reorderedTabs);\r\n if (activeTabValue == id) {\r\n setActiveTabValue(reorderedTabs?.length - 1)\r\n }\r\n\r\n if (reorderedTabs.length > 0) {\r\n const activeTab = reorderedTabs.find(\r\n (tab: TabData) => tab.tab_order === (activeTabValue ?? 0) + 1\r\n );\r\n\r\n if (activeTab?.data) {\r\n const sections = activeTab.data.map(\r\n ({ field_type, label, is_accordion, id, remove_section }) => ({\r\n field_type,\r\n label,\r\n is_accordion,\r\n id,\r\n remove_section,\r\n })\r\n );\r\n\r\n const membersList = activeTab.data.flatMap((section: ISectionProperty) =>\r\n section.members?.map((member: IProperty) => ({ ...member })) || []\r\n );\r\n\r\n // Clear current data and add new data\r\n remove();\r\n removeSection();\r\n membersList.forEach(member => append(member));\r\n sections.forEach(section => appendSection(section));\r\n }\r\n } else {\r\n // Clear all data if no tabs remain\r\n remove();\r\n removeSection();\r\n }\r\n } catch (error) {\r\n console.error('Error removing tab:', error);\r\n }\r\n }, [tabsData, activeTabValue, setTabsData, remove, removeSection, append, appendSection]);\r\n\r\n const handleElementSelection = useCallback((e: React.MouseEvent<HTMLElement>): void => {\r\n try {\r\n const target = e.target as HTMLElement;\r\n const elementPositionIndex = target.dataset.position;\r\n\r\n if (!elementPositionIndex || !isValidNumber(elementPositionIndex)) {\r\n console.error('Invalid element position index');\r\n return;\r\n }\r\n\r\n const positionIndex = Number(elementPositionIndex);\r\n\r\n if (positionIndex < 0 || positionIndex >= formJSON.length) {\r\n console.error('Element position index out of bounds');\r\n return;\r\n }\r\n\r\n setActiveMember(positionIndex);\r\n\r\n const elementDetails = deepClone(formJSON[positionIndex]);\r\n setPositionEditedElement(positionIndex);\r\n setElementJSON(elementDetails);\r\n setSelectedHoc('element');\r\n } catch (error) {\r\n console.error('Error selecting element:', error);\r\n }\r\n }, [formJSON, setActiveMember, setPositionEditedElement, setElementJSON, setSelectedHoc]);\r\n\r\n const handleSectionSelection = useCallback((e: React.MouseEvent<HTMLElement>): void => {\r\n try {\r\n const target = e.target as HTMLElement;\r\n const sectionPositionIndex = target.dataset.position;\r\n\r\n if (!sectionPositionIndex || !isValidNumber(sectionPositionIndex)) {\r\n console.error('Invalid section position index');\r\n return;\r\n }\r\n\r\n const positionIndex = Number(sectionPositionIndex);\r\n\r\n if (positionIndex < 0 || positionIndex >= sectionFormJSON.length) {\r\n console.error('Section position index out of bounds');\r\n return;\r\n }\r\n\r\n setActiveSection(positionIndex);\r\n\r\n const sectionDetails = deepClone(sectionFormJSON[positionIndex]);\r\n setSectionPositionEditedElement(positionIndex);\r\n setSectionJSON(sectionDetails);\r\n setSelectedHoc('section');\r\n } catch (error) {\r\n console.error('Error selecting section:', error);\r\n }\r\n }, [sectionFormJSON, setActiveSection, setSectionPositionEditedElement, setSectionJSON, setSelectedHoc]);\r\n\r\n const handleAddMember = useCallback((\r\n e: React.SyntheticEvent<HTMLElement>,\r\n otherProperties?: Record<string, any>\r\n ): void => {\r\n try {\r\n const target = e.currentTarget as HTMLElement;\r\n const sectionPositionIndex = target?.dataset?.position;\r\n\r\n if (sectionPositionIndex === undefined || !isValidNumber(sectionPositionIndex)) {\r\n console.error('Invalid section position index for adding member');\r\n return;\r\n }\r\n\r\n const positionIndex = Number(sectionPositionIndex);\r\n\r\n if (positionIndex < 0) {\r\n console.error('Section position index cannot be negative');\r\n return;\r\n }\r\n\r\n if (!element?.text) {\r\n console.error('Element text template is not available');\r\n return;\r\n }\r\n\r\n const newMember: IProperty = {\r\n ...deepClone(element.text),\r\n ...otherProperties,\r\n section_order: positionIndex,\r\n type: 'custom',\r\n is_new: true,\r\n custom_width: Math.floor(DEFAULT_GRID_COLUMNS / DEFAULT_COLUMN_WIDTH),\r\n is_fullwidth: false,\r\n is_system_field: Boolean(otherProperties?.is_system_field),\r\n id: generateUniqueId().uniqueStringId,\r\n };\r\n\r\n setActiveSection(positionIndex);\r\n append(newMember);\r\n\r\n const elementPositionIndex = members.length;\r\n setActiveMember(elementPositionIndex);\r\n setSelectedHoc('element');\r\n setPositionEditedElement(elementPositionIndex);\r\n setElementJSON(newMember);\r\n pickPropertyEditForm(newMember.field_type);\r\n } catch (error) {\r\n console.error('Error adding new member:', error);\r\n }\r\n }, [element, members, setActiveSection, append, setActiveMember, setSelectedHoc, setPositionEditedElement, setElementJSON, pickPropertyEditForm]);\r\n\r\n\r\n const handleSectionPropertyValueUpdate = useCallback((\r\n e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>,\r\n overrideValue?: any\r\n ): void => {\r\n try {\r\n const { name, type, checked, value } = e.target;\r\n\r\n if (!name) {\r\n console.error('Property name is required for update');\r\n return;\r\n }\r\n\r\n const updatedValue = overrideValue !== undefined ? overrideValue : (type === 'checkbox' ? checked : value);\r\n\r\n // Only update if value actually changed\r\n if (sectionJSON[name] !== updatedValue) {\r\n setSectionJSON(prev => ({ ...prev, [name]: updatedValue }));\r\n }\r\n } catch (error) {\r\n console.error('Error updating section property:', error);\r\n }\r\n }, [sectionJSON, setSectionJSON]);\r\n\r\n const handleWidthChange = useCallback((newCustomWidth: number): void => {\r\n try {\r\n if (!isValidNumber(newCustomWidth) || newCustomWidth < 1 || newCustomWidth > DEFAULT_GRID_COLUMNS) {\r\n console.error('Invalid width value provided');\r\n return;\r\n }\r\n\r\n setElementJSON(prevData => ({\r\n ...prevData,\r\n custom_width: newCustomWidth,\r\n }));\r\n } catch (error) {\r\n console.error('Error updating width:', error);\r\n }\r\n }, [setElementJSON]);\r\n\r\n const handleColumnSelect = useCallback((e: React.ChangeEvent<HTMLSelectElement>): void => {\r\n try {\r\n const columnValue = Number(e.target.value);\r\n\r\n if (!isValidNumber(columnValue) || columnValue <= 0) {\r\n console.error('Invalid column value provided');\r\n return;\r\n }\r\n\r\n const elementPerColumn = Math.floor(DEFAULT_GRID_COLUMNS / columnValue);\r\n\r\n if (elementPerColumn <= 0) {\r\n console.error('Calculated element per column is invalid');\r\n return;\r\n }\r\n\r\n // Batch update all members\r\n members.forEach((field: IProperty, index: number) => {\r\n update(index, { ...field, custom_width: elementPerColumn });\r\n });\r\n } catch (error) {\r\n console.error('Error updating column selection:', error);\r\n }\r\n }, [members, update]);\r\n\r\n const handlePropertyValueUpdate = useCallback((\r\n e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>,\r\n numberValue?: number,\r\n val?: string,\r\n fieldType?: keyof typeof FIELD_TYPES\r\n ): void => {\r\n try {\r\n const getValue = (): any => {\r\n if (fieldType) return fieldType;\r\n if (val !== undefined) return val;\r\n if (numberValue !== undefined) return numberValue;\r\n return e?.target?.value;\r\n };\r\n\r\n const value = getValue();\r\n const elementJSONCopy = deepClone(elementJSON);\r\n\r\n if (e?.target?.name) {\r\n elementJSONCopy[e.target.name] = e.target.type === 'checkbox' ? e.target.checked : value;\r\n }\r\n // Only update if there's an actual change\r\n if (fieldType) {\r\n const { uniqueStringId: uniqueId } = generateUniqueId();\r\n const copyOfUpdatedElement: IProperty = {\r\n ...element[fieldType],\r\n section_form_id: elementJSONCopy?.section_form_id,\r\n is_form_switcher_section: elementJSONCopy?.is_form_switcher_section,\r\n section_order: elementJSONCopy.section_order,\r\n id: uniqueId,\r\n type: 'custom',\r\n is_system_field: Boolean(elementJSONCopy?.is_system_field),\r\n is_new: true,\r\n column_width: elementJSONCopy?.column_width || 6,\r\n custom_width: elementJSONCopy?.custom_width || 6\r\n };\r\n setElementJSON(copyOfUpdatedElement);\r\n } else if (JSON.stringify(elementJSON) !== JSON.stringify(elementJSONCopy)) {\r\n setElementJSON({ ...elementJSON, ...elementJSONCopy });\r\n }\r\n } catch (error) {\r\n console.error('Error updating property value:', error);\r\n }\r\n }, [elementJSON, element, setElementJSON]);\r\n\r\n const handleSelectOptionValueUpdate = useCallback((options: any[]): void => {\r\n try {\r\n if (!Array.isArray(options)) {\r\n console.error('Options must be an array');\r\n return;\r\n }\r\n\r\n const elementJSONCopy = deepClone(elementJSON);\r\n elementJSONCopy.options = [...options];\r\n const { uniqueStringId: uniqueId } = generateUniqueId('-');\r\n\r\n if (JSON.stringify(elementJSON.options) !== JSON.stringify(options)) {\r\n setElementJSON({ ...elementJSON, ...elementJSONCopy, id: uniqueId });\r\n }\r\n } catch (error) {\r\n console.error('Error updating select options:', error);\r\n }\r\n }, [elementJSON, setElementJSON]);\r\n\r\n const handleColumnsUpdate = useCallback((columns: MRT_ColumnDef<MRT_RowData>[]): void => {\r\n try {\r\n if (!Array.isArray(columns)) {\r\n console.error('Columns must be an array');\r\n return;\r\n }\r\n\r\n const elementJSONCopy = deepClone(elementJSON);\r\n elementJSONCopy.table_columns = [...columns];\r\n const { uniqueStringId: uniqueId } = generateUniqueId('-');\r\n\r\n if (JSON.stringify(elementJSON.table_columns) !== JSON.stringify(columns)) {\r\n setElementJSON({ ...elementJSON, ...elementJSONCopy, id: uniqueId });\r\n }\r\n } catch (error) {\r\n console.error('Error updating table columns:', error);\r\n }\r\n }, [elementJSON, setElementJSON]);\r\n\r\n const handleRemoveSection = useCallback((sectionIndex: number): void => {\r\n try {\r\n if (!isValidNumber(sectionIndex) || sectionIndex < 0 || sectionIndex >= section.length) {\r\n console.error('Invalid section index for removal');\r\n return;\r\n }\r\n\r\n setRemoveSectionPosition(sectionIndex);\r\n removeSection(sectionIndex);\r\n\r\n // Remove associated members in reverse order to maintain indices\r\n const membersToRemove: number[] = [];\r\n members.forEach((member: IProperty, index: number) => {\r\n if (member?.section_order === sectionIndex) {\r\n membersToRemove.push(index);\r\n }\r\n });\r\n\r\n // Remove members in reverse order to maintain correct indices\r\n membersToRemove.reverse().forEach(memberIndex => {\r\n remove(memberIndex);\r\n });\r\n\r\n setRemoveSectionActionPerformed(true);\r\n } catch (error) {\r\n console.error('Error removing section:', error);\r\n }\r\n }, [section, members, setRemoveSectionPosition, removeSection, remove, setRemoveSectionActionPerformed]);\r\n\r\n const handleMakeAccordion = useCallback((sectionIndex: number): void => {\r\n try {\r\n if (!isValidNumber(sectionIndex) || sectionIndex < 0 || sectionIndex >= section.length) {\r\n console.error('Invalid section index for accordion conversion');\r\n return;\r\n }\r\n\r\n setModifyAccordion(true);\r\n setSectionPositionEditedElement(sectionIndex);\r\n setActiveSection(sectionIndex);\r\n\r\n const copyOfSection: ISectionProperty = {\r\n ...deepClone(section[sectionIndex]),\r\n is_accordion: true\r\n };\r\n\r\n updateSection(sectionIndex, copyOfSection);\r\n setSelectedHoc('section');\r\n setSectionJSON(copyOfSection);\r\n pickPropertyEditForm(copyOfSection.field_type);\r\n } catch (error) {\r\n console.error('Error making section accordion:', error);\r\n }\r\n }, [section, setModifyAccordion, setSectionPositionEditedElement, setActiveSection, updateSection, setSelectedHoc, setSectionJSON, pickPropertyEditForm]);\r\n\r\n const handleTabData = useCallback((): void => {\r\n try {\r\n const formWithMembers = deepClone(sectionFormJSON);\r\n\r\n formWithMembers.forEach((section: ISectionProperty, sectionIndex: number) => {\r\n section.members = members.filter(\r\n (member: IProperty) => member?.section_order === sectionIndex\r\n );\r\n });\r\n\r\n const hasSystemMembers = formWithMembers.some((section: ISectionProperty) =>\r\n section.members?.some((member: IProperty) => Boolean(member?.is_system_field))\r\n );\r\n\r\n const activeTabIndex = Number(activeTabValue);\r\n if (isValidNumber(activeTabIndex) && activeTabIndex >= 0 && activeTabIndex < tabsData.length) {\r\n const updatedTabsData = [...tabsData];\r\n updatedTabsData[activeTabIndex] = {\r\n ...updatedTabsData[activeTabIndex],\r\n data: formWithMembers,\r\n remove_tab: hasSystemMembers,\r\n };\r\n setTabsData(updatedTabsData)\r\n remove();\r\n removeSection();\r\n setActiveMember(undefined);\r\n setSelectedHoc(\"\");\r\n setActiveSection(undefined);\r\n }\r\n } catch (error) {\r\n console.error('Error updating tab data:', error);\r\n }\r\n }, [sectionFormJSON, members, activeTabValue, tabsData, setTabsData]);\r\n\r\n // const handlePreview = () => {\r\n // const formWithMembers = JSON.parse(JSON.stringify(sectionFormJSON));\r\n\r\n // formWithMembers.forEach(\r\n // (section: ISectionProperty, sectionIndex: number) => {\r\n // section.members = members.filter(\r\n // (member: any) => member?.section_order === sectionIndex,\r\n // ) as (IProperty | ISelectProperty)[];\r\n // },\r\n // );\r\n // const state = tabsData?.length\r\n // ? { tab: tabsData }\r\n // : { section: formWithMembers };\r\n\r\n // const FormBuilderConversion = state && formBuilderConversion(state);\r\n\r\n // setPreviewFields(FormBuilderConversion);\r\n // };\r\n\r\n // Option 1: Using useMemo to memoize the expensive computation\r\n const formWithMembers = useMemo(() => {\r\n if (!sectionFormJSON || !members) return null;\r\n\r\n return sectionFormJSON.map((section: ISectionProperty, sectionIndex: number) => ({\r\n ...section,\r\n members: members.filter(\r\n (member: any) => member?.section_order === sectionIndex,\r\n ) as (IProperty | ISelectProperty)[]\r\n }));\r\n }, [sectionFormJSON, members]);\r\n\r\n const previewState = useMemo(() => {\r\n if (!formWithMembers) return null;\r\n\r\n return tabsData?.length\r\n ? { tab: tabsData }\r\n : { section: formWithMembers };\r\n }, [tabsData, formWithMembers]);\r\n\r\n const previewFields = useMemo(() => {\r\n if (!previewState) return null;\r\n return formBuilderConversion(previewState);\r\n }, [previewState]);\r\n\r\n\r\n // Option 2: Optimized handlePreview function using useCallback\r\n const showPreview = useCallback(() => {\r\n if (previewFields) {\r\n setPreviewFields(previewFields);\r\n }\r\n }, [previewFields, setPreviewFields]);\r\n const hidePreview = useCallback(() => {\r\n setPreviewFields(null);\r\n }, []);\r\n\r\n // Enhanced handleFormUpdate with proper error handling and validation\r\n const handleFormUpdate = useCallback(async (): void => {\r\n try {\r\n\r\n\r\n\r\n // Early validation checks\r\n if (!sectionFormJSON || !Array.isArray(sectionFormJSON)) {\r\n console.warn('Invalid sectionFormJSON provided');\r\n return;\r\n }\r\n\r\n if (!members || !Array.isArray(members)) {\r\n console.warn('Invalid members array provided');\r\n return;\r\n }\r\n\r\n if (!rowData?._id) {\r\n console.warn('Missing rowData._id for form update');\r\n return;\r\n }\r\n\r\n // Deep clone with proper error handling\r\n let formWithMembers: IEnhancedSectionProperty[];\r\n\r\n try {\r\n formWithMembers = structuredClone(sectionFormJSON);\r\n } catch (cloneError) {\r\n // Fallback to JSON method if structuredClone is not available\r\n formWithMembers = JSON.parse(JSON.stringify(sectionFormJSON));\r\n }\r\n\r\n // Enhanced member filtering with better type safety and validation\r\n formWithMembers.forEach((section: IEnhancedSectionProperty, sectionIndex: number) => {\r\n // Validate section object\r\n if (!section || typeof section !== 'object') {\r\n console.warn(`Invalid section at index ${sectionIndex}`);\r\n return;\r\n }\r\n\r\n // Filter members with proper type checking and validation\r\n section.members = members.filter((member: IMember) => {\r\n // Validate member object and section_order\r\n return (\r\n member &&\r\n typeof member === 'object' &&\r\n typeof member.section_order === 'number' &&\r\n member.section_order === sectionIndex\r\n );\r\n }) as (IProperty | ISelectProperty)[];\r\n });\r\n\r\n const hasSystemMembers = formWithMembers.some((section: ISectionProperty) =>\r\n section.members?.some((member: IProperty) => Boolean(member?.is_system_field))\r\n );\r\n\r\n const activeTabIndex = Number(activeTabValue);\r\n let updatedTabsData = [...tabsData];\r\n if (isValidNumber(activeTabIndex) && activeTabIndex >= 0 && activeTabIndex < tabsData.length) {\r\n updatedTabsData = [...tabsData];\r\n updatedTabsData[activeTabIndex] = {\r\n ...updatedTabsData[activeTabIndex],\r\n data: formWithMembers,\r\n remove_tab: hasSystemMembers,\r\n };\r\n\r\n setTabsData(updatedTabsData)\r\n }\r\n\r\n // Build state object with proper validation\r\n const state: IFormState = updatedTabsData?.length > 0\r\n ? { tab: updatedTabsData }\r\n : { section: formWithMembers };\r\n\r\n // Validate formBuilderConversion function exists\r\n if (typeof formBuilderConversion !== 'function') {\r\n console.error('formBuilderConversion is not a function');\r\n return;\r\n }\r\n\r\n // Execute conversion with error handling\r\n let formBuilderConversionResult: any;\r\n try {\r\n formBuilderConversionResult = formBuilderConversion(state);\r\n } catch (conversionError) {\r\n console.error('Error during form builder conversion:', conversionError);\r\n return;\r\n }\r\n\r\n // Validate conversion result\r\n if (!formBuilderConversionResult) {\r\n console.warn('Form builder conversion returned empty result');\r\n return;\r\n }\r\n\r\n // Validate elementPerColumn\r\n // if (typeof elementPerColumn !== 'number' || elementPerColumn <= 0) {\r\n\r\n // console.warn('Invalid elementPerColumn value');\r\n // return;\r\n // }\r\n\r\n // Prepare payload with validation\r\n const updatePayload: IFormUpdatePayload = {\r\n gridCol: elementPerColumn || 2,\r\n fields: formBuilderConversionResult\r\n };\r\n\r\n // Dispatch update action\r\n const updateRes = await dispatch(\r\n patchFormDataById({\r\n id: rowData._id,\r\n data: updatePayload\r\n })\r\n );\r\n if (updateRes.meta.requestStatus === 'rejected') {\r\n\r\n const m = getErrorMessage(updateRes?.error?.message);\r\n enqueueSnackbar(m, { variant: 'error' });\r\n } else {\r\n enqueueSnackbar(\"Form updated successfully\", { variant: 'success' });\r\n navigate(path);\r\n }\r\n\r\n } catch (error) {\r\n const m = error?.message || 'Something went wrong while updating the form';\r\n enqueueSnackbar(m, { variant: 'error' });\r\n }\r\n }, [\r\n sectionFormJSON,\r\n members,\r\n tabsData,\r\n rowData?._id,\r\n elementPerColumn,\r\n dispatch,\r\n formBuilderConversion\r\n ]);\r\n\r\n const handleDuplicateElement = (index: number) => {\r\n const copyOfMember: any = { ...members[index], type: \"custom\" };\r\n copyOfMember && insert(index + 1, copyOfMember);\r\n setActiveMember(index + 1);\r\n setSelectedHoc(\"element\");\r\n setPositionEditedElement(index + 1);\r\n setElementJSON(copyOfMember);\r\n pickPropertyEditForm(copyOfMember.field_type);\r\n };\r\n\r\n const breadCrumbPath = [\r\n {\r\n link: path,\r\n label: \"Forms\",\r\n },\r\n {\r\n link: \"\",\r\n label: formatLabel(rowData?.name),\r\n },\r\n {\r\n link: \"\",\r\n label: \"Edit Form\",\r\n },\r\n ];\r\n\r\n\r\n useEffect(() => {\r\n if (removeSectionActionPerformed) {\r\n members.forEach((member: any, index: number) => {\r\n if (\r\n removeSectionPosition !== undefined &&\r\n Boolean(removeSectionPosition?.toString) &&\r\n member.section_order > removeSectionPosition\r\n ) {\r\n update(index, { ...member, section_order: member.section_order - 1 });\r\n }\r\n });\r\n setRemoveSectionActionPerformed(false);\r\n setRemoveSectionMembersPerformed(true);\r\n setRemoveSectionPosition(undefined);\r\n setSelectedHoc(\"\");\r\n }\r\n\r\n // eslint-disable-next-line\r\n }, [removeSectionActionPerformed]);\r\n\r\n useEffect(() => {\r\n formBuilder.isSuccess && navigate(path);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [formBuilder.isSuccess]);\r\n\r\n useEffect(() => {\r\n if (formBuilder.isError) {\r\n setToast({\r\n type: 'alert',\r\n message: formBuilder.error\r\n });\r\n }\r\n }, [formBuilder.error, formBuilder.isError]);\r\n\r\n useEffect(() => {\r\n if (\r\n typeof positionEditedElement !== \"number\" ||\r\n typeof positionEditedElement !== \"string\"\r\n ) {\r\n const index = Number(positionEditedElement);\r\n if (formJSON[index]) {\r\n const copyOfUpdatedFormJson = JSON.parse(\r\n JSON.stringify(formJSON[index]),\r\n );\r\n update(index, { ...copyOfUpdatedFormJson });\r\n }\r\n }\r\n // eslint-disable-next-line\r\n }, [formJSON]);\r\n\r\n useEffect(() => {\r\n const updatedFormJSON = formJSON.map((obj: any, index: number) => {\r\n if (index === Number(positionEditedElement)) {\r\n return { ...elementJSON };\r\n } else {\r\n return { ...obj };\r\n }\r\n });\r\n setFormJSON(updatedFormJSON);\r\n\r\n // eslint-disable-next-line\r\n }, [elementJSON]);\r\n\r\n useEffect(() => {\r\n if (members.length !== formJSON.length) {\r\n setFormJSON(JSON.parse(JSON.stringify(members)));\r\n }\r\n if (\r\n Boolean(elementSwap) &&\r\n JSON.stringify(members) !== JSON.stringify(formJSON)\r\n ) {\r\n setFormJSON(JSON.parse(JSON.stringify(members)));\r\n setElementSwap(false);\r\n const newMember: any =\r\n positionEditedElement && members[positionEditedElement];\r\n newMember && setSelectedHoc(\"element\");\r\n newMember && setElementJSON(newMember);\r\n newMember && pickPropertyEditForm(newMember.field_type);\r\n }\r\n if (\r\n removeSectionMembersPerformed &&\r\n JSON.stringify(members) !== JSON.stringify(formJSON)\r\n ) {\r\n setFormJSON(JSON.parse(JSON.stringify(members)));\r\n setRemoveSectionMembersPerformed(false);\r\n }\r\n // eslint-disable-next-line\r\n }, [members, elementSwap]);\r\n\r\n useEffect(() => {\r\n if (\r\n typeof sectionPositionEditedElement !== \"number\" ||\r\n typeof sectionPositionEditedElement !== \"string\"\r\n ) {\r\n const index = Number(sectionPositionEditedElement);\r\n if (sectionFormJSON[index]) {\r\n const copyOfUpdatedFormJson = JSON.parse(\r\n JSON.stringify(sectionFormJSON[index]),\r\n );\r\n updateSection(index, { ...copyOfUpdatedFormJson });\r\n }\r\n }\r\n // eslint-disable-next-line\r\n }, [sectionFormJSON]);\r\n\r\n useEffect(() => {\r\n const updatedFormJSON = sectionFormJSON.map((obj: any, index: number) => {\r\n if (index === Number(sectionPositionEditedElement)) {\r\n return { ...obj, ...sectionJSON };\r\n } else {\r\n return { ...obj };\r\n }\r\n });\r\n setSectionFormJSON(updatedFormJSON);\r\n // eslint-disable-next-line\r\n }, [sectionJSON]);\r\n\r\n useEffect(() => {\r\n if (section.length !== sectionFormJSON.length) {\r\n setSectionFormJSON(JSON.parse(JSON.stringify(section)));\r\n }\r\n if (\r\n JSON.stringify(sectionFormJSON) !== JSON.stringify(section) &&\r\n modifyAccordion\r\n ) {\r\n setSectionFormJSON(JSON.parse(JSON.stringify(section)));\r\n setModifyAccordion(false);\r\n }\r\n // eslint-disable-next-line\r\n }, [section]);\r\n\r\n useEffect(() => {\r\n () => setInitialLoading(true);\r\n }, [])\r\n\r\n const handleFormData = useCallback(async () => {\r\n setInitialLoading(true)\r\n try {\r\n if (rowData?._id) {\r\n setTabsData([])\r\n await dispatch(getFormDataById(rowData?._id));\r\n await dispatch(getFieldsByFormId({ id: rowData?._id }));\r\n\r\n }\r\n } finally {\r\n setInitialLoading(false);\r\n }\r\n\r\n }, [rowData?._id])\r\n\r\n useEffect(() => {\r\n handleFormData();\r\n }, [handleFormData]);\r\n\r\n type SelectedHoc = \"element\" | \"section\" | null;\r\n\r\n // Constants\r\n const DEFAULT_FIELD_TYPE = \"text\";\r\n const HOC_TYPES = {\r\n ELEMENT: \"element\",\r\n SECTION: \"section\"\r\n } as const;\r\n\r\n // Helper function to check if object has meaningful content\r\n const hasValidContent = (obj: Record<string, any>): boolean => {\r\n return obj && Object.keys(obj).length > 0;\r\n };\r\n\r\n const EmptyStateMessage = () => (\r\n <Typography type=\"s5\" color={\"theme.secondary.800\"} className=\"formSection--Text\">Select a field to edit its properties.</Typography>\r\n )\r\n\r\n // Helper function to get field type with fallback\r\n const getFieldTypeWithFallback = (\r\n json: ElementJSON | SectionJSON | null | undefined,\r\n fallback: string = DEFAULT_FIELD_TYPE\r\n ): string => {\r\n return json?.field_type || fallback;\r\n };\r\n\r\n const memoizedForm = useMemo(() => {\r\n // Early return for empty state\r\n if (!selectedHoc) {\r\n\r\n return <EmptyStateMessage />;\r\n }\r\n\r\n // Handle element selection\r\n if (selectedHoc === HOC_TYPES.ELEMENT) {\r\n if (!hasValidContent(members)) {\r\n console.warn('Element selected but no members data available');\r\n return <EmptyStateMessage />;\r\n }\r\n\r\n const fieldType = getFieldTypeWithFallback(elementJSON);\r\n return pickPropertyEditForm(fieldType);\r\n }\r\n\r\n // Handle section selection\r\n if (selectedHoc === HOC_TYPES.SECTION) {\r\n if (!hasValidContent(section)) {\r\n console.warn('Section selected but no section data available');\r\n return <EmptyStateMessage />;\r\n }\r\n\r\n const fieldType = getFieldTypeWithFallback(sectionJSON);\r\n return pickPropertyEditForm(fieldType);\r\n }\r\n\r\n // Fallback for unknown selection type\r\n console.warn(`Unknown selectedHoc type: ${selectedHoc}`);\r\n return <EmptyStateMessage />;\r\n }, [\r\n // Core dependencies\r\n selectedHoc,\r\n\r\n // Data dependencies\r\n Object.keys(members).length,\r\n Object.keys(section).length,\r\n\r\n // JSON dependencies with deep comparison consideration\r\n elementJSON?.field_type,\r\n elementJSON?.field_properties,\r\n sectionJSON?.field_type,\r\n sectionJSON?.field_properties,\r\n\r\n // Function dependency\r\n pickPropertyEditForm\r\n ]);\r\n\r\n return (\r\n // <FullScreenLayout className=\"formSection--Layout\">\r\n <Box position='relative'>\r\n {initialLoading ? <ErpLoader /> :\r\n <DndProvider backend={HTML5Backend}>\r\n <FormHeader breadCrumbPath={breadCrumbPath}>\r\n <div className=\"formSection--Buttons\">\r\n <Button\r\n variant=\"outlined\"\r\n className=\"formSection--PreviewButton\"\r\n text=\"Preview\"\r\n onClick={() => { !previewFieldsData ? showPreview() : hidePreview() }}\r\n disable={!members?.length}\r\n startIcon={previewFieldsData ? <EyeOff /> : <Eye />}\r\n />\r\n <Button\r\n variant=\"contained\"\r\n type=\"submit\"\r\n text=\"Update\"\r\n onClick={handleFormUpdate}\r\n disable={previewFieldsData}\r\n />\r\n </div>\r\n </FormHeader>\r\n {!previewFieldsData ?\r\n <Grid className=\"formSection--Grid\" container>\r\n <Grid\r\n item\r\n xs={9}\r\n component=\"form\"\r\n sx={{\r\n position: \"relative\",\r\n background: \"#F5F6F5\",\r\n padding: \"0.75rem\",\r\n }}\r\n >\r\n <Grid className=\"formSection--GridContainer\">\r\n <Box className=\"formSection--Tab\">\r\n {tabsData && (\r\n <TabBar\r\n tabs={tabsData}\r\n onEditTabTitle={handleEditTabTitle}\r\n activeValue={activeTabValue}\r\n setActiveValue={setActiveTabValue}\r\n handleTabChange={() => {\r\n handleTabData()\r\n }}\r\n handleRemoveTab={handleRemoveTab}\r\n containerProps={{ mb: 0 }}\r\n />\r\n )}\r\n <Button\r\n variant=\"outlined\"\r\n text=\"Add Tab\"\r\n onClick={handleAddTab}\r\n style={{ color: \"#292D32\", margin: \"0.5rem\" }}\r\n />\r\n </Box>\r\n <div className=\"formSection--Form\">\r\n {section?.map((item: any, i: number) => {\r\n const sectionMembers = members.filter(\r\n (member: any) => member.section_order === i,\r\n );\r\n const isFormSwitcher = item.section_type === SECTION_TYPES.FORM_SWITCH_SECTION\r\n const switchForms = item?.switcher_forms?.map((form: any) => ({\r\n ...form,\r\n formMembers: members.filter(\r\n (member: any) => member.section_form_id === form.id,\r\n )\r\n }))\r\n\r\n return (\r\n <DynamicSectionHOC\r\n index={i}\r\n label={t(item.label)}\r\n onClick={handleSectionSelection}\r\n position={i}\r\n fieldArrayName=\"section\"\r\n isFormSwitcher={isFormSwitcher}\r\n activeIndex={activeSection === i}\r\n removeSection={() => handleRemoveSection(i)}\r\n handleAccordion={() => handleMakeAccordion(i)}\r\n handleAddButton={(e) => handleAddMember(e)}\r\n remove_section={item.remove_section}\r\n >\r\n {isFormSwitcher ? (\r\n <div style={{ width: '100%' }} >\r\n <Typography type=\"s5\" style={{ fontWeight: 500 }} color={\"theme.secondary.800\"}>\r\n {item.form_switcher_label}\r\n </Typography>\r\n <RadioGroup\r\n aria-labelledby=\"theme-radio-buttons-group-label\"\r\n name={item.form_switcher_name || item.form_switcher_label}\r\n >\r\n\r\n {switchForms?.map(({ name, id, formMembers }: { name: string, id: number, formMembers: any }) => (\r\n <>\r\n <div>\r\n <FormControlLabel\r\n key={id}\r\n value={name}\r\n control={<Radio />}\r\n label={t(name)}\r\n disabled\r\n />\r\n </div>\r\n\r\n <Grid container sx={{ mb: 3 }}>\r\n <FormFields\r\n sectionMembers={formMembers || []}\r\n members={members}\r\n activeMember={activeMember}\r\n control={control}\r\n t={t}\r\n element={element}\r\n images={images}\r\n elementJSON={elementJSON}\r\n remove={remove}\r\n move={move}\r\n handleElementSelection={handleElementSelection}\r\n setElementSwap={setElementSwap}\r\n handleDuplicateElement={handleDuplicateElement}\r\n setSelectedHoc={setSelectedHoc}\r\n setActiveMember={setActiveMember}\r\n />\r\n </Grid>\r\n <Button\r\n text=\"Add\"\r\n variant=\"outlined\"\r\n className=\"formSection--PreviewButton\"\r\n data-position={i}\r\n onClick={(e) => handleAddMember(e, {\r\n section_form_id: id,\r\n is_form_switcher_section: true\r\n })}\r\n startIcon={<Add />}\r\n />\r\n </>\r\n ))}\r\n </RadioGroup>\r\n </div>\r\n ) : null}\r\n {!isFormSwitcher &&\r\n <FormFields\r\n sectionMembers={sectionMembers || []}\r\n members={members}\r\n activeMember={activeMember}\r\n control={control}\r\n t={t}\r\n element={element}\r\n images={images}\r\n elementJSON={elementJSON}\r\n remove={remove}\r\n move={move}\r\n handleElementSelection={handleElementSelection}\r\n setElementSwap={setElementSwap}\r\n handleDuplicateElement={handleDuplicateElement}\r\n setSelectedHoc={setSelectedHoc}\r\n setActiveMember={setActiveMember}\r\n />\r\n }\r\n </DynamicSectionHOC>\r\n );\r\n })}\r\n <div className=\"formSection--Section\">\r\n <Button\r\n text=\"Add a section\"\r\n variant=\"outlined\"\r\n className=\"formSection--PreviewButton\"\r\n onClick={addNewSection}\r\n startIcon={<Add />}\r\n />\r\n </div>\r\n </div>\r\n </Grid>\r\n\r\n </Grid>\r\n <Grid\r\n item\r\n xs={3}\r\n className={\r\n Boolean(selectedHoc) && (members?.length || section.length)\r\n ? \"formSection--RightGrid\"\r\n : \"formSection--RightGrid formSection--Text\"\r\n }\r\n >\r\n {memoizedForm}\r\n </Grid>\r\n </Grid>\r\n :\r\n <FormParser\r\n data={previewFieldsData || []}\r\n handleFormSubmit={(data) => console.log(\"Preview Data\", data)}\r\n className='form-container'\r\n fieldArrayName='form-builder-preview'\r\n getFormMethods={(methods: any) =>\r\n setFormParserMethods({ ...methods })\r\n }\r\n />\r\n }\r\n <Toast\r\n open={Boolean(toast)}\r\n type={toast?.type}\r\n message={toast?.message}\r\n handleClose={() => setToast(null)}\r\n anchorOrigin={{ horizontal: 'right', vertical: 'bottom' }}\r\n />\r\n </DndProvider>}\r\n </Box>\r\n // </FullScreenLayout>\r\n );\r\n}\r\n\r\nexport default CustomForm;\r\n","/**\r\n * CSS Scoping Service\r\n * \r\n * Provides utilities for generating unique scope identifiers and scoping CSS\r\n * to prevent style conflicts between different email templates.\r\n */\r\n\r\nexport interface ScopedResult {\r\n scopeId: string;\r\n scopedCSS: string;\r\n wrappedHTML: string;\r\n}\r\n\r\nexport class CSSScopingService {\r\n /**\r\n * Generate a unique scope identifier using timestamp and random string\r\n * Format: email-tpl-{timestamp}-{random}\r\n */\r\n generateScopeId(): string {\r\n const timestamp = Date.now();\r\n const random = Math.random().toString(36).substring(2, 11);\r\n return `email-tpl-${timestamp}-${random}`;\r\n }\r\n\r\n /**\r\n * Scope CSS selectors by prefixing them with the scope identifier\r\n * Skips :root and :host pseudo-classes\r\n * \r\n * @param css - The CSS stylesheet to scope\r\n * @param scopeId - The unique scope identifier\r\n * @returns Scoped CSS with prefixed selectors\r\n */\r\n scopeCSS(css: string, scopeId: string): string {\r\n if (!css || !scopeId) return css;\r\n\r\n // Split CSS into rules\r\n const rules = this.parseCSS(css);\r\n const scopedRules = rules.map(rule => this.scopeRule(rule, scopeId));\r\n \r\n return scopedRules.join('\\n');\r\n }\r\n\r\n /**\r\n * Parse CSS into individual rules\r\n * Simple parser that handles basic CSS syntax\r\n */\r\n private parseCSS(css: string): string[] {\r\n const rules: string[] = [];\r\n let currentRule = '';\r\n let braceCount = 0;\r\n let inComment = false;\r\n\r\n for (let i = 0; i < css.length; i++) {\r\n const char = css[i];\r\n const nextChar = css[i + 1];\r\n\r\n // Handle comments\r\n if (char === '/' && nextChar === '*') {\r\n inComment = true;\r\n currentRule += char;\r\n continue;\r\n }\r\n if (inComment && char === '*' && nextChar === '/') {\r\n inComment = false;\r\n currentRule += char;\r\n continue;\r\n }\r\n\r\n currentRule += char;\r\n\r\n if (!inComment) {\r\n if (char === '{') {\r\n braceCount++;\r\n } else if (char === '}') {\r\n braceCount--;\r\n \r\n if (braceCount === 0 && currentRule.trim()) {\r\n rules.push(currentRule.trim());\r\n currentRule = '';\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Handle any remaining content\r\n if (currentRule.trim()) {\r\n rules.push(currentRule.trim());\r\n }\r\n\r\n return rules;\r\n }\r\n\r\n /**\r\n * Scope a single CSS rule\r\n */\r\n private scopeRule(rule: string, scopeId: string): string {\r\n // Extract selector and body\r\n const braceIndex = rule.indexOf('{');\r\n if (braceIndex === -1) return rule;\r\n\r\n const selector = rule.substring(0, braceIndex).trim();\r\n const body = rule.substring(braceIndex);\r\n\r\n // Split multiple selectors (comma-separated)\r\n const selectors = selector.split(',').map(s => s.trim());\r\n const scopedSelectors = selectors.map(sel => this.scopeSelector(sel, scopeId));\r\n\r\n return `${scopedSelectors.join(', ')} ${body}`;\r\n }\r\n\r\n /**\r\n * Scope a single selector\r\n * Skip :root, :host, and other pseudo-classes that shouldn't be scoped\r\n */\r\n private scopeSelector(selector: string, scopeId: string): string {\r\n // Don't scope :root or :host\r\n if (selector.startsWith(':root') || selector.startsWith(':host')) {\r\n return selector;\r\n }\r\n\r\n // Don't scope @-rules (like @media, @keyframes)\r\n if (selector.startsWith('@')) {\r\n return selector;\r\n }\r\n\r\n // Prefix the selector with the scope class\r\n return `.${scopeId} ${selector}`;\r\n }\r\n\r\n /**\r\n * Wrap HTML content with a scope wrapper div\r\n * \r\n * @param html - The HTML content to wrap\r\n * @param scopeId - The unique scope identifier\r\n * @returns HTML wrapped with scope div\r\n */\r\n wrapHTMLWithScope(html: string, scopeId: string): string {\r\n if (!html || !scopeId) return html;\r\n \r\n return `<div class=\"${scopeId}\">\\n${html}\\n</div>`;\r\n }\r\n\r\n /**\r\n * Extract inline styles from HTML elements\r\n * Returns a map of element identifiers to their inline styles\r\n */\r\n extractInlineStyles(html: string): Map<string, Record<string, string>> {\r\n const styleMap = new Map<string, Record<string, string>>();\r\n \r\n // Create a temporary DOM element to parse HTML\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(html, 'text/html');\r\n \r\n // Find all elements with inline styles\r\n const elementsWithStyles = doc.querySelectorAll('[style]');\r\n \r\n elementsWithStyles.forEach((element, index) => {\r\n const styleAttr = element.getAttribute('style');\r\n if (styleAttr) {\r\n const styles = this.parseInlineStyles(styleAttr);\r\n // Use element tag + index as identifier\r\n const identifier = `${element.tagName.toLowerCase()}-${index}`;\r\n styleMap.set(identifier, styles);\r\n }\r\n });\r\n \r\n return styleMap;\r\n }\r\n\r\n /**\r\n * Parse inline style attribute into an object\r\n */\r\n private parseInlineStyles(styleAttr: string): Record<string, string> {\r\n const styles: Record<string, string> = {};\r\n \r\n const declarations = styleAttr.split(';').filter(d => d.trim());\r\n \r\n declarations.forEach(declaration => {\r\n const colonIndex = declaration.indexOf(':');\r\n if (colonIndex > -1) {\r\n const property = declaration.substring(0, colonIndex).trim();\r\n const value = declaration.substring(colonIndex + 1).trim();\r\n styles[property] = value;\r\n }\r\n });\r\n \r\n return styles;\r\n }\r\n\r\n /**\r\n * Merge two style objects, with override taking precedence\r\n */\r\n mergeStyles(\r\n base: Record<string, string>,\r\n override: Record<string, string>\r\n ): Record<string, string> {\r\n return { ...base, ...override };\r\n }\r\n\r\n /**\r\n * Complete scoping workflow: generate scope ID, scope CSS, and wrap HTML\r\n * \r\n * @param html - The HTML content\r\n * @param css - The CSS stylesheet\r\n * @returns Object containing scopeId, scopedCSS, and wrappedHTML\r\n */\r\n scopeTemplate(html: string, css: string = ''): ScopedResult {\r\n const scopeId = this.generateScopeId();\r\n const scopedCSS = css ? this.scopeCSS(css, scopeId) : '';\r\n const wrappedHTML = this.wrapHTMLWithScope(html, scopeId);\r\n\r\n return {\r\n scopeId,\r\n scopedCSS,\r\n wrappedHTML\r\n };\r\n }\r\n}\r\n\r\n// Export singleton instance\r\nexport const cssScopingService = new CSSScopingService();\r\n","/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { ElementType, EnhancedSectionData } from '../types/editor';\r\nimport { initialStyles, TEMPLATE_EDITOR_PATHS } from './constant';\r\nimport { cssScopingService } from '../services/CSSScopingService';\r\n\r\n\r\nexport const templateRoutes = (modulePath: string, type: string) => {\r\n const list = `${modulePath}${TEMPLATE_EDITOR_PATHS.TEMPLATES_LIST(type)}`\r\n const add = `${modulePath}${TEMPLATE_EDITOR_PATHS.TEMPLATES_ADD(type)}`\r\n const edit = `${modulePath}${TEMPLATE_EDITOR_PATHS.TEMPLATES_EDIT(type)}`\r\n return {\r\n LIST: list,\r\n ADD_TEMPLATE: (id: string) => add.replace(':id', id),\r\n EDIT_TEMPLATE: (id: string, templateId: string) => edit.replace(':id', id).replace(':template_id', templateId),\r\n }\r\n};\r\n\r\n\r\nexport const generateEmailPreview = (sections: EnhancedSectionData[], headerSections?: EnhancedSectionData[] = [], footerSections?: EnhancedSectionData[] = [], isSaving = false, scopeId?: string) => {\r\n const headerHtml = (headerSections && headerSections?.length) ? generateHeaderFooterPreview(headerSections, 'header') : '';\r\n const footerHtml = (footerSections && footerSections?.length) ? generateHeaderFooterPreview(footerSections, 'footer') : '';\r\n \r\n // Generate or use provided scope ID\r\n const templateScopeId = scopeId || cssScopingService.generateScopeId();\r\n \r\n let html = `\r\n <html>\r\n <head>\r\n <style>\r\n .email-container {\r\n margin: 0 auto;\r\n margin-bottom: 20px;\r\n background-color: #fff;\r\n border-radius: 8px;\r\n max-width: ${isSaving ? '65%' : '800px'};\r\n width: 100%;\r\n }\r\n a {\r\n color: #007bff !important;\r\n text-decoration: none !important;\r\n }\r\n a:hover {\r\n text-decoration: underline;\r\n }\r\n * {\r\n margin: 0;\r\n padding: 0;\r\n box-sizing: border-box;\r\n }\r\n\r\n body {\r\n font-family: \"Inter\", sans-serif !important;\r\n font-size: 16px;\r\n font-weight: 400;\r\n color: #00011c;\r\n font-style: normal;\r\n }\r\n\r\n img {\r\n display: block;\r\n height: auto;\r\n }\r\n\r\n table,\r\n tr,\r\n td {\r\n border-collapse: collapse;\r\n }\r\n\r\n a {\r\n text-decoration: none;\r\n }\r\n\r\n table.our-details,\r\n .our-details td,\r\n .our-details th {\r\n border: 1px solid #d3d3d4;\r\n }\r\n\r\n table.amount-word-table,\r\n table.amount-word-table td,\r\n table.amount-word-table th {\r\n border: 1px solid #d6d6d6;\r\n }\r\n\r\n .amount-word-table thead th {\r\n background-color: #f5f6f5;\r\n }\r\n\r\n .amount-word-table thead td {\r\n background-color: #f5f6f5;\r\n }\r\n\r\n .amount-word-table tbody tr:nth-child(even) {\r\n background-color: #f5f6f5;\r\n }\r\n\r\n .amount-word-table tbody tr td {\r\n border-top: 0;\r\n border-bottom: 0;\r\n }\r\n\r\n .deliver-table thead th {\r\n background-color: transparent;\r\n }\r\n </style>\r\n </head>\r\n <body>\r\n <div class=\"email-container ${templateScopeId}\">\r\n ${headerHtml}\r\n ${headerHtml ? '<hr/>' : ''}\r\n `;\r\n\r\n // Group sections by splitGroupId\r\n const groupedSections = [];\r\n let currentGroup = [];\r\n let lastSplitGroupId = null;\r\n\r\n for (const section of sections) {\r\n if (section.isSplitPair && section.splitGroupId !== 0) {\r\n if (lastSplitGroupId !== section.splitGroupId && currentGroup.length > 0) {\r\n groupedSections.push(currentGroup);\r\n currentGroup = [];\r\n }\r\n currentGroup.push(section);\r\n lastSplitGroupId = section.splitGroupId;\r\n } else {\r\n if (currentGroup.length > 0) {\r\n groupedSections.push(currentGroup);\r\n currentGroup = [];\r\n lastSplitGroupId = null;\r\n }\r\n groupedSections.push([section]);\r\n }\r\n }\r\n if (currentGroup.length > 0) {\r\n groupedSections.push(currentGroup);\r\n }\r\n\r\n // Generate HTML\r\n for (const group of groupedSections) {\r\n if (group.length === 1 && !group[0].isSplitPair) {\r\n // Concatenate normal section content directly\r\n html += `<div style=\"padding: 10px;\">${group[0].content}</div>`;\r\n } else {\r\n // Generate table for split sections\r\n html += '<table style=\"width: 100%; border-collapse: collapse;\"><tr>';\r\n for (const section of group) {\r\n html += `<td style=\"width: ${section.splitWidth}%; vertical-align: top; padding: 10px;\">\r\n ${section.content}\r\n </td>`;\r\n }\r\n html += '</tr></table>';\r\n }\r\n }\r\n\thtml += `\r\n ${footerHtml ? '<hr/>' : ''}\r\n ${footerHtml}\r\n </div></body></html>`;\r\n\r\n return html;\r\n}\r\nexport const generateHeaderFooterPreview = (sections: EnhancedSectionData[], type = 'header', scopeId?: string) => {\r\n const scopeClass = scopeId ? ` ${scopeId}` : '';\r\n let html = `<${type} class=\"${type}${scopeClass}\">`;\r\n\r\n // Group sections by splitGroupId\r\n const groupedSections = [];\r\n let currentGroup = [];\r\n let lastSplitGroupId = null;\r\n\r\n for (const section of sections) {\r\n if (section.isSplitPair && section.splitGroupId !== 0) {\r\n if (lastSplitGroupId !== section.splitGroupId && currentGroup.length > 0) {\r\n groupedSections.push(currentGroup);\r\n currentGroup = [];\r\n }\r\n currentGroup.push(section);\r\n lastSplitGroupId = section.splitGroupId;\r\n } else {\r\n if (currentGroup.length > 0) {\r\n groupedSections.push(currentGroup);\r\n currentGroup = [];\r\n lastSplitGroupId = null;\r\n }\r\n groupedSections.push([section]);\r\n }\r\n }\r\n if (currentGroup.length > 0) {\r\n groupedSections.push(currentGroup);\r\n }\r\n\r\n // Generate HTML\r\n for (const group of groupedSections) {\r\n if (group.length === 1 && !group[0].isSplitPair) {\r\n // Concatenate normal section content directly\r\n html += `<div style=\"padding: 10px;\">${group[0].content}</div>`;\r\n } else {\r\n // Generate table for split sections\r\n html += '<table style=\"width: 100%; border-collapse: collapse;\"><tr>';\r\n for (const section of group) {\r\n html += `<td style=\"width: ${section.splitWidth}%; vertical-align: top; padding: 10px;\">\r\n ${section.content}\r\n </td>`;\r\n }\r\n html += '</tr></table>';\r\n }\r\n }\r\n\thtml += `</${type}>`;\r\n\r\n return html;\r\n}\r\n\r\nexport const extractStyles = (html: string, sectionType: string) => {\r\n // Create a temporary div to parse the HTML\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = html;\r\n \r\n // Get the first element (our styled element)\r\n const element = tempDiv.firstChild as HTMLElement;\r\n \r\n if (!element) return {};\r\n\r\n if(element?.getAttribute instanceof Function === false) {\r\n return {};\r\n }\r\n \r\n // Get the inline styles\r\n const styleAttr = element?.getAttribute('style');\r\n\r\n const allAttributes = element?.attributes || [];\r\n \r\n // const attrObj: Record<string, any> = {};\r\n const attrObj = Array.from(allAttributes).reduce((obj, attr) => {\r\n obj[attr.name] = attr.value;\r\n return obj;\r\n }, {});\r\n\r\n if (!styleAttr) return {};\r\n \r\n // Parse the style attribute into an object\r\n const styleObj: Record<string, any> = {};\r\n const stylePairs = styleAttr.split(';').filter(pair => pair.trim() !== '');\r\n \r\n stylePairs.forEach(pair => {\r\n const [prop, value] = pair.split(':').map(part => part.trim());\r\n if (prop && value) {\r\n // Convert CSS property names to camelCase for React\r\n const propName = prop.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\r\n styleObj[propName] = value;\r\n }\r\n });\r\n attrObj.styles = styleObj\r\n return attrObj\r\n}\r\n\r\n\r\ntype StyleValue = string | number | boolean | null | undefined | StyleObject;\r\ninterface StyleObject {\r\n [key: string]: StyleValue;\r\n}\r\n\r\nconst EMAIL_SAFE_PROPERTIES = new Set([\r\n 'background', 'background-color',\r\n 'border', 'border-style', 'border-collapse', 'border-top', 'border-right', 'border-bottom', 'border-left', 'border-color', 'border-radius',\r\n 'color', 'display', 'font', 'font-family', 'font-size', 'font-style', 'font-weight',\r\n 'height', 'line-height',\r\n 'margin', 'margin-top', 'margin-right', 'margin-bottom', 'margin-left',\r\n 'padding', 'padding-top', 'padding-right', 'padding-bottom', 'padding-left',\r\n 'text-align', 'text-decoration',\r\n 'vertical-align', 'width',\r\n 'max-width', 'min-width', 'max-height', 'min-height'\r\n]);\r\n\r\nexport const generateInlineStyles = (\r\n styles: StyleObject,\r\n parentKey = ''\r\n): string => {\r\n if (!styles || typeof styles !== 'object') return '';\r\n\r\n const styleEntries = Object.entries(styles).reduce<string[]>((acc, [key, value]) => {\r\n if (value === undefined || value === null) return acc;\r\n\r\n const fullKey = parentKey ? `${parentKey}-${key}` : key;\r\n\r\n // Recursively flatten nested objects\r\n if (typeof value === 'object' && !Array.isArray(value)) {\r\n acc.push(generateInlineStyles(value as StyleObject, fullKey));\r\n return acc;\r\n }\r\n\r\n // Convert camelCase to kebab-case\r\n const cssKey = fullKey.replace(/([A-Z])/g, '-$1').toLowerCase();\r\n\r\n // Skip non-email-safe properties\r\n if (!EMAIL_SAFE_PROPERTIES.has(cssKey) && key !== 'fullWidth' && key !== 'alignment') {\r\n return acc;\r\n }\r\n\r\n // Special case: fullWidth\r\n if (key === 'fullWidth' && value === true) {\r\n acc.push('width: 100%');\r\n return acc;\r\n }\r\n\r\n // Special case: alignment (converted to text-align)\r\n if (key === 'alignment' && typeof value === 'string') {\r\n acc.push(`text-align: ${value}`);\r\n return acc;\r\n }\r\n\r\n // Ignore other boolean values\r\n if (typeof value === 'boolean') return acc;\r\n\r\n const cssValue =\r\n typeof value === 'number' && !['z-index', 'opacity', 'line-height'].includes(key)\r\n ? `${value}px`\r\n : value;\r\n\r\n acc.push(`${cssKey}: ${cssValue}`);\r\n return acc;\r\n }, []);\r\n\r\n return styleEntries.filter(Boolean).join('; ');\r\n};\r\n\r\nexport const getInitialSectionData = (type: ElementType, attrs: Record<string, any> = {}): EnhancedSectionData => {\r\n let content = '';\r\n const styles = initialStyles[type] || {};\r\n const inlineStyles: string = generateInlineStyles(styles);\r\n\r\n switch (type) {\r\n case 'heading':\r\n content = `<h1 style=\"${inlineStyles}\">Heading 1</h1>`;\r\n break;\r\n case 'heading-2':\r\n content = `<h2 style=\"${inlineStyles}\">Heading 2</h2>`;\r\n break;\r\n case 'heading-3':\r\n content = `<h3 style=\"${inlineStyles}\">Heading 3</h3>`;\r\n break;\r\n case 'heading-4':\r\n content = `<h4 style=\"${inlineStyles}\">Heading 4</h4>`;\r\n break;\r\n case 'text':\r\n content = `<p style=\"${inlineStyles}\">Hello, enter your text here...</p>`;\r\n break;\r\n case 'image':\r\n content = `<img src=\"${attrs?.src || ''}\" alt=\"${attrs?.alt || ''}\" style=\"${inlineStyles};\" />`;\r\n break;\r\n case 'buttons':\r\n attrs.text = attrs?.text || 'Button text';\r\n content = `<button style=\"${inlineStyles}\">${attrs.text}</button>`;\r\n break;\r\n case 'divider':\r\n content = `<hr style=\"${inlineStyles}\" />`;\r\n break;\r\n case 'table': {\r\n const { border, borderStyle, borderColor, ...rest } = styles;\r\n const tInlineStyles = generateInlineStyles(styles.is_bordered ? styles : rest);\r\n const tHeadInlineStyles: string = generateInlineStyles(styles.tHead);\r\n const tBodyInlineStyles: string = generateInlineStyles(styles.tBody);\r\n const thCellInlineStyles: string = generateInlineStyles({...styles.thCells, border, borderStyle, borderColor });\r\n const tbCellInlineStyles: string = generateInlineStyles({...styles.tbCells, border, borderStyle, borderColor});\r\n content = `\r\n <table style=\"${tInlineStyles}\">\r\n <thead style=\"${tHeadInlineStyles}\">\r\n <tr style=\"background-color: #f5f5f5;\">\r\n <th style=\"${thCellInlineStyles}\"></th>\r\n <th style=\"${thCellInlineStyles}\"></th>\r\n <th style=\"${thCellInlineStyles}\"></th>\r\n </tr>\r\n </thead>\r\n <tbody style=\"${tBodyInlineStyles}\">\r\n <tr>\r\n <td style=\"${tbCellInlineStyles}\"></td>\r\n <td style=\"${tbCellInlineStyles}\"></td>\r\n <td style=\"${tbCellInlineStyles}\"></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n `;\r\n break;\r\n }\r\n case 'signature':\r\n content = `<div style=\"${inlineStyles}\">Signature: <input type='text' style=\"border:0; border-bottom:1px solid black\" class='signature-input'/></div>`;\r\n break;\r\n case 'qr-code':\r\n attrs.placeholder = attrs?.placeholder || '{{qr_data}}';\r\n content = `<div style=\"background-color: #f5f5f5; padding: 16px; text-align: center; color: #666666;\">${attrs.placeholder}</div>`;\r\n break;\r\n case 'bar-code':\r\n attrs.placeholder = attrs?.placeholder || '{{barcode_data}}';\r\n content = `<div style=\"background-color: #f5f5f5; padding: 16px; text-align: center; color: #666666;\">${attrs.placeholder}</div>`;\r\n break;\r\n default:\r\n content = '<p style=\"font-size: 16px; color: #333333; line-height: 1.5;\">New section</p>';\r\n }\r\n\r\n let attributes: Record<string, any> = {};\r\n attributes = extractStyles(content, type);\r\n\r\n return {\r\n content, \r\n type, \r\n attributes: {...(attrs || {}), styles}\r\n };\r\n};\r\n\r\n","/* eslint-disable react-hooks/exhaustive-deps */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React from 'react';\r\nimport {\r\n AppBar,\r\n Toolbar,\r\n Box,\r\n Link,\r\n Stack,\r\n IconButton,\r\n Divider,\r\n} from '@mui/material';\r\nimport { ZoomIn, ZoomOut, ZoomOutMap } from '@mui/icons-material';\r\nimport Button from '../../../components/button/button';\r\nimport Typography from '../../../components/typography/typography';\r\nimport { Edit, Eye, EyeOff } from '../../../components/icons';\r\nimport CodeOutlinedIcon from '@mui/icons-material/CodeOutlined';\r\nimport { Link as RouterLink } from 'react-router-dom';\r\nimport { templateRoutes } from '../utils/common';\r\nimport { EnhancedSectionData } from '../types/editor';\r\n\r\ninterface EditorHeaderProps {\r\n onSave: () => void;\r\n onPreview: () => void;\r\n preview: boolean;\r\n editHtml: boolean;\r\n onEditHtml: () => void;\r\n onEditModeChange?: () => void;\r\n sections: EnhancedSectionData[];\r\n isEditingHeaderFooter: boolean;\r\n setIsEditingHeaderFooter: (value: boolean) => void;\r\n onSaveHeaderFooter: (value: boolean) => void;\r\n modulePath: string;\r\n type: string;\r\n mode: 'add' | 'edit';\r\n templateData: Record<string, any> | null;\r\n isSaving?: boolean;\r\n editMode: boolean;\r\n fromPreview?: boolean;\r\n zoom: number;\r\n onZoomIn: () => void;\r\n onZoomOut: () => void;\r\n onResetZoom: () => void;\r\n}\r\n\r\nconst EditorHeader: React.FC<EditorHeaderProps> = ({\r\n onSave,\r\n onPreview,\r\n preview,\r\n editHtml,\r\n onEditHtml,\r\n sections,\r\n isEditingHeaderFooter,\r\n onEditModeChange,\r\n setIsEditingHeaderFooter,\r\n onSaveHeaderFooter,\r\n modulePath,\r\n type,\r\n mode = 'add',\r\n templateData,\r\n isSaving = false,\r\n editMode,\r\n fromPreview = false,\r\n zoom,\r\n onZoomIn,\r\n onZoomOut,\r\n onResetZoom,\r\n}) => {\r\n const ROUTES = templateRoutes(modulePath, type);\r\n return (\r\n <AppBar\r\n position=\"static\"\r\n color=\"default\"\r\n elevation={0}\r\n sx={{\r\n borderColor: 'divider',\r\n bgcolor: 'background.paper'\r\n }}\r\n >\r\n <Toolbar variant=\"dense\" sx={{ justifyContent: 'space-between', p: 3 }}>\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\r\n <Link\r\n component={RouterLink}\r\n to={ROUTES.LIST}\r\n underline=\"hover\"\r\n color=\"text.secondary\"\r\n sx={{ fontSize: '0.875rem' }}\r\n >\r\n <Typography type=\"s5\" color='theme.secondary.800'>{type === 'email' ? 'Emails' : 'PDF'}</Typography>\r\n </Link>\r\n <Typography type=\"s5\" weight='medium' color='theme.secondary.1000'>/</Typography>\r\n <Typography type=\"s5\" weight='medium' color='theme.secondary.1000'>\r\n {mode === 'add' ? 'Add New' : editMode ? 'Edit' : 'Preview'} Template\r\n </Typography>\r\n {templateData && templateData?.name &&\r\n <>\r\n <Typography type=\"s5\" weight='medium' color='theme.secondary.1000'>/</Typography>\r\n <Typography type=\"s5\" weight='medium' color='theme.secondary.1000'>\r\n {templateData?.name}\r\n </Typography>\r\n </>\r\n }\r\n </Box>\r\n\r\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\r\n {/* Zoom Controls - Only show in preview mode */}\r\n {preview && (\r\n <>\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 1,\r\n borderRadius: 1,\r\n bgcolor: 'rgba(74, 192, 140, 0.08)',\r\n border: '1px solid rgba(74, 192, 140, 0.2)',\r\n }}\r\n >\r\n <IconButton\r\n size=\"small\"\r\n onClick={onZoomOut}\r\n disabled={zoom <= 50}\r\n color='#4AC08C'\r\n sx={{\r\n color: '#4AC08C',\r\n '&:hover': {\r\n bgcolor: 'rgba(74, 192, 140, 0.15)',\r\n },\r\n '&.Mui-disabled': {\r\n opacity: 0.3,\r\n color: '#4AC08C'\r\n }\r\n }}\r\n >\r\n <ZoomOut fontSize=\"small\" />\r\n </IconButton>\r\n\r\n <Typography\r\n type=\"s5\"\r\n weight='medium'\r\n sx={{\r\n minWidth: '50px',\r\n textAlign: 'center',\r\n color: '#4AC08C'\r\n }}\r\n >\r\n {zoom}%\r\n </Typography>\r\n\r\n <IconButton\r\n size=\"small\"\r\n onClick={onZoomIn}\r\n disabled={zoom >= 150}\r\n sx={{\r\n color: '#4AC08C',\r\n '&:hover': {\r\n bgcolor: 'rgba(74, 192, 140, 0.15)',\r\n },\r\n '&.Mui-disabled': {\r\n opacity: 0.3,\r\n color: '#4AC08C'\r\n }\r\n }}\r\n >\r\n <ZoomIn fontSize=\"small\" />\r\n </IconButton>\r\n\r\n <Divider\r\n orientation=\"vertical\"\r\n flexItem\r\n sx={{\r\n mx: 0.5,\r\n bgcolor: 'rgba(74, 192, 140, 0.3)'\r\n }}\r\n />\r\n\r\n <IconButton\r\n size=\"small\"\r\n onClick={onResetZoom}\r\n disabled={zoom === 100}\r\n title=\"Reset Zoom\"\r\n sx={{\r\n color: '#4AC08C',\r\n '&:hover': {\r\n bgcolor: 'rgba(74, 192, 140, 0.15)',\r\n },\r\n '&.Mui-disabled': {\r\n opacity: 0.3,\r\n color: '#4AC08C'\r\n }\r\n }}\r\n >\r\n <ZoomOutMap fontSize=\"small\" />\r\n </IconButton>\r\n </Box>\r\n\r\n <Divider orientation=\"vertical\" flexItem sx={{ mx: 1 }} />\r\n </>\r\n )}\r\n\r\n {!fromPreview ? (\r\n <>\r\n <Button\r\n onClick={() => setIsEditingHeaderFooter(true)}\r\n size=\"small\"\r\n variant='outlined'\r\n sx={(theme) => ({ color: `${theme.palette.theme.secondary[1000]} !important` })}\r\n startIcon={<Edit fontSize='small' />}\r\n disabled={preview}\r\n >\r\n Edit Header/Footer\r\n </Button>\r\n <Button\r\n onClick={onPreview}\r\n size=\"small\"\r\n variant='outlined'\r\n sx={(theme) => ({ color: `${theme.palette.theme.secondary[1000]} !important` })}\r\n startIcon={preview ? <EyeOff fontSize='small' /> : <Eye fontSize='small' />}\r\n disabled={!sections?.length}\r\n >\r\n Preview\r\n </Button>\r\n <Button\r\n onClick={onEditHtml}\r\n size=\"small\"\r\n variant={editHtml ? 'contained' : 'outlined'}\r\n color={editHtml ? 'primary' : 'inherit'}\r\n sx={(theme) => ({ color: editHtml ? undefined : `${theme.palette.theme.secondary[1000]} !important` })}\r\n startIcon={<CodeOutlinedIcon fontSize='small' />}\r\n disabled={!sections?.length || preview}\r\n >\r\n {editHtml ? 'Exit HTML Edit' : 'Edit HTML'}\r\n </Button>\r\n <Button\r\n variant=\"contained\"\r\n onClick={onSave}\r\n size=\"small\"\r\n sx={{ boxShadow: 'none' }}\r\n disabled={!sections?.length || isSaving}\r\n >\r\n {isSaving ? 'Saving...' : 'Save'}\r\n </Button>\r\n </>\r\n ) : (\r\n editMode ? (\r\n <>\r\n {isEditingHeaderFooter ? (\r\n <>\r\n <Button\r\n onClick={() => setIsEditingHeaderFooter(false)}\r\n size=\"small\"\r\n variant='outlined'\r\n sx={(theme) => ({ color: `${theme.palette.theme.secondary[1000]} !important` })}\r\n >\r\n Cancel Editing\r\n </Button>\r\n <Button\r\n variant=\"contained\"\r\n onClick={onSaveHeaderFooter}\r\n size=\"small\"\r\n sx={{ boxShadow: 'none' }}\r\n >\r\n Save Changes\r\n </Button>\r\n </>\r\n ) : (\r\n <>\r\n <Button\r\n onClick={() => setIsEditingHeaderFooter(true)}\r\n size=\"small\"\r\n variant='outlined'\r\n sx={(theme) => ({ color: `${theme.palette.theme.secondary[1000]} !important` })}\r\n startIcon={<Edit fontSize='small' />}\r\n disabled={preview}\r\n >\r\n Edit Header/Footer\r\n </Button>\r\n <Button\r\n onClick={onPreview}\r\n size=\"small\"\r\n variant='outlined'\r\n sx={(theme) => ({ color: `${theme.palette.theme.secondary[1000]} !important` })}\r\n startIcon={preview ? <EyeOff fontSize='small' /> : <Eye fontSize='small' />}\r\n disabled={!sections?.length}\r\n >\r\n Preview\r\n </Button>\r\n <Button\r\n variant=\"contained\"\r\n onClick={onSave}\r\n size=\"small\"\r\n sx={{ boxShadow: 'none' }}\r\n disabled={!sections?.length}\r\n >\r\n Save\r\n </Button>\r\n <Button\r\n onClick={() => onEditModeChange && onEditModeChange()}\r\n size=\"small\"\r\n variant='outlined'\r\n sx={(theme) => ({ color: `${theme.palette.theme.secondary[1000]} !important` })}\r\n >\r\n Cancel\r\n </Button>\r\n </>\r\n )}\r\n </>\r\n ) : (\r\n <Button\r\n variant=\"contained\"\r\n onClick={() => onEditModeChange && onEditModeChange()}\r\n size=\"small\"\r\n sx={{ boxShadow: 'none' }}\r\n startIcon={<Edit fontSize='small' />}\r\n disabled={!sections?.length}\r\n >\r\n Edit\r\n </Button>\r\n )\r\n )}\r\n </Stack>\r\n </Toolbar>\r\n </AppBar>\r\n );\r\n};\r\n\r\nexport default EditorHeader;","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n/* eslint-disable react-hooks/exhaustive-deps */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React, { lazy, Suspense } from 'react';\r\n\r\nimport Modal from '../../../components/modal/modal';\r\nimport Typography from '../../../components/typography/typography';\r\nimport Button from '../../../components/button/button';\r\nimport Select from '../../../components/select/select';\r\n\r\nimport {\r\n\tBox,\r\n\tDialogActions,\r\n\tDialogContent,\r\n\tDialogProps,\r\n\tDialogTitle,\r\n\tIconButton,\r\n\tMenuItem\r\n} from '@mui/material';\r\nimport Close from '@mui/icons-material/Close';\r\n\r\nimport './edit-section-modal.scss';\r\nimport { IEmail } from '../utils/types';\r\nconst CustomEditor = lazy(() => import('../../../components/editor/custom-editor'));\r\nimport { SectionData } from '../types/editor';\r\n\r\ninterface EditSectionModalProps {\r\n\tisOpen: boolean;\r\n\tsetIsOpen: (value: boolean) => void;\r\n\tmodalProps: DialogProps;\r\n\tsection: SectionData;\r\n\tplaceholders: Record<string, any>[];\r\n\thandleSave: (e: any) => void;\r\n\thandleAddPlaceholder: (placeholder: string) => void;\r\n\thandleEditorReady: (placeholder: string) => void;\r\n}\r\n\r\nconst EditSectionModal: React.FC<EditSectionModalProps> = ({\r\n\tisOpen,\r\n\tsetIsOpen,\r\n\tmodalProps,\r\n\tsection,\r\n\tplaceholders,\r\n\thandleSave,\r\n\thandleAddPlaceholder,\r\n\thandleEditorReady,\r\n}) => {\r\n\r\n\tconst handleModalClose = () => {\r\n\t\tsetIsOpen(null);\r\n\t};\r\n\r\n\tconst handleContinue = (e) => {\r\n\t\thandleSave(e)\r\n\t}\r\n\r\n\treturn (\r\n\t\t<Modal\r\n\t\t\topen={isOpen}\r\n\t\t\tonClose={handleModalClose}\r\n\t\t\tmaxWidth='lg'\r\n\t\t\tmaxHeight='md'\r\n\t\t\tfullWidth\r\n\t\t\t{...modalProps}>\r\n\t\t\t<DialogTitle className='editSectionModal--DialogTitle'>\r\n\t\t\t\t<Typography type='s3' color='inherit' weight='medium'>\r\n\t\t\t\t\tEdit Content\r\n\t\t\t\t</Typography>\r\n\t\t\t\t<Box display='flex' alignItems={'center'} gap={1} position='absolute' right='1%' top='4px'>\r\n\t\t\t\t\t<Select\r\n\t\t\t\t\t\tdisplayEmpty\r\n\t\t\t\t\t\tvalue=''\r\n\t\t\t\t\t\tsize='small'\r\n\t\t\t\t\t\trenderValue={() => 'Add placeholder'}\r\n\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tbgcolor: 'white',\r\n\t\t\t\t\t\t\tborderRadius: 1,\r\n\t\t\t\t\t\t\t'& .MuiSelect-select': { py: 0.75 }\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonChange={(e) => {\r\n\t\t\t\t\t\t\tif (e.target.value) {\r\n\t\t\t\t\t\t\t\thandleAddPlaceholder(e.target.value as string);\r\n\t\t\t\t\t\t\t\te.target.value = '';\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}}>\r\n\t\t\t\t\t\t{placeholders.map((option) => (\r\n\t\t\t\t\t\t\t<MenuItem key={option.value} value={option.value}>\r\n\t\t\t\t\t\t\t\t<Typography type='s4' color='theme.secondary.1000'>{option.label}</Typography>\r\n\t\t\t\t\t\t\t</MenuItem>\r\n\t\t\t\t\t\t))}\r\n\t\t\t\t\t</Select>\r\n\t\t\t\t\t<IconButton onClick={handleModalClose}>\r\n\t\t\t\t\t\t<Close fontSize='small' />\r\n\t\t\t\t\t</IconButton>\r\n\t\t\t\t</Box>\r\n\t\t\t</DialogTitle>\r\n\t\t\t<DialogContent className='editSectionModal--DialogContents'>\r\n\t\t\t\t<Suspense>\r\n\t\t\t\t\t<CustomEditor handleEditorReady={handleEditorReady} data={section.content}/>\r\n\t\t\t\t</Suspense>\r\n\t\t\t</DialogContent>\r\n\t\t\t<DialogActions className='editSectionModal--DialogAction'>\r\n\t\t\t\t<Box display='flex' gap={1.5}>\r\n\t\t\t\t\t<Button className='editSectionModal--DialogAction--WhiteBtn' onClick={handleModalClose}>Cancel</Button>\r\n\t\t\t\t\t<Button onClick={(e) => handleContinue(e)}>Save</Button>\r\n\t\t\t\t</Box>\r\n\t\t\t</DialogActions>\r\n\t\t</Modal>\r\n\t);\r\n};\r\n\r\nexport default EditSectionModal;\r\n","/* eslint-disable unused-imports/no-unused-vars */\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\n\r\nimport { useCallback, useMemo } from 'react';\r\n\r\n// Enhanced Custom hook for CKEditor style extraction and reverse conversion\r\nexport const useCKEditorStyleExtractor = () => {\r\n // HTML tag to CSS style mappings\r\n const tagStyleMap = useMemo(() => ({\r\n 'i': { fontStyle: 'italic' },\r\n 'em': { fontStyle: 'italic' },\r\n 'b': { fontWeight: 'bold' },\r\n 'strong': { fontWeight: 'bold' },\r\n 'u': { textDecoration: 'underline' },\r\n 's': { textDecoration: 'line-through' },\r\n 'strike': { textDecoration: 'line-through' },\r\n 'del': { textDecoration: 'line-through' },\r\n 'sup': { verticalAlign: 'super', fontSize: 'smaller' },\r\n 'sub': { verticalAlign: 'sub', fontSize: 'smaller' },\r\n 'small': { fontSize: 'smaller' },\r\n 'big': { fontSize: 'larger' },\r\n 'mark': { backgroundColor: 'yellow' },\r\n 'code': { fontFamily: 'monospace' },\r\n 'kbd': { fontFamily: 'monospace', backgroundColor: '#f1f1f1', padding: '2px 4px', borderRadius: '3px' },\r\n 'samp': { fontFamily: 'monospace' },\r\n 'var': { fontStyle: 'italic', fontFamily: 'monospace' }\r\n }), []);\r\n\r\n // Reverse mapping: CSS styles to HTML tags (for reverse conversion)\r\n const styleTagMap = useMemo(() => {\r\n const reverseMap = {};\r\n \r\n // Create reverse mapping with priority for semantic tags\r\n const tagPriority = {\r\n 'fontStyle-italic': 'i',\r\n 'fontWeight-bold': 'b',\r\n 'textDecoration-underline': 'u',\r\n 'textDecoration-line-through': 's',\r\n 'verticalAlign-super': 'sup',\r\n 'verticalAlign-sub': 'sub',\r\n 'fontSize-smaller': 'small',\r\n 'fontSize-larger': 'big',\r\n 'backgroundColor-yellow': 'mark'\r\n };\r\n\r\n Object.entries(tagPriority).forEach(([styleKey, tag]) => {\r\n reverseMap[styleKey] = tag;\r\n });\r\n\r\n return reverseMap;\r\n }, []);\r\n\r\n // CSS property mappings for camelCase conversion\r\n const cssPropertyMap = useMemo(() => ({\r\n 'font-family': 'fontFamily',\r\n 'font-size': 'fontSize',\r\n 'font-weight': 'fontWeight',\r\n 'font-style': 'fontStyle',\r\n 'text-align': 'textAlign',\r\n 'text-decoration': 'textDecoration',\r\n 'text-transform': 'textTransform',\r\n 'line-height': 'lineHeight',\r\n 'letter-spacing': 'letterSpacing',\r\n 'word-spacing': 'wordSpacing',\r\n 'color': 'color',\r\n 'background-color': 'backgroundColor',\r\n 'background-image': 'backgroundImage',\r\n 'background-size': 'backgroundSize',\r\n 'background-position': 'backgroundPosition',\r\n 'background-repeat': 'backgroundRepeat',\r\n 'border': 'border',\r\n 'border-color': 'borderColor',\r\n 'border-width': 'borderWidth',\r\n 'border-style': 'borderStyle',\r\n 'border-radius': 'borderRadius',\r\n 'margin': 'margin',\r\n 'margin-top': 'marginTop',\r\n 'margin-right': 'marginRight',\r\n 'margin-bottom': 'marginBottom',\r\n 'margin-left': 'marginLeft',\r\n 'padding': 'padding',\r\n 'padding-top': 'paddingTop',\r\n 'padding-right': 'paddingRight',\r\n 'padding-bottom': 'paddingBottom',\r\n 'padding-left': 'paddingLeft',\r\n 'width': 'width',\r\n 'height': 'height',\r\n 'max-width': 'maxWidth',\r\n 'max-height': 'maxHeight',\r\n 'min-width': 'minWidth',\r\n 'min-height': 'minHeight',\r\n 'display': 'display',\r\n 'position': 'position',\r\n 'top': 'top',\r\n 'right': 'right',\r\n 'bottom': 'bottom',\r\n 'left': 'left',\r\n 'float': 'float',\r\n 'clear': 'clear',\r\n 'overflow': 'overflow',\r\n 'opacity': 'opacity',\r\n 'z-index': 'zIndex',\r\n 'box-shadow': 'boxShadow',\r\n 'text-shadow': 'textShadow',\r\n 'vertical-align': 'verticalAlign'\r\n }), []);\r\n\r\n // Convert CSS property to camelCase\r\n const toCamelCase = useCallback((property) => {\r\n return cssPropertyMap[property] || \r\n property.replace(/-([a-z])/g, (match, letter) => letter.toUpperCase());\r\n }, [cssPropertyMap]);\r\n\r\n // Convert camelCase to kebab-case\r\n const toKebabCase = useCallback((property) => {\r\n return property.replace(/([A-Z])/g, '-$1').toLowerCase();\r\n }, []);\r\n\r\n // Parse inline styles from element.style object\r\n const parseInlineStyles = useCallback((styleDeclaration) => {\r\n const styles = {};\r\n\r\n for (let i = 0; i < styleDeclaration.length; i++) {\r\n const property = styleDeclaration[i];\r\n const value = styleDeclaration.getPropertyValue(property);\r\n \r\n if (value) {\r\n const camelCaseProperty = toCamelCase(property);\r\n styles[camelCaseProperty] = value.trim();\r\n }\r\n }\r\n\r\n return styles;\r\n }, [toCamelCase]);\r\n\r\n // Extract styles based on semantic HTML tags\r\n const extractTagStyles = useCallback((element) => {\r\n const tagName = element.tagName.toLowerCase();\r\n return tagStyleMap[tagName] || {};\r\n }, [tagStyleMap]);\r\n\r\n // Extract nested/inherited styles from parent elements\r\n const extractNestedStyles = useCallback((element) => {\r\n const nestedStyles = {};\r\n let currentElement = element.parentElement;\r\n\r\n // Traverse up the DOM tree to collect inherited styles\r\n while (currentElement && currentElement.tagName !== 'BODY') {\r\n const tagName = currentElement.tagName.toLowerCase();\r\n \r\n // Add tag-based styles from parents\r\n if (tagStyleMap[tagName]) {\r\n Object.entries(tagStyleMap[tagName]).forEach(([prop, value]) => {\r\n // Only add if not already defined (child takes precedence)\r\n if (!nestedStyles[prop]) {\r\n nestedStyles[prop] = value;\r\n }\r\n });\r\n }\r\n\r\n // Add inline styles from parents that can be inherited\r\n if (currentElement.style.length > 0) {\r\n const inheritableProps = ['color', 'fontFamily', 'fontSize', 'lineHeight', 'textAlign'];\r\n const parentStyles = parseInlineStyles(currentElement.style);\r\n \r\n inheritableProps.forEach(prop => {\r\n if (parentStyles[prop] && !nestedStyles[prop]) {\r\n nestedStyles[prop] = parentStyles[prop];\r\n }\r\n });\r\n }\r\n\r\n currentElement = currentElement.parentElement;\r\n }\r\n\r\n return nestedStyles;\r\n }, [tagStyleMap, parseInlineStyles]);\r\n\r\n // Extract image-specific styles\r\n const extractImageStyles = useCallback((imgElement, styleData) => {\r\n const imageStyles = {};\r\n\r\n if (imgElement.width) imageStyles.width = `${imgElement.width}px`;\r\n if (imgElement.height) imageStyles.height = `${imgElement.height}px`;\r\n if (imgElement.getAttribute('align')) {\r\n imageStyles.textAlign = imgElement.getAttribute('align');\r\n }\r\n\r\n // Merge with existing styles\r\n Object.assign(styleData.styles, imageStyles);\r\n \r\n // Add image-specific metadata\r\n styleData.src = imgElement.src;\r\n styleData.alt = imgElement.alt;\r\n }, []);\r\n\r\n // Main extraction function\r\n const extractStyles = useCallback((editorContent, options = {}) => {\r\n const {\r\n includeInlineStyles = true,\r\n includeTagStyles = true,\r\n includeComputedStyles = false,\r\n groupByElement = false,\r\n filterEmptyStyles = true,\r\n mergeNestedStyles = true\r\n } = options;\r\n\r\n // Create a temporary DOM element to parse the content\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = editorContent;\r\n\r\n const results = [];\r\n const elements = tempDiv.querySelectorAll('*');\r\n\r\n elements.forEach((element, index) => {\r\n const styleData = {\r\n elementType: element.tagName.toLowerCase(),\r\n elementIndex: index,\r\n className: element.className || null,\r\n id: element.id || null,\r\n styles: {},\r\n textContent: element.textContent?.trim() || null\r\n };\r\n\r\n // Extract inline styles\r\n if (includeInlineStyles && element.style.length > 0) {\r\n styleData.styles = { ...styleData.styles, ...parseInlineStyles(element.style) };\r\n }\r\n\r\n // Extract semantic tag styles (like <i>, <b>, etc.)\r\n if (includeTagStyles) {\r\n const tagStyles = extractTagStyles(element);\r\n styleData.styles = { ...styleData.styles, ...tagStyles };\r\n }\r\n\r\n // Extract nested styling context\r\n if (mergeNestedStyles) {\r\n const nestedStyles = extractNestedStyles(element);\r\n styleData.styles = { ...styleData.styles, ...nestedStyles };\r\n styleData.inheritedStyles = nestedStyles;\r\n }\r\n\r\n // Handle special cases for images\r\n if (element.tagName.toLowerCase() === 'img') {\r\n extractImageStyles(element, styleData);\r\n }\r\n\r\n // Filter empty styles if requested\r\n if (filterEmptyStyles && Object.keys(styleData.styles).length === 0 && !styleData.textContent) {\r\n return;\r\n }\r\n\r\n results.push(styleData);\r\n });\r\n\r\n return results;\r\n }, [parseInlineStyles, extractTagStyles, extractNestedStyles, extractImageStyles]);\r\n\r\n // Extract styles specifically for formatting tags\r\n const extractFormattingStyles = useCallback((editorContent) => {\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = editorContent;\r\n \r\n const formattingTags = ['i', 'em', 'b', 'strong', 'u', 's', 'strike', 'del', 'sup', 'sub'];\r\n const formattingStyles = {};\r\n\r\n formattingTags.forEach(tag => {\r\n const elements = tempDiv.querySelectorAll(tag);\r\n elements.forEach((element, index) => {\r\n const key = `${tag}_${index}`;\r\n formattingStyles[key] = {\r\n ...tagStyleMap[tag],\r\n textContent: element.textContent,\r\n };\r\n });\r\n });\r\n\r\n return formattingStyles;\r\n }, [tagStyleMap]);\r\n\r\n // NEW: Convert styles object to HTML with semantic tags\r\n const stylesToHtml = useCallback((text, styles = {}, options = {}) => {\r\n const {\r\n preferSemanticTags = true,\r\n wrapInParagraph = true,\r\n preserveWhitespace = true\r\n } = options;\r\n\r\n if (!text || typeof text !== 'string') {\r\n return '';\r\n }\r\n\r\n let wrappedText = text;\r\n const inlineStyles = {};\r\n\r\n // Process each style property\r\n Object.entries(styles).forEach(([property, value]) => {\r\n const styleKey = `${property}-${value}`;\r\n \r\n // Check if this style can be converted to a semantic tag\r\n if (preferSemanticTags && styleTagMap[styleKey]) {\r\n const tag = styleTagMap[styleKey];\r\n wrappedText = `<${tag}>${wrappedText}</${tag}>`;\r\n } else {\r\n // Add to inline styles for non-semantic styles\r\n inlineStyles[property] = value;\r\n }\r\n });\r\n\r\n // Apply remaining inline styles\r\n if (Object.keys(inlineStyles).length > 0) {\r\n const styleAttr = Object.entries(inlineStyles)\r\n .map(([prop, val]) => `${toKebabCase(prop)}: ${val}`)\r\n .join('; ');\r\n \r\n wrappedText = `<span style=\"${styleAttr}\">${wrappedText}</span>`;\r\n }\r\n\r\n // Wrap in paragraph if requested\r\n if (wrapInParagraph) {\r\n wrappedText = `<p>${wrappedText}</p>`;\r\n }\r\n\r\n return wrappedText;\r\n }, [styleTagMap, toKebabCase]);\r\n\r\n // NEW: Convert multiple styled text segments to HTML\r\n const multipleStylesToHtml = useCallback((segments, options = {}) => {\r\n const {\r\n wrapInContainer = true,\r\n containerTag = 'div',\r\n separateElements = false\r\n } = options;\r\n\r\n if (!Array.isArray(segments)) {\r\n return '';\r\n }\r\n\r\n const htmlSegments = segments.map(segment => {\r\n const { text, styles = {}, wrapInParagraph = false } = segment;\r\n return stylesToHtml(text, styles, { ...options, wrapInParagraph });\r\n });\r\n\r\n let result = separateElements ? htmlSegments.join('\\n') : htmlSegments.join(' ');\r\n\r\n if (wrapInContainer) {\r\n result = `<${containerTag}>${result}</${containerTag}>`;\r\n }\r\n\r\n return result;\r\n }, [stylesToHtml]);\r\n\r\n // NEW: Apply styles to existing HTML content\r\n const applyStylesToHtml = useCallback((htmlContent, styles = {}, targetSelector = '*') => {\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = htmlContent;\r\n\r\n const targetElements = targetSelector === '*' \r\n ? tempDiv.querySelectorAll('*') \r\n : tempDiv.querySelectorAll(targetSelector);\r\n\r\n targetElements.forEach(element => {\r\n Object.entries(styles).forEach(([property, value]) => {\r\n const styleKey = `${property}-${value}`;\r\n \r\n // Check if this style should be converted to semantic tag\r\n if (styleTagMap[styleKey]) {\r\n const tag = styleTagMap[styleKey];\r\n const wrapper = document.createElement(tag);\r\n \r\n // Move the element's content to the wrapper\r\n while (element.firstChild) {\r\n wrapper.appendChild(element.firstChild);\r\n }\r\n \r\n element.appendChild(wrapper);\r\n } else {\r\n // Apply as inline style\r\n const kebabProperty = toKebabCase(property);\r\n element.style[kebabProperty] = value;\r\n }\r\n });\r\n });\r\n\r\n return tempDiv.innerHTML;\r\n }, [styleTagMap, toKebabCase]);\r\n\r\n // NEW: Extract and convert - one-step process\r\n const extractAndConvert = useCallback((editorContent, targetStyles = {}) => {\r\n const extracted = extractStyles(editorContent);\r\n const converted = {};\r\n\r\n extracted.forEach(item => {\r\n const key = item.className || item.id || `${item.elementType}_${item.elementIndex}`;\r\n const mergedStyles = { ...item.styles, ...targetStyles };\r\n \r\n if (item.textContent) {\r\n converted[key] = stylesToHtml(item.textContent, mergedStyles, { wrapInParagraph: false });\r\n }\r\n });\r\n\r\n return converted;\r\n }, [extractStyles, stylesToHtml]);\r\n\r\n // Generate CSS string from extracted styles\r\n const generateCSS = useCallback((extractedStyles) => {\r\n let css = '';\r\n \r\n extractedStyles.forEach((item, index) => {\r\n const selector = item.className \r\n ? `.${item.className}` \r\n : item.id \r\n ? `#${item.id}` \r\n : `${item.elementType}-${index}`;\r\n\r\n const styleRules = Object.entries(item.styles)\r\n .map(([prop, value]) => ` ${toKebabCase(prop)}: ${value};`)\r\n .join('\\n');\r\n\r\n if (styleRules) {\r\n css += `${selector} {\\n${styleRules}\\n}\\n\\n`;\r\n }\r\n });\r\n\r\n return css;\r\n }, [toKebabCase]);\r\n\r\n // Get flattened styles object\r\n const getFlattenedStyles = useCallback((extractedStyles) => {\r\n const flattened = {};\r\n \r\n extractedStyles.forEach((item, index) => {\r\n const prefix = item.className || item.id || `${item.elementType}_${index}`;\r\n Object.entries(item.styles).forEach(([prop, value]) => {\r\n flattened[`${prefix}_${prop}`] = value;\r\n });\r\n });\r\n\r\n return flattened;\r\n }, []);\r\n\r\n const getSingleStyles = useCallback((extractedStyles) => {\r\n const flattened = {};\r\n \r\n extractedStyles.forEach((item, index) => {\r\n // const prefix = item.className || item.id || `${item.elementType}_${index}`;\r\n Object.entries(item.styles).forEach(([prop, value]) => {\r\n flattened[prop] = value;\r\n });\r\n });\r\n\r\n return flattened;\r\n }, []);\r\n\r\n return {\r\n // Original functions\r\n extractStyles,\r\n extractFormattingStyles,\r\n generateCSS,\r\n getFlattenedStyles,\r\n getSingleStyles,\r\n \r\n \r\n // New reverse conversion functions\r\n stylesToHtml,\r\n multipleStylesToHtml,\r\n applyStylesToHtml,\r\n extractAndConvert\r\n };\r\n};","import { useCallback, useRef } from 'react';\r\n\r\n/**\r\n * Custom hook for debouncing section content updates\r\n * @param callback - The function to debounce\r\n * @param delay - Delay in milliseconds (default: 300ms)\r\n * @returns Debounced function\r\n */\r\nexport const useDebouncedUpdate = <T extends (...args: any[]) => void>(\r\n callback: T,\r\n delay: number = 300\r\n): T => {\r\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\r\n\r\n const debouncedCallback = useCallback(\r\n (...args: Parameters<T>) => {\r\n // Clear existing timeout\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n\r\n // Set new timeout\r\n timeoutRef.current = setTimeout(() => {\r\n callback(...args);\r\n }, delay);\r\n },\r\n [callback, delay]\r\n ) as T;\r\n\r\n return debouncedCallback;\r\n};\r\n","/* eslint-disable react-hooks/exhaustive-deps */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React, { useRef, useState, lazy, Suspense, useCallback, useMemo } from 'react';\r\nimport { useDraggable, useDroppable } from '@dnd-kit/core';\r\nimport {\r\n\tBox,\r\n\tPaper,\r\n\tMenuItem,\r\n\tFormControl,\r\n\tIconButton,\r\n\tFade,\r\n\tFormControlLabel,\r\n\tSkeleton\r\n} from '@mui/material';\r\nimport DragIndicatorIcon from '@mui/icons-material/DragIndicator';\r\nimport SplitIcon from '@mui/icons-material/CallSplit';\r\nimport { SectionData } from '../types/editor';\r\nimport { Edit, Save, Trash } from '../../../components/icons';\r\nimport Select from '../../../components/select/select';\r\nimport Typography from '../../../components/typography/typography';\r\nimport EditSectionModal from '../edit-section-modal/edit-section-modal';\r\nimport Checkbox from '../../../components/checkbox/checkbox';\r\nimport Chip from '../../../components/chip/chip';\r\nimport Close from '@mui/icons-material/Close';\r\nimport { useCKEditorStyleExtractor } from '../utils/style-extractor';\r\nimport { useDebouncedUpdate } from '../hooks/useDebouncedUpdate';\r\n\r\nconst CustomEditor = lazy(() => import('../../../components/editor/custom-editor'));\r\n\r\ninterface EditorSectionProps {\r\n\tsection: SectionData;\r\n\tisSelected: boolean;\r\n\tisDragging: boolean;\r\n\tisOver: boolean;\r\n\tonSelect: () => void;\r\n\tonUpdate: (content: string, options?: any) => void;\r\n\tonSplit: (content1: string, content2: string) => void;\r\n\tonDelete: () => void;\r\n\tplaceholders: Array<{ value: string; label: string }>;\r\n\tsetIsSectionEditing:(value: boolean)=> void;\r\n}\r\n\r\nconst editableSections = ['text', 'text-block', 'heading', 'heading-1', 'heading-2', 'heading-3', 'heading-4'];\r\n\r\nconst EditorSection: React.FC<EditorSectionProps> = ({\r\n\tsection,\r\n\tisSelected,\r\n\tisDragging,\r\n\tisOver,\r\n\tonSelect,\r\n\tonUpdate,\r\n\tonSplit,\r\n\tonDelete,\r\n\tplaceholders,\r\n\tsetIsSectionEditing\r\n}) => {\r\n\tconst { extractStyles, getSingleStyles } = useCKEditorStyleExtractor();\r\n\r\n\tconst {\r\n\t\tattributes,\r\n\t\tlisteners,\r\n\t\tsetNodeRef: setDraggableRef,\r\n\t\ttransform\r\n\t} = useDraggable({ id: section.id });\r\n\r\n\tconst { setNodeRef: setDroppableRef } = useDroppable({ id: section.id });\r\n\tconst [isEditing, setIsEditing] = useState(false);\r\n\tconst [isHovered, setIsHovered] = useState(false);\r\n\tconst [isOpenEditSectionModal, setIsOpenEditSectionModal] = useState(false);\r\n\tconst [isEditedFromSource, setIsEditedFromSource] = useState(Boolean(section?.is_edited_from_source));\r\n\tconst [localContent, setLocalContent] = useState(section.content);\r\n\tconst [hasUserEdited, setHasUserEdited] = useState(false); // Track if user actually made changes\r\n\tconst editorRef = useRef<any>(null);\r\n\tconst mouseHoverTimeoutRef = useRef<number | null>(null);\r\n\tconst cursorPositionRef = useRef<{ from: number; to: number } | null>(null);\r\n\tconst isRestoringCursorRef = useRef(false);\r\n\t\r\n\t// Ref-based content tracking for contentEditable optimization\r\n\t// This ref tracks content changes without triggering re-renders during editing,\r\n\t// improving performance and preventing cursor position loss\r\n\tconst contentRef = useRef<string>(section.content);\r\n\tconst originalContentRef = useRef<string>(section.content); // Store original content\r\n\r\n\t// Create debounced version of onUpdate with 300ms delay\r\n\tconst debouncedUpdate = useDebouncedUpdate(onUpdate, 300);\r\n\r\n\t// Memoize style calculation\r\n\tconst style = useMemo(() => {\r\n\t\treturn transform\r\n\t\t\t? {\r\n\t\t\t\t\ttransform: `translate3d(${transform.x}px, ${transform.y}px, 0)`,\r\n\t\t\t\t\ttransition: 'none'\r\n\t\t\t\t}\r\n\t\t\t: { transition: 'all 0.2s ease' };\r\n\t}, [transform]);\r\n\r\n\t// Memoize sx prop for Paper to prevent re-creation\r\n\tconst paperSx = useMemo(() => ({\r\n\t\tposition: 'relative',\r\n\t\tborder: '1px dashed',\r\n\t\tborderColor: isSelected ? 'primary.main' : isOver ? 'primary.main' : 'grey.400',\r\n\t\tborderRadius: 1,\r\n\t\tbgcolor: 'white',\r\n\t\topacity: isDragging ? 0.7 : 1,\r\n\t\tboxShadow: 'none',\r\n\t\ttransition: 'all 0.2s ease',\r\n\t\t'&:hover': {\r\n\t\t\tboxShadow: 'none'\r\n\t\t},\r\n\t\t...(isOver && { borderColor: 'primary.main', boxShadow: 'none' })\r\n\t}), [isSelected, isOver, isDragging]);\r\n\r\n\t// Memoize merged ref to prevent re-creation\r\n\tconst mergedRef = useCallback((node: HTMLElement | null) => {\r\n\t\tsetDraggableRef(node);\r\n\t\tsetDroppableRef(node);\r\n\t}, [setDraggableRef, setDroppableRef]);\r\n\r\n\t// Memoize event handlers\r\n\tconst handleDblClick = useCallback(() => {\r\n\t\tif (editableSections.includes(section.type)) {\r\n\t\t\thandleEditing();\r\n\t\t}\r\n\t}, [section.type]);\r\n\r\n\tconst handleEditing = useCallback(() => {\r\n\t\t// Store original content when entering edit mode\r\n\t\toriginalContentRef.current = section.content;\r\n\t\tsetHasUserEdited(false);\r\n\t\t\r\n\t\tif (section?.isSplitPair) {\r\n\t\t\tsetIsOpenEditSectionModal(true);\r\n\t\t} else {\r\n\t\t\tsetIsEditing(true);\r\n\t\t\tsetIsSectionEditing(true);\r\n\t\t}\r\n\t}, [section?.isSplitPair, section.content, setIsSectionEditing]);\r\n\r\n\tconst handleEditorReady = useCallback((editor: any) => {\r\n\t\teditorRef.current = editor;\r\n\t\t\r\n\t\t// Track cursor position changes in the editor\r\n\t\tif (editor?._tiptap) {\r\n\t\t\teditor._tiptap.on('selectionUpdate', () => {\r\n\t\t\t\tif (!isRestoringCursorRef.current && editor._tiptap) {\r\n\t\t\t\t\tconst { from, to } = editor._tiptap.state.selection;\r\n\t\t\t\t\tcursorPositionRef.current = { from, to };\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\t\r\n\t\t\t// Track when user actually makes changes\r\n\t\t\teditor._tiptap.on('update', ({ transaction }) => {\r\n\t\t\t\t// Only mark as edited if the transaction actually changed the document\r\n\t\t\t\tif (transaction.docChanged) {\r\n\t\t\t\t\tsetHasUserEdited(true);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst handleSave = useCallback((e: React.MouseEvent) => {\r\n\t\te.stopPropagation();\r\n\t\tif (editorRef.current) {\r\n\t\t\t// Save cursor position before getting content\r\n\t\t\tif (editorRef.current._tiptap) {\r\n\t\t\t\tconst { from, to } = editorRef.current._tiptap.state.selection;\r\n\t\t\t\tcursorPositionRef.current = { from, to };\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// Get content from editor\r\n\t\t\t// Use getData() which returns sourceCodeRef.current from CustomEditor\r\n\t\t\t// This preserves the HTML structure better than getHTML()\r\n\t\t\tconst content = editorRef.current.getData();\r\n\t\t\t\r\n\t\t\t// Update ref immediately for instant tracking\r\n\t\t\tcontentRef.current = content;\r\n\t\t\t\r\n\t\t\t// Update local state for UI feedback\r\n\t\t\tsetLocalContent(content);\r\n\t\t\t\r\n\t\t\tconst styles = extractStyles(section.content, {\r\n\t\t\t\tincludeTagStyles: true,\r\n\t\t\t\tincludeInlineStyles: true,\r\n\t\t\t\tmergeNestedStyles: true,\r\n\t\t\t\tfilterEmptyStyles: true\r\n\t\t\t});\r\n\t\t\tconst single = getSingleStyles(styles);\r\n\t\t\t// Merge styles safely\r\n\t\t\tconst mergedStyles = {\r\n\t\t\t\t...(section.attributes?.styles || {}),\r\n\t\t\t\t...single\r\n\t\t\t};\r\n\t\r\n\t\t\t// Merge attributes, giving priority to new props\r\n\t\t\tconst mergedAttributes = {\r\n\t\t\t\t...(section.attributes || {}),\r\n\t\t\t\tstyles: mergedStyles,\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\t// Use debounced update to prevent excessive re-renders and API calls\r\n\t\t\tdebouncedUpdate(content, { is_edited_from_source: isEditedFromSource, attributes: mergedAttributes });\r\n\t\t}\r\n\t\tsetIsEditing(false);\r\n\t\tsetIsSectionEditing(false)\r\n\t\tsetIsOpenEditSectionModal(false);\r\n\t\tsetHasUserEdited(false); // Reset edit flag\r\n\t}, [debouncedUpdate, isEditedFromSource, extractStyles, getSingleStyles, section.content, section.attributes, setIsSectionEditing, hasUserEdited]);\r\n\r\n\tconst handleSplit = useCallback(() => {\r\n\t\tconst content = section.content || '';\r\n\t\tconst firstHalf = content;\r\n\t\tconst secondHalf = '';\r\n\t\tonSplit(firstHalf, secondHalf);\r\n\t}, [section.content, onSplit]);\r\n\r\n\tconst handleAddPlaceholder = useCallback((placeholder: string) => {\r\n\t\tif (editorRef.current) {\r\n\t\t\tconst viewFragment = editorRef.current.data.processor.toView(\r\n\t\t\t\t`{{${placeholder}}}`\r\n\t\t\t);\r\n\t\t\tconst modelFragment = editorRef.current.data.toModel(viewFragment);\r\n\t\t\teditorRef.current.model.insertContent(modelFragment);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst handleMouseEnter = useCallback(() => {\r\n\t\tif (mouseHoverTimeoutRef.current !== null) {\r\n\t\t\twindow.clearTimeout(mouseHoverTimeoutRef.current);\r\n\t\t}\r\n\t\tmouseHoverTimeoutRef.current = window.setTimeout(() => {\r\n\t\t\tsetIsHovered(true);\r\n\t\t}, 50);\r\n\t}, []);\r\n\r\n\tconst handleMouseLeave = useCallback(() => {\r\n\t\tif (mouseHoverTimeoutRef.current !== null) {\r\n\t\t\twindow.clearTimeout(mouseHoverTimeoutRef.current);\r\n\t\t}\r\n\t\tmouseHoverTimeoutRef.current = window.setTimeout(() => {\r\n\t\t\tsetIsHovered(false);\r\n\t\t}, 50);\r\n\t}, []);\r\n\r\n\tconst handleClick = useCallback((e: React.MouseEvent) => {\r\n\t\te.stopPropagation();\r\n\t\tonSelect();\r\n\t}, [onSelect]);\r\n\r\n\tconst handleDeleteClick = useCallback((e: React.MouseEvent) => {\r\n\t\te.stopPropagation();\r\n\t\tonDelete();\r\n\t}, [onDelete]);\r\n\r\n\tconst handleCancelEdit = useCallback(() => {\r\n\t\tsetIsEditing(false);\r\n\t\tsetIsSectionEditing(false)\r\n\t}, [setIsSectionEditing]);\r\n\r\n\tconst handleCheckboxChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n\t\tsetIsEditedFromSource(e.target.checked);\r\n\t}, []);\r\n\r\n\tconst handleSelectChange = useCallback((e: any) => {\r\n\t\tif (e.target.value) {\r\n\t\t\thandleAddPlaceholder(e.target.value as string);\r\n\t\t\te.target.value = '';\r\n\t\t}\r\n\t}, [handleAddPlaceholder]);\r\n\r\n\t// Cleanup function for hover timeout\r\n\tReact.useEffect(() => {\r\n\t\treturn () => {\r\n\t\t\tif (mouseHoverTimeoutRef.current !== null) {\r\n\t\t\t\twindow.clearTimeout(mouseHoverTimeoutRef.current);\r\n\t\t\t}\r\n\t\t};\r\n\t}, []);\r\n\r\n\t// Sync local content with section content when it changes externally\r\n\t// and restore cursor position if editor is focused\r\n\tReact.useEffect(() => {\r\n\t\t// Only update if content actually changed from external source\r\n\t\t// Skip if we're currently editing (content changes come from user input)\r\n\t\tif (contentRef.current === section.content) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t\r\n\t\t// Update both ref and state for consistency\r\n\t\tcontentRef.current = section.content;\r\n\t\tsetLocalContent(section.content);\r\n\t\t\r\n\t\t// Only restore cursor position if:\r\n\t\t// 1. Editor is active (isEditing)\r\n\t\t// 2. Content change came from external source (not from user typing)\r\n\t\t// 3. We're not currently in the middle of restoring cursor\r\n\t\tif (isEditing && editorRef.current?._tiptap && cursorPositionRef.current && !isRestoringCursorRef.current) {\r\n\t\t\tconst editor = editorRef.current._tiptap;\r\n\t\t\tconst { from, to } = cursorPositionRef.current;\r\n\t\t\t\r\n\t\t\t// Use requestAnimationFrame to ensure DOM has updated\r\n\t\t\trequestAnimationFrame(() => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tisRestoringCursorRef.current = true;\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Validate that the cursor position is still valid after content update\r\n\t\t\t\t\tconst docSize = editor.state.doc.content.size;\r\n\t\t\t\t\tconst validFrom = Math.min(from, docSize);\r\n\t\t\t\t\tconst validTo = Math.min(to, docSize);\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Restore selection\r\n\t\t\t\t\teditor.commands.setTextSelection({ from: validFrom, to: validTo });\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Ensure editor maintains focus\r\n\t\t\t\t\tif (!editor.isFocused) {\r\n\t\t\t\t\t\teditor.commands.focus();\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\tconsole.warn('Failed to restore cursor position:', error);\r\n\t\t\t\t} finally {\r\n\t\t\t\t\tisRestoringCursorRef.current = false;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}, [section.content, isEditing]);\r\n\r\n\t// Memoize content rendering to prevent unnecessary re-renders\r\n\t// Only re-render when isEditing state changes or when not editing and localContent changes\r\n\tconst contentRenderer = useMemo(() => {\r\n\t\tif (isEditing) {\r\n\t\t\treturn (\r\n\t\t\t\t<Suspense fallback={<Skeleton />}>\r\n\t\t\t\t\t<CustomEditor \r\n\t\t\t\t\t\tkey={`editor-${section.id}`}\r\n\t\t\t\t\t\teditorRef={editorRef}\r\n\t\t\t\t\t\thandleEditorReady={handleEditorReady} \r\n\t\t\t\t\t\tdata={localContent}\r\n\t\t\t\t\t\tonError={(error: Error) => console.error('Editor error:', error)}\r\n\t\t\t\t\t/>\r\n\t\t\t\t</Suspense>\r\n\t\t\t);\r\n\t\t}\r\n\t\t\r\n\t\treturn (\r\n\t\t\t<Box\r\n\t\t\t\tdangerouslySetInnerHTML={{ __html: localContent }}\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tposition: 'relative',\r\n\t\t\t\t\tpy: section.type === 'divider' ? 1 : 0,\r\n\t\t\t\t\tlineHeight: 1.6,\r\n\t\t\t\t\t'& p': { margin: 0 }\r\n\t\t\t\t}}\r\n\t\t\t/>\r\n\t\t);\r\n\t}, [isEditing, localContent, section.type, section.id]);\r\n\r\n\t// Memoize placeholder options\r\n\tconst placeholderOptions = useMemo(() => \r\n\t\tplaceholders.map((option) => (\r\n\t\t\t<MenuItem key={option.value} value={option.value}>\r\n\t\t\t\t<Typography type='s4' color='theme.secondary.1000'>{option.label}</Typography>\r\n\t\t\t</MenuItem>\r\n\t\t))\r\n\t, [placeholders]);\r\n\r\n\treturn (\r\n\t\t<Paper\r\n\t\t\tref={mergedRef}\r\n\t\t\tstyle={style}\r\n\t\t\televation={isHovered || isSelected ? 3 : 1}\r\n\t\t\tsx={paperSx}\r\n\t\t\tonClick={handleClick}\r\n\t\t\tonDoubleClick={handleDblClick}\r\n\t\t\tonMouseEnter={handleMouseEnter}\r\n\t\t\tonMouseLeave={handleMouseLeave}>\r\n\t\t\t{isOver && !isDragging && (\r\n\t\t\t\t<Box\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\tposition: 'absolute',\r\n\t\t\t\t\t\ttop: 0,\r\n\t\t\t\t\t\tleft: 0,\r\n\t\t\t\t\t\tright: 0,\r\n\t\t\t\t\t\tbottom: 0,\r\n\t\t\t\t\t\tborder: '2px dashed',\r\n\t\t\t\t\t\tborderColor: 'primary.main',\r\n\t\t\t\t\t\tborderRadius: 1,\r\n\t\t\t\t\t\tbgcolor: 'rgba(25, 118, 210, 0.04)',\r\n\t\t\t\t\t\tzIndex: 10,\r\n\t\t\t\t\t\tdisplay: 'flex',\r\n\t\t\t\t\t\talignItems: 'center',\r\n\t\t\t\t\t\tjustifyContent: 'center',\r\n\t\t\t\t\t\tpointerEvents: 'none'\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t<Typography type='s2' color='primary' weight='medium'>Drop here</Typography>\r\n\t\t\t\t</Box>\r\n\t\t\t)}\r\n\t\t\t<Box\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tbgcolor: 'grey.50',\r\n\t\t\t\t\tp: 1,\r\n\t\t\t\t\tdisplay: 'flex',\r\n\t\t\t\t\talignItems: 'center',\r\n\t\t\t\t\tjustifyContent: 'space-between',\r\n\t\t\t\t\tborderBottom: '1px solid',\r\n\t\t\t\t\tborderColor: 'grey.200'\r\n\t\t\t\t}}>\r\n\t\t\t\t<Box\r\n\t\t\t\t\t{...listeners}\r\n\t\t\t\t\t{...attributes}\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\tdisplay: 'flex',\r\n\t\t\t\t\t\talignItems: 'center',\r\n\t\t\t\t\t\tcursor: 'grab',\r\n\t\t\t\t\t\tpx: 1,\r\n\t\t\t\t\t\tpy: 0.5,\r\n\t\t\t\t\t\tborderRadius: 1,\r\n\t\t\t\t\t\ttransition: 'background-color 0.2s ease',\r\n\t\t\t\t\t\t'&:hover': { bgcolor: 'grey.100' },\r\n\t\t\t\t\t\t'&:active': { cursor: 'grabbing' }\r\n\t\t\t\t\t}}>\r\n\t\t\t\t\t<DragIndicatorIcon\r\n\t\t\t\t\t\tsx={{ color: 'grey.600', fontSize: '1.2rem', mr: 0.5 }}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<Typography type='s3' color='theme.secondary.600' weight='medium'>Move</Typography>\r\n\t\t\t\t</Box>\r\n\t\t\t\t<Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\r\n\t\t\t\t\t{isEditing ? (\r\n\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t<FormControlLabel control={\r\n\t\t\t\t\t\t\t\t<Checkbox \r\n\t\t\t\t\t\t\t\t\tonChange={handleCheckboxChange} \r\n\t\t\t\t\t\t\t\t\tdefaultChecked={isEditedFromSource}/>} \r\n\t\t\t\t\t\t\t\t\tlabel={<Typography type='s2' color='theme.secondary.1000'>Edited from source</Typography>} />\r\n\t\t\t\t\t\t\t<FormControl size='small' sx={{ minWidth: 160 }}>\r\n\t\t\t\t\t\t\t\t<Select\r\n\t\t\t\t\t\t\t\t\tdisplayEmpty\r\n\t\t\t\t\t\t\t\t\tvalue=''\r\n\t\t\t\t\t\t\t\t\tsize='small'\r\n\t\t\t\t\t\t\t\t\trenderValue={() => 'Add placeholder...'}\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tbgcolor: 'white',\r\n\t\t\t\t\t\t\t\t\t\tborderRadius: 1,\r\n\t\t\t\t\t\t\t\t\t\t'& .MuiSelect-select': { py: 0.75 }\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\tonChange={handleSelectChange}>\r\n\t\t\t\t\t\t\t\t\t{placeholderOptions}\r\n\t\t\t\t\t\t\t\t</Select>\r\n\t\t\t\t\t\t\t</FormControl>\r\n\t\t\t\t\t\t\t<Box>\r\n\t\t\t\t\t\t\t\t<IconButton size='small' onClick={handleSave}>\r\n\t\t\t\t\t\t\t\t\t<Save fontSize='small' color='inherit' />\r\n\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t\t<IconButton size='small' onClick={handleCancelEdit} color='error'>\r\n\t\t\t\t\t\t\t\t\t<Close fontSize='small' color='inherit' />\r\n\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t</>\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<Fade in={isHovered || isSelected} timeout={200}>\r\n\t\t\t\t\t\t\t<Box sx={{ display: 'flex', gap: 0.5 }}>\r\n\t\t\t\t\t\t\t\t{section?.is_edited_from_source && (\r\n\t\t\t\t\t\t\t\t\t<Chip\r\n\t\t\t\t\t\t\t\t\t\tlabel=\"Edited From Source\"\r\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\t\tsx={(theme) => ({ \r\n\t\t\t\t\t\t\t\t\t\t\ttextTransform: 'capitalize', \r\n\t\t\t\t\t\t\t\t\t\t\tbackgroundColor: theme.palette.theme?.tertiary1?.[200], \r\n\t\t\t\t\t\t\t\t\t\t\tcolor: theme.palette.theme?.tertiary1?.[900]\r\n\t\t\t\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t{editableSections.includes(section.type) &&\r\n\t\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\t\tsize='small'\r\n\t\t\t\t\t\t\t\t\t\tonClick={handleEditing}\r\n\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\tbgcolor: 'grey.100',\r\n\t\t\t\t\t\t\t\t\t\t\t'&:hover': { bgcolor: 'grey.200' }\r\n\t\t\t\t\t\t\t\t\t\t}}>\r\n\t\t\t\t\t\t\t\t\t\t<Edit fontSize='small' sx={{ color: 'theme.secondary.1000' }} />\r\n\t\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\tsize='small'\r\n\t\t\t\t\t\t\t\t\tonClick={handleSplit}\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tbgcolor: 'grey.100',\r\n\t\t\t\t\t\t\t\t\t\t'&:hover': { bgcolor: 'grey.200' },\r\n\t\t\t\t\t\t\t\t\t\topacity: section?.splitWidth === 25 ? 0.5 : 1\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\tdisabled={section?.splitWidth === 25}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<SplitIcon fontSize='small' color='primary' />\r\n\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\tsize='small'\r\n\t\t\t\t\t\t\t\t\tonClick={handleDeleteClick}\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tbgcolor: 'grey.100',\r\n\t\t\t\t\t\t\t\t\t\t'&:hover': { bgcolor: 'grey.200' }\r\n\t\t\t\t\t\t\t\t\t}}>\r\n\t\t\t\t\t\t\t\t\t<Trash fontSize='small' sx={{ color: 'theme.error.500' }} />\r\n\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t</Fade>\r\n\t\t\t\t\t)}\r\n\t\t\t\t</Box>\r\n\t\t\t</Box>\r\n\t\t\t<Box sx={{ p: 3, bgcolor: 'white' }}>\r\n\t\t\t\t<style>\r\n {`\r\n\t\t\t\t\t\ta {\r\n\t\t\t\t\t\t\tcolor: #007bff !important;\r\n\t\t\t\t\t\t\ttext-decoration: none !important;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\ta:hover {\r\n\t\t\t\t\t\t\ttext-decoration: underline;\r\n\t\t\t\t\t\t}\r\n `}\r\n </style>\r\n\t\t\t\t{contentRenderer}\r\n\t\t\t</Box>\r\n\t\t\t{isOpenEditSectionModal && <EditSectionModal\r\n\t\t\t\tisOpen={isOpenEditSectionModal}\r\n\t\t\t\tsetIsOpen={setIsOpenEditSectionModal}\r\n\t\t\t\tmodalProps={{ open: isOpenEditSectionModal }}\r\n\t\t\t\tplaceholders={placeholders}\r\n\t\t\t\thandleSave={handleSave}\r\n\t\t\t\thandleAddPlaceholder={handleAddPlaceholder}\r\n\t\t\t\thandleEditorReady={handleEditorReady}\r\n\t\t\t\tsection={section}\r\n\t\t\t/>}\r\n\t\t</Paper>\r\n\t);\r\n};\r\n\r\n// Custom comparison function to prevent unnecessary re-renders\r\n// Return true if props are equal (skip re-render), false if different (re-render)\r\nconst arePropsEqual = (prevProps: EditorSectionProps, nextProps: EditorSectionProps): boolean => {\r\n\t// Check if section data has changed\r\n\tif (prevProps.section.id !== nextProps.section.id) return false;\r\n\tif (prevProps.section.content !== nextProps.section.content) return false;\r\n\tif (prevProps.section.type !== nextProps.section.type) return false;\r\n\tif (prevProps.section.is_edited_from_source !== nextProps.section.is_edited_from_source) return false;\r\n\tif (prevProps.section.isSplitPair !== nextProps.section.isSplitPair) return false;\r\n\tif (prevProps.section.splitWidth !== nextProps.section.splitWidth) return false;\r\n\t\r\n\t// Check if interaction states have changed\r\n\tif (prevProps.isSelected !== nextProps.isSelected) return false;\r\n\tif (prevProps.isDragging !== nextProps.isDragging) return false;\r\n\tif (prevProps.isOver !== nextProps.isOver) return false;\r\n\t\r\n\t// Check if placeholders array reference has changed\r\n\tif (prevProps.placeholders !== nextProps.placeholders) return false;\r\n\t\r\n\t// Deep comparison for section attributes (styles, etc.)\r\n\tconst prevAttrs = JSON.stringify(prevProps.section.attributes);\r\n\tconst nextAttrs = JSON.stringify(nextProps.section.attributes);\r\n\tif (prevAttrs !== nextAttrs) return false;\r\n\t\r\n\t// All props are equal, skip re-render\r\n\treturn true;\r\n};\r\n\r\n// Wrap component with React.memo and custom comparison function\r\nconst MemoizedEditorSection = React.memo(EditorSection, arePropsEqual);\r\nMemoizedEditorSection.displayName = 'EditorSection';\r\n\r\nexport default MemoizedEditorSection;","/* eslint-disable unused-imports/no-unused-vars */\r\nimport { Box, ToggleButton, ToggleButtonGroup, Tooltip, styled, toggleButtonGroupClasses } from \"@mui/material\";\r\nimport FormatAlignLeftIcon from '@mui/icons-material/FormatAlignLeft';\r\nimport FormatAlignCenterIcon from '@mui/icons-material/FormatAlignCenter';\r\nimport FormatAlignRightIcon from '@mui/icons-material/FormatAlignRight';\r\nimport FormatAlignJustifyIcon from '@mui/icons-material/FormatAlignJustify';\r\nimport Typography from \"../../../../components/typography/typography\";\r\n\r\nconst StyledToggleButtonGroup = styled(ToggleButtonGroup)(({ theme, item }) => ({\r\n display: 'grid',\r\n borderRadius: 4,\r\n border: `1px solid #e3e3e3`,\r\n width: `100%`,\r\n gridTemplateColumns: `repeat(${item || 4}, 1fr)`,\r\n [`& .${toggleButtonGroupClasses.grouped}`]: {\r\n margin: theme.spacing(0.5),\r\n border: 0,\r\n borderRadius: theme.shape.borderRadius,\r\n [`&.${toggleButtonGroupClasses.disabled}`]: {\r\n border: 0,\r\n },\r\n },\r\n [`& .${toggleButtonGroupClasses.middleButton},& .${toggleButtonGroupClasses.lastButton}`]:\r\n {\r\n marginLeft: -1,\r\n borderLeft: '1px solid transparent',\r\n },\r\n [`& .${toggleButtonGroupClasses.selected}`] : {\r\n backgroundColor: `${theme.palette.theme.primary[800]}!important`,\r\n color: `#fff !important`\r\n }\r\n}))\r\n\r\ninterface AlignmentControlProps {\r\n alignment: string;\r\n onAlignmentChange: (event: React.MouseEvent<HTMLElement>, newAlignment: string | null) => void;\r\n displayLabel?: boolean;\r\n}\r\n\r\nconst AlignmentControl: React.FC<AlignmentControlProps> = ({\r\n alignment,\r\n onAlignmentChange,\r\n displayLabel = false,\r\n // disableJustify = false\r\n}) => {\r\n return (\r\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1, mb: 2 }}>\r\n {displayLabel &&\r\n <Typography type=\"s5\" weight=\"medium\" color={\"theme.secondary.800\"}>Alignment</Typography>\r\n }\r\n <StyledToggleButtonGroup\r\n value={alignment}\r\n exclusive\r\n onChange={onAlignmentChange}\r\n aria-label=\"text alignment\"\r\n size=\"small\"\r\n >\r\n <Tooltip title=\"Align Left\">\r\n <ToggleButton value=\"left\" aria-label=\"left aligned\">\r\n <FormatAlignLeftIcon fontSize=\"small\" />\r\n </ToggleButton>\r\n </Tooltip>\r\n <Tooltip title=\"Align Center\">\r\n <ToggleButton value=\"center\" aria-label=\"centered\">\r\n <FormatAlignCenterIcon fontSize=\"small\" />\r\n </ToggleButton>\r\n </Tooltip>\r\n <Tooltip title=\"Align Right\">\r\n <ToggleButton value=\"right\" aria-label=\"right aligned\">\r\n <FormatAlignRightIcon fontSize=\"small\" />\r\n </ToggleButton>\r\n </Tooltip>\r\n {/* {!disableJustify && */}\r\n <Tooltip title=\"Justify\">\r\n <ToggleButton value=\"justify\" aria-label=\"justified\">\r\n <FormatAlignJustifyIcon fontSize=\"small\" />\r\n </ToggleButton>\r\n </Tooltip>\r\n {/* } */}\r\n </StyledToggleButtonGroup>\r\n </Box>\r\n );\r\n}\r\n \r\nexport default AlignmentControl;","/* eslint-disable react-hooks/exhaustive-deps */\r\nimport React, { useCallback, useMemo } from 'react';\r\nimport {\r\n Box,\r\n TextField,\r\n ToggleButtonGroup,\r\n ToggleButton,\r\n InputAdornment,\r\n Tooltip,\r\n FormControl,\r\n MenuItem,\r\n styled,\r\n toggleButtonGroupClasses\r\n} from '@mui/material';\r\nimport FormatBoldIcon from '@mui/icons-material/FormatBold';\r\nimport FormatItalicIcon from '@mui/icons-material/FormatItalic';\r\nimport FormatUnderlinedIcon from '@mui/icons-material/FormatUnderlined';\r\nimport ColorLensIcon from '@mui/icons-material/ColorLens';\r\nimport { debounce } from 'lodash';\r\nimport Select from '../../../../components/select/select';\r\nimport AlignmentControl from './AlignmentControl';\r\n\r\n// Styled component with better typing\r\nconst StyledToggleButtonGroup = styled(ToggleButtonGroup)<{ item?: number }>(\r\n ({ theme, item = 4 }) => ({\r\n display: 'grid',\r\n borderRadius: 4,\r\n border: `1px solid #e3e3e3`,\r\n width: '100%',\r\n gridTemplateColumns: `repeat(${item}, 1fr)`,\r\n [`& .${toggleButtonGroupClasses.grouped}`]: {\r\n margin: theme.spacing(0.5),\r\n border: 0,\r\n borderRadius: theme.shape.borderRadius,\r\n [`&.${toggleButtonGroupClasses.disabled}`]: {\r\n border: 0,\r\n },\r\n },\r\n [`& .${toggleButtonGroupClasses.middleButton}, & .${toggleButtonGroupClasses.lastButton}`]:\r\n {\r\n marginLeft: -1,\r\n borderLeft: '1px solid transparent',\r\n },\r\n [`& .${toggleButtonGroupClasses.selected}`]: {\r\n backgroundColor: `${theme.palette.theme.primary[800]} !important`,\r\n color: '#fff !important',\r\n },\r\n })\r\n);\r\n\r\n// Type definitions\r\ninterface TextStyles {\r\n fontFamily?: string;\r\n fontSize?: number;\r\n lineHeight?: string | number;\r\n textAlign?: string;\r\n fontWeight?: string;\r\n fontStyle?: string;\r\n textDecoration?: string;\r\n color?: string;\r\n}\r\n\r\ninterface TextControlsProps {\r\n attrs: {\r\n styles?: TextStyles;\r\n [key: string]: any;\r\n };\r\n updateAttrs: (attr: Record<string, any>) => void;\r\n}\r\n\r\ntype FormatType = 'bold' | 'italic' | 'underline';\r\n\r\n// Constants\r\nconst FONT_SIZES = [10, 12, 14, 16, 20, 24, 28, 32] as const;\r\nconst LINE_HEIGHTS = [1, 1.2, 1.5, 2] as const;\r\nconst FONT_FAMILIES = [\r\n 'Arial',\r\n 'Times New Roman', \r\n 'Roboto',\r\n 'Helvetica',\r\n 'Georgia',\r\n 'Courier New'\r\n] as const;\r\n\r\nconst DEBOUNCE_DELAY = 300;\r\n\r\nconst TextControls: React.FC<TextControlsProps> = ({ attrs, updateAttrs }) => {\r\n const styles = useMemo(() => attrs.styles || {}, [JSON.stringify(attrs.styles)]);\r\n \r\n // Derive format options from current styles instead of separate state\r\n const formatOptions = useMemo(() => {\r\n const options: FormatType[] = [];\r\n if (styles.fontWeight === 'bold') options.push('bold');\r\n if (styles.fontStyle === 'italic') options.push('italic');\r\n if (styles.textDecoration === 'underline') options.push('underline');\r\n return options;\r\n }, [styles.fontWeight, styles.fontStyle, styles.textDecoration]);\r\n\r\n // Stable update function using useCallback\r\n const updateStyles = useCallback(\r\n (newStyles: Partial<TextStyles>) => {\r\n updateAttrs({ \r\n styles: { \r\n ...styles, \r\n ...newStyles \r\n } \r\n });\r\n },\r\n [styles, updateAttrs]\r\n );\r\n\r\n // Fixed debounced color update function\r\n const debouncedColorUpdate = useCallback(\r\n debounce((color: string) => {\r\n updateStyles({color});\r\n }, DEBOUNCE_DELAY),\r\n [updateStyles]\r\n );\r\n\r\n // Format toggle handler\r\n const toggleFormat = useCallback(\r\n (format: FormatType) => {\r\n const isCurrentlyApplied = formatOptions.includes(format);\r\n \r\n const formatStyleMap: Record<FormatType, Partial<TextStyles>> = {\r\n bold: { fontWeight: isCurrentlyApplied ? 'normal' : 'bold' },\r\n italic: { fontStyle: isCurrentlyApplied ? 'normal' : 'italic' },\r\n underline: { textDecoration: isCurrentlyApplied ? 'none' : 'underline' }\r\n };\r\n\r\n updateStyles(formatStyleMap[format]);\r\n },\r\n [formatOptions, updateStyles]\r\n );\r\n\r\n // Alignment change handler\r\n const handleAlignmentChange = useCallback(\r\n (event: React.MouseEvent<HTMLElement>, newAlignment: string | null) => {\r\n if (newAlignment !== null) {\r\n updateStyles({ textAlign: newAlignment });\r\n }\r\n },\r\n [updateStyles]\r\n );\r\n\r\n // Color change handler\r\n const handleColorChange = useCallback(\r\n (event: React.ChangeEvent<HTMLInputElement>) => {\r\n debouncedColorUpdate(event.target.value);\r\n },\r\n [debouncedColorUpdate]\r\n );\r\n\r\n // Generic style change handlers\r\n const handleFontFamilyChange = useCallback(\r\n (event: any) => updateStyles({ fontFamily: event.target.value }),\r\n [updateStyles]\r\n );\r\n\r\n const handleFontSizeChange = useCallback(\r\n (event: any) => updateStyles({ fontSize: Number(event.target.value) }),\r\n [updateStyles]\r\n );\r\n\r\n const handleLineHeightChange = useCallback(\r\n (event: any) => updateStyles({ lineHeight: String(event.target.value) }),\r\n [updateStyles]\r\n );\r\n\r\n return (\r\n <>\r\n {/* Font Family Selection */}\r\n <Box sx={{ mb: 2 }}>\r\n <FormControl size=\"small\" fullWidth>\r\n <Select\r\n value={styles.fontFamily || ''}\r\n onChange={handleFontFamilyChange}\r\n displayEmpty\r\n label=\"Select Font\"\r\n >\r\n {FONT_FAMILIES.map((family) => (\r\n <MenuItem key={family} value={family}>\r\n {family}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Box>\r\n\r\n {/* Font Size and Line Height */}\r\n <Box sx={{ mb: 2, display: 'flex', gap: 1 }}>\r\n <FormControl size=\"small\" fullWidth>\r\n <Select\r\n value={styles.fontSize || ''}\r\n onChange={handleFontSizeChange}\r\n renderValue={(v) => `${v}px`}\r\n label=\"Size\"\r\n displayEmpty\r\n >\r\n {FONT_SIZES.map((size) => (\r\n <MenuItem key={size} value={size}>\r\n {size}px\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n\r\n <FormControl size=\"small\" fullWidth>\r\n <Select\r\n value={styles.lineHeight || ''}\r\n onChange={handleLineHeightChange}\r\n renderValue={(v) => `${v}x`}\r\n label=\"Line Height\"\r\n displayEmpty\r\n >\r\n {LINE_HEIGHTS.map((height) => (\r\n <MenuItem key={height} value={height}>\r\n {height}x\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Box>\r\n\r\n {/* Text Alignment */}\r\n <AlignmentControl \r\n alignment={styles.textAlign} \r\n onAlignmentChange={handleAlignmentChange} \r\n />\r\n\r\n {/* Format Options */}\r\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1, mb: 2 }}>\r\n <StyledToggleButtonGroup item={3}>\r\n <Tooltip title=\"Bold\">\r\n <ToggleButton\r\n value=\"bold\"\r\n selected={formatOptions.includes('bold')}\r\n onClick={() => toggleFormat('bold')}\r\n aria-label=\"bold\"\r\n size=\"small\"\r\n sx={{ borderRadius: 1 }}\r\n >\r\n <FormatBoldIcon fontSize=\"small\" />\r\n </ToggleButton>\r\n </Tooltip>\r\n\r\n <Tooltip title=\"Italic\">\r\n <ToggleButton\r\n value=\"italic\"\r\n selected={formatOptions.includes('italic')}\r\n onClick={() => toggleFormat('italic')}\r\n aria-label=\"italic\"\r\n size=\"small\"\r\n sx={{ borderRadius: 1 }}\r\n >\r\n <FormatItalicIcon fontSize=\"small\" />\r\n </ToggleButton>\r\n </Tooltip>\r\n\r\n <Tooltip title=\"Underline\">\r\n <ToggleButton\r\n value=\"underline\"\r\n selected={formatOptions.includes('underline')}\r\n onClick={() => toggleFormat('underline')}\r\n aria-label=\"underline\"\r\n size=\"small\"\r\n sx={{ borderRadius: 1 }}\r\n >\r\n <FormatUnderlinedIcon fontSize=\"small\" />\r\n </ToggleButton>\r\n </Tooltip>\r\n </StyledToggleButtonGroup>\r\n </Box>\r\n\r\n {/* Color Picker */}\r\n <Box sx={{ mb: 2, width: '100%' }}>\r\n <TextField\r\n label=\"Text Color\"\r\n variant=\"outlined\"\r\n type=\"color\"\r\n value={styles.color || '#000000'}\r\n onChange={handleColorChange}\r\n size=\"small\"\r\n fullWidth\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <ColorLensIcon fontSize=\"small\" />\r\n </InputAdornment>\r\n ),\r\n }}\r\n />\r\n </Box>\r\n </>\r\n );\r\n};\r\n\r\nexport default React.memo(TextControls);","/* eslint-disable unused-imports/no-unused-vars */\r\nimport React from 'react';\r\nimport {\r\n Box,\r\n FormControl,\r\n MenuItem,\r\n Slider,\r\n} from '@mui/material';\r\nimport Typography from '../../../../components/typography/typography';\r\nimport TextField from '../../../../components/text-field/text-field';\r\nimport AlignmentControl from './AlignmentControl';\r\nimport Select from '../../../../components/select/select';\r\nimport ColorPickerInput from '../../../../components/color-picker-input/color-picker-input';\r\n\r\ninterface ButtonControlsProps {\r\n attrs: Record<string, any>;\r\n updateAttrs: (attr: Record<string, any>) => void;\r\n}\r\n\r\nconst borderOptions = [\r\n {label: 'None', value: 'none'},\r\n {value: '1px solid #e0e0e0', label: 'Solid'},\r\n {value: '1px dashed #e0e0e0', label: 'Dashed'},\r\n {value: '1px dotted #e0e0e0', label: 'Dotted'},\r\n]\r\n\r\nconst ButtonControls: React.FC<ButtonControlsProps> = ({\r\n attrs,\r\n updateAttrs\r\n}) => {\r\n\r\n const { text, styles } = attrs\r\n const handleAlignmentChange = (\r\n event: React.MouseEvent<HTMLElement>,\r\n newAlignment: string | null,\r\n ) => {\r\n if(newAlignment) {\r\n let margin = '0';\r\n switch (newAlignment) {\r\n \r\n case 'justify':\r\n margin = '0 auto';\r\n break;\r\n case 'right':\r\n margin = '0 0 0 auto';\r\n break;\r\n case 'center':\r\n margin = '0 auto';\r\n break;\r\n case 'left':\r\n margin = 'auto 0 0 0';\r\n break;\r\n default:\r\n margin = '0 auto';\r\n break;\r\n }\r\n updateAttrs({ styles : { margin } });\r\n }\r\n };\r\n\r\n const getAlignment = () => {\r\n if (styles?.margin === '0 auto') {\r\n return 'center';\r\n } else if (styles?.margin === '0 0 0 auto') {\r\n return 'right';\r\n } else if (styles?.margin === 'auto 0 0 0') {\r\n return 'left';\r\n } else {\r\n return 'justify';\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <TextField\r\n label=\"Button Text\"\r\n fullWidth\r\n value={text}\r\n onChange={(e) => updateAttrs({ text: e.target.value })}\r\n size=\"small\"\r\n sx={{ mb: 2 }}\r\n />\r\n <Box sx={{ mb: 2 }}>\r\n <ColorPickerInput\r\n value={styles?.backgroundColor || '#333333'}\r\n onChange={(color) => updateAttrs({ styles :{ backgroundColor: color }})}\r\n label='Background Color'\r\n />\r\n </Box>\r\n <Box sx={{ mb: 2 }}>\r\n <ColorPickerInput\r\n value={styles?.color || '#333333'}\r\n onChange={(color) => updateAttrs({ styles :{ color: color }})}\r\n label='Text Color'\r\n // sx={{ maxWidth: 150 }}\r\n />\r\n </Box>\r\n <FormControl fullWidth size=\"small\" sx={{ mb: 2 }}>\r\n <Select\r\n value={styles?.border}\r\n renderValue={(value) => borderOptions.find((option) => option.value === value)?.label || 'None'}\r\n onChange={(e) => updateAttrs({ styles :{ border :e.target.value }})}\r\n label='Border'\r\n >\r\n <MenuItem value=\"none\">None</MenuItem>\r\n <MenuItem value=\"1px solid #e0e0e0\">Solid</MenuItem>\r\n <MenuItem value=\"1px dashed #e0e0e0\">Dashed</MenuItem>\r\n </Select>\r\n </FormControl>\r\n <Box sx={{ mb: 2 }}>\r\n <Typography type=\"s3\" color='theme.neutral.800'>\r\n Border Radius\r\n </Typography>\r\n <Slider\r\n value={styles?.borderRadius}\r\n onChange={(_, value) => updateAttrs({ styles :{ borderRadius: value as number }})}\r\n min={0}\r\n max={20}\r\n step={1}\r\n valueLabelDisplay=\"auto\"\r\n size=\"small\"\r\n marks\r\n sx={(theme) => ({\r\n '& .MuiSlider-rail': {\r\n color: theme.palette.theme.primary[500],\r\n },\r\n '& .MuiSlider-thumb': {\r\n color: theme.palette.theme.primary[800],\r\n },\r\n '& .MuiSlider-track': {\r\n color: theme.palette.theme.primary[600],\r\n },\r\n })}\r\n />\r\n </Box>\r\n <Box sx={{ mb: 2 }}>\r\n <Typography type=\"s3\" color='theme.neutral.800'>\r\n Font Size\r\n </Typography>\r\n <Slider\r\n value={styles?.fontSize}\r\n onChange={(_, value) => updateAttrs({ styles :{ fontSize: value as number }})}\r\n min={10}\r\n max={20}\r\n step={1}\r\n valueLabelDisplay=\"auto\"\r\n size=\"small\"\r\n marks\r\n sx={(theme) => ({\r\n '& .MuiSlider-rail': {\r\n color: theme.palette.theme.primary[500],\r\n },\r\n '& .MuiSlider-thumb': {\r\n color: theme.palette.theme.primary[800],\r\n },\r\n '& .MuiSlider-track': {\r\n color: theme.palette.theme.primary[600],\r\n },\r\n })}\r\n />\r\n </Box>\r\n <AlignmentControl alignment={getAlignment()} onAlignmentChange={handleAlignmentChange}/>\r\n </>\r\n );\r\n};\r\n\r\nexport default ButtonControls;","/* eslint-disable react-hooks/exhaustive-deps */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport { FormControl, FormControlLabel, Grid, MenuItem, Slider, Switch, styled } from \"@mui/material\";\r\nimport ColorPickerInput from \"../../../../components/color-picker-input/color-picker-input\";\r\nimport Select from \"../../../../components/select/select\";\r\nimport Typography from \"../../../../components/typography/typography\";\r\nimport formatText from \"../../../../utils/format-text\";\r\nimport { useEffect } from \"react\";\r\n\r\nconst Android12Switch = styled(Switch)(({ theme }) => ({\r\n padding: 8,\r\n '& .MuiSwitch-track': {\r\n borderRadius: 22 / 2,\r\n '&::before, &::after': {\r\n content: '\"\"',\r\n position: 'absolute',\r\n top: '50%',\r\n transform: 'translateY(-50%)',\r\n width: 16,\r\n height: 16,\r\n },\r\n '&::before': {\r\n backgroundImage: `url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"16\" width=\"16\" viewBox=\"0 0 24 24\"><path fill=\"${encodeURIComponent(\r\n theme.palette.getContrastText(theme.palette.primary.main),\r\n )}\" d=\"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z\"/></svg>')`,\r\n left: 12,\r\n },\r\n '&::after': {\r\n backgroundImage: `url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"16\" width=\"16\" viewBox=\"0 0 24 24\"><path fill=\"${encodeURIComponent(\r\n theme.palette.getContrastText(theme.palette.primary.main),\r\n )}\" d=\"M19,13H5V11H19V13Z\" /></svg>')`,\r\n right: 12,\r\n },\r\n },\r\n '& .MuiSwitch-thumb': {\r\n boxShadow: 'none',\r\n width: 16,\r\n height: 16,\r\n margin: 2,\r\n // color: theme.palette.theme.primary[800]\r\n },\r\n '& .Mui-checked': {\r\n color: `${theme.palette.theme.primary[800]} !important`,\r\n },\r\n '& .Mui-checked+.MuiSwitch-track': {\r\n backgroundColor: `${theme.palette.theme.primary[800]} !important`,\r\n },\r\n}));\r\n\r\nexport interface BorderControlProps {\r\n styles: Record<string, any>,\r\n onChange: (key: string, value: any) => void\r\n isBordered: boolean;\r\n disableWidth?: boolean;\r\n disableStyle?: boolean;\r\n disableColor?: boolean;\r\n disableCollapse?: boolean;\r\n disableRadius?: boolean;\r\n initiateStyles?: (styles: Record<string, any>) => void;\r\n}\r\n\r\nconst borderStyles = [\r\n 'none',\r\n 'solid',\r\n 'dashed',\r\n 'dotted',\r\n 'double',\r\n 'groove',\r\n 'ridge',\r\n 'inset',\r\n 'outset'\r\n];\r\n\r\nconst BorderControl:React.FC<BorderControlProps> = ({\r\n styles,\r\n onChange,\r\n isBordered,\r\n disableWidth = false,\r\n disableStyle = false,\r\n disableColor = false,\r\n disableCollapse = false,\r\n disableRadius = false,\r\n initiateStyles\r\n}) => {\r\n\r\n useEffect(() => {\r\n if(initiateStyles instanceof Function) {\r\n if (!isBordered) {\r\n initiateStyles({\r\n 'border': 0,\r\n 'borderStyle':'none',\r\n 'borderColor':'#000000',\r\n 'borderCollapse':'separate',\r\n 'borderRadius':0,\r\n });\r\n } else{\r\n initiateStyles({\r\n 'border': 1,\r\n 'borderStyle':'solid',\r\n 'borderColor':'#000000',\r\n 'borderCollapse':'collapse',\r\n 'borderRadius':0,\r\n });\r\n }\r\n }\r\n }, [isBordered]);\r\n return (\r\n <Grid container spacing={2}>\r\n <Grid item xs={12}>\r\n <FormControlLabel\r\n control={\r\n <Android12Switch\r\n checked={isBordered}\r\n onChange={(e) => onChange('is_bordered', e.target.checked)}\r\n />\r\n }\r\n label={<Typography type='s5' weight='medium' color='theme.secondary.800'>Bordered Table</Typography>}\r\n labelPlacement=\"start\"\r\n sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', margin: 'auto'}}\r\n />\r\n </Grid>\r\n \r\n {isBordered && (\r\n <>\r\n {/* Width */}\r\n {!disableWidth && (\r\n <Grid item xs={6}>\r\n <Select\r\n value={styles.border || 1}\r\n onChange={(e) => onChange('border', e.target.value)}\r\n label=\"Border Width\"\r\n fullWidth\r\n size=\"small\"\r\n >\r\n {[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map((wd) => (\r\n <MenuItem key={wd} value={wd}>\r\n <Typography type='s5' color='theme.secondary.1000'>{wd}</Typography>\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </Grid>\r\n )}\r\n \r\n {/* Style */}\r\n {!disableStyle && ( \r\n <Grid item xs={6}>\r\n <FormControl fullWidth size=\"small\">\r\n <Select\r\n value={styles.borderStyle || 'solid'}\r\n onChange={(e) => onChange('borderStyle', e.target.value)}\r\n renderValue={(value) => formatText(value)}\r\n label=\"Border Style\"\r\n >\r\n {borderStyles.map((style) => (\r\n <MenuItem key={style} value={style}>\r\n <Typography type='s5' color='theme.secondary.1000'>{formatText(style)}</Typography>\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Grid>\r\n )}\r\n \r\n {/* Color */}\r\n {!disableColor && ( \r\n <Grid item xs={6}>\r\n <Typography type='s5' weight='medium' color='theme.secondary.800' mb={0.5}>Border Color</Typography>\r\n <ColorPickerInput\r\n value={styles.borderColor || '#e0e0e0'}\r\n onChange={(color) => onChange('borderColor', color)}\r\n fullWidth\r\n />\r\n </Grid>\r\n )}\r\n\r\n {/* Collapse */}\r\n {!disableCollapse && ( \r\n <Grid item xs={6}>\r\n <FormControl fullWidth size=\"small\">\r\n <Select\r\n value={styles.borderCollapse || 'collapse'}\r\n onChange={(e) => onChange('borderCollapse', e.target.value)}\r\n label=\"Border Collapse\"\r\n renderValue={(value) => formatText(value)}\r\n >\r\n <MenuItem value=\"collapse\"><Typography type='s5' color='theme.secondary.1000'>Collapse</Typography></MenuItem>\r\n <MenuItem value=\"separate\"><Typography type='s5' color='theme.secondary.1000'>Separate</Typography></MenuItem>\r\n </Select>\r\n </FormControl>\r\n </Grid>\r\n )}\r\n\r\n {/* Radius */}\r\n {!disableRadius && (\r\n <Grid item xs={12}>\r\n <Typography type='s5' weight='medium' color='theme.secondary.800' variant=\"caption\">Border Radius</Typography>\r\n <Slider\r\n value={typeof styles.borderRadius === 'number' ? styles.borderRadius : 1}\r\n min={0}\r\n max={20}\r\n step={1}\r\n marks\r\n onChange={(_, value) => onChange('borderRadius', value)}\r\n valueLabelDisplay=\"auto\"\r\n sx={(theme) => ({\r\n '& .MuiSlider-rail': {\r\n color: theme.palette.theme.primary[500],\r\n },\r\n '& .MuiSlider-thumb': {\r\n color: theme.palette.theme.primary[800],\r\n },\r\n '& .MuiSlider-track': {\r\n color: theme.palette.theme.primary[600],\r\n },\r\n })}\r\n />\r\n </Grid>\r\n )}\r\n </>\r\n )}\r\n \r\n </Grid>\r\n );\r\n}\r\n \r\nexport default BorderControl;","/* eslint-disable unused-imports/no-unused-vars */\r\nimport React from 'react';\r\nimport {\r\n Box,\r\n FormControl,\r\n // Select,\r\n MenuItem,\r\n styled,\r\n Switch,\r\n Grid,\r\n FormControlLabel\r\n} from '@mui/material';\r\nimport TextField from '../../../../components/text-field/text-field';\r\nimport Select from '../../../../components/select/select';\r\nimport Typography from '../../../../components/typography/typography';\r\nimport AlignmentControl from './AlignmentControl';\r\nimport BorderControl from './border-control';\r\n\r\nconst Android12Switch = styled(Switch)(({ theme }) => ({\r\n padding: 8,\r\n '& .MuiSwitch-track': {\r\n borderRadius: 22 / 2,\r\n '&::before, &::after': {\r\n content: '\"\"',\r\n position: 'absolute',\r\n top: '50%',\r\n transform: 'translateY(-50%)',\r\n width: 16,\r\n height: 16,\r\n },\r\n '&::before': {\r\n backgroundImage: `url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"16\" width=\"16\" viewBox=\"0 0 24 24\"><path fill=\"${encodeURIComponent(\r\n theme.palette.getContrastText(theme.palette.primary.main),\r\n )}\" d=\"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z\"/></svg>')`,\r\n left: 12,\r\n },\r\n '&::after': {\r\n backgroundImage: `url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"16\" width=\"16\" viewBox=\"0 0 24 24\"><path fill=\"${encodeURIComponent(\r\n theme.palette.getContrastText(theme.palette.primary.main),\r\n )}\" d=\"M19,13H5V11H19V13Z\" /></svg>')`,\r\n right: 12,\r\n },\r\n },\r\n '& .MuiSwitch-thumb': {\r\n boxShadow: 'none',\r\n width: 16,\r\n height: 16,\r\n margin: 2,\r\n // color: theme.palette.theme.primary[800]\r\n },\r\n '& .Mui-checked': {\r\n color: theme.palette.theme.primary[800]\r\n },\r\n '& .Mui-checked+.MuiSwitch-track': {\r\n backgroundColor: `${theme.palette.theme.primary[700]}`,\r\n },\r\n}));\r\n\r\ninterface ImageControlsProps {\r\n attrs: Record<string, any>;\r\n updateAttrs: (attr: Record<string, any>) => void;\r\n}\r\n\r\nconst ImageControls: React.FC<ImageControlsProps> = ({\r\n attrs,\r\n updateAttrs\r\n}) => {\r\n const { src, alt, styles } = attrs || {}\r\n\r\n const handleAlignmentChange = (\r\n event: React.MouseEvent<HTMLElement>,\r\n newAlignment: string | null,\r\n ) => {\r\n if(newAlignment) {\r\n let margin = '0';\r\n switch (newAlignment) {\r\n case 'justify':\r\n margin = '0 auto';\r\n break;\r\n case 'right':\r\n margin = '0 0 0 auto';\r\n break;\r\n case 'center':\r\n margin = '0 auto';\r\n break;\r\n case 'left':\r\n margin = 'auto 0 0 0';\r\n break;\r\n default:\r\n margin = '0 auto';\r\n break;\r\n }\r\n updateAttrs({ styles : { margin, alignment: newAlignment } });\r\n\r\n }\r\n };\r\n\r\n const getAlignment = () => {\r\n if (styles?.margin === '0 auto' || styles?.alignment === 'center') {\r\n return 'center';\r\n } else if (styles?.margin === '0 0 0 auto' || styles?.alignment === 'right') {\r\n return 'right';\r\n } else if (styles?.margin === 'auto 0 0 0' || styles?.alignment === 'left') {\r\n return 'left';\r\n } else {\r\n return 'justify';\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n {/* Image URL */}\r\n <TextField\r\n label=\"Image URL\"\r\n fullWidth\r\n value={src}\r\n onChange={(e) => updateAttrs({ src: e.target.value })}\r\n size=\"small\"\r\n sx={{ mb: 2 }}\r\n />\r\n\r\n {/* Alt Text */}\r\n <TextField\r\n label=\"Alt Text\"\r\n fullWidth\r\n value={alt}\r\n onChange={(e) => updateAttrs({ alt: e.target.value })}\r\n size=\"small\"\r\n sx={{ mb: 2 }}\r\n />\r\n <FormControlLabel\r\n control={<Android12Switch defaultChecked checked={Boolean(styles?.fullWidth)}/>}\r\n label={<Typography type=\"s5\" color=\"theme.secondary.800\" weight='medium'>Full Width</Typography>}\r\n labelPlacement=\"start\"\r\n value={Boolean(styles?.fullWidth)}\r\n onClick={(e) => {\r\n const checked = e.target.checked\r\n updateAttrs({ styles: { fullWidth: checked, width: checked ? 100 : 150, height: checked ? 'auto' : 150 }})\r\n }}\r\n sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', margin: 'auto', mb:2 }}\r\n />\r\n\r\n {/* Width Input */}\r\n <Grid container spacing={2}>\r\n <Grid item xs={6}>\r\n <TextField\r\n label=\"Width (px)\"\r\n type=\"number\"\r\n fullWidth\r\n value={styles?.fullWidth ? '' : styles?.width}\r\n onChange={(e) =>\r\n updateAttrs({ styles: { width: Number(e.target.value) }})\r\n }\r\n size=\"small\"\r\n sx={{ mb: 2 }}\r\n inputProps={{ min: 1 }}\r\n disabled={styles?.fullWidth}\r\n />\r\n </Grid>\r\n <Grid item xs={6}>\r\n {/* Height Input */}\r\n <TextField\r\n label=\"Height (px)\"\r\n type=\"number\"\r\n fullWidth\r\n value={styles?.fullWidth ? '' : styles?.height}\r\n onChange={(e) =>\r\n updateAttrs({ styles: { height: Number(e.target.value) }})\r\n }\r\n size=\"small\"\r\n sx={{ mb: 2 }}\r\n inputProps={{ min: 1 }}\r\n disabled={styles?.fullWidth}\r\n />\r\n\r\n </Grid>\r\n\r\n </Grid>\r\n\r\n\r\n {/* Object Fit Dropdown */}\r\n <Box sx={{ mb: 2 }}>\r\n <FormControl size=\"small\" fullWidth>\r\n <Select\r\n label='Object Fit'\r\n value={styles?.objectFit}\r\n onChange={(e) =>\r\n updateAttrs({ styles: { objectFit: e.target.value }})\r\n }\r\n displayEmpty\r\n >\r\n <MenuItem value=\"contain\">Contain</MenuItem>\r\n <MenuItem value=\"cover\">Cover</MenuItem>\r\n <MenuItem value=\"fill\">Fill</MenuItem>\r\n <MenuItem value=\"none\">None</MenuItem>\r\n <MenuItem value=\"scale-down\">Scale Down</MenuItem>\r\n </Select>\r\n </FormControl>\r\n </Box>\r\n\r\n {/* Alignment Toggle Buttons */}\r\n <AlignmentControl\r\n alignment={getAlignment()}\r\n onAlignmentChange={handleAlignmentChange}\r\n displayLabel\r\n />\r\n\r\n <BorderControl\r\n styles={styles}\r\n onChange={(key, value) => updateAttrs({ styles: { [key]: value } })}\r\n isBordered={styles?.is_bordered}\r\n disableCollapse\r\n initiateStyles={(styles) => updateAttrs({ styles })}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nexport default ImageControls;","/* eslint-disable unused-imports/no-unused-vars */\r\nimport React from 'react';\r\nimport {\r\n Box,\r\n FormControl,\r\n MenuItem,\r\n Slider,\r\n InputAdornment,\r\n} from '@mui/material';\r\nimport ColorLensIcon from '@mui/icons-material/ColorLens';\r\nimport Typography from '../../../../components/typography/typography';\r\nimport TextField from '../../../../components/text-field/text-field';\r\nimport Select from '../../../../components/select/select';\r\nimport formatText from '../../../../utils/format-text';\r\n\r\ninterface DividerControlsProps {\r\n attrs: Record<string, any>;\r\n updateAttrs: (attr: Record<string, any>) => void;\r\n}\r\n\r\nconst DividerControls: React.FC<DividerControlsProps> = ({\r\n attrs,\r\n updateAttrs,\r\n}) => {\r\n const { styles } = attrs\r\n return (\r\n <>\r\n <FormControl fullWidth size=\"small\" sx={{ mb: 2 }}>\r\n <Select\r\n label='Style'\r\n value={styles?.borderStyle}\r\n onChange={(e) => updateAttrs({ styles: { borderStyle: e.target.value } })}\r\n renderValue={(value) => formatText(value)}\r\n >\r\n <MenuItem value=\"solid\">Solid</MenuItem>\r\n <MenuItem value=\"dashed\">Dashed</MenuItem>\r\n <MenuItem value=\"dotted\">Dotted</MenuItem>\r\n </Select>\r\n </FormControl>\r\n <Box sx={{ mb: 1 }}>\r\n <Typography type=\"s5\" color='theme.secondary.800' weight='medium'>\r\n Thickness (px)\r\n </Typography>\r\n <Slider\r\n value={styles?.borderWidth}\r\n onChange={(_, value) => updateAttrs({ styles: { borderWidth: value as number }})}\r\n min={1}\r\n max={10}\r\n step={1}\r\n valueLabelDisplay=\"auto\"\r\n size=\"small\"\r\n sx={(theme) => ({\r\n '& .MuiSlider-rail': {\r\n color: theme.palette.theme.primary[500],\r\n },\r\n '& .MuiSlider-thumb': {\r\n color: theme.palette.theme.primary[800],\r\n },\r\n '& .MuiSlider-track': {\r\n color: theme.palette.theme.primary[600],\r\n },\r\n })}\r\n />\r\n </Box>\r\n <Box sx={{ mb: 2 }}>\r\n <TextField\r\n label=\"Divider Color\"\r\n type=\"color\"\r\n value={styles?.borderColor}\r\n onChange={(e) => updateAttrs({ styles: { borderColor: e.target.value }})}\r\n size=\"small\"\r\n fullWidth\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <ColorLensIcon fontSize=\"small\" />\r\n </InputAdornment>\r\n ),\r\n }}\r\n />\r\n </Box>\r\n </>\r\n );\r\n};\r\n\r\nexport default DividerControls;","/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable react-hooks/exhaustive-deps */\r\n/* eslint-disable no-mixed-spaces-and-tabs */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React, { useEffect, useMemo, useState } from 'react';\r\nimport {\r\n Box,\r\n MenuItem,\r\n Accordion as MuiAccordion,\r\n AccordionSummary,\r\n AccordionDetails,\r\n Grid,\r\n FormControlLabel,\r\n Tabs,\r\n Tab,\r\n AccordionProps,\r\n styled,\r\n Divider,\r\n IconButton,\r\n Chip,\r\n Alert,\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n DialogActions,\r\n Table,\r\n TableHead,\r\n TableBody,\r\n TableRow,\r\n TableCell,\r\n} from '@mui/material';\r\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\r\nimport AddIcon from '@mui/icons-material/Add';\r\nimport RefreshIcon from '@mui/icons-material/Refresh';\r\nimport MergeIcon from '@mui/icons-material/MergeType';\r\nimport SplitIcon from '@mui/icons-material/CallSplit';\r\nimport ColorPickerInput from '../../../../components/color-picker-input/color-picker-input';\r\nimport TextField from '../../../../components/text-field/text-field';\r\nimport Select from '../../../../components/select/select';\r\nimport formatText from '../../../../utils/format-text';\r\nimport Typography from '../../../../components/typography/typography';\r\nimport Android12Switch from '../../../../components/switches/android-12-switch';\r\nimport BorderControl from './border-control';\r\nimport Button from '../../../../components/button/button';\r\nimport Checkbox from '../../../../components/checkbox/checkbox';\r\nimport { Trash } from '../../../../components/icons';\r\nimport SearchableSelect from '../../../../components/searchable-select';\r\n\r\n// Type definitions\r\ninterface TableColumn {\r\n id: string;\r\n header: string;\r\n}\r\n\r\ninterface TableRow {\r\n [key: string]: string;\r\n}\r\n\r\ninterface CellMerge {\r\n section: 'thead' | 'tbody';\r\n rowStart: number;\r\n rowEnd: number;\r\n colStart: number;\r\n colEnd: number;\r\n value: string;\r\n}\r\n\r\ninterface TableData {\r\n columns: TableColumn[];\r\n rows: TableRow[];\r\n mergedCells?: CellMerge[];\r\n}\r\n\r\nconst Accordion = styled(\r\n (props: AccordionProps) => (\r\n <MuiAccordion disableGutters elevation={0} square {...props} />\r\n )\r\n)(({ theme }) => ({\r\n border: `1px solid ${theme.palette.divider}`,\r\n borderRadius: 0,\r\n '&:not(:last-child)': {\r\n borderBottom: 0,\r\n },\r\n '&::before': {\r\n display: 'none',\r\n },\r\n}));\r\n\r\ninterface TableControlsProps {\r\n tableData: TableData;\r\n setTableData: (value: TableData) => void;\r\n attrs: any;\r\n updateAttrs: (value: any) => void;\r\n placeholders: Record<string, any>[];\r\n handleSave?: () => void;\r\n setParentRowLevel?: (value: boolean) => void;\r\n levelType?: boolean;\r\n relation_table?: any;\r\n}\r\n\r\nconst textAlignOptions = ['left', 'center', 'right', 'justify'];\r\nconst fontWeightOptions = ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'];\r\nconst fontFamilyOptions = [\r\n 'Arial, sans-serif',\r\n 'Helvetica, sans-serif',\r\n 'Times New Roman, serif',\r\n 'Georgia, serif',\r\n 'Courier New, monospace',\r\n 'Verdana, sans-serif',\r\n 'Tahoma, sans-serif',\r\n 'Trebuchet MS, sans-serif'\r\n];\r\n\r\nconst TableControls: React.FC<TableControlsProps> = ({\r\n tableData,\r\n setTableData,\r\n attrs,\r\n updateAttrs,\r\n placeholders,\r\n handleSave,\r\n setParentRowLevel,\r\n levelType,\r\n relation_table\r\n}) => {\r\n\r\n const [tabValue, setTabValue] = useState(0);\r\n const [expanded, setExpanded] = useState('tableBasic');\r\n const [autoPopulateEnabled, setAutoPopulateEnabled] = useState(true);\r\n const [mergeDialogOpen, setMergeDialogOpen] = useState(false);\r\n const [selectedCells, setSelectedCells] = useState<{section: 'thead' | 'tbody', row: number, col: number}[]>([]);\r\n const [mergeValue, setMergeValue] = useState('');\r\n const [rowLevel, setRowLevel] = useState(false);\r\n const { placeholders: tPlaceholders } = attrs;\r\n const [selectedTable, setSelectedTable] = useState<string | null>(null);\r\n // Fix: Change customText to an object type\r\n const [customText, setCustomText] = useState<{ [rowIndex: number]: { [columnId: string]: string } }>({});\r\n // New state to track row-level placeholder assignments\r\n const [rowPlaceholders, setRowPlaceholders] = useState<{ [rowIndex: number]: { [columnId: string]: string } }>({});\r\n // Initialize merged cells from attrs\r\n const mergedCells = tableData.mergedCells || [];\r\nconst [isUpdating, setIsUpdating] = useState(false);\r\n\r\nconst getAttributes = (tableId: string) => {\r\n\r\n if (!relation_table || !Array.isArray(relation_table)) {\r\n return [];\r\n }\r\n \r\n const table = relation_table.find((table: any) => {\r\n return table?.dataKey == tableId\r\n })\r\n if (!table || !table.fields || !Array.isArray(table.fields)) {\r\n return [];\r\n }\r\n\r\n return table.fields\r\n // .map(field => {\r\n // const fieldName = field.key;\r\n // return {\r\n // label: fieldName?.replace(/_id$/, '') || '', \r\n // value: field?.select,\r\n // };\r\n // });\r\n};\r\n\r\nconst tableAttributes = useMemo(() => \r\n selectedTable ? getAttributes(selectedTable) : placeholders,\r\n [placeholders, selectedTable, relation_table] \r\n)\r\n // Initialize styles from attrs or use default styles\r\n const [tableStyles, setTableStyles] = useState(attrs?.styles || {\r\n is_bordered: true,\r\n border: 1,\r\n borderStyle: 'solid',\r\n borderColor: '#e0e0e0',\r\n borderCollapse: 'collapse',\r\n width: '100%',\r\n thCells: {\r\n padding: 8\r\n },\r\n tbCells: {\r\n padding: 8\r\n },\r\n tHead: {\r\n backgroundColor: '#f5f5f5',\r\n color: '#333333',\r\n fontSize: 14,\r\n fontWeight: 'bold',\r\n fontFamily: 'Arial, sans-serif',\r\n textAlign: 'left',\r\n margin: '0.5em 0',\r\n },\r\n tBody: {\r\n backgroundColor: '#ffffff',\r\n color: '#333333',\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n fontFamily: 'Arial, sans-serif',\r\n textAlign: 'left',\r\n }\r\n });\r\n\r\n // Apply styles to attrs when tableStyles change\r\n useEffect(() => {\r\n updateAttrs({ styles: tableStyles });\r\n }, [JSON.stringify(tableStyles)]);\r\n\r\n // Auto-populate rows when placeholders change\r\n useEffect(() => {\r\n if (autoPopulateEnabled && (tPlaceholders || rowLevel)) {\r\n populateRowsWithPlaceholders();\r\n }\r\n }, [tPlaceholders, autoPopulateEnabled, rowLevel, rowPlaceholders]);\r\n\r\n // Generate unique column ID\r\n const generateColumnId = () => {\r\n const existingIds = tableData.columns.map(col => col.id);\r\n let counter = 1;\r\n while (existingIds.includes(`col${counter}`)) {\r\n counter++;\r\n }\r\n return `col${counter}`;\r\n };\r\n\r\n // Get placeholder value by key\r\n const getPlaceholderValue = (placeholderKey: string): string => {\r\n const placeholder = tableAttributes.find(p => p.value === placeholderKey);\r\n if (!placeholder) return '';\r\n \r\n // Return the placeholder syntax for row-level mode\r\n if (rowLevel) {\r\n return `{{${placeholder.value}}}`;\r\n }\r\n \r\n // Return the actual value or a sample value if it's dynamic\r\n if (typeof placeholder.actualValue !== 'undefined') {\r\n return String(placeholder.actualValue);\r\n }\r\n \r\n // For dynamic placeholders, return a sample/preview value\r\n switch (placeholder.type) {\r\n case 'date':\r\n return new Date().toLocaleDateString();\r\n case 'datetime':\r\n return new Date().toLocaleString();\r\n case 'number':\r\n return '123';\r\n case 'currency':\r\n return '$1,234.56';\r\n case 'email':\r\n return 'example@domain.com';\r\n case 'phone':\r\n return '+1 (555) 123-4567';\r\n case 'url':\r\n return 'https://example.com';\r\n default:\r\n return `{{${placeholder.value}}}` || placeholder.label;\r\n }\r\n };\r\n\r\n // Modified: Populate rows with placeholder values for both column and row level\r\n const populateRowsWithPlaceholders = () => {\r\n if (!tPlaceholders && !rowLevel) return;\r\n\r\n setTableData(prev => ({\r\n ...prev,\r\n name:selectedTable||'',\r\n rows: prev.rows.map((row, rowIndex) => {\r\n const updatedRow = { ...row };\r\n \r\n prev.columns.forEach(column => {\r\n let placeholderKey: string | undefined;\r\n \r\n // Priority: Row-level placeholders take precedence when rowLevel is true\r\n if (rowLevel && rowPlaceholders[rowIndex]?.[column.id]) {\r\n placeholderKey = rowPlaceholders[rowIndex][column.id];\r\n } else if (tPlaceholders?.[column.id]) {\r\n placeholderKey = tPlaceholders[column.id];\r\n }\r\n\r\n if (placeholderKey) {\r\n updatedRow[column.id] = getPlaceholderValue(placeholderKey);\r\n // Preserve static text in the _static field\r\n const staticText = customText[rowIndex]?.[column.id] || '';\r\n if (staticText) {\r\n updatedRow[`${column.id}_static`] = `${staticText} ${updatedRow[column.id]}`;\r\n }\r\n }\r\n });\r\n \r\n return updatedRow;\r\n })\r\n }));\r\n setIsUpdating(false);\r\n };\r\n\r\n // Check if a cell is merged or covered by a merge\r\n const getCellMergeInfo = (section: 'thead' | 'tbody', rowIndex: number, colIndex: number) => {\r\n const merge = mergedCells?.find(m => \r\n m.section === section &&\r\n rowIndex >= m.rowStart && rowIndex <= m.rowEnd &&\r\n colIndex >= m.colStart && colIndex <= m.colEnd\r\n );\r\n \r\n if (!merge) return null;\r\n \r\n return {\r\n merge,\r\n isTopLeft: rowIndex === merge.rowStart && colIndex === merge.colStart,\r\n isCovered: !(rowIndex === merge.rowStart && colIndex === merge.colStart)\r\n };\r\n };\r\n\r\n // Check if cell is selected for merging\r\n const isCellSelected = (section: 'thead' | 'tbody', rowIndex: number, colIndex: number) => {\r\n return selectedCells.some(cell => \r\n cell.section === section && cell.row === rowIndex && cell.col === colIndex\r\n );\r\n };\r\n\r\n // Toggle cell selection for merging\r\n const toggleCellSelection = (section: 'thead' | 'tbody', rowIndex: number, colIndex: number) => {\r\n const cellKey = { section, row: rowIndex, col: colIndex };\r\n const isSelected = isCellSelected(section, rowIndex, colIndex);\r\n \r\n if (isSelected) {\r\n setSelectedCells(prev => prev.filter(cell => \r\n !(cell.section === section && cell.row === rowIndex && cell.col === colIndex)\r\n ));\r\n } else {\r\n // Prevent mixing header and body cells in the same merge\r\n const hasDifferentSection = selectedCells.some(cell => cell.section !== section);\r\n if (hasDifferentSection) {\r\n alert('Cannot select cells from both header and body for the same merge');\r\n return;\r\n }\r\n setSelectedCells(prev => [...prev, cellKey]);\r\n }\r\n };\r\n\r\n // Open merge dialog\r\n const openMergeDialog = () => {\r\n if (selectedCells.length < 2) {\r\n alert('Please select at least 2 cells to merge');\r\n return;\r\n }\r\n \r\n // Get value from first selected cell\r\n const firstCell = selectedCells[0];\r\n let firstCellValue = '';\r\n let customTextValue = '';\r\n\r\n if (firstCell.section === 'tbody') {\r\n const columnId = tableData.columns[firstCell.col]?.id;\r\n firstCellValue = tableData.rows[firstCell.row]?.[columnId] || '';\r\n if (rowLevel) {\r\n customTextValue = customText[firstCell.row]?.[columnId] || '';\r\n }\r\n } else {\r\n firstCellValue = tableData.columns[firstCell.col]?.header || '';\r\n }\r\n\r\n // Combine customText with cell value only in row-level mode\r\n const initialMergeValue = rowLevel && customTextValue \r\n ? `${customTextValue} ${firstCellValue}`.trim() \r\n : firstCellValue;\r\n\r\n setMergeValue(initialMergeValue);\r\n setMergeDialogOpen(true);\r\n};\r\n\r\n // Perform cell merge\r\n const mergeCells = () => {\r\n if (selectedCells.length < 2) return;\r\n\r\n const section = selectedCells[0].section;\r\n const rowIndices = selectedCells.map(cell => cell.row);\r\n const colIndices = selectedCells.map(cell => cell.col);\r\n \r\n const rowStart = Math.min(...rowIndices);\r\n const rowEnd = Math.max(...rowIndices);\r\n const colStart = Math.min(...colIndices);\r\n const colEnd = Math.max(...colIndices);\r\n\r\n // Check if selection forms a rectangle\r\n const expectedCells = (rowEnd - rowStart + 1) * (colEnd - colStart + 1);\r\n if (selectedCells.length !== expectedCells) {\r\n alert('Please select a rectangular area of cells to merge');\r\n return;\r\n }\r\n\r\n // Check for overlapping merges\r\n const hasOverlap = mergedCells.some(existing => \r\n existing.section === section &&\r\n !(rowEnd < existing.rowStart || rowStart > existing.rowEnd ||\r\n colEnd < existing.colStart || colStart > existing.colEnd)\r\n );\r\n\r\n if (hasOverlap) {\r\n alert('Cannot merge cells that overlap with existing merged cells');\r\n return;\r\n }\r\n\r\n const newMerge: CellMerge = {\r\n section,\r\n rowStart,\r\n rowEnd,\r\n colStart,\r\n colEnd,\r\n value: mergeValue\r\n };\r\n\r\n setTableData(prev => ({\r\n ...prev,\r\n name:selectedTable||'',\r\n mergedCells: [...(prev.mergedCells || []), newMerge],\r\n columns: section === 'thead' ? prev.columns.map((col, index) => \r\n index === colStart ? { ...col, header: mergeValue } : col\r\n ) : prev.columns\r\n }));\r\n\r\n setSelectedCells([]);\r\n setMergeValue('');\r\n setMergeDialogOpen(false);\r\n };\r\n\r\n // Split merged cell\r\n const splitMergedCell = (mergeIndex: number) => {\r\n const merge = mergedCells[mergeIndex];\r\n \r\n setTableData(prev => {\r\n const updatedRows = [...prev.rows];\r\n const updatedColumns = [...prev.columns];\r\n \r\n if (merge.section === 'tbody') {\r\n for (let row = merge.rowStart; row <= merge.rowEnd; row++) {\r\n for (let col = merge.colStart; col <= merge.colEnd; col++) {\r\n const columnId = prev.columns[col]?.id;\r\n if (columnId && updatedRows[row]) {\r\n updatedRows[row][columnId] = merge.value;\r\n }\r\n }\r\n }\r\n } else {\r\n if (updatedColumns[merge.colStart]) {\r\n updatedColumns[merge.colStart].header = merge.value;\r\n }\r\n }\r\n \r\n return {\r\n ...prev,\r\n rows: updatedRows,\r\n name:selectedTable||'',\r\n columns: updatedColumns,\r\n mergedCells: prev.mergedCells?.filter((_, index) => index !== mergeIndex) || []\r\n };\r\n });\r\n };\r\n\r\n // Add new column\r\n const addColumn = () => {\r\n const newColumnId = generateColumnId();\r\n const newColumn: TableColumn = {\r\n id: newColumnId,\r\n header: `Column ${tableData.columns.length + 1}`\r\n };\r\n\r\n setTableData(prev => ({\r\n ...prev,\r\n name:selectedTable||'',\r\n columns: [...prev.columns, newColumn],\r\n rows: prev.rows.map(row => ({\r\n ...row,\r\n [newColumnId]: ''\r\n })),\r\n mergedCells: prev.mergedCells?.map(merge => ({\r\n ...merge\r\n })) || []\r\n }));\r\n };\r\n\r\n // Remove column\r\n const removeColumn = (columnId: string) => {\r\n const columnIndex = tableData.columns.findIndex(col => col.id === columnId);\r\n \r\n setTableData(prev => ({\r\n ...prev,\r\n name:selectedTable||'',\r\n columns: prev.columns.filter(col => col.id !== columnId),\r\n rows: prev.rows.map(row => {\r\n const { [columnId]: removed, ...rest } = row;\r\n return rest;\r\n }),\r\n mergedCells: prev.mergedCells\r\n ?.filter(merge => !(merge.colStart <= columnIndex && merge.colEnd >= columnIndex))\r\n .map(merge => ({\r\n ...merge,\r\n colStart: merge.colStart > columnIndex ? merge.colStart - 1 : merge.colStart,\r\n colEnd: merge.colEnd > columnIndex ? merge.colEnd - 1 : merge.colEnd\r\n })) || []\r\n }));\r\n\r\n if (tPlaceholders && tPlaceholders[columnId]) {\r\n const updatedPlaceholders = { ...tPlaceholders };\r\n delete updatedPlaceholders[columnId];\r\n updateAttrs({ placeholders: updatedPlaceholders });\r\n }\r\n };\r\n\r\n // Update column header\r\n const updateColumnHeader = (columnId: string, newHeader: string) => {\r\n setTableData(prev => ({\r\n ...prev,\r\n columns: prev.columns.map(col =>\r\n col.id === columnId ? { ...col, header: newHeader } : col\r\n )\r\n }));\r\n };\r\n\r\n // Add new row\r\nconst addRow = () => {\r\n const newRow: TableRow = {};\r\n\r\n tableData.columns.forEach(col => {\r\n if (tPlaceholders?.[col.id]) {\r\n const placeholderKey = tPlaceholders[col.id];\r\n newRow[col.id] = `{{${placeholderKey}}}`;\r\n if(rowLevel){\r\n newRow[`${col.id}_static`] = newRow[col.id];\r\n }\r\n \r\n } else if (tableData.rows.length > 0) {\r\n // Copy first row's data if no placeholder\r\n newRow[col.id] = tableData.rows[0][col.id] || '';\r\n if(rowLevel){\r\n newRow[`${col.id}_static`] = tableData.rows[0][`${col.id}_static`] || ''\r\n }\r\n } else {\r\n // Default to empty\r\n if(rowLevel){\r\n newRow[`${col.id}_static`] = '';\r\n }\r\n newRow[col.id] = '';\r\n }\r\n });\r\n\r\n setTableData(prev => {\r\n const updatedRows = [...prev.rows, newRow];\r\n return {\r\n ...prev,\r\n rows: updatedRows,\r\n name:selectedTable||'',\r\n mergedCells: prev.mergedCells?.map(merge => ({ ...merge })) || []\r\n };\r\n });\r\n handleSave()\r\n};\r\n\r\n // Remove row\r\n const removeRow = (rowIndex: number) => {\r\n setTableData(prev => ({\r\n ...prev,\r\n name:selectedTable||'',\r\n rows: prev.rows.filter((_, index) => index !== rowIndex),\r\n mergedCells: prev.mergedCells\r\n ?.filter(merge => !(merge.section === 'tbody' && merge.rowStart <= rowIndex && merge.rowEnd >= rowIndex))\r\n .map(merge => ({\r\n ...merge,\r\n rowStart: merge.section === 'tbody' && merge.rowStart > rowIndex ? merge.rowStart - 1 : merge.rowStart,\r\n rowEnd: merge.section === 'tbody' && merge.rowEnd > rowIndex ? merge.rowEnd - 1 : merge.rowEnd\r\n })) || []\r\n }));\r\n\r\n // Clean up rowPlaceholders and customText for the removed row\r\n setRowPlaceholders(prev => {\r\n const updated = { ...prev };\r\n delete updated[rowIndex];\r\n return updated;\r\n });\r\n setCustomText(prev => {\r\n const updated = { ...prev };\r\n delete updated[rowIndex];\r\n return updated;\r\n });\r\n };\r\n\r\n // Modified: Update cell value and trigger placeholder population\r\nconst updateRowCellValue = (rowIndex: number, columnId: string, value: string) => {\r\n setIsUpdating(true);\r\n const colIndex = tableData.columns.findIndex(col => col.id === columnId);\r\n const mergeInfo = getCellMergeInfo('tbody', rowIndex, colIndex);\r\n const staticText = rowLevel ? (customText[rowIndex]?.[columnId] || '') : '';\r\n\r\n if (mergeInfo) {\r\n setTableData(prev => ({\r\n ...prev,\r\n name:selectedTable||'',\r\n mergedCells: prev.mergedCells?.map(merge => \r\n merge === mergeInfo.merge ? { ...merge, value } : merge\r\n ) || []\r\n }));\r\n } else {\r\n if (rowLevel && value) {\r\n setRowPlaceholders(prev => {\r\n const updated = { ...prev };\r\n if (!updated[rowIndex]) {\r\n updated[rowIndex] = {};\r\n }\r\n updated[rowIndex][columnId] = value;\r\n return updated;\r\n });\r\n } else if (rowLevel && !value) {\r\n setRowPlaceholders(prev => {\r\n const updated = { ...prev };\r\n if (updated[rowIndex]?.[columnId]) {\r\n delete updated[rowIndex][columnId];\r\n if (Object.keys(updated[rowIndex]).length === 0) {\r\n delete updated[rowIndex];\r\n }\r\n }\r\n return updated;\r\n });\r\n }\r\n\r\n setTableData(prev => ({\r\n ...prev,\r\n name:selectedTable||'',\r\n rows: prev.rows.map((row, idx) =>\r\n idx === rowIndex ? { \r\n ...row, \r\n [columnId]: rowLevel ? (value ? `{{${value}}}` : '') : (value ? getPlaceholderValue(value) : ''),\r\n [`${columnId}_static`]: staticText ? `${staticText} ${value ? getPlaceholderValue(value) : ''}`.trim() : (value ? getPlaceholderValue(value) : '')\r\n } : row\r\n )\r\n }));\r\n\r\n populateRowsWithPlaceholders();\r\n }\r\n };\r\nconst updateCellValue = (rowIndex: number, columnId: string, value: string) => {\r\n setIsUpdating(true);\r\n const colIndex = tableData.columns.findIndex(col => col.id === columnId);\r\n const mergeInfo = getCellMergeInfo('tbody', rowIndex, colIndex);\r\n const staticText = customText[rowIndex]?.[columnId] || '';\r\n\r\n if (mergeInfo) {\r\n setTableData(prev => ({\r\n ...prev,\r\n name:selectedTable||'',\r\n mergedCells: prev.mergedCells?.map(merge => \r\n merge === mergeInfo.merge ? { ...merge, value } : merge\r\n ) || []\r\n }));\r\n } else {\r\n if (rowLevel) {\r\n setRowPlaceholders(prev => {\r\n const updated = { ...prev };\r\n if (!updated[rowIndex]) {\r\n updated[rowIndex] = {};\r\n }\r\n if (value) {\r\n updated[rowIndex][columnId] = value;\r\n } else {\r\n delete updated[rowIndex][columnId];\r\n if (Object.keys(updated[rowIndex]).length === 0) {\r\n delete updated[rowIndex];\r\n }\r\n }\r\n return updated;\r\n });\r\n }\r\n\r\n setTableData(prev => ({\r\n ...prev,\r\n name:selectedTable||'',\r\n rows: prev.rows.map((row, idx) =>\r\n idx === rowIndex ? { \r\n ...row, \r\n [columnId]: rowLevel ? (value ? `{{${value}}}` : '') : value,\r\n [`${columnId}_static`]: staticText ? `${staticText} ${value || ''}`.trim() : (value || '')\r\n } : row\r\n )\r\n }));\r\n\r\n if (rowLevel || (autoPopulateEnabled && tPlaceholders?.[columnId])) {\r\n populateRowsWithPlaceholders();\r\n }\r\n setIsUpdating(false);\r\n }\r\n };\r\n\r\n // Modified: Update column placeholder\r\n const updateColumnPlaceholder = (columnId: string, placeholderValue: string) => {\r\n setIsUpdating(true);\r\n const updatedPlaceholders = {\r\n ...tPlaceholders,\r\n [columnId]: placeholderValue\r\n };\r\n \r\n if (!placeholderValue) {\r\n delete updatedPlaceholders[columnId];\r\n }\r\n \r\n updateAttrs({ placeholders: updatedPlaceholders });\r\n\r\n if (autoPopulateEnabled) {\r\n const newCellValue = placeholderValue ? getPlaceholderValue(placeholderValue) : '';\r\n setTableData(prev => ({\r\n ...prev,\r\n name:selectedTable||'',\r\n rows: prev.rows.map(row => ({\r\n ...row,\r\n [columnId]: newCellValue\r\n }))\r\n }));\r\n }\r\n setIsUpdating(false);\r\n };\r\n\r\n // Refresh all rows with current placeholder values\r\n const refreshPlaceholderData = () => {\r\n populateRowsWithPlaceholders();\r\n };\r\n\r\n // Get placeholder info for display\r\n const getPlaceholderInfo = (placeholderKey: string) => {\r\n const placeholder = placeholders.find(p => p.value === placeholderKey);\r\n return placeholder ? {\r\n label: placeholder.label,\r\n type: placeholder.type || 'text',\r\n description: placeholder.description || ''\r\n } : null;\r\n };\r\n\r\n const handleTabChange = (event: React.SyntheticEvent, newValue: number) => {\r\n setTabValue(newValue);\r\n };\r\n\r\n const handleAccordionChange = (panel: string) => (event: React.SyntheticEvent, isExpanded: boolean) => {\r\n setExpanded(isExpanded ? panel : '');\r\n };\r\n\r\n const updateTableStyle = (key: string, value: any) => {\r\n setTableStyles(prev => ({\r\n ...prev,\r\n [key]: value\r\n }));\r\n };\r\n\r\n const updateHeaderStyle = (key: string, value: any) => {\r\n setTableStyles(prev => ({\r\n ...prev,\r\n tHead: {\r\n ...prev.tHead,\r\n [key]: value\r\n }\r\n }));\r\n };\r\n\r\n const updateHeaderCellStyle = (key: string, value: any) => {\r\n setTableStyles(prev => ({\r\n ...prev,\r\n thCells: {\r\n ...prev.thCells,\r\n [key]: value\r\n }\r\n }));\r\n };\r\n\r\n const updateBodyStyle = (key: string, value: any) => {\r\n setTableStyles(prev => ({\r\n ...prev,\r\n tBody: {\r\n ...prev.tBody,\r\n [key]: value\r\n }\r\n }));\r\n };\r\n\r\n const updateBodyCellStyle = (key: string, value: any) => {\r\n setTableStyles(prev => ({\r\n ...prev,\r\n tbCells: {\r\n ...prev.tbCells,\r\n [key]: value\r\n }\r\n }));\r\n };\r\n\r\n const resetTable=()=>{\r\n setTableData((prev: TableData) => ({\r\n ...prev,\r\n name:selectedTable||'',\r\n rows: prev.rows.map((row: TableRow) => {\r\n return {...Object.fromEntries(prev.columns.map((col: TableColumn) => [col?.id, '']))\r\n \t}\r\n })\r\n }));\r\n }\r\n // Count columns with placeholders\r\n const columnsWithPlaceholders = tPlaceholders ? Object.keys(tPlaceholders).length : 0;\r\nuseEffect(() => {\r\n // Determine if rowLevel should be enabled\r\n setRowLevel(levelType);\r\n setSelectedTable(tableData?.name || null); // Set default table if available\r\n // Update custom text by extracting values from _static fields\r\n setCustomText((prev: { [rowIndex: number]: { [columnId: string]: string } }) => {\r\n const updated: { [rowIndex: number]: { [columnId: string]: string } } = {}; // Fixed missing bracket here\r\n \r\n tableData.rows.forEach((row, rowIndex) => {\r\n Object.keys(row).forEach(columnId => {\r\n if (columnId.endsWith('_static')) {\r\n const originalColumnId = columnId.replace('_static', '');\r\n if (!updated[rowIndex]) {\r\n updated[rowIndex] = {};\r\n }\r\n\r\n // Get the original column value (without _static suffix)\r\n const columnValue = row[originalColumnId] || '';\r\n \r\n // Get the static value and remove the original column value if it appears\r\n let staticValue = row[columnId] || '';\r\n if (columnValue && staticValue.includes(columnValue)) {\r\n staticValue = staticValue.replace(columnValue, '').trim();\r\n }\r\n \r\n // Also remove any {{value}} placeholders\r\n staticValue = staticValue.replace(/\\{\\{\\s*value\\s*\\}\\}/g, '').trim();\r\n \r\n updated[rowIndex][originalColumnId] = staticValue;\r\n }\r\n });\r\n });\r\n \r\n return updated;\r\n });\r\n\r\n}, [tableData]);\r\n\r\nuseEffect(()=>{\r\n if(!selectedTable) {\r\n resetTable()\r\n }\r\n\r\n},[selectedTable]);\r\n return (\r\n <>\r\n <Box sx={{ mb: 2, borderBottom: 1,paddingBottom: 5, borderColor: 'divider' }}>\r\n <Tabs value={tabValue} onChange={handleTabChange} variant=\"fullWidth\" sx={(theme) => ({\r\n '& .MuiTabs-indicator': {\r\n backgroundColor: theme.palette.theme?.primary[700]\r\n },\r\n '& .MuiTab-root.Mui-selected': {\r\n color: theme.palette.theme?.primary[700],\r\n },\r\n '& .MuiTab-root': {\r\n textTransform: 'none'\r\n },\r\n })}>\r\n <Tab label=\"Content\" />\r\n <Tab label=\"Styles\" />\r\n <Tab label=\"Cell Merging\" />\r\n </Tabs>\r\n </Box>\r\n\r\n {tabValue === 0 && (\r\n <>\r\n <Box sx={{ mb: 2, p: 2, bgcolor: 'grey.50', borderRadius: 1, border: '1px solid', borderColor: 'divider' }}>\r\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 1 }}>\r\n <Typography type=\"s4\" weight=\"medium\" color=\"theme.primary.700\">\r\n Dynamic Data Settings\r\n </Typography>\r\n <Chip \r\n label={`${columnsWithPlaceholders} columns linked`} \r\n size=\"small\" \r\n color=\"primary\" \r\n variant=\"outlined\"\r\n sx={theme => ({\r\n color: theme.palette.theme?.primary[700],\r\n borderColor: theme.palette.theme?.primary[700]\r\n })}\r\n />\r\n </Box>\r\n \r\n <FormControlLabel\r\n control={\r\n <Android12Switch\r\n checked={autoPopulateEnabled}\r\n onChange={(e) => setAutoPopulateEnabled(e.target.checked)}\r\n />\r\n }\r\n label={\r\n <Typography type=\"s5\" color=\"theme.secondary.800\">\r\n Auto-populate rows with placeholder data\r\n </Typography>\r\n }\r\n />\r\n <FormControlLabel\r\n control={\r\n <Android12Switch\r\n checked={rowLevel}\r\n onChange={(e) => {\r\n setRowLevel(e.target.checked);\r\n setSelectedTable(null); // Reset selected table when toggling row level\r\n setParentRowLevel(e.target.checked);\r\n resetTable();\r\n }}\r\n />\r\n }\r\n label={\r\n <Typography type=\"s5\" color=\"theme.secondary.800\">\r\n Row Level Management\r\n </Typography>\r\n }\r\n />\r\n \r\n {autoPopulateEnabled && (\r\n <Box sx={{ mt: 1 }}>\r\n <Button\r\n variant=\"outlined\"\r\n size=\"small\"\r\n onClick={refreshPlaceholderData}\r\n startIcon={<RefreshIcon />}\r\n className='black-outlined-btn'\r\n >\r\n Refresh Data\r\n </Button>\r\n </Box>\r\n )}\r\n </Box>\r\n\r\n <Box sx={{ mb: 2 }}>\r\n <Typography type=\"s3\" weight=\"medium\" color=\"theme.secondary.1000\" sx={{ mb: 1 }}>\r\n Columns\r\n </Typography>\r\n {tableData.columns?.map((column, index) => (\r\n <Box key={column.id} sx={{ mb: 1, display: 'flex', alignItems: 'center', gap: 1 }}>\r\n <TextField\r\n label={`Column ${index + 1} Header`}\r\n value={column.header}\r\n onChange={(e) => updateColumnHeader(column.id, e.target.value)}\r\n size=\"small\"\r\n sx={{ flex: 1 }}\r\n />\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => removeColumn(column.id)}\r\n disabled={tableData.columns.length <= 1}\r\n color=\"error\"\r\n >\r\n <Trash />\r\n </IconButton>\r\n </Box>\r\n ))}\r\n <Button\r\n variant=\"outlined\"\r\n size=\"small\"\r\n onClick={addColumn}\r\n startIcon={<AddIcon />}\r\n sx={{ mt: 1 }}\r\n className='black-outlined-btn'\r\n >\r\n Add Column\r\n </Button>\r\n </Box>\r\n\r\n <Divider sx={{ my: 2 }} />\r\n\r\n <Box sx={{ mb: 2 }}>\r\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 1 }}>\r\n <Typography type=\"s3\" weight=\"medium\" color=\"theme.secondary.1000\">\r\n Rows ({tableData.rows.length})\r\n </Typography>\r\n <Button\r\n variant=\"outlined\"\r\n size=\"small\"\r\n disabled={selectedTable}\r\n onClick={() => addRow()}\r\n startIcon={<AddIcon />}\r\n className='black-outlined-btn'\r\n >\r\n Add Row\r\n </Button>\r\n </Box>\r\n {!rowLevel &&\r\n <Box sx={{ mb: 2 }}>\r\n <SearchableSelect\r\n value={selectedTable || ''}\r\n label={'Select Table'}\r\n options={relation_table?.map(table=>(\r\n { value: table?.dataKey, label: (table.name.charAt(0).toUpperCase() + table.name.slice(1)).replaceAll('_', ' ') }\r\n )) || []}\r\n onChange={(e) => {\r\n setSelectedTable(e.target.value);\r\n }}\r\n />\r\n </Box>\r\n\r\n }\r\n {tableData.rows.map((row, rowIndex) => (\r\n <Box key={rowIndex} sx={{ mb: 2, p: 2, border: 1, borderColor: 'divider', borderRadius: 1 }}>\r\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 1 }}>\r\n <Typography type=\"s4\" weight=\"medium\" color=\"theme.secondary.800\">\r\n Row {rowIndex + 1}\r\n </Typography>\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => removeRow(rowIndex)}\r\n disabled={tableData.rows.length <= 1}\r\n color=\"error\"\r\n >\r\n <Trash />\r\n </IconButton>\r\n </Box>\r\n <Grid container spacing={1}>\r\n \r\n {tableData.columns.map((column, colIndex) => {\r\n const hasPlaceholder = rowLevel ? rowPlaceholders[rowIndex]?.[column.id] : tPlaceholders?.[column.id];\r\n const placeholderInfo = hasPlaceholder ? getPlaceholderInfo(tPlaceholders?.[column.id] || rowPlaceholders[rowIndex]?.[column.id]) : null;\r\n const mergeInfo = getCellMergeInfo('tbody', rowIndex, colIndex);\r\n\r\n return (\r\n <Grid item xs={12} key={column.id}>\r\n \r\n {rowLevel ? (\r\n <>\r\n <Typography type=\"s4\" weight=\"medium\" color=\"theme.secondary.800\"> {column.header} </Typography>\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n flexDirection: 'row',\r\n gap: 1,\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n }}\r\n >\r\n <TextField\r\n value={customText[rowIndex]?.[column.id] || ''}\r\n onChange={(e) => {\r\n const newValue = e.target.value;\r\n setCustomText(prev => {\r\n const updated = { ...prev };\r\n if (!updated[rowIndex]) {\r\n updated[rowIndex] = {};\r\n }\r\n updated[rowIndex][column.id] = newValue;\r\n return updated;\r\n });\r\n\r\n // Update table data on custom text change\r\n setTableData(prev => ({\r\n ...prev,\r\n rows: prev.rows.map((row, idx) =>\r\n idx === rowIndex\r\n ? {\r\n ...row,\r\n [`${column.id}_static`]: newValue\r\n ? `${newValue} ${row[column.id] || ''}`.trim()\r\n : '',\r\n }\r\n : row\r\n ),\r\n }));\r\n }}\r\n size=\"small\"\r\n placeholder=\"Enter custom text...\"\r\n sx={{ flex: 1, minWidth: 150 }}\r\n />\r\n <Box sx={{ flex: 1, minWidth: 150 }}>\r\n <SearchableSelect\r\n value={mergeInfo ? mergeInfo.merge.value : (rowPlaceholders[rowIndex]?.[column.id] ||row[column.id]|| '')}\r\n onChange={(e) => updateRowCellValue(rowIndex, column.id, e.target.value)}\r\n size=\"small\"\r\n options={placeholders || []}\r\n // disabled={isUpdating}\r\n sx={{\r\n flex: 1,\r\n maxWidth: 150,\r\n minWidth: 150,\r\n '& .MuiInputBase-input': {\r\n bgcolor:\r\n hasPlaceholder && autoPopulateEnabled\r\n ? 'grey.100'\r\n : mergeInfo\r\n ? 'blue.50'\r\n : 'transparent',\r\n width: 150,\r\n \r\n },\r\n }}\r\n />\r\n </Box>\r\n </Box>\r\n </>\r\n ) : (\r\n <TextField\r\n label={column.header}\r\n value={mergeInfo ? mergeInfo.merge.value : (row[column.id] || '')}\r\n onChange={(e) => updateCellValue(rowIndex, column.id, e.target.value)}\r\n size=\"small\"\r\n fullWidth\r\n disabled={autoPopulateEnabled || hasPlaceholder}\r\n helperText={\r\n mergeInfo\r\n ? `Merged cell (${mergeInfo.merge.rowEnd - mergeInfo.merge.rowStart + 1}×${mergeInfo.merge.colEnd - mergeInfo.merge.colStart + 1})`\r\n : hasPlaceholder && placeholderInfo\r\n ? `Linked to: ${placeholderInfo.label}`\r\n : undefined\r\n }\r\n sx={{\r\n '& .MuiInputBase-input': {\r\n bgcolor:\r\n hasPlaceholder && autoPopulateEnabled\r\n ? 'grey.100'\r\n : mergeInfo\r\n ? 'blue.50'\r\n : 'transparent',\r\n },\r\n }}\r\n />\r\n )}\r\n </Grid>\r\n );\r\n })}\r\n </Grid>\r\n </Box>\r\n ))}\r\n </Box>\r\n\r\n <Divider sx={{ my: 2 }} />\r\n\r\n <Typography type=\"s3\" weight=\"medium\" color=\"theme.secondary.1000\" sx={{ mb: 1 }}>\r\n Column Data Sources\r\n </Typography>\r\n \r\n {placeholders.length === 0 && (\r\n <Alert severity=\"info\" sx={{ mb: 2 }}>\r\n No placeholders available. Add placeholders to dynamically populate table data.\r\n </Alert>\r\n )}\r\n \r\n <Grid container spacing={1} alignItems='center'>\r\n {tableData.columns.map((column) => {\r\n const currentPlaceholder =tPlaceholders?.[column.id]|| tableData.rows?.[0]?.[column.id];\r\n\r\n const placeholderInfo = currentPlaceholder ? getPlaceholderInfo(currentPlaceholder) : null;\r\n \r\n return (\r\n <React.Fragment key={column.id}>\r\n <Grid item xs={4}>\r\n <Typography type=\"s5\" weight=\"medium\" color=\"theme.secondary.800\">\r\n {column.header}\r\n </Typography>\r\n {placeholderInfo && (\r\n <Typography type=\"s6\" color=\"theme.secondary.600\" sx={{ fontStyle: 'italic' }}>\r\n {placeholderInfo.type}\r\n </Typography>\r\n )}\r\n </Grid>\r\n <Grid item xs={8}>\r\n <SearchableSelect\r\n value={rowLevel ? '' : (currentPlaceholder || '')}\r\n onChange={(e) => {\r\n updateColumnPlaceholder(column.id, e.target.value as string)\r\n }}\r\n size=\"small\"\r\n options={tableAttributes.map(attr => ({\r\n value: attr.value,\r\n label: attr.label,\r\n // Include description if available in your tableAttributes\r\n description: attr.description \r\n }))}\r\n disabled={isUpdating || rowLevel}\r\n sx={{\r\n flex: 1,\r\n maxWidth: 150,\r\n minWidth: 150,\r\n '& .MuiInputBase-input': {\r\n bgcolor: 'transparent',\r\n width: 150,\r\n },\r\n }}\r\n renderOption={(props, option) => (\r\n <MenuItem {...props} key={option.value}>\r\n <Box>\r\n <Typography type=\"s5\" color=\"theme.secondary.1000\">\r\n {option.label}\r\n </Typography>\r\n {option.description && (\r\n <Typography type=\"s6\" color=\"theme.secondary.600\" sx={{ fontStyle: 'italic' }}>\r\n {option.description}\r\n </Typography>\r\n )}\r\n </Box>\r\n </MenuItem>\r\n )}\r\n noOptionsText={\r\n <MenuItem disabled>\r\n <Typography type=\"s5\" color=\"theme.secondary.600\">\r\n No Data Source\r\n </Typography>\r\n </MenuItem>\r\n }\r\n />\r\n {/* <Select\r\n value={rowLevel ? '' : (currentPlaceholder || '')}\r\n onChange={(e) => updateColumnPlaceholder(column.id, e.target.value as string)}\r\n renderValue={(value) => {\r\n if (!value) return 'Select Data Source';\r\n const placeholder = placeholders.find(p => p.value === value);\r\n return placeholder?.label||currentPlaceholder || 'Unknown Placeholder';\r\n }}\r\n fullWidth\r\n disabled={isUpdating}\r\n size=\"small\"\r\n displayEmpty\r\n disabled={rowLevel}\r\n >\r\n <MenuItem value=\"\">\r\n <Typography type=\"s5\" color=\"theme.secondary.600\">No Data Source</Typography>\r\n </MenuItem>\r\n {tableAttributes.map((placeholder) => (\r\n <MenuItem key={placeholder.value} value={placeholder.value}>\r\n <Box>\r\n <Typography type=\"s5\" color=\"theme.secondary.1000\">\r\n {placeholder.label}\r\n </Typography>\r\n {placeholder.description && (\r\n <Typography type=\"s6\" color=\"theme.secondary.600\" sx={{ fontStyle: 'italic' }}>\r\n {placeholder.description}\r\n </Typography>\r\n )}\r\n </Box>\r\n </MenuItem>\r\n ))}\r\n </Select> */}\r\n </Grid>\r\n </React.Fragment>\r\n );\r\n })}\r\n </Grid>\r\n </>\r\n )}\r\n\r\n {tabValue === 1 && (\r\n <Box sx={{\r\n '& >:first-child': { borderTopLeftRadius: 8, borderTopRightRadius: 8 },\r\n '& >:last-child': { borderBottomLeftRadius: 8, borderBottomRightRadius: 8 }\r\n }}>\r\n <Accordion \r\n expanded={expanded === 'tableBasic'} \r\n onChange={handleAccordionChange('tableBasic')}\r\n disableGutters\r\n >\r\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\r\n <Typography type='s3' color='theme.secondary.1000'>Table Basic Properties</Typography>\r\n </AccordionSummary>\r\n <AccordionDetails>\r\n <BorderControl\r\n styles={tableStyles}\r\n onChange={(key, value) => updateTableStyle(key, value)}\r\n isBordered={tableStyles.is_bordered}\r\n disableRadius\r\n />\r\n </AccordionDetails>\r\n </Accordion>\r\n\r\n <Accordion \r\n expanded={expanded === 'tableHeader'} \r\n onChange={handleAccordionChange('tableHeader')}\r\n disableGutters\r\n >\r\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\r\n <Typography type='s3' color='theme.secondary.1000'>Table Header Styles</Typography>\r\n </AccordionSummary>\r\n <AccordionDetails>\r\n <Grid container spacing={2}>\r\n <Grid item xs={12}>\r\n <ColorPickerInput\r\n value={tableStyles.tHead?.backgroundColor || '#f5f5f5'}\r\n onChange={(color) => updateHeaderStyle('backgroundColor', color)}\r\n fullWidth\r\n label='Background Color'\r\n />\r\n </Grid>\r\n \r\n <Grid item xs={12}>\r\n <ColorPickerInput\r\n value={tableStyles.tHead?.color || '#333333'}\r\n onChange={(color) => updateHeaderStyle('color', color)}\r\n fullWidth\r\n label='Text Color'\r\n />\r\n </Grid>\r\n\r\n <Grid item xs={6}>\r\n <TextField\r\n label='Font Size'\r\n type='number'\r\n value={tableStyles.tHead?.fontSize || 14}\r\n onChange={(e) => updateHeaderStyle('fontSize', parseInt(e.target.value) || 14)}\r\n size='small'\r\n fullWidth\r\n />\r\n </Grid>\r\n\r\n <Grid item xs={6}>\r\n <Select\r\n value={tableStyles.tHead?.fontWeight || 'bold'}\r\n onChange={(e) => updateHeaderStyle('fontWeight', e.target.value)}\r\n fullWidth\r\n size='small'\r\n label='Font Weight'\r\n >\r\n {fontWeightOptions.map(weight => (\r\n <MenuItem key={weight} value={weight}>\r\n {formatText(weight)}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </Grid>\r\n\r\n <Grid item xs={12}>\r\n <Select\r\n value={tableStyles.tHead?.fontFamily || 'Arial, sans-serif'}\r\n onChange={(e) => updateHeaderStyle('fontFamily', e.target.value)}\r\n fullWidth\r\n size='small'\r\n label='Font Family'\r\n >\r\n {fontFamilyOptions.map(font => (\r\n <MenuItem key={font} value={font}>\r\n {font.split(',')[0]}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </Grid>\r\n\r\n <Grid item xs={6}>\r\n <Select\r\n value={tableStyles.tHead?.textAlign || 'left'}\r\n onChange={(e) => updateHeaderStyle('textAlign', e.target.value)}\r\n fullWidth\r\n size='small'\r\n label='Text Align'\r\n >\r\n {textAlignOptions.map(align => (\r\n <MenuItem key={align} value={align}>\r\n {formatText(align)}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </Grid>\r\n\r\n <Grid item xs={6}>\r\n <TextField\r\n label='Cell Padding'\r\n type='number'\r\n value={tableStyles.thCells?.padding || 8}\r\n onChange={(e) => updateHeaderCellStyle('padding', parseInt(e.target.value) || 8)}\r\n size='small'\r\n fullWidth\r\n />\r\n </Grid>\r\n\r\n <Grid item xs={12}>\r\n <FormControlLabel\r\n control={\r\n <Android12Switch\r\n checked={!!tableStyles.tBody?.zebraStriping}\r\n onChange={(e) => updateBodyStyle('zebraStriping', e.target.checked)}\r\n />\r\n }\r\n label=\"Zebra Striping\"\r\n />\r\n </Grid>\r\n\r\n {tableStyles.tBody?.zebraStriping && (\r\n <Grid item xs={12}>\r\n <Typography type='s5' weight='medium' color='theme.secondary.1000' variant=\"caption\">Alternating Row Color</Typography>\r\n <ColorPickerInput\r\n value={tableStyles.tBody?.alternateRowColor || '#f9f9f9'}\r\n onChange={(color) => updateBodyStyle('alternateRowColor', color)}\r\n fullWidth\r\n />\r\n </Grid>\r\n )}\r\n </Grid>\r\n </AccordionDetails>\r\n </Accordion>\r\n\r\n <Accordion \r\n expanded={expanded === 'tableBody'} \r\n onChange={handleAccordionChange('tableBody')}\r\n disableGutters\r\n >\r\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\r\n <Typography type='s3' color='theme.secondary.1000'>Table Body Styles</Typography>\r\n </AccordionSummary>\r\n <AccordionDetails>\r\n <Grid container spacing={2}>\r\n <Grid item xs={12}>\r\n <ColorPickerInput\r\n value={tableStyles.tBody?.backgroundColor || '#ffffff'}\r\n onChange={(color) => updateBodyStyle('backgroundColor', color)}\r\n fullWidth\r\n label='Background Color'\r\n />\r\n </Grid>\r\n \r\n <Grid item xs={12}>\r\n <ColorPickerInput\r\n value={tableStyles.tBody?.color || '#333333'}\r\n onChange={(color) => updateBodyStyle('color', color)}\r\n fullWidth\r\n label='Text Color'\r\n />\r\n </Grid>\r\n\r\n <Grid item xs={6}>\r\n <TextField\r\n label='Font Size'\r\n type='number'\r\n value={tableStyles.tBody?.fontSize || 14}\r\n onChange={(e) => updateBodyStyle('fontSize', parseInt(e.target.value) || 14)}\r\n size='small'\r\n fullWidth\r\n />\r\n </Grid>\r\n\r\n <Grid item xs={6}>\r\n <Select\r\n value={tableStyles.tBody?.fontWeight || 'normal'}\r\n onChange={(e) => updateBodyStyle('fontWeight', e.target.value)}\r\n fullWidth\r\n size='small'\r\n label='Font Weight'\r\n >\r\n {fontWeightOptions.map(weight => (\r\n <MenuItem key={weight} value={weight}>\r\n {formatText(weight)}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </Grid>\r\n\r\n <Grid item xs={12}>\r\n <Select\r\n value={tableStyles.tBody?.fontFamily || 'Arial, sans-serif'}\r\n onChange={(e) => updateBodyStyle('fontFamily', e.target.value)}\r\n fullWidth\r\n size='small'\r\n label='Font Family'\r\n >\r\n {fontFamilyOptions.map(font => (\r\n <MenuItem key={font} value={font}>\r\n {font.split(',')[0]}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </Grid>\r\n\r\n <Grid item xs={6}>\r\n <Select\r\n value={tableStyles.tBody?.textAlign || 'left'}\r\n onChange={(e) => updateBodyStyle('textAlign', e.target.value)}\r\n fullWidth\r\n size='small'\r\n label='Text Align'\r\n >\r\n {textAlignOptions.map(align => (\r\n <MenuItem key={align} value={align}>\r\n {formatText(align)}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </Grid>\r\n\r\n <Grid item xs={6}>\r\n <TextField\r\n label='Cell Padding'\r\n type='number'\r\n value={tableStyles.tbCells?.padding || 8}\r\n onChange={(e) => updateBodyCellStyle('padding', parseInt(e.target.value) || 8)}\r\n size='small'\r\n fullWidth\r\n />\r\n </Grid>\r\n </Grid>\r\n </AccordionDetails>\r\n </Accordion>\r\n </Box>\r\n )}\r\n\r\n {tabValue === 2 && (\r\n <Box>\r\n <Box sx={{ mb: 3 }}>\r\n <Typography type=\"s3\" weight=\"medium\" color=\"theme.secondary.1000\" sx={{ mb: 2 }}>\r\n Cell Selection & Merging\r\n </Typography>\r\n \r\n <Alert severity=\"info\" sx={{ mb: 2 }}>\r\n Click on cells in the table below to select them for merging. Selected cells will be highlighted. You can merge cells within the header or body, but not across both.\r\n </Alert>\r\n\r\n <Box sx={{ display: 'flex', gap: 1, mb: 2, flexWrap: 'wrap' }}>\r\n <Button\r\n variant=\"contained\"\r\n size=\"small\"\r\n onClick={openMergeDialog}\r\n startIcon={<MergeIcon />}\r\n disabled={selectedCells.length < 2}\r\n color=\"primary\"\r\n >\r\n Merge Selected ({selectedCells.length})\r\n </Button>\r\n \r\n <Button\r\n variant=\"outlined\"\r\n size=\"small\"\r\n onClick={() => setSelectedCells([])}\r\n disabled={selectedCells.length === 0}\r\n className='black-outlined-btn'\r\n >\r\n Clear Selection\r\n </Button>\r\n </Box>\r\n\r\n <Box sx={{ \r\n border: 1, \r\n borderColor: 'divider', \r\n borderRadius: 1, \r\n overflow: 'auto',\r\n maxHeight: 400\r\n }}>\r\n <Table size=\"small\" sx={{ minWidth: 300 }}>\r\n <TableHead>\r\n <TableRow>\r\n {tableData.columns.map((column, colIndex) => {\r\n const mergeInfo = getCellMergeInfo('thead', 0, colIndex);\r\n const isSelected = isCellSelected('thead', 0, colIndex);\r\n \r\n if (mergeInfo?.isCovered) {\r\n return null;\r\n }\r\n\r\n const cellContent = mergeInfo ? mergeInfo.merge.value : column.header;\r\n const rowSpan = mergeInfo ? mergeInfo.merge.rowEnd - mergeInfo.merge.rowStart + 1 : 1;\r\n const colSpan = mergeInfo ? mergeInfo.merge.colEnd - mergeInfo.merge.colStart + 1 : 1;\r\n\r\n return (\r\n <TableCell \r\n key={column.id}\r\n rowSpan={rowSpan}\r\n colSpan={colSpan}\r\n onClick={() => !mergeInfo && toggleCellSelection('thead', 0, colIndex)}\r\n sx={(theme) => ({ \r\n fontWeight: 'bold',\r\n bgcolor: mergeInfo ? 'blue.50' : \r\n isSelected ? 'primary.100' : 'grey.100',\r\n position: 'sticky',\r\n top: 0,\r\n zIndex: 1,\r\n cursor: mergeInfo ? 'default' : 'pointer',\r\n border: isSelected ? 2 : 1,\r\n borderColor: isSelected ? theme.palette.theme.primary[800] : 'divider',\r\n '&:hover': mergeInfo ? {} : {\r\n bgcolor: isSelected ? 'primary.200' : 'grey.50'\r\n }\r\n })}\r\n >\r\n {cellContent}\r\n {mergeInfo && (\r\n <Chip\r\n label={`${rowSpan}×${colSpan}`}\r\n size=\"small\"\r\n color=\"primary\"\r\n variant=\"outlined\"\r\n sx={(theme) => ({\r\n position: 'absolute',\r\n top: 2,\r\n right: 2,\r\n fontSize: '0.6rem',\r\n height: 16,\r\n color: theme.palette.theme.primary[800],\r\n borderColor: theme.palette.theme.primary[800]\r\n })}\r\n />\r\n )}\r\n {isSelected && (\r\n <Checkbox\r\n checked={true}\r\n size=\"small\"\r\n sx={{\r\n position: 'absolute',\r\n top: 2,\r\n left: 2,\r\n padding: 0\r\n }}\r\n />\r\n )}\r\n </TableCell>\r\n );\r\n })}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {tableData.rows.map((row, rowIndex) => (\r\n <TableRow key={rowIndex}>\r\n {tableData.columns.map((column, colIndex) => {\r\n const mergeInfo = getCellMergeInfo('tbody', rowIndex, colIndex);\r\n const isSelected = isCellSelected('tbody', rowIndex, colIndex);\r\n \r\n if (mergeInfo?.isCovered) {\r\n return null;\r\n }\r\n\r\n // Get customText for the cell\r\n const customTextValue = customText[rowIndex]?.[column.id] || '';\r\n // Combine customText with cell value or merge value\r\n const cellContent = mergeInfo \r\n ? mergeInfo.merge.value // Already includes customText from mergeCells\r\n : customTextValue \r\n ? `${customTextValue} ${row[column.id] || ''}`.trim() \r\n : row[column.id] || '';\r\n\r\n const rowSpan = mergeInfo ? mergeInfo.merge.rowEnd - mergeInfo.merge.rowStart + 1 : 1;\r\n const colSpan = mergeInfo ? mergeInfo.merge.colEnd - mergeInfo.merge.colStart + 1 : 1;\r\n\r\n return (\r\n <TableCell\r\n key={column.id}\r\n rowSpan={rowSpan}\r\n colSpan={colSpan}\r\n onClick={() => !mergeInfo && toggleCellSelection('tbody', rowIndex, colIndex)}\r\n sx={(theme) => ({ \r\n cursor: mergeInfo ? 'default' : 'pointer',\r\n bgcolor: mergeInfo ? 'blue.50' : \r\n isSelected ? 'primary.100' : \r\n 'transparent',\r\n border: isSelected ? 2 : 1,\r\n borderColor: isSelected ? theme.palette.theme?.primary[800] : 'divider',\r\n '&:hover': mergeInfo ? {} : {\r\n bgcolor: isSelected ? 'primary.200' : 'grey.50'\r\n },\r\n position: 'relative'\r\n })}\r\n >\r\n {cellContent}\r\n {mergeInfo && (\r\n <Chip\r\n label={`${rowSpan}×${colSpan}`}\r\n size=\"small\"\r\n color=\"primary\"\r\n variant=\"outlined\"\r\n sx={(theme) => ({\r\n position: 'absolute',\r\n top: 2,\r\n right: 2,\r\n fontSize: '0.6rem',\r\n height: 16,\r\n color: theme.palette.theme?.primary[800],\r\n borderColor: theme.palette.theme?.primary[800]\r\n })}\r\n />\r\n )}\r\n {isSelected && (\r\n <Checkbox\r\n checked={true}\r\n size=\"small\"\r\n sx={{\r\n position: 'absolute',\r\n top: 2,\r\n left: 2,\r\n padding: 0\r\n }}\r\n />\r\n )}\r\n </TableCell>\r\n );\r\n })}\r\n </TableRow>\r\n ))}\r\n</TableBody>\r\n </Table>\r\n </Box>\r\n </Box>\r\n\r\n {mergedCells.length > 0 && (\r\n <Box sx={{ mt: 3 }}>\r\n <Typography type=\"s3\" weight=\"medium\" color=\"theme.secondary.1000\" sx={{ mb: 2 }}>\r\n Merged Cells ({mergedCells.length})\r\n </Typography>\r\n \r\n {mergedCells.map((merge, index) => (\r\n <Box \r\n key={index}\r\n sx={{ \r\n p: 2, \r\n mb: 1, \r\n border: 1, \r\n borderColor: 'divider', \r\n borderRadius: 1,\r\n bgcolor: 'blue.25'\r\n }}\r\n >\r\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', mb: 1 }}>\r\n <Box>\r\n <Typography type=\"s4\" weight=\"medium\" color=\"theme.secondary.900\">\r\n Merge {index + 1}: {merge.rowEnd - merge.rowStart + 1}×{merge.colEnd - merge.colStart + 1} cells ({merge.section})\r\n </Typography>\r\n <Typography type=\"s5\" color=\"theme.secondary.700\">\r\n Rows {merge.rowStart + 1}-{merge.rowEnd + 1}, Columns {merge.colStart + 1}-{merge.colEnd + 1}\r\n </Typography>\r\n </Box>\r\n <Button\r\n variant=\"outlined\"\r\n size=\"small\"\r\n onClick={() => splitMergedCell(index)}\r\n startIcon={<SplitIcon />}\r\n className='black-outlined-btn'\r\n >\r\n Split\r\n </Button>\r\n </Box>\r\n \r\n <TextField\r\n label=\"Merged Cell Value\"\r\n value={merge.value}\r\n onChange={(e) => {\r\n setTableData(prev => ({\r\n ...prev,\r\n mergedCells: prev.mergedCells?.map((m, i) => \r\n i === index ? { ...m, value: e.target.value } : m\r\n ) || []\r\n }));\r\n }}\r\n size=\"small\"\r\n fullWidth\r\n multiline\r\n rows={2}\r\n />\r\n </Box>\r\n ))}\r\n </Box>\r\n )}\r\n </Box>\r\n )}\r\n\r\n <Dialog\r\n open={mergeDialogOpen}\r\n onClose={() => setMergeDialogOpen(false)}\r\n maxWidth=\"sm\"\r\n fullWidth\r\n >\r\n <DialogTitle>\r\n <Typography type=\"s2\" weight=\"medium\">\r\n Merge Selected Cells\r\n </Typography>\r\n </DialogTitle>\r\n <DialogContent>\r\n <Typography type=\"s4\" color=\"theme.secondary.700\" sx={{ mb: 2 }}>\r\n You are about to merge {selectedCells.length} selected cells in {selectedCells[0]?.section}. \r\n Enter the value for the merged cell:\r\n </Typography>\r\n \r\n <TextField\r\n label=\"Merged Cell Value\"\r\n value={mergeValue}\r\n onChange={(e) => setMergeValue(e.target.value)}\r\n fullWidth\r\n multiline\r\n rows={3}\r\n sx={{ mt: 1 }}\r\n />\r\n \r\n <Alert severity=\"info\" sx={{ mt: 2 }}>\r\n The merged cell will span from row {Math.min(...selectedCells.map(c => c.row)) + 1} to {Math.max(...selectedCells.map(c => c.row)) + 1} \r\n and column {Math.min(...selectedCells.map(c => c.col)) + 1} to {Math.max(...selectedCells.map(c => c.col)) + 1} in {selectedCells[0]?.section}.\r\n </Alert>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button onClick={() => setMergeDialogOpen(false)}>\r\n Cancel\r\n </Button>\r\n <Button \r\n onClick={mergeCells}\r\n variant=\"contained\"\r\n color=\"primary\"\r\n >\r\n Merge Cells\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n </>\r\n );\r\n};\r\n\r\nexport default TableControls;","/* eslint-disable unused-imports/no-unused-vars */\r\nimport React from 'react';\r\nimport {\r\n Box,\r\n Slider,\r\n InputAdornment,\r\n} from '@mui/material';\r\nimport ColorLensIcon from '@mui/icons-material/ColorLens';\r\nimport Typography from '../../../../components/typography/typography';\r\nimport TextField from '../../../../components/text-field/text-field';\r\n\r\ninterface SignatureControlsProps {\r\n attrs: Record<string, any>;\r\n updateAttrs: (attr: Record<string, any>) => void;\r\n}\r\n\r\nconst SignatureControls: React.FC<SignatureControlsProps> = ({\r\n attrs,\r\n updateAttrs,\r\n}) => {\r\n const { styles } = attrs\r\n return (\r\n <>\r\n <Box sx={{ mb: 1 }}>\r\n <Typography type=\"s5\" color='theme.secondary.800' weight='medium'>\r\n Font Size\r\n </Typography>\r\n <Slider\r\n value={styles?.fontSize}\r\n onChange={(_, value) => updateAttrs({ styles :{ fontSize: value as number }})}\r\n min={10}\r\n max={20}\r\n step={1}\r\n valueLabelDisplay=\"auto\"\r\n size=\"small\"\r\n sx={(theme) => ({\r\n '& .MuiSlider-rail': {\r\n color: theme.palette.theme.primary[500],\r\n },\r\n '& .MuiSlider-thumb': {\r\n color: theme.palette.theme.primary[800],\r\n },\r\n '& .MuiSlider-track': {\r\n color: theme.palette.theme.primary[600],\r\n },\r\n })}\r\n />\r\n </Box>\r\n <Box sx={{ mb: 2, }}>\r\n <TextField\r\n label=\"Text Color\"\r\n type=\"color\"\r\n value={styles?.color}\r\n onChange={(e) => updateAttrs({ styles :{ color: e.target.value }})}\r\n fullWidth\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <ColorLensIcon fontSize=\"small\" />\r\n </InputAdornment>\r\n ),\r\n }}\r\n />\r\n </Box>\r\n </>\r\n );\r\n};\r\n\r\nexport default SignatureControls;","/* eslint-disable unused-imports/no-unused-vars */\r\nimport React from 'react';\r\nimport { Box, Slider} from '@mui/material';\r\nimport Typography from '../../../../components/typography/typography';\r\nimport AlignmentControl from './AlignmentControl';\r\n\r\ninterface CodeControlsProps {\r\n // type: 'qr-code' | 'bar-code';\r\n attrs: Record<string, any>;\r\n updateAttrs: (attr: Record<string, any>) => void;\r\n}\r\n\r\nconst CodeControls: React.FC<CodeControlsProps> = ({\r\n // type,\r\n attrs,\r\n updateAttrs,\r\n}) => {\r\n const { styles } = attrs\r\n\r\n const updateStyles = (styles: Record<string, any>) => {\r\n updateAttrs({ styles });\r\n }\r\n\r\n const handleAlignmentChange = (\r\n event: React.MouseEvent<HTMLElement>,\r\n newAlignment: string | null,\r\n ) => {\r\n if (newAlignment !== null) {\r\n updateStyles({ textAlign: newAlignment });\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <Box sx={{ mb: 2 }}>\r\n <Typography type=\"s3\" color='theme.neutral.800'>\r\n Size (px)\r\n </Typography>\r\n <Slider\r\n value={styles.fontSize}\r\n onChange={(_, value) => updateStyles({ fontSize: value as number })}\r\n min={10}\r\n max={25}\r\n step={5}\r\n valueLabelDisplay=\"auto\"\r\n size=\"small\"\r\n sx={(theme) => ({\r\n '& .MuiSlider-rail': {\r\n color: theme.palette.theme.primary[500],\r\n },\r\n '& .MuiSlider-thumb': {\r\n color: theme.palette.theme.primary[800],\r\n },\r\n '& .MuiSlider-track': {\r\n color: theme.palette.theme.primary[600],\r\n },\r\n })}\r\n />\r\n </Box>\r\n <AlignmentControl alignment={styles?.textAlign} onAlignmentChange={handleAlignmentChange} displayLabel/>\r\n </>\r\n );\r\n};\r\n\r\nexport default CodeControls;","/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable react-hooks/exhaustive-deps */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React, { useState, useEffect, useMemo, useCallback } from 'react';\r\nimport {\r\n Box,\r\n Paper,\r\n IconButton,\r\n FormControl,\r\n MenuItem,\r\n Tooltip,\r\n} from '@mui/material';\r\nimport CloseIcon from '@mui/icons-material/Close';\r\nimport { Save } from '../../../components/icons';\r\nimport Typography from '../../../components/typography/typography';\r\n\r\n// Import sub-components\r\nimport TextControls from './controllers/TextControls';\r\nimport ButtonControls from './controllers/ButtonControls';\r\nimport ImageControls from './controllers/ImageControls';\r\nimport DividerControls from './controllers/DividerControls';\r\nimport TableControls from './controllers/TableControls';\r\nimport SignatureControls from './controllers/SignatureControls';\r\nimport CodeControls from './controllers/CodeControls';\r\nimport Select from '../../../components/select/select';\r\nimport { EnhancedSectionData, ElementType } from '../types/editor';\r\nimport { initialStyles } from '../utils/constant';\r\nimport { extractStyles, generateInlineStyles, getInitialSectionData } from '../utils/common';\r\n// import { useCKEditorStyleExtractor } from '../utils/style-extractor';\r\n\r\n// Shared types for SectionFormatPanel and sub-components\r\nexport interface TableColumn {\r\n id: string;\r\n header: string;\r\n placeholder?: string;\r\n}\r\n\r\nexport interface TableRow {\r\n [key: string]: string | number | boolean;\r\n}\r\n\r\nexport interface CellMerge {\r\n section: 'thead' | 'tbody';\r\n rowStart: number;\r\n rowEnd: number;\r\n colStart: number;\r\n colEnd: number;\r\n value: string;\r\n}\r\n\r\nexport interface TableData {\r\n name?: string; // Added name property for #each iteration\r\n columns: TableColumn[];\r\n rows: TableRow[];\r\n border: boolean;\r\n mergedCells?: CellMerge[];\r\n}\r\n\r\ninterface SectionData {\r\n type: 'text' | 'text-block' | 'heading' | 'heading-2' | 'heading-3' | 'heading-4' | 'buttons' | 'image' | 'divider' | 'table' | 'signature' | 'qr-code' | 'bar-code';\r\n content: string;\r\n attributes?: {\r\n styles?: any;\r\n placeholders?: Record<string, string>;\r\n tableData?: TableData;\r\n [key: string]: any;\r\n };\r\n}\r\n\r\ninterface SectionFormatPanelProps {\r\n section: SectionData | undefined;\r\n onClose: () => void;\r\n onUpdate: (data: Partial<EnhancedSectionData>) => void;\r\n placeholders: Record<string, any>[];\r\n relation_table?:any;\r\n handleSave?: () => void;\r\n}\r\n\r\nconst sectionTypes = ['text','text-block','heading','heading-2','heading-3','heading-4','buttons','image','divider','table','signature','qr-code','bar-code']\r\n\r\nconst SectionFormatPanel: React.FC<SectionFormatPanelProps> = ({ \r\n section, \r\n onClose, \r\n onUpdate,\r\n placeholders,\r\n relation_table,\r\n handleSave }) => {\r\n // const { applyStylesToHtml } = useCKEditorStyleExtractor()\r\n // const [plainContent, setPlainContent] = useState('');\r\n const sectionType = useMemo(() => section?.type || 'text', [section?.type]);\r\n const content = useMemo(() => section?.content || 'text', [section?.content]);\r\n const [formatOptions, setFormatOptions] = useState<string[]>([]);\r\n const[rowLevel, setRowLevel] = useState<boolean>((section?.attributes as any)?.rowLevel || false);\r\n const [tableData, setTableData] = useState<TableData>({\r\n name: '', // Initialize with empty name\r\n columns: [\r\n { id: 'col1', header: 'Column 1' },\r\n { id: 'col2', header: 'Column 2' },\r\n { id: 'col3', header: 'Column 3' }\r\n ],\r\n rows: [\r\n { col1: '', col2: '', col3: '' }\r\n ],\r\n border: true,\r\n mergedCells: []\r\n });\r\n const [isInitialLoad, setIsInitialLoad] = useState(true);\r\n const [selectedContentAttrObj, setSelectedContentAttrObj] = useState(extractStyles(content, section?.type));\r\n\r\n // Initialize table data from section attributes\r\n useEffect(() => {\r\n if (section && section.type === 'table') {\r\n // If section has stored table data, use it\r\n if (section.attributes?.tableData) {\r\n setTableData(section.attributes.tableData);\r\n } else {\r\n // Try to extract table data from HTML content\r\n const extractedTableData = extractTableDataFromHTML(section.content);\r\n if (extractedTableData) {\r\n setTableData(extractedTableData);\r\n setRowLevel((section?.attributes as any)?.rowLevel || false);\r\n }\r\n }\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (section && !isInitialLoad) {\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = section.content;\r\n const text = tempDiv.textContent || '';\r\n // setPlainContent(text);\r\n setSelectedContentAttrObj(extractStyles(section.content, section?.type)?.styles)\r\n setIsInitialLoad(false);\r\n }\r\n }, [section]);\r\n\r\n // Extract table data from HTML content\r\n const extractTableDataFromHTML = (htmlContent: string): TableData | null => {\r\n try {\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(htmlContent, 'text/html');\r\n const table = doc.querySelector('table');\r\n \r\n if (!table) return null;\r\n\r\n const headerRows = table.querySelectorAll('thead tr');\r\n const bodyRows = table.querySelectorAll('tbody tr');\r\n\r\n if (headerRows.length === 0) return null;\r\n\r\n // Extract columns from the first header row\r\n const headerCells = headerRows[0].querySelectorAll('th');\r\n const columns: TableColumn[] = Array.from(headerCells).map((th, index) => ({\r\n id: `col${index + 1}`,\r\n header: th.textContent?.trim() || `Column ${index + 1}`\r\n }));\r\n\r\n // Extract merged cells from thead\r\n const mergedCells: CellMerge[] = [];\r\n Array.from(headerRows).forEach((row, rowIndex) => {\r\n const cells = row.querySelectorAll('th');\r\n cells.forEach((cell, colIndex) => {\r\n const rowSpan = parseInt(cell.getAttribute('rowspan') || '1');\r\n const colSpan = parseInt(cell.getAttribute('colspan') || '1');\r\n if (rowSpan > 1 || colSpan > 1) {\r\n mergedCells.push({\r\n section: 'thead',\r\n rowStart: rowIndex,\r\n rowEnd: rowIndex + rowSpan - 1,\r\n colStart: colIndex,\r\n colEnd: colIndex + colSpan - 1,\r\n value: cell.textContent?.trim() || ''\r\n });\r\n }\r\n });\r\n });\r\n\r\n // Extract rows\r\n const rows: TableRow[] = Array.from(bodyRows).map(row => {\r\n const cells = row.querySelectorAll('td');\r\n const rowData: TableRow = {};\r\n \r\n cells.forEach((cell, index) => {\r\n if (index < columns.length) {\r\n rowData[columns[index].id] = cell.textContent?.trim() || '';\r\n }\r\n });\r\n \r\n return rowData;\r\n });\r\n\r\n // Extract merged cells from tbody\r\n Array.from(bodyRows).forEach((row, rowIndex) => {\r\n const cells = row.querySelectorAll('td');\r\n cells.forEach((cell, colIndex) => {\r\n const rowSpan = parseInt(cell.getAttribute('rowspan') || '1');\r\n const colSpan = parseInt(cell.getAttribute('colspan') || '1');\r\n if (rowSpan > 1 || colSpan > 1) {\r\n mergedCells.push({\r\n section: 'tbody',\r\n rowStart: rowIndex,\r\n rowEnd: rowIndex + rowSpan - 1,\r\n colStart: colIndex,\r\n colEnd: colIndex + colSpan - 1,\r\n value: cell.textContent?.trim() || ''\r\n });\r\n }\r\n });\r\n });\r\n\r\n return {\r\n name: '', // Default empty name\r\n columns,\r\n rows: rows.length > 0 ? rows : [{}],\r\n border: true,\r\n mergedCells\r\n };\r\n } catch (error) {\r\n return null;\r\n }\r\n };\r\n\r\n // Get placeholder value for table generation\r\n const getPlaceholderValue = (placeholderKey: string): string => {\r\n const placeholder = placeholders.find(p => p.value === placeholderKey);\r\n if (!placeholder) return '';\r\n \r\n // Return actual value or generate sample based on type\r\n if (typeof placeholder.actualValue !== 'undefined') {\r\n return String(placeholder.actualValue);\r\n }\r\n \r\n switch (placeholder.type) {\r\n case 'date':\r\n return new Date().toLocaleDateString();\r\n case 'datetime':\r\n return new Date().toLocaleString();\r\n case 'number':\r\n return '123';\r\n case 'currency':\r\n return '$1,234.56';\r\n case 'email':\r\n return 'example@domain.com';\r\n case 'phone':\r\n return '+1 (555) 123-4567';\r\n case 'url':\r\n return 'https://example.com';\r\n default:\r\n return placeholder.label || placeholder.value;\r\n }\r\n };\r\n\r\n const generateContent = useCallback((attrs?: Record<any, any>): string => {\r\n const { src, alt, styles: eStyles, text, placeholder, placeholders: tPlaceholders } = attrs || section?.attributes || selectedContentAttrObj || {}\r\n const styles = {\r\n ...initialStyles[sectionType],\r\n ...eStyles,\r\n ...selectedContentAttrObj?.styles,\r\n ...attrs?.styles\r\n }\r\n\r\n const inlineStyles = generateInlineStyles(styles);\r\n \r\n // For buttons, images, dividers, and codes - use the existing logic\r\n if (sectionType === 'buttons') {\r\n return `<button style=\"${inlineStyles}\">${text || 'Button Text'}</button>`;\r\n } else if (sectionType === 'image') {\r\n let imgInlineStyles: string = inlineStyles;\r\n if(styles?.is_bordered) {\r\n styles.padding = '10px';\r\n imgInlineStyles = generateInlineStyles(styles);\r\n } else{\r\n styles.padding = '0';\r\n imgInlineStyles = generateInlineStyles(styles);\r\n }\r\n return `<img src=\"${src || ''}\" alt=\"${alt || ''}\" style=\"${imgInlineStyles}\" />`;\r\n } else if (sectionType === 'divider') {\r\n return `<hr style=\"${inlineStyles}\" />`;\r\n } else if (sectionType === 'table') {\r\n const { border, borderStyle, borderColor, ...rest } = styles;\r\n const tInlineStyles = generateInlineStyles(styles.is_bordered ? styles : rest); \r\n const tHeadInlineStyles: string = generateInlineStyles(styles.tHead || {});\r\n const tBodyInlineStyles: string = generateInlineStyles(styles.tBody || {});\r\n const thCellInlineStyles: string = generateInlineStyles({\r\n ...(styles.thCells || {}), \r\n ...(styles.is_bordered ? { border, borderStyle, borderColor } : {}) \r\n });\r\n const tbCellInlineStyles: string = generateInlineStyles({\r\n ...(styles.tbCells || {}), \r\n ...(styles.is_bordered ? { border, borderStyle, borderColor } : {})\r\n });\r\n\r\n // Helper function to check if a cell is part of a merge\r\n const getCellMergeInfo = (section: 'thead' | 'tbody', rowIndex: number, colIndex: number) => {\r\n return tableData.mergedCells?.find(m => \r\n m.section === section &&\r\n rowIndex >= m.rowStart && rowIndex <= m.rowEnd &&\r\n colIndex >= m.colStart && colIndex <= m.colEnd\r\n );\r\n };\r\n\r\n // Generate header row with merge support\r\n const headerCellsHTML = tableData.columns.map((column, colIndex) => {\r\n const mergeInfo = getCellMergeInfo('thead', 0, colIndex);\r\n \r\n if (mergeInfo && (colIndex !== mergeInfo.colStart)) {\r\n return '';\r\n }\r\n\r\n const mergeAttributes = mergeInfo ? \r\n ` rowspan=\"${mergeInfo.rowEnd - mergeInfo.rowStart + 1}\" colspan=\"${mergeInfo.colEnd - mergeInfo.colStart + 1}\"` : '';\r\n \r\n const cellValue = mergeInfo ? mergeInfo.value : column.header;\r\n\r\n return `<th style=\"${thCellInlineStyles}\"${mergeAttributes}>${cellValue}</th>`;\r\n }).filter(cell => cell !== '').join('');\r\n\r\n // Generate table body with #each loop using tableData.name\r\n let tableRowsHTML = '';\r\n \r\n // Check if we should use #each loop with tableData.name\r\n if (tableData.name) {\r\n // Generate template with #each handlebars syntax\r\n const rowTemplate = tableData.columns.map((column, colIndex) => {\r\n const mergeInfo = getCellMergeInfo('tbody', 0, colIndex); // Use first row as template\r\n \r\n if (mergeInfo && (colIndex !== mergeInfo.colStart)) {\r\n return '';\r\n }\r\n\r\n const mergeAttributes = mergeInfo ? \r\n ` rowspan=\"${mergeInfo.rowEnd - mergeInfo.rowStart + 1}\" colspan=\"${mergeInfo.colEnd - mergeInfo.colStart + 1}\"` : '';\r\n \r\n // Use handlebars template syntax for dynamic content\r\n let cellTemplate = '';\r\n \r\n // Handle special cases\r\n if (column.id === 'index' || column.id === 'incrementIndex') {\r\n cellTemplate = `{{incrementIndex @index}}`;\r\n } else if (column.id.includes('.')) {\r\n // Handle nested properties (like items.sku, tax_code_data.[0].rate)\r\n const cellValue = tableData?.rows?.[0][column.id];\r\n cellTemplate = typeof cellValue === 'string' ? cellValue.replace(tableData.name + '.', '') : String(cellValue || '');\r\n } else {\r\n // Direct property access\r\n const cellValue = tableData?.rows?.[0][column.id];\r\n cellTemplate = typeof cellValue === 'string' ? cellValue.replace(tableData.name + '.', '') : String(cellValue || '');\r\n }\r\n\r\n return `<td style=\"${tbCellInlineStyles}\"${mergeAttributes}>${cellTemplate}</td>`;\r\n }).filter(cell => cell !== '').join('');\r\n\r\n // Add zebra striping logic if enabled\r\n const rowStyleTemplate = styles.tBody?.zebraStriping \r\n ? `{{#if (isOdd @index)}}${tBodyInlineStyles}; background-color: ${styles.tBody.alternateRowColor || '#f9f9f9'}{{else}}${tBodyInlineStyles}{{/if}}`\r\n : tBodyInlineStyles;\r\n\r\n tableRowsHTML = `{{#each ${tableData.name}}}\r\n <tr style=\"${rowStyleTemplate}\">\r\n ${rowTemplate}\r\n </tr>\r\n {{/each}}`;\r\n \r\n } else {\r\n // Fallback to static rows when no tableData.name is provided\r\n tableRowsHTML = tableData.rows.map((row, rowIndex) => {\r\n const rowStyleAddition = styles.tBody?.zebraStriping && rowIndex % 2 === 1 \r\n ? `; background-color: ${styles.tBody.alternateRowColor || '#f9f9f9'}` \r\n : '';\r\n \r\n const cellsHTML = tableData.columns.map((column, colIndex) => {\r\n const mergeInfo = getCellMergeInfo('tbody', rowIndex, colIndex);\r\n \r\n if (mergeInfo && (rowIndex !== mergeInfo.rowStart || colIndex !== mergeInfo.colStart)) {\r\n return '';\r\n }\r\n\r\n let cellValue = row[column.id] || '';\r\n const keys = Object.keys(row)\r\n if(keys.includes(`${column.id}_static`)) {\r\n cellValue = row[`${column.id}_static`] || '';\r\n }\r\n if (!cellValue && tPlaceholders?.[column.id]) {\r\n cellValue = getPlaceholderValue(tPlaceholders[column.id]);\r\n }\r\n\r\n const mergeAttributes = mergeInfo ? \r\n ` rowspan=\"${mergeInfo.rowEnd - mergeInfo.rowStart + 1}\" colspan=\"${mergeInfo.colEnd - mergeInfo.colStart + 1}\"` : '';\r\n \r\n const finalCellValue = mergeInfo ? mergeInfo.value : cellValue;\r\n\r\n return `<td style=\"${tbCellInlineStyles}\"${mergeAttributes}>${finalCellValue}</td>`;\r\n }).filter(cell => cell !== '').join('');\r\n \r\n return `<tr style=\"${tBodyInlineStyles}${rowStyleAddition}\">${cellsHTML}</tr>`;\r\n }).join('');\r\n }\r\n \r\n return `\r\n <table style=\"${tInlineStyles}\">\r\n <thead>\r\n <tr style=\"${tHeadInlineStyles}\">\r\n ${headerCellsHTML}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n ${tableRowsHTML}\r\n </tbody>\r\n </table>\r\n `;\r\n } else if (sectionType === 'qr-code' || sectionType === 'bar-code') {\r\n return `<div style=\"${inlineStyles}\">${placeholder}</div>`;\r\n }\r\n \r\n // For text-based sections, parse and apply styles to existing HTML tags\r\n const hasHtmlTags = /<\\/?[a-z][\\s\\S]*>/i.test(content);\r\n \r\n if (!hasHtmlTags) {\r\n // If no HTML tags, wrap according to section type\r\n switch (sectionType) {\r\n case 'text':\r\n case 'text-block':\r\n return `<p style=\"${inlineStyles}\">${content}</p>`;\r\n case 'heading':\r\n return `<h1 style=\"${inlineStyles}\">${content}</h1>`;\r\n case 'heading-2':\r\n return `<h2 style=\"${inlineStyles}\">${content}</h2>`;\r\n case 'heading-3':\r\n return `<h3 style=\"${inlineStyles}\">${content}</h3>`;\r\n case 'heading-4':\r\n return `<h4 style=\"${inlineStyles}\">${content}</h4>`;\r\n case 'signature':\r\n return `<div style=\"${inlineStyles}\">${content}</div>`;\r\n default:\r\n return `<p style=\"${inlineStyles}\">${content}</p>`;\r\n }\r\n } else {\r\n // Create a temporary DOM element to manipulate the HTML\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(`<div>${content}</div>`, 'text/html');\r\n const container = doc.body.firstChild as Element;\r\n \r\n // Process all child elements\r\n if (container && container.nodeType === Node.ELEMENT_NODE) {\r\n const elements = container.querySelectorAll('*');\r\n\r\n elements.forEach(element => {\r\n // Skip processing script tags or other special elements\r\n if (element.tagName === 'SCRIPT' || element.tagName === 'STYLE') {\r\n return;\r\n }\r\n \r\n // Get existing style and merge with new style\r\n const existingStyle = element.getAttribute('style') || '';\r\n \r\n // Extract properties from existing style\r\n const existingProps = {};\r\n existingStyle.split(';').forEach(prop => {\r\n const [key, value] = prop.split(':').map(item => item.trim());\r\n if (key && value) {\r\n existingProps[key] = value;\r\n }\r\n });\r\n \r\n // Parse the base style and prepare for merging\r\n const newStyleProps = {};\r\n inlineStyles.split(';').forEach(prop => {\r\n const [key, value] = prop.split(':').map(item => item.trim());\r\n if (key && value) {\r\n newStyleProps[key] = value;\r\n }\r\n });\r\n \r\n // Additional styles based on tag type\r\n if (element.tagName === 'P' || element.tagName === 'DIV') {\r\n newStyleProps['line-height'] = '1.5';\r\n } else if (['H1', 'H2', 'H3', 'H4', 'H5', 'H6'].includes(element.tagName)) {\r\n newStyleProps['line-height'] = '1.2';\r\n newStyleProps['margin'] = '0.5em 0';\r\n }\r\n \r\n // Merge styles, new styles override existing ones\r\n const mergedProps = { ...existingProps, ...newStyleProps };\r\n \r\n // Convert back to style string\r\n const mergedStyle = Object.entries(mergedProps)\r\n .filter(([key, value]) => key && value)\r\n .map(([key, value]) => `${key}: ${value}`)\r\n .join('; ');\r\n \r\n element.setAttribute('style', mergedStyle);\r\n });\r\n \r\n return container.innerHTML;\r\n }\r\n \r\n // Fallback to original content if parsing fails\r\n return content;\r\n }\r\n }, [JSON.stringify(section)]);\r\n\r\n // Local save function - renamed to avoid conflict with handleSave prop\r\n const saveSection = () => {\r\n const updatedContent = generateContent();\r\n \r\n const updatedSection = {\r\n content: updatedContent, \r\n type: sectionType as ElementType,\r\n rowLevel: rowLevel,\r\n name: tableData.name || '',\r\n attributes: {\r\n ...(section?.attributes || {}),\r\n ...(sectionType === 'table' ? { tableData } : {})\r\n },\r\n is_edited_from_source: (section as EnhancedSectionData)?.is_edited_from_source || false\r\n };\r\n \r\n onUpdate(updatedSection);\r\n };\r\nuseEffect(() => {\r\n saveSection();\r\n},[tableData])\r\n /**\r\n * Updates section attributes and triggers content regeneration.\r\n * Optimized to avoid unnecessary property spreading and glitches.\r\n */\r\n const updateAttrs = (prop: Record<string, any>) => {\r\n if (!section) return;\r\n\r\n // Merge styles safely\r\n const mergedStyles = {\r\n ...(section.attributes?.styles || {}),\r\n ...(prop.styles || {})\r\n };\r\n\r\n // Merge attributes, giving priority to new props\r\n const mergedAttributes = {\r\n ...(section.attributes || {}),\r\n ...prop,\r\n styles: mergedStyles,\r\n ...(sectionType === 'table' ? { tableData } : {})\r\n };\r\n\r\n // Prepare updated section object (exclude 'id' if present)\r\n const { id, ...sectionRest } = section as any;\r\n\r\n // Generate updated content based on new attributes\r\n const updatedContent = generateContent(mergedAttributes);\r\n setSelectedContentAttrObj(mergedAttributes)\r\n\r\n // Compose the update payload, omitting unknown properties\r\n onUpdate({\r\n ...sectionRest,\r\n content: updatedContent,\r\n attributes: mergedAttributes\r\n });\r\n };\r\n\r\n // Update table data and trigger content regeneration\r\n const handleTableDataUpdate = (newTableData: TableData) => {\r\n setTableData(newTableData);\r\n \r\n // Trigger immediate update with new table data\r\n const updatedAttrs = {\r\n ...(section?.attributes || {}),\r\n tableData: newTableData\r\n };\r\n \r\n // const updatedContent = generateContent(updatedAttrs);\r\n // onUpdate({\r\n // ...section,\r\n // content: updatedContent,\r\n // attributes: updatedAttrs\r\n // });\r\n saveSection();\r\n };\r\n\r\n const handleTypeChange = (t) => {\r\n const dt = getInitialSectionData(t)\r\n \r\n onUpdate({ \r\n ...section, \r\n ...dt\r\n });\r\n \r\n // Reset table data when switching types\r\n if (t === 'table') {\r\n setTableData({\r\n name: '', // Initialize with empty name\r\n columns: [\r\n { id: 'col1', header: 'Column 1' },\r\n { id: 'col2', header: 'Column 2' },\r\n { id: 'col3', header: 'Column 3' }\r\n ],\r\n rows: [\r\n { col1: '', col2: '', col3: '' }\r\n ],\r\n border: true,\r\n mergedCells: []\r\n });\r\n }\r\n }\r\n\r\n return (\r\n <Paper\r\n elevation={3}\r\n sx={{\r\n width: { xs: '100%', sm: 320, lg: 390 },\r\n height: '100%',\r\n overflow: 'auto',\r\n borderLeft: '1px solid',\r\n borderColor: 'divider',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n bgcolor: 'background.paper',\r\n boxShadow: 'none',\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n p: 2,\r\n borderBottom: '1px solid',\r\n borderColor: 'divider',\r\n bgcolor: 'grey.50',\r\n }}\r\n >\r\n <Typography type=\"s1\" weight='bold' color='theme.neutral.1000'>\r\n Format {sectionType ? sectionType?.charAt(0)?.toUpperCase() + sectionType?.slice(1).replace(/-/g, ' ') : ''}\r\n </Typography>\r\n <Tooltip title=\"Save and Close\">\r\n <Box>\r\n <IconButton size=\"small\" onClick={() => {\r\n saveSection();\r\n handleSave?.();\r\n onClose();\r\n }} aria-label=\"Save\">\r\n <Save fontSize=\"small\" />\r\n </IconButton>\r\n <IconButton size=\"small\" onClick={onClose} aria-label=\"Close\">\r\n <CloseIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Box>\r\n </Tooltip>\r\n </Box>\r\n\r\n <Box sx={{ p: 2, flex: 1,pb:10, overflowY: 'auto' }}>\r\n <Box sx={{ mb: 2 }}>\r\n <FormControl size=\"small\" fullWidth>\r\n <Select\r\n value={section?.type}\r\n onChange={(e) => handleTypeChange(e.target.value)}\r\n renderValue={v => v ? v.charAt(0).toUpperCase() + v.slice(1).replace(/-/g, ' ') : ''}\r\n label='Select Preset'\r\n displayEmpty\r\n >\r\n {sectionTypes.map((type) => (\r\n <MenuItem key={type} value={type}>\r\n <Typography type='s4' color='theme.secondary.1000'>{type.charAt(0).toUpperCase() + type.slice(1).replace(/-/g, ' ')}</Typography>\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Box>\r\n \r\n {section && (sectionType === 'text' || \r\n sectionType === 'heading' || \r\n sectionType === 'heading-2' || \r\n sectionType === 'heading-3' || \r\n sectionType === 'heading-4') && (\r\n <TextControls\r\n attrs={section?.attributes || {}}\r\n updateAttrs={updateAttrs}\r\n />\r\n )}\r\n {sectionType === 'buttons' && (\r\n <ButtonControls\r\n attrs={section?.attributes || {}}\r\n updateAttrs={updateAttrs}\r\n />\r\n )}\r\n {sectionType === 'image' && (\r\n <ImageControls\r\n attrs={section?.attributes || {}}\r\n updateAttrs={updateAttrs}\r\n />\r\n )}\r\n {sectionType === 'divider' && (\r\n <DividerControls\r\n attrs={section?.attributes || {}}\r\n updateAttrs={updateAttrs}\r\n />\r\n )}\r\n {sectionType === 'table' && (\r\n <TableControls\r\n tableData={{\r\n ...tableData,\r\n rows: tableData.rows.map(row => {\r\n const convertedRow: Record<string, string> = {};\r\n Object.keys(row).forEach(key => {\r\n convertedRow[key] = String(row[key] ?? '');\r\n });\r\n return convertedRow;\r\n })\r\n }}\r\n setTableData={(value) => {\r\n handleTableDataUpdate({\r\n ...value,\r\n border: tableData.border,\r\n name: tableData.name || ''\r\n });\r\n }}\r\n attrs={section?.attributes || {}}\r\n updateAttrs={updateAttrs}\r\n placeholders={placeholders}\r\n handleSave={handleSave}\r\n setParentRowLevel={setRowLevel}\r\n levelType={rowLevel}\r\n relation_table={relation_table}\r\n />\r\n )}\r\n {sectionType === 'signature' && (\r\n <SignatureControls\r\n attrs={section?.attributes || {}}\r\n updateAttrs={updateAttrs}\r\n />\r\n )}\r\n {section && (sectionType === 'qr-code' || sectionType === 'bar-code') && (\r\n <CodeControls\r\n attrs={section?.attributes || {}}\r\n updateAttrs={updateAttrs}\r\n />\r\n )}\r\n </Box>\r\n </Paper>\r\n );\r\n};\r\n\r\nexport default SectionFormatPanel;","/* eslint-disable react-hooks/exhaustive-deps */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React, { useState, useCallback, useEffect } from 'react';\r\nimport { useDraggable } from '@dnd-kit/core';\r\nimport { useDropzone } from 'react-dropzone';\r\nimport {\r\n Box,\r\n Divider,\r\n ListItem,\r\n ListItemIcon,\r\n ListItemText,\r\n Grid,\r\n Accordion,\r\n AccordionSummary,\r\n AccordionDetails,\r\n Typography,\r\n CircularProgress,\r\n Alert,\r\n} from '@mui/material';\r\nimport {\r\n Heading,\r\n Text as TextIcon,\r\n Image as ImageIcon,\r\n Table as TableIcon,\r\n Blocks as SignatureIcon,\r\n QrCode as QrCodeIcon,\r\n Barcode as BarcodeIcon,\r\n FileCode,\r\n} from 'lucide-react';\r\nimport { styled } from '@mui/material/styles';\r\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\r\nimport { getV1Drive, postV1Drive } from '../../../api-client/api.drive/api';\r\nimport SearchBar from '../../../components/search-bar/search-bar';\r\nimport { getToken, uploadFiles } from '../../../utils/common';\r\nimport { getApiConfig } from '@/utils';\r\nimport Button from '../../../components/button/button';\r\n\r\nconst StyledListItem = styled(ListItem)(({ theme }) => ({\r\n padding: theme.spacing(1.5),\r\n cursor: 'grab',\r\n borderRadius: theme.shape.borderRadius,\r\n '&:hover': {\r\n backgroundColor: theme.palette.grey[100],\r\n },\r\n '&.dragging': {\r\n opacity: 0.5,\r\n },\r\n}));\r\n\r\nconst DropzoneBox = styled(Box)(({ theme }) => ({\r\n border: `2px dashed ${theme.palette.grey[400]}`,\r\n borderRadius: theme.shape.borderRadius,\r\n padding: theme.spacing(2),\r\n textAlign: 'center',\r\n backgroundColor: theme.palette.grey[50],\r\n cursor: 'pointer',\r\n '&:hover': {\r\n backgroundColor: theme.palette.grey[100],\r\n },\r\n}));\r\n\r\nconst SidebarItem = ({ id, icon, label, imageUrl }: { id: string; icon?: React.ReactElement; label: string; imageUrl?: string }) => {\r\n // Extract the element type from the sidebar item id\r\n const elementType = typeof id === 'string' ? id.replace('sidebar-', '') : id;\r\n\r\n const { attributes, listeners, setNodeRef, isDragging } = useDraggable({\r\n id,\r\n data: {\r\n // Pass the correct type based on the id\r\n type: imageUrl ? 'image' : elementType,\r\n imageUrl,\r\n label,\r\n },\r\n });\r\n\r\n return (\r\n <StyledListItem\r\n ref={setNodeRef}\r\n {...listeners}\r\n {...attributes}\r\n className={isDragging ? 'dragging' : ''}\r\n sx={{ border: '1px solid', borderColor: 'grey.200', p: 0.75 }}\r\n >\r\n {imageUrl ? (\r\n <img\r\n src={imageUrl}\r\n alt={label}\r\n style={{ width: '100%', height: 140, objectFit: 'cover', marginRight: 8 }}\r\n />\r\n ) : (\r\n <>\r\n <ListItemIcon sx={{ minWidth: 40 }}>{icon}</ListItemIcon>\r\n <ListItemText primary={label} primaryTypographyProps={{ variant: 'body2' }} />\r\n </>\r\n )}\r\n </StyledListItem>\r\n );\r\n};\r\n\r\ninterface EditorSidebarProps {\r\n onHtmlUpload?: (html: string) => void;\r\n}\r\n\r\nconst EditorSidebar = ({ onHtmlUpload }: EditorSidebarProps) => {\r\n const [expanded, setExpanded] = useState('text');\r\n const [uploadedImages, setUploadedImages] = useState([]);\r\n const [uploading, setUploading] = useState(false);\r\n const [uploadingHtml, setUploadingHtml] = useState(false);\r\n const [error, setError] = useState(null);\r\n\r\n const handleChange = (panel) => (event, isExpanded) => {\r\n setExpanded(isExpanded ? panel : false);\r\n };\r\n\r\n const onDrop = useCallback(async (acceptedFiles) => {\r\n setUploading(true);\r\n setError(null);\r\n try {\r\n for (const file of acceptedFiles) {\r\n const uFiles = await uploadFiles([file], \"document\");\r\n const token = getToken();\r\n const payload = {\r\n ...token,\r\n \"x-timezone\": String(token[\"x-timezone\"] || \"\"),\r\n \"title\": file?.name.split(\".\")[0],\r\n \"path\": \"/\",\r\n \"is_private\": true,\r\n \"is_directory\": false,\r\n \"file_size\": file.size,\r\n \"is_child\": false,\r\n \"file_extension\": file?.name.split(\".\")[1],\r\n \"type\": \"image\",\r\n \"mime_type\": file.type,\r\n \"url\": `${getApiConfig().s3BucketUrl}${uFiles[0]}`\r\n }\r\n // Replace with your actual API endpoint\r\n await postV1Drive(payload);\r\n\r\n setUploadedImages((prev) => [\r\n ...prev,\r\n {\r\n id: `uploaded-image-${Date.now()}-${Math.random()}`,\r\n url: `${getApiConfig().s3BucketUrl}${uFiles[0]}`, // Assume API returns imageUrl\r\n name: file.name,\r\n },\r\n ]);\r\n }\r\n } catch (err) {\r\n setError('Failed to upload image. Please try again.');\r\n } finally {\r\n setUploading(false);\r\n }\r\n }, []);\r\n\r\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\r\n onDrop,\r\n accept: { 'image/*': ['.jpeg', '.png', '.jpg', '.gif'] },\r\n multiple: true,\r\n });\r\n\r\n const onHtmlDrop = useCallback(async (acceptedFiles) => {\r\n if (!onHtmlUpload) return;\r\n \r\n setUploadingHtml(true);\r\n setError(null);\r\n \r\n try {\r\n const file = acceptedFiles[0];\r\n if (!file) return;\r\n\r\n const reader = new FileReader();\r\n \r\n reader.onload = (e) => {\r\n const htmlContent = e.target?.result as string;\r\n if (htmlContent) {\r\n onHtmlUpload(htmlContent);\r\n setUploadingHtml(false);\r\n }\r\n };\r\n\r\n reader.onerror = () => {\r\n setError('Failed to read HTML file. Please try again.');\r\n setUploadingHtml(false);\r\n };\r\n\r\n reader.readAsText(file);\r\n } catch (err) {\r\n setError('Failed to process HTML file. Please try again.');\r\n setUploadingHtml(false);\r\n }\r\n }, [onHtmlUpload]);\r\n\r\n const { getRootProps: getHtmlRootProps, getInputProps: getHtmlInputProps, isDragActive: isHtmlDragActive } = useDropzone({\r\n onDrop: onHtmlDrop,\r\n accept: { 'text/html': ['.html', '.htm'] },\r\n multiple: false,\r\n maxFiles: 1,\r\n });\r\n\r\n const sections = [\r\n {\r\n id: 'html-upload',\r\n icon: <FileCode size={18} />,\r\n label: 'Upload HTML',\r\n content: (\r\n <Box sx={{ mt: 2 }}>\r\n <DropzoneBox {...getHtmlRootProps()}>\r\n <input {...getHtmlInputProps()} />\r\n {isHtmlDragActive ? (\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n Drop the HTML file here...\r\n </Typography>\r\n ) : (\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n Drag and drop HTML file here, or click to select\r\n </Typography>\r\n )}\r\n {uploadingHtml && (\r\n <Box sx={{ mt: 1 }}>\r\n <CircularProgress size={20} />\r\n </Box>\r\n )}\r\n </DropzoneBox>\r\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ mt: 1, display: 'block' }}>\r\n Upload an HTML file to replace current sections with the file content\r\n </Typography>\r\n </Box>\r\n ),\r\n },\r\n {\r\n id: 'text',\r\n icon: <TextIcon size={18} />,\r\n label: 'Text',\r\n content: (\r\n <Box sx={{ display: 'grid', gridTemplateColumns: 'repeat(2, 1fr)', gap: 1 }}>\r\n <SidebarItem id=\"sidebar-heading\" icon={<Heading size={20} />} label=\"Heading 1\" />\r\n <SidebarItem id=\"sidebar-heading-2\" icon={<Heading size={18} />} label=\"Heading 2\" />\r\n <SidebarItem id=\"sidebar-heading-3\" icon={<Heading size={16} />} label=\"Heading 3\" />\r\n <SidebarItem id=\"sidebar-heading-4\" icon={<Heading size={14} />} label=\"Heading 4\" />\r\n <SidebarItem id=\"sidebar-text\" icon={<TextIcon size={20} />} label=\"Body\" />\r\n <SidebarItem id=\"sidebar-text-block\" icon={<TextIcon size={20} />} label=\"Text Block\" />\r\n </Box>\r\n ),\r\n },\r\n {\r\n id: 'images',\r\n icon: <ImageIcon size={18} />,\r\n label: 'Images',\r\n content: (\r\n <Box sx={{ mt: 2 }}>\r\n <Box sx={{ mt: 2 }}>\r\n <DropzoneBox {...getRootProps()}>\r\n <input {...getInputProps()} />\r\n {isDragActive ? (\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n Drop the images here...\r\n </Typography>\r\n ) : (\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n Drag and drop images here, or click to select\r\n </Typography>\r\n )}\r\n {uploading && (\r\n <Box sx={{ mt: 1 }}>\r\n <CircularProgress size={20} />\r\n </Box>\r\n )}\r\n </DropzoneBox>\r\n {error && (\r\n <Alert severity=\"error\" sx={{ mt: 2 }}>\r\n {error}\r\n </Alert>\r\n )}\r\n {uploadedImages.length > 0 && (\r\n <Box sx={{ mt: 2 }}>\r\n <Typography variant=\"body2\" sx={{ mb: 1, color: 'grey.500' }}>\r\n Uploaded Images\r\n </Typography>\r\n <Grid container spacing={1}>\r\n {uploadedImages.map((image) => (\r\n <Grid item xs={6} key={image.id}>\r\n <SidebarItem\r\n id={image.id}\r\n label={image.name}\r\n imageUrl={image.url}\r\n />\r\n </Grid>\r\n ))}\r\n </Grid>\r\n </Box>\r\n )}\r\n </Box>\r\n </Box>\r\n ),\r\n },\r\n {\r\n id: 'buttons',\r\n icon: (\r\n <Box\r\n sx={{\r\n width: 16,\r\n height: 16,\r\n bgcolor: 'grey.400',\r\n borderRadius: 1,\r\n color: 'white',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '8px',\r\n }}\r\n >\r\n BTN\r\n </Box>\r\n ),\r\n label: 'Buttons',\r\n content: (\r\n <Box sx={{ mt: 2 }}>\r\n <SidebarItem\r\n id=\"sidebar-buttons\"\r\n icon={\r\n <Box\r\n sx={{\r\n width: 20,\r\n height: 20,\r\n bgcolor: 'success.main',\r\n borderRadius: 1,\r\n color: 'white',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '10px',\r\n }}\r\n >\r\n BTN\r\n </Box>\r\n }\r\n label=\"Buttons\"\r\n />\r\n </Box>\r\n ),\r\n },\r\n {\r\n id: 'divider',\r\n icon: <Divider sx={{ width: 18 }} />,\r\n label: 'Divider',\r\n content: (\r\n <Box sx={{ mt: 2 }}>\r\n <SidebarItem id=\"sidebar-divider\" icon={<Divider sx={{ width: 20 }} />} label=\"Divider\" />\r\n </Box>\r\n ),\r\n },\r\n {\r\n id: 'table',\r\n icon: <TableIcon size={18} />,\r\n label: 'Table',\r\n content: (\r\n <Box sx={{ mt: 2 }}>\r\n <SidebarItem id=\"sidebar-table\" icon={<TableIcon size={20} />} label=\"Table\" />\r\n </Box>\r\n ),\r\n },\r\n {\r\n id: 'signature',\r\n icon: <SignatureIcon size={18} />,\r\n label: 'Signature',\r\n content: (\r\n <Box sx={{ mt: 2 }}>\r\n <SidebarItem id=\"sidebar-signature\" icon={<SignatureIcon size={20} />} label=\"Signature\" />\r\n </Box>\r\n ),\r\n },\r\n {\r\n id: 'qr-code',\r\n icon: <QrCodeIcon size={18} />,\r\n label: 'QR Code',\r\n content: (\r\n <Box sx={{ mt: 2 }}>\r\n <SidebarItem id=\"sidebar-qr-code\" icon={<QrCodeIcon size={20} />} label=\"QR Code\" />\r\n </Box>\r\n ),\r\n },\r\n {\r\n id: 'bar-code',\r\n icon: <BarcodeIcon size={18} />,\r\n label: 'Bar Code',\r\n content: (\r\n <Box sx={{ mt: 2 }}>\r\n <SidebarItem id=\"sidebar-bar-code\" icon={<BarcodeIcon size={20} />} label=\"Bar Code\" />\r\n </Box>\r\n ),\r\n },\r\n ];\r\n\r\n const getDriveFiles = async () => {\r\n try {\r\n const token = getToken();\r\n const response = await getV1Drive({\r\n ...token,\r\n \"x-timezone\": String(token[\"x-timezone\"] || \"\"),\r\n skip: 0,\r\n limit: 10,\r\n filters: `(is_directory.eq=0)`\r\n });\r\n // Check if response is successful and has data\r\n if ('data' in response && response.data && typeof response.data === 'object' && 'drive' in response.data) {\r\n const files = (response.data as any).drive || [];\r\n setUploadedImages(files);\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n getDriveFiles()\r\n }, [])\r\n\r\n return (\r\n <Box\r\n sx={{\r\n bgcolor: 'background.paper',\r\n borderRight: 1,\r\n borderColor: 'grey.200',\r\n width: 390,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: 'calc(100vh - 104px)',\r\n boxShadow: '0 2px 8px rgba(0,0,0,0.05)',\r\n fontFamily: 'Inter, system-ui, Avenir, Helvetica, Arial, sans-serif',\r\n }}\r\n >\r\n <Box sx={{ p: 2, borderBottom: 1, borderColor: 'grey.200' }}>\r\n <SearchBar\r\n handleSearch={(key) => console.log('Search:', key)}\r\n sx={{ backgroundColor: \"#fff !important\", border: \"1px solid grey\" }}\r\n />\r\n </Box>\r\n <Box sx={{ flexGrow: 1, overflowY: 'auto', p: 1 }}>\r\n {sections.map((section) => (\r\n <Accordion\r\n key={section.id}\r\n expanded={expanded === section.id}\r\n onChange={handleChange(section.id)}\r\n sx={{\r\n border: 'none',\r\n boxShadow: 'none',\r\n backgroundColor: 'transparent',\r\n '&:before': { display: 'none' },\r\n marginBottom: 1,\r\n }}\r\n >\r\n <AccordionSummary\r\n expandIcon={<ExpandMoreIcon sx={{ color: 'grey.600' }} />}\r\n sx={{\r\n borderRadius: '8px',\r\n padding: '0 12px',\r\n backgroundColor: expanded === section.id ? 'grey.200' : 'grey.50',\r\n '&:hover': {\r\n backgroundColor: 'grey.50',\r\n },\r\n transition: 'background-color 0.2s ease',\r\n minHeight: 42,\r\n '& .MuiAccordionSummary-content': {\r\n alignItems: 'center',\r\n margin: '8px 0',\r\n },\r\n '&.Mui-expanded': {\r\n minHeight: 42,\r\n },\r\n }}\r\n >\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\r\n {section.icon}\r\n <Typography\r\n variant=\"body2\"\r\n sx={{ fontWeight: 500, color: 'text.primary' }}\r\n >\r\n {section.label}\r\n </Typography>\r\n </Box>\r\n </AccordionSummary>\r\n <AccordionDetails sx={{ padding: '8px 16px' }}>\r\n {section.content}\r\n </AccordionDetails>\r\n </Accordion>\r\n ))}\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport { EditorSidebar };\r\nexport default EditorSidebar;","/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable react-hooks/exhaustive-deps */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React, { useState, useEffect, useRef, useMemo, useCallback } from 'react';\r\nimport { useDroppable } from '@dnd-kit/core';\r\nimport EditorSection from './EditorSection';\r\nimport { Box, Container, Paper, Tooltip } from '@mui/material';\r\nimport Typography from '../../../components/typography/typography';\r\nimport SectionFormatPanel from './SectionFormatPanel';\r\nimport EditorSidebar from './EditorSidebar';\r\nimport { generateEmailPreview, generateHeaderFooterPreview } from '../utils/common';\r\nimport { EnhancedSectionData } from '../types/editor';\r\nimport Button from '../../../components/button/button';\r\nimport CheckIcon from '@mui/icons-material/Check';\r\nimport CloseIcon from '@mui/icons-material/Close';\r\n\r\nconst CANVAS_TYPES = {\r\n HEADER: 'header',\r\n MAIN: 'main',\r\n FOOTER: 'footer'\r\n};\r\n\r\ninterface DropPosition {\r\n id: string | null;\r\n type: 'before' | 'after' | 'inside' | 'left' | 'right';\r\n canvasType: string;\r\n}\r\n\r\ninterface EditorCanvasProps {\r\n sections: EnhancedSectionData[];\r\n headerSections: EnhancedSectionData[];\r\n footerSections: EnhancedSectionData[];\r\n activeId: string | null;\r\n overSection: string | null;\r\n selectedSection: string | null;\r\n onSelectSection: (id: string | null) => void;\r\n onUpdateSection: (id: string, data: any, canvasType?: string) => void;\r\n onSplitSection: (id: string, content1: string, content2: string, canvasType?: string) => void;\r\n onDeleteSection: (id: string, canvasType?: string) => void;\r\n preview: boolean;\r\n editHtml: boolean;\r\n onApplyHtmlEdit: (html: string) => void;\r\n onCancelHtmlEdit: () => void;\r\n editMode: boolean;\r\n isFromPreview: boolean;\r\n zoom?: number;\r\n placeholders: Record<string, any>[];\r\n isEditingHeaderFooter: boolean;\r\n relation_table: any[];\r\n handleSave?: () => Promise<void>;\r\n}\r\n\r\nconst EditorCanvas: React.FC<EditorCanvasProps> = ({\r\n sections,\r\n headerSections,\r\n footerSections,\r\n activeId,\r\n selectedSection,\r\n onSelectSection,\r\n onUpdateSection,\r\n onSplitSection,\r\n onDeleteSection,\r\n preview,\r\n editHtml,\r\n onApplyHtmlEdit,\r\n onCancelHtmlEdit,\r\n editMode,\r\n isFromPreview,\r\n placeholders,\r\n isEditingHeaderFooter,\r\n handleSave,\r\n relation_table,\r\n zoom = 100\r\n}) => {\r\n // Convert placeholders to the expected format\r\n const formattedPlaceholders = useMemo(() => {\r\n return placeholders.map((p: Record<string, any>) => ({\r\n value: p.value || p.key || '',\r\n label: p.label || p.name || String(p.value || p.key || '')\r\n }));\r\n }, [placeholders]);\r\n\r\n const { setNodeRef: setMainCanvasRef } = useDroppable({ id: 'main-canvas' });\r\n const { setNodeRef: setHeaderCanvasRef } = useDroppable({ id: 'header-canvas' });\r\n const { setNodeRef: setFooterCanvasRef } = useDroppable({ id: 'footer-canvas' });\r\n\r\n const selectedSectionData = useMemo(() => {\r\n return [...sections, ...headerSections, ...footerSections].find((section) => section.id === selectedSection);\r\n }, [sections, selectedSection]);\r\n\r\n const [dropTarget, setDropTarget] = useState<DropPosition>({\r\n id: null,\r\n type: 'inside',\r\n canvasType: CANVAS_TYPES.MAIN\r\n });\r\n const [isDraggingFromSidebar, setIsDraggingFromSidebar] = useState(false);\r\n const [isSectionEditing, setIsSectionEditing] = useState(false);\r\n const [htmlEditValue, setHtmlEditValue] = useState('');\r\n\r\n // Sync textarea content when entering HTML edit mode\r\n useEffect(() => {\r\n if (editHtml) {\r\n setHtmlEditValue(generateEmailPreview(sections, headerSections, footerSections));\r\n }\r\n }, [editHtml]);\r\n\r\n const lastUpdateTimeRef = useRef(0);\r\n const lastPositionRef = useRef({ x: 0, y: 0 });\r\n const activeIdRef = useRef<string | null>(null);\r\n const mainCanvasRef = useRef<HTMLDivElement | null>(null);\r\n const headerCanvasRef = useRef<HTMLDivElement | null>(null);\r\n const footerCanvasRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const DEBOUNCE_MS = 50;\r\n const MIN_MOUSE_MOVE = 5;\r\n const POSITION_HYSTERESIS = 0.1;\r\n\r\n const getTargetSections = (canvasType: string) => {\r\n switch (canvasType) {\r\n case CANVAS_TYPES.HEADER:\r\n return headerSections;\r\n case CANVAS_TYPES.FOOTER:\r\n return footerSections;\r\n default:\r\n return sections;\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n activeIdRef.current = activeId;\r\n\r\n if (activeId && String(activeId).includes('sidebar-')) {\r\n setIsDraggingFromSidebar(true);\r\n\r\n if (sections?.length > 0) {\r\n updateDropTarget(sections[0].id, 'before', CANVAS_TYPES.MAIN);\r\n } else if (headerSections?.length > 0 && isEditingHeaderFooter) {\r\n updateDropTarget(headerSections[0].id, 'before', CANVAS_TYPES.HEADER);\r\n } else if (footerSections?.length > 0 && isEditingHeaderFooter) {\r\n updateDropTarget(footerSections[0].id, 'before', CANVAS_TYPES.FOOTER);\r\n } else {\r\n updateDropTarget(null, 'inside', CANVAS_TYPES.MAIN);\r\n }\r\n } else if (!activeId) {\r\n setIsDraggingFromSidebar(false);\r\n setDropTarget({ id: null, type: 'inside', canvasType: CANVAS_TYPES.MAIN });\r\n }\r\n }, [activeId, sections, headerSections, footerSections, isEditingHeaderFooter]);\r\n\r\n const updateDropTarget = useCallback((id: string | null, type: DropPosition['type'], canvasType: string) => {\r\n const now = Date.now();\r\n if (now - lastUpdateTimeRef.current < DEBOUNCE_MS) return;\r\n\r\n // Prevent state updates if position hasn't actually changed\r\n setDropTarget(prev => {\r\n if (prev.id === id && prev.type === type && prev.canvasType === canvasType) {\r\n return prev; // Return same reference to prevent re-render\r\n }\r\n lastUpdateTimeRef.current = now;\r\n return { id, type, canvasType };\r\n });\r\n }, []);\r\n\r\n const handleMouseMove = useCallback((e: React.MouseEvent, canvasType: string) => {\r\n if (!activeIdRef.current) return;\r\n if (canvasType !== CANVAS_TYPES.MAIN && !isEditingHeaderFooter) return;\r\n\r\n const dx = e.clientX - lastPositionRef.current.x;\r\n const dy = e.clientY - lastPositionRef.current.y;\r\n const distance = Math.sqrt(dx * dx + dy * dy);\r\n\r\n if (distance < MIN_MOUSE_MOVE) return;\r\n\r\n lastPositionRef.current = { x: e.clientX, y: e.clientY };\r\n\r\n const elementsUnderCursor = document.elementsFromPoint(e.clientX, e.clientY);\r\n const sectionElement = elementsUnderCursor.find(el =>\r\n el.hasAttribute('data-section-id')\r\n );\r\n\r\n const targetSections = getTargetSections(canvasType);\r\n\r\n if (!sectionElement) {\r\n if (targetSections.length === 0) {\r\n updateDropTarget(null, 'inside', canvasType);\r\n } else if (isDraggingFromSidebar) {\r\n updateDropTarget(targetSections[targetSections.length - 1].id, 'after', canvasType);\r\n }\r\n return;\r\n }\r\n\r\n const sectionId = sectionElement.getAttribute('data-section-id');\r\n if (!sectionId) return;\r\n\r\n const sectionCanvasType = sectionElement.hasAttribute('data-canvas-type')\r\n ? sectionElement.getAttribute('data-canvas-type') as string\r\n : canvasType;\r\n\r\n const rect = sectionElement.getBoundingClientRect();\r\n const relativeY = e.clientY - rect.top;\r\n const relativeX = e.clientX - rect.left;\r\n const sectionHeight = rect.height;\r\n const sectionWidth = rect.width;\r\n\r\n const canvasSections = getTargetSections(sectionCanvasType);\r\n const section = canvasSections.find(s => s.id === sectionId);\r\n\r\n const isSplitGroup = sectionId.startsWith('split-group-');\r\n\r\n if (isSplitGroup || (section && section.isSplitPair)) {\r\n if (relativeX < sectionWidth * (0.5 - POSITION_HYSTERESIS)) {\r\n updateDropTarget(sectionId, 'left', sectionCanvasType);\r\n } else if (relativeX > sectionWidth * (0.5 + POSITION_HYSTERESIS)) {\r\n updateDropTarget(sectionId, 'right', sectionCanvasType);\r\n } else {\r\n updateDropTarget(sectionId, 'inside', sectionCanvasType);\r\n }\r\n } else {\r\n let position: DropPosition['type'] = 'inside';\r\n if (relativeY < sectionHeight * (0.3 - POSITION_HYSTERESIS)) {\r\n position = 'before';\r\n } else if (relativeY > sectionHeight * (0.7 + POSITION_HYSTERESIS)) {\r\n position = 'after';\r\n } else {\r\n position = 'inside';\r\n }\r\n updateDropTarget(sectionId, position, sectionCanvasType);\r\n }\r\n }, [isEditingHeaderFooter, isDraggingFromSidebar, updateDropTarget]);\r\n\r\n const handleMouseEnter = useCallback((e: React.MouseEvent, canvasType: string) => {\r\n if (!activeIdRef.current || !isDraggingFromSidebar) return;\r\n if (canvasType !== CANVAS_TYPES.MAIN && !isEditingHeaderFooter) return;\r\n\r\n const targetSections = getTargetSections(canvasType);\r\n\r\n if (targetSections.length > 0) {\r\n updateDropTarget(targetSections[0].id, 'before', canvasType);\r\n } else {\r\n updateDropTarget(null, 'inside', canvasType);\r\n }\r\n\r\n lastPositionRef.current = { x: e.clientX, y: e.clientY };\r\n }, [isDraggingFromSidebar, isEditingHeaderFooter, updateDropTarget]);\r\n\r\n const renderSectionsForCanvas = useCallback((canvasSections: EnhancedSectionData[], canvasType: string) => {\r\n const result: React.ReactNode[] = [];\r\n const processedGroups = new Set<string>();\r\n let i = 0;\r\n\r\n const renderDropIndicator = (key: string, isHorizontal = false) => (\r\n <Box\r\n key={key}\r\n sx={{\r\n [isHorizontal ? 'width' : 'height']: '50px',\r\n border: '2px dashed',\r\n borderColor: 'primary.main',\r\n borderRadius: 1,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n bgcolor: 'rgba(25, 118, 210, 0.04)',\r\n [isHorizontal ? 'mx' : 'mb']: 2,\r\n opacity: 0,\r\n animation: 'fadeIn 0.3s ease-in-out forwards',\r\n '@keyframes fadeIn': {\r\n '0%': { opacity: 0, transform: isHorizontal ? 'translateX(-10px)' : 'translateY(-10px)' },\r\n '100%': { opacity: 1, transform: 'translate(0)' },\r\n },\r\n }}\r\n >\r\n <Typography type='s2' color='primary' weight='medium'>\r\n Drop here\r\n </Typography>\r\n </Box>\r\n );\r\n\r\n if (isDraggingFromSidebar &&\r\n canvasSections?.length > 0 &&\r\n dropTarget.type === 'before' &&\r\n dropTarget.id === canvasSections[0].id &&\r\n dropTarget.canvasType === canvasType) {\r\n result.push(renderDropIndicator(`drop-before-first-${canvasType}`));\r\n }\r\n\r\n while (i < canvasSections?.length) {\r\n const section = canvasSections[i];\r\n const sectionId = section.id;\r\n\r\n if (dropTarget.id === sectionId &&\r\n dropTarget.type === 'before' &&\r\n dropTarget.canvasType === canvasType &&\r\n !(isDraggingFromSidebar && i === 0)) {\r\n result.push(renderDropIndicator(`drop-before-${sectionId}-${canvasType}`));\r\n }\r\n\r\n if (!section.isSplitPair) {\r\n result.push(\r\n <Box\r\n key={section.id}\r\n data-section-id={section.id}\r\n data-canvas-type={canvasType}\r\n >\r\n <EditorSection\r\n section={section}\r\n isSelected={selectedSection === section.id}\r\n isDragging={activeId === section.id}\r\n isOver={dropTarget.id === section.id && dropTarget.type === 'inside' && dropTarget.canvasType === canvasType}\r\n onSelect={() => onSelectSection(section.id)}\r\n onUpdate={(content, extra) => {\r\n onUpdateSection(section.id, { content, ...extra }, canvasType);\r\n onSelectSection(null);\r\n }}\r\n onSplit={(content1, content2) => onSplitSection(section.id, content1, content2, canvasType)}\r\n onDelete={() => onDeleteSection(section.id, canvasType)}\r\n placeholders={formattedPlaceholders}\r\n setIsSectionEditing={setIsSectionEditing}\r\n />\r\n </Box>\r\n );\r\n i++;\r\n } else {\r\n const splitGroupId = section.splitGroupId;\r\n if (splitGroupId && processedGroups.has(splitGroupId)) {\r\n i++;\r\n continue;\r\n }\r\n\r\n const splitSections = canvasSections.filter(s => s.splitGroupId === splitGroupId);\r\n if (splitSections.length > 0) {\r\n if (splitGroupId) processedGroups.add(splitGroupId);\r\n\r\n // Split sections use stable keys based on section IDs and splitGroupId\r\n // This ensures React doesn't unnecessarily re-render or lose component state\r\n // when sections are reordered or updated\r\n const splitRow = (\r\n <Box\r\n key={`split-row-${splitGroupId}`}\r\n sx={{\r\n display: 'flex',\r\n gap: 2,\r\n mb: 2,\r\n bgcolor: 'rgba(0, 0, 0, 0.02)',\r\n p: 1,\r\n borderRadius: 1\r\n }}\r\n data-section-id={`split-group-${splitGroupId}`}\r\n data-canvas-type={canvasType}\r\n >\r\n {splitSections.map((splitSection, index) => (\r\n <React.Fragment key={splitSection.id}>\r\n {dropTarget.id === splitSection.id &&\r\n dropTarget.type === 'left' &&\r\n dropTarget.canvasType === canvasType && (\r\n renderDropIndicator(`drop-left-${splitSection.id}-${canvasType}`, true)\r\n )}\r\n <Box\r\n sx={{\r\n width: splitSection.splitWidth ? `${splitSection.splitWidth}%` : `${100 / splitSections.length}%`,\r\n transition: 'width 0.3s ease-in-out',\r\n }}\r\n data-section-id={splitSection.id}\r\n data-canvas-type={canvasType}\r\n >\r\n <EditorSection\r\n section={splitSection}\r\n isSelected={selectedSection === splitSection.id}\r\n isDragging={activeId === splitSection.id}\r\n isOver={dropTarget.id === splitSection.id && dropTarget.type === 'inside' && dropTarget.canvasType === canvasType}\r\n onSelect={() => onSelectSection(splitSection.id)}\r\n onUpdate={(content, extra) => {\r\n onUpdateSection(splitSection.id, { content, ...extra }, canvasType);\r\n onSelectSection(null);\r\n }}\r\n onSplit={(content1, content2) => onSplitSection(splitSection.id, content1, content2, canvasType)}\r\n onDelete={() => onDeleteSection(splitSection.id, canvasType)}\r\n placeholders={formattedPlaceholders}\r\n setIsSectionEditing={setIsSectionEditing}\r\n />\r\n </Box>\r\n {dropTarget.id === splitSection.id &&\r\n dropTarget.type === 'right' &&\r\n dropTarget.canvasType === canvasType && (\r\n renderDropIndicator(`drop-right-${splitSection.id}-${canvasType}`, true)\r\n )}\r\n </React.Fragment>\r\n ))}\r\n </Box>\r\n );\r\n result.push(splitRow);\r\n i += splitSections.length;\r\n } else {\r\n i++;\r\n }\r\n }\r\n\r\n if (dropTarget.id === sectionId &&\r\n dropTarget.type === 'after' &&\r\n dropTarget.canvasType === canvasType) {\r\n result.push(renderDropIndicator(`drop-after-${sectionId}-${canvasType}`));\r\n }\r\n }\r\n\r\n if ((canvasSections?.length === 0 && activeId && dropTarget.canvasType === canvasType) ||\r\n (canvasSections?.length === 0 && isDraggingFromSidebar && dropTarget.canvasType === canvasType)) {\r\n result.push(renderDropIndicator(`drop-empty-canvas-${canvasType}`));\r\n }\r\n\r\n return result;\r\n }, [\r\n isDraggingFromSidebar,\r\n dropTarget,\r\n activeId,\r\n selectedSection,\r\n onSelectSection,\r\n onUpdateSection,\r\n onSplitSection,\r\n onDeleteSection,\r\n formattedPlaceholders\r\n ]);\r\n\r\n const renderedMainSections = useMemo(() =>\r\n renderSectionsForCanvas(sections, CANVAS_TYPES.MAIN),\r\n [sections, dropTarget, activeId, isDraggingFromSidebar, selectedSection]\r\n );\r\n\r\n const renderedHeaderSections = useMemo(() =>\r\n renderSectionsForCanvas(headerSections, CANVAS_TYPES.HEADER),\r\n [headerSections, dropTarget, activeId, isDraggingFromSidebar, selectedSection, isEditingHeaderFooter]\r\n );\r\n\r\n const renderedFooterSections = useMemo(() =>\r\n renderSectionsForCanvas(footerSections, CANVAS_TYPES.FOOTER),\r\n [footerSections, dropTarget, activeId, isDraggingFromSidebar, selectedSection, isEditingHeaderFooter]\r\n );\r\n\r\n const renderPreview = () => {\r\n return (\r\n <Box\r\n sx={{\r\n transform: `scale(${zoom / 100})`,\r\n transformOrigin: 'top center',\r\n transition: 'transform 0.2s ease-in-out',\r\n bgcolor: 'white',\r\n p: 2,\r\n borderRadius: 1,\r\n boxShadow: 1,\r\n }}\r\n >\r\n <Box dangerouslySetInnerHTML={{ __html: generateEmailPreview(sections, headerSections, footerSections) }} />\r\n </Box>\r\n );\r\n };\r\n\r\n const renderHtmlEditor = () => (\r\n <Box sx={{ display: 'flex', flexDirection: 'column', height: '100%' }}>\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n px: 2,\r\n py: 1,\r\n bgcolor: '#1e1e1e',\r\n borderBottom: '1px solid #333',\r\n borderRadius: '4px 4px 0 0',\r\n }}\r\n >\r\n <Typography type='s3' sx={{ color: '#ccc', fontFamily: 'monospace' }}>\r\n HTML Source Editor — changes will replace current sections\r\n </Typography>\r\n <Box sx={{ display: 'flex', gap: 1 }}>\r\n <Button\r\n size='small'\r\n variant='contained'\r\n color='primary'\r\n startIcon={<CheckIcon fontSize='small' />}\r\n onClick={() => onApplyHtmlEdit(htmlEditValue)}\r\n sx={{ boxShadow: 'none' }}\r\n >\r\n Apply\r\n </Button>\r\n <Button\r\n size='small'\r\n variant='outlined'\r\n startIcon={<CloseIcon fontSize='small' />}\r\n onClick={() => onCancelHtmlEdit()}\r\n sx={(theme) => ({ color: `${theme.palette.theme.secondary[1000]} !important`, borderColor: '#555 !important' })}\r\n >\r\n Cancel\r\n </Button>\r\n </Box>\r\n </Box>\r\n <textarea\r\n value={htmlEditValue}\r\n onChange={(e) => setHtmlEditValue(e.target.value)}\r\n spellCheck={false}\r\n style={{\r\n flex: 1,\r\n width: '100%',\r\n minHeight: 'calc(100vh - 220px)',\r\n padding: '16px',\r\n fontFamily: '\"Fira Code\", \"Cascadia Code\", \"Consolas\", monospace',\r\n fontSize: '13px',\r\n lineHeight: '1.6',\r\n color: '#d4d4d4',\r\n backgroundColor: '#1e1e1e',\r\n border: 'none',\r\n outline: 'none',\r\n resize: 'none',\r\n boxSizing: 'border-box',\r\n borderRadius: '0 0 4px 4px',\r\n tabSize: 2,\r\n }}\r\n />\r\n </Box>\r\n );\r\n\r\n const renderCanvas = (\r\n title: string,\r\n canvasType: string,\r\n renderedSections: React.ReactNode[],\r\n setCanvasRef: (node: HTMLElement | null) => void,\r\n ref: React.MutableRefObject<HTMLDivElement | null>,\r\n visible: boolean = true\r\n ) => {\r\n if (!visible) return null;\r\n\r\n return (\r\n <Box sx={{ mb: 3 }}>\r\n {CANVAS_TYPES.MAIN === canvasType && visible && headerSections.length > 0 && (\r\n <>\r\n {/* <Accordion\r\n sx= {{\r\n boxShadow: 'none !important',\r\n \".MuiAccordionSummary-root\": {\r\n backgroundColor: '#fafafa !important',\r\n border: `0 !important`,\r\n p: 0,\r\n pb: 1,\r\n // mb: 1,\r\n m:0,\r\n minHeight: 'unset'\r\n }\r\n }}\r\n >\r\n <AccordionSummary\r\n expandIcon={<ExpandMoreIcon />}\r\n aria-controls=\"panel1-content\"\r\n id=\"panel1-header\"\r\n > */}\r\n <Typography type=\"h4\" weight='bold' color={'theme.secondary.800'}>Header</Typography>\r\n {/* </AccordionSummary> */}\r\n <Paper sx={{ mb: 1, boxShadow: 'none', opacity: 0.5 }} dangerouslySetInnerHTML={{ __html: generateHeaderFooterPreview(headerSections) }} />\r\n {/* </Accordion> */}\r\n </>\r\n )}\r\n <Typography type=\"h4\" weight='bold' color={'theme.secondary.800'} sx={{ mb: 1 }}>{title}</Typography>\r\n <Paper\r\n ref={(node) => {\r\n setCanvasRef(node);\r\n ref.current = node;\r\n }}\r\n elevation={0}\r\n sx={{\r\n p: 4,\r\n border: '1px dashed',\r\n borderColor: isDraggingFromSidebar && dropTarget.canvasType === canvasType\r\n ? 'primary.main'\r\n : 'primary.light',\r\n borderRadius: 1,\r\n bgcolor: 'background.paper',\r\n position: 'relative',\r\n minHeight: title === 'Header' || title === 'Footer' ? '100px' : '200px',\r\n transition: 'border-color 0.3s ease, background-color 0.3s ease',\r\n '&:hover': {\r\n bgcolor: isDraggingFromSidebar && dropTarget.canvasType === canvasType\r\n ? 'rgba(25, 118, 210, 0.04)'\r\n : 'background.paper',\r\n },\r\n pointerEvents: (canvasType === CANVAS_TYPES.HEADER || canvasType === CANVAS_TYPES.FOOTER) && !isEditingHeaderFooter\r\n ? 'none'\r\n : 'auto',\r\n opacity: (canvasType === CANVAS_TYPES.HEADER || canvasType === CANVAS_TYPES.FOOTER) && !isEditingHeaderFooter\r\n ? 0.5\r\n : 1,\r\n }}\r\n onClick={() => {\r\n if ((canvasType === CANVAS_TYPES.HEADER || canvasType === CANVAS_TYPES.FOOTER) && !isEditingHeaderFooter) return;\r\n onSelectSection(null);\r\n }}\r\n onMouseMove={(e) => handleMouseMove(e, canvasType)}\r\n onMouseEnter={(e) => handleMouseEnter(e, canvasType)}\r\n >\r\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\r\n {renderedSections}\r\n {getTargetSections(canvasType)?.length === 0 &&\r\n !activeId &&\r\n !isDraggingFromSidebar && (\r\n <Box sx={{ borderRadius: 1, p: 2, textAlign: 'center', color: 'text.secondary' }}>\r\n <Typography type='s2' color='theme.secondary.600' weight='medium'>\r\n Drag Sections from side panel to start building the {title.toLowerCase()}\r\n </Typography>\r\n </Box>\r\n )}\r\n </Box>\r\n </Paper>\r\n {CANVAS_TYPES.MAIN === canvasType && visible && footerSections.length > 0 && (\r\n <>\r\n {/* <Accordion\r\n sx= {{\r\n boxShadow: 'none !important',\r\n \".MuiAccordionSummary-root\": {\r\n backgroundColor: '#fafafa !important',\r\n border: `0 !important`,\r\n p: 0,\r\n pb: 1,\r\n // mb: 1,\r\n m:0,\r\n minHeight: 'unset'\r\n }\r\n }}\r\n >\r\n <AccordionSummary\r\n expandIcon={<ExpandMoreIcon />}\r\n aria-controls=\"panel1-content\"\r\n id=\"panel1-header\"\r\n > */}\r\n <Typography type=\"h4\" weight='bold' color={'theme.secondary.800'} sx={{ mt: 1 }}>Footer</Typography>\r\n {/* </AccordionSummary> */}\r\n <Paper sx={{ mb: 1, boxShadow: 'none', opacity: 0.5 }} dangerouslySetInnerHTML={{ __html: generateHeaderFooterPreview(footerSections) }} />\r\n {/* </Accordion> */}\r\n </>\r\n )}\r\n </Box>\r\n );\r\n };\r\n\r\n return (\r\n <Box sx={{ display: 'flex', flex: 1, overflow: 'hidden' }}>\r\n <Box sx={{ flex: 1, overflow: 'auto', height: 'calc(100vh - 104px)' }}>\r\n <Container maxWidth={editHtml ? false : 'lg'} sx={{ py: editHtml ? 0 : 4, height: editHtml ? '100%' : undefined }}>\r\n {editHtml ? (\r\n renderHtmlEditor()\r\n ) : preview ? (\r\n renderPreview()\r\n ) : (\r\n <>\r\n {renderCanvas(\r\n 'Header',\r\n CANVAS_TYPES.HEADER,\r\n renderedHeaderSections,\r\n setHeaderCanvasRef,\r\n headerCanvasRef,\r\n isEditingHeaderFooter\r\n )}\r\n {renderCanvas(\r\n 'Content',\r\n CANVAS_TYPES.MAIN,\r\n renderedMainSections,\r\n setMainCanvasRef,\r\n mainCanvasRef,\r\n !isEditingHeaderFooter\r\n )}\r\n {renderCanvas(\r\n 'Footer',\r\n CANVAS_TYPES.FOOTER,\r\n renderedFooterSections,\r\n setFooterCanvasRef,\r\n footerCanvasRef,\r\n isEditingHeaderFooter\r\n )}\r\n </>\r\n )}\r\n </Container>\r\n </Box >\r\n {!editHtml && (\r\n <Box\r\n sx={{\r\n width: isFromPreview ? (editMode ? 400 : 0) : 400,\r\n flexShrink: 0,\r\n position: 'sticky',\r\n top: 0,\r\n alignSelf: 'flex-start',\r\n height: 'calc(100vh - 104px)',\r\n overflowY: 'auto',\r\n borderLeft: '1px solid',\r\n borderColor: 'divider',\r\n bgcolor: 'background.paper',\r\n zIndex: 1,\r\n }}\r\n >\r\n {(selectedSection && !selectedSectionData?.is_edited_from_source && !isSectionEditing) ? (\r\n <SectionFormatPanel\r\n section={selectedSectionData}\r\n onClose={() => onSelectSection(null)}\r\n onUpdate={(data) => {\r\n if (selectedSection) {\r\n const canvasType = headerSections.some(s => s.id === selectedSection)\r\n ? CANVAS_TYPES.HEADER\r\n : footerSections.some(s => s.id === selectedSection)\r\n ? CANVAS_TYPES.FOOTER\r\n : CANVAS_TYPES.MAIN;\r\n onUpdateSection(selectedSection, data, canvasType);\r\n }\r\n }}\r\n placeholders={placeholders}\r\n handleSave={handleSave}\r\n relation_table={relation_table}\r\n />\r\n ) : (\r\n isFromPreview ? (editMode && <EditorSidebar />) : <EditorSidebar />\r\n )}\r\n </Box>\r\n )}\r\n </Box >\r\n );\r\n};\r\n\r\nexport default EditorCanvas;","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React, { useEffect, useState } from 'react';\r\n\r\nimport Modal from '../../../components/modal/modal';\r\nimport Typography from '../../../components/typography/typography';\r\nimport Button from '../../../components/button/button';\r\n\r\nimport {\r\n\tBox,\r\n\tCircularProgress,\r\n\tDialogActions,\r\n\tDialogContent,\r\n\tDialogProps,\r\n\tDialogTitle,\r\n\tIconButton,\r\n} from '@mui/material';\r\nimport Close from '@mui/icons-material/Close';\r\n\r\nimport './template-name-modal.scss';\r\nimport { IEmail } from '../utils/types';\r\nimport { enqueueSnackbar } from 'notistack';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport DynamicInput from '../../../components/form-control/form-builder/form-builder-element/text';\r\nimport { useForm } from 'react-hook-form';\r\nimport { patchV1TemplatesId, postV1Templates } from '../../../api-client/api.system-feature/api';\r\nimport * as Yup from 'yup';\r\nimport { yupResolver } from '@hookform/resolvers/yup';\r\n\r\ninterface TemplateNameModalProps {\r\n\tisOpen: boolean;\r\n\tsetIsOpen: (value: IEmail | null) => void;\r\n\tmodalProps?: DialogProps;\r\n\ttemplateRoutes: Record<string, any>;\r\n\tpayload: Record<string, any>;\r\n\tmode: 'add' | 'edit';\r\n\ttemplateData: Record<string, any> | null;\r\n\tonSaveSuccess?: () => void;\r\n\tonSaveError?: () => void;\r\n\tisSaving?: boolean;\r\n}\r\n\r\nconst generateValidationSchema = () => {\r\n\treturn yupResolver(\r\n\t\tYup.object().shape({\r\n\t\t\ttemplate_name: Yup.object().shape({\r\n\t\t\t\tname: Yup.string().trim().required('Template name is required'),\r\n\t\t\t})\r\n\t\t})\r\n\t)\r\n}\r\n\r\nconst TemplateNameModal: React.FC<TemplateNameModalProps> = ({\r\n\tisOpen,\r\n\tsetIsOpen,\r\n\tmodalProps,\r\n\ttemplateRoutes,\r\n\tpayload,\r\n\tmode = 'add',\r\n\ttemplateData,\r\n\tonSaveSuccess,\r\n\tonSaveError,\r\n\tisSaving: parentIsSaving = false,\r\n}) => {\r\n\tconsole.log(\"is saving...........\",parentIsSaving)\r\n\tconst { handleSubmit, control, setValue } = useForm({ mode: 'all', resolver: generateValidationSchema() });\r\n\tconst navigate = useNavigate();\r\n\tconst [isSubmitting, setIsSubmitting] = useState<boolean>(false);\r\n\tconsole.log(\"isSubmitting............\",isSubmitting)\r\n\r\n\tconst handleModalClose = () => {\r\n\t\tif (!isSubmitting && !parentIsSaving) {\r\n\t\t\tsetIsOpen(null);\r\n\t\t}\r\n\t};\r\n\r\n\tconst onSubmit = async (values: any) => {\r\n\t\tsetIsSubmitting(true);\r\n\t\ttry {\r\n\t\t\tconst { name = ''} = values?.template_name || {}\r\n\t\t\tpayload.name = name\r\n\t\t\tconst res = await (mode === 'edit' ? patchV1TemplatesId(payload) : postV1Templates(payload));\r\n\t\t\tif(res.status_code === 200) {\r\n\t\t\t\tenqueueSnackbar('Template saved successfully', { variant: 'success' });\r\n\t\t\t\tonSaveSuccess?.();\r\n\t\t\t\tnavigate(templateRoutes.LIST);\r\n\t\t\t}\r\n\t\t\tsetIsSubmitting(false);\r\n\t\t} catch (error) {\r\n\t\t\tconst m = error?.message || 'Something went wrong'\r\n\t\t\tsetIsSubmitting(false);\r\n\t\t\tenqueueSnackbar(m, { variant: 'error' });\r\n\t\t\tonSaveError?.();\r\n\t\t}\r\n\t}\r\n\r\n\tuseEffect(() => {\r\n\t\tif(templateData && templateData?.name) {\r\n\t\t\tsetValue('template_name.name', templateData?.name)\r\n\t\t}\r\n\t}, [setValue, templateData])\r\n\r\n\treturn (\r\n\t\t<Modal\r\n\t\t\topen={isOpen}\r\n\t\t\tonClose={handleModalClose}\r\n\t\t\tmaxWidth='xs'\r\n\t\t\tfullWidth\r\n\t\t\t{...modalProps}>\r\n\t\t\t<DialogTitle className='companySelectionModal--DialogTitle'>\r\n\t\t\t\t<Typography type='s3' color='inherit' weight='medium'>\r\n\t\t\t\t\t{parentIsSaving ? 'Saving Template...' : 'Template Name'}\r\n\t\t\t\t</Typography>\r\n\t\t\t\t<IconButton onClick={handleModalClose} disabled={isSubmitting || parentIsSaving}>\r\n\t\t\t\t\t<Close fontSize='small' />\r\n\t\t\t\t</IconButton>\r\n\t\t\t</DialogTitle>\r\n\t\t\t<DialogContent className='companySelectionModal--DialogContents'>\r\n\t\t\t\t<form onSubmit={handleSubmit(onSubmit)} id='template_name'>\r\n\t\t\t\t\t<DynamicInput \r\n\t\t\t\t\t\tlabel={'Name'}\r\n\t\t\t\t\t\tname='name'\r\n\t\t\t\t\t\tplaceholder={'Enter Name'}\r\n\t\t\t\t\t\tfieldArrayName='template_name'\r\n\t\t\t\t\t\tformControl={control}\r\n\t\t\t\t\t\trequired\r\n\t\t\t\t\t/>\r\n\t\t\t\t</form>\r\n\t\t\t</DialogContent>\r\n\t\t\t<DialogActions className='companySelectionModal--DialogAction'>\r\n\t\t\t\t<Box display='flex' gap={1.5}>\r\n\t\t\t\t\t<Button className='companySelectionModal--DialogAction--WhiteBtn' onClick={handleModalClose} disabled={isSubmitting || parentIsSaving}>Cancel</Button>\r\n\t\t\t\t\t<Button type='submit' form='template_name' disabled={isSubmitting || parentIsSaving} endIcon={(isSubmitting || parentIsSaving) && <CircularProgress size={15}/>}>\r\n\t\t\t\t\t\t{parentIsSaving ? 'Saving...' : 'Save'}\r\n\t\t\t\t\t</Button>\r\n\t\t\t\t</Box>\r\n\t\t\t</DialogActions>\r\n\t\t</Modal>\r\n\t);\r\n};\r\n\r\nexport default TemplateNameModal;\r\n","/* eslint-disable no-case-declarations */\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable react-hooks/exhaustive-deps */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React, { useState, useEffect, useCallback, useMemo } from 'react';\r\nimport EditorHeader from './EditorHeader';\r\nimport EditorCanvas from './EditorCanvas';\r\nimport {\r\n DndContext,\r\n DragEndEvent,\r\n DragOverEvent,\r\n DragStartEvent,\r\n pointerWithin,\r\n} from '@dnd-kit/core';\r\nimport { SectionData, ElementType } from '../types/editor';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { enqueueSnackbar } from 'notistack';\r\nimport { Box } from '@mui/material';\r\nimport { useLocation, useParams } from 'react-router-dom';\r\nimport { getErrorMessage, getToken } from '../../../utils/common';\r\nimport { getV1FormBuilderRelationalSchemaFieldsName, getV1SubjectsId, getV1TemplateHeaderFooterCompanyIdHeaderFooter, getV1TemplatesId, patchV1TemplateHeaderFooterId, postV1TemplateHeaderFooter } from '../../../api-client/api.system-feature/api';\r\nimport { templateRoutes, extractStyles, generateEmailPreview, generateHeaderFooterPreview, generateInlineStyles } from '../utils/common';\r\nimport { initialStyles } from '../utils/constant';\r\nimport _ from 'lodash';\r\nimport formatText from '../../../utils/format-text';\r\nimport TemplateNameModal from \"../template-name-modal/template-name-modal\";\r\nimport { useDebouncedUpdate } from '../hooks/useDebouncedUpdate';\r\n\r\ninterface EnhancedSectionData extends SectionData {\r\n isSplitPair?: boolean;\r\n splitGroupId?: string;\r\n splitWidth?: number;\r\n}\r\n\r\ninterface SectionFlowEditorProps {\r\n modulePath: string;\r\n module: string;\r\n type: string;\r\n}\r\n\r\nconst SectionFlowEditor: React.FC<SectionFlowEditorProps> = ({ modulePath, module, type }) => {\r\n const { id, template_id } = useParams();\r\n const { state: locationState } = useLocation();\r\n\r\n const [sections, setSections] = useState<EnhancedSectionData[]>([]);\r\n const [headerSections, setHeaderSections] = useState<EnhancedSectionData[]>([]);\r\n const [footerSections, setFooterSections] = useState<EnhancedSectionData[]>([]);\r\n const [activeId, setActiveId] = useState<string | null>(null);\r\n const [editMode, setEditMode] = useState<true | false>(false);\r\n const [fromPreview, setFromPreview] = useState<boolean>(false);\r\n const [selectedSection, setSelectedSection] = useState<string | null>(null);\r\n const [overSection, setOverSection] = useState<string | null>(null);\r\n const [preview, setPreview] = useState<boolean>(locationState?.fromPreview ? true : false);\r\n const [editHtml, setEditHtml] = useState<boolean>(false);\r\n const [placeholders, setPlaceholders] = useState<Record<string, any>[]>([]);\r\n const [activeCanvas, setActiveCanvas] = useState<'main' | 'header' | 'footer'>('main');\r\n const [isEditingHeaderFooter, setIsEditingHeaderFooter] = useState<boolean>(false);\r\n const [payload, setPayload] = useState<any>(null);\r\n const [headerFooterId, setHeaderFooterId] = useState<string>('');\r\n const ROUTES = templateRoutes(modulePath, type);\r\n const [relation_table, setRelationTable] = useState<any[]>([]);\r\n const [templateData, setTemplateData] = useState<Record<string, any> | null>(null);\r\n\r\n // Optimistic update state\r\n const [isSaving, setIsSaving] = useState<boolean>(false);\r\n const [savedSnapshot, setSavedSnapshot] = useState<{\r\n sections: EnhancedSectionData[];\r\n headerSections: EnhancedSectionData[];\r\n footerSections: EnhancedSectionData[];\r\n } | null>(null);\r\n const [zoom, setZoom] = useState<number>(100);\r\n\r\n const handleZoomIn = () => {\r\n setZoom(prev => Math.min(prev + 10, 150));\r\n };\r\n\r\n const handleZoomOut = () => {\r\n setZoom(prev => Math.max(prev - 10, 50));\r\n };\r\n\r\n const handleResetZoom = () => {\r\n setZoom(100);\r\n };\r\n // History state for undo/redo functionality\r\n const [history, setHistory] = useState<{\r\n past: Array<{ sections: EnhancedSectionData[]; headerSections: EnhancedSectionData[]; footerSections: EnhancedSectionData[] }>;\r\n future: Array<{ sections: EnhancedSectionData[]; headerSections: EnhancedSectionData[]; footerSections: EnhancedSectionData[] }>;\r\n }>({\r\n past: [],\r\n future: [],\r\n });\r\n const MAX_HISTORY_SIZE = 50;\r\n\r\n // Memoize placeholders to prevent recreation on every render\r\n const memoizedPlaceholders = useMemo(() => placeholders, [JSON.stringify(placeholders)]);\r\n\r\n // Helper function to save current state to history\r\n const saveToHistory = useCallback(() => {\r\n setHistory((prev) => {\r\n const newPast = [\r\n ...prev.past,\r\n {\r\n sections: [...sections],\r\n headerSections: [...headerSections],\r\n footerSections: [...footerSections],\r\n },\r\n ].slice(-MAX_HISTORY_SIZE); // Keep only last 50 operations\r\n\r\n return {\r\n past: newPast,\r\n future: [], // Clear future when new action is performed\r\n };\r\n });\r\n }, [sections, headerSections, footerSections]);\r\n\r\n // Undo handler\r\n const handleUndo = useCallback(() => {\r\n if (history.past.length === 0) return;\r\n\r\n const previous = history.past[history.past.length - 1];\r\n const newPast = history.past.slice(0, -1);\r\n\r\n setHistory({\r\n past: newPast,\r\n future: [\r\n {\r\n sections: [...sections],\r\n headerSections: [...headerSections],\r\n footerSections: [...footerSections],\r\n },\r\n ...history.future,\r\n ].slice(0, MAX_HISTORY_SIZE),\r\n });\r\n\r\n setSections(previous.sections);\r\n setHeaderSections(previous.headerSections);\r\n setFooterSections(previous.footerSections);\r\n }, [history, sections, headerSections, footerSections]);\r\n\r\n // Redo handler\r\n const handleRedo = useCallback(() => {\r\n if (history.future.length === 0) return;\r\n\r\n const next = history.future[0];\r\n const newFuture = history.future.slice(1);\r\n\r\n setHistory({\r\n past: [\r\n ...history.past,\r\n {\r\n sections: [...sections],\r\n headerSections: [...headerSections],\r\n footerSections: [...footerSections],\r\n },\r\n ].slice(-MAX_HISTORY_SIZE),\r\n future: newFuture,\r\n });\r\n\r\n setSections(next.sections);\r\n setHeaderSections(next.headerSections);\r\n setFooterSections(next.footerSections);\r\n }, [history, sections, headerSections, footerSections]);\r\n\r\n // Keyboard shortcuts for undo/redo\r\n useEffect(() => {\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n // Ctrl+Z or Cmd+Z for undo\r\n if ((event.ctrlKey || event.metaKey) && event.key === 'z' && !event.shiftKey) {\r\n event.preventDefault();\r\n handleUndo();\r\n }\r\n // Ctrl+Y or Cmd+Shift+Z for redo\r\n else if (\r\n ((event.ctrlKey || event.metaKey) && event.key === 'y') ||\r\n ((event.ctrlKey || event.metaKey) && event.shiftKey && event.key === 'z')\r\n ) {\r\n event.preventDefault();\r\n handleRedo();\r\n }\r\n };\r\n\r\n window.addEventListener('keydown', handleKeyDown);\r\n return () => {\r\n window.removeEventListener('keydown', handleKeyDown);\r\n };\r\n }, [handleUndo, handleRedo]);\r\n\r\n const createNewSection = useCallback((type: ElementType, attrs: Record<string, any> = {}): EnhancedSectionData => {\r\n let content = '';\r\n const styles = initialStyles[type] || {};\r\n const inlineStyles: string = generateInlineStyles(styles);\r\n\r\n const idPrefix = activeCanvas === 'header' && isEditingHeaderFooter ? 'header-' :\r\n activeCanvas === 'footer' && isEditingHeaderFooter ? 'footer-' : '';\r\n\r\n switch (type) {\r\n case 'heading':\r\n content = `<h1 style=\"${inlineStyles}\">Heading 1</h1>`;\r\n break;\r\n case 'heading-2':\r\n content = `<h2 style=\"${inlineStyles}\">Heading 2</h2>`;\r\n break;\r\n case 'heading-3':\r\n content = `<h3 style=\"${inlineStyles}\">Heading 3</h3>`;\r\n break;\r\n case 'heading-4':\r\n content = `<h4 style=\"${inlineStyles}\">Heading 4</h4>`;\r\n break;\r\n case 'text':\r\n content = `<p style=\"${inlineStyles}\">Hello, enter your text here...</p>`;\r\n break;\r\n case 'image':\r\n content = `<img src=\"${attrs.src}\" alt=\"${attrs.alt}\" style=\"${inlineStyles};\" />`;\r\n break;\r\n case 'buttons':\r\n attrs.text = attrs?.text || 'Button text';\r\n content = `<button style=\"${inlineStyles}\">${attrs.text}</button>`;\r\n break;\r\n case 'divider':\r\n content = `<hr style=\"${inlineStyles}\" />`;\r\n break;\r\n case 'table':\r\n const tableStyles = styles as any;\r\n const { border, borderStyle, borderColor, ...rest } = tableStyles;\r\n const tInlineStyles = generateInlineStyles(tableStyles.is_bordered ? tableStyles : rest);\r\n const tHeadInlineStyles: string = generateInlineStyles(tableStyles.tHead);\r\n const tBodyInlineStyles: string = generateInlineStyles(tableStyles.tBody);\r\n const thCellInlineStyles: string = generateInlineStyles({ ...tableStyles.thCells, border, borderStyle, borderColor });\r\n const tbCellInlineStyles: string = generateInlineStyles({ ...tableStyles.tbCells, border, borderStyle, borderColor });\r\n content = `\r\n <table style=\"${tInlineStyles}\">\r\n <thead style=\"${tHeadInlineStyles}\">\r\n <tr style=\"background-color: #f5f5f5;\">\r\n <th style=\"${thCellInlineStyles}\"></th>\r\n <th style=\"${thCellInlineStyles}\"></th>\r\n <th style=\"${thCellInlineStyles}\"></th>\r\n </tr>\r\n </thead>\r\n <tbody style=\"${tBodyInlineStyles}\">\r\n <tr>\r\n <td style=\"${tbCellInlineStyles}\"></td>\r\n <td style=\"${tbCellInlineStyles}\"></td>\r\n <td style=\"${tbCellInlineStyles}\"></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n `;\r\n break;\r\n case 'signature':\r\n content = `<div style=\"${inlineStyles}\">Signature: <input type='text' style=\"border:0; border-bottom:1px solid black\" class='signature-input'/></div>`;\r\n break;\r\n case 'qr-code':\r\n attrs.placeholder = attrs?.placeholder || '{{qr_data}}';\r\n content = `<div style=\"background-color: #f5f5f5; padding: 16px; text-align: center; color: #666666;\">${attrs.placeholder}</div>`;\r\n break;\r\n case 'bar-code':\r\n attrs.placeholder = attrs?.placeholder || '{{barcode_data}}';\r\n content = `<div style=\"background-color: #f5f5f5; padding: 16px; text-align: center; color: #666666;\">${attrs.placeholder}</div>`;\r\n break;\r\n default:\r\n content = '<p style=\"font-size: 16px; color: #333333; line-height: 1.5;\">New section</p>';\r\n }\r\n\r\n let attributes: Record<string, any> = {};\r\n attributes = extractStyles(content, type);\r\n\r\n return {\r\n id: `${idPrefix}section-${uuidv4()}`,\r\n content,\r\n type,\r\n attributes: { ...(attrs || {}), styles },\r\n is_edited_from_source: false\r\n };\r\n }, [activeCanvas, isEditingHeaderFooter]);\r\n\r\n const handleDragStart = useCallback((event: DragStartEvent) => {\r\n const { active } = event;\r\n setActiveId(active.id as string);\r\n }, []);\r\n\r\n const handleDragOver = useCallback((event: DragOverEvent) => {\r\n const { /* active, */ over } = event;\r\n\r\n if (!over) {\r\n setOverSection(null);\r\n return;\r\n }\r\n\r\n if (over.id === 'header-canvas' && isEditingHeaderFooter) {\r\n setActiveCanvas('header');\r\n } else if (over.id === 'footer-canvas' && isEditingHeaderFooter) {\r\n setActiveCanvas('footer');\r\n } else if (over.id === 'main-canvas') {\r\n setActiveCanvas('main');\r\n }\r\n\r\n if (over.id !== 'header-canvas' && over.id !== 'main-canvas' && over.id !== 'footer-canvas') {\r\n setOverSection(over.id as string);\r\n }\r\n }, [isEditingHeaderFooter]);\r\n\r\n const handleDragEnd = useCallback((event: DragEndEvent) => {\r\n const { active, over } = event;\r\n\r\n setActiveId(null);\r\n setOverSection(null);\r\n\r\n if (!over) return;\r\n\r\n let targetSections = sections;\r\n let setTargetSections = setSections;\r\n\r\n if ((over.id === 'header-canvas' || overSection?.startsWith('header-')) && isEditingHeaderFooter) {\r\n targetSections = headerSections;\r\n setTargetSections = setHeaderSections;\r\n setActiveCanvas('header');\r\n } else if ((over.id === 'footer-canvas' || overSection?.startsWith('footer-')) && isEditingHeaderFooter) {\r\n targetSections = footerSections;\r\n setTargetSections = setFooterSections;\r\n setActiveCanvas('footer');\r\n } else {\r\n setActiveCanvas('main');\r\n }\r\n\r\n if (active.data.current?.type === 'image') {\r\n saveToHistory(); // Save state before adding image section\r\n const imageUrl = active.data.current.imageUrl;\r\n const newSection: EnhancedSectionData = createNewSection('image', { src: imageUrl, alt: 'Image' });\r\n\r\n const overIndex = targetSections.findIndex((section) => section.id === over.id);\r\n const newSections = [...targetSections];\r\n\r\n if (over.id === 'header-canvas' || over.id === 'main-canvas' || over.id === 'footer-canvas' || overIndex === -1) {\r\n setTargetSections([...targetSections, newSection]);\r\n } else {\r\n newSections.splice(overIndex, 0, newSection);\r\n setTargetSections(newSections);\r\n }\r\n\r\n enqueueSnackbar('Added uploaded image section');\r\n return;\r\n }\r\n\r\n if (typeof active.id === 'string' && active.id.startsWith('sidebar-')) {\r\n saveToHistory(); // Save state before adding new section\r\n const type = active.id.replace('sidebar-', '') as ElementType;\r\n const newSection = createNewSection(type);\r\n\r\n const overIndex = targetSections.findIndex((section) => section.id === over.id);\r\n const isOverSection = overIndex !== -1;\r\n\r\n if (!isOverSection || over.id === 'header-canvas' || over.id === 'main-canvas' || over.id === 'footer-canvas') {\r\n setTargetSections([...targetSections, newSection]);\r\n } else {\r\n const targetSection = targetSections[overIndex];\r\n const isEmpty =\r\n !targetSection.content ||\r\n targetSection.content.includes('Click to add') ||\r\n targetSection.content.includes('enter your text');\r\n\r\n if (isEmpty) {\r\n const updatedSections = [...targetSections];\r\n updatedSections[overIndex] = {\r\n ...targetSection,\r\n type,\r\n content: newSection.content,\r\n };\r\n setTargetSections(updatedSections);\r\n // enqueueSnackbar(`Changed section to ${type}`);\r\n } else {\r\n const updatedSections = [...targetSections];\r\n updatedSections.splice(overIndex, 0, newSection);\r\n setTargetSections(updatedSections);\r\n // enqueueSnackbar(`Added new ${type} section`);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n if (\r\n active.id !== over.id &&\r\n typeof active.id === 'string' &&\r\n typeof over.id === 'string'\r\n ) {\r\n saveToHistory(); // Save state before reordering sections\r\n let sourceSections: EnhancedSectionData[] = [];\r\n let sourceSetSections: React.Dispatch<React.SetStateAction<EnhancedSectionData[]>> | null = null;\r\n let canvasId = '';\r\n\r\n if (active.id.startsWith('header-') && isEditingHeaderFooter) {\r\n sourceSections = headerSections;\r\n sourceSetSections = setHeaderSections;\r\n canvasId = 'header-canvas';\r\n } else if (active.id.startsWith('footer-') && isEditingHeaderFooter) {\r\n sourceSections = footerSections;\r\n sourceSetSections = setFooterSections;\r\n canvasId = 'footer-canvas';\r\n } else {\r\n sourceSections = sections;\r\n sourceSetSections = setSections;\r\n canvasId = 'main-canvas';\r\n }\r\n\r\n const cleanActiveId = active.id.replace(/^(header-|footer-)/, '');\r\n\r\n const oldIndex = sourceSections.findIndex((section) =>\r\n section.id === cleanActiveId || section.id === active.id\r\n );\r\n\r\n let newIndex = targetSections.findIndex((section) =>\r\n section.id === String(over.id).replace(/^(header-|footer-)/, '')\r\n );\r\n\r\n if (over.id === 'header-canvas' || over.id === 'main-canvas' || over.id === 'footer-canvas') {\r\n newIndex = targetSections.length;\r\n }\r\n\r\n if (oldIndex !== -1 && newIndex !== -1) {\r\n if (sourceSections === targetSections) {\r\n const newSections = [...sourceSections];\r\n const [movedSection] = newSections.splice(oldIndex, 1);\r\n\r\n if (movedSection.isSplitPair && movedSection.splitGroupId) {\r\n const groupId = movedSection.splitGroupId;\r\n const groupSections = [movedSection, ...sourceSections.filter(\r\n s => s.splitGroupId === groupId && s.id !== movedSection.id\r\n )];\r\n\r\n const cleaned = newSections.filter(s => s.splitGroupId !== groupId);\r\n cleaned.splice(newIndex, 0, ...groupSections);\r\n sourceSetSections(cleaned);\r\n } else {\r\n newSections.splice(newIndex, 0, movedSection);\r\n sourceSetSections(newSections);\r\n }\r\n } else {\r\n const originalSection = sourceSections[oldIndex];\r\n\r\n const newSourceSections = [...sourceSections];\r\n newSourceSections.splice(oldIndex, 1);\r\n sourceSetSections(newSourceSections);\r\n\r\n const newTargetSections = [...targetSections];\r\n\r\n const movedSection = { ...originalSection };\r\n\r\n if ((over.id === 'header-canvas' || over.id.startsWith('header-')) && isEditingHeaderFooter) {\r\n if (!movedSection.id.startsWith('header-')) {\r\n movedSection.id = `header-${movedSection.id}`;\r\n }\r\n } else if ((over.id === 'footer-canvas' || over.id.startsWith('footer-')) && isEditingHeaderFooter) {\r\n if (!movedSection.id.startsWith('footer-')) {\r\n movedSection.id = `footer-${movedSection.id}`;\r\n }\r\n } else {\r\n movedSection.id = movedSection.id.replace(/^(header-|footer-)/, '');\r\n }\r\n\r\n newTargetSections.splice(newIndex, 0, movedSection);\r\n setTargetSections(newTargetSections);\r\n }\r\n }\r\n }\r\n }, [sections, headerSections, footerSections, overSection, isEditingHeaderFooter, activeCanvas, createNewSection, saveToHistory]);\r\n\r\n const getRelevantSections = useCallback((canvasType: string) => {\r\n if (canvasType === 'header' && isEditingHeaderFooter) return headerSections;\r\n if (canvasType === 'footer' && isEditingHeaderFooter) return footerSections;\r\n return sections;\r\n }, [sections, headerSections, footerSections, isEditingHeaderFooter]);\r\n\r\n const getRelevantSetSections = useCallback((canvasType: string) => {\r\n if (canvasType === 'header' && isEditingHeaderFooter) return setHeaderSections;\r\n if (canvasType === 'footer' && isEditingHeaderFooter) return setFooterSections;\r\n return setSections;\r\n }, [isEditingHeaderFooter]);\r\n\r\n // Internal update function (not debounced)\r\n const updateSectionImmediate = useCallback((id: string, data: Partial<EnhancedSectionData>, canvasType: string) => {\r\n const relevantSections = getRelevantSections(canvasType);\r\n const relevantSetSections = getRelevantSetSections(canvasType);\r\n\r\n const cleanId = id.replace(/^(header-|footer-)/, '');\r\n\r\n relevantSetSections(\r\n relevantSections.map((section) =>\r\n section.id === cleanId || section.id === id ? { ...section, ...data } : section\r\n )\r\n );\r\n }, [getRelevantSections, getRelevantSetSections]);\r\n\r\n // Debounced version for section content updates (300ms delay)\r\n const handleUpdateSectionDebounced = useDebouncedUpdate(updateSectionImmediate, 300);\r\n\r\n // Main handler that decides whether to debounce\r\n const handleUpdateSection = useCallback((id: string, data: Partial<EnhancedSectionData>, canvasType: string) => {\r\n // Only debounce content updates, apply other updates immediately\r\n if (data.content !== undefined && Object.keys(data).length === 1) {\r\n handleUpdateSectionDebounced(id, data, canvasType);\r\n } else {\r\n updateSectionImmediate(id, data, canvasType);\r\n }\r\n }, [updateSectionImmediate, handleUpdateSectionDebounced]);\r\n\r\n const handleSplitSection = useCallback((id: string, content1: string, content2: string, canvasType: string) => {\r\n saveToHistory(); // Save state before splitting section\r\n\r\n const relevantSections = getRelevantSections(canvasType);\r\n const relevantSetSections = getRelevantSetSections(canvasType);\r\n\r\n const cleanId = id.replace(/^(header-|footer-)/, '');\r\n\r\n const index = relevantSections.findIndex((section) => section.id === cleanId || section.id === id);\r\n if (index === -1) return;\r\n\r\n const section = relevantSections[index];\r\n const newSections = [...relevantSections];\r\n\r\n const sectionPrefix = canvasType === 'header' ? 'header-' : canvasType === 'footer' ? 'footer-' : '';\r\n\r\n if (section.isSplitPair && section.splitGroupId) {\r\n const splitGroupId = section.splitGroupId;\r\n const splitSections = newSections.filter(s => s.splitGroupId === splitGroupId);\r\n const totalSections = splitSections.length + 1;\r\n const newWidth = 100 / totalSections;\r\n\r\n newSections[index] = {\r\n ...section,\r\n content: content1,\r\n splitWidth: newWidth\r\n };\r\n\r\n const newSection: EnhancedSectionData = {\r\n id: `${sectionPrefix}section-${uuidv4()}`,\r\n content: content2,\r\n type: section.type,\r\n isSplitPair: true,\r\n splitGroupId: splitGroupId,\r\n splitWidth: newWidth,\r\n attributes: section.attributes,\r\n is_edited_from_source: false\r\n };\r\n\r\n newSections.splice(index + 1, 0, newSection);\r\n\r\n for (let i = 0; i < newSections.length; i++) {\r\n if (newSections[i].splitGroupId === splitGroupId) {\r\n newSections[i].splitWidth = newWidth;\r\n }\r\n }\r\n } else {\r\n const splitGroupId = uuidv4();\r\n const initialWidth = 50;\r\n\r\n newSections[index] = {\r\n ...section,\r\n content: content1,\r\n isSplitPair: true,\r\n splitGroupId,\r\n splitWidth: initialWidth\r\n };\r\n\r\n const newSection: EnhancedSectionData = {\r\n id: `${sectionPrefix}section-${uuidv4()}`,\r\n content: content2,\r\n type: section.type,\r\n isSplitPair: true,\r\n splitGroupId,\r\n splitWidth: initialWidth,\r\n attributes: section.attributes,\r\n is_edited_from_source: false\r\n };\r\n\r\n newSections.splice(index + 1, 0, newSection);\r\n }\r\n\r\n relevantSetSections(newSections);\r\n // enqueueSnackbar('Section split successfully');\r\n }, [getRelevantSections, getRelevantSetSections, activeCanvas, isEditingHeaderFooter, saveToHistory]);\r\n\r\n const handleDeleteSection = useCallback((id: string, canvasType: string) => {\r\n saveToHistory(); // Save state before deleting section\r\n\r\n const relevantSections = getRelevantSections(canvasType);\r\n const relevantSetSections = getRelevantSetSections(canvasType);\r\n\r\n const cleanId = id.replace(/^(header-|footer-)/, '');\r\n\r\n const sectionToDelete = relevantSections.find(s => s.id === cleanId || s.id === id);\r\n\r\n if (!sectionToDelete) return;\r\n\r\n if (sectionToDelete.isSplitPair && sectionToDelete.splitGroupId) {\r\n const splitSections = relevantSections.filter(s => s.splitGroupId === sectionToDelete.splitGroupId);\r\n\r\n if (splitSections.length <= 2) {\r\n const remainingSection = splitSections.find(s => s.id !== cleanId && s.id !== id);\r\n if (remainingSection) {\r\n remainingSection.isSplitPair = false;\r\n remainingSection.splitGroupId = undefined;\r\n remainingSection.splitWidth = undefined;\r\n }\r\n relevantSetSections(relevantSections.filter(s => s.id !== cleanId && s.id !== id));\r\n } else {\r\n const remainingSplitSections = splitSections.filter(s => s.id !== cleanId && s.id !== id);\r\n const newWidth = 100 / remainingSplitSections.length;\r\n\r\n const updatedSections = relevantSections.filter(section => section.id !== cleanId && section.id !== id).map(section => {\r\n if (section.splitGroupId === sectionToDelete.splitGroupId) {\r\n return { ...section, splitWidth: newWidth };\r\n }\r\n return section;\r\n });\r\n\r\n relevantSetSections(updatedSections);\r\n // enqueueSnackbar('Section removed from split group');\r\n }\r\n } else {\r\n relevantSetSections(relevantSections.filter(section => section.id !== cleanId && section.id !== id));\r\n // enqueueSnackbar('Section deleted');\r\n }\r\n\r\n if (selectedSection === id) {\r\n setSelectedSection(null);\r\n }\r\n }, [getRelevantSections, getRelevantSetSections, selectedSection, saveToHistory]);\r\n\r\n useEffect(() => {\r\n if (locationState?.fromPreview) {\r\n setEditMode(locationState?.isViewOnly ? false : true);\r\n setFromPreview(true);\r\n }\r\n document.body.style.overflow = 'hidden';\r\n const main = document.getElementsByTagName('main')?.[0];\r\n if (main) {\r\n main.style.marginTop = '4.125rem';\r\n }\r\n return () => {\r\n document.body.removeAttribute('style');\r\n }\r\n }, []);\r\n\r\n const getData = async () => {\r\n if (id) {\r\n const token = getToken();\r\n const subjRes = await getV1SubjectsId({\r\n ...token,\r\n 'x-timezone': token['x-timezone']?.toString() || '',\r\n id\r\n });\r\n\r\n if ('data' in subjRes && subjRes.data && typeof subjRes.data === 'object' && 'resource' in subjRes.data) {\r\n const resource = (subjRes.data as any).resource;\r\n const token2 = getToken();\r\n const fRes = await getV1FormBuilderRelationalSchemaFieldsName({\r\n ...token2,\r\n 'x-timezone': token2['x-timezone']?.toString() || '',\r\n name: resource,\r\n });\r\n const schemaFields = ('data' in fRes && fRes.data && typeof fRes.data === 'object' && 'fields' in fRes.data)\r\n ? ((fRes.data as any).fields || [])\r\n : [];\r\n const relation_table = ('data' in fRes && fRes.data && typeof fRes.data === 'object' && 'relational_fields' in fRes.data)\r\n ? ((fRes.data as any).relational_fields || [])\r\n : [];\r\n\r\n // Process main schema fields\r\n const updatedFields = schemaFields\r\n .map((field) => ({\r\n ...field,\r\n key: field.key.replace('__replaceKey', ''),\r\n }))\r\n .filter((field) => !field.is_inner_join && field.alias !== 'id' && !field?.alias?.includes('_id'));\r\n\r\n // Process relation tables - separate array and object types\r\n const arrayRelationTables = [];\r\n const objectRelationFields = [];\r\n\r\n relation_table.forEach((table) => {\r\n if (!table) return;\r\n\r\n const updatedTableFields = (table.fields || []).map((field) => {\r\n const updatedField = {\r\n ...field,\r\n key: field.key.replace('__replaceKey', ''),\r\n alias: field?.templateKey ? field?.templateKey : field.alias,\r\n };\r\n\r\n // Prepend dataKey to field keys for object types\r\n if (table.type === 'object' && table.dataKey) {\r\n updatedField.key = `${table.dataKey}.${updatedField.key}`;\r\n }\r\n\r\n return updatedField;\r\n }).filter(\r\n (field) =>\r\n !field.is_inner_join &&\r\n field.alias !== 'id' &&\r\n !field.alias.includes('_id')\r\n );\r\n\r\n const uniqueTableFields = _.differenceWith(\r\n updatedTableFields,\r\n updatedTableFields,\r\n (fieldA: any, fieldB: any) => fieldA.key === fieldB?.joinKey\r\n );\r\n\r\n const tableFields = uniqueTableFields.map((f: any) => {\r\n const field = formatText(f.alias.replace(/_data$/, '').replace(/_/g, ' '));\r\n const value = table.type === 'object' && table.dataKey\r\n ? `${table.dataKey}.${f.alias.replace(/ /g, '_').toLowerCase()}`\r\n : f.alias.replace(/ /g, '_').toLowerCase();\r\n\r\n return {\r\n label: field,\r\n value: value\r\n };\r\n });\r\n\r\n if (table.type === 'object') {\r\n // Merge object type fields into main fields\r\n objectRelationFields.push(...tableFields);\r\n } else {\r\n // Keep array types separate\r\n arrayRelationTables.push({\r\n ...table,\r\n fields: tableFields\r\n });\r\n }\r\n });\r\n\r\n // Combine main fields and object relation fields\r\n const allFields = [\r\n ...updatedFields.map((f) => {\r\n const n = f?.alias || f?.key\r\n const field = formatText(n.replace(/_data$/, '').replace(/_/g, ' '));\r\n return {\r\n label: field,\r\n value: field.replace(/ /g, '_').toLowerCase()\r\n };\r\n }),\r\n ...objectRelationFields\r\n ];\r\n\r\n const uniqueAllFields = _.uniqBy(allFields, 'value');\r\n\r\n setPlaceholders(uniqueAllFields);\r\n setRelationTable(arrayRelationTables);\r\n }\r\n }\r\n\r\n // Rest of the function remains the same...\r\n if (template_id) {\r\n const token3 = getToken();\r\n const res = await getV1TemplatesId({\r\n ...token3,\r\n 'x-timezone': token3['x-timezone']?.toString() || '',\r\n id: template_id\r\n });\r\n const templateSections = ('data' in res && res.data && typeof res.data === 'object' && 'sections' in res.data)\r\n ? ((res.data as any).sections || [])\r\n : [];\r\n const mainSecs = templateSections.map((s: any) => ({\r\n ...s,\r\n id: s.id || `section-${uuidv4()}`,\r\n attributes: {\r\n ...s.attributes,\r\n styles: s.attributes?.styles || initialStyles[s.type] || {}\r\n }\r\n }));\r\n setTemplateData(('data' in res && res.data) ? res.data as any : null);\r\n\r\n setSections(mainSecs);\r\n }\r\n\r\n if (locationState?.company_id) {\r\n const token4 = getToken();\r\n const res = await getV1TemplateHeaderFooterCompanyIdHeaderFooter({\r\n ...token4,\r\n 'x-timezone': token4['x-timezone']?.toString() || '',\r\n company_id: locationState.company_id,\r\n });\r\n const resData = ('data' in res && res.data && typeof res.data === 'object') ? res.data as any : null;\r\n setHeaderFooterId(resData?._id || '');\r\n const headerSections = resData?.header_sections || [];\r\n const footerSections = resData?.footer_sections || [];\r\n const headerSecs = headerSections.map((s) => ({\r\n ...s,\r\n id: s.id || `header-section-${uuidv4()}`,\r\n attributes: {\r\n ...s.attributes,\r\n styles: s.attributes?.styles || initialStyles[s.type] || {}\r\n }\r\n }));\r\n const footerSecs = footerSections.map((s) => ({\r\n ...s,\r\n id: s.id || `footer-section-${uuidv4()}`,\r\n attributes: {\r\n ...s.attributes,\r\n styles: s.attributes?.styles || initialStyles[s.type] || {}\r\n }\r\n }));\r\n\r\n setHeaderSections(headerSecs);\r\n setFooterSections(footerSecs);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n getData();\r\n }, [template_id, id, locationState?.company_id]);\r\n\r\n const handleApplyHtmlEdit = useCallback((html: string) => {\r\n saveToHistory(); // Save state before applying HTML edit\r\n const newSection: EnhancedSectionData = {\r\n id: `section-${uuidv4()}`,\r\n content: html,\r\n type: 'text',\r\n is_edited_from_source: true,\r\n };\r\n setSections([newSection]);\r\n setEditHtml(false);\r\n }, [saveToHistory]);\r\n\r\n const handleCancelHtmlEdit = useCallback(() => {\r\n setEditHtml(false);\r\n }, []);\r\n\r\n const handleSave = useCallback(async () => {\r\n if (sections.length === 0 && headerSections.length === 0 && footerSections.length === 0) {\r\n enqueueSnackbar('Please add at least one section');\r\n return;\r\n }\r\n\r\n // Save snapshot for potential rollback\r\n setSavedSnapshot({\r\n sections: [...sections],\r\n headerSections: [...headerSections],\r\n footerSections: [...footerSections],\r\n });\r\n\r\n const mainHtml = generateEmailPreview(sections, headerSections, footerSections, true);\r\n try {\r\n const p = {\r\n ...getToken(),\r\n ...(template_id ? { id: template_id } : { subject_id: id, is_default: false, company_id: locationState.company_id }),\r\n sections: sections.map(s => ({ ...s, attributes: s.attributes })),\r\n contents: mainHtml\r\n }\r\n setPayload(p);\r\n } catch (error) {\r\n const m = getErrorMessage(error?.message);\r\n enqueueSnackbar(m, { variant: 'error' });\r\n setSavedSnapshot(null);\r\n }\r\n }, [sections, headerSections, footerSections, template_id, id, locationState]);\r\n\r\n const handleSaveHeaderFooter = useCallback(async () => {\r\n if (sections.length === 0 && headerSections.length === 0 && footerSections.length === 0) {\r\n enqueueSnackbar('Please add at least one section', { variant: 'error' });\r\n return;\r\n } else if (!locationState?.company_id) {\r\n enqueueSnackbar('Company has not been selected', { variant: 'error' });\r\n return;\r\n }\r\n\r\n // Save snapshot for potential rollback\r\n setSavedSnapshot({\r\n sections: [...sections],\r\n headerSections: [...headerSections],\r\n footerSections: [...footerSections],\r\n });\r\n\r\n // Show loading state immediately (optimistic update)\r\n setIsSaving(true);\r\n\r\n const headerHtml = generateHeaderFooterPreview(headerSections, 'header');\r\n const footerHtml = generateHeaderFooterPreview(footerSections, 'footer');\r\n const combinedHtml = `${headerHtml}${footerHtml}`;\r\n\r\n // Convert splitWidth from number to string for API\r\n const convertSectionForApi = (section: EnhancedSectionData) => ({\r\n id: section.id,\r\n content: section.content,\r\n type: section.type,\r\n isSplitPair: section.isSplitPair,\r\n splitGroupId: section.splitGroupId,\r\n splitWidth: section.splitWidth !== undefined ? String(section.splitWidth) : undefined,\r\n attributes: section.attributes,\r\n });\r\n\r\n const convertedHeaderSections = headerSections.map(convertSectionForApi);\r\n const convertedFooterSections = footerSections.map(convertSectionForApi);\r\n\r\n try {\r\n if (headerFooterId) {\r\n const token5 = getToken();\r\n const res = await patchV1TemplateHeaderFooterId({\r\n ...token5,\r\n 'x-timezone': token5['x-timezone']?.toString() || '',\r\n id: headerFooterId,\r\n header_sections: convertedHeaderSections,\r\n footer_sections: convertedFooterSections,\r\n contents: combinedHtml\r\n });\r\n if (res.status_code === 200) {\r\n enqueueSnackbar('Header/Footer saved successfully', { variant: 'success' });\r\n setIsEditingHeaderFooter(false);\r\n setSavedSnapshot(null);\r\n }\r\n } else {\r\n const token6 = getToken();\r\n const res = await postV1TemplateHeaderFooter({\r\n ...token6,\r\n 'x-timezone': token6['x-timezone']?.toString() || '',\r\n header_sections: convertedHeaderSections,\r\n footer_sections: convertedFooterSections,\r\n contents: combinedHtml,\r\n company_id: locationState.company_id\r\n });\r\n if (res.status_code === 200) {\r\n enqueueSnackbar('Header/Footer saved successfully', { variant: 'success' });\r\n setIsEditingHeaderFooter(false);\r\n setSavedSnapshot(null);\r\n }\r\n }\r\n } catch (error) {\r\n const m = getErrorMessage(error?.message);\r\n enqueueSnackbar(m, { variant: 'error' });\r\n\r\n // Revert to saved snapshot on error\r\n if (savedSnapshot) {\r\n setSections(savedSnapshot.sections);\r\n setHeaderSections(savedSnapshot.headerSections);\r\n setFooterSections(savedSnapshot.footerSections);\r\n enqueueSnackbar('Changes reverted due to save error', { variant: 'warning' });\r\n }\r\n } finally {\r\n setIsSaving(false);\r\n setSavedSnapshot(null);\r\n }\r\n }, [sections, headerSections, footerSections, headerFooterId, locationState, savedSnapshot]);\r\n\r\n const toggleHeaderFooterEditing = useCallback(() => {\r\n setIsEditingHeaderFooter(!isEditingHeaderFooter);\r\n if (isEditingHeaderFooter) {\r\n setActiveCanvas('main');\r\n }\r\n }, [isEditingHeaderFooter]);\r\n\r\n // Handle save success from TemplateNameModal\r\n const handleSaveSuccess = useCallback(() => {\r\n setSavedSnapshot(null);\r\n setPayload(null);\r\n }, []);\r\n\r\n // Handle save error from TemplateNameModal\r\n const handleSaveError = useCallback(() => {\r\n // Revert to saved snapshot on error\r\n if (savedSnapshot) {\r\n setSections(savedSnapshot.sections);\r\n setHeaderSections(savedSnapshot.headerSections);\r\n setFooterSections(savedSnapshot.footerSections);\r\n enqueueSnackbar('Changes reverted due to save error', { variant: 'warning' });\r\n }\r\n\r\n setSavedSnapshot(null);\r\n setPayload(null);\r\n }, [savedSnapshot]);\r\n\r\n const toggleEditMode = () => {\r\n setEditMode(!editMode);\r\n if (editMode) {\r\n setPreview(true);\r\n } else {\r\n setPreview(false);\r\n }\r\n }\r\n\r\n return (\r\n <Box sx={{ display: 'flex', flexDirection: 'column', height: '100vh' }}>\r\n <EditorHeader\r\n fromPreview={fromPreview}\r\n onPreview={() => setPreview(!preview)}\r\n onSave={handleSave}\r\n onEditModeChange={toggleEditMode}\r\n zoom={zoom}\r\n onZoomIn={handleZoomIn}\r\n onZoomOut={handleZoomOut}\r\n onResetZoom={handleResetZoom}\r\n editMode={editMode}\r\n preview={preview}\r\n editHtml={editHtml}\r\n onEditHtml={() => setEditHtml(!editHtml)}\r\n sections={sections}\r\n isEditingHeaderFooter={isEditingHeaderFooter}\r\n setIsEditingHeaderFooter={toggleHeaderFooterEditing}\r\n onSaveHeaderFooter={handleSaveHeaderFooter}\r\n modulePath={modulePath}\r\n type={type}\r\n mode={template_id ? 'edit' : 'add'}\r\n templateData={templateData}\r\n isSaving={isSaving}\r\n />\r\n <Box sx={{ display: 'flex', flex: 1, overflow: 'hidden' }}>\r\n <DndContext\r\n onDragStart={handleDragStart}\r\n onDragOver={handleDragOver}\r\n onDragEnd={handleDragEnd}\r\n collisionDetection={pointerWithin}\r\n >\r\n <EditorCanvas\r\n sections={sections}\r\n headerSections={headerSections}\r\n footerSections={footerSections}\r\n activeId={activeId}\r\n overSection={overSection}\r\n selectedSection={selectedSection}\r\n onSelectSection={setSelectedSection}\r\n onUpdateSection={handleUpdateSection}\r\n onSplitSection={handleSplitSection}\r\n onDeleteSection={handleDeleteSection}\r\n preview={preview}\r\n editHtml={editHtml}\r\n onApplyHtmlEdit={handleApplyHtmlEdit}\r\n onCancelHtmlEdit={handleCancelHtmlEdit}\r\n zoom={zoom}\r\n editMode={editMode}\r\n isFromPreview={fromPreview}\r\n handleSave={handleSave}\r\n placeholders={memoizedPlaceholders}\r\n isEditingHeaderFooter={isEditingHeaderFooter}\r\n relation_table={relation_table}\r\n />\r\n </DndContext>\r\n </Box>\r\n {payload !== null &&\r\n <TemplateNameModal\r\n isOpen={payload !== null}\r\n setIsOpen={() => setPayload(null)}\r\n payload={payload}\r\n templateRoutes={ROUTES}\r\n mode={template_id ? 'edit' : 'add'}\r\n templateData={templateData}\r\n onSaveSuccess={handleSaveSuccess}\r\n onSaveError={handleSaveError}\r\n isSaving={isSaving}\r\n />\r\n }\r\n </Box>\r\n );\r\n};\r\n\r\nexport default SectionFlowEditor;","/* eslint-disable unused-imports/no-unused-vars */\r\nimport { Box } from '@mui/material';\r\nimport SectionFlowEditor from '../components/SectionFlowEditor';\r\nimport './add-template.scss';\r\nimport { ITemplateFormProps } from '../utils/types';\r\n\r\nconst AddTemplate: React.FC<ITemplateFormProps> = ({ modulePath, module, type}) => {\r\n return (\r\n <Box sx={{ minHeight: '100vh', bgcolor: 'grey.50' }}>\r\n <SectionFlowEditor modulePath={modulePath} module={module} type={type}/>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default AddTemplate;","/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React, { useState, useRef, useEffect, useCallback } from 'react';\r\nimport { Box, Skeleton, IconButton, Tooltip, Divider, Fade } from '@mui/material';\r\nimport { ZoomIn, ZoomOut, Refresh } from '@mui/icons-material';\r\nimport { Trash } from '../../../components/icons';\r\nimport Typography from '../../../components/typography/typography';\r\n\r\nconst HtmlThumbnailPreview = ({ \r\n template, \r\n width = 300, \r\n height = 200, \r\n scale = 0.25,\r\n showControls = false,\r\n onClick = null,\r\n selectedTemplateId = '',\r\n isFetching = false,\r\n onDelete,\r\n minScale = 0.1,\r\n maxScale = 1,\r\n scaleStep = 1.2,\r\n loadingDelay = 500,\r\n refreshDelay = 300,\r\n normalView = false,\r\n}) => {\r\n const [isLoading, setIsLoading] = useState(isFetching || true);\r\n const [currentScale, setCurrentScale] = useState(scale);\r\n const [error, setError] = useState(null);\r\n const [isHovered, setIsHovered] = useState(false);\r\n const containerRef = useRef(null);\r\n const contentRef = useRef(null);\r\n const loadingTimeoutRef = useRef(null);\r\n const refreshTimeoutRef = useRef(null);\r\n\r\n // Calculate dimensions based on scale\r\n const scaledWidth = width / currentScale;\r\n const scaledHeight = height / currentScale;\r\n\r\n // Cleanup timeouts on unmount\r\n useEffect(() => {\r\n return () => {\r\n if (loadingTimeoutRef.current) {\r\n clearTimeout(loadingTimeoutRef.current);\r\n }\r\n if (refreshTimeoutRef.current) {\r\n clearTimeout(refreshTimeoutRef.current);\r\n }\r\n };\r\n }, []);\r\n\r\n // Handle initial loading\r\n useEffect(() => {\r\n if (loadingTimeoutRef.current) {\r\n clearTimeout(loadingTimeoutRef.current);\r\n }\r\n \r\n loadingTimeoutRef.current = setTimeout(() => {\r\n setIsLoading(false);\r\n }, loadingDelay);\r\n\r\n return () => {\r\n if (loadingTimeoutRef.current) {\r\n clearTimeout(loadingTimeoutRef.current);\r\n }\r\n };\r\n }, [template.contents, loadingDelay]);\r\n\r\n // Handle external loading state\r\n useEffect(() => {\r\n setIsLoading(isFetching);\r\n }, [isFetching]);\r\n\r\n // Memoized event handlers\r\n const handleZoomIn = useCallback(() => {\r\n setCurrentScale(prev => Math.min(prev * scaleStep, maxScale));\r\n }, [scaleStep, maxScale]);\r\n\r\n const handleZoomOut = useCallback(() => {\r\n setCurrentScale(prev => Math.max(prev / scaleStep, minScale));\r\n }, [scaleStep, minScale]);\r\n\r\n const handleRefresh = useCallback(() => {\r\n setIsLoading(true);\r\n setError(null);\r\n \r\n if (refreshTimeoutRef.current) {\r\n clearTimeout(refreshTimeoutRef.current);\r\n }\r\n \r\n refreshTimeoutRef.current = setTimeout(() => {\r\n setIsLoading(false);\r\n }, refreshDelay);\r\n }, [refreshDelay]);\r\n\r\n const handleClick = useCallback(() => {\r\n if (onClick && !isLoading) {\r\n onClick(template);\r\n }\r\n }, [onClick, template, isLoading]);\r\n\r\n const handleDelete = useCallback((e) => {\r\n e.stopPropagation(); // Prevent triggering onClick\r\n if (onDelete && !template?.is_default) {\r\n onDelete(template);\r\n }\r\n }, [onDelete, template]);\r\n\r\n const handleMouseEnter = useCallback(() => {\r\n setIsHovered(true);\r\n }, []);\r\n\r\n const handleMouseLeave = useCallback(() => {\r\n setIsHovered(false);\r\n }, []);\r\n\r\n // Loading state\r\n if (isLoading) {\r\n return (\r\n <Box \r\n sx={{ \r\n width, \r\n height,\r\n borderRadius: 1,\r\n overflow: 'hidden',\r\n border: '1px solid',\r\n borderColor: 'divider'\r\n }}\r\n >\r\n <Skeleton \r\n variant=\"rectangular\" \r\n width=\"100%\" \r\n height=\"100%\" \r\n animation=\"wave\"\r\n />\r\n </Box>\r\n );\r\n }\r\n\r\n // Error state\r\n if (error) {\r\n return (\r\n <Box \r\n sx={{ \r\n width, \r\n height,\r\n borderRadius: 1,\r\n overflow: 'hidden',\r\n border: '1px solid',\r\n borderColor: 'error.main',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n backgroundColor: 'error.light',\r\n color: 'error.contrastText'\r\n }}\r\n >\r\n Failed to load template\r\n </Box>\r\n );\r\n }\r\n\r\n const isSelected = selectedTemplateId === template._id;\r\n const canZoomIn = currentScale < maxScale;\r\n const canZoomOut = currentScale > minScale;\r\n const canDelete = !template?.is_default;\r\n\r\n return (\r\n <Box \r\n sx={{ position: 'relative', display: 'inline-block' }}\r\n onMouseEnter={handleMouseEnter}\r\n onMouseLeave={handleMouseLeave}\r\n >\r\n {/* Main Container */}\r\n <Box\r\n ref={containerRef}\r\n onClick={handleClick}\r\n sx={(theme) => ({\r\n width,\r\n height,\r\n border: '1px solid',\r\n borderRadius: 1,\r\n overflow: 'hidden',\r\n position: 'relative',\r\n cursor: onClick ? 'pointer' : 'default',\r\n backgroundColor: '#fff',\r\n // boxShadow: '0 2px 8px rgba(0,0,0,0.1)',\r\n transition: 'all 0.2s ease-in-out',\r\n '&:hover': onClick ? {\r\n boxShadow: '0 4px 16px rgba(0,0,0,0.15)',\r\n transform: 'translateY(-1px)',\r\n } : {},\r\n borderColor: normalView && isSelected ? theme.palette.theme.primary[800] : 'grey.300',\r\n borderWidth: isSelected ? 2 : 1,\r\n })}\r\n >\r\n {/* Scaled Content Wrapper */}\r\n <Box\r\n sx={{\r\n width: scaledWidth,\r\n height: scaledHeight,\r\n transform: `scale(${currentScale})`,\r\n transformOrigin: 'top left',\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n overflow: 'hidden',\r\n }}\r\n >\r\n {/* HTML Content */}\r\n <Box\r\n ref={contentRef}\r\n sx={{\r\n width: '100%',\r\n height: '100%',\r\n userSelect: 'none',\r\n pointerEvents: 'none',\r\n pt: 2,\r\n '& *': {\r\n maxWidth: '100% !important',\r\n boxSizing: 'border-box !important',\r\n },\r\n // Reset common problematic styles\r\n '& body': {\r\n margin: '0 !important',\r\n padding: '0 !important',\r\n overflow: 'hidden !important',\r\n },\r\n // Handle images\r\n '& img': {\r\n maxWidth: '100% !important',\r\n height: 'auto !important',\r\n },\r\n // Handle tables\r\n '& table': {\r\n width: '100% !important',\r\n tableLayout: 'fixed !important',\r\n },\r\n // Prevent absolute positioning issues\r\n '& *[style*=\"position: absolute\"]': {\r\n position: 'relative !important',\r\n },\r\n '& .email-container': {\r\n width: '85% !important',\r\n }\r\n }}\r\n dangerouslySetInnerHTML={{ __html: template.contents }}\r\n />\r\n </Box>\r\n\r\n {/* Loading Overlay */}\r\n {isLoading && (\r\n <Box\r\n sx={{\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n backgroundColor: 'rgba(255,255,255,0.8)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: 2,\r\n }}\r\n >\r\n <Skeleton variant=\"rectangular\" width=\"90%\" height=\"90%\" />\r\n </Box>\r\n )}\r\n\r\n {/* Selection Indicator */}\r\n {template?.is_default && (\r\n <Box\r\n sx={(theme) => ({\r\n position: 'absolute',\r\n top: 8,\r\n left: 8,\r\n width: 12,\r\n height: 12,\r\n borderRadius: '50%',\r\n backgroundColor: theme.palette.theme?.primary[800],\r\n zIndex: 3,\r\n })}\r\n />\r\n )}\r\n </Box>\r\n {template?.name && <Typography type='s3' weight='medium' color='theme.secondary.1000' align='center' sx={{width, mt:0.5}}>{template?.name}</Typography>}\r\n\r\n {/* Hover Controls */}\r\n {showControls && (\r\n <Fade in={isHovered} timeout={200}>\r\n <Box\r\n sx={{\r\n position: 'absolute',\r\n top: -8,\r\n right: -8,\r\n display: 'flex',\r\n gap: 0.5,\r\n zIndex: 4,\r\n backgroundColor: 'rgba(255,255,255,0.95)',\r\n border: '1px solid',\r\n borderColor: 'grey.300',\r\n borderRadius: 2,\r\n padding: 0.5,\r\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\r\n backdropFilter: 'blur(4px)',\r\n }}\r\n >\r\n <Tooltip title={`Zoom In (${Math.round(currentScale * 100)}%)`} arrow>\r\n <span>\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleZoomIn}\r\n disabled={!canZoomIn}\r\n sx={{\r\n backgroundColor: 'transparent',\r\n '&:hover': { \r\n backgroundColor: 'primary.light',\r\n color: 'primary.contrastText' \r\n },\r\n '&:disabled': {\r\n opacity: 0.5\r\n }\r\n }}\r\n >\r\n <ZoomIn fontSize=\"small\" />\r\n </IconButton>\r\n </span>\r\n </Tooltip>\r\n\r\n <Divider orientation=\"vertical\" variant=\"middle\" flexItem />\r\n\r\n <Tooltip title={`Zoom Out (${Math.round(currentScale * 100)}%)`} arrow>\r\n <span>\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleZoomOut}\r\n disabled={!canZoomOut}\r\n sx={{\r\n backgroundColor: 'transparent',\r\n '&:hover': { \r\n backgroundColor: 'primary.light',\r\n color: 'primary.contrastText' \r\n },\r\n '&:disabled': {\r\n opacity: 0.5\r\n }\r\n }}\r\n >\r\n <ZoomOut fontSize=\"small\" />\r\n </IconButton>\r\n </span>\r\n </Tooltip>\r\n\r\n <Divider orientation=\"vertical\" variant=\"middle\" flexItem />\r\n\r\n <Tooltip title=\"Refresh Preview\" arrow>\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleRefresh}\r\n sx={{\r\n backgroundColor: 'transparent',\r\n '&:hover': { \r\n backgroundColor: 'primary.light',\r\n color: 'primary.contrastText' \r\n },\r\n }}\r\n >\r\n <Refresh fontSize=\"small\" />\r\n </IconButton>\r\n </Tooltip>\r\n\r\n {onDelete && (\r\n <>\r\n <Divider orientation=\"vertical\" variant=\"middle\" flexItem />\r\n <Tooltip \r\n title={canDelete ? \"Delete Template\" : \"Cannot delete default template\"} \r\n arrow\r\n >\r\n <span>\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleDelete}\r\n disabled={!canDelete}\r\n sx={{\r\n backgroundColor: 'transparent',\r\n '&:hover': !canDelete ? {} : { \r\n backgroundColor: 'error.light',\r\n color: 'error.contrastText' \r\n },\r\n '&:disabled': {\r\n opacity: 0.5\r\n }\r\n }}\r\n >\r\n <Trash fontSize=\"small\" />\r\n </IconButton>\r\n </span>\r\n </Tooltip>\r\n </>\r\n )}\r\n </Box>\r\n </Fade>\r\n )}\r\n </Box>\r\n );\r\n};\r\n\r\nexport { HtmlThumbnailPreview };\r\nexport default HtmlThumbnailPreview;","/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React, { useState, useRef, useEffect, useCallback } from 'react';\r\nimport { Box, Skeleton, IconButton, Tooltip, Divider, Fade } from '@mui/material';\r\nimport { ZoomIn, ZoomOut, Refresh } from '@mui/icons-material';\r\nimport { Trash } from '../../../components/icons';\r\nimport Typography from '../../../components/typography/typography';\r\n\r\ninterface HtmlThumbnailPreviewProps {\r\n template: any;\r\n width?: number | string; \r\n height?: number;\r\n scale?: number;\r\n showControls?: boolean;\r\n onClick?: (template: any) => void;\r\n selectedTemplateId?: string;\r\n isFetching?: boolean;\r\n onDelete?: (template: any) => void;\r\n normalView?: boolean;\r\n minScale?: number;\r\n maxScale?: number;\r\n scaleStep?: number;\r\n loadingDelay?: number;\r\n refreshDelay?: number;\r\n}\r\n\r\nconst HtmlThumbnailPreviewFull: React.FC<HtmlThumbnailPreviewProps> = ({\r\n template,\r\n width = '100%',\r\n height = 800,\r\n scale = 0.25,\r\n showControls = false,\r\n onClick = null,\r\n selectedTemplateId = '',\r\n isFetching = false,\r\n onDelete,\r\n normalView = false,\r\n minScale = 0.1,\r\n maxScale = 1,\r\n scaleStep = 1.2,\r\n loadingDelay = 500,\r\n refreshDelay = 300,\r\n}) => {\r\n const [isLoading, setIsLoading] = useState(isFetching || true);\r\n const [currentScale, setCurrentScale] = useState(scale);\r\n const [error, setError] = useState<null | string>(null);\r\n const [isHovered, setIsHovered] = useState(false);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const contentRef = useRef<HTMLDivElement>(null);\r\n const loadingTimeoutRef = useRef<any>(null);\r\n const refreshTimeoutRef = useRef<any>(null);\r\n\r\n const [containerPixelWidth, setContainerPixelWidth] = useState<number>(typeof width === 'number' ? width : 800);\r\n\r\n // Measure container width for responsive scaling\r\n useEffect(() => {\r\n const updateWidth = () => {\r\n if (containerRef.current) {\r\n const newWidth = containerRef.current.offsetWidth;\r\n setContainerPixelWidth(newWidth);\r\n }\r\n };\r\n updateWidth();\r\n window.addEventListener('resize', updateWidth);\r\n return () => window.removeEventListener('resize', updateWidth);\r\n }, []);\r\n\r\n const scaledWidth = containerPixelWidth / currentScale;\r\n const scaledHeight = height / currentScale;\r\n\r\n useEffect(() => {\r\n return () => {\r\n clearTimeout(loadingTimeoutRef.current);\r\n clearTimeout(refreshTimeoutRef.current);\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n clearTimeout(loadingTimeoutRef.current);\r\n loadingTimeoutRef.current = setTimeout(() => setIsLoading(false), loadingDelay);\r\n return () => clearTimeout(loadingTimeoutRef.current);\r\n }, [template.contents, loadingDelay]);\r\n\r\n useEffect(() => setIsLoading(isFetching), [isFetching]);\r\n\r\n const handleZoomIn = useCallback(() => setCurrentScale(prev => Math.min(prev * scaleStep, maxScale)), [scaleStep, maxScale]);\r\n const handleZoomOut = useCallback(() => setCurrentScale(prev => Math.max(prev / scaleStep, minScale)), [scaleStep, minScale]);\r\n const handleRefresh = useCallback(() => {\r\n setIsLoading(true);\r\n setError(null);\r\n clearTimeout(refreshTimeoutRef.current);\r\n refreshTimeoutRef.current = setTimeout(() => setIsLoading(false), refreshDelay);\r\n }, [refreshDelay]);\r\n\r\n const handleClick = useCallback(() => {\r\n if (onClick && !isLoading) onClick(template);\r\n }, [onClick, template, isLoading]);\r\n\r\n const handleDelete = useCallback((e: React.MouseEvent<HTMLButtonElement>) => {\r\n e.stopPropagation();\r\n if (onDelete && !template?.is_default) onDelete(template);\r\n }, [onDelete, template]);\r\n\r\n const handleMouseEnter = useCallback(() => setIsHovered(true), []);\r\n const handleMouseLeave = useCallback(() => setIsHovered(false), []);\r\n\r\n if (isLoading) return (\r\n <Box sx={{ width, height, borderRadius: 1, overflow: 'hidden', border: '1px solid', borderColor: 'divider' }}>\r\n <Skeleton variant=\"rectangular\" width=\"100%\" height=\"100%\" animation=\"wave\" />\r\n </Box>\r\n );\r\n\r\n if (error) return (\r\n <Box sx={{\r\n width, height, borderRadius: 1, overflow: 'hidden', border: '1px solid',\r\n borderColor: 'error.main', display: 'flex', alignItems: 'center', justifyContent: 'center',\r\n backgroundColor: 'error.light', color: 'error.contrastText'\r\n }}>\r\n Failed to load template\r\n </Box>\r\n );\r\n\r\n const isSelected = selectedTemplateId === template._id;\r\n const canZoomIn = currentScale < maxScale;\r\n const canZoomOut = currentScale > minScale;\r\n const canDelete = !template?.is_default;\r\n\r\n return (\r\n <Box\r\n ref={containerRef}\r\n sx={{ position: 'relative', width, marginInline: 'auto', display: 'inline-block' }}\r\n onMouseEnter={handleMouseEnter}\r\n onMouseLeave={handleMouseLeave}\r\n >\r\n <Box\r\n onClick={handleClick}\r\n sx={(theme) => ({\r\n width: '100%',\r\n height,\r\n marginBlock: 0,\r\n overflow: 'hidden',\r\n position: 'relative',\r\n backgroundColor: '#fff',\r\n transition: 'all 0.2s ease-in-out',\r\n '&:hover': onClick ? { boxShadow: '0 4px 16px rgba(0,0,0,0.15)', transform: 'translateY(-1px)' } : {},\r\n })}\r\n >\r\n <Box\r\n sx={{\r\n width: '100%',\r\n height: '100%',\r\n display: 'flex',\r\n justifyContent: 'center', \r\n alignItems: 'center', \r\n overflow: 'auto',\r\n backgroundColor: '#fff',\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n transform: `scale(${currentScale})`,\r\n transformOrigin: 'top left',\r\n pointerEvents: 'none',\r\n userSelect: 'none',\r\n width: containerPixelWidth,\r\n height: height,\r\n }}\r\n >\r\n <Box\r\n ref={contentRef}\r\n sx={{\r\n width: '100%',\r\n height: '100%',\r\n '& *': { maxWidth: '100% !important', boxSizing: 'border-box !important' },\r\n '& body': { margin: 0, padding: 0, overflow: 'hidden' },\r\n '& img': { maxWidth: '100% !important', height: 'auto !important' },\r\n '& table': { width: '100% !important', tableLayout: 'fixed !important' },\r\n '& *[style*=\"position: absolute\"]': { position: 'relative !important' },\r\n '& .email-container': { width: '85% !important' },\r\n }}\r\n dangerouslySetInnerHTML={{ __html: template.contents }}\r\n />\r\n </Box>\r\n </Box>\r\n\r\n {template?.is_default && (\r\n <Box sx={(theme) => ({ position: 'absolute', top: 8, left: 8, width: 12, height: 12, borderRadius: '50%', backgroundColor: theme.palette.theme.primary[800], zIndex: 3 })} />\r\n )}\r\n </Box>\r\n\r\n {template?.name && <Typography type='s3' weight='medium' color='theme.secondary.1000' align='center' sx={{ width, mt: 0.5 }}>{template?.name}</Typography>}\r\n\r\n {showControls && (\r\n <Fade in={isHovered} timeout={200}>\r\n <Box sx={{ position: 'absolute', top: -8, right: -8, display: 'flex', gap: 0.5, zIndex: 4, backgroundColor: 'rgba(255,255,255,0.95)', border: '1px solid', borderColor: 'grey.300', borderRadius: 2, padding: 0.5, boxShadow: '0 4px 12px rgba(0,0,0,0.15)', backdropFilter: 'blur(4px)' }}>\r\n <Tooltip title={`Zoom In (${Math.round(currentScale * 100)}%)`} arrow>\r\n <span><IconButton size=\"small\" onClick={handleZoomIn} disabled={!canZoomIn}><ZoomIn fontSize=\"small\" /></IconButton></span>\r\n </Tooltip>\r\n <Divider orientation=\"vertical\" flexItem />\r\n <Tooltip title={`Zoom Out (${Math.round(currentScale * 100)}%)`} arrow>\r\n <span><IconButton size=\"small\" onClick={handleZoomOut} disabled={!canZoomOut}><ZoomOut fontSize=\"small\" /></IconButton></span>\r\n </Tooltip>\r\n <Divider orientation=\"vertical\" flexItem />\r\n <Tooltip title=\"Refresh Preview\" arrow>\r\n <IconButton size=\"small\" onClick={handleRefresh}><Refresh fontSize=\"small\" /></IconButton>\r\n </Tooltip>\r\n {onDelete && <>\r\n <Divider orientation=\"vertical\" flexItem />\r\n <Tooltip title={canDelete ? \"Delete Template\" : \"Cannot delete default template\"} arrow>\r\n <span><IconButton size=\"small\" onClick={handleDelete} disabled={!canDelete}><Trash fontSize=\"small\" /></IconButton></span>\r\n </Tooltip>\r\n </>}\r\n </Box>\r\n </Fade>\r\n )}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default HtmlThumbnailPreviewFull;","/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable react-hooks/exhaustive-deps */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React, { useEffect, useState } from 'react';\r\nimport { \r\n DialogTitle, \r\n DialogContent, \r\n DialogActions,\r\n IconButton,\r\n Box,\r\n MenuItem\r\n} from '@mui/material';\r\nimport CloseIcon from '@mui/icons-material/Close';\r\nimport Typography from '../../../components/typography/typography';\r\nimport Modal from '../../../components/modal/modal';\r\nimport { deleteV1TemplatesId, getV1Templates, patchV1TemplatesIdSetDefault } from '../../../api-client/api.system-feature/api';\r\nimport { getErrorMessage, getToken } from '../../../utils/common';\r\nimport Button from '../../../components/button/button';\r\n// import ModalLoader from '../../../components/loader/modal-loader';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { enqueueSnackbar } from 'notistack';\r\nimport Select from '../../../components/select/select';\r\nimport HtmlThumbnailPreview from './html-thumbnail-preview';\r\nimport HtmlThumbnailPreviewFull from './html-thumbnail-preview-full';\r\nimport ConfirmPopUp from '../../../components/confirm-modal/confirm-modal';\r\n\r\nconst TemplateModal = ({ email, onClose, open, companies = [], templateRoutes, source = 'add' }) => {\r\n const [templates, setTemplates] = useState([]);\r\n const [selectedTemplate, setSelectedTemplate] = useState('');\r\n const [defaultTemplate, setDefaultTemplate] = useState('');\r\n const [loading, setLoding] = useState(true);\r\n const [selectedCompany, setSelectedCompany] = React.useState<number>(companies?.[0]?.id || 0);\r\n const [templateToDelete, setTemplateToDelete] = React.useState<Record<string, any> | null>(null);\r\n const [selectedTemplateForPreview, setSelectedTemplateForPreview] = useState(null);\r\n\r\n const navigate = useNavigate();\r\n\r\n const handleClose = () => {\r\n onClose();\r\n };\r\n\r\n const handleViewTemplate = () => {\r\n navigate(templateRoutes.EDIT_TEMPLATE(email._id, selectedTemplate), { \r\n state: { company_id: selectedCompany, isViewOnly: true, fromPreview: true }\r\n });\r\n };\r\n\r\n const handleTemplateSelect = (id: any) => {\r\n if (source === 'view') {\r\n const template = templates.find((t: any) => t?._id === id);\r\n setSelectedTemplateForPreview(template);\r\n setSelectedTemplate(id);\r\n handleViewTemplate();\r\n } else {\r\n setSelectedTemplate(id);\r\n }\r\n }\r\n\r\n const getTemplatesViaSubject = async () => {\r\n setLoding(true)\r\n const res = await getV1Templates({ ...getToken(), filters: `(company_id.eq=${selectedCompany}&subject_id.eq=${email._id})` })\r\n if(res?.data) {\r\n const dTemplate = res?.data?.find(t => t.is_default === true)\r\n setDefaultTemplate(dTemplate)\r\n setSelectedTemplate(dTemplate?._id)\r\n setTemplates(res?.data)\r\n }\r\n\r\n setLoding(false)\r\n }\r\n\r\n const handleDefaultTemplate = async () => {\r\n try {\r\n await patchV1TemplatesIdSetDefault({ ...getToken(), id: selectedTemplate })\r\n enqueueSnackbar('Template has been set as default');\r\n } catch (error) {\r\n const m = getErrorMessage(error?.message);\r\n enqueueSnackbar(m, { variant: 'error' });\r\n }\r\n }\r\n\r\n const handleDeleteTemplate = async () => {\r\n try {\r\n if(templateToDelete) {\r\n await deleteV1TemplatesId({ ...getToken(), id: templateToDelete?._id })\r\n enqueueSnackbar('Template has been deleted');\r\n setTemplateToDelete(null)\r\n await getTemplatesViaSubject()\r\n }\r\n } catch (error) {\r\n const m = getErrorMessage(error?.message);\r\n enqueueSnackbar(m, { variant: 'error' });\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n getTemplatesViaSubject()\r\n return () => { setLoding(true) }\r\n }, [selectedCompany])\r\n\r\n return (\r\n <div>\r\n <Modal \r\n open={open} \r\n onClose={handleClose} \r\n maxWidth=\"lg\" \r\n fullWidth\r\n aria-labelledby=\"email-template-selection\"\r\n sx={{\r\n '& .MuiDialog-paper': {\r\n height: '85vh',\r\n display: 'flex',\r\n flexDirection: 'column'\r\n }\r\n }}\r\n >\r\n\r\n {console.log(source, \"soure in modal +++++++++++++++++++++++debug\")}\r\n {/* {loading && <ModalLoader/>} */}\r\n <DialogTitle sx={{ marginBottom: '1rem', padding: '0.75rem 1rem 0.75rem 1.5rem', borderBottom: '1px solid #D3D3D4'}}>\r\n <Box display='flex' alignItems='center' gap={2}>\r\n {selectedTemplateForPreview && (\r\n <IconButton\r\n onClick={() => setSelectedTemplateForPreview(null)}\r\n size='small'\r\n sx={{ color: (theme) => theme.palette.grey[700] }}\r\n >\r\n <Typography>← Back</Typography>\r\n </IconButton>\r\n )}\r\n <Typography type='s1' weight='medium' color='theme.secondary.1000' sx={{ flex: 1, textAlign: 'center' }}> \r\n {selectedTemplateForPreview ? 'Template Preview' : (source === 'view' ? 'Template Preview' : 'Select Template')}\r\n </Typography>\r\n </Box>\r\n <Box display='flex' alignItems={'center'} gap={1} position='absolute' right='1%' top='4px'>\r\n <Typography type='s3' weight='medium' color='theme.secondary.800'> Company</Typography>\r\n <Select\r\n displayEmpty\r\n value={selectedCompany}\r\n size='small'\r\n renderValue={(value) => value ? companies.find((option) => option.value === value)?.label : 'Select Company'}\r\n // fullWidth\r\n // sx={{\r\n // bgcolor: 'white',\r\n // borderRadius: 1,\r\n // '& .MuiSelect-select': { py: 0.75 }\r\n // }}\r\n onChange={(e) => {\r\n if (e.target.value) {\r\n setSelectedCompany(e.target.value as number);\r\n }\r\n }}>\r\n {companies.map((option) => (\r\n <MenuItem key={option.value} value={option.value}>\r\n <Typography type='s3' color='theme.secondary.1000'>{option.label}</Typography>\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n <IconButton\r\n aria-label=\"close\"\r\n onClick={handleClose}\r\n size='small'\r\n sx={{\r\n color: (theme) => theme.palette.grey[500],\r\n }}\r\n >\r\n <CloseIcon fontSize='small'/>\r\n </IconButton>\r\n </Box>\r\n </DialogTitle>\r\n \r\n {\r\n selectedTemplateForPreview ? (\r\n <DialogContent sx={{ display: 'flex', flexDirection: 'column', gap: 3, width: '100%', p: 3, flex: 1, overflow: 'auto', scrollbarWidth: 'none', msOverflowStyle: 'none', '&::-webkit-scrollbar': { display: 'none' } }}>\r\n {/* Main Preview */}\r\n <Box sx={{ width: '100%', display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}>\r\n <HtmlThumbnailPreviewFull\r\n template={selectedTemplateForPreview}\r\n width={'100%'}\r\n height={600}\r\n scale={1}\r\n showControls={true}\r\n isFetching={loading}\r\n normalView={true}\r\n />\r\n </Box>\r\n </DialogContent>\r\n ) : (\r\n <DialogContent sx={{ flex: 1, overflow: 'auto', display: 'flex', flexDirection: 'column', scrollbarWidth: 'none', msOverflowStyle: 'none', '&::-webkit-scrollbar': { display: 'none' } }}>\r\n {/* <Grid container spacing={6}> */}\r\n {!templates.length && (\r\n // <Grid item xs={12} sx={{ minHeight: 350}}>\r\n <Box display='flex' alignItems='center' width='100%' height='100%' justifyContent='center'>\r\n {!loading && <Typography type='s1' weight='medium' color='theme.secondary.1000' sx={{ textAlign: 'center' }}>No templates found</Typography>}\r\n </Box>\r\n // </Grid>\r\n )}\r\n <Box sx={{ \r\n display: 'grid', \r\n gridTemplateColumns: 'repeat(auto-fill, minmax(300px, 1fr))', \r\n gap: 2, \r\n p: 2,\r\n justifyItems: 'center',\r\n alignItems: 'center'\r\n }}>\r\n {templates.map((template, index) => (\r\n <HtmlThumbnailPreview\r\n key={template._id || index}\r\n template={template}\r\n width={300}\r\n height={200}\r\n showControls={source === 'add'}\r\n selectedTemplateId={selectedTemplate}\r\n onClick={(template: any) => {\r\n handleTemplateSelect(template._id)\r\n }}\r\n normalView={source === 'add'}\r\n isFetching={loading}\r\n onDelete={(template: any) => setTemplateToDelete(template)}\r\n />\r\n ))}\r\n </Box>\r\n </DialogContent>\r\n )}\r\n {source === 'add' && (\r\n <DialogActions sx={{ p: 2, justifyContent: 'center', borderTop: '1px solid #D3D3D4' }}>\r\n <Button\r\n onClick={() => navigate(templateRoutes.EDIT_TEMPLATE(email._id, selectedTemplate), { state: { company_id: selectedCompany } })}\r\n disabled={!selectedTemplate}\r\n >\r\n Continue\r\n </Button>\r\n <Button\r\n onClick={() => handleDefaultTemplate()}\r\n disabled={!selectedTemplate || defaultTemplate?._id === selectedTemplate}\r\n >\r\n Set to Default\r\n </Button>\r\n </DialogActions>\r\n )}\r\n </Modal>\r\n <ConfirmPopUp\r\n open={templateToDelete !== null}\r\n onClose={() => setTemplateToDelete(null)}\r\n title='Remove Template'\r\n description='Are you sure you want to delete ?'\r\n onConfirm={() => handleDeleteTemplate()}\r\n loading={loading}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport { TemplateModal };\r\nexport default TemplateModal;","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport React from 'react';\r\n\r\nimport Modal from '../../../components/modal/modal';\r\nimport Typography from '../../../components/typography/typography';\r\nimport Button from '../../../components/button/button';\r\nimport Select from '../../../components/select/select';\r\n\r\nimport {\r\n\tBox,\r\n\tDialogActions,\r\n\tDialogContent,\r\n\tDialogProps,\r\n\tDialogTitle,\r\n\tIconButton,\r\n\tMenuItem\r\n} from '@mui/material';\r\nimport Close from '@mui/icons-material/Close';\r\n\r\nimport './company-selection-modal.scss';\r\nimport { IEmail } from '../utils/types';\r\nimport { enqueueSnackbar } from 'notistack';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\ninterface CompanySelectionModalProps {\r\n\tisOpen: boolean;\r\n\tsetIsOpen: (value: IEmail | null) => void;\r\n\tmodalProps?: DialogProps;\r\n\temail: IEmail;\r\n\tcompanies: Record<string, any>[];\r\n\ttemplateRoutes: Record<string, any>\r\n}\r\n\r\nconst CompanySelectionModal: React.FC<CompanySelectionModalProps> = ({\r\n\tisOpen,\r\n\tsetIsOpen,\r\n\tmodalProps,\r\n\tcompanies,\r\n\temail,\r\n\ttemplateRoutes\r\n}) => {\r\n\r\n\tconst navigate = useNavigate();\r\n\tconst [selectedCompany, setSelectedCompany] = React.useState<number>(0);\r\n\r\n\tconst handleModalClose = () => {\r\n\t\tsetIsOpen(null);\r\n\t};\r\n\r\n\tconst handleContinue = () => {\r\n\t\tif(!selectedCompany) {\r\n\t\t\tenqueueSnackbar('Please select a company', { variant: 'error' });\r\n\t\t\treturn;\r\n\t\t} else if(!email) {\r\n\t\t\tenqueueSnackbar('Something went wrong for a subject', { variant: 'error' });\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tnavigate(templateRoutes.ADD_TEMPLATE(email._id), { state: { company_id: selectedCompany }})\r\n\t}\r\n\r\n\treturn (\r\n\t\t<Modal\r\n\t\t\topen={isOpen}\r\n\t\t\tonClose={handleModalClose}\r\n\t\t\tmaxWidth='xs'\r\n\t\t\tfullWidth\r\n\t\t\t{...modalProps}>\r\n\t\t\t<DialogTitle className='companySelectionModal--DialogTitle'>\r\n\t\t\t\t<Typography type='s3' color='inherit' weight='medium'>\r\n\t\t\t\t\tSelect Company\r\n\t\t\t\t</Typography>\r\n\t\t\t\t<IconButton onClick={handleModalClose}>\r\n\t\t\t\t\t<Close fontSize='small' />\r\n\t\t\t\t</IconButton>\r\n\t\t\t</DialogTitle>\r\n\t\t\t<DialogContent className='companySelectionModal--DialogContents'>\r\n\t\t\t\t<Select\r\n\t\t\t\t\tdisplayEmpty\r\n\t\t\t\t\tvalue={selectedCompany}\r\n\t\t\t\t\tsize='small'\r\n\t\t\t\t\trenderValue={(value) => value ? companies.find((option) => option.value === value)?.label : 'Select Company'}\r\n\t\t\t\t\tfullWidth\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\tbgcolor: 'white',\r\n\t\t\t\t\t\tborderRadius: 1,\r\n\t\t\t\t\t\t'& .MuiSelect-select': { py: 0.75 }\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tonChange={(e) => {\r\n\t\t\t\t\t\tif (e.target.value) {\r\n\t\t\t\t\t\t\tsetSelectedCompany(e.target.value as number);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}>\r\n\t\t\t\t\t{companies.map((option) => (\r\n\t\t\t\t\t\t<MenuItem key={option.value} value={option.value}>\r\n\t\t\t\t\t\t\t<Typography type='s4' color='theme.secondary.1000'>{option.label}</Typography>\r\n\t\t\t\t\t\t</MenuItem>\r\n\t\t\t\t\t))}\r\n\t\t\t\t</Select>\r\n\t\t\t</DialogContent>\r\n\t\t\t<DialogActions className='companySelectionModal--DialogAction'>\r\n\t\t\t\t<Box display='flex' gap={1.5}>\r\n\t\t\t\t\t<Button className='companySelectionModal--DialogAction--WhiteBtn' onClick={handleModalClose}>Cancel</Button>\r\n\t\t\t\t\t<Button onClick={() => handleContinue()} disabled={!selectedCompany}>Continue</Button>\r\n\t\t\t\t</Box>\r\n\t\t\t</DialogActions>\r\n\t\t</Modal>\r\n\t);\r\n};\r\n\r\nexport default CompanySelectionModal;\r\n","/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable react-hooks/exhaustive-deps */\r\n/* eslint-disable unused-imports/no-unused-vars */\r\nimport { useCallback, useEffect, useMemo, useState } from 'react';\r\n\r\nimport ActionBar from '../../components/action-bar/action-bar';\r\nimport viewTypes from '../../constants/action-bar';\r\nimport MaterialTable, { MaterialTableColumnProps } from '../../components/material-table/material-table';\r\nimport Typography from '../../components/typography/typography';\r\nimport Fallback from '../../components/fallback/fallback';\r\nimport Menu from '../../components/menu/menu';\r\nimport Footer from '../../components/footer/footer';\r\nimport useDeepMemo from '../../hooks/use-deep-memo';\r\nimport { PageState } from '../../contexts/page-context';\r\nimport { usePages } from '../../hooks/use-pages';\r\nimport { transformTableColumns } from '../../utils/common-utility';\r\nimport { appendConditionSafely, defaultCurrencySymbol, getToken } from '../../utils/common';\r\nimport logo from '../../assets/images';\r\nimport { IPaginationModel } from '../../@types/pagination-model';\r\nimport { fetchApi } from '../../utils/api';\r\n\r\nimport { MenuItem } from '@mui/material';\r\n\r\n// import GridCard from './grid-view/grid-view';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { enqueueSnackbar } from 'notistack';\r\n\r\nimport { templateRoutes } from './utils/common';\r\nimport { IEmail, ITemplateProps, Pagination } from './utils/types';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\nimport { usePermissions } from '../../hooks/use-permissions';\r\nimport { getV1Subjects } from '../../api-client/api.system-feature/api';\r\nimport TemplateModal from './template-modal/template-modal';\r\nimport CompanySelectionModal from './company-selection-modal/company-selection-modal';\r\n\r\nimport './templates.scss';\r\n\r\n\r\ninterface ActionData {\r\n\tlabel: string;\r\n\tposition: number;\r\n}\r\n\r\nconst Templates: React.FC<ITemplateProps> = ({ type, module, modulePath }) => {\r\n\tconst { t } = useTranslation();\r\n\tconst {\r\n\t\tactivePage: aPage,\r\n\t\tupdatePageInfo,\r\n\t\tschemaFields,\r\n\t\tgeneratedColumns,\r\n\t\tupdateGeneratedColumns,\r\n\t\t// error: pageError\r\n\t} = usePages();\r\n\tconst activePage = useDeepMemo<PageState>(aPage);\r\n\t/* LOCAL STATES */\r\n\tconst [actionAnchorEl, setActionAnchorEl] = useState<null | HTMLElement>(null);\r\n\tconst viewEmails = localStorage.getItem('email-subjects-view');\r\n\tconst [actionBarData, setActionBarData] = useState<ActionData[]>(viewEmails ? JSON.parse(viewEmails) : [{ label: 'Table', position: 0 }]);\r\n\r\n\tconst [actionBarActiveTab, setActionBarActiveTab] = useState<string>(viewTypes.TABLE);\r\n\tconst [paginationModel, setPaginationModel] = useState<Pagination>({ pageNo: 1, limit: 10, totalCount: 0, skip: 0 });\r\n\tconst [rows, setRows] = useState<any[]>([]);\r\n\tconst [isFetching, setIsFetching] = useState<boolean>(false);\r\n\tconst [selectedRow, setSelectedRow] = useState([]);\r\n\tconst [showTemplateModal, setShowTemplateModal] = useState<IEmail | null>(null);\r\n\tconst [templateModalSource, setTemplateModalSource] = useState<'view' | 'add'>('add');\r\n\tconst [showCompanySelectionModal, setShowCompanySelectionModal] = useState<IEmail | null>(null);\r\n\tconst [companies, setCompanies] = useState<Record<string, any>[]>([]);\r\n\t/* VARS */\r\n\tconst navigate = useNavigate();\r\n\tconst { pageNo, limit: pLimit, totalCount } = paginationModel;\r\n\tconst limit = activePage.page_size || pLimit;\r\n\tconst total = limit ? Math.ceil(totalCount / limit) : 0;\r\n\tconst skip = limit * (pageNo - 1);\r\n\tconst permissions = usePermissions();\r\n\tconst ROUTES = templateRoutes(modulePath, type);\r\n\r\n\tconst SubjectPermissions = permissions?.Subjects || {};\r\n\tconst ConditionsImport = permissions?.RentalTerms?.ConditionsImport || {};\r\n\r\n\tconst {\r\n\t\tcanAdd = false,\r\n\t\tcanEdit = false,\r\n\t\tcanDelete = false,\r\n\t} = SubjectPermissions;\r\n\r\n\tconst { canAdd: canImport = false } = ConditionsImport;\r\n\r\n\tconst handleNewEmail = (email) => {\r\n\t\tif (!companies?.length) {\r\n\t\t\tenqueueSnackbar('Please add a company first', { variant: 'error' })\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tif (companies?.length > 1) {\r\n\t\t\tsetShowCompanySelectionModal(email)\r\n\t\t} else {\r\n\t\t\tnavigate(ROUTES.ADD_TEMPLATE(email._id), { state: { company_id: companies[0]?.id || companies[0]?.value } })\r\n\t\t}\r\n\t};\r\n\r\n\tconst rowActionMenu = [\r\n\t\t{\r\n\t\t\tlabel: 'New Template',\r\n\t\t\thandleAction: (email: IEmail) => handleNewEmail(email),\r\n\t\t\tdisabled: (row: any) => !canEdit\r\n\t\t},\r\n\t\t{\r\n\t\t\tlabel: 'Add From Template',\r\n\t\t\thandleAction: (email: IEmail) => {\r\n setTemplateModalSource('add'); \r\n setShowTemplateModal(email); },\r\n\t\t\tdisabled: (row: any) => !canAdd\r\n\t\t}\r\n\t];\r\n\r\n\t/* LOCAL FUNCTIONS */\r\n\tconst getEmails = useCallback(\r\n\t\tasync () => {\r\n\t\t\tconst { sort, filterQueryString, search } = activePage;\r\n\t\t\tconst searchFiters = search ? `&subject.like=${search}` : '';\r\n\t\t\tconst types = [];\r\n\t\t\ttypes.push(type)\r\n\t\t\tif (type == \"email\") {\r\n\t\t\t\ttypes.push(\"approval_email\")\r\n\t\t\t}\r\n\t\t\tconst uFilters = appendConditionSafely(filterQueryString, `&type.in=[${types.join(\",\")}]&module.eq=${module}${searchFiters}`);\r\n\r\n\t\t\tconst response = await getV1Subjects({\r\n\t\t\t\t...getToken(),\r\n\t\t\t\tskip,\r\n\t\t\t\tlimit,\r\n\t\t\t\t// search,\r\n\t\t\t\t...(sort && { order: `${sort.id}:${sort.desc ? -1 : 1}` }),\r\n\t\t\t\t...(uFilters && uFilters !== '()' && { filters: uFilters })\r\n\t\t\t});\r\n\r\n\t\t\tsetRows(response?.data || []);\r\n\t\t\tsetPaginationModel({ ...paginationModel, ...(response?.pagination || {}) });\r\n\t\t},\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t\t[\r\n\t\t\tlimit,\r\n\t\t\tskip,\r\n\t\t\tactivePage?.search,\r\n\t\t\tactivePage?.filterQueryString,\r\n\t\t\tactivePage?.sort\r\n\t\t]\r\n\t);\r\n\r\n\tconst getCopmanies = async () => {\r\n\t\tconst companiesArr = await fetchApi({ apiKey: 'company', filters: { skip: 0, limit: 100, order: \"id:1\" } });\r\n\t\tsetCompanies(companiesArr?.data || []);\r\n\t}\r\n\r\n\tconst tableRows = useMemo(() => rows || [], [rows]);\r\n\r\n\tconst tableColumns = useMemo(\r\n\t\t() =>\r\n\t\t\ttransformTableColumns({\r\n\t\t\t\tcolumns: generatedColumns.columns,\r\n\t\t\t\tcurrencySymbol: (row) =>\r\n\t\t\t\t\trow.original?.currency_data?.symbol || defaultCurrencySymbol(),\r\n\t\t\t\ttranslationFn: t,\r\n\t\t\t\tenableFooter: true,\r\n\t\t\t\t// redirectionLink: ROUTES.VIEW,\r\n\t\t\t\t// redirectionLinkState: (row) => ({ termsAndCondition: row.original }),\r\n\t\t\t\trows: tableRows,\r\n\t\t\t\tstatusClasses: ``,\r\n\t\t\t}),\r\n\t\t[tableRows, t, generatedColumns.columns]\r\n\t);\r\n\r\n\tconst handlePaginationModel = (model: IPaginationModel) => {\r\n\t\tif (activePage.page_size != model?.limit) {\r\n\t\t\tupdatePageInfo({ page_size: model.limit });\r\n\t\t}\r\n\t\tsetPaginationModel(model);\r\n\t};\r\n\r\n\tconst cleanUp = () => {\r\n\t\tconst pModel = { pageNo: 1, limit: 10, totalCount: 0 };\r\n\t\tsetPaginationModel(pModel);\r\n\t};\r\n\r\n\t/* USE EFFECTS */\r\n\tuseEffect(() => {\r\n\t\tgetEmails();\r\n\t}, [getEmails]);\r\n\r\n\r\n\tuseEffect(() => {\r\n\t\tgetCopmanies();\r\n\t\treturn cleanUp;\r\n\t}, []);\r\n\tuseEffect(() => {\r\n\t\tif (actionBarData?.length) {\r\n\t\t\tlocalStorage.setItem('email-subjects-view', JSON.stringify(actionBarData));\r\n\t\t}\r\n\t}, [actionBarData]);\r\n\r\n\t/* JSX STRUCTURE STARTED */\r\n\treturn (\r\n\t\t<section className='templates'>\r\n\t\t\t<ActionBar\r\n\t\t\t\ttitle={type === 'email' ? 'Emails' : 'PDFs'}\r\n\t\t\t\tdata={actionBarData}\r\n\t\t\t\tsetData={setActionBarData}\r\n\t\t\t\tactive={actionBarActiveTab}\r\n\t\t\t\tsetActive={setActionBarActiveTab}\r\n\t\t\t\thandleSearch={(search) => {\r\n\t\t\t\t\tupdatePageInfo({ search });\r\n\t\t\t\t\tsetPaginationModel({ ...paginationModel, pageNo: 1 });\r\n\t\t\t\t}}\r\n\t\t\t\tdisabledViews={['Kanban', 'Calendar', 'Gantt', viewTypes.GRID]}\r\n\t\t\t\tfields={schemaFields}\r\n\t\t\t\tselectedIds={selectedRow}\r\n\t\t\t\tbutton={false}\r\n\t\t\t/>\r\n\t\t\t{actionBarActiveTab === viewTypes.TABLE && (\r\n\t\t\t\t<MaterialTable\r\n\t\t\t\t\trows={tableRows || []}\r\n\t\t\t\t\tcolumns={tableColumns}\r\n\t\t\t\t\tpaginationModel={paginationModel}\r\n\t\t\t\t\ttotalPages={total}\r\n\t\t\t\t\tcolumnOrder={['mrt-row-select', ...generatedColumns.orderKeys]}\r\n\t\t\t\t\tstates={{ isLoading: isFetching }}\r\n\t\t\t\t\tonSortingChange={(sort) => updatePageInfo({ sort })}\r\n\t\t\t\t\tenableColumnDragging={false}\r\n\t\t\t\t\tenableEditing={false}\r\n\t\t\t\t\tonSelectRow={(r) =>\r\n\t\t\t\t\t\tsetSelectedRow(r.map((ele) => ele.original.id))\r\n\t\t\t\t\t}\r\n\t\t\t\t\tenableAddCustomField={false}\r\n\t\t\t\t\trowActionMenu={rowActionMenu}\r\n\t\t\t\t\tisResetRow={false}\r\n\t\t\t\t\thandleColumnOrdering={(colOrder) =>\r\n\t\t\t\t\t\tupdateGeneratedColumns({ orderKeys: colOrder.slice(1) })\r\n\t\t\t\t\t}\r\n\t\t\t\t\tonColumnVisibility={(columns: MaterialTableColumnProps[]) =>\r\n\t\t\t\t\t\tupdateGeneratedColumns({ columns: columns })\r\n\t\t\t\t\t}\r\n\t\t\t\t\tshowPreview={true}\r\n\t\t\t\t\t\t\thandlePreview={(item) => {\r\n\t\t\t\t\t\t\t\t\tsetTemplateModalSource('view');\r\n\t\t\t\t\t\t\t\t\tsetShowTemplateModal(item);\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t)}\r\n\t\t\t{actionBarActiveTab === viewTypes.GRID && (\r\n\t\t\t\t<GridCard\r\n\t\t\t\t\tdata={tableRows}\r\n\t\t\t\t\trowActionMenu={rowActionMenu}\r\n\t\t\t\t/>\r\n\t\t\t)}\r\n\r\n\t\t\t{!actionBarActiveTab && (\r\n\t\t\t\t<Fallback\r\n\t\t\t\t\theading={t('rental.settings.termsAndConditions.title')}\r\n\t\t\t\t\tsubHeading='No data available'\r\n\t\t\t\t\ticon={<img src={logo.invoiceFallback} />}>\r\n\t\t\t\t</Fallback>\r\n\t\t\t)}\r\n\r\n\t\t\t<Footer\r\n\t\t\t\ttotal={total}\r\n\t\t\t\tpaginationModel={{\r\n\t\t\t\t\t...paginationModel,\r\n\t\t\t\t\tlimit: activePage.page_size\r\n\t\t\t\t}}\r\n\t\t\t\thandlePaginationModel={handlePaginationModel}\r\n\t\t\t\tresource=''\r\n\t\t\t/>\r\n\r\n\t\t\t{/* Action Menu */}\r\n\t\t\t<Menu\r\n\t\t\t\tanchorEl={actionAnchorEl}\r\n\t\t\t\topen={Boolean(actionAnchorEl)}\r\n\t\t\t\tonClose={() => setActionAnchorEl(null)}>\r\n\t\t\t\t<MenuItem>\r\n\t\t\t\t\t<Typography type='s4' color='theme.secondary.1000'>\r\n\t\t\t\t\t\t{t('common.upload')}\r\n\t\t\t\t\t</Typography>\r\n\t\t\t\t</MenuItem>\r\n\t\t\t\t<MenuItem>\r\n\t\t\t\t\t<Typography type='s4' color='theme.secondary.1000'>\r\n\t\t\t\t\t\t{t('common.print')}\r\n\t\t\t\t\t</Typography>\r\n\t\t\t\t</MenuItem>\r\n\t\t\t</Menu>\r\n\t\t\t{showTemplateModal && (\r\n\t\t\t\t<TemplateModal\r\n\t\t\t\t\temail={showTemplateModal}\r\n\t\t\t\t\tonClose={() => setShowTemplateModal(null)}\r\n\t\t\t\t\topen={showTemplateModal !== null}\r\n\t\t\t\t\tcompanies={companies}\r\n\t\t\t\t\ttemplateRoutes={ROUTES}\r\n\t\t\t\t\tsource={templateModalSource}\r\n\t\t\t\t/>\r\n\t\t\t)}\r\n\t\t\t{showCompanySelectionModal && (\r\n\t\t\t\t<CompanySelectionModal\r\n\t\t\t\t\tisOpen={showCompanySelectionModal !== null}\r\n\t\t\t\t\tsetIsOpen={setShowCompanySelectionModal}\r\n\t\t\t\t\tcompanies={companies}\r\n\t\t\t\t\temail={showCompanySelectionModal}\r\n\t\t\t\t\ttemplateRoutes={ROUTES}\r\n\t\t\t\t/>\r\n\t\t\t)}\r\n\t\t</section>\r\n\t);\r\n};\r\n\r\nexport default Templates;\r\n","// React imports\r\nimport React, { useEffect, useState } from 'react';\r\n\r\n// Material UI imports\r\nimport { Box, IconButton, TextField, InputAdornment } from '@mui/material';\r\nimport { Add, Remove } from '@mui/icons-material';\r\n\r\nexport interface IColumnWidthProps {\r\n onChange: (value: number) => void;\r\n}\r\n\r\nexport const ColumnWidth = ({onChange}: IColumnWidthProps) => {\r\n const [value, setValue] = useState(6);\r\n\r\n const handleIncrement = () => {\r\n setValue(prev => prev + 1);\r\n };\r\n\r\n const handleDecrement = () => {\r\n setValue(prev => Math.max(0, prev - 1)); // Prevent negative values\r\n };\r\n\r\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const newValue = Number.parseInt(event.target.value) || 0;\r\n setValue(Math.max(0, newValue));\r\n };\r\n\r\n useEffect(() => {\r\n onChange(value);\r\n }, [value]);\r\n\r\n return (\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2, p: 4 }}>\r\n <TextField\r\n value={value}\r\n onChange={handleInputChange}\r\n name='custom_width'\r\n size=\"small\"\r\n sx={{\r\n width: '120px',\r\n '& .MuiOutlinedInput-root': {\r\n paddingLeft: 0,\r\n paddingRight: 0,\r\n '& input': {\r\n textAlign: 'center',\r\n padding: '8px 4px',\r\n }\r\n }\r\n }}\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <IconButton\r\n onClick={handleDecrement}\r\n size=\"small\"\r\n sx={{\r\n marginLeft: '-4px',\r\n borderRadius: '4px 0 0 4px',\r\n border: 'none',\r\n '&:hover': {\r\n backgroundColor: 'rgba(0, 0, 0, 0.04)'\r\n }\r\n }}\r\n >\r\n <Remove fontSize=\"small\" />\r\n </IconButton>\r\n </InputAdornment>\r\n ),\r\n endAdornment: (\r\n <InputAdornment position=\"end\">\r\n <IconButton\r\n onClick={handleIncrement}\r\n size=\"small\"\r\n sx={{\r\n marginRight: '-4px',\r\n borderRadius: '0 4px 4px 0',\r\n border: 'none',\r\n '&:hover': {\r\n backgroundColor: 'rgba(0, 0, 0, 0.04)'\r\n }\r\n }}\r\n >\r\n <Add fontSize=\"small\" />\r\n </IconButton>\r\n </InputAdornment>\r\n ),\r\n }}\r\n inputProps={{\r\n type: 'number',\r\n min: 0,\r\n }}\r\n />\r\n \r\n <Box sx={{ ml: 2, color: 'text.secondary' }}>\r\n Current value: {value}\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default ColumnWidth;","import { useEffect, useState } from \"react\";\r\n// import { useNavigate } from \"react-router-dom\";\r\nimport { Pathname } from \"../../../constants/pathnames/pathname\";\r\nimport { Box, Grid } from \"@mui/material\";\r\nimport { styled } from \"@mui/material/styles\";\r\nimport images from \"../../../assets/images\";\r\nimport DynamicInput from \"../../../components/form-control/form-builder/form-builder-element/text\";\r\nimport { useForm } from \"react-hook-form\";\r\nimport Typography from \"../../../components/typography/typography\";\r\nimport Button from \"../../../components/button/button\";\r\n// import DynamicCheckBox from \"../../../components/form-control/form-builder/form-builder-element/checkbox\";\r\n// import { Eye, EyeOff } from \"../../../components/icons\";\r\n// import { LoginFormValues } from \"../../../contexts/AuthContext\";\r\n// import { useAuth } from \"../../../hooks/useAuth\";\r\nimport Toast from \"../../../components/toast/toast\";\r\nimport * as Yup from \"yup\";\r\nimport { yupResolver } from \"@hookform/resolvers/yup\";\r\nimport { useAuth } from \"../../../hooks/useAuth\";\r\nimport { useNavigate } from \"react-router-dom\";\r\nimport { getApiConfig } from \"@/utils\";\r\n\r\nexport const ForgotPassword = () => {\r\n const { forgotPassword } = useAuth();\r\n const LoginContainer = styled(Grid)(() => ({\r\n height: \"100vh\",\r\n }));\r\n const navigate = useNavigate();\r\n interface IToast {\r\n message: string;\r\n type: \"normal\" | \"alert\";\r\n }\r\n const [toast, setToast] = useState<IToast | null>(null);\r\n\r\n const validationSchema = Yup.object({\r\n login: Yup.object({\r\n email: Yup.string()\r\n .required(\"Please enter email\")\r\n .email(\"Provided email is invalid\")\r\n }),\r\n });\r\n\r\n const { control, handleSubmit } = useForm<FormValeus>({\r\n resolver: yupResolver(validationSchema),\r\n mode: \"all\",\r\n });\r\n\r\n const LeftGrid = styled(Grid)(({ theme }) => ({\r\n [theme.breakpoints.down(\"sm\")]: {\r\n display: \"none\",\r\n },\r\n backgroundImage: `url(${images.login.LoginLeftBg})`,\r\n backgroundRepeat: \"no-repeat\",\r\n backgroundSize: \"cover\",\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n [theme.breakpoints.down(\"lg\")]: {\r\n \"& img\": {\r\n width: 350,\r\n height: 350,\r\n },\r\n },\r\n [theme.breakpoints.down(\"md\")]: {\r\n \"& img\": {\r\n width: 300,\r\n height: 300,\r\n },\r\n },\r\n }));\r\n\r\n const RightGrid = styled(Grid)(() => ({\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n padding: \"1rem\",\r\n }));\r\n \r\n const FlexBox = styled(Box)(() => ({\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n }));\r\n\r\n const onSubmit = async (values: FormValeus) => {\r\n await forgotPassword(values.login, (type, message) => {\r\n if (type) {\r\n setToast({ message: message, type: \"normal\" });\r\n setTimeout(() => {\r\n navigate(Pathname.LOGIN);\r\n }, 1500);\r\n } else {\r\n setToast({ message: message, type: \"alert\" });\r\n }\r\n });\r\n return values;\r\n };\r\n\r\n const handleBackToLogin = () => {\r\n navigate(Pathname.LOGIN);\r\n }\r\n\r\n useEffect(() => {});\r\n\r\n const appLogo = getApiConfig().appLogo || images.erp_logo\r\n\r\n return (\r\n <Box>\r\n <LoginContainer container>\r\n <LeftGrid item sm={6}>\r\n <img src={images.login.LoginLeftSiteImage} />\r\n </LeftGrid>\r\n <RightGrid item sm={6} xs={12}>\r\n <FlexBox\r\n display=\"flex\"\r\n flexDirection=\"column\"\r\n gap={4}\r\n sx={(theme) => ({\r\n minWidth: 400,\r\n [theme.breakpoints.down(\"md\")]: {\r\n minWidth: 300,\r\n },\r\n [theme.breakpoints.down(\"sm\")]: {\r\n minWidth: 300,\r\n },\r\n })}\r\n >\r\n <Box textAlign=\"center\">\r\n <img src={appLogo} width={160} height={55}/>\r\n </Box>\r\n <form onSubmit={handleSubmit(onSubmit)}>\r\n <FlexBox gap={4}>\r\n <FlexBox gap={3}>\r\n <Box>\r\n <Typography\r\n align=\"center\"\r\n type=\"h1\"\r\n weight=\"medium\"\r\n color=\"theme.secondary.1000\"\r\n >\r\n Forgot Password\r\n </Typography>\r\n <Typography\r\n align=\"center\"\r\n type=\"h5\"\r\n weight=\"normal\"\r\n color=\"theme.secondary81000\"\r\n >\r\n Enter your email to reset password\r\n </Typography>\r\n </Box>\r\n <FlexBox gap={2}>\r\n <Box>\r\n <DynamicInput\r\n formControl={control}\r\n label=\"Email\"\r\n name=\"email\"\r\n placeholder=\"Enter email\"\r\n fieldArrayName=\"login\"\r\n />\r\n </Box>\r\n </FlexBox>\r\n </FlexBox>\r\n <FlexBox gap={2}>\r\n <Button type=\"submit\" size=\"large\" variant=\"contained\">\r\n Reset Password\r\n </Button>\r\n <Button\r\n variant=\"text\"\r\n sx={(theme) => ({\r\n color: `${theme.palette.theme?.primary[\"700\"]} !important`,\r\n })}\r\n onClick = {handleBackToLogin}\r\n >\r\n Back to login\r\n </Button>\r\n </FlexBox>\r\n </FlexBox>\r\n </form>\r\n </FlexBox>\r\n </RightGrid>\r\n </LoginContainer>\r\n <Toast\r\n open={Boolean(toast)}\r\n message={toast?.message}\r\n type={toast?.type}\r\n handleClose={() => setToast(null)}\r\n anchorOrigin={{ horizontal: \"right\", vertical: \"bottom\" }}\r\n autoHideDuration={3000}\r\n />\r\n </Box>\r\n )\r\n}","import \"./landing.scss\";\r\n// import MetaComponent from '../../../utils/metaComponent';\r\n\r\nexport function Landing() {\r\n return (\r\n <div className=\"Landing\">\r\n {/* <MetaComponent\r\n\t\t\t\ttitle=\"Hi, This is dummy page title\"\r\n\t\t\t\tdescription=\"This is the dummy page description\"\r\n\t\t\t\tkeywords=\"dummy, keywords, dummy keywords, frontend template, frontend template by antino\"\r\n\t\t\t\tlocation={window.location}\r\n\t\t\t\timage=\"og_image.png\"\r\n\t\t\t/> */}\r\n <div className=\"Landing--Home\" id=\"home\">\r\n <div className=\"Landing--HomeAnimation\">\r\n <video\r\n className=\"Landing--HomeAnimationVideo\"\r\n autoPlay={true}\r\n muted\r\n loop={true}\r\n playsInline\r\n >\r\n <source\r\n src=\"https://ak.picdn.net/shutterstock/videos/1063309405/preview/stock-footage-modern-office-portrait-of-beautiful-authentic-specialist-with-short-pink-hair-standing-holding.webm\"\r\n type=\"video/mp4\"\r\n />\r\n </video>\r\n </div>\r\n <div className=\"Landing--HomeContent\">\r\n <div className=\"Landing--HomeContentTop\">\r\n <h1 className=\"Landing--SubTitle\">\r\n Introducing Dummy\r\n <span style={{ fontWeight: \"700\" }}> Land, </span>\r\n </h1>\r\n <h1 className=\"Landing--Para\">\r\n This is the hero section.Lorem ipsum dolor sit amet, consectetur\r\n adipisicing elit.Dicta fugiat perspiciatis temporibus ut impedit\r\n expedita maiores officiis porro ? At commodi suscipit atque\r\n eligendi cumque ? Impedit magnam eligendi fugiat.Non, quam.\r\n </h1>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default Landing;\r\n","import { useEffect, useMemo } from \"react\";\r\nimport Footer from \"../../../components/footer/footer\";\r\nimport MaterialTable from \"../../../components/material-table/material-table\";\r\nimport { useAppDispatch, useAppSelector } from \"../../../redux/hooks\";\r\nimport { fetchPage } from \"./redux/actionCreator\";\r\nimport {\r\n pageViewChangeCurrentPage,\r\n setColumnOrder,\r\n setPageViewPages,\r\n setPageViewPaginationModel,\r\n setRowData,\r\n} from \"./redux/reducer\";\r\nimport { IPaginationModel } from \"../../../@types/pagination-model\";\r\nimport NumberAggregation from \"../../../components/material-table/components/number-aggregation\";\r\nimport DefaultAggregation from \"../../../components/material-table/components/default-aggregation\";\r\n// import HeaderCell from \"../../../components/material-table/components/header-cell\";\r\nimport { IPage } from \"../../../@types/page\";\r\nimport Button from \"../../../components/button/button\";\r\n// import Filter from \"../../../components/filter/filter\";\r\n\r\nconst PageView = () => {\r\n // const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\r\n const dispatch = useAppDispatch();\r\n const { pages, currentPage, rows, columns, columnOrder, paginationModel } =\r\n useAppSelector((store) => store?.pages);\r\n const { pageNo, limit } = paginationModel;\r\n\r\n useEffect(() => {\r\n dispatch(fetchPage(1));\r\n }, [dispatch]);\r\n\r\n const handleChangePage = (page: number) =>\r\n dispatch(pageViewChangeCurrentPage(page));\r\n\r\n const handleSetPages = (updatedPages: IPage[]) =>\r\n dispatch(setPageViewPages(updatedPages));\r\n\r\n useEffect(() => {\r\n dispatch(fetchPage(currentPage));\r\n }, [dispatch, currentPage]);\r\n\r\n const tableRows = useMemo(() => {\r\n const start = limit * (pageNo - 1);\r\n return rows.slice(start, start + limit);\r\n }, [rows, pageNo, limit]);\r\n\r\n const tableColumns = useMemo(() => {\r\n return columns?.map((col: any) => {\r\n let updatedCol = {\r\n ...col,\r\n // Header: ({ column }: any) => <HeaderCell column={column} />,\r\n enableSorting: true,\r\n };\r\n\r\n if (col?.type === \"number\") {\r\n updatedCol = {\r\n ...updatedCol,\r\n muiEditTextFieldProps: {\r\n type: \"number\",\r\n },\r\n Footer: ({ column }: any) => {\r\n return <NumberAggregation data={tableRows} column={column?.id} />;\r\n },\r\n };\r\n } else if (col.type === \"string\") {\r\n updatedCol = {\r\n ...updatedCol,\r\n Footer: ({ column }: any) => (\r\n <DefaultAggregation data={tableRows} column={column.id} />\r\n ),\r\n };\r\n }\r\n\r\n return updatedCol;\r\n });\r\n }, [tableRows, columns]);\r\n\r\n const handlePaginationModel = (model: IPaginationModel) => {\r\n dispatch(setPageViewPaginationModel(model));\r\n };\r\n\r\n const total = limit ? Math.ceil(rows.length / limit) : 0;\r\n\r\n const handleColumnOrdering = (colOrder: string[]) => {\r\n dispatch(setColumnOrder(colOrder.slice(1)));\r\n };\r\n\r\n const updateData = (value: string, column: any, rowId: string) => {\r\n const payload = {\r\n value: column?.columnDef?.type === \"number\" ? Number(value) : value,\r\n columnId: column.id,\r\n rowId,\r\n };\r\n\r\n dispatch(setRowData(payload));\r\n };\r\n\r\n // const handleOpenFilter = (event: React.MouseEvent<HTMLButtonElement>) =>\r\n // setAnchorEl(event.currentTarget);\r\n\r\n // const handleCloseFilter = () => setAnchorEl(null);\r\n\r\n return (\r\n <>\r\n <Button>Open Filter</Button>\r\n <MaterialTable\r\n rows={tableRows}\r\n columns={tableColumns}\r\n paginationModel={paginationModel}\r\n totalPages={total}\r\n columnOrder={[\"mrt-row-select\", ...columnOrder]}\r\n handleColumnOrdering={handleColumnOrdering}\r\n updateData={updateData}\r\n />\r\n <Footer\r\n pages={pages}\r\n setPages={handleSetPages}\r\n currentPage={currentPage}\r\n setCurrentPage={handleChangePage}\r\n total={total}\r\n paginationModel={paginationModel}\r\n handlePaginationModel={handlePaginationModel}\r\n />\r\n\r\n {/* {anchorEl && <Filter anchorEl={anchorEl} onClose={handleCloseFilter} />} */}\r\n </>\r\n );\r\n};\r\n\r\nexport { PageView };\r\nexport default PageView;\r\n","import { useEffect } from \"react\";\r\n// // import { useNavigate } from \"react-router-dom\";\r\nimport { Pathname } from \"../../../constants/pathnames/pathname\";\r\nimport { Box } from \"@mui/material\";\r\nimport { useSearchParams } from \"react-router-dom\";\r\nimport { useNavigate } from \"react-router-dom\";\r\nimport { useAuth } from \"../../../hooks/useAuth\";\r\n\r\n\r\nexport const ResetPassword = () => {\r\n const { resetPassword } = useAuth();\r\n const [searchParams] = useSearchParams();\r\n const navigate = useNavigate();\r\n\r\n useEffect(() => {\r\n const tokenParam = searchParams.get(\"token\");\r\n\r\n if (!tokenParam) {\r\n navigate(Pathname.LOGIN);\r\n } else {\r\n resetPassword({ token: tokenParam }, (response) => {\r\n console.log(\"response \",response)\r\n if (!response) {\r\n navigate(Pathname.LOGIN);\r\n } else {\r\n if (response && response?.data && response?.data?.isValid) {\r\n navigate(Pathname.CHANGE_PASSWORD, { state: { token: tokenParam } });\r\n }\r\n }\r\n });\r\n }\r\n }, [searchParams, resetPassword, navigate]);\r\n\r\n return <Box>Resetting password, please wait...</Box>;\r\n};","export const activityTag = {\r\n comments: [\r\n {\r\n name: \"You\",\r\n dateTime: \"01-11-2024 12:45:10\",\r\n text: \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\",\r\n },\r\n {\r\n name: \"Siddhant\",\r\n dateTime: \"01-12-2024 15:05:22\",\r\n text: \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\",\r\n },\r\n ],\r\n activities: [\r\n {\r\n dateTime: \"12-27-2023 19:17:10\",\r\n text: \"Prasun assigned HR Admin role to Avneet Singh.\",\r\n },\r\n {\r\n dateTime: \"12-27-2023 19:15:10\",\r\n text: \"Prasun created a new user Avneet Singh\",\r\n },\r\n {\r\n dateTime: \"12-27-2023 15:17:10\",\r\n text: \"Prasun created a new role HR Admin\",\r\n },\r\n {\r\n dateTime: \"12-27-2023 14:17:10\",\r\n text: \"Prasun updated a role UI/UX Designer ‣ Product Designer\",\r\n },\r\n {\r\n dateTime: \"12-27-2023 14:17:10\",\r\n text: \"Amrit updated resources for UI/UX Designer role.\",\r\n },\r\n {\r\n dateTime: \"12-27-2023 14:17:10\",\r\n text: \"Amrit updated user Prashant Singh ‣ Prasun Singh\",\r\n },\r\n {\r\n dateTime: \"12-27-2023 14:17:10\",\r\n text: \"Amrit updated user Prashant Singh ‣ Prasun Singh\",\r\n },\r\n ],\r\n};\r\n","export const board = {\r\n columns: [\r\n {\r\n id: 1,\r\n title: \"Backlog\",\r\n cards: [\r\n {\r\n id: 1.1,\r\n title: \"Card title 1\",\r\n description: \"Card content\",\r\n },\r\n {\r\n id: 1.2,\r\n title: \"Card title 2\",\r\n description: \"Card content\",\r\n },\r\n {\r\n id: 1.3,\r\n title: \"Card title 3\",\r\n description: \"Card content\",\r\n },\r\n ],\r\n },\r\n {\r\n id: 2,\r\n title: \"Doing\",\r\n cards: [\r\n {\r\n id: 2.1,\r\n title: \"Card title 9\",\r\n description: \"Card content\",\r\n },\r\n ],\r\n },\r\n {\r\n id: 3,\r\n title: \"Q&A\",\r\n cards: [\r\n {\r\n id: 3.1,\r\n title: \"Card title 10\",\r\n description: \"Card content\",\r\n },\r\n {\r\n id: 3.2,\r\n title: \"Card title 11\",\r\n description: \"Card content\",\r\n },\r\n ],\r\n },\r\n {\r\n id: 4,\r\n title: \"Production\",\r\n cards: [\r\n {\r\n id: 4.1,\r\n title: \"Card title 12\",\r\n description: \"Card content\",\r\n },\r\n {\r\n id: 4.2,\r\n title: \"Card title 13\",\r\n description: \"Card content\",\r\n },\r\n ],\r\n },\r\n ],\r\n};\r\n","import { MaterialTableColumnProps } from \"../../../components/material-table/material-table\";\r\n\r\nexport const textOptions = [\r\n { label: 'Heading 1', value: 'heading' },\r\n { label: 'Heading 2', value: 'heading-2' },\r\n { label: 'Heading 3', value: 'heading-3' },\r\n { label: 'Heading 4', value: 'heading-4' },\r\n { label: 'Body', value: 'text' },\r\n { label: 'Text Block', value: 'text-block' },\r\n]\r\n\r\nexport const emailColumns:MaterialTableColumnProps[] = [\r\n {\r\n header: 'ID',\r\n accessorKey: '_id',\r\n visible: true,\r\n type: 'string'\r\n },\r\n {\r\n header: 'Date',\r\n accessorKey: 'created_at',\r\n visible: true,\r\n type: 'date'\r\n },\r\n {\r\n header: 'Subject',\r\n accessorKey: 'subject',\r\n visible: true,\r\n type: 'string'\r\n },\r\n]","export const multilineData = [\r\n {\r\n id: 1,\r\n name: \"Customer\",\r\n role: \"Selling\",\r\n },\r\n {\r\n id: 2,\r\n name: \"Producer\",\r\n role: \"sdf\",\r\n },\r\n {\r\n id: 3,\r\n name: \"Director\",\r\n role: \"wer\",\r\n },\r\n];\r\n","export const tableData = [\r\n {\r\n age: 33,\r\n name: \"Delaney Cortez\",\r\n company: \"IZZBY\",\r\n email: \"delaneycortez@izzby.com\",\r\n phone: \"+1 (844) 567-3740\",\r\n image: \"https://picsum.photos/id/74/900/900\",\r\n address: \"870 Hegeman Avenue, Crawfordsville, Kentucky, 2953\",\r\n about:\r\n \"Nostrud labore esse labore aliquip. Qui excepteur sint exercitation adipisicing deserunt ad veniam sunt ipsum nulla deserunt dolor est culpa. Eu deserunt nostrud ipsum mollit consectetur mollit et. Commodo mollit qui Lorem fugiat eiusmod dolore amet est officia aliqua. Est tempor veniam sit magna. Ullamco veniam eiusmod nostrud sit dolor. Est proident cupidatat proident ullamco irure commodo nisi fugiat adipisicing ullamco adipisicing ad officia.\\r\\n\",\r\n date: \"2023-01-10T09:02:53.870Z\",\r\n },\r\n {\r\n age: 24,\r\n name: \"Williamson Davenport\",\r\n company: \"ONTAGENE\",\r\n email: \"williamsondavenport@ontagene.com\",\r\n phone: \"+1 (844) 564-3345\",\r\n image: \"https://picsum.photos/id/40/900/900\",\r\n address: \"274 Forest Place, Vowinckel, Maine, 9510\",\r\n about:\r\n \"Quis ipsum ad deserunt cillum consequat do ex laboris sit eiusmod pariatur occaecat voluptate. Laborum ea sit duis mollit est sunt culpa ut et commodo consectetur veniam adipisicing amet. Ipsum mollit proident ea deserunt veniam Lorem duis aliquip dolor duis proident ut. Velit esse officia occaecat exercitation magna consequat ullamco ea nisi. Ad ea deserunt occaecat quis occaecat eiusmod ad do. Elit veniam quis aliquip qui nostrud laborum irure minim aute irure fugiat. Ullamco aliquip dolor est sit nulla consectetur.\\r\\n\",\r\n date: \"2023-01-10T09:02:53.870Z\",\r\n },\r\n {\r\n age: 30,\r\n name: \"Alexander Wong\",\r\n company: \"QUADEEBO\",\r\n email: \"alexanderwong@quadeebo.com\",\r\n phone: \"+1 (834) 497-2624\",\r\n image: \"https://picsum.photos/id/8/900/900\",\r\n address: \"420 Borinquen Pl, Kenvil, Vermont, 7377\",\r\n about:\r\n \"Dolor mollit elit est ex. Sit mollit laboris ad pariatur magna est amet veniam ad ad velit incididunt eu. Minim ipsum qui labore eiusmod magna veniam in magna pariatur Lorem.\\r\\n\",\r\n date: \"2023-01-10T09:02:53.870Z\",\r\n },\r\n {\r\n age: 24,\r\n name: \"Blanca Schultz\",\r\n company: \"CUJO\",\r\n email: \"blancaschultz@cujo.com\",\r\n phone: \"+1 (954) 412-2870\",\r\n image: \"https://picsum.photos/id/42/900/900\",\r\n address: \"144 Albemarle Terrace, Watchtower, Delaware, 2829\",\r\n about:\r\n \"Pariatur sunt dolore nostrud cillum cupidatat culpa. Ipsum laborum laboris reprehenderit Lorem culpa. Consequat duis do occaecat ipsum cupidatat sunt minim minim cillum commodo in qui culpa anim. Et ullamco nisi eiusmod laboris veniam laborum ullamco reprehenderit aliqua nulla labore. Elit excepteur sunt exercitation anim sint non ea.\\r\\n\",\r\n date: \"2023-01-10T09:02:53.870Z\",\r\n },\r\n {\r\n age: 34,\r\n name: \"Eunice Romero\",\r\n company: \"CENTREGY\",\r\n email: \"euniceromero@centregy.com\",\r\n phone: \"+1 (949) 568-3290\",\r\n image: \"https://picsum.photos/id/3/900/900\",\r\n address: \"698 Clermont Avenue, Harmon, Washington, 1094\",\r\n about:\r\n \"Nulla aute enim incididunt labore aute id officia fugiat tempor aliqua. Fugiat incididunt sint nisi eiusmod fugiat magna minim in. Officia eu enim magna magna pariatur deserunt esse amet veniam sint consequat est sit.\\r\\n\",\r\n date: \"2023-01-10T09:02:53.870Z\",\r\n },\r\n];\r\n","export const tabsData = [\r\n {\r\n tab_order: 1,\r\n title: \"Tab One\",\r\n content: \"Tab one Content\",\r\n },\r\n {\r\n tab_order: 2,\r\n title: \"Tab Two\",\r\n content: \"Tab two Content\",\r\n },\r\n {\r\n tab_order: 3,\r\n title: \"Tab Three\",\r\n content: \"Tab three Content\",\r\n },\r\n];\r\n","import React from \"react\";\r\nimport AddTemplate from \"./add-template/add-template\";\r\nimport Templates from \"./templates\";\r\nimport { TEMPLATE_EDITOR_PATHS } from \"./utils/constant\";\r\n\r\nexport const templateEditorRoutes = (modulePath: string, module: string) => [\r\n\t{\r\n\t\tpath: `${TEMPLATE_EDITOR_PATHS.TEMPLATES_LIST('email')}`,\r\n\t\telement: <Templates type=\"email\" module={module} modulePath={modulePath}/>\r\n\t},\r\n\t{\r\n\t\tpath: `${TEMPLATE_EDITOR_PATHS.TEMPLATES_ADD('email')}`,\r\n\t\telement: <AddTemplate modulePath={modulePath} type=\"email\" module={module}/>\r\n\t},\r\n\t{\r\n\t\tpath: `${TEMPLATE_EDITOR_PATHS.TEMPLATES_EDIT('email')}`,\r\n\t\telement: <AddTemplate modulePath={modulePath} type=\"email\" module={module}/>\r\n\t},\r\n\t{\r\n\t\tpath: `${TEMPLATE_EDITOR_PATHS.TEMPLATES_LIST('pdf')}`,\r\n\t\telement: <Templates module={module} type=\"pdf\" modulePath={modulePath}/>\r\n\t},\r\n\t{\r\n\t\tpath: `${TEMPLATE_EDITOR_PATHS.TEMPLATES_ADD('pdf')}`,\r\n\t\telement: <AddTemplate modulePath={modulePath} type=\"pdf\" module={module}/>\r\n\t},\r\n\t{\r\n\t\tpath: `${TEMPLATE_EDITOR_PATHS.TEMPLATES_EDIT('pdf')}`,\r\n\t\telement: <AddTemplate modulePath={modulePath} type=\"pdf\" module={module}/>\r\n\t}\r\n]","export const userData = [\r\n {\r\n id: 1,\r\n name: \"Aman Gupta\",\r\n role: \"Accountant & Finance\",\r\n roleId: 2,\r\n },\r\n {\r\n id: 2,\r\n name: \"Deepak Sharma\",\r\n role: \"Sales\",\r\n roleId: 4,\r\n },\r\n {\r\n id: 3,\r\n name: \"Avhinav Dhingra\",\r\n role: \"Operation\",\r\n roleId: 3,\r\n },\r\n {\r\n id: 4,\r\n name: \"Rajiv Mehta\",\r\n role: \"Maintenance\",\r\n roleId: 1,\r\n },\r\n {\r\n id: 5,\r\n name: \"Rajiv Mehta\",\r\n role: \"Stakes\",\r\n roleId: 6,\r\n },\r\n {\r\n id: 6,\r\n name: \"Rajdeep Dutta\",\r\n role: \"Research & Development\",\r\n roleId: 5,\r\n },\r\n {\r\n id: 7,\r\n name: \"Sonia Verma\",\r\n role: \"Accountant & Finance\",\r\n roleId: 2,\r\n },\r\n {\r\n id: 8,\r\n name: \"Vikram Singh\",\r\n role: \"Sales\",\r\n roleId: 4,\r\n },\r\n {\r\n id: 9,\r\n name: \"Neha Patel\",\r\n role: \"Operation\",\r\n roleId: 3,\r\n },\r\n {\r\n id: 10,\r\n name: \"Ankit Kapoor\",\r\n role: \"Maintenance\",\r\n roleId: 1,\r\n },\r\n {\r\n id: 11,\r\n name: \"Kavita Shah\",\r\n role: \"Stakes\",\r\n roleId: 6,\r\n },\r\n {\r\n id: 12,\r\n name: \"Rohit Singh\",\r\n role: \"Research & Development\",\r\n roleId: 5,\r\n },\r\n {\r\n id: 13,\r\n name: \"Priya Agarwal\",\r\n role: \"Human Resources\",\r\n roleId: 7,\r\n },\r\n {\r\n id: 14,\r\n name: \"Amit Trivedi\",\r\n role: \"Marketing\",\r\n roleId: 8,\r\n },\r\n {\r\n id: 15,\r\n name: \"Sara Khan\",\r\n role: \"Customer Support\",\r\n roleId: 9,\r\n },\r\n {\r\n id: 16,\r\n name: \"Amit Gupta\",\r\n role: \"Accountant & Finance\",\r\n roleId: 2,\r\n },\r\n {\r\n id: 17,\r\n name: \"Neha Sharma\",\r\n role: \"Sales\",\r\n roleId: 4,\r\n },\r\n {\r\n id: 18,\r\n name: \"Rahul Verma\",\r\n role: \"Operation\",\r\n roleId: 3,\r\n },\r\n {\r\n id: 19,\r\n name: \"Meera Kapoor\",\r\n role: \"Maintenance\",\r\n roleId: 1,\r\n },\r\n {\r\n id: 20,\r\n name: \"Rajesh Khanna\",\r\n role: \"Stakes\",\r\n roleId: 6,\r\n },\r\n {\r\n id: 21,\r\n name: \"Sonia Dutta\",\r\n role: \"Research & Development\",\r\n roleId: 5,\r\n },\r\n {\r\n id: 22,\r\n name: \"Alok Gupta\",\r\n role: \"Human Resources\",\r\n roleId: 7,\r\n },\r\n {\r\n id: 23,\r\n name: \"Preeti Singh\",\r\n role: \"Marketing\",\r\n roleId: 8,\r\n },\r\n {\r\n id: 24,\r\n name: \"Anuj Kumar\",\r\n role: \"Customer Support\",\r\n roleId: 9,\r\n },\r\n {\r\n id: 25,\r\n name: \"Deepa Patel\",\r\n role: \"IT Support\",\r\n roleId: 10,\r\n },\r\n {\r\n id: 26,\r\n name: \"Vishal Kapoor\",\r\n role: \"Legal\",\r\n roleId: 11,\r\n },\r\n {\r\n id: 27,\r\n name: \"Asha Singh\",\r\n role: \"Quality Assurance\",\r\n roleId: 12,\r\n },\r\n {\r\n id: 28,\r\n name: \"Rajeev Sharma\",\r\n role: \"Logistics\",\r\n roleId: 13,\r\n },\r\n {\r\n id: 29,\r\n name: \"Kavita Trivedi\",\r\n role: \"Public Relations\",\r\n roleId: 14,\r\n },\r\n {\r\n id: 30,\r\n name: \"Alok Singh\",\r\n role: \"Training and Development\",\r\n roleId: 15,\r\n },\r\n {\r\n id: 31,\r\n name: \"Pooja Kapoor\",\r\n role: \"Accountant & Finance\",\r\n roleId: 2,\r\n },\r\n {\r\n id: 32,\r\n name: \"Rohit Verma\",\r\n role: \"Sales\",\r\n roleId: 4,\r\n },\r\n {\r\n id: 33,\r\n name: \"Sanjay Mehta\",\r\n role: \"Operation\",\r\n roleId: 3,\r\n },\r\n {\r\n id: 34,\r\n name: \"Nisha Khanna\",\r\n role: \"Maintenance\",\r\n roleId: 1,\r\n },\r\n {\r\n id: 35,\r\n name: \"Varun Dutta\",\r\n role: \"Stakes\",\r\n roleId: 6,\r\n },\r\n {\r\n id: 36,\r\n name: \"Sapna Gupta\",\r\n role: \"Research & Development\",\r\n roleId: 5,\r\n },\r\n {\r\n id: 37,\r\n name: \"Vikas Sharma\",\r\n role: \"Human Resources\",\r\n roleId: 7,\r\n },\r\n {\r\n id: 38,\r\n name: \"Ritu Verma\",\r\n role: \"Marketing\",\r\n roleId: 8,\r\n },\r\n {\r\n id: 39,\r\n name: \"Manish Singh\",\r\n role: \"Customer Support\",\r\n roleId: 9,\r\n },\r\n {\r\n id: 40,\r\n name: \"Neha Patel\",\r\n role: \"IT Support\",\r\n roleId: 10,\r\n },\r\n {\r\n id: 41,\r\n name: \"Anil Kapoor\",\r\n role: \"Legal\",\r\n roleId: 11,\r\n },\r\n {\r\n id: 42,\r\n name: \"Priya Dutta\",\r\n role: \"Quality Assurance\",\r\n roleId: 12,\r\n },\r\n {\r\n id: 43,\r\n name: \"Rahul Sharma\",\r\n role: \"Logistics\",\r\n roleId: 13,\r\n },\r\n {\r\n id: 44,\r\n name: \"Sneha Trivedi\",\r\n role: \"Public Relations\",\r\n roleId: 14,\r\n },\r\n {\r\n id: 45,\r\n name: \"Anita Singh\",\r\n role: \"Training and Development\",\r\n roleId: 15,\r\n },\r\n {\r\n id: 46,\r\n name: \"Amit Trivedi\",\r\n role: \"Accountant & Finance\",\r\n roleId: 2,\r\n },\r\n {\r\n id: 47,\r\n name: \"Priyanka Sharma\",\r\n role: \"Sales\",\r\n roleId: 4,\r\n },\r\n {\r\n id: 48,\r\n name: \"Rajat Verma\",\r\n role: \"Operation\",\r\n roleId: 3,\r\n },\r\n {\r\n id: 49,\r\n name: \"Anu Khanna\",\r\n role: \"Maintenance\",\r\n roleId: 1,\r\n },\r\n {\r\n id: 50,\r\n name: \"Sumit Dutta\",\r\n role: \"Stakes\",\r\n roleId: 6,\r\n },\r\n];\r\n"],"names":["allAggregations","label","value","nonNumberAggregations","aggregationFnsLookup","avg","aggregationFns","average","sum","max","count_empty","countEmpty","count_full","countFull","percentage_empty","percentageEmpty","percentage_full","percentageFull","min","none","NumberAggregation","data","column","type","selectedType","setSelectedType","React","useState","anchorEl","setAnchorEl","calculatedValue","setCalculatedValue","open","Boolean","handleClose","useEffect","func","aggregations","jsxs","Fragment","children","jsx","Typography","onClick","event","currentTarget","sx","cursor","weight","color","Menu","id","onClose","map","aggr","MenuItem","selected","handleAggregationType","val","NotFound","Component","componentDidMount","setTimeout","render","style","textAlign","position","top","left","transform","fetchPage","createAsyncThunk","pageId","getState","pages","find","p","defaultData","rows","name","age","gender","company","location","price","columns","header","accessorKey","local","columnOrder","state","currentPage","loading","error","_id","paginationModel","pageNo","limit","pageViewSlice","createSlice","initialState","reducers","changeCurrentPage","action","payload","setPages","setPaginationModel","setColumnOrder","setRowData","JSON","parse","stringify","rowId","columnId","extraReducers","builder","addCase","pending","fulfilled","rejected","pageViewChangeCurrentPage","setPageViewPages","setPageViewPaginationModel","actions","reducer","LoginContainer","styled","Grid","height","LeftGrid","theme","breakpoints","down","display","backgroundImage","images","login","LoginLeftBg","backgroundRepeat","backgroundSize","justifyContent","alignItems","width","RightGrid","padding","FlexBox","Box","flexDirection","validationSchema","Yup","object","password","string","required","matches","confirm_password","oneOf","ref","calendarData","events","title","start","getDate","end","groupId","dayString","today","Date","year","getFullYear","toString","month","getMonth","length","replace","hasMenu","icon","GridColumnIcon","HeaderString","dataType","key","element","text","field_type","placeholder","default_value","min_length","max_length","is_multiline","is_required","is_unique","number","float_step","is_negative","email","phone","select","options","is_multiselect","date","is_future_dates_allowed","is_past_dates_allowed","time","option","url","currency","file","max_size","geoLocation","image","section","section_type","form_switcher_label","form_switcher_name","switcher_forms","is_accordion","members","info","relation","module","field","checkbox","is_checked","title_position","toggleButton","radioButton","table","table_columns","tagsInput","fields","Paragraph","Hashtag","ArrowCircleDown","Calendar","PaperClip","Link","Email","Phone","DollarCircle","Clock","Location","CheckboxSquare","Image","LinkHorizontal","InfoCircle","ToggleSwitch","RadioButton","FieldSelect","props","selectFields","setSelectFields","search","setSearch","handleSearch","target","searchVal","filter","includes","Select","fullWidth","size","labelName","renderValue","_a","searchPlaceholder","searchValue","onKeyDown","e","stopPropagation","Stack","direction","spacing","fontSize","COLUMN_PER_ROW_OPTIONS","SELECT_OPTIONS","CURRENCY_OPTIONS","FIELDS_WITHOUT_PLACEHOLDER","Set","FIELDS_WITH_MIN_MAX","MemoizedMenuItem","index","prefix","MemoizedRelationMenuItem","TextEditForm","handlePropertyValueUpdate","handleColumnSelect","handleWidthChange","elementJSON","setElementJSON","openModal","setOpenModal","relationFields","setRelationFields","functionValue","setFunctionValue","prevElementRef","useRef","prevFieldsRef","relationModulesOptions","useMemo","current","Object","keys","formatText","setRelationFieldsOptions","useCallback","moduleValue","prev","fieldsArr","some","item","idx","_b","handleSave","updatedElement","handleFieldUpdate","fieldType","handleSelectUpdate","handleModuleSelect","handleWidthSliderChange","_","widthValue","Array","isArray","custom_width","handleFullWidthChange","isFullWidth","checked","is_fullwidth","handleColumnSelectChange","columnValue","Number","getDefaultValue","getMinMaxLabels","handleOpenModal","handleCloseModal","handleFunctionValueChange","currencySelectSection","FormControl","onChange","defaultValue","variant","timeSelectSection","relationSelectSection","disabled","minMaxLabels","className","is_new","TextField","has","columns_per_row","mb","Slider","step","marks","valueLabelDisplay","FormControlLabel","control","Checkbox","Button","startIcon","Add","Modal","DialogTitle","IconButton","edge","Close","DialogContent","dividers","multiline","minRows","DialogActions","SelectEditForm","memo","handleSelectOptionValueUpdate","selectOptions","setSelectOptions","newOption","setNewOption","isAddingOption","setIsAddingOption","isFieldDisabled","selectedOptionLabel","selectedOption","handleMultiSelect","isChecked","handleNewOptionChange","handleAddOption","trim","enqueueSnackbar","updatedOptions","handleRemoveOption","indexToRemove","removedOption","handleWidthChangeCallback","newValue","pr","gap","InputProps","readOnly","Trash","mt","border","borderRadius","displayName","SectionEditForm","addForm","setAddForm","newForm","setNewForm","selectOption","isDuplicateFormName","ele","values","SECTION_TYPES","FORM_SWITCH_SECTION","marginBottom","newVal","formEle","CloseIcon","helperText","uniqueStringId","generateRandomId","CheckboxEditForm","isAddSelectOption","setAddSelectOption","columnPerRowOptions","allowLabelPositionModification","newOptions","setNewOptions","handleAddNewOption","filterIndex","RadioGroup","row","Radio","slotProps","typography","TableEditForm","handleColumnsUpdate","tables","setTables","visible","FormField","gridItemSize","activeMember","t","remove","move","handleElementSelection","setElementSwap","handleDuplicateElement","setSelectedHoc","setActiveMember","hocProps","activeIndex","removeElement","swap","elementSwap","handleDuplicate","setElementHoc","commonFieldProps","formControl","fieldArrayName","formType","typeOfField","renderFieldContent","DynamicInput","endIcon","src","sms","alt","DynamicPhone","DynamicSelect","DynamicDate","disable","DynamicTime","dollar","DynamicMedia","DynamicInfo","DynamicToggleButton","titlePosition","DynamicRadioButton","DynamicCheckBox","DynamicTable","console","warn","xs","DynamicElementHOC","FormFields","sectionMembers","calculateGridSize","renderedFields","findIndex","member","MODULE_PATHS","accounting","PathnameAccounting","FORMS","inventory","PathnameInventory","manufacturing","PathnameManufacturing","procurement","PathnamePurchase","crm","PathnameCrm","rental","PathnameRental","user","PathnameUsers","hrms","PathnameHrms","split","word","charAt","toUpperCase","slice","toLowerCase","join","processTableColumns","formBuilder","processMembers","sections","flatMap","extractSections","remove_section","is_section_field","processData","activeTabId","tabsData","callbacks","removeSection","tab","processTabData","processSectionData","Error","processExistingTabsData","alert","message","tabs","setTabsData","append","appendSection","activeTab","tab_order","extractedSections","useFormDataEffect","activeTabValue","initialData","formData","formBuilderDeConversion","generateModulePath","currentModule","redirectionPath","getRedirectionPath","isValidNumber","isNaN","isFinite","deepClone","obj","generateUniqueId","separator","now","Math","random","substr","cssScopingService","generateScopeId","substring","scopeCSS","css","scopeId","this","parseCSS","rule","scopeRule","rules","currentRule","braceCount","inComment","i","char","nextChar","push","braceIndex","indexOf","selector","body","s","sel","scopeSelector","startsWith","wrapHTMLWithScope","html","extractInlineStyles","styleMap","Map","DOMParser","parseFromString","querySelectorAll","forEach","styleAttr","getAttribute","styles","parseInlineStyles","identifier","tagName","set","d","declaration","colonIndex","property","mergeStyles","base","override","scopeTemplate","scopedCSS","wrappedHTML","templateRoutes","modulePath","list","TEMPLATE_EDITOR_PATHS","TEMPLATES_LIST","add","TEMPLATES_ADD","edit","TEMPLATES_EDIT","LIST","ADD_TEMPLATE","EDIT_TEMPLATE","templateId","generateEmailPreview","headerSections","footerSections","isSaving","headerHtml","generateHeaderFooterPreview","footerHtml","groupedSections","currentGroup","lastSplitGroupId","isSplitPair","splitGroupId","group","splitWidth","content","extractStyles","sectionType","tempDiv","document","createElement","innerHTML","firstChild","Function","allAttributes","attributes","attrObj","from","reduce","attr","styleObj","pair","prop","part","propName","g","EMAIL_SAFE_PROPERTIES","generateInlineStyles","parentKey","entries","acc","fullKey","cssKey","cssValue","getInitialSectionData","attrs","initialStyles","inlineStyles","borderStyle","borderColor","rest","tInlineStyles","is_bordered","tHeadInlineStyles","tHead","tBodyInlineStyles","tBody","thCellInlineStyles","thCells","tbCellInlineStyles","tbCells","EditorHeader","onSave","onPreview","preview","editHtml","onEditHtml","isEditingHeaderFooter","onEditModeChange","setIsEditingHeaderFooter","onSaveHeaderFooter","mode","templateData","editMode","fromPreview","zoom","onZoomIn","onZoomOut","onResetZoom","ROUTES","AppBar","elevation","bgcolor","Toolbar","component","RouterLink","to","underline","opacity","ZoomOut","minWidth","ZoomIn","Divider","orientation","flexItem","mx","ZoomOutMap","palette","secondary","boxShadow","Edit","EyeOff","Eye","CodeOutlinedIcon","CustomEditor","lazy","Promise","resolve","then","require","EditSectionModal","isOpen","setIsOpen","modalProps","placeholders","handleAddPlaceholder","handleEditorReady","handleModalClose","maxWidth","maxHeight","right","displayEmpty","py","Suspense","handleContinue","useCKEditorStyleExtractor","tagStyleMap","fontStyle","em","b","fontWeight","strong","u","textDecoration","strike","del","sup","verticalAlign","sub","small","big","mark","backgroundColor","code","fontFamily","kbd","samp","var","styleTagMap","reverseMap","styleKey","tag","cssPropertyMap","margin","bottom","float","clear","overflow","toCamelCase","match","letter","toKebabCase","styleDeclaration","getPropertyValue","extractTagStyles","extractNestedStyles","nestedStyles","currentElement","parentElement","inheritableProps","parentStyles","extractImageStyles","imgElement","styleData","imageStyles","assign","editorContent","includeInlineStyles","includeTagStyles","filterEmptyStyles","mergeNestedStyles","results","elementType","elementIndex","textContent","tagStyles","inheritedStyles","extractFormattingStyles","formattingStyles","stylesToHtml","preferSemanticTags","wrapInParagraph","wrappedText","multipleStylesToHtml","segments","wrapInContainer","containerTag","separateElements","htmlSegments","segment","result","applyStylesToHtml","htmlContent","targetSelector","wrapper","appendChild","kebabProperty","extractAndConvert","targetStyles","extracted","converted","mergedStyles","generateCSS","extractedStyles","styleRules","getFlattenedStyles","flattened","getSingleStyles","useDebouncedUpdate","callback","delay","timeoutRef","args","clearTimeout","editableSections","MemoizedEditorSection","isSelected","isDragging","isOver","onSelect","onUpdate","onSplit","onDelete","setIsSectionEditing","listeners","setNodeRef","setDraggableRef","useDraggable","setDroppableRef","useDroppable","isEditing","setIsEditing","isHovered","setIsHovered","isOpenEditSectionModal","setIsOpenEditSectionModal","isEditedFromSource","setIsEditedFromSource","is_edited_from_source","localContent","setLocalContent","hasUserEdited","setHasUserEdited","editorRef","mouseHoverTimeoutRef","cursorPositionRef","isRestoringCursorRef","contentRef","originalContentRef","debouncedUpdate","x","y","transition","paperSx","mergedRef","node","handleDblClick","handleEditing","editor","_tiptap","on","selection","transaction","docChanged","getData","single","mergedAttributes","handleSplit","viewFragment","processor","toView","modelFragment","toModel","model","insertContent","handleMouseEnter","window","handleMouseLeave","handleClick","handleDeleteClick","handleCancelEdit","handleCheckboxChange","handleSelectChange","requestAnimationFrame","docSize","doc","validFrom","validTo","commands","setTextSelection","isFocused","focus","contentRenderer","fallback","Skeleton","onError","dangerouslySetInnerHTML","__html","lineHeight","placeholderOptions","Paper","onDoubleClick","onMouseEnter","onMouseLeave","zIndex","pointerEvents","borderBottom","px","DragIndicatorIcon","mr","defaultChecked","Save","Fade","in","timeout","Chip","textTransform","tertiary1","_d","_c","SplitIcon","prevProps","nextProps","StyledToggleButtonGroup","ToggleButtonGroup","gridTemplateColumns","toggleButtonGroupClasses","grouped","shape","middleButton","lastButton","marginLeft","borderLeft","primary","AlignmentControl","alignment","onAlignmentChange","displayLabel","flexWrap","exclusive","Tooltip","ToggleButton","FormatAlignLeftIcon","FormatAlignCenterIcon","FormatAlignRightIcon","FormatAlignJustifyIcon","FONT_SIZES","LINE_HEIGHTS","FONT_FAMILIES","TextControls","updateAttrs","formatOptions","updateStyles","newStyles","debouncedColorUpdate","debounce","toggleFormat","format","isCurrentlyApplied","bold","italic","handleAlignmentChange","newAlignment","handleColorChange","handleFontFamilyChange","handleFontSizeChange","handleLineHeightChange","String","family","v","FormatBoldIcon","FormatItalicIcon","FormatUnderlinedIcon","startAdornment","InputAdornment","ColorLensIcon","borderOptions","ButtonControls","ColorPickerInput","Android12Switch","Switch","encodeURIComponent","getContrastText","main","borderStyles","BorderControl","isBordered","disableWidth","disableStyle","disableColor","disableCollapse","disableRadius","initiateStyles","borderCollapse","container","labelPlacement","wd","ImageControls","inputProps","objectFit","DividerControls","borderWidth","Accordion","MuiAccordion","disableGutters","square","divider","textAlignOptions","fontWeightOptions","fontFamilyOptions","TableControls","tableData","setTableData","setParentRowLevel","levelType","relation_table","tabValue","setTabValue","expanded","setExpanded","autoPopulateEnabled","setAutoPopulateEnabled","mergeDialogOpen","setMergeDialogOpen","selectedCells","setSelectedCells","mergeValue","setMergeValue","rowLevel","setRowLevel","tPlaceholders","selectedTable","setSelectedTable","customText","setCustomText","rowPlaceholders","setRowPlaceholders","mergedCells","isUpdating","setIsUpdating","tableAttributes","tableId","dataKey","getAttributes","tableStyles","setTableStyles","populateRowsWithPlaceholders","getPlaceholderValue","placeholderKey","actualValue","toLocaleDateString","toLocaleString","rowIndex","updatedRow","staticText","getCellMergeInfo","colIndex","merge","m","rowStart","rowEnd","colStart","colEnd","isTopLeft","isCovered","isCellSelected","cell","col","toggleCellSelection","cellKey","getPlaceholderInfo","description","handleAccordionChange","panel","isExpanded","updateHeaderStyle","updateBodyStyle","resetTable","fromEntries","columnsWithPlaceholders","updated","endsWith","originalColumnId","staticValue","paddingBottom","Tabs","Tab","RefreshIcon","updateColumnHeader","newHeader","flex","columnIndex","removed","updatedPlaceholders","removeColumn","newColumnId","existingIds","counter","generateColumnId","newColumn","AddIcon","my","newRow","updatedRows","addRow","SearchableSelect","replaceAll","removeRow","hasPlaceholder","placeholderInfo","mergeInfo","updateRowCellValue","updateCellValue","Alert","severity","currentPlaceholder","placeholderValue","newCellValue","updateColumnPlaceholder","renderOption","noOptionsText","borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius","AccordionSummary","expandIcon","ExpandMoreIcon","AccordionDetails","updateTableStyle","parseInt","_e","_f","font","_g","align","_h","updateHeaderCellStyle","_i","zebraStriping","_j","_k","alternateRowColor","_l","_m","_n","_o","_p","_q","_r","updateBodyCellStyle","firstCell","firstCellValue","customTextValue","initialMergeValue","MergeIcon","Table","TableHead","TableRow","cellContent","rowSpan","colSpan","TableCell","TableBody","mergeIndex","updatedColumns","splitMergedCell","Dialog","_s","c","_t","rowIndices","colIndices","expectedCells","existing","newMerge","SignatureControls","CodeControls","sectionTypes","SectionFormatPanel","col1","col2","col3","isInitialLoad","setIsInitialLoad","selectedContentAttrObj","setSelectedContentAttrObj","extractedTableData","extractTableDataFromHTML","querySelector","headerRows","bodyRows","headerCells","th","cells","rowData","generateContent","eStyles","imgInlineStyles","headerCellsHTML","mergeAttributes","cellValue","tableRowsHTML","rowTemplate","cellTemplate","rowStyleTemplate","rowStyleAddition","cellsHTML","finalCellValue","test","nodeType","Node","ELEMENT_NODE","existingStyle","existingProps","newStyleProps","mergedProps","mergedStyle","setAttribute","saveSection","updatedSection","sectionRest","updatedContent","sm","lg","pb","overflowY","dt","handleTypeChange","convertedRow","newTableData","StyledListItem","ListItem","grey","DropzoneBox","SidebarItem","imageUrl","marginRight","ListItemIcon","ListItemText","primaryTypographyProps","EditorSidebar","onHtmlUpload","uploadedImages","setUploadedImages","uploading","setUploading","uploadingHtml","setUploadingHtml","setError","onDrop","async","acceptedFiles","uFiles","uploadFiles","token","getToken","path","is_private","is_directory","file_size","is_child","file_extension","mime_type","getApiConfig","s3BucketUrl","postV1Drive","err","getRootProps","getInputProps","isDragActive","useDropzone","accept","multiple","onHtmlDrop","reader","FileReader","onload","onerror","readAsText","getHtmlRootProps","getHtmlInputProps","isHtmlDragActive","maxFiles","FileCode","CircularProgress","TextIcon","Heading","ImageIcon","TableIcon","SignatureIcon","QrCodeIcon","BarcodeIcon","response","getV1Drive","skip","filters","files","drive","log","getDriveFiles","borderRight","SearchBar","flexGrow","minHeight","CANVAS_TYPES","EditorCanvas","activeId","selectedSection","onSelectSection","onUpdateSection","onSplitSection","onDeleteSection","onApplyHtmlEdit","onCancelHtmlEdit","isFromPreview","formattedPlaceholders","setMainCanvasRef","setHeaderCanvasRef","setFooterCanvasRef","selectedSectionData","dropTarget","setDropTarget","canvasType","isDraggingFromSidebar","setIsDraggingFromSidebar","isSectionEditing","htmlEditValue","setHtmlEditValue","lastUpdateTimeRef","lastPositionRef","activeIdRef","mainCanvasRef","headerCanvasRef","footerCanvasRef","getTargetSections","updateDropTarget","handleMouseMove","dx","clientX","dy","clientY","sqrt","sectionElement","elementsFromPoint","el","hasAttribute","targetSections","sectionId","sectionCanvasType","rect","getBoundingClientRect","relativeY","relativeX","sectionHeight","sectionWidth","renderSectionsForCanvas","canvasSections","processedGroups","renderDropIndicator","isHorizontal","animation","splitSections","splitRow","splitSection","EditorSection","extra","content1","content2","renderedMainSections","renderedHeaderSections","renderedFooterSections","renderCanvas","renderedSections","setCanvasRef","onMouseMove","Container","CheckIcon","spellCheck","outline","resize","boxSizing","tabSize","transformOrigin","flexShrink","alignSelf","TemplateNameModal","onSaveSuccess","onSaveError","parentIsSaving","handleSubmit","setValue","useForm","resolver","yupResolver","template_name","navigate","useNavigate","isSubmitting","setIsSubmitting","onSubmit","patchV1TemplatesId","postV1Templates","status_code","form","SectionFlowEditor","template_id","useParams","locationState","useLocation","setSections","setHeaderSections","setFooterSections","setActiveId","setEditMode","setFromPreview","setSelectedSection","overSection","setOverSection","setPreview","setEditHtml","setPlaceholders","activeCanvas","setActiveCanvas","setPayload","headerFooterId","setHeaderFooterId","setRelationTable","setTemplateData","setIsSaving","savedSnapshot","setSavedSnapshot","setZoom","history","setHistory","past","future","memoizedPlaceholders","saveToHistory","handleUndo","previous","newPast","handleRedo","next","newFuture","handleKeyDown","ctrlKey","metaKey","shiftKey","preventDefault","addEventListener","removeEventListener","createNewSection","idPrefix","uuidv4","handleDragStart","active","handleDragOver","over","handleDragEnd","setTargetSections","newSection","overIndex","newSections","splice","targetSection","updatedSections","sourceSections","sourceSetSections","cleanActiveId","oldIndex","newIndex","movedSection","groupSections","cleaned","originalSection","newSourceSections","newTargetSections","getRelevantSections","getRelevantSetSections","updateSectionImmediate","relevantSections","relevantSetSections","cleanId","handleUpdateSectionDebounced","handleUpdateSection","handleSplitSection","sectionPrefix","newWidth","initialWidth","handleDeleteSection","sectionToDelete","remainingSection","isViewOnly","getElementsByTagName","marginTop","removeAttribute","subjRes","getV1SubjectsId","resource","token2","fRes","getV1FormBuilderRelationalSchemaFieldsName","schemaFields","relational_fields","updatedFields","is_inner_join","alias","arrayRelationTables","objectRelationFields","updatedTableFields","updatedField","templateKey","tableFields","differenceWith","fieldA","fieldB","joinKey","f","allFields","n","uniqueAllFields","uniqBy","token3","res","getV1TemplatesId","mainSecs","company_id","token4","getV1TemplateHeaderFooterCompanyIdHeaderFooter","resData","header_sections","footer_sections","headerSecs","footerSecs","handleApplyHtmlEdit","handleCancelHtmlEdit","mainHtml","subject_id","is_default","contents","getErrorMessage","handleSaveHeaderFooter","combinedHtml","convertSectionForApi","convertedHeaderSections","convertedFooterSections","token5","patchV1TemplateHeaderFooterId","token6","postV1TemplateHeaderFooter","toggleHeaderFooterEditing","handleSaveSuccess","handleSaveError","DndContext","onDragStart","onDragOver","onDragEnd","collisionDetection","pointerWithin","AddTemplate","HtmlThumbnailPreview","template","scale","showControls","selectedTemplateId","isFetching","minScale","maxScale","scaleStep","loadingDelay","refreshDelay","normalView","isLoading","setIsLoading","currentScale","setCurrentScale","containerRef","loadingTimeoutRef","refreshTimeoutRef","scaledWidth","scaledHeight","handleZoomIn","handleZoomOut","handleRefresh","handleDelete","canZoomIn","canZoomOut","canDelete","userSelect","pt","tableLayout","backdropFilter","round","arrow","Refresh","HtmlThumbnailPreviewFull","containerPixelWidth","setContainerPixelWidth","updateWidth","offsetWidth","marginInline","marginBlock","TemplateModal","companies","source","templates","setTemplates","selectedTemplate","setSelectedTemplate","defaultTemplate","setDefaultTemplate","setLoding","selectedCompany","setSelectedCompany","templateToDelete","setTemplateToDelete","selectedTemplateForPreview","setSelectedTemplateForPreview","getTemplatesViaSubject","getV1Templates","dTemplate","scrollbarWidth","msOverflowStyle","justifyItems","handleTemplateSelect","borderTop","patchV1TemplatesIdSetDefault","handleDefaultTemplate","ConfirmPopUp","onConfirm","deleteV1TemplatesId","handleDeleteTemplate","CompanySelectionModal","Templates","useTranslation","activePage","aPage","updatePageInfo","generatedColumns","updateGeneratedColumns","usePages","useDeepMemo","actionAnchorEl","setActionAnchorEl","viewEmails","localStorage","getItem","actionBarData","setActionBarData","actionBarActiveTab","setActionBarActiveTab","viewTypes","TABLE","totalCount","setRows","selectedRow","setSelectedRow","showTemplateModal","setShowTemplateModal","templateModalSource","setTemplateModalSource","showCompanySelectionModal","setShowCompanySelectionModal","setCompanies","pLimit","page_size","total","ceil","permissions","usePermissions","SubjectPermissions","Subjects","canAdd","canEdit","rowActionMenu","handleAction","handleNewEmail","getEmails","sort","filterQueryString","searchFiters","types","uFilters","appendConditionSafely","getV1Subjects","order","desc","pagination","tableRows","tableColumns","transformTableColumns","currencySymbol","original","currency_data","symbol","defaultCurrencySymbol","translationFn","enableFooter","statusClasses","cleanUp","companiesArr","fetchApi","apiKey","getCopmanies","setItem","ActionBar","setData","setActive","disabledViews","GRID","selectedIds","button","MaterialTable","totalPages","orderKeys","states","onSortingChange","enableColumnDragging","enableEditing","onSelectRow","r","enableAddCustomField","isResetRow","handleColumnOrdering","colOrder","onColumnVisibility","showPreview","handlePreview","GridCard","Fallback","heading","subHeading","logo","invoiceFallback","Footer","handlePaginationModel","toast","setToast","showPassword","setShowPassword","changePassword","useAuth","appLogo","erp_logo","LoginLeftSiteImage","Pathname","LOGIN","htmlColor","onIconClick","Toast","anchorOrigin","horizontal","vertical","autoHideDuration","paddingLeft","paddingRight","Remove","endAdornment","ml","dispatch","useAppDispatch","useAppSelector","reValidateMode","update","insert","useFieldArray","updateSection","selectedHoc","activeSection","setActiveSection","formJSON","setFormJSON","positionEditedElement","setPositionEditedElement","sectionFormJSON","setSectionFormJSON","sectionJSON","setSectionJSON","sectionPositionEditedElement","setSectionPositionEditedElement","removeSectionActionPerformed","setRemoveSectionActionPerformed","removeSectionMembersPerformed","setRemoveSectionMembersPerformed","removeSectionPosition","setRemoveSectionPosition","initialLoading","setInitialLoading","setActiveTabValue","modifyAccordion","setModifyAccordion","previewFieldsData","setPreviewFields","setFormParserMethods","pathname","pickPropertyEditForm","normalizedType","formGroups","commonTextProps","commonSelectProps","handleSectionPropertyValueUpdate","addNewSection","newSectionIndex","sectionData","handleAddTab","formWithMembers","sectionIndex","section_order","hasSystemMembers","is_system_field","shouldRemoveTab","newTab","remove_tab","prevTabs","handleEditTabTitle","tabId","newTitle","handleRemoveTab","reorderedTabs","membersList","elementPositionIndex","dataset","positionIndex","elementDetails","handleSectionSelection","sectionPositionIndex","sectionDetails","handleAddMember","otherProperties","newMember","floor","DEFAULT_GRID_COLUMNS","overrideValue","updatedValue","newCustomWidth","prevData","elementPerColumn","numberValue","elementJSONCopy","uniqueId","copyOfUpdatedElement","section_form_id","is_form_switcher_section","column_width","handleRemoveSection","membersToRemove","reverse","memberIndex","handleMakeAccordion","copyOfSection","handleTabData","activeTabIndex","updatedTabsData","previewState","previewFields","formBuilderConversion","hidePreview","handleFormUpdate","structuredClone","cloneError","formBuilderConversionResult","conversionError","updatePayload","gridCol","updateRes","patchFormDataById","meta","requestStatus","copyOfMember","breadCrumbPath","link","formatLabel","isSuccess","isError","copyOfUpdatedFormJson","updatedFormJSON","handleFormData","getFormDataById","getFieldsByFormId","hasValidContent","EmptyStateMessage","getFieldTypeWithFallback","json","memoizedForm","field_properties","ErpLoader","DndProvider","backend","HTML5Backend","FormHeader","FormParser","handleFormSubmit","getFormMethods","methods","background","TabBar","onEditTabTitle","activeValue","setActiveValue","handleTabChange","containerProps","isFormSwitcher","switchForms","formMembers","DynamicSectionHOC","handleAccordion","handleAddButton","forgotPassword","autoPlay","muted","loop","playsInline","store","updatedCol","enableSorting","muiEditTextFieldProps","DefaultAggregation","updateData","columnDef","updatedPages","setCurrentPage","page","Loader","Outlet","Navigate","resetPassword","searchParams","useSearchParams","tokenParam","get","isValid","CHANGE_PASSWORD","comments","dateTime","activities","cards","status","amount","role","address","about","serializedFormData","roleId"],"mappings":"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"}
|