rez-table-listing-mui 2.0.13 → 2.0.15
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/index.d.ts +51 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/kanban/hooks/hooks.ts +38 -1
- package/src/listing/components/filter/components/attributes-filter.tsx +1 -1
- package/src/listing/components/filter/components/forms/components/Filter-criteria.tsx +4 -2
- package/src/listing/components/filter/components/forms/utils/filter-date-input-resolver.tsx +36 -1
- package/src/listing/components/login/index.tsx +3 -3
- package/src/listing/components/table-settings/components/lane.tsx +313 -366
- package/src/listing/components/table-settings/components/swim-lane.tsx +424 -0
- package/src/listing/components/table-settings/constants.ts +2 -1
- package/src/listing/components/table-settings/index.tsx +74 -31
- package/src/listing/libs/hooks/useCraftTableFilterSettings.tsx +5 -0
- package/src/listing/libs/hooks/useEntityTableAPI.tsx +20 -6
- package/src/listing/libs/utils/apiColumn.ts +61 -6
- package/src/listing/libs/utils/common.ts +5 -3
- package/src/listing/types/common.ts +1 -0
- package/src/listing/types/filter-settings.ts +31 -0
- package/src/listing/types/filter.ts +2 -1
- package/src/listing/types/table-options.ts +3 -0
- package/src/view/KanbanView.tsx +70 -7
- package/src/view/ListingView.tsx +5 -20
- package/src/listing/components/table-settings/components/group-by.tsx +0 -511
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../node_modules/style-inject/dist/style-inject.es.js","../src/assets/svg.tsx","../src/listing/components/table-change-layout.tsx","../src/listing/libs/hooks/useFullScreen.tsx","../src/listing/components/viewmore/index.tsx","../src/listing/components/sorting-modal.tsx/sorting-item.tsx","../src/listing/components/sorting-modal.tsx/index.tsx","../src/listing/components/column-visibility-modal/column-list-item.tsx","../src/listing/types/common.ts","../src/listing/components/column-visibility-modal/index.tsx","../src/listing/libs/utils/debounce.ts","../src/listing/components/search/style.ts","../src/listing/components/search/index.tsx","../src/listing/libs/hooks/useOutsideClick.tsx","../src/listing/components/topbar/index.tsx","../src/listing/components/pagination/default/pagination.styles.ts","../src/listing/components/pagination/default/index.tsx","../src/listing/libs/utils/common.ts","../src/listing/components/table-body/table-body.styles.ts","../src/listing/components/table-body/table-body-dnd-cell.tsx","../src/listing/components/inputs/checkbox/index.tsx","../src/listing/components/table-body/table-body.tsx","../src/listing/components/table-head/table-head.styles.ts","../src/listing/components/table-head/table-head-pin.tsx","../src/listing/components/table-head/table-head-popover.tsx","../src/listing/components/table-head/table-head-resizer.tsx","../src/listing/components/table-head/table-head-dnd-cell.tsx","../src/listing/components/table-head/table-head.tsx","../src/listing/components/table.tsx","../src/listing/components/table-dnd.tsx","../src/listing/components/tabs/tabs.styles.ts","../src/listing/components/common/confirm-modal/index.tsx","../src/listing/components/filter/components/tabs/custom-tab-panel.tsx","../src/listing/components/filter/components/tabs/index.tsx","../src/listing/components/filter/components/forms/components/Dropdown.tsx","../src/listing/components/filter/style.ts","../src/listing/components/filter/components/search/index.tsx","../src/listing/components/filter/components/forms/components/empty-list.tsx","../src/listing/components/filter/components/forms/components/filter-criteria-entity-list.tsx","../src/listing/components/common/loader/loader.tsx","../src/listing/components/filter/components/forms/components/filter-criteria-list.tsx","../src/listing/components/filter/components/forms/components/Filter-criteria.tsx","../src/listing/libs/hooks/useElementWidth.tsx","../src/listing/components/filter/components/forms/components/styles.tsx","../src/listing/components/filter/components/forms/components/Textfield.tsx","../src/listing/components/filter/components/forms/components/Date.tsx","../src/listing/components/filter/components/forms/components/Multi-Select.tsx","../src/listing/components/filter/components/forms/utils/filter-date-input-resolver.tsx","../src/listing/components/filter/components/forms/index.tsx","../src/listing/components/filter/components/main-filter.tsx","../src/listing/components/filter/components/saved-edit-filter.tsx","../src/listing/components/filter/components/saved-filter.tsx","../src/listing/components/filter/components/attributes-filter.tsx","../src/listing/libs/utils/deep-merge-objects.ts","../src/listing/components/filter/components/single-filter-rendering.tsx","../src/listing/components/common/saved-filter-modal/index.tsx","../src/listing/components/table-settings/tabs/styles.ts","../src/listing/components/table-settings/tabs/vertical/index.tsx","../src/listing/components/table-settings/tabs/vertical/custom-tab-panel.tsx","../src/listing/components/table-settings/common/draggable-listitem.tsx","../src/listing/components/table-settings/style.ts","../src/listing/components/table-settings/common/listing-values.tsx","../src/listing/components/table-settings/common/info-alert.tsx","../src/listing/components/table-settings/components/quick-tab.tsx","../src/listing/components/table-settings/components/toggle-button-switch.tsx","../src/listing/components/table-settings/constants.ts","../src/listing/components/table-settings/tabs/horizontal/index.tsx","../src/listing/components/table-settings/components/column.tsx","../src/listing/components/table-settings/components/sorting.tsx","../src/listing/components/table-settings/components/custom-dialog.tsx","../src/listing/components/table-settings/components/custom-button.tsx","../src/listing/components/table-settings/components/lane.tsx","../src/listing/components/table-settings/components/group-by.tsx","../src/kanban/styles/styles.tsx","../src/kanban/constants/kanban-constants.ts","../src/listing/components/filter/index.tsx","../src/listing/components/table-settings/index.tsx","../src/listing/components/tabs/index.tsx","../src/kanban/index.tsx","../src/listing/components/index-table.tsx","../src/listing/libs/hooks/useCraftTable.tsx","../src/listing/libs/hooks/useCraftTableFilterSettings.tsx"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import React from \"react\";\r\n\r\nexport const SortIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n strokeWidth={1.5}\r\n stroke=\"currentColor\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n d=\"M3 7.5L7.5 3m0 0L12 7.5M7.5 3v13.5m13.5 0L16.5 21m0 0L12 16.5m4.5 4.5V7.5\"\r\n />\r\n </svg>\r\n);\r\n\r\nexport const GreenDot = () => (\r\n <svg\r\n width=\"8\"\r\n height=\"8\"\r\n viewBox=\"0 0 8 8\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <circle cx=\"4\" cy=\"4\" r=\"4\" fill=\"#5CD961\" />\r\n </svg>\r\n);\r\n\r\nexport const RedDot = () => (\r\n <svg\r\n width=\"8\"\r\n height=\"8\"\r\n viewBox=\"0 0 8 8\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <circle cx=\"4\" cy=\"4\" r=\"4\" fill=\"#F94144\" />\r\n </svg>\r\n);\r\n\r\nexport const BlueDot = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"8\"\r\n height=\"8\"\r\n viewBox=\"0 0 8 8\"\r\n fill=\"none\"\r\n >\r\n <circle cx=\"4\" cy=\"4\" r=\"4\" fill=\"#04769A\" />\r\n </svg>\r\n);\r\n\r\nexport const UpArrow = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n width=\"14\"\r\n height=\"14\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line>\r\n <polyline points=\"19 12 12 5 5 12\"></polyline>\r\n </svg>\r\n);\r\n\r\nexport const DownArrow = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n width=\"14\"\r\n height=\"14\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"5\"></line>\r\n <polyline points=\"5 12 12 19 19 12\"></polyline>\r\n </svg>\r\n);\r\n\r\nexport const TableFirstPageIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n aria-hidden=\"true\"\r\n role=\"presentation\"\r\n >\r\n <path d=\"M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z\"></path>\r\n <path fill=\"none\" d=\"M24 24H0V0h24v24z\"></path>\r\n </svg>\r\n);\r\n\r\nexport const TablePreviousPageIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n aria-hidden=\"true\"\r\n role=\"presentation\"\r\n >\r\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"></path>\r\n <path d=\"M0 0h24v24H0z\" fill=\"none\"></path>\r\n </svg>\r\n);\r\n\r\nexport const TableNextPageIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n aria-hidden=\"true\"\r\n role=\"presentation\"\r\n >\r\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"></path>\r\n <path d=\"M0 0h24v24H0z\" fill=\"none\"></path>\r\n </svg>\r\n);\r\n\r\nexport const TableLastPageIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n aria-hidden=\"true\"\r\n role=\"presentation\"\r\n >\r\n <path d=\"M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z\"></path>\r\n <path fill=\"none\" d=\"M0 0h24v24H0V0z\"></path>\r\n </svg>\r\n);\r\n\r\nexport const VerticalThreeDots = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"14\"\r\n height=\"14\"\r\n fill=\"currentColor\"\r\n className=\"bi bi-three-dots-vertical\"\r\n viewBox=\"0 0 16 16\"\r\n >\r\n <path d=\"M9.5 13a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0m0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0m0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0\" />\r\n </svg>\r\n);\r\n\r\nexport const ArrowDownUp = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"12\"\r\n height=\"12\"\r\n fill=\"currentColor\"\r\n className=\"bi bi-arrow-down-up\"\r\n viewBox=\"0 0 16 16\"\r\n >\r\n <path\r\n fillRule=\"evenodd\"\r\n d=\"M11.5 15a.5.5 0 0 0 .5-.5V2.707l3.146 3.147a.5.5 0 0 0 .708-.708l-4-4a.5.5 0 0 0-.708 0l-4 4a.5.5 0 1 0 .708.708L11 2.707V14.5a.5.5 0 0 0 .5.5m-7-14a.5.5 0 0 1 .5.5v11.793l3.146-3.147a.5.5 0 0 1 .708.708l-4 4a.5.5 0 0 1-.708 0l-4-4a.5.5 0 0 1 .708-.708L4 13.293V1.5a.5.5 0 0 1 .5-.5\"\r\n />\r\n </svg>\r\n);\r\nexport const EditIcon = () => (\r\n <svg\r\n width=\"18\"\r\n height=\"12\"\r\n viewBox=\"0 0 12 12\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M1.33331 10.6663H2.17431L8.99865 3.84201L8.15765 3.00101L1.33331 9.82534V10.6663ZM0.93598 11.6663C0.765202 11.6663 0.622091 11.6086 0.506646 11.493C0.391091 11.3776 0.333313 11.2345 0.333313 11.0637V9.90867C0.333313 9.74612 0.364535 9.59118 0.42698 9.44384C0.489313 9.29651 0.575202 9.16812 0.684646 9.05868L9.12698 0.620174C9.22776 0.528619 9.33904 0.457897 9.46081 0.408008C9.5827 0.358008 9.71048 0.333008 9.84415 0.333008C9.97781 0.333008 10.1073 0.35673 10.2325 0.404175C10.3578 0.451619 10.4688 0.527063 10.5653 0.630507L11.3795 1.45484C11.4829 1.5514 11.5566 1.66251 11.6006 1.78817C11.6446 1.91384 11.6666 2.03951 11.6666 2.16517C11.6666 2.29929 11.6438 2.42723 11.598 2.54901C11.5522 2.6709 11.4794 2.78223 11.3795 2.88301L2.94098 11.315C2.83154 11.4245 2.70315 11.5103 2.55581 11.5727C2.40848 11.6351 2.25354 11.6663 2.09098 11.6663H0.93598ZM8.57081 3.42884L8.15765 3.00101L8.99865 3.84201L8.57081 3.42884Z\"\r\n fill=\"#0E0C0B\"\r\n fillOpacity={0.4}\r\n />\r\n </svg>\r\n);\r\n\r\nexport const DeleteIcon = () => (\r\n <svg\r\n width=\"18\"\r\n height=\"20\"\r\n viewBox=\"0 0 10 12\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M1.87183 11.6665C1.54039 11.6665 1.25667 11.5485 1.02067 11.3125C0.784667 11.0765 0.666667 10.7928 0.666667 10.4613V1.99982H0.5C0.358333 1.99982 0.239611 1.95188 0.143833 1.85599C0.0479445 1.7601 0 1.64132 0 1.49966C0 1.35788 0.0479445 1.23916 0.143833 1.14349C0.239611 1.04771 0.358333 0.999823 0.5 0.999823H3C3 0.836601 3.0575 0.69749 3.1725 0.58249C3.28739 0.467601 3.42644 0.410156 3.58967 0.410156H6.41033C6.57356 0.410156 6.71261 0.467601 6.8275 0.58249C6.9425 0.69749 7 0.836601 7 0.999823H9.5C9.64167 0.999823 9.76039 1.04777 9.85617 1.14366C9.95206 1.23955 10 1.35832 10 1.49999C10 1.64177 9.95206 1.76049 9.85617 1.85616C9.76039 1.95193 9.64167 1.99982 9.5 1.99982H9.33333V10.4613C9.33333 10.7928 9.21533 11.0765 8.97933 11.3125C8.74333 11.5485 8.45961 11.6665 8.12817 11.6665H1.87183ZM8.33333 1.99982H1.66667V10.4613C1.66667 10.5212 1.68589 10.5704 1.72433 10.6088C1.76278 10.6473 1.81194 10.6665 1.87183 10.6665H8.12817C8.18806 10.6665 8.23722 10.6473 8.27567 10.6088C8.31411 10.5704 8.33333 10.5212 8.33333 10.4613V1.99982ZM3.7695 9.33316C3.91117 9.33316 4.02989 9.28527 4.12567 9.18949C4.22133 9.0936 4.26917 8.97482 4.26917 8.83316V3.83316C4.26917 3.69149 4.22122 3.57271 4.12533 3.47682C4.02956 3.38104 3.91078 3.33316 3.769 3.33316C3.62733 3.33316 3.50861 3.38104 3.41283 3.47682C3.31717 3.57271 3.26933 3.69149 3.26933 3.83316V8.83316C3.26933 8.97482 3.31722 9.0936 3.413 9.18949C3.50889 9.28527 3.62772 9.33316 3.7695 9.33316ZM6.231 9.33316C6.37267 9.33316 6.49139 9.28527 6.58717 9.18949C6.68283 9.0936 6.73067 8.97482 6.73067 8.83316V3.83316C6.73067 3.69149 6.68278 3.57271 6.587 3.47682C6.49111 3.38104 6.37228 3.33316 6.2305 3.33316C6.08883 3.33316 5.97011 3.38104 5.87433 3.47682C5.77867 3.57271 5.73083 3.69149 5.73083 3.83316V8.83316C5.73083 8.97482 5.77878 9.0936 5.87467 9.18949C5.97044 9.28527 6.08922 9.33316 6.231 9.33316Z\"\r\n fill=\"#F63D68\"\r\n />\r\n </svg>\r\n);\r\n\r\nexport const CrossSearchIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className=\"tabler-icon tabler-icon-search-off\"\r\n >\r\n <path d=\"M5.039 5.062a7 7 0 0 0 9.91 9.89m1.584 -2.434a7 7 0 0 0 -9.038 -9.057\"></path>\r\n <path d=\"M3 3l18 18\"></path>\r\n </svg>\r\n);\r\n\r\nexport const FilterIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\"\r\n height=\"20\"\r\n fill=\"currentColor\"\r\n className=\"bi bi-funnel\"\r\n viewBox=\"0 0 16 16\"\r\n >\r\n <path d=\"M1.5 1.5A.5.5 0 0 1 2 1h12a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.128.334L10 8.692V13.5a.5.5 0 0 1-.342.474l-3 1A.5.5 0 0 1 6 14.5V8.692L1.628 3.834A.5.5 0 0 1 1.5 3.5zm1 .5v1.308l4.372 4.858A.5.5 0 0 1 7 8.5v5.306l2-.666V8.5a.5.5 0 0 1 .128-.334L13.5 3.308V2z\" />\r\n </svg>\r\n);\r\n\r\nexport const HideColumnIcon = () => (\r\n <svg\r\n width=\"28\"\r\n height=\"28\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M15 3.5H3C2.175 3.5 1.5 4.175 1.5 5V14C1.5 14.825 2.175 15.5 3 15.5H15C15.825 15.5 16.5 14.825 16.5 14V5C16.5 4.175 15.825 3.5 15 3.5ZM6 14H3V5H6V14ZM10.5 14H7.5V5H10.5V14ZM15 14H12V5H15V14Z\"\r\n fill=\"currentColor\"\r\n stroke=\"white\"\r\n strokeWidth=\"0.5\"\r\n />\r\n </svg>\r\n);\r\n\r\nexport const PaddingMD = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className=\"tabler-icon tabler-icon-baseline-density-medium\"\r\n >\r\n <path d=\"M4 20h16\"></path>\r\n <path d=\"M4 12h16\"></path>\r\n <path d=\"M4 4h16\"></path>\r\n </svg>\r\n);\r\n\r\nexport const PaddingSM = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className=\"tabler-icon tabler-icon-baseline-density-small\"\r\n >\r\n <path d=\"M4 3h16\"></path>\r\n <path d=\"M4 9h16\"></path>\r\n <path d=\"M4 15h16\"></path>\r\n <path d=\"M4 21h16\"></path>\r\n </svg>\r\n);\r\n\r\nexport const PaddingLG = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className=\"tabler-icon tabler-icon-baseline-density-large\"\r\n >\r\n <path d=\"M4 4h16\"></path>\r\n <path d=\"M4 20h16\"></path>\r\n </svg>\r\n);\r\n\r\nexport const DragHandleIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className=\"tabler-icon tabler-icon-grip-horizontal\"\r\n transform=\"rotate(90)\"\r\n >\r\n <path d=\"M10 9m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\"></path>\r\n <path d=\"M10 15m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\"></path>\r\n <path d=\"M18 9m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\"></path>\r\n <path d=\"M18 15m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\"></path>\r\n </svg>\r\n);\r\n\r\nexport const IconPinOutline = (props: React.SVGProps<SVGSVGElement>) => {\r\n return (\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"currentColor\"\r\n height=\"1rem\"\r\n width=\"1rem\"\r\n {...props}\r\n >\r\n <path d=\"M16 12V4h1V2H7v2h1v8l-2 2v2h5.2v6h1.6v-6H18v-2l-2-2m-7.2 2l1.2-1.2V4h4v8.8l1.2 1.2H8.8z\" />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const IconPinOffOutline = (props: React.SVGProps<SVGSVGElement>) => {\r\n return (\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"currentColor\"\r\n height=\"1rem\"\r\n width=\"1rem\"\r\n {...props}\r\n >\r\n <path d=\"M8 6.2V4H7V2h10v2h-1v8l2 2v2h-.2L14 12.2V4h-4v4.2l-2-2m12 14.5L18.7 22l-5.9-5.9V22h-1.6v-6H6v-2l2-2v-.7l-6-6L3.3 4 20 20.7M8.8 14h1.8l-.9-.9-.9.9z\" />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const IconExpand = (props: React.SVGProps<SVGSVGElement>) => {\r\n return (\r\n <svg\r\n viewBox=\"0 0 1024 1024\"\r\n fill=\"currentColor\"\r\n height=\"1rem\"\r\n width=\"1rem\"\r\n {...props}\r\n >\r\n <defs>\r\n <style />\r\n </defs>\r\n <path d=\"M342 88H120c-17.7 0-32 14.3-32 32v224c0 8.8 7.2 16 16 16h48c8.8 0 16-7.2 16-16V168h174c8.8 0 16-7.2 16-16v-48c0-8.8-7.2-16-16-16zm578 576h-48c-8.8 0-16 7.2-16 16v176H682c-8.8 0-16 7.2-16 16v48c0 8.8 7.2 16 16 16h222c17.7 0 32-14.3 32-32V680c0-8.8-7.2-16-16-16zM342 856H168V680c0-8.8-7.2-16-16-16h-48c-8.8 0-16 7.2-16 16v224c0 17.7 14.3 32 32 32h222c8.8 0 16-7.2 16-16v-48c0-8.8-7.2-16-16-16zM904 88H682c-8.8 0-16 7.2-16 16v48c0 8.8 7.2 16 16 16h174v176c0 8.8 7.2 16 16 16h48c8.8 0 16-7.2 16-16V120c0-17.7-14.3-32-32-32z\" />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const LoaderAnimation = () => {\r\n return (\r\n <svg viewBox=\"0 0 60 60\" width={\"4rem\"}>\r\n <circle fill=\"currentColor\" stroke=\"none\" cx=\"6\" cy=\"30\" r=\"5\">\r\n <animateTransform\r\n attributeName=\"transform\"\r\n dur=\"1s\"\r\n type=\"translate\"\r\n values=\"0 15 ; 0 -15; 0 15\"\r\n repeatCount=\"indefinite\"\r\n begin=\"0.1\"\r\n />\r\n </circle>\r\n <circle fill=\"currentColor\" stroke=\"none\" cx=\"24\" cy=\"30\" r=\"5\">\r\n <animateTransform\r\n attributeName=\"transform\"\r\n dur=\"1s\"\r\n type=\"translate\"\r\n values=\"0 10 ; 0 -10; 0 10\"\r\n repeatCount=\"indefinite\"\r\n begin=\"0.2\"\r\n />\r\n </circle>\r\n <circle fill=\"currentColor\" stroke=\"none\" cx=\"42\" cy=\"30\" r=\"5\">\r\n <animateTransform\r\n attributeName=\"transform\"\r\n dur=\"1s\"\r\n type=\"translate\"\r\n values=\"0 5 ; 0 -5; 0 5\"\r\n repeatCount=\"indefinite\"\r\n begin=\"0.3\"\r\n />\r\n </circle>\r\n </svg>\r\n );\r\n};\r\n\r\nexport const ChangeLayoutIcon = () => {\r\n return (\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <mask\r\n id=\"mask0_811_12587\"\r\n style={{ maskType: \"alpha\" }}\r\n maskUnits=\"userSpaceOnUse\"\r\n x=\"0\"\r\n y=\"0\"\r\n width=\"20\"\r\n height=\"20\"\r\n >\r\n <rect width=\"20\" height=\"20\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_811_12587)\">\r\n <path\r\n d=\"M4.42311 17.0834C4.00214 17.0834 3.64582 16.9375 3.35416 16.6459C3.06249 16.3542 2.91666 15.9979 2.91666 15.5769V4.42315C2.91666 4.00217 3.06249 3.64585 3.35416 3.35419C3.64582 3.06252 4.00214 2.91669 4.42311 2.91669H15.5769C15.9978 2.91669 16.3542 3.06252 16.6458 3.35419C16.9375 3.64585 17.0833 4.00217 17.0833 4.42315V15.5769C17.0833 15.9979 16.9375 16.3542 16.6458 16.6459C16.3542 16.9375 15.9978 17.0834 15.5769 17.0834H4.42311ZM4.42311 15.8334H9.37499V4.16669H4.42311C4.35895 4.16669 4.3002 4.19342 4.24687 4.24689C4.19339 4.30023 4.16666 4.35898 4.16666 4.42315V15.5769C4.16666 15.6411 4.19339 15.6998 4.24687 15.7531C4.3002 15.8066 4.35895 15.8334 4.42311 15.8334ZM10.625 15.8334H15.5769C15.641 15.8334 15.6998 15.8066 15.7531 15.7531C15.8066 15.6998 15.8333 15.6411 15.8333 15.5769V10H10.625V15.8334ZM10.625 8.75002H15.8333V4.42315C15.8333 4.35898 15.8066 4.30023 15.7531 4.24689C15.6998 4.19342 15.641 4.16669 15.5769 4.16669H10.625V8.75002Z\"\r\n fill=\"#1E1E1E\"\r\n />\r\n </g>\r\n </svg>\r\n );\r\n};\r\n\r\nexport const BoardIcon = () => {\r\n return (\r\n <svg\r\n width=\"13\"\r\n height=\"10\"\r\n viewBox=\"0 0 13 10\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M1.37179 9H4.05763V1H1.37179C1.3119 1 1.26274 1.01922 1.22429 1.05767C1.18585 1.09611 1.16663 1.14528 1.16663 1.20517V8.79483C1.16663 8.85472 1.18585 8.90389 1.22429 8.94233C1.26274 8.98078 1.3119 9 1.37179 9ZM5.05763 9H7.94229V1H5.05763V9ZM8.94229 9H11.6281C11.688 9 11.7372 8.98078 11.7756 8.94233C11.8141 8.90389 11.8333 8.85472 11.8333 8.79483V1.20517C11.8333 1.14528 11.8141 1.09611 11.7756 1.05767C11.7372 1.01922 11.688 1 11.6281 1H8.94229V9ZM1.37179 10C1.03501 10 0.749959 9.88333 0.516626 9.65C0.283293 9.41667 0.166626 9.13161 0.166626 8.79483V1.20517C0.166626 0.868389 0.283293 0.583333 0.516626 0.35C0.749959 0.116667 1.03501 0 1.37179 0H11.6281C11.9649 0 12.25 0.116667 12.4833 0.35C12.7166 0.583333 12.8333 0.868389 12.8333 1.20517V8.79483C12.8333 9.13161 12.7166 9.41667 12.4833 9.65C12.25 9.88333 11.9649 10 11.6281 10H1.37179Z\"\r\n fill=\"#A6A6A6\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const TableIcon = () => {\r\n return (\r\n <svg\r\n width=\"13\"\r\n height=\"12\"\r\n viewBox=\"0 0 13 12\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M3.17954 9.16671H5.82054C5.96243 9.16671 6.08121 9.11882 6.17687 9.02304C6.27265 8.92737 6.32054 8.8086 6.32054 8.66671C6.32054 8.52482 6.27265 8.40604 6.17687 8.31037C6.08121 8.2146 5.96243 8.16671 5.82054 8.16671H3.17954C3.03765 8.16671 2.91887 8.2146 2.82321 8.31037C2.72743 8.40604 2.67954 8.52482 2.67954 8.66671C2.67954 8.8086 2.72743 8.92737 2.82321 9.02304C2.91887 9.11882 3.03765 9.16671 3.17954 9.16671ZM5.17954 6.50004H7.82054C7.96243 6.50004 8.08121 6.45215 8.17687 6.35637C8.27265 6.26071 8.32054 6.14193 8.32054 6.00004C8.32054 5.85815 8.27265 5.73937 8.17687 5.64371C8.08121 5.54793 7.96243 5.50004 7.82054 5.50004H5.17954C5.03765 5.50004 4.91887 5.54793 4.82321 5.64371C4.72743 5.73937 4.67954 5.85815 4.67954 6.00004C4.67954 6.14193 4.72743 6.26071 4.82321 6.35637C4.91887 6.45215 5.03765 6.50004 5.17954 6.50004ZM7.17954 3.83337H9.82054C9.96243 3.83337 10.0812 3.78549 10.1769 3.68971C10.2727 3.59404 10.3205 3.47526 10.3205 3.33337C10.3205 3.19148 10.2727 3.07271 10.1769 2.97704C10.0812 2.88126 9.96243 2.83337 9.82054 2.83337H7.17954C7.03765 2.83337 6.91887 2.88126 6.82321 2.97704C6.72743 3.07271 6.67954 3.19148 6.67954 3.33337C6.67954 3.47526 6.72743 3.59404 6.82321 3.68971C6.91887 3.78549 7.03765 3.83337 7.17954 3.83337ZM2.03854 11.6667C1.70176 11.6667 1.41671 11.55 1.18337 11.3167C0.950041 11.0834 0.833374 10.7983 0.833374 10.4615V1.53854C0.833374 1.20176 0.950041 0.916707 1.18337 0.683374C1.41671 0.450041 1.70176 0.333374 2.03854 0.333374H10.9615C11.2983 0.333374 11.5834 0.450041 11.8167 0.683374C12.05 0.916707 12.1667 1.20176 12.1667 1.53854V10.4615C12.1667 10.7983 12.05 11.0834 11.8167 11.3167C11.5834 11.55 11.2983 11.6667 10.9615 11.6667H2.03854ZM2.03854 10.6667H10.9615C11.0129 10.6667 11.0599 10.6453 11.1025 10.6025C11.1453 10.5599 11.1667 10.5129 11.1667 10.4615V1.53854C11.1667 1.48721 11.1453 1.44021 11.1025 1.39754C11.0599 1.35476 11.0129 1.33337 10.9615 1.33337H2.03854C1.98721 1.33337 1.94021 1.35476 1.89754 1.39754C1.85476 1.44021 1.83337 1.48721 1.83337 1.53854V10.4615C1.83337 10.5129 1.85476 10.5599 1.89754 10.6025C1.94021 10.6453 1.98721 10.6667 2.03854 10.6667Z\"\r\n fill=\"#A6A6A6\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const TimeLineIcon = () => {\r\n return (\r\n <svg\r\n width=\"13\"\r\n height=\"12\"\r\n viewBox=\"0 0 13 12\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M3.17954 9.16671H5.82054C5.96243 9.16671 6.08121 9.11882 6.17687 9.02304C6.27265 8.92737 6.32054 8.8086 6.32054 8.66671C6.32054 8.52482 6.27265 8.40604 6.17687 8.31037C6.08121 8.2146 5.96243 8.16671 5.82054 8.16671H3.17954C3.03765 8.16671 2.91887 8.2146 2.82321 8.31037C2.72743 8.40604 2.67954 8.52482 2.67954 8.66671C2.67954 8.8086 2.72743 8.92737 2.82321 9.02304C2.91887 9.11882 3.03765 9.16671 3.17954 9.16671ZM5.17954 6.50004H7.82054C7.96243 6.50004 8.08121 6.45215 8.17687 6.35637C8.27265 6.26071 8.32054 6.14193 8.32054 6.00004C8.32054 5.85815 8.27265 5.73937 8.17687 5.64371C8.08121 5.54793 7.96243 5.50004 7.82054 5.50004H5.17954C5.03765 5.50004 4.91887 5.54793 4.82321 5.64371C4.72743 5.73937 4.67954 5.85815 4.67954 6.00004C4.67954 6.14193 4.72743 6.26071 4.82321 6.35637C4.91887 6.45215 5.03765 6.50004 5.17954 6.50004ZM7.17954 3.83337H9.82054C9.96243 3.83337 10.0812 3.78549 10.1769 3.68971C10.2727 3.59404 10.3205 3.47526 10.3205 3.33337C10.3205 3.19148 10.2727 3.07271 10.1769 2.97704C10.0812 2.88126 9.96243 2.83337 9.82054 2.83337H7.17954C7.03765 2.83337 6.91887 2.88126 6.82321 2.97704C6.72743 3.07271 6.67954 3.19148 6.67954 3.33337C6.67954 3.47526 6.72743 3.59404 6.82321 3.68971C6.91887 3.78549 7.03765 3.83337 7.17954 3.83337ZM2.03854 11.6667C1.70176 11.6667 1.41671 11.55 1.18337 11.3167C0.950041 11.0834 0.833374 10.7983 0.833374 10.4615V1.53854C0.833374 1.20176 0.950041 0.916707 1.18337 0.683374C1.41671 0.450041 1.70176 0.333374 2.03854 0.333374H10.9615C11.2983 0.333374 11.5834 0.450041 11.8167 0.683374C12.05 0.916707 12.1667 1.20176 12.1667 1.53854V10.4615C12.1667 10.7983 12.05 11.0834 11.8167 11.3167C11.5834 11.55 11.2983 11.6667 10.9615 11.6667H2.03854ZM2.03854 10.6667H10.9615C11.0129 10.6667 11.0599 10.6453 11.1025 10.6025C11.1453 10.5599 11.1667 10.5129 11.1667 10.4615V1.53854C11.1667 1.48721 11.1453 1.44021 11.1025 1.39754C11.0599 1.35476 11.0129 1.33337 10.9615 1.33337H2.03854C1.98721 1.33337 1.94021 1.35476 1.89754 1.39754C1.85476 1.44021 1.83337 1.48721 1.83337 1.53854V10.4615C1.83337 10.5129 1.85476 10.5599 1.89754 10.6025C1.94021 10.6453 1.98721 10.6667 2.03854 10.6667Z\"\r\n fill=\"#A6A6A6\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const ListIcon = () => {\r\n return (\r\n <svg\r\n width=\"13\"\r\n height=\"12\"\r\n viewBox=\"0 0 13 12\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M5.20521 10.5C5.06354 10.5 4.94476 10.452 4.84887 10.3562C4.7531 10.2603 4.70521 10.1415 4.70521 9.99982C4.70521 9.85805 4.7531 9.73932 4.84887 9.64366C4.94476 9.54788 5.06354 9.49999 5.20521 9.49999H11.6667C11.8084 9.49999 11.9271 9.54794 12.0229 9.64382C12.1188 9.73971 12.1667 9.85849 12.1667 10.0002C12.1667 10.1419 12.1188 10.2607 12.0229 10.3563C11.9271 10.4521 11.8084 10.5 11.6667 10.5H5.20521ZM5.20521 6.49999C5.06354 6.49999 4.94476 6.45205 4.84887 6.35616C4.7531 6.26027 4.70521 6.14149 4.70521 5.99982C4.70521 5.85805 4.7531 5.73932 4.84887 5.64366C4.94476 5.54788 5.06354 5.49999 5.20521 5.49999H11.6667C11.8084 5.49999 11.9271 5.54794 12.0229 5.64382C12.1188 5.73971 12.1667 5.85849 12.1667 6.00016C12.1667 6.14194 12.1188 6.26066 12.0229 6.35632C11.9271 6.4521 11.8084 6.49999 11.6667 6.49999H5.20521ZM5.20521 2.49999C5.06354 2.49999 4.94476 2.45205 4.84887 2.35616C4.7531 2.26027 4.70521 2.14149 4.70521 1.99982C4.70521 1.85805 4.7531 1.73932 4.84887 1.64366C4.94476 1.54788 5.06354 1.49999 5.20521 1.49999H11.6667C11.8084 1.49999 11.9271 1.54794 12.0229 1.64382C12.1188 1.73971 12.1667 1.85849 12.1667 2.00016C12.1667 2.14194 12.1188 2.26066 12.0229 2.35632C11.9271 2.4521 11.8084 2.49999 11.6667 2.49999H5.20521ZM1.94237 11.109C1.63737 11.109 1.37632 11.0004 1.15921 10.7832C0.941985 10.566 0.833374 10.305 0.833374 9.99999C0.833374 9.69499 0.941985 9.43394 1.15921 9.21682C1.37632 8.9996 1.63737 8.89099 1.94237 8.89099C2.24737 8.89099 2.50843 8.9996 2.72554 9.21682C2.94276 9.43394 3.05137 9.69499 3.05137 9.99999C3.05137 10.305 2.94276 10.566 2.72554 10.7832C2.50843 11.0004 2.24737 11.109 1.94237 11.109ZM1.94237 7.10899C1.63737 7.10899 1.37632 7.00038 1.15921 6.78316C0.941985 6.56605 0.833374 6.30499 0.833374 5.99999C0.833374 5.69499 0.941985 5.43394 1.15921 5.21682C1.37632 4.9996 1.63737 4.89099 1.94237 4.89099C2.24737 4.89099 2.50843 4.9996 2.72554 5.21682C2.94276 5.43394 3.05137 5.69499 3.05137 5.99999C3.05137 6.30499 2.94276 6.56605 2.72554 6.78316C2.50843 7.00038 2.24737 7.10899 1.94237 7.10899ZM1.94237 3.10899C1.63737 3.10899 1.37632 3.00038 1.15921 2.78316C0.941985 2.56605 0.833374 2.30499 0.833374 1.99999C0.833374 1.69499 0.941985 1.43394 1.15921 1.21682C1.37632 0.999602 1.63737 0.890991 1.94237 0.890991C2.24737 0.890991 2.50843 0.999602 2.72554 1.21682C2.94276 1.43394 3.05137 1.69499 3.05137 1.99999C3.05137 2.30499 2.94276 2.56605 2.72554 2.78316C2.50843 3.00038 2.24737 3.10899 1.94237 3.10899Z\"\r\n fill=\"#A6A6A6\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const CalendarIcon = () => {\r\n return (\r\n <svg\r\n width=\"13\"\r\n height=\"14\"\r\n viewBox=\"0 0 13 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M2.03854 13.3333C1.70176 13.3333 1.41671 13.2167 1.18337 12.9833C0.950041 12.75 0.833374 12.465 0.833374 12.1282V3.20518C0.833374 2.8684 0.950041 2.58334 1.18337 2.35001C1.41671 2.11668 1.70176 2.00001 2.03854 2.00001H2.96154V1.10251C2.96154 0.956399 3.01049 0.834399 3.10837 0.73651C3.20626 0.638732 3.32826 0.589844 3.47437 0.589844C3.6206 0.589844 3.7426 0.638732 3.84037 0.73651C3.93826 0.834399 3.98721 0.956399 3.98721 1.10251V2.00001H9.03854V1.08984C9.03854 0.947955 9.08637 0.829121 9.18204 0.733344C9.27782 0.637677 9.39665 0.589844 9.53854 0.589844C9.68043 0.589844 9.79921 0.637677 9.89487 0.733344C9.99065 0.829121 10.0385 0.947955 10.0385 1.08984V2.00001H10.9615C11.2983 2.00001 11.5834 2.11668 11.8167 2.35001C12.05 2.58334 12.1667 2.8684 12.1667 3.20518V12.1282C12.1667 12.465 12.05 12.75 11.8167 12.9833C11.5834 13.2167 11.2983 13.3333 10.9615 13.3333H2.03854ZM2.03854 12.3333H10.9615C11.0129 12.3333 11.0599 12.312 11.1025 12.2692C11.1453 12.2265 11.1667 12.1795 11.1667 12.1282V5.87184H1.83337V12.1282C1.83337 12.1795 1.85476 12.2265 1.89754 12.2692C1.94021 12.312 1.98721 12.3333 2.03854 12.3333ZM1.83337 4.87184H11.1667V3.20518C11.1667 3.15384 11.1453 3.10684 11.1025 3.06418C11.0599 3.0214 11.0129 3.00001 10.9615 3.00001H2.03854C1.98721 3.00001 1.94021 3.0214 1.89754 3.06418C1.85476 3.10684 1.83337 3.15384 1.83337 3.20518V4.87184ZM6.50004 8.38468C6.33682 8.38468 6.19771 8.32718 6.08271 8.21218C5.96782 8.09729 5.91037 7.95818 5.91037 7.79484C5.91037 7.63162 5.96782 7.49251 6.08271 7.37751C6.19771 7.26262 6.33682 7.20518 6.50004 7.20518C6.66326 7.20518 6.80237 7.26262 6.91737 7.37751C7.03226 7.49251 7.08971 7.63162 7.08971 7.79484C7.08971 7.95818 7.03226 8.09729 6.91737 8.21218C6.80237 8.32718 6.66326 8.38468 6.50004 8.38468ZM3.83337 8.38468C3.67015 8.38468 3.53104 8.32718 3.41604 8.21218C3.30115 8.09729 3.24371 7.95818 3.24371 7.79484C3.24371 7.63162 3.30115 7.49251 3.41604 7.37751C3.53104 7.26262 3.67015 7.20518 3.83337 7.20518C3.9966 7.20518 4.13571 7.26262 4.25071 7.37751C4.3656 7.49251 4.42304 7.63162 4.42304 7.79484C4.42304 7.95818 4.3656 8.09729 4.25071 8.21218C4.13571 8.32718 3.9966 8.38468 3.83337 8.38468ZM9.16671 8.38468C9.00348 8.38468 8.86437 8.32718 8.74937 8.21218C8.63449 8.09729 8.57704 7.95818 8.57704 7.79484C8.57704 7.63162 8.63449 7.49251 8.74937 7.37751C8.86437 7.26262 9.00348 7.20518 9.16671 7.20518C9.32993 7.20518 9.46904 7.26262 9.58404 7.37751C9.69893 7.49251 9.75637 7.63162 9.75637 7.79484C9.75637 7.95818 9.69893 8.09729 9.58404 8.21218C9.46904 8.32718 9.32993 8.38468 9.16671 8.38468ZM6.50004 11C6.33682 11 6.19771 10.9425 6.08271 10.8275C5.96782 10.7126 5.91037 10.5736 5.91037 10.4103C5.91037 10.247 5.96782 10.1079 6.08271 9.99301C6.19771 9.87801 6.33682 9.82051 6.50004 9.82051C6.66326 9.82051 6.80237 9.87801 6.91737 9.99301C7.03226 10.1079 7.08971 10.247 7.08971 10.4103C7.08971 10.5736 7.03226 10.7126 6.91737 10.8275C6.80237 10.9425 6.66326 11 6.50004 11ZM3.83337 11C3.67015 11 3.53104 10.9425 3.41604 10.8275C3.30115 10.7126 3.24371 10.5736 3.24371 10.4103C3.24371 10.247 3.30115 10.1079 3.41604 9.99301C3.53104 9.87801 3.67015 9.82051 3.83337 9.82051C3.9966 9.82051 4.13571 9.87801 4.25071 9.99301C4.3656 10.1079 4.42304 10.247 4.42304 10.4103C4.42304 10.5736 4.3656 10.7126 4.25071 10.8275C4.13571 10.9425 3.9966 11 3.83337 11ZM9.16671 11C9.00348 11 8.86437 10.9425 8.74937 10.8275C8.63449 10.7126 8.57704 10.5736 8.57704 10.4103C8.57704 10.247 8.63449 10.1079 8.74937 9.99301C8.86437 9.87801 9.00348 9.82051 9.16671 9.82051C9.32993 9.82051 9.46904 9.87801 9.58404 9.99301C9.69893 10.1079 9.75637 10.247 9.75637 10.4103C9.75637 10.5736 9.69893 10.7126 9.58404 10.8275C9.46904 10.9425 9.32993 11 9.16671 11Z\"\r\n fill=\"#A6A6A6\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const GalleryIcon = () => {\r\n return (\r\n <svg\r\n width=\"15\"\r\n height=\"10\"\r\n viewBox=\"0 0 15 10\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M1.87179 9.33329C1.54035 9.33329 1.25663 9.21529 1.02063 8.97929C0.784626 8.74329 0.666626 8.45957 0.666626 8.12813V1.87179C0.666626 1.54035 0.784626 1.25663 1.02063 1.02063C1.25663 0.784626 1.54035 0.666626 1.87179 0.666626H8.12813C8.45957 0.666626 8.74329 0.784626 8.97929 1.02063C9.21529 1.25663 9.33329 1.54035 9.33329 1.87179V8.12813C9.33329 8.45957 9.21529 8.74329 8.97929 8.97929C8.74329 9.21529 8.45957 9.33329 8.12813 9.33329H1.87179ZM11.2723 4.33329C11.0984 4.33329 10.954 4.27579 10.8391 4.16079C10.7241 4.0459 10.6666 3.90151 10.6666 3.72763V1.27246C10.6666 1.09846 10.7241 0.954014 10.8391 0.839126C10.954 0.724126 11.0984 0.666626 11.2723 0.666626H13.7275C13.9015 0.666626 14.0459 0.724126 14.1608 0.839126C14.2758 0.954014 14.3333 1.09846 14.3333 1.27246V3.72763C14.3333 3.90151 14.2758 4.0459 14.1608 4.16079C14.0459 4.27579 13.9015 4.33329 13.7275 4.33329H11.2723ZM11.6666 3.33329H13.3333V1.66663H11.6666V3.33329ZM1.87179 8.33329H8.12813C8.18802 8.33329 8.23718 8.31407 8.27563 8.27563C8.31407 8.23718 8.33329 8.18802 8.33329 8.12813V1.87179C8.33329 1.8119 8.31407 1.76274 8.27563 1.72429C8.23718 1.68585 8.18802 1.66663 8.12813 1.66663H1.87179C1.8119 1.66663 1.76274 1.68585 1.72429 1.72429C1.68585 1.76274 1.66663 1.8119 1.66663 1.87179V8.12813C1.66663 8.18802 1.68585 8.23718 1.72429 8.27563C1.76274 8.31407 1.8119 8.33329 1.87179 8.33329ZM2.99996 6.96796H6.99996C7.11829 6.96796 7.20707 6.91324 7.26629 6.80379C7.32552 6.69435 7.31707 6.58835 7.24096 6.48579L6.15763 5.03579C6.09529 4.95546 6.01496 4.91529 5.91663 4.91529C5.81829 4.91529 5.73796 4.95546 5.67563 5.03579L4.66663 6.38463L3.99096 5.48579C3.92863 5.40546 3.84829 5.36529 3.74996 5.36529C3.65163 5.36529 3.57129 5.40546 3.50896 5.48579L2.75896 6.48579C2.68285 6.58835 2.6744 6.69435 2.73363 6.80379C2.79285 6.91324 2.88163 6.96796 2.99996 6.96796ZM11.2723 9.33329C11.0984 9.33329 10.954 9.27579 10.8391 9.16079C10.7241 9.0459 10.6666 8.90146 10.6666 8.72746V6.27229C10.6666 6.0984 10.7241 5.95402 10.8391 5.83913C10.954 5.72413 11.0984 5.66663 11.2723 5.66663H13.7275C13.9015 5.66663 14.0459 5.72413 14.1608 5.83913C14.2758 5.95402 14.3333 6.0984 14.3333 6.27229V8.72746C14.3333 8.90146 14.2758 9.0459 14.1608 9.16079C14.0459 9.27579 13.9015 9.33329 13.7275 9.33329H11.2723ZM11.6666 8.33329H13.3333V6.66663H11.6666V8.33329Z\"\r\n fill=\"#A6A6A6\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const ChartsIcon = () => {\r\n return (\r\n <svg\r\n width=\"13\"\r\n height=\"14\"\r\n viewBox=\"0 0 13 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M7.14485 1.42317C7.14485 1.22028 7.22413 1.058 7.38268 0.936332C7.54124 0.814666 7.71879 0.777333 7.91535 0.824333C9.12135 1.07389 10.16 1.64056 11.0314 2.52433C11.9028 3.40811 12.4633 4.46328 12.7128 5.68983C12.753 5.86583 12.7148 6.02133 12.5985 6.15633C12.4822 6.29144 12.3228 6.359 12.1205 6.359H8.42435C8.38424 6.359 8.34907 6.34894 8.31885 6.32883C8.28874 6.30872 8.26363 6.27861 8.24352 6.2385C8.14352 6.01794 8.00863 5.82105 7.83885 5.64783C7.66896 5.47461 7.47779 5.34072 7.26535 5.24617C7.22524 5.22628 7.19513 5.20389 7.17502 5.179C7.1549 5.15411 7.14485 5.12178 7.14485 5.082V1.42317ZM8.14485 1.95133V4.60267C8.29274 4.70689 8.43079 4.82206 8.55902 4.94817C8.68724 5.07417 8.80135 5.21111 8.90135 5.359H11.5653C11.3158 4.54278 10.8874 3.831 10.2802 3.22367C9.67285 2.61644 8.96107 2.19233 8.14485 1.95133ZM5.10518 13.1692C3.6804 12.8462 2.5039 12.113 1.57568 10.9697C0.647461 9.82644 0.18335 8.50322 0.18335 7C0.18335 5.49367 0.647461 4.17028 1.57568 3.02983C2.5039 1.8895 3.6804 1.1565 5.10518 0.830832C5.30607 0.783832 5.48685 0.8265 5.64752 0.958833C5.80818 1.09117 5.88852 1.25917 5.88852 1.46283V5.108C5.88852 5.11867 5.85729 5.16128 5.79485 5.23583C5.43852 5.38294 5.15352 5.61672 4.93985 5.93717C4.72607 6.25772 4.61918 6.61244 4.61918 7.00133C4.61918 7.39022 4.72607 7.74 4.93985 8.05067C5.15352 8.36133 5.43852 8.58805 5.79485 8.73083C5.81285 8.73761 5.84407 8.77989 5.88852 8.85767V12.5577C5.88852 12.7643 5.80818 12.9297 5.64752 13.0537C5.48685 13.1777 5.30607 13.2162 5.10518 13.1692ZM4.88852 1.95133C3.78341 2.28033 2.88957 2.91194 2.20702 3.84617C1.52457 4.78039 1.18335 5.83167 1.18335 7C1.18335 8.16833 1.52457 9.21961 2.20702 10.1538C2.88957 11.0881 3.78341 11.7265 4.88852 12.0692V9.37183C4.50052 9.08805 4.19196 8.74122 3.96285 8.33133C3.73385 7.92156 3.61935 7.47672 3.61935 6.99683C3.61935 6.51694 3.73279 6.071 3.95968 5.659C4.18657 5.247 4.49618 4.89911 4.88852 4.61533V1.95133ZM7.89618 13.1757C7.69963 13.2183 7.52524 13.1806 7.37302 13.0625C7.2209 12.9443 7.14485 12.7867 7.14485 12.5897V8.90133C7.14485 8.86111 7.1549 8.82594 7.17502 8.79583C7.19513 8.76572 7.22524 8.74061 7.26535 8.7205C7.48335 8.62472 7.67707 8.49194 7.84652 8.32217C8.01596 8.15228 8.14829 7.96111 8.24352 7.74867C8.2504 7.735 8.30713 7.69483 8.41368 7.62817H12.1205C12.3022 7.62817 12.4536 7.70405 12.5747 7.85583C12.6958 8.0075 12.7363 8.17822 12.6962 8.368C12.4355 9.59444 11.8667 10.6417 10.9897 11.5097C10.1128 12.3776 9.08163 12.9329 7.89618 13.1757ZM8.90135 8.62817C8.79957 8.77172 8.68502 8.90656 8.55768 9.03267C8.43035 9.15878 8.29274 9.27183 8.14485 9.37183V12.0487C8.9654 11.8034 9.67824 11.3772 10.2833 10.7698C10.8885 10.1626 11.3158 9.44872 11.5653 8.62817H8.90135Z\"\r\n fill=\"#A6A6A6\"\r\n />\r\n </svg>\r\n );\r\n};\r\nexport const ViewMoreIcon = () => {\r\n return (\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <mask\r\n id=\"mask0_811_12719\"\r\n style={{ maskType: \"alpha\" }}\r\n maskUnits=\"userSpaceOnUse\"\r\n x=\"0\"\r\n y=\"0\"\r\n width=\"20\"\r\n height=\"20\"\r\n >\r\n <rect width=\"20\" height=\"20\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_811_12719)\">\r\n <path\r\n d=\"M4.99998 11.6666C4.54165 11.6666 4.14929 11.5035 3.8229 11.1771C3.49651 10.8507 3.33331 10.4583 3.33331 9.99998C3.33331 9.54165 3.49651 9.14929 3.8229 8.8229C4.14929 8.49651 4.54165 8.33331 4.99998 8.33331C5.45831 8.33331 5.85067 8.49651 6.17706 8.8229C6.50345 9.14929 6.66665 9.54165 6.66665 9.99998C6.66665 10.4583 6.50345 10.8507 6.17706 11.1771C5.85067 11.5035 5.45831 11.6666 4.99998 11.6666ZM9.99998 11.6666C9.54165 11.6666 9.14929 11.5035 8.8229 11.1771C8.49651 10.8507 8.33331 10.4583 8.33331 9.99998C8.33331 9.54165 8.49651 9.14929 8.8229 8.8229C9.14929 8.49651 9.54165 8.33331 9.99998 8.33331C10.4583 8.33331 10.8507 8.49651 11.1771 8.8229C11.5035 9.14929 11.6666 9.54165 11.6666 9.99998C11.6666 10.4583 11.5035 10.8507 11.1771 11.1771C10.8507 11.5035 10.4583 11.6666 9.99998 11.6666ZM15 11.6666C14.5416 11.6666 14.1493 11.5035 13.8229 11.1771C13.4965 10.8507 13.3333 10.4583 13.3333 9.99998C13.3333 9.54165 13.4965 9.14929 13.8229 8.8229C14.1493 8.49651 14.5416 8.33331 15 8.33331C15.4583 8.33331 15.8507 8.49651 16.1771 8.8229C16.5035 9.14929 16.6666 9.54165 16.6666 9.99998C16.6666 10.4583 16.5035 10.8507 16.1771 11.1771C15.8507 11.5035 15.4583 11.6666 15 11.6666Z\"\r\n fill=\"#1C1B1F\"\r\n />\r\n </g>\r\n </svg>\r\n );\r\n};\r\n\r\nexport const CloseIcon = () => {\r\n return (\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 14 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M11.0833 3.73919L10.2608 2.91669L6.99996 6.17752L3.73913 2.91669L2.91663 3.73919L6.17746 7.00002L2.91663 10.2609L3.73913 11.0834L6.99996 7.82252L10.2608 11.0834L11.0833 10.2609L7.82246 7.00002L11.0833 3.73919Z\"\r\n fill=\"#0C2033\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const SearchIcon = () => {\r\n return (\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <mask\r\n id=\"mask0_811_12583\"\r\n style={{ maskType: \"alpha\" }}\r\n maskUnits=\"userSpaceOnUse\"\r\n x=\"0\"\r\n y=\"0\"\r\n width=\"20\"\r\n height=\"20\"\r\n >\r\n <rect width=\"20\" height=\"20\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_811_12583)\">\r\n <path\r\n d=\"M7.93274 13.0127C6.50969 13.0127 5.30455 12.5192 4.31733 11.5321C3.33024 10.5449 2.8367 9.33971 2.8367 7.91666C2.8367 6.4936 3.33024 5.28847 4.31733 4.30124C5.30455 3.31416 6.50969 2.82062 7.93274 2.82062C9.3558 2.82062 10.5609 3.31416 11.5482 4.30124C12.5352 5.28847 13.0288 6.4936 13.0288 7.91666C13.0288 8.5118 12.9289 9.0802 12.7292 9.62187C12.5293 10.1635 12.2627 10.6346 11.9294 11.0352L16.7244 15.8302C16.8398 15.9455 16.8989 16.0905 16.9015 16.2652C16.9041 16.4399 16.8451 16.5876 16.7244 16.7083C16.6037 16.829 16.4573 16.8894 16.2852 16.8894C16.1133 16.8894 15.967 16.829 15.8463 16.7083L11.0513 11.9133C10.6346 12.2574 10.1554 12.5266 9.61378 12.721C9.07212 12.9155 8.51177 13.0127 7.93274 13.0127ZM7.93274 11.7629C9.00649 11.7629 9.91594 11.3903 10.6611 10.645C11.4064 9.89985 11.779 8.99041 11.779 7.91666C11.779 6.84291 11.4064 5.93346 10.6611 5.18833C9.91594 4.44305 9.00649 4.07041 7.93274 4.07041C6.85899 4.07041 5.94955 4.44305 5.20441 5.18833C4.45913 5.93346 4.08649 6.84291 4.08649 7.91666C4.08649 8.99041 4.45913 9.89985 5.20441 10.645C5.94955 11.3903 6.85899 11.7629 7.93274 11.7629Z\"\r\n fill=\"#1E1E1E\"\r\n />\r\n </g>\r\n </svg>\r\n );\r\n};\r\n\r\nexport const SortingIcon = () => {\r\n return (\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <mask\r\n id=\"mask0_811_12710\"\r\n style={{ maskType: \"alpha\" }}\r\n maskUnits=\"userSpaceOnUse\"\r\n x=\"0\"\r\n y=\"0\"\r\n width=\"20\"\r\n height=\"20\"\r\n >\r\n <rect width=\"20\" height=\"20\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_811_12710)\">\r\n <path\r\n d=\"M7.63605 10.5369C7.45883 10.5369 7.31036 10.477 7.19064 10.3571C7.07105 10.2374 7.01126 10.089 7.01126 9.9119V4.4696L5.08022 6.40065C4.96744 6.51606 4.82654 6.57377 4.65751 6.57377C4.48848 6.57377 4.33932 6.51398 4.21001 6.3944C4.0807 6.26398 4.01605 6.11488 4.01605 5.94711C4.01605 5.77947 4.0807 5.63099 4.21001 5.50169L7.10105 2.61065C7.17897 2.53259 7.26154 2.47759 7.34876 2.44565C7.43612 2.41356 7.52966 2.39752 7.62939 2.39752C7.72911 2.39752 7.82383 2.41363 7.91355 2.44586C8.00327 2.47822 8.08661 2.53315 8.16355 2.61065L11.0754 5.52252C11.1993 5.64641 11.2604 5.79009 11.2588 5.95356C11.2572 6.11704 11.1918 6.26398 11.0625 6.3944C10.9332 6.51398 10.7868 6.57592 10.6233 6.58023C10.4599 6.5844 10.3136 6.5219 10.1844 6.39273L8.26126 4.4696V9.91981C8.26126 10.0947 8.20133 10.2412 8.08147 10.3594C7.96161 10.4777 7.81314 10.5369 7.63605 10.5369ZM12.3706 17.5946C12.2709 17.5946 12.1762 17.5784 12.0865 17.5461C11.9967 17.5138 11.9134 17.459 11.8365 17.3815L8.92459 14.4696C8.8007 14.3456 8.73959 14.2019 8.74126 14.0386C8.74279 13.8751 8.8082 13.7281 8.93751 13.5977C9.06682 13.4781 9.2132 13.4162 9.37668 13.4119C9.54015 13.4076 9.68647 13.4701 9.81564 13.5994L11.7388 15.5225V10.0721C11.7388 9.89738 11.7987 9.75085 11.9186 9.63252C12.0384 9.51433 12.1869 9.45523 12.364 9.45523C12.5412 9.45523 12.6897 9.51509 12.8094 9.63481C12.929 9.75467 12.9888 9.90315 12.9888 10.0802V15.5225L14.9198 13.5913C15.0326 13.476 15.1735 13.4184 15.3425 13.4184C15.5115 13.4184 15.6607 13.4781 15.79 13.5977C15.9193 13.7281 15.984 13.8772 15.984 14.0448C15.984 14.2126 15.9193 14.3611 15.79 14.4904L12.899 17.3815C12.8211 17.4594 12.7385 17.5144 12.6513 17.5465C12.5639 17.5786 12.4704 17.5946 12.3706 17.5946Z\"\r\n fill=\"#1C1B1F\"\r\n />\r\n </g>\r\n </svg>\r\n );\r\n};\r\n\r\nexport const FilterationIcon = ({ color = \"#1C1B1F\", ...props }) => {\r\n return (\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <mask\r\n id=\"mask0_811_12698\"\r\n style={{ maskType: \"alpha\" }}\r\n maskUnits=\"userSpaceOnUse\"\r\n x=\"0\"\r\n y=\"0\"\r\n width=\"20\"\r\n height=\"20\"\r\n >\r\n <rect width=\"20\" height=\"20\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_811_12698)\">\r\n <path\r\n d=\"M8.33333 15V13.3333H11.6667V15H8.33333ZM5 10.8333V9.16667H15V10.8333H5ZM2.5 6.66667V5H17.5V6.66667H2.5Z\"\r\n fill={color}\r\n {...props}\r\n />\r\n </g>\r\n </svg>\r\n );\r\n};\r\n\r\nexport const HideIcon = () => {\r\n return (\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <mask\r\n id=\"mask0_957_24305\"\r\n style={{ maskType: \"alpha\" }}\r\n maskUnits=\"userSpaceOnUse\"\r\n x=\"0\"\r\n y=\"0\"\r\n width=\"16\"\r\n height=\"16\"\r\n >\r\n <rect width=\"16\" height=\"16\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_957_24305)\">\r\n <path\r\n d=\"M9.91805 5.74863C10.1889 6.01963 10.3983 6.34891 10.5462 6.73647C10.6941 7.12413 10.75 7.51325 10.714 7.9038C10.714 8.03202 10.6679 8.14058 10.5757 8.22947C10.4834 8.31836 10.3731 8.3628 10.2449 8.3628C10.1167 8.3628 10.0081 8.31836 9.91922 8.22947C9.83033 8.14058 9.78588 8.03202 9.78588 7.9038C9.82866 7.61069 9.80455 7.33291 9.71355 7.07047C9.62255 6.80813 9.4826 6.58252 9.29372 6.39363C9.10483 6.20475 8.87705 6.06136 8.61038 5.96347C8.34372 5.86558 8.06249 5.84013 7.76672 5.88713C7.63849 5.89147 7.52783 5.84852 7.43472 5.7583C7.34149 5.66819 7.29277 5.55902 7.28855 5.4308C7.28422 5.30258 7.32544 5.19186 7.41222 5.09863C7.49899 5.00552 7.60649 4.95686 7.73472 4.95263C8.12272 4.90819 8.51266 4.9588 8.90455 5.10447C9.29644 5.25025 9.63427 5.46497 9.91805 5.74863ZM8.00005 3.99997C7.76327 3.99997 7.53099 4.01152 7.30322 4.03463C7.07544 4.05763 6.84872 4.09563 6.62305 4.14863C6.48116 4.17774 6.35338 4.15747 6.23972 4.0878C6.12605 4.01813 6.04788 3.91791 6.00522 3.78713C5.96244 3.65213 5.97655 3.52375 6.04755 3.40197C6.11844 3.28019 6.22138 3.20474 6.35638 3.17563C6.62483 3.11152 6.89599 3.06625 7.16988 3.0398C7.44388 3.01325 7.7206 2.99997 8.00005 2.99997C9.43249 2.99997 10.7483 3.37219 11.9475 4.11663C13.1467 4.86108 14.0688 5.86836 14.714 7.13847C14.7585 7.22302 14.7908 7.30825 14.8109 7.39413C14.831 7.48002 14.841 7.57086 14.841 7.66663C14.841 7.76241 14.8327 7.85325 14.816 7.93913C14.7994 8.02502 14.7688 8.11024 14.7244 8.1948C14.5202 8.62213 14.2719 9.02063 13.9796 9.3903C13.6872 9.75997 13.3654 10.0995 13.0141 10.409C12.9107 10.5013 12.7926 10.5395 12.6597 10.5236C12.5267 10.5079 12.4175 10.4414 12.332 10.3243C12.2466 10.2072 12.2112 10.0816 12.2257 9.94747C12.2403 9.81325 12.2992 9.69997 12.4026 9.60763C12.7034 9.33497 12.9778 9.03691 13.2257 8.71347C13.4736 8.38991 13.6873 8.04097 13.8667 7.66663C13.3112 6.54441 12.5084 5.65275 11.4584 4.99163C10.4084 4.33052 9.2556 3.99997 8.00005 3.99997ZM8.00005 12.3333C6.5966 12.3333 5.31027 11.9583 4.14105 11.2083C2.97183 10.4583 2.04238 9.47047 1.35272 8.2448C1.29716 8.16025 1.25655 8.06836 1.23088 7.96913C1.20522 7.87002 1.19238 7.76919 1.19238 7.66663C1.19238 7.56408 1.20349 7.46491 1.22572 7.36913C1.24794 7.27347 1.28683 7.17991 1.34238 7.08847C1.59027 6.63547 1.87105 6.20402 2.18472 5.79413C2.49838 5.38436 2.85905 5.01708 3.26672 4.6923L1.76155 3.1768C1.66933 3.07769 1.62383 2.95997 1.62505 2.82363C1.62638 2.6873 1.67533 2.57086 1.77188 2.4743C1.86844 2.37775 1.98555 2.32947 2.12322 2.32947C2.26077 2.32947 2.37783 2.37775 2.47438 2.4743L13.5257 13.5256C13.618 13.618 13.667 13.7322 13.6725 13.8685C13.6781 14.0048 13.6292 14.1247 13.5257 14.2281C13.4292 14.3247 13.312 14.373 13.1744 14.373C13.0368 14.373 12.9198 14.3247 12.8232 14.2281L10.477 11.9025C10.0838 12.0546 9.67972 12.1644 9.26472 12.232C8.84983 12.2995 8.42827 12.3333 8.00005 12.3333ZM3.96938 5.3948C3.57872 5.69658 3.22761 6.0378 2.91605 6.41847C2.60449 6.79924 2.3436 7.2153 2.13338 7.66663C2.68894 8.78886 3.49172 9.68052 4.54172 10.3416C5.59172 11.0027 6.74449 11.3333 8.00005 11.3333C8.28638 11.3333 8.56822 11.3141 8.84555 11.2756C9.12288 11.2372 9.39833 11.1778 9.67188 11.0975L8.82822 10.2333C8.69322 10.2923 8.55838 10.3322 8.42372 10.3531C8.28916 10.3741 8.14794 10.3846 8.00005 10.3846C7.2436 10.3846 6.60149 10.1207 6.07372 9.59297C5.54594 9.06519 5.28205 8.42308 5.28205 7.66663C5.28205 7.51874 5.2936 7.37752 5.31672 7.24297C5.33983 7.1083 5.37872 6.97347 5.43338 6.83847L3.96938 5.3948Z\"\r\n fill=\"#1C1B1F\"\r\n />\r\n </g>\r\n </svg>\r\n );\r\n};\r\n\r\nexport const PinIcon = () => {\r\n return (\r\n <svg\r\n width=\"8\"\r\n height=\"13\"\r\n viewBox=\"0 0 8 13\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M6.33337 1.33337V6.14104L7.37686 7.18471C7.42642 7.23426 7.46364 7.29004 7.48853 7.35204C7.51331 7.41393 7.5257 7.47793 7.5257 7.54404V7.82904C7.5257 7.96949 7.47714 8.08865 7.38003 8.18654C7.28303 8.28443 7.16275 8.33337 7.0192 8.33337H4.50003V11.9257C4.50003 12.0674 4.45209 12.1861 4.3562 12.2819C4.26031 12.3777 4.14153 12.4255 3.99987 12.4255C3.85809 12.4255 3.73937 12.3777 3.6437 12.2819C3.54792 12.1861 3.50003 12.0674 3.50003 11.9257V8.33337H0.980865C0.83731 8.33337 0.717032 8.28443 0.620032 8.18654C0.522921 8.08865 0.474365 7.96949 0.474365 7.82904V7.54404C0.474365 7.47793 0.486754 7.41393 0.511532 7.35204C0.536421 7.29004 0.573643 7.23426 0.623199 7.18471L1.6667 6.14104V1.33337H1.50003C1.35837 1.33337 1.23964 1.28543 1.14387 1.18954C1.04798 1.09365 1.00003 0.974874 1.00003 0.833207C1.00003 0.691429 1.04798 0.572707 1.14387 0.477041C1.23964 0.381263 1.35837 0.333374 1.50003 0.333374H6.50003C6.6417 0.333374 6.76042 0.381319 6.8562 0.477207C6.95209 0.573096 7.00003 0.691874 7.00003 0.833541C7.00003 0.975319 6.95209 1.09404 6.8562 1.18971C6.76042 1.28549 6.6417 1.33337 6.50003 1.33337H6.33337ZM1.90003 7.33337H6.10003L5.33336 6.56671V1.33337H2.6667V6.56671L1.90003 7.33337Z\"\r\n fill=\"#1C1B1F\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const VisibilityIcon = () => {\r\n return (\r\n <svg\r\n width=\"14\"\r\n height=\"10\"\r\n viewBox=\"0 0 14 10\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M7.00147 7.38467C7.75692 7.38467 8.39853 7.12028 8.92631 6.5915C9.45408 6.06272 9.71797 5.42061 9.71797 4.66517C9.71797 3.90972 9.45358 3.26811 8.9248 2.74033C8.39603 2.21256 7.75392 1.94867 6.99847 1.94867C6.24303 1.94867 5.60142 2.21306 5.07364 2.74183C4.54586 3.27061 4.28197 3.91272 4.28197 4.66817C4.28197 5.42361 4.54636 6.06522 5.07514 6.593C5.60392 7.12078 6.24603 7.38467 7.00147 7.38467ZM6.99997 6.46667C6.49997 6.46667 6.07497 6.29167 5.72497 5.94167C5.37497 5.59167 5.19997 5.16667 5.19997 4.66667C5.19997 4.16667 5.37497 3.74167 5.72497 3.39167C6.07497 3.04167 6.49997 2.86667 6.99997 2.86667C7.49997 2.86667 7.92497 3.04167 8.27497 3.39167C8.62497 3.74167 8.79997 4.16667 8.79997 4.66667C8.79997 5.16667 8.62497 5.59167 8.27497 5.94167C7.92497 6.29167 7.49997 6.46667 6.99997 6.46667ZM6.99997 9.33333C5.59653 9.33333 4.31297 8.95894 3.1493 8.21017C1.98564 7.4615 1.0568 6.4765 0.362803 5.25517C0.307248 5.15939 0.266637 5.06289 0.24097 4.96567C0.215414 4.86844 0.202637 4.76867 0.202637 4.66633C0.202637 4.564 0.215414 4.46433 0.24097 4.36733C0.266637 4.27033 0.307248 4.17394 0.362803 4.07817C1.0568 2.85683 1.98564 1.87183 3.1493 1.12317C4.31297 0.374389 5.59653 0 6.99997 0C8.40342 0 9.68697 0.374389 10.8506 1.12317C12.0143 1.87183 12.9431 2.85683 13.6371 4.07817C13.6927 4.17394 13.7333 4.27044 13.759 4.36767C13.7845 4.46489 13.7973 4.56467 13.7973 4.667C13.7973 4.76933 13.7845 4.869 13.759 4.966C13.7333 5.063 13.6927 5.15939 13.6371 5.25517C12.9431 6.4765 12.0143 7.4615 10.8506 8.21017C9.68697 8.95894 8.40342 9.33333 6.99997 9.33333ZM6.99997 8.33333C8.25553 8.33333 9.4083 8.00278 10.4583 7.34167C11.5083 6.68055 12.3111 5.78889 12.8666 4.66667C12.3111 3.54444 11.5083 2.65278 10.4583 1.99167C9.4083 1.33056 8.25553 1 6.99997 1C5.74442 1 4.59164 1.33056 3.54164 1.99167C2.49164 2.65278 1.68886 3.54444 1.1333 4.66667C1.68886 5.78889 2.49164 6.68055 3.54164 7.34167C4.59164 8.00278 5.74442 8.33333 6.99997 8.33333Z\"\r\n fill=\"#505050\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const VisibilityOffIcon = () => {\r\n return (\r\n <svg\r\n width=\"14\"\r\n height=\"13\"\r\n viewBox=\"0 0 14 13\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M8.91793 3.74863C9.18882 4.01963 9.39821 4.34891 9.54609 4.73647C9.69398 5.12413 9.74993 5.51325 9.71393 5.9038C9.71393 6.03202 9.66782 6.14058 9.57559 6.22947C9.48326 6.31836 9.37298 6.3628 9.24476 6.3628C9.11654 6.3628 9.00798 6.31836 8.9191 6.22947C8.83021 6.14058 8.78576 6.03202 8.78576 5.9038C8.82854 5.61069 8.80443 5.33291 8.71343 5.07047C8.62243 4.80813 8.48248 4.58252 8.29359 4.39363C8.1047 4.20475 7.87693 4.06136 7.61026 3.96347C7.34359 3.86558 7.06237 3.84013 6.76659 3.88713C6.63837 3.89147 6.52771 3.84852 6.43459 3.7583C6.34137 3.66819 6.29265 3.55902 6.28843 3.4308C6.28409 3.30258 6.32532 3.19186 6.41209 3.09863C6.49887 3.00552 6.60637 2.95686 6.73459 2.95263C7.12259 2.90819 7.51254 2.9588 7.90443 3.10447C8.29632 3.25025 8.63415 3.46497 8.91793 3.74863ZM6.99993 1.99997C6.76315 1.99997 6.53087 2.01152 6.30309 2.03463C6.07532 2.05763 5.84859 2.09563 5.62293 2.14863C5.48104 2.17774 5.35326 2.15747 5.23959 2.0878C5.12593 2.01813 5.04776 1.91791 5.00509 1.78713C4.96232 1.65213 4.97643 1.52375 5.04743 1.40197C5.11832 1.28019 5.22126 1.20474 5.35626 1.17563C5.62471 1.11152 5.89587 1.06625 6.16976 1.0398C6.44376 1.01325 6.72048 0.999967 6.99993 0.999967C8.43237 0.999967 9.74821 1.37219 10.9474 2.11663C12.1465 2.86108 13.0687 3.86836 13.7139 5.13847C13.7584 5.22302 13.7907 5.30825 13.8108 5.39413C13.8309 5.48002 13.8409 5.57086 13.8409 5.66663C13.8409 5.76241 13.8326 5.85325 13.8159 5.93913C13.7993 6.02502 13.7687 6.11024 13.7243 6.1948C13.52 6.62213 13.2718 7.02063 12.9794 7.3903C12.6871 7.75997 12.3653 8.09952 12.0139 8.40897C11.9106 8.5013 11.7925 8.53952 11.6596 8.52363C11.5266 8.50786 11.4174 8.44141 11.3319 8.3243C11.2465 8.20719 11.211 8.08158 11.2256 7.94747C11.2402 7.81325 11.2991 7.69997 11.4024 7.60763C11.7033 7.33497 11.9777 7.03691 12.2256 6.71347C12.4735 6.38991 12.6872 6.04097 12.8666 5.66663C12.311 4.54441 11.5083 3.65275 10.4583 2.99163C9.40826 2.33052 8.25548 1.99997 6.99993 1.99997ZM6.99993 10.3333C5.59648 10.3333 4.31015 9.9583 3.14093 9.2083C1.97171 8.4583 1.04226 7.47047 0.352594 6.2448C0.297039 6.16025 0.256427 6.06836 0.230761 5.96913C0.205094 5.87002 0.192261 5.76919 0.192261 5.66663C0.192261 5.56408 0.203372 5.46491 0.225594 5.36913C0.247816 5.27347 0.286705 5.17991 0.342261 5.08847C0.59015 4.63547 0.870927 4.20402 1.18459 3.79413C1.49826 3.38436 1.85893 3.01708 2.26659 2.6923L0.761427 1.1768C0.669205 1.07769 0.623705 0.959967 0.624927 0.823634C0.626261 0.6873 0.675205 0.570857 0.771761 0.474301C0.868316 0.377746 0.985427 0.329468 1.12309 0.329468C1.26065 0.329468 1.37771 0.377746 1.47426 0.474301L12.5256 11.5256C12.6179 11.618 12.6669 11.7322 12.6724 11.8685C12.678 12.0048 12.629 12.1247 12.5256 12.2281C12.429 12.3247 12.3119 12.373 12.1743 12.373C12.0367 12.373 11.9197 12.3247 11.8231 12.2281L9.47693 9.90247C9.08371 10.0546 8.67959 10.1644 8.2646 10.232C7.84971 10.2995 7.42815 10.3333 6.99993 10.3333ZM2.96926 3.3948C2.57859 3.69658 2.22748 4.0378 1.91593 4.41847C1.60437 4.79924 1.34348 5.2153 1.13326 5.66663C1.68882 6.78886 2.49159 7.68052 3.54159 8.34163C4.59159 9.00274 5.74437 9.3333 6.99993 9.3333C7.28626 9.3333 7.56809 9.31408 7.84543 9.27563C8.12276 9.23719 8.3982 9.1778 8.67176 9.09747L7.82809 8.2333C7.69309 8.2923 7.55826 8.33224 7.42359 8.35313C7.28904 8.37413 7.14782 8.38463 6.99993 8.38463C6.24348 8.38463 5.60137 8.12074 5.07359 7.59297C4.54582 7.06519 4.28193 6.42308 4.28193 5.66663C4.28193 5.51874 4.29348 5.37752 4.31659 5.24297C4.33971 5.1083 4.37859 4.97347 4.43326 4.83847L2.96926 3.3948Z\"\r\n fill=\"#C5C5C5\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const DragandDrogIcon = () => {\r\n return (\r\n <svg\r\n width=\"8\"\r\n height=\"12\"\r\n viewBox=\"0 0 8 12\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M2.00005 11.0768C1.70394 11.0768 1.45044 10.9714 1.23955 10.7605C1.02866 10.5496 0.923218 10.2961 0.923218 9.99999C0.923218 9.70388 1.02866 9.45038 1.23955 9.23949C1.45044 9.0286 1.70394 8.92316 2.00005 8.92316C2.29616 8.92316 2.54966 9.0286 2.76055 9.23949C2.97144 9.45038 3.07688 9.70388 3.07688 9.99999C3.07688 10.2961 2.97144 10.5496 2.76055 10.7605C2.54966 10.9714 2.29616 11.0768 2.00005 11.0768ZM6.00005 11.0768C5.70394 11.0768 5.45044 10.9714 5.23955 10.7605C5.02866 10.5496 4.92322 10.2961 4.92322 9.99999C4.92322 9.70388 5.02866 9.45038 5.23955 9.23949C5.45044 9.0286 5.70394 8.92316 6.00005 8.92316C6.29616 8.92316 6.54966 9.0286 6.76055 9.23949C6.97144 9.45038 7.07688 9.70388 7.07688 9.99999C7.07688 10.2961 6.97144 10.5496 6.76055 10.7605C6.54966 10.9714 6.29616 11.0768 6.00005 11.0768ZM2.00005 7.07682C1.70394 7.07682 1.45044 6.97138 1.23955 6.76049C1.02866 6.5496 0.923218 6.2961 0.923218 5.99999C0.923218 5.70388 1.02866 5.45038 1.23955 5.23949C1.45044 5.0286 1.70394 4.92316 2.00005 4.92316C2.29616 4.92316 2.54966 5.0286 2.76055 5.23949C2.97144 5.45038 3.07688 5.70388 3.07688 5.99999C3.07688 6.2961 2.97144 6.5496 2.76055 6.76049C2.54966 6.97138 2.29616 7.07682 2.00005 7.07682ZM6.00005 7.07682C5.70394 7.07682 5.45044 6.97138 5.23955 6.76049C5.02866 6.5496 4.92322 6.2961 4.92322 5.99999C4.92322 5.70388 5.02866 5.45038 5.23955 5.23949C5.45044 5.0286 5.70394 4.92316 6.00005 4.92316C6.29616 4.92316 6.54966 5.0286 6.76055 5.23949C6.97144 5.45038 7.07688 5.70388 7.07688 5.99999C7.07688 6.2961 6.97144 6.5496 6.76055 6.76049C6.54966 6.97138 6.29616 7.07682 6.00005 7.07682ZM2.00005 3.07682C1.70394 3.07682 1.45044 2.97138 1.23955 2.76049C1.02866 2.5496 0.923218 2.2961 0.923218 1.99999C0.923218 1.70388 1.02866 1.45038 1.23955 1.23949C1.45044 1.0286 1.70394 0.923157 2.00005 0.923157C2.29616 0.923157 2.54966 1.0286 2.76055 1.23949C2.97144 1.45038 3.07688 1.70388 3.07688 1.99999C3.07688 2.2961 2.97144 2.5496 2.76055 2.76049C2.54966 2.97138 2.29616 3.07682 2.00005 3.07682ZM6.00005 3.07682C5.70394 3.07682 5.45044 2.97138 5.23955 2.76049C5.02866 2.5496 4.92322 2.2961 4.92322 1.99999C4.92322 1.70388 5.02866 1.45038 5.23955 1.23949C5.45044 1.0286 5.70394 0.923157 6.00005 0.923157C6.29616 0.923157 6.54966 1.0286 6.76055 1.23949C6.97144 1.45038 7.07688 1.70388 7.07688 1.99999C7.07688 2.2961 6.97144 2.5496 6.76055 2.76049C6.54966 2.97138 6.29616 3.07682 6.00005 3.07682Z\"\r\n fill=\"#A6A6A6\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\n// export const SettingIcon = () => {\r\n// return (\r\n// <svg\r\n// width=\"18\"\r\n// height=\"17\"\r\n// viewBox=\"0 0 18 17\"\r\n// fill=\"none\"\r\n// xmlns=\"http://www.w3.org/2000/svg\"\r\n// >\r\n// <path\r\n// d=\"M15.1935 9.31669C15.2269 9.05002 15.2519 8.78335 15.2519 8.50002C15.2519 8.21669 15.2269 7.95002 15.1935 7.68335L16.9519 6.30835C17.1102 6.18335 17.1518 5.95835 17.0518 5.77502L15.3852 2.89169C15.3102 2.75835 15.1685 2.68335 15.0185 2.68335C14.9685 2.68335 14.9185 2.69169 14.8768 2.70835L12.8018 3.54169C12.3685 3.20835 11.9018 2.93335 11.3935 2.72502L11.0768 0.516687C11.0518 0.316687 10.8769 0.166687 10.6685 0.166687H7.33518C7.12685 0.166687 6.95185 0.316687 6.92685 0.516687L6.61018 2.72502C6.10185 2.93335 5.63518 3.21669 5.20185 3.54169L3.12685 2.70835C3.07685 2.69169 3.02685 2.68335 2.97685 2.68335C2.83518 2.68335 2.69352 2.75835 2.61852 2.89169L0.95185 5.77502C0.843516 5.95835 0.893517 6.18335 1.05185 6.30835L2.81018 7.68335C2.77685 7.95002 2.75185 8.22502 2.75185 8.50002C2.75185 8.77502 2.77685 9.05002 2.81018 9.31669L1.05185 10.6917C0.893517 10.8167 0.85185 11.0417 0.95185 11.225L2.61852 14.1084C2.69352 14.2417 2.83518 14.3167 2.98518 14.3167C3.03518 14.3167 3.08518 14.3084 3.12685 14.2917L5.20185 13.4584C5.63518 13.7917 6.10185 14.0667 6.61018 14.275L6.92685 16.4834C6.95185 16.6834 7.12685 16.8334 7.33518 16.8334H10.6685C10.8769 16.8334 11.0518 16.6834 11.0768 16.4834L11.3935 14.275C11.9018 14.0667 12.3685 13.7834 12.8018 13.4584L14.8768 14.2917C14.9268 14.3084 14.9768 14.3167 15.0268 14.3167C15.1685 14.3167 15.3102 14.2417 15.3852 14.1084L17.0518 11.225C17.1518 11.0417 17.1102 10.8167 16.9519 10.6917L15.1935 9.31669ZM13.5435 7.89169C13.5769 8.15002 13.5852 8.32502 13.5852 8.50002C13.5852 8.67502 13.5685 8.85835 13.5435 9.10835L13.4268 10.05L14.1685 10.6334L15.0685 11.3334L14.4852 12.3417L13.4268 11.9167L12.5602 11.5667L11.8102 12.1334C11.4518 12.4 11.1102 12.6 10.7685 12.7417L9.88518 13.1L9.75185 14.0417L9.58518 15.1667H8.41852L8.12685 13.1L7.24352 12.7417C6.88518 12.5917 6.55185 12.4 6.21852 12.15L5.46018 11.5667L4.57685 11.925L3.51852 12.35L2.93518 11.3417L3.83518 10.6417L4.57685 10.0584L4.46018 9.11669C4.43518 8.85835 4.41852 8.66669 4.41852 8.50002C4.41852 8.33335 4.43518 8.14169 4.46018 7.89169L4.57685 6.95002L3.83518 6.36669L2.93518 5.66669L3.51852 4.65835L4.57685 5.08335L5.44352 5.43335L6.19352 4.86669C6.55185 4.60002 6.89352 4.40002 7.23518 4.25835L8.11852 3.90002L8.25185 2.95835L8.41852 1.83335H9.57685L9.86852 3.90002L10.7519 4.25835C11.1102 4.40835 11.4435 4.60002 11.7768 4.85002L12.5352 5.43335L13.4185 5.07502L14.4768 4.65002L15.0602 5.65835L14.1685 6.36669L13.4268 6.95002L13.5435 7.89169ZM9.00185 5.16669C7.16018 5.16669 5.66852 6.65835 5.66852 8.50002C5.66852 10.3417 7.16018 11.8334 9.00185 11.8334C10.8435 11.8334 12.3352 10.3417 12.3352 8.50002C12.3352 6.65835 10.8435 5.16669 9.00185 5.16669ZM9.00185 10.1667C8.08518 10.1667 7.33518 9.41669 7.33518 8.50002C7.33518 7.58335 8.08518 6.83335 9.00185 6.83335C9.91852 6.83335 10.6685 7.58335 10.6685 8.50002C10.6685 9.41669 9.91852 10.1667 9.00185 10.1667Z\"\r\n// fill=\"#1E1E1E\"\r\n// />\r\n// </svg>\r\n// );\r\n// };\r\n\r\nexport const DropDownIcon = () => {\r\n return (\r\n <svg\r\n width=\"10\"\r\n height=\"7\"\r\n viewBox=\"0 0 10 7\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M8.825 0.412476L5 4.22914L1.175 0.412476L0 1.58748L5 6.58748L10 1.58748L8.825 0.412476Z\"\r\n fill=\"#1E1E1E\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const AddIcon = ({ ...props }) => {\r\n return (\r\n <svg\r\n width=\"10\"\r\n height=\"10\"\r\n viewBox=\"0 0 10 10\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n {...props}\r\n >\r\n <path\r\n d=\"M4.50002 5.50002H1.16669C1.02502 5.50002 0.906298 5.45208 0.81052 5.35619C0.714632 5.2603 0.666687 5.14152 0.666687 4.99985C0.666687 4.85808 0.714632 4.73935 0.81052 4.64369C0.906298 4.54791 1.02502 4.50002 1.16669 4.50002H4.50002V1.16669C4.50002 1.02502 4.54797 0.906298 4.64385 0.81052C4.73974 0.714632 4.85852 0.666687 5.00019 0.666687C5.14197 0.666687 5.26069 0.714632 5.35635 0.81052C5.45213 0.906298 5.50002 1.02502 5.50002 1.16669V4.50002H8.83335C8.97502 4.50002 9.09374 4.54797 9.18952 4.64385C9.28541 4.73974 9.33335 4.85852 9.33335 5.00019C9.33335 5.14197 9.28541 5.26069 9.18952 5.35635C9.09374 5.45213 8.97502 5.50002 8.83335 5.50002H5.50002V8.83335C5.50002 8.97502 5.45208 9.09374 5.35619 9.18952C5.2603 9.28541 5.14152 9.33335 4.99985 9.33335C4.85808 9.33335 4.73935 9.28541 4.64369 9.18952C4.54791 9.09374 4.50002 8.97502 4.50002 8.83335V5.50002Z\"\r\n fill=\"currentColor\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const ChevronDownIcon = () => {\r\n return (\r\n <svg\r\n width=\"12\"\r\n height=\"6\"\r\n viewBox=\"0 0 12 6\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M1 0.5L6 5.5L11 0.5\"\r\n stroke=\"#181D27\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n};\r\nexport const CheckBox = () => {\r\n return (\r\n <svg\r\n width=\"13\"\r\n height=\"14\"\r\n viewBox=\"0 0 13 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M5.72054 8.43116L4.17187 6.88233C4.07954 6.7901 3.96349 6.74288 3.82371 6.74066C3.68404 6.73855 3.56587 6.78577 3.46921 6.88233C3.37265 6.97899 3.32437 7.0961 3.32437 7.23366C3.32437 7.37121 3.37265 7.48833 3.46921 7.58499L5.29871 9.41449C5.41926 9.53494 5.55987 9.59516 5.72054 9.59516C5.88121 9.59516 6.02182 9.53494 6.14237 9.41449L9.85137 5.70549C9.9436 5.61316 9.99082 5.4971 9.99304 5.35733C9.99515 5.21766 9.94793 5.09949 9.85137 5.00283C9.75471 4.90627 9.6376 4.85799 9.50004 4.85799C9.36249 4.85799 9.24537 4.90627 9.14871 5.00283L5.72054 8.43116ZM6.66787 13.3337C5.79187 13.3337 4.96848 13.1674 4.19771 12.835C3.42693 12.5025 2.75648 12.0514 2.18637 11.4815C1.61626 10.9116 1.16487 10.2414 0.832207 9.47099C0.499652 8.70055 0.333374 7.87738 0.333374 7.00149C0.333374 6.12549 0.499596 5.3021 0.832041 4.53133C1.16449 3.76055 1.61565 3.0901 2.18554 2.51999C2.75543 1.94988 3.4256 1.49849 4.19604 1.16583C4.96649 0.83327 5.78965 0.666992 6.66554 0.666992C7.54154 0.666992 8.36493 0.833214 9.13571 1.16566C9.90649 1.4981 10.5769 1.94927 11.147 2.51916C11.7172 3.08905 12.1685 3.75921 12.5012 4.52966C12.8338 5.3001 13 6.12327 13 6.99916C13 7.87516 12.8338 8.69855 12.5014 9.46933C12.1689 10.2401 11.7178 10.9105 11.1479 11.4807C10.578 12.0508 9.90782 12.5022 9.13737 12.8348C8.36693 13.1674 7.54376 13.3337 6.66787 13.3337Z\"\r\n fill=\"#16B364\"\r\n />\r\n </svg>\r\n );\r\n};\r\nexport const CrossBox = () => {\r\n return (\r\n <svg\r\n width=\"13\"\r\n height=\"14\"\r\n viewBox=\"0 0 13 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M6.66659 7.70283L8.71525 9.75166C8.80759 9.84388 8.92364 9.8911 9.06342 9.89333C9.20309 9.89544 9.32125 9.84821 9.41792 9.75166C9.51447 9.65499 9.56275 9.53788 9.56275 9.40033C9.56275 9.26277 9.51447 9.14566 9.41792 9.04899L7.36909 7.00033L9.41792 4.95166C9.51014 4.85933 9.55736 4.74327 9.55959 4.60349C9.5617 4.46383 9.51447 4.34566 9.41792 4.24899C9.32125 4.15244 9.20414 4.10416 9.06659 4.10416C8.92903 4.10416 8.81192 4.15244 8.71525 4.24899L6.66659 6.29783L4.61792 4.24899C4.52559 4.15677 4.40953 4.10955 4.26975 4.10733C4.13009 4.10521 4.01192 4.15244 3.91525 4.24899C3.8187 4.34566 3.77042 4.46277 3.77042 4.60033C3.77042 4.73788 3.8187 4.85499 3.91525 4.95166L5.96409 7.00033L3.91525 9.04899C3.82303 9.14133 3.77581 9.25738 3.77359 9.39716C3.77147 9.53683 3.8187 9.65499 3.91525 9.75166C4.01192 9.84821 4.12903 9.89649 4.26659 9.89649C4.40414 9.89649 4.52125 9.84821 4.61792 9.75166L6.66659 7.70283ZM6.66775 13.3337C5.79175 13.3337 4.96836 13.1674 4.19759 12.835C3.42681 12.5025 2.75636 12.0514 2.18625 11.4815C1.61614 10.9116 1.16475 10.2414 0.832085 9.47099C0.49953 8.70055 0.333252 7.87738 0.333252 7.00149C0.333252 6.12549 0.499474 5.3021 0.831919 4.53133C1.16436 3.76055 1.61553 3.0901 2.18542 2.51999C2.75531 1.94988 3.42547 1.49849 4.19592 1.16583C4.96636 0.83327 5.78953 0.666992 6.66542 0.666992C7.54142 0.666992 8.36481 0.833214 9.13559 1.16566C9.90636 1.4981 10.5768 1.94927 11.1469 2.51916C11.717 3.08905 12.1684 3.75921 12.5011 4.52966C12.8336 5.3001 12.9999 6.12327 12.9999 6.99916C12.9999 7.87516 12.8337 8.69855 12.5013 9.46933C12.1688 10.2401 11.7176 10.9105 11.1478 11.4807C10.5779 12.0508 9.9077 12.5022 9.13725 12.8348C8.36681 13.1674 7.54364 13.3337 6.66775 13.3337Z\"\r\n fill=\"#F63D68\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const EyeIcon = () => {\r\n return (\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <mask\r\n id=\"mask0_6673_82208\"\r\n style={{ maskType: \"alpha\" }}\r\n maskUnits=\"userSpaceOnUse\"\r\n x=\"0\"\r\n y=\"0\"\r\n width=\"16\"\r\n height=\"16\"\r\n >\r\n <rect width=\"16\" height=\"16\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_6673_82208)\">\r\n <path\r\n d=\"M8.00147 10.3847C8.75692 10.3847 9.39853 10.1203 9.92631 9.5915C10.4541 9.06272 10.718 8.42061 10.718 7.66517C10.718 6.90972 10.4536 6.26811 9.9248 5.74033C9.39603 5.21256 8.75392 4.94867 7.99847 4.94867C7.24303 4.94867 6.60142 5.21306 6.07364 5.74183C5.54586 6.27061 5.28197 6.91272 5.28197 7.66817C5.28197 8.42361 5.54636 9.06522 6.07514 9.593C6.60392 10.1208 7.24603 10.3847 8.00147 10.3847ZM7.99997 9.46667C7.49997 9.46667 7.07497 9.29167 6.72497 8.94167C6.37497 8.59167 6.19997 8.16667 6.19997 7.66667C6.19997 7.16667 6.37497 6.74167 6.72497 6.39167C7.07497 6.04167 7.49997 5.86667 7.99997 5.86667C8.49997 5.86667 8.92497 6.04167 9.27497 6.39167C9.62497 6.74167 9.79997 7.16667 9.79997 7.66667C9.79997 8.16667 9.62497 8.59167 9.27497 8.94167C8.92497 9.29167 8.49997 9.46667 7.99997 9.46667ZM7.99997 12.3333C6.59653 12.3333 5.31297 11.9589 4.1493 11.2102C2.98564 10.4615 2.0568 9.4765 1.3628 8.25517C1.30725 8.15939 1.26664 8.06289 1.24097 7.96567C1.21541 7.86844 1.20264 7.76867 1.20264 7.66633C1.20264 7.564 1.21541 7.46433 1.24097 7.36733C1.26664 7.27033 1.30725 7.17394 1.3628 7.07817C2.0568 5.85683 2.98564 4.87183 4.1493 4.12317C5.31297 3.37439 6.59653 3 7.99997 3C9.40342 3 10.687 3.37439 11.8506 4.12317C13.0143 4.87183 13.9431 5.85683 14.6371 7.07817C14.6927 7.17394 14.7333 7.27044 14.759 7.36767C14.7845 7.46489 14.7973 7.56467 14.7973 7.667C14.7973 7.76933 14.7845 7.869 14.759 7.966C14.7333 8.063 14.6927 8.15939 14.6371 8.25517C13.9431 9.4765 13.0143 10.4615 11.8506 11.2102C10.687 11.9589 9.40342 12.3333 7.99997 12.3333ZM7.99997 11.3333C9.25553 11.3333 10.4083 11.0028 11.4583 10.3417C12.5083 9.68055 13.3111 8.78889 13.8666 7.66667C13.3111 6.54444 12.5083 5.65278 11.4583 4.99167C10.4083 4.33056 9.25553 4 7.99997 4C6.74442 4 5.59164 4.33056 4.54164 4.99167C3.49164 5.65278 2.68886 6.54444 2.1333 7.66667C2.68886 8.78889 3.49164 9.68055 4.54164 10.3417C5.59164 11.0028 6.74442 11.3333 7.99997 11.3333Z\"\r\n fill=\"#505050\"\r\n />\r\n </g>\r\n </svg>\r\n );\r\n};\r\n\r\nexport const ClosedEyeIcon = () => {\r\n return (\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <mask\r\n id=\"mask0_6673_82183\"\r\n style={{ maskType: \"alpha\" }}\r\n maskUnits=\"userSpaceOnUse\"\r\n x=\"0\"\r\n y=\"0\"\r\n width=\"16\"\r\n height=\"16\"\r\n >\r\n <rect width=\"16\" height=\"16\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_6673_82183)\">\r\n <path\r\n d=\"M9.91793 5.74876C10.1888 6.01976 10.3982 6.34903 10.5461 6.73659C10.694 7.12426 10.7499 7.51337 10.7139 7.90392C10.7139 8.03215 10.6678 8.1407 10.5756 8.22959C10.4833 8.31848 10.373 8.36292 10.2448 8.36292C10.1165 8.36292 10.008 8.31848 9.9191 8.22959C9.83021 8.1407 9.78576 8.03215 9.78576 7.90392C9.82854 7.61081 9.80443 7.33303 9.71343 7.07059C9.62243 6.80826 9.48248 6.58264 9.29359 6.39376C9.1047 6.20487 8.87693 6.06148 8.61026 5.96359C8.34359 5.8657 8.06237 5.84026 7.76659 5.88726C7.63837 5.89159 7.52771 5.84864 7.43459 5.75842C7.34137 5.66831 7.29265 5.55914 7.28843 5.43092C7.28409 5.3027 7.32532 5.19198 7.41209 5.09876C7.49887 5.00564 7.60637 4.95698 7.73459 4.95276C8.12259 4.90831 8.51254 4.95892 8.90443 5.10459C9.29632 5.25037 9.63415 5.46509 9.91793 5.74876ZM7.99993 4.00009C7.76315 4.00009 7.53087 4.01165 7.30309 4.03476C7.07532 4.05776 6.84859 4.09576 6.62293 4.14876C6.48104 4.17787 6.35326 4.15759 6.23959 4.08792C6.12593 4.01826 6.04776 3.91803 6.00509 3.78726C5.96232 3.65226 5.97643 3.52387 6.04743 3.40209C6.11832 3.28031 6.22126 3.20487 6.35626 3.17576C6.62471 3.11164 6.89587 3.06637 7.16976 3.03992C7.44376 3.01337 7.72048 3.00009 7.99993 3.00009C9.43237 3.00009 10.7482 3.37231 11.9474 4.11676C13.1465 4.8612 14.0687 5.86848 14.7139 7.13859C14.7584 7.22315 14.7907 7.30837 14.8108 7.39426C14.8309 7.48014 14.8409 7.57098 14.8409 7.66676C14.8409 7.76253 14.8326 7.85337 14.8159 7.93926C14.7993 8.02515 14.7687 8.11037 14.7243 8.19492C14.52 8.62226 14.2718 9.02076 13.9794 9.39042C13.6871 9.76009 13.3653 10.0996 13.0139 10.4091C12.9106 10.5014 12.7925 10.5396 12.6596 10.5238C12.5266 10.508 12.4174 10.4415 12.3319 10.3244C12.2465 10.2073 12.211 10.0817 12.2256 9.94759C12.2402 9.81337 12.2991 9.70009 12.4024 9.60776C12.7033 9.33509 12.9777 9.03703 13.2256 8.71359C13.4735 8.39003 13.6872 8.04109 13.8666 7.66676C13.311 6.54453 12.5083 5.65287 11.4583 4.99176C10.4083 4.33065 9.25548 4.00009 7.99993 4.00009ZM7.99993 12.3334C6.59648 12.3334 5.31015 11.9584 4.14093 11.2084C2.97171 10.4584 2.04226 9.47059 1.35259 8.24492C1.29704 8.16037 1.25643 8.06848 1.23076 7.96926C1.20509 7.87014 1.19226 7.76931 1.19226 7.66676C1.19226 7.5642 1.20337 7.46503 1.22559 7.36926C1.24782 7.27359 1.28671 7.18003 1.34226 7.08859C1.59015 6.63559 1.87093 6.20415 2.18459 5.79426C2.49826 5.38448 2.85893 5.0172 3.26659 4.69242L1.76143 3.17692C1.66921 3.07781 1.62371 2.96009 1.62493 2.82376C1.62626 2.68742 1.67521 2.57098 1.77176 2.47442C1.86832 2.37787 1.98543 2.32959 2.12309 2.32959C2.26065 2.32959 2.37771 2.37787 2.47426 2.47442L13.5256 13.5258C13.6179 13.6181 13.6669 13.7324 13.6724 13.8686C13.678 14.0049 13.629 14.1248 13.5256 14.2283C13.429 14.3248 13.3119 14.3731 13.1743 14.3731C13.0367 14.3731 12.9197 14.3248 12.8231 14.2283L10.4769 11.9026C10.0837 12.0547 9.67959 12.1645 9.2646 12.2321C8.84971 12.2996 8.42815 12.3334 7.99993 12.3334ZM3.96926 5.39492C3.57859 5.6967 3.22748 6.03792 2.91593 6.41859C2.60437 6.79937 2.34348 7.21542 2.13326 7.66676C2.68882 8.78898 3.49159 9.68064 4.54159 10.3418C5.59159 11.0029 6.74437 11.3334 7.99993 11.3334C8.28626 11.3334 8.56809 11.3142 8.84543 11.2758C9.12276 11.2373 9.3982 11.1779 9.67176 11.0976L8.82809 10.2334C8.69309 10.2924 8.55826 10.3324 8.42359 10.3533C8.28904 10.3743 8.14782 10.3848 7.99993 10.3848C7.24348 10.3848 6.60137 10.1209 6.07359 9.59309C5.54582 9.06531 5.28193 8.4232 5.28193 7.66676C5.28193 7.51887 5.29348 7.37765 5.31659 7.24309C5.33971 7.10842 5.37859 6.97359 5.43326 6.83859L3.96926 5.39492Z\"\r\n fill=\"#C5C5C5\"\r\n />\r\n </g>\r\n </svg>\r\n );\r\n};\r\n\r\nexport const SettingIcon: React.FC = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\"\r\n height=\"21\"\r\n viewBox=\"0 0 20 21\"\r\n fill=\"none\"\r\n >\r\n <path\r\n d=\"M11.3748 18.8346H8.62484C8.47206 18.8346 8.33664 18.786 8.21859 18.6888C8.10053 18.5916 8.02762 18.4666 7.99984 18.3138L7.6665 16.2096C7.40262 16.1124 7.12484 15.9805 6.83317 15.8138C6.5415 15.6471 6.28456 15.4735 6.06234 15.293L4.12484 16.1888C3.97206 16.2582 3.81928 16.2687 3.6665 16.2201C3.51373 16.1714 3.39567 16.0707 3.31234 15.918L1.93734 13.4805C1.854 13.3416 1.83317 13.1957 1.87484 13.043C1.9165 12.8902 1.99984 12.7652 2.12484 12.668L3.9165 11.3555C3.88873 11.2305 3.87137 11.0881 3.86442 10.9284C3.85748 10.7687 3.854 10.6263 3.854 10.5013C3.854 10.3763 3.85748 10.2339 3.86442 10.0742C3.87137 9.9145 3.88873 9.77214 3.9165 9.64714L2.12484 8.33464C1.99984 8.23741 1.9165 8.11241 1.87484 7.95964C1.83317 7.80686 1.854 7.66102 1.93734 7.52214L3.31234 5.08464C3.39567 4.93186 3.51373 4.83116 3.6665 4.78255C3.81928 4.73394 3.97206 4.74436 4.12484 4.8138L6.06234 5.70964C6.28456 5.52908 6.5415 5.35547 6.83317 5.1888C7.12484 5.02214 7.40262 4.89714 7.6665 4.8138L7.99984 2.6888C8.02762 2.53602 8.10053 2.41102 8.21859 2.3138C8.33664 2.21658 8.47206 2.16797 8.62484 2.16797H11.3748C11.5276 2.16797 11.663 2.21658 11.7811 2.3138C11.8991 2.41102 11.9721 2.53602 11.9998 2.6888L12.3332 4.79297C12.5971 4.89019 12.8783 5.01866 13.1769 5.17839C13.4755 5.33811 13.729 5.51519 13.9373 5.70964L15.8748 4.8138C16.0276 4.74436 16.1804 4.73394 16.3332 4.78255C16.4859 4.83116 16.604 4.93186 16.6873 5.08464L18.0623 7.5013C18.1457 7.64019 18.17 7.7895 18.1353 7.94922C18.1005 8.10894 18.0137 8.23741 17.8748 8.33464L16.0832 9.60547C16.1109 9.74436 16.1283 9.89366 16.1353 10.0534C16.1422 10.2131 16.1457 10.3624 16.1457 10.5013C16.1457 10.6402 16.1422 10.786 16.1353 10.9388C16.1283 11.0916 16.1109 11.2374 16.0832 11.3763L17.8748 12.668C17.9998 12.7652 18.0832 12.8902 18.1248 13.043C18.1665 13.1957 18.1457 13.3416 18.0623 13.4805L16.6873 15.918C16.604 16.0707 16.4859 16.1714 16.3332 16.2201C16.1804 16.2687 16.0276 16.2582 15.8748 16.1888L13.9373 15.293C13.7151 15.4735 13.4616 15.6506 13.1769 15.8242C12.8922 15.9978 12.6109 16.1263 12.3332 16.2096L11.9998 18.3138C11.9721 18.4666 11.8991 18.5916 11.7811 18.6888C11.663 18.786 11.5276 18.8346 11.3748 18.8346ZM9.99984 13.2096C10.7498 13.2096 11.3887 12.9457 11.9165 12.418C12.4443 11.8902 12.7082 11.2513 12.7082 10.5013C12.7082 9.7513 12.4443 9.11241 11.9165 8.58464C11.3887 8.05686 10.7498 7.79297 9.99984 7.79297C9.24984 7.79297 8.61095 8.05686 8.08317 8.58464C7.55539 9.11241 7.2915 9.7513 7.2915 10.5013C7.2915 11.2513 7.55539 11.8902 8.08317 12.418C8.61095 12.9457 9.24984 13.2096 9.99984 13.2096ZM9.99984 11.9596C9.59706 11.9596 9.25331 11.8173 8.96859 11.5326C8.68387 11.2478 8.5415 10.9041 8.5415 10.5013C8.5415 10.0985 8.68387 9.75477 8.96859 9.47005C9.25331 9.18533 9.59706 9.04297 9.99984 9.04297C10.4026 9.04297 10.7464 9.18533 11.0311 9.47005C11.3158 9.75477 11.4582 10.0985 11.4582 10.5013C11.4582 10.9041 11.3158 11.2478 11.0311 11.5326C10.7464 11.8173 10.4026 11.9596 9.99984 11.9596ZM9.08317 17.5846H10.9165L11.2082 15.2513C11.6665 15.1402 12.1005 14.9666 12.5103 14.7305C12.92 14.4944 13.2915 14.2096 13.6248 13.8763L15.8332 14.8346L16.6665 13.3346L14.7082 11.8971C14.7637 11.661 14.8089 11.4284 14.8436 11.1992C14.8783 10.9701 14.8957 10.7374 14.8957 10.5013C14.8957 10.2652 14.8818 10.0326 14.854 9.80339C14.8262 9.57422 14.7776 9.34158 14.7082 9.10547L16.6665 7.66797L15.8332 6.16797L13.6248 7.1263C13.3054 6.76519 12.9443 6.46311 12.5415 6.22005C12.1387 5.977 11.6943 5.82075 11.2082 5.7513L10.9165 3.41797H9.08317L8.7915 5.7513C8.31928 5.84852 7.87831 6.01519 7.46859 6.2513C7.05887 6.48741 6.69428 6.77908 6.37484 7.1263L4.1665 6.16797L3.33317 7.66797L5.2915 9.10547C5.23595 9.34158 5.19081 9.57422 5.15609 9.80339C5.12137 10.0326 5.104 10.2652 5.104 10.5013C5.104 10.7374 5.12137 10.9701 5.15609 11.1992C5.19081 11.4284 5.23595 11.661 5.2915 11.8971L3.33317 13.3346L4.1665 14.8346L6.37484 13.8763C6.70817 14.2096 7.0797 14.4944 7.48942 14.7305C7.89914 14.9666 8.33317 15.1402 8.7915 15.2513L9.08317 17.5846Z\"\r\n fill=\"#0E0C0B\"\r\n fill-opacity=\"0.7\"\r\n />\r\n </svg>\r\n);\r\n","import {\r\n BoardIcon,\r\n CalendarIcon,\r\n ChartsIcon,\r\n CloseIcon,\r\n GalleryIcon,\r\n ListIcon,\r\n TableIcon,\r\n TimeLineIcon,\r\n} from \"../../assets/svg\";\r\nimport { Box, Typography, ButtonBase, Grid, IconButton } from \"@mui/material\";\r\n\r\ninterface LayoutSelectorProps {\r\n onSelect: (layout: string) => void;\r\n selectedLayout?: string;\r\n}\r\n\r\nconst layoutIcons: Record<string, JSX.Element> = {\r\n Board: <BoardIcon />,\r\n Table: <TableIcon />,\r\n Timeline: <TimeLineIcon />,\r\n List: <ListIcon />,\r\n Calendar: <CalendarIcon />,\r\n Gallery: <GalleryIcon />,\r\n Charts: <ChartsIcon />,\r\n};\r\n\r\nconst LayoutSelector = ({ onSelect, selectedLayout }: LayoutSelectorProps) => {\r\n return (\r\n <Box\r\n sx={{\r\n width: \"100%\",\r\n maxWidth: \"500px\",\r\n height: \"330px\",\r\n // backgroundColor: \"#fff\",\r\n // borderRadius: 2,\r\n // overflow: \"hidden\",\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 px: 3,\r\n py: 2,\r\n // borderBottom: \"1px solid #eee\",\r\n backgroundColor: \"#FBFBFC\",\r\n }}\r\n >\r\n <Typography\r\n variant=\"h5\"\r\n sx={{ fontWeight: 400, fontSize: 18, color: \"#0C2033\" }}\r\n >\r\n Layouts\r\n </Typography>\r\n <IconButton onClick={() => onSelect(\"close\")}>\r\n <CloseIcon />\r\n </IconButton>\r\n </Box>\r\n\r\n {/* Layout Grid */}\r\n <Grid container spacing={2} sx={{ p: 3 }}>\r\n {Object.keys(layoutIcons).map((layout) => {\r\n const isSelected = layout === selectedLayout;\r\n return (\r\n <Grid size={3} key={layout}>\r\n <ButtonBase\r\n onClick={() => onSelect(layout)}\r\n sx={{\r\n border: isSelected\r\n ? \"1.5px solid #1E1E1E\"\r\n : \"1.5px solid #E5E7EB\",\r\n borderRadius: 2,\r\n p: 2,\r\n width: \"100%\",\r\n height: \"100%\",\r\n flexDirection: \"column\",\r\n backgroundColor: isSelected ? \"#fff\" : \"\",\r\n transition: \"0.3s\",\r\n boxShadow: isSelected\r\n ? \"0px 2px 6px rgba(0,0,0,0.06)\"\r\n : \"none\",\r\n }}\r\n >\r\n <Box mb={1}>{layoutIcons[layout]}</Box>\r\n <Typography\r\n variant=\"subtitle1\"\r\n sx={{\r\n color: \"#1E1E1E\",\r\n fontWeight: isSelected ? 400 : 200,\r\n opacity: isSelected ? 1 : 0.5,\r\n }}\r\n >\r\n {layout}\r\n </Typography>\r\n </ButtonBase>\r\n </Grid>\r\n );\r\n })}\r\n </Grid>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default LayoutSelector;\r\n","import { useEffect, useState } from \"react\";\r\n\r\nexport function useFullscreenPopoverContainer() {\r\n const [isFullscreen, setIsFullscreen] = useState<boolean>(\r\n !!document.fullscreenElement\r\n );\r\n const [container, setContainer] = useState<Element | undefined>(\r\n document.fullscreenElement ?? undefined\r\n );\r\n\r\n useEffect(() => {\r\n const handleFullscreenChange = () => {\r\n const el = document.fullscreenElement ?? undefined;\r\n setIsFullscreen(!!el);\r\n setContainer(el);\r\n };\r\n\r\n document.addEventListener(\"fullscreenchange\", handleFullscreenChange);\r\n return () => {\r\n document.removeEventListener(\"fullscreenchange\", handleFullscreenChange);\r\n };\r\n }, []);\r\n\r\n return { isFullscreen, container };\r\n}\r\n","import React from \"react\";\r\nimport {\r\n Popover,\r\n Typography,\r\n Box,\r\n MenuItem,\r\n Select,\r\n IconButton,\r\n Switch as MUISwitch,\r\n} from \"@mui/material\";\r\nimport { CloseIcon, ViewMoreIcon } from \"../../../assets/svg\";\r\nimport { useFullscreenPopoverContainer } from \"../../libs/hooks/useFullScreen\";\r\nimport { CraftTableOptionsProps } from \"../../types/table-options\";\r\n\r\n// interface ViewMorePopoverProps {\r\n// compactMode: boolean;\r\n// onCompactToggle: (value: string) => void;\r\n// isFullscreen: boolean;\r\n// onFullscreenToggle: () => void;\r\n// groupBy: string;\r\n// onGroupByChange: (value: string) => void;\r\n// tableStates: CraftTableOptionsProps;\r\n// }\r\n\r\n// const ViewMore = ({\r\n// compactMode,\r\n// onCompactToggle,\r\n// isFullscreen,\r\n// onFullscreenToggle,\r\n// // groupBy,\r\n// // onGroupByChange,\r\n// tableStates,\r\n// }: ViewMorePopoverProps) => {\r\n// const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\r\n\r\n// const open = Boolean(anchorEl);\r\n// const { container: fullscreenContainer } = useFullscreenPopoverContainer();\r\n\r\n// const handleClick = (event: React.MouseEvent<HTMLElement>) => {\r\n// setAnchorEl(event.currentTarget);\r\n// };\r\n\r\n// const handleClose = () => {\r\n// setAnchorEl(null);\r\n// };\r\n\r\n// const { wrapColumns, setWrapColumns } = tableStates;\r\n\r\n// const onWrapCellToggle = () => {\r\n// setWrapColumns((prev: Record<string, boolean>) => ({\r\n// all_wrap: !prev[\"all_wrap\"],\r\n// }));\r\n// };\r\n\r\n// return (\r\n// <>\r\n// <div onClick={handleClick}>\r\n// <ViewMoreIcon />\r\n// </div>\r\n\r\n// <Popover\r\n// open={open}\r\n// anchorEl={anchorEl}\r\n// onClose={handleClose}\r\n// container={fullscreenContainer}\r\n// anchorOrigin={{ vertical: \"bottom\", horizontal: \"left\" }}\r\n// transformOrigin={{ vertical: \"top\", horizontal: \"left\" }}\r\n// PaperProps={{\r\n// sx: {\r\n// mt: 2,\r\n// padding: 3,\r\n// width: 380,\r\n// borderRadius: 1,\r\n// boxShadow: 4,\r\n// },\r\n// }}\r\n// >\r\n// <Box\r\n// display=\"flex\"\r\n// justifyContent=\"space-between\"\r\n// alignItems=\"center\"\r\n// px={2}\r\n// py={2}\r\n// sx={{\r\n// backgroundColor: \"#F9FAFB\",\r\n// // borderBottom: \"1px solid #E0E0E0\",\r\n// // borderTopLeftRadius: 4,\r\n// // borderTopRightRadius: 4,\r\n// margin: \"-24px -24px 24px -24px\",\r\n// }}\r\n// >\r\n// <Typography fontSize=\"18px\" fontWeight={400} color=\"#0C2033\">\r\n// View\r\n// </Typography>\r\n// <IconButton size=\"small\" onClick={handleClose}>\r\n// <CloseIcon />\r\n// </IconButton>\r\n// </Box>\r\n\r\n// {/* Wrap Cell */}\r\n// <Box\r\n// display=\"flex\"\r\n// justifyContent=\"space-between\"\r\n// alignItems=\"center\"\r\n// mb={2}\r\n// >\r\n// <Typography fontSize=\"14px\" fontWeight={400} color=\"#000000DE\">\r\n// Wrap Cell\r\n// </Typography>\r\n// <MUISwitch\r\n// checked={wrapColumns?.all_wrap || false}\r\n// onChange={onWrapCellToggle}\r\n// />\r\n// </Box>\r\n\r\n// {/* List View */}\r\n// <Box\r\n// display=\"flex\"\r\n// justifyContent=\"space-between\"\r\n// alignItems=\"center\"\r\n// mb={2}\r\n// >\r\n// <Typography fontSize=\"14px\" fontWeight={400} color=\"#000000DE\">\r\n// List View\r\n// </Typography>\r\n// <Select\r\n// size=\"small\"\r\n// value={compactMode ? \"Compact\" : \"Comfy\"}\r\n// onChange={(e) => onCompactToggle(e.target.value)}\r\n// sx={{\r\n// minWidth: 120,\r\n// fontWeight: 400,\r\n// color: \"#000\",\r\n// fontSize: \"13px\",\r\n// }}\r\n// MenuProps={{\r\n// container: fullscreenContainer,\r\n// disablePortal: false,\r\n// PaperProps: {\r\n// style: {\r\n// zIndex: 1500,\r\n// },\r\n// },\r\n// }}\r\n// >\r\n// <MenuItem value=\"Comfy\">Comfy</MenuItem>\r\n// <MenuItem value=\"Compact\">Compact</MenuItem>\r\n// </Select>\r\n// </Box>\r\n\r\n// {/* Group By */}\r\n// {/* <Box\r\n// display=\"flex\"\r\n// justifyContent=\"space-between\"\r\n// alignItems=\"center\"\r\n// mb={2}\r\n// >\r\n// <Typography fontSize=\"14px\" fontWeight={400} color=\"#000000DE\">\r\n// Group By\r\n// </Typography>\r\n// <Select\r\n// size=\"small\"\r\n// value={groupBy}\r\n// onChange={(e) => onGroupByChange(e.target.value)}\r\n// sx={{\r\n// minWidth: 120,\r\n// fontWeight: 400,\r\n// color: \"#000\",\r\n// fontSize: \"13px\",\r\n// }}\r\n// MenuProps={{\r\n// container: fullscreenContainer,\r\n// disablePortal: false,\r\n// PaperProps: {\r\n// style: {\r\n// zIndex: 1500,\r\n// },\r\n// },\r\n// }}\r\n// >\r\n// <MenuItem value=\"None\">None</MenuItem>\r\n// <MenuItem value=\"Status\">Status</MenuItem>\r\n// <MenuItem value=\"Owner\">Owner</MenuItem>\r\n// </Select>\r\n// </Box> */}\r\n\r\n// {/* Fullscreen */}\r\n// <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\">\r\n// <Typography fontSize=\"14px\" fontWeight={400} color=\"#000000DE\">\r\n// Fullscreen\r\n// </Typography>\r\n// <MUISwitch checked={isFullscreen} onChange={onFullscreenToggle} />\r\n// </Box>\r\n// </Popover>\r\n// </>\r\n// );\r\n// };\r\n\r\n// export default ViewMore;\r\n\r\ninterface ViewMoreProps {\r\n compactMode: boolean;\r\n onCompactToggle: (value: string) => void;\r\n isFullscreen: boolean;\r\n onFullscreenToggle: () => void;\r\n groupBy?: string;\r\n onGroupByChange?: (value: string) => void;\r\n tableStates: CraftTableOptionsProps;\r\n onClose?: () => void;\r\n}\r\n\r\nconst ViewMore = ({\r\n compactMode,\r\n onCompactToggle,\r\n isFullscreen,\r\n onFullscreenToggle,\r\n // groupBy,\r\n // onGroupByChange,\r\n tableStates,\r\n onClose,\r\n}: ViewMoreProps) => {\r\n const { container: fullscreenContainer } = useFullscreenPopoverContainer();\r\n const { wrapColumns, setWrapColumns } = tableStates;\r\n\r\n const onWrapCellToggle = () => {\r\n setWrapColumns((prev: Record<string, boolean>) => ({\r\n all_wrap: !prev[\"all_wrap\"],\r\n }));\r\n };\r\n\r\n return (\r\n <Box sx={{ p: 3, width: 380 }}>\r\n {/* Header */}\r\n <Box\r\n display=\"flex\"\r\n justifyContent=\"space-between\"\r\n alignItems=\"center\"\r\n mb={3}\r\n >\r\n <Typography fontSize=\"18px\" fontWeight={400} color=\"#0C2033\">\r\n View\r\n </Typography>\r\n <IconButton size=\"small\" onClick={onClose}>\r\n <CloseIcon />\r\n </IconButton>\r\n </Box>\r\n\r\n {/* Wrap Cell */}\r\n <Box\r\n display=\"flex\"\r\n justifyContent=\"space-between\"\r\n alignItems=\"center\"\r\n mb={2}\r\n >\r\n <Typography fontSize=\"14px\" fontWeight={400} color=\"#000000DE\">\r\n Wrap Cell\r\n </Typography>\r\n <MUISwitch\r\n checked={wrapColumns?.all_wrap || false}\r\n onChange={onWrapCellToggle}\r\n />\r\n </Box>\r\n\r\n {/* List View */}\r\n <Box\r\n display=\"flex\"\r\n justifyContent=\"space-between\"\r\n alignItems=\"center\"\r\n mb={2}\r\n >\r\n <Typography fontSize=\"14px\" fontWeight={400} color=\"#000000DE\">\r\n List View\r\n </Typography>\r\n <Select\r\n size=\"small\"\r\n value={compactMode ? \"Compact\" : \"Comfy\"}\r\n onChange={(e) => onCompactToggle(e.target.value)}\r\n sx={{\r\n minWidth: 120,\r\n fontWeight: 400,\r\n color: \"#000\",\r\n fontSize: \"13px\",\r\n }}\r\n MenuProps={{\r\n container: fullscreenContainer,\r\n disablePortal: false,\r\n PaperProps: {\r\n style: {\r\n zIndex: 1500,\r\n },\r\n },\r\n }}\r\n >\r\n <MenuItem value=\"Comfy\">Comfy</MenuItem>\r\n <MenuItem value=\"Compact\">Compact</MenuItem>\r\n </Select>\r\n </Box>\r\n\r\n {/* Fullscreen */}\r\n <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\">\r\n <Typography fontSize=\"14px\" fontWeight={400} color=\"#000000DE\">\r\n Fullscreen\r\n </Typography>\r\n <MUISwitch checked={isFullscreen} onChange={onFullscreenToggle} />\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default ViewMore;\r\n","import React from \"react\";\r\nimport { useSortable } from \"@dnd-kit/sortable\";\r\nimport { CSS } from \"@dnd-kit/utilities\";\r\nimport { DragHandleIcon } from \"../../../assets/svg\";\r\n\r\nconst SortableItem = ({\r\n id,\r\n children,\r\n}: {\r\n id: string;\r\n children: React.ReactNode;\r\n}) => {\r\n const { attributes, listeners, setNodeRef, transform, transition } =\r\n useSortable({ id });\r\n\r\n return (\r\n <div\r\n ref={setNodeRef}\r\n style={{\r\n transform: CSS.Transform.toString(transform),\r\n transition,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 8,\r\n }}\r\n >\r\n <span {...attributes} {...listeners} style={{ cursor: \"grab\" }}>\r\n <DragHandleIcon />\r\n </span>\r\n <div style={{ flexGrow: 1 }}>{children}</div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default SortableItem;\r\n","import { useState } from \"react\";\r\nimport {\r\n Popover,\r\n Box,\r\n IconButton,\r\n MenuItem,\r\n Select,\r\n Typography,\r\n Button,\r\n} from \"@mui/material\";\r\nimport {\r\n DndContext,\r\n closestCenter,\r\n useSensor,\r\n useSensors,\r\n MouseSensor,\r\n TouchSensor,\r\n KeyboardSensor,\r\n} from \"@dnd-kit/core\";\r\nimport {\r\n arrayMove,\r\n SortableContext,\r\n verticalListSortingStrategy,\r\n} from \"@dnd-kit/sortable\";\r\nimport SortableItem from \"./sorting-item\";\r\nimport { AddIcon, CloseIcon } from \"../../../assets/svg\";\r\n\r\ninterface SortItem {\r\n id: string;\r\n field: string;\r\n direction: \"asc\" | \"desc\";\r\n}\r\n\r\ntype SortPopoverProps = {\r\n anchorEl: HTMLElement | null;\r\n onClose: () => void;\r\n columns: { id: string; label: string }[];\r\n onChange: (sorting: { id: string; desc: boolean }[]) => void;\r\n};\r\n\r\nconst SortPopover = ({\r\n anchorEl,\r\n onClose,\r\n columns,\r\n onChange,\r\n}: SortPopoverProps) => {\r\n const [sorts, setSorts] = useState<SortItem[]>([]);\r\n\r\n const sensors = useSensors(\r\n useSensor(MouseSensor),\r\n useSensor(TouchSensor),\r\n useSensor(KeyboardSensor)\r\n );\r\n\r\n const handleDragEnd = (event: any) => {\r\n const { active, over } = event;\r\n if (active.id !== over.id) {\r\n const oldIndex = sorts.findIndex((item) => item.id === active.id);\r\n const newIndex = sorts.findIndex((item) => item.id === over.id);\r\n const updated = arrayMove(sorts, oldIndex, newIndex);\r\n setSorts(updated);\r\n triggerTableSortUpdate(updated);\r\n }\r\n };\r\n\r\n const handleChange = (id: string, field: keyof SortItem, value: any) => {\r\n const updated = sorts.map((item) =>\r\n item.id === id ? { ...item, [field]: value } : item\r\n );\r\n setSorts(updated);\r\n triggerTableSortUpdate(updated);\r\n };\r\n\r\n const handleAddSort = () => {\r\n const newSort: SortItem = {\r\n id: Date.now().toString(),\r\n field: columns[0]?.id ?? \"\",\r\n direction: \"asc\",\r\n };\r\n const updated = [...sorts, newSort];\r\n setSorts(updated);\r\n triggerTableSortUpdate(updated);\r\n };\r\n\r\n const handleRemove = (id: string) => {\r\n const updated = sorts.filter((item) => item.id !== id);\r\n setSorts(updated);\r\n triggerTableSortUpdate(updated);\r\n };\r\n\r\n const triggerTableSortUpdate = (sortItems: SortItem[]) => {\r\n const sortingPayload = sortItems.map((item) => ({\r\n id: item.field,\r\n desc: item.direction === \"desc\",\r\n }));\r\n onChange(sortingPayload);\r\n };\r\n\r\n return (\r\n <Popover\r\n open={Boolean(anchorEl)}\r\n anchorEl={anchorEl}\r\n onClose={onClose}\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"left\" }}\r\n >\r\n <Box p={2} minWidth={300}>\r\n <Box\r\n display=\"flex\"\r\n justifyContent=\"space-between\"\r\n alignItems=\"center\"\r\n px={2}\r\n py={1}\r\n sx={{\r\n backgroundColor: \"#F9FAFB\",\r\n // borderBottom: \"1px solid #E0E0E0\",\r\n margin: \"-16px -16px 16px -16px\",\r\n }}\r\n >\r\n <Typography fontSize=\"18px\" fontWeight={600} color=\"#0C2033\">\r\n Sort By\r\n </Typography>\r\n <IconButton size=\"small\" onClick={onClose}>\r\n <CloseIcon />\r\n </IconButton>\r\n </Box>\r\n\r\n {sorts.length > 0 && (\r\n <DndContext\r\n sensors={sensors}\r\n collisionDetection={closestCenter}\r\n onDragEnd={handleDragEnd}\r\n >\r\n <SortableContext\r\n items={sorts.map((s) => s.id)}\r\n strategy={verticalListSortingStrategy}\r\n >\r\n {sorts.map((sort) => (\r\n <SortableItem key={sort.id} id={sort.id}>\r\n <Box display=\"flex\" gap={1} alignItems=\"center\" mb={1}>\r\n <Select\r\n value={sort.field}\r\n onChange={(e) =>\r\n handleChange(sort.id, \"field\", e.target.value)\r\n }\r\n size=\"small\"\r\n fullWidth\r\n sx={{ fontWeight: 400, fontSize: 14, color: \"#000\" }}\r\n >\r\n {columns.map((col) => (\r\n <MenuItem key={col.id} value={col.id}>\r\n {col.label}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n <Select\r\n value={sort.direction}\r\n onChange={(e) =>\r\n handleChange(sort.id, \"direction\", e.target.value)\r\n }\r\n size=\"small\"\r\n sx={{ fontWeight: 400, fontSize: 14, color: \"#000\" }}\r\n >\r\n <MenuItem value=\"asc\">Ascending</MenuItem>\r\n <MenuItem value=\"desc\">Descending</MenuItem>\r\n </Select>\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => handleRemove(sort.id)}\r\n >\r\n <CloseIcon />\r\n </IconButton>\r\n </Box>\r\n </SortableItem>\r\n ))}\r\n </SortableContext>\r\n </DndContext>\r\n )}\r\n\r\n <Button\r\n onClick={handleAddSort}\r\n startIcon={\r\n <span>\r\n <AddIcon />\r\n </span>\r\n }\r\n size=\"small\"\r\n sx={{\r\n fontWeight: 400,\r\n fontSize: 12,\r\n color: \"#888888\",\r\n }}\r\n >\r\n Add Sort\r\n </Button>\r\n </Box>\r\n </Popover>\r\n );\r\n};\r\n\r\nexport default SortPopover;\r\n","import { useSortable } from \"@dnd-kit/sortable\";\r\nimport { Box, Typography } from \"@mui/material\";\r\nimport {\r\n DragandDrogIcon,\r\n VisibilityIcon,\r\n VisibilityOffIcon,\r\n} from \"../../../assets/svg\";\r\nimport { CSS } from \"@dnd-kit/utilities\";\r\nimport { camelCaseToTitle } from \"../../types/common\";\r\n\r\nconst DraggableColumn = ({\r\n column,\r\n onToggle,\r\n}: {\r\n column: any;\r\n onToggle: () => void;\r\n}) => {\r\n const { attributes, listeners, setNodeRef, transform, transition } =\r\n useSortable({\r\n id: column.id,\r\n });\r\n\r\n const style = {\r\n transform: CSS.Transform.toString(transform),\r\n transition,\r\n };\r\n\r\n const isVisible = column.getIsVisible();\r\n const label =\r\n typeof column.columnDef.header === \"string\"\r\n ? column.columnDef.header\r\n : column.id;\r\n\r\n return (\r\n <div ref={setNodeRef} style={style} {...attributes} className=\"column-row\">\r\n <Box {...listeners} className=\"drag-icon\">\r\n <DragandDrogIcon />\r\n </Box>\r\n <Typography>{camelCaseToTitle(label as string)}</Typography>\r\n <Box onClick={onToggle} className=\"visibility-icon\">\r\n {isVisible ? <VisibilityIcon /> : <VisibilityOffIcon />}\r\n </Box>\r\n </div>\r\n );\r\n};\r\n\r\nexport default DraggableColumn;\r\n","export interface defaultColumnsProps {\r\n id: number;\r\n name: string;\r\n department: string;\r\n position: string;\r\n email: string;\r\n location: string;\r\n phone: string;\r\n dateOfJoining: string;\r\n salary: number;\r\n performanceRating: string;\r\n subRows?: any;\r\n}\r\n\r\nexport interface amountFormatProps {\r\n amount: number;\r\n decimal?: boolean;\r\n removeFloat?: boolean;\r\n compactFormat?: \"crore\" | \"10lakh\" | \"lakh\";\r\n}\r\n\r\nexport interface formatDateProps {\r\n date: string;\r\n style: string;\r\n}\r\n\r\nexport type alignProps = \"left\" | \"center\" | \"right\";\r\nexport interface align {\r\n align: alignProps;\r\n}\r\n\r\nexport const camelCaseToTitle = (str: string): string => {\r\n if (!str) return \"\";\r\n\r\n return str\r\n .replace(/_/g, \" \") // Replace underscores with spaces\r\n .replace(/([a-z])([A-Z])/g, \"$1 $2\") // Add space between camelCase transitions\r\n .replace(/\\b\\w/g, (char) => char.toUpperCase()) // Capitalize each word's first letter\r\n .trim();\r\n};\r\n\r\n//API INTEGRATION\r\nexport interface EntityTableAPIProps {\r\n entity_type?: string;\r\n page: number;\r\n size: number;\r\n tabs?: {\r\n columnName: string;\r\n sortBy: \"ASC\" | \"DSC\";\r\n value?: string;\r\n name?: string;\r\n };\r\n sortby?: {\r\n sortColum: string;\r\n sortType: \"ASC\" | \"DSC\";\r\n }[];\r\n quickFilter?: {\r\n filter_attribute: string;\r\n filter_operator: string;\r\n filter_value: string[] | string;\r\n }[];\r\n attributeFilter?: {\r\n filter_attribute: string;\r\n filter_operator: string;\r\n filter_value: string[] | string;\r\n }[];\r\n flatJson: boolean;\r\n}\r\n\r\nexport interface viewSettingsDropDownAPIProps {\r\n entity_type: string;\r\n column: string | undefined;\r\n sort_by: string | undefined;\r\n}\r\n\r\ninterface EntityListTab {\r\n tab_name: string | null;\r\n count: string | number;\r\n}\r\n\r\ninterface EntityList {\r\n id: string;\r\n entity_type: string;\r\n name: string;\r\n status: string | null;\r\n parent_type: string | null;\r\n parent_id: string | null;\r\n code: string;\r\n created_by: string | null;\r\n created_date: string | null;\r\n modified_by: string | null;\r\n modified_date: string | null;\r\n enterprise_id: string | null;\r\n organization_id: number | null;\r\n app_code: string | null;\r\n is_system: number | null;\r\n description: string | null;\r\n}\r\n\r\nexport interface EntityListingResponse {\r\n data: {\r\n entity_tabs: EntityListTab[];\r\n entity_list: EntityList[];\r\n };\r\n}\r\n\r\nexport interface APIParamsProps {\r\n page?: number;\r\n size?: number;\r\n use_flatjson?: boolean;\r\n}\r\n\r\nexport type DropdownOption = {\r\n value: string | number;\r\n label: string;\r\n};\r\n\r\nexport interface onFilterChangeFunctionProps {\r\n updatedFilters?: any;\r\n filterMaster?: any;\r\n filters?: any;\r\n}\r\n","import React from \"react\";\r\nimport {\r\n DndContext,\r\n closestCenter,\r\n useSensor,\r\n useSensors,\r\n MouseSensor,\r\n TouchSensor,\r\n KeyboardSensor,\r\n DragEndEvent,\r\n} from \"@dnd-kit/core\";\r\nimport {\r\n SortableContext,\r\n arrayMove,\r\n verticalListSortingStrategy,\r\n} from \"@dnd-kit/sortable\";\r\nimport { Popover, IconButton, Typography, Box } from \"@mui/material\";\r\nimport { Table } from \"@tanstack/react-table\";\r\nimport DraggableColumn from \"./column-list-item\";\r\nimport \"./index.scss\";\r\nimport { CloseIcon } from \"../../../assets/svg\";\r\n\r\ninterface ColumnToggleProps<T> {\r\n anchorEl: HTMLElement | null;\r\n onClose: () => void;\r\n table: Table<T>;\r\n columnOrder: string[];\r\n setColumnOrder: React.Dispatch<React.SetStateAction<string[]>>;\r\n}\r\n\r\nconst ColumnToggle = <T,>({\r\n anchorEl,\r\n onClose,\r\n table,\r\n columnOrder,\r\n setColumnOrder,\r\n}: ColumnToggleProps<T>) => {\r\n const open = Boolean(anchorEl);\r\n const sensors = useSensors(\r\n useSensor(MouseSensor),\r\n useSensor(TouchSensor),\r\n useSensor(KeyboardSensor)\r\n );\r\n\r\n const allColumns = table.getAllLeafColumns();\r\n\r\n const shownColumns = columnOrder\r\n .map((id) => allColumns.find((col) => col.id === id))\r\n .filter((col) => col?.getIsVisible());\r\n\r\n const hiddenColumns = columnOrder\r\n .map((id) => allColumns.find((col) => col.id === id))\r\n .filter((col) => col && !col.getIsVisible());\r\n\r\n const handleDragEnd = (event: DragEndEvent) => {\r\n const { active, over } = event;\r\n\r\n if (!over || active.id === over.id) return;\r\n\r\n const activeCol = table.getColumn(active.id as string);\r\n const overCol = table.getColumn(over.id as string);\r\n if (!activeCol || !overCol) return;\r\n\r\n const activeVisible = activeCol.getIsVisible();\r\n const overVisible = overCol.getIsVisible();\r\n\r\n if (activeVisible !== overVisible) {\r\n activeCol.toggleVisibility();\r\n }\r\n\r\n const oldIndex = columnOrder.indexOf(active.id as string);\r\n const newIndex = columnOrder.indexOf(over.id as string);\r\n setColumnOrder(arrayMove(columnOrder, oldIndex, newIndex));\r\n };\r\n\r\n const toggleVisibility = (columnId: string) => {\r\n const col = table.getColumn(columnId);\r\n col?.toggleVisibility();\r\n };\r\n\r\n const handleHideAll = () => {\r\n allColumns.forEach((col) => col.toggleVisibility(false));\r\n };\r\n\r\n const handleShowAll = () => {\r\n allColumns.forEach((col) => col.toggleVisibility(true));\r\n };\r\n\r\n return (\r\n <Popover\r\n open={open}\r\n anchorEl={anchorEl}\r\n onClose={onClose}\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"left\" }}\r\n sx={{ width: \"600px\" }}\r\n >\r\n <div className=\"column-manager\">\r\n <div className=\"header\">\r\n <Typography variant=\"h6\">Column</Typography>\r\n <IconButton size=\"small\" onClick={onClose}>\r\n <CloseIcon />\r\n </IconButton>\r\n </div>\r\n\r\n <div className=\"content-wrapper\">\r\n <DndContext\r\n sensors={sensors}\r\n collisionDetection={closestCenter}\r\n onDragEnd={handleDragEnd}\r\n >\r\n <div className=\"list-section\">\r\n <div className=\"list-header\">\r\n <Typography variant=\"subtitle2\">Shown in List</Typography>\r\n {/* <button onClick={handleHideAll}>Hide All</button> */}\r\n <Box\r\n onClick={handleHideAll}\r\n fontStyle={{\r\n cursor: \"pointer\",\r\n color: \"#C5C5C5\",\r\n fontSize: \"12px\",\r\n }}\r\n >\r\n Hide All\r\n </Box>\r\n </div>\r\n <SortableContext\r\n items={shownColumns.map((col) => col!.id)}\r\n strategy={verticalListSortingStrategy}\r\n >\r\n {shownColumns.map((col) => (\r\n <DraggableColumn\r\n key={col!.id}\r\n column={col!}\r\n onToggle={() => toggleVisibility(col!.id)}\r\n />\r\n ))}\r\n </SortableContext>\r\n </div>\r\n\r\n <div className=\"list-section\">\r\n <div className=\"list-header\">\r\n <Typography variant=\"subtitle2\">Hidden in List</Typography>\r\n {/* <button onClick={handleShowAll}>Show All</button> */}\r\n <Box\r\n onClick={handleShowAll}\r\n fontStyle={{\r\n cursor: \"pointer\",\r\n color: \"#C5C5C5\",\r\n fontSize: \"12px\",\r\n }}\r\n >\r\n Show All\r\n </Box>\r\n </div>\r\n <SortableContext\r\n items={hiddenColumns.map((col) => col!.id)}\r\n strategy={verticalListSortingStrategy}\r\n >\r\n {hiddenColumns.map((col) => (\r\n <DraggableColumn\r\n key={col!.id}\r\n column={col!}\r\n onToggle={() => toggleVisibility(col!.id)}\r\n />\r\n ))}\r\n </SortableContext>\r\n </div>\r\n </DndContext>\r\n </div>\r\n </div>\r\n </Popover>\r\n );\r\n};\r\n\r\nexport default ColumnToggle;\r\n","export const customDebounce = <T extends (...args: any[]) => any>(\r\n func: T,\r\n delay: number\r\n) => {\r\n let timerId: NodeJS.Timeout;\r\n\r\n return function (this: any, ...args: Parameters<T>) {\r\n const context = this;\r\n\r\n clearTimeout(timerId);\r\n timerId = setTimeout(() => {\r\n func.apply(context, args);\r\n }, delay);\r\n };\r\n};\r\n","import { Theme } from \"@emotion/react\";\r\nimport { SxProps } from \"@mui/material\";\r\n\r\nexport interface StyleProps {\r\n searchField: (showSearchInput: boolean) => SxProps<Theme>;\r\n}\r\n\r\nexport const searchStyles: StyleProps = {\r\n searchField: (showSearchInput: boolean): SxProps<Theme> => ({\r\n width: showSearchInput ? \"180px\" : \"40px\",\r\n transition: \"all 0.3s ease\",\r\n opacity: showSearchInput ? 1 : 0.8,\r\n marginRight: \"0.5rem\",\r\n\r\n \"& .MuiOutlinedInput-root\": {\r\n paddingRight: \"4px\",\r\n height: \"32px\",\r\n borderRadius: \"6px\",\r\n backgroundColor: \"#fff\",\r\n border: showSearchInput ? \"1px solid #ccc\" : \"none\",\r\n },\r\n\r\n \"& .MuiOutlinedInput-notchedOutline\": {\r\n border: \"none\",\r\n },\r\n\r\n \"&:hover .MuiOutlinedInput-notchedOutline\": {\r\n border: \"none\",\r\n },\r\n\r\n \"&.Mui-focused .MuiOutlinedInput-notchedOutline\": {},\r\n\r\n \" & .css-4bojcr-MuiInputBase-root-MuiOutlinedInput-root \": {\r\n paddingLeft: \"6px !important\",\r\n },\r\n \"& .css-1mnoz6i-MuiInputBase-root-MuiOutlinedInput-root\": {\r\n paddingLeft: \"6px !important\",\r\n },\r\n }),\r\n};\r\n","import React, { useState, useRef, useEffect, useCallback } from \"react\";\r\nimport { SearchIcon } from \"../../../assets/svg\";\r\nimport useOutsideClick from \"../../libs/hooks/useOutsideClick\";\r\nimport { customDebounce } from \"../../libs/utils/debounce\";\r\nimport { Box, IconButton, InputAdornment, TextField } from \"@mui/material\";\r\nimport CloseRoundedIcon from \"@mui/icons-material/CloseRounded\";\r\nimport { searchStyles } from \"./style\";\r\n\r\ninterface TableSearchProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n}\r\n\r\nexport const TableSearch = ({\r\n value,\r\n onChange,\r\n}: TableSearchProps): JSX.Element => {\r\n const [showSearchInput, setShowSearchInput] = useState(false);\r\n const [localValue, setLocalValue] = useState(value);\r\n const searchContainerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Debounced onChange function\r\n const debouncedOnChange = useCallback(\r\n customDebounce((newValue: string) => {\r\n onChange(newValue);\r\n }, 1000),\r\n [onChange]\r\n );\r\n\r\n // Sync local state with prop value\r\n useEffect(() => {\r\n setLocalValue(value);\r\n }, [value]);\r\n\r\n useOutsideClick({\r\n ref: searchContainerRef,\r\n handler: () => {\r\n setShowSearchInput(false);\r\n },\r\n });\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const newValue = e.target.value;\r\n setLocalValue(newValue);\r\n debouncedOnChange(newValue);\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === \"Enter\") {\r\n onChange(localValue);\r\n }\r\n if (e.key === \"Escape\") {\r\n setShowSearchInput(false);\r\n }\r\n };\r\n\r\n return (\r\n <Box\r\n ref={searchContainerRef}\r\n className=\"search-container\"\r\n sx={{ position: \"relative\" }}\r\n >\r\n <TextField\r\n type=\"text\"\r\n placeholder=\"Search\"\r\n value={localValue}\r\n onChange={handleChange}\r\n onKeyDown={handleKeyDown}\r\n className={`search-input ${showSearchInput ? \"expanded\" : \"\"}`}\r\n sx={searchStyles.searchField(showSearchInput)}\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => {\r\n setShowSearchInput((prev) => !prev);\r\n if (!showSearchInput) {\r\n setTimeout(() => {\r\n searchContainerRef.current\r\n ?.querySelector(\"input\")\r\n ?.focus();\r\n }, 100);\r\n }\r\n }}\r\n sx={{ color: \"black\", fontSize: 14 }}\r\n edge=\"start\"\r\n >\r\n <SearchIcon />\r\n </IconButton>\r\n </InputAdornment>\r\n ),\r\n endAdornment:\r\n showSearchInput && localValue !== \"\" ? (\r\n <InputAdornment position=\"end\">\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => {\r\n setLocalValue(\"\");\r\n handleChange({ target: { value: \"\" } } as any);\r\n }}\r\n sx={{ color: \"black\", fontSize: 14 }}\r\n edge=\"end\"\r\n >\r\n <CloseRoundedIcon\r\n fontSize=\"small\"\r\n sx={{ color: \"black\", fontSize: 14 }}\r\n />\r\n </IconButton>\r\n </InputAdornment>\r\n ) : null,\r\n }}\r\n />\r\n </Box>\r\n );\r\n};\r\n","import React, { useEffect } from \"react\";\r\n\r\ninterface OutsideClickHandlerProps {\r\n ref: React.RefObject<HTMLElement>;\r\n handler: () => void;\r\n}\r\n\r\nconst useOutsideClick = ({ ref, handler }: OutsideClickHandlerProps) => {\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (ref.current && !ref.current.contains(event.target as Node)) {\r\n handler();\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n };\r\n }, [ref, handler]);\r\n};\r\n\r\nexport default useOutsideClick;\r\n","import React, { useState, useRef, useEffect } from \"react\";\r\nimport {\r\n ChangeLayoutIcon,\r\n SortingIcon,\r\n FilterationIcon,\r\n HideColumnIcon,\r\n} from \"../../../assets/svg.tsx\";\r\nimport { Box, Popover } from \"@mui/material\";\r\nimport LayoutSelector from \"../table-change-layout.tsx\";\r\nimport { Table } from \"@tanstack/react-table\";\r\nimport { TopbarOptionsProps } from \"../../types/table.ts\";\r\nimport \"./index.scss\";\r\nimport ViewMore from \"../viewmore/index.tsx\";\r\nimport { useFullscreenPopoverContainer } from \"../../libs/hooks/useFullScreen.tsx\";\r\nimport SortPopover from \"../sorting-modal.tsx/index.tsx\";\r\nimport ColumnToggle from \"../column-visibility-modal/index.tsx\";\r\nimport { CraftTableOptionsProps } from \"../../types/table-options.ts\";\r\nimport { TableSearch } from \"../search/index.tsx\";\r\n\r\ninterface TopbarProps<T> {\r\n table: Table<T>;\r\n isFullscreen: boolean;\r\n fullscreenToggle: () => void;\r\n isCompactTable: boolean;\r\n setIsCompactTable: React.Dispatch<React.SetStateAction<boolean>>;\r\n paginationComponent?: React.ReactNode;\r\n topbarOptions?: TopbarOptionsProps;\r\n columnOrder?: string[];\r\n setColumnOrder?: React.Dispatch<React.SetStateAction<string[]>>;\r\n tableStates: CraftTableOptionsProps;\r\n searchValue?: string;\r\n onSearchChange?: (val: string) => void;\r\n onFilterButtonClick?: () => void;\r\n}\r\n\r\nfunction Topbar<T>({\r\n table,\r\n isCompactTable,\r\n isFullscreen,\r\n fullscreenToggle,\r\n setIsCompactTable,\r\n paginationComponent,\r\n topbarOptions,\r\n tableStates,\r\n onFilterButtonClick,\r\n}: TopbarProps<T>) {\r\n const [sortAnchorEl, setSortAnchorEl] = useState<HTMLElement | null>(null);\r\n const [groupBy, setGroupBy] = useState<string>(\"None\");\r\n\r\n const [layoutAnchorEl, setLayoutAnchorEl] = useState<null | HTMLElement>(\r\n null\r\n );\r\n const [selectedLayout, setSelectedLayout] = useState(\"Table\");\r\n const [columnAnchorEl, setColumnAnchorEl] = useState<HTMLElement | null>(\r\n null\r\n );\r\n const [columnOrder, setColumnOrder] = useState<string[]>(\r\n table.getAllLeafColumns().map((col) => col.id)\r\n );\r\n\r\n const searchContainerRef = useRef<HTMLDivElement>(null);\r\n\r\n // sync column order with table instance\r\n useEffect(() => {\r\n table.setColumnOrder(columnOrder);\r\n }, [columnOrder]);\r\n\r\n useEffect(() => {\r\n if (isFullscreen) {\r\n // Close all popovers when fullscreen is enabled\r\n setLayoutAnchorEl(null);\r\n setSortAnchorEl(null);\r\n setColumnAnchorEl(null);\r\n setViewMoreAnchorEl(null);\r\n }\r\n }, [isFullscreen]);\r\n\r\n const {\r\n leftSideComponent,\r\n rightSideComponent,\r\n showColumnToggle,\r\n showChangeLayoutToggle,\r\n showSortingToggle,\r\n showFilterToggle,\r\n showSearch,\r\n searchValue,\r\n onSearchChange,\r\n } = topbarOptions ?? {};\r\n\r\n const { container: fullscreenContainer } = useFullscreenPopoverContainer();\r\n\r\n const handleLayoutSelect = (layout: string) => {\r\n setSelectedLayout(layout);\r\n setLayoutAnchorEl(null);\r\n };\r\n\r\n useEffect(() => {\r\n const handleExternalLayoutTrigger = (e: Event) => {\r\n const target = (e as CustomEvent).detail?.target as HTMLElement;\r\n setLayoutAnchorEl(target);\r\n };\r\n\r\n const handleExternalFilterTrigger = () => {\r\n onFilterButtonClick?.();\r\n };\r\n\r\n const handleExternalViewMoreTrigger = (e: Event) => {\r\n const target = (e as CustomEvent).detail?.target as HTMLElement;\r\n if (target) setViewMoreAnchorEl(target);\r\n };\r\n\r\n const handleExternalSearchTrigger = () => {\r\n setTimeout(() => {\r\n searchContainerRef.current?.querySelector(\"input\")?.focus();\r\n }, 100);\r\n };\r\n\r\n window.addEventListener(\r\n \"triggerLayoutPopover\",\r\n handleExternalLayoutTrigger\r\n );\r\n window.addEventListener(\"triggerFilterButton\", handleExternalFilterTrigger);\r\n window.addEventListener(\"triggerViewMore\", handleExternalViewMoreTrigger);\r\n window.addEventListener(\"triggerSearchInput\", handleExternalSearchTrigger); // ✅\r\n\r\n return () => {\r\n window.removeEventListener(\r\n \"triggerLayoutPopover\",\r\n handleExternalLayoutTrigger\r\n );\r\n window.removeEventListener(\r\n \"triggerFilterButton\",\r\n handleExternalFilterTrigger\r\n );\r\n window.removeEventListener(\r\n \"triggerViewMore\",\r\n handleExternalViewMoreTrigger\r\n );\r\n window.removeEventListener(\r\n \"triggerSearchInput\",\r\n handleExternalSearchTrigger\r\n ); // ✅\r\n };\r\n }, [onFilterButtonClick]);\r\n\r\n const [viewMoreAnchorEl, setViewMoreAnchorEl] = useState<HTMLElement | null>(\r\n null\r\n );\r\n\r\n const isViewMoreOpen = Boolean(viewMoreAnchorEl);\r\n\r\n return (\r\n <div className=\"ts-topbar\">\r\n <div className=\"tabs-section\">\r\n <div style={{ overflowX: \"auto\", whiteSpace: \"nowrap\" }}>\r\n {leftSideComponent}\r\n </div>\r\n </div>\r\n\r\n <div className=\"right-section\">\r\n {rightSideComponent}\r\n {paginationComponent}\r\n\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 0.5,\r\n }}\r\n >\r\n {showSearch && (\r\n <Box\r\n title=\"Search\"\r\n className=\"external-search-trigger\"\r\n onClick={() => {\r\n const customEvent = new CustomEvent(\"triggerSearchInput\");\r\n window.dispatchEvent(customEvent);\r\n }}\r\n ref={searchContainerRef}\r\n >\r\n <TableSearch\r\n value={searchValue ?? \"\"}\r\n onChange={onSearchChange ?? (() => {})}\r\n />\r\n </Box>\r\n )}\r\n\r\n {showChangeLayoutToggle && (\r\n <>\r\n <div className=\"change-layout ts--button\" title=\"Layout\">\r\n <div\r\n onClick={(e) => {\r\n const customEvent = new CustomEvent(\r\n \"triggerLayoutPopover\",\r\n {\r\n detail: { target: e.currentTarget },\r\n }\r\n );\r\n window.dispatchEvent(customEvent);\r\n }}\r\n className=\"external-layout-trigger\"\r\n >\r\n <ChangeLayoutIcon />\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n <Popover\r\n open={Boolean(layoutAnchorEl)}\r\n anchorEl={layoutAnchorEl}\r\n onClose={() => setLayoutAnchorEl(null)}\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"left\" }}\r\n container={fullscreenContainer}\r\n sx={{\r\n mt: 2.2,\r\n }}\r\n >\r\n <LayoutSelector\r\n onSelect={handleLayoutSelect}\r\n selectedLayout={selectedLayout}\r\n />\r\n </Popover>\r\n {showColumnToggle && (\r\n <>\r\n <div\r\n className=\"hide-column ts--button\"\r\n onClick={(e) => setColumnAnchorEl(e.currentTarget)}\r\n title=\"Column\"\r\n >\r\n <HideColumnIcon />\r\n </div>\r\n <ColumnToggle\r\n anchorEl={columnAnchorEl}\r\n onClose={() => setColumnAnchorEl(null)}\r\n table={table}\r\n columnOrder={columnOrder}\r\n setColumnOrder={setColumnOrder}\r\n />\r\n </>\r\n )}\r\n\r\n {showSortingToggle && (\r\n <>\r\n <div\r\n className=\"filter ts--button\"\r\n title=\"Sort\"\r\n onClick={(e) => setSortAnchorEl(e.currentTarget)}\r\n >\r\n <SortingIcon />\r\n </div>\r\n <SortPopover\r\n anchorEl={sortAnchorEl}\r\n onClose={() => setSortAnchorEl(null)}\r\n columns={table.getAllLeafColumns().map((col) => ({\r\n id: col.id,\r\n label: (col.columnDef.meta as any)?.label || col.id,\r\n }))}\r\n onChange={(sortingRules) => table.setSorting(sortingRules)}\r\n />\r\n </>\r\n )}\r\n\r\n {/* {showFilterToggle && (\r\n <div\r\n className=\"filter ts--button\"\r\n title=\"Filter\"\r\n onClick={onFilterButtonClick}\r\n style={{\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n backgroundColor:\r\n tableStates.showTableFilter || tableStates.filters.length > 0\r\n ? \"#e8e2fb\"\r\n : \"transparent\",\r\n height: \"25px\",\r\n width: \"25px\",\r\n borderRadius: \"6px\",\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n <FilterationIcon\r\n color={\r\n tableStates.showTableFilter || tableStates.filters.length > 0\r\n ? \"#7A5AF8\"\r\n : \"#1C1B1F\"\r\n }\r\n />\r\n </div>\r\n )} */}\r\n\r\n {showFilterToggle && (\r\n <div\r\n className=\"filter ts--button\"\r\n title=\"Filter\"\r\n onClick={onFilterButtonClick}\r\n style={{\r\n position: \"relative\",\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n backgroundColor:\r\n tableStates.showTableFilter || tableStates.filters.length > 0\r\n ? \"#eae4fe\"\r\n : \"transparent\",\r\n height: \"25px\",\r\n width: \"25px\",\r\n borderRadius: \"6px\",\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n <FilterationIcon\r\n color={\r\n tableStates.showTableFilter || tableStates.filters.length > 0\r\n ? \"#7A5AF8\"\r\n : \"#1C1B1F\"\r\n }\r\n />\r\n\r\n {tableStates.filters.length > 0 &&\r\n !tableStates.showTableFilter && (\r\n <span\r\n style={{\r\n position: \"absolute\",\r\n top: \"1px\",\r\n right: \"1px\",\r\n width: \"6px\",\r\n height: \"6px\",\r\n borderRadius: \"50%\",\r\n backgroundColor: \"#F63D68\",\r\n }}\r\n />\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* {viewMoreToggle && (\r\n <div className=\"view-more ts--button\" title=\"View More\">\r\n <ViewMore\r\n compactMode={isCompactTable}\r\n onCompactToggle={(value: string) =>\r\n setIsCompactTable(value === \"Compact\")\r\n }\r\n isFullscreen={isFullscreen}\r\n onFullscreenToggle={fullscreenToggle}\r\n groupBy={groupBy}\r\n onGroupByChange={(value: string) => setGroupBy(value)}\r\n tableStates={tableStates}\r\n />\r\n </div>\r\n )} */}\r\n {/* {viewMoreToggle && (\r\n <div\r\n className=\"view-more ts--button view-more-trigger\"\r\n title=\"View More\"\r\n >\r\n <ViewMore\r\n compactMode={isCompactTable}\r\n onCompactToggle={(value: string) =>\r\n setIsCompactTable(value === \"Compact\")\r\n }\r\n isFullscreen={isFullscreen}\r\n onFullscreenToggle={fullscreenToggle}\r\n groupBy={groupBy}\r\n onGroupByChange={(value: string) => setGroupBy(value)}\r\n tableStates={tableStates}\r\n />\r\n </div>\r\n )} */}\r\n <Popover\r\n open={isViewMoreOpen}\r\n anchorEl={viewMoreAnchorEl}\r\n onClose={() => setViewMoreAnchorEl(null)}\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"left\" }}\r\n transformOrigin={{ vertical: \"top\", horizontal: \"left\" }}\r\n container={fullscreenContainer}\r\n // PaperProps={{\r\n // sx: {\r\n // mt: 2,\r\n // padding: 0,\r\n // width: 380,\r\n // borderRadius: 1,\r\n // boxShadow: 4,\r\n // },\r\n // }}\r\n >\r\n <ViewMore\r\n compactMode={isCompactTable}\r\n onCompactToggle={(value: string) =>\r\n setIsCompactTable(value === \"Compact\")\r\n }\r\n isFullscreen={isFullscreen}\r\n onFullscreenToggle={fullscreenToggle}\r\n groupBy={groupBy}\r\n onGroupByChange={(value: string) => setGroupBy(value)}\r\n tableStates={tableStates}\r\n onClose={() => setViewMoreAnchorEl(null)}\r\n />\r\n </Popover>\r\n </Box>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default Topbar;\r\n","import { styled } from \"@mui/material/styles\";\r\nimport { Box, IconButton, Select, InputBase } from \"@mui/material\";\r\n\r\n/* Root container */\r\nexport const PaginationContainer = styled(Box)(({ theme }) => ({\r\n padding: theme.spacing(0.5),\r\n display: \"flex\",\r\n justifyContent: \"flex-end\",\r\n alignItems: \"center\",\r\n gap: theme.spacing(2),\r\n fontSize: theme.typography.pxToRem(14),\r\n backgroundColor: theme.palette.common.white,\r\n\r\n [theme.breakpoints.down(\"md\")]: {\r\n justifyContent: \"center\",\r\n fontSize: theme.typography.pxToRem(12),\r\n },\r\n}));\r\n\r\n/* Hide go-to-page on <= 991px */\r\nexport const GoToPageContainer = styled(Box)(({ theme }) => ({\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n\r\n [theme.breakpoints.down(\"md\")]: {\r\n display: \"none\",\r\n },\r\n}));\r\n\r\n/* Rows per page */\r\nexport const RowsPerPageContainer = styled(Box)(({ theme }) => ({\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n\r\n [theme.breakpoints.down(\"sm\")]: {\r\n display: \"none\",\r\n },\r\n}));\r\n\r\n/* Records range */\r\nexport const RecordsRangeContainer = styled(Box)(({ theme }) => ({\r\n whiteSpace: \"nowrap\",\r\n fontSize: theme.typography.pxToRem(14),\r\n\r\n [theme.breakpoints.down(\"sm\")]: {\r\n display: \"none\",\r\n },\r\n}));\r\n\r\n/* Page range */\r\nexport const PageRangeContainer = styled(Box)(({ theme }) => ({\r\n whiteSpace: \"nowrap\",\r\n fontSize: theme.typography.pxToRem(14),\r\n}));\r\n\r\n/* Buttons wrapper */\r\nexport const PaginationButtons = styled(Box)(({ theme }) => ({\r\n display: \"flex\",\r\n gap: theme.spacing(1),\r\n}));\r\n\r\n/* Pagination button */\r\nexport const PaginationButton = styled(IconButton)(({ theme }) => ({\r\n borderRadius: \"50%\",\r\n height: 24,\r\n width: 24,\r\n padding: 2,\r\n transition: \"0.4s\",\r\n\r\n \"&:hover\": {\r\n backgroundColor: theme.palette.grey[300],\r\n boxShadow: \"0 1px 2px 0 rgba(60,64,67,.6), 0 1px 3px 1px rgba(60,64,67,.3)\",\r\n },\r\n\r\n \"&.Mui-disabled\": {\r\n color: theme.palette.action.disabled,\r\n },\r\n\r\n [theme.breakpoints.down(\"sm\")]: {\r\n height: 24,\r\n width: 24,\r\n padding: 0,\r\n\r\n \"& svg\": {\r\n width: 20,\r\n height: 20,\r\n },\r\n },\r\n}));\r\n\r\n/* Select (rows per page) */\r\nexport const RowsPerPageSelect = styled(Select)(({ theme }) => ({\r\n borderRadius: theme.shape.borderRadius,\r\n padding: theme.spacing(0),\r\n fontSize: theme.typography.pxToRem(12),\r\n\r\n \"& .MuiSelect-select\": {\r\n fontSize: theme.typography.pxToRem(12),\r\n padding: theme.spacing(0.5, 0.75),\r\n },\r\n}));\r\n\r\n/* Input for go-to-page */\r\nexport const GoToPageInput = styled(InputBase)(({ theme }) => ({\r\n width: 60,\r\n textAlign: \"center\",\r\n borderRadius: theme.shape.borderRadius,\r\n border: `1px solid ${theme.palette.divider}`,\r\n fontSize: theme.typography.pxToRem(12),\r\n\r\n \"& .MuiInputBase-input\": {\r\n fontSize: theme.typography.pxToRem(12),\r\n padding: theme.spacing(0.25, 0.75),\r\n },\r\n}));\r\n","import { Table } from \"@tanstack/react-table\";\r\nimport { TableFirstPageIcon, TableLastPageIcon } from \"../../../../assets/svg\";\r\nimport NavigateBeforeRounded from \"@mui/icons-material/NavigateBeforeRounded\";\r\nimport NavigateNextRounded from \"@mui/icons-material/NavigateNextRounded\";\r\nimport { MenuItem, Typography } from \"@mui/material\";\r\nimport { CraftTablePaginationProps } from \"../../../types/table\";\r\nimport {\r\n PaginationContainer,\r\n GoToPageContainer,\r\n RowsPerPageContainer,\r\n RecordsRangeContainer,\r\n PageRangeContainer,\r\n PaginationButtons,\r\n PaginationButton,\r\n RowsPerPageSelect,\r\n GoToPageInput,\r\n} from \"./pagination.styles\";\r\n\r\ninterface DefaultPaginationProps<T> {\r\n table: Table<T>;\r\n rowsPerPageArray: number[];\r\n paginationOptions?: CraftTablePaginationProps;\r\n}\r\n\r\nfunction DefaultPagination<T>({\r\n table,\r\n rowsPerPageArray,\r\n paginationOptions,\r\n}: DefaultPaginationProps<T>) {\r\n const pageIndex = table.getState().pagination.pageIndex + 1;\r\n const pageCount = table.getPageCount();\r\n const pageSize = table.getState().pagination.pageSize;\r\n const rowCount = table.getRowCount();\r\n\r\n const recordsRangeFirst = pageIndex * pageSize - pageSize + 1;\r\n const recordsRangeLast = Math.min(pageIndex * pageSize, rowCount);\r\n\r\n const isFullView = paginationOptions?.paginationView === \"full\";\r\n\r\n return (\r\n <PaginationContainer>\r\n {isFullView && (\r\n <GoToPageContainer>\r\n <Typography variant=\"body2\" fontSize={14} mr={1}>\r\n Go to page:\r\n </Typography>\r\n <GoToPageInput\r\n defaultValue={pageIndex}\r\n type=\"number\"\r\n inputProps={{\r\n name: \"pagination-size\",\r\n min: 1,\r\n max: pageCount,\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n const page = e.currentTarget.value\r\n ? Number(e.currentTarget.value) - 1\r\n : 0;\r\n table.setPageIndex(page);\r\n }\r\n }}\r\n />\r\n </GoToPageContainer>\r\n )}\r\n\r\n <RowsPerPageContainer>\r\n {isFullView && (\r\n <Typography variant=\"body2\" fontSize={14} mr={1}>\r\n Rows per page:\r\n </Typography>\r\n )}\r\n <RowsPerPageSelect\r\n value={pageSize}\r\n onChange={(e) => table.setPageSize(Number(e.target.value))}\r\n >\r\n {rowsPerPageArray.map((size) => (\r\n <MenuItem key={size} value={size} sx={{ fontSize: 12 }}>\r\n {size}\r\n </MenuItem>\r\n ))}\r\n </RowsPerPageSelect>\r\n </RowsPerPageContainer>\r\n\r\n <RecordsRangeContainer>\r\n <strong>\r\n {recordsRangeFirst} – {recordsRangeLast} of {rowCount}\r\n </strong>\r\n </RecordsRangeContainer>\r\n\r\n {isFullView && (\r\n <PageRangeContainer>\r\n <strong>\r\n Page {pageIndex} of {pageCount}\r\n </strong>\r\n </PageRangeContainer>\r\n )}\r\n\r\n <PaginationButtons>\r\n {isFullView && (\r\n <PaginationButton\r\n title=\"First Page\"\r\n disabled={!table.getCanPreviousPage()}\r\n onClick={() => table.setPageIndex(0)}\r\n >\r\n <TableFirstPageIcon />\r\n </PaginationButton>\r\n )}\r\n\r\n <PaginationButton\r\n title=\"Previous Page\"\r\n disabled={!table.getCanPreviousPage()}\r\n onClick={() => table.previousPage()}\r\n >\r\n <NavigateBeforeRounded fontSize=\"small\" />\r\n </PaginationButton>\r\n\r\n <PaginationButton\r\n title=\"Next Page\"\r\n disabled={!table.getCanNextPage()}\r\n onClick={() => table.nextPage()}\r\n >\r\n <NavigateNextRounded fontSize=\"small\" />\r\n </PaginationButton>\r\n\r\n {isFullView && (\r\n <PaginationButton\r\n title=\"Last Page\"\r\n disabled={!table.getCanNextPage()}\r\n onClick={() => table.setPageIndex(pageCount - 1)}\r\n >\r\n <TableLastPageIcon />\r\n </PaginationButton>\r\n )}\r\n </PaginationButtons>\r\n </PaginationContainer>\r\n );\r\n}\r\n\r\nexport default DefaultPagination;\r\n","import { Column } from \"@tanstack/react-table\";\r\nimport { alignProps } from \"../../types/common\";\r\nimport { CSSProperties } from \"react\";\r\nimport axios from \"axios\";\r\n\r\nexport const formatClassName = (className: string): string => {\r\n return className.replace(/\\s+/g, \" \").trim();\r\n};\r\n\r\nexport const getColumnAlignment = (align: string) => {\r\n const contentAlignment = {\r\n left: \"flex-start\",\r\n center: \"center\",\r\n right: \"flex-end\",\r\n };\r\n\r\n const alignment = contentAlignment[(align as alignProps) || \"left\"];\r\n return alignment;\r\n};\r\n\r\nexport const getColumnPinningStyles = <T>(column: Column<T>): CSSProperties => {\r\n const isPinned = column.getIsPinned();\r\n const isLastLeftPinnedColumn =\r\n isPinned === \"left\" && column.getIsLastColumn(\"left\");\r\n const isFirstRightPinnedColumn =\r\n isPinned === \"right\" && column.getIsFirstColumn(\"right\");\r\n\r\n return {\r\n boxShadow: isLastLeftPinnedColumn\r\n ? \"-4px 0 4px -4px gray inset\"\r\n : isFirstRightPinnedColumn\r\n ? \"4px 0 4px -4px gray inset\"\r\n : undefined,\r\n background: \"inherit\",\r\n left: isPinned === \"left\" ? `${column.getStart(\"left\")}px` : undefined,\r\n right: isPinned === \"right\" ? `${column.getAfter(\"right\")}px` : undefined,\r\n position: isPinned ? \"sticky\" : \"relative\",\r\n width: column.getSize(),\r\n };\r\n};\r\n\r\nexport const getColumnPinningStylesBody = <T>(\r\n column: Column<T>\r\n): CSSProperties => {\r\n const isPinned = column.getIsPinned();\r\n const isLastLeftPinnedColumn =\r\n isPinned === \"left\" && column.getIsLastColumn(\"left\");\r\n const isFirstRightPinnedColumn =\r\n isPinned === \"right\" && column.getIsFirstColumn(\"right\");\r\n\r\n return {\r\n boxShadow: isLastLeftPinnedColumn\r\n ? \"-4px 0 4px -4px gray inset\"\r\n : isFirstRightPinnedColumn\r\n ? \"4px 0 4px -4px gray inset\"\r\n : undefined,\r\n background: \"inherit\",\r\n left: isPinned === \"left\" ? `${column.getStart(\"left\")}px` : undefined,\r\n right: isPinned === \"right\" ? `${column.getAfter(\"right\")}px` : undefined,\r\n position: isPinned ? \"sticky\" : \"relative\",\r\n width: column.getSize(),\r\n };\r\n};\r\n\r\nexport function customDebounce<T extends (...args: any[]) => any>(\r\n func: T,\r\n delay: number\r\n): (...args: Parameters<T>) => void {\r\n let timerId: ReturnType<typeof setTimeout> | null = null;\r\n\r\n return function (this: ThisParameterType<T>, ...args: Parameters<T>): void {\r\n if (timerId) clearTimeout(timerId);\r\n timerId = setTimeout(() => {\r\n func.apply(this, args);\r\n }, delay);\r\n };\r\n}\r\n\r\n//ENTITY TYPE\r\nconst ENVIRONMENT = \"adm_dev\";\r\nexport const ENTITY_TYPE = \"SCH\";\r\nexport const MAPPED_ENTITY_TYPE = \"LYPR\"; // LAP OR LYPR\r\nexport const USER_ID = 226;\r\n\r\nconst environments = {\r\n adm_dev: \"http://localhost:6010/api\",\r\n crm_dev: \"http://localhost:4011/api\",\r\n uat: \"https://api.eth-qa.rezolut.in/api/enrol\",\r\n};\r\n\r\nconst getBaseUrl = () => environments[ENVIRONMENT];\r\n\r\n// API INTEGRATION\r\nexport const api = axios.create({\r\n baseURL: getBaseUrl(),\r\n timeout: 10000,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n});\r\n\r\napi.interceptors.request.use(\r\n (config) => {\r\n const token = localStorage.getItem(\"authToken\");\r\n if (token) {\r\n config.headers.Authorization = `Bearer ${token}`;\r\n }\r\n return config;\r\n },\r\n (error) => {\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\nexport const formatTableHeaders = (columns: any) => {\r\n const mapped = columns.map((col: any) => {\r\n const meta =\r\n col.attribute_key === \"status\" ||\r\n col.attribute_key === \"lead_status\" ||\r\n col.attribute_key === \"flag\" ||\r\n col.attribute_key === \"invitation_status\"\r\n ? { type: \"custom\", propName: \"renderStatus\", align: col.align }\r\n : col.attribute_key === \"profile_image\" ||\r\n col.attribute_key === \"short_logo\"\r\n ? {\r\n type: \"custom\",\r\n propName: \"profileImageFetch\",\r\n align: col.align,\r\n }\r\n : col.attribute_key === \"start_date\" || col.attribute_key === \"end_date\"\r\n ? { type: \"custom\", propName: \"dateFormater\", align: col.align }\r\n : col.attribute_key === \"action\"\r\n ? { type: \"custom\", propName: \"renderAction\", align: col.align }\r\n : col.attribute_key === \"code\"\r\n ? {\r\n type: \"custom\",\r\n propName: \"drillCellRenderer\",\r\n align: col.align,\r\n }\r\n : col.attribute_key === \"primary_mobile\"\r\n ? {\r\n type: \"custom\",\r\n propName: \"apiCallonClick\",\r\n align: col.align,\r\n }\r\n : undefined;\r\n\r\n return {\r\n header: col.name ?? \"\",\r\n accessorKey: col.attribute_key ?? \"\",\r\n size: col.size,\r\n meta,\r\n };\r\n });\r\n\r\n return mapped;\r\n};\r\n","import { styled } from \"@mui/material\";\r\n\r\nexport const TableBodyRow = styled(\"tr\", {\r\n shouldForwardProp: (prop) =>\r\n prop !== \"hoverable\" &&\r\n prop !== \"selected\" &&\r\n prop !== \"striped\" &&\r\n prop !== \"expanded\",\r\n})<{\r\n hoverable?: boolean;\r\n selected?: boolean;\r\n striped?: boolean;\r\n expanded?: boolean;\r\n}>(({ theme, hoverable, selected, striped }) => ({\r\n backgroundColor: selected\r\n ? theme.palette.action.selected\r\n : theme.palette.background.paper,\r\n\r\n ...(striped && {\r\n \"&:nth-of-type(odd)\": {\r\n backgroundColor:\r\n theme.palette.mode === \"dark\"\r\n ? theme.palette.action.hover\r\n : theme.palette.grey[50],\r\n },\r\n }),\r\n\r\n ...(hoverable && {\r\n transition: \"background-color 0.2s ease, box-shadow 0.2s ease\",\r\n \"&:hover\": {\r\n boxShadow: `inset 0 2px 2px rgba(0,0,0,0.05),\r\n inset 0 -2px 2px rgba(0,0,0,0.05)`,\r\n },\r\n }),\r\n}));\r\n\r\nexport const TableBodyCell = styled(\"td\", {\r\n shouldForwardProp: (prop) =>\r\n prop !== \"compact\" &&\r\n prop !== \"isDragging\" &&\r\n prop !== \"isPinned\" &&\r\n prop !== \"wrap\",\r\n})<{\r\n compact?: boolean;\r\n isDragging?: boolean;\r\n isPinned?: boolean;\r\n wrap?: boolean;\r\n}>(({ theme, compact, isDragging, wrap }) => ({\r\n fontSize: theme.typography.pxToRem(14),\r\n padding: compact ? theme.spacing(0.5, 0.75) : theme.spacing(0.75, 1.25),\r\n borderBottom: `1px solid ${theme.palette.grey[200]}`,\r\n\r\n ...(wrap && {\r\n wordBreak: \"break-all\",\r\n whiteSpace: \"normal\",\r\n }),\r\n\r\n ...(isDragging && {\r\n opacity: 0.85,\r\n backgroundColor: theme.palette.action.hover,\r\n }),\r\n}));\r\n","import { useSortable } from \"@dnd-kit/sortable\";\r\nimport { CSS } from \"@dnd-kit/utilities\";\r\nimport { Cell, flexRender } from \"@tanstack/react-table\";\r\nimport { align } from \"../../types/common\";\r\nimport { getColumnPinningStylesBody } from \"../../libs/utils/common\";\r\nimport {\r\n CraftTableFeatureProps,\r\n CraftTableOptionsProps,\r\n} from \"../../types/table-options\";\r\nimport { TableBodyCell } from \"./table-body.styles\";\r\n\r\ninterface DragAlongCellProps<T> {\r\n cell: Cell<T, unknown>;\r\n featureOptions: CraftTableFeatureProps;\r\n tableStates: CraftTableOptionsProps;\r\n}\r\n\r\nfunction DragAlongCell<T>({\r\n cell,\r\n // featureOptions,\r\n tableStates,\r\n}: DragAlongCellProps<T>) {\r\n const { isDragging, setNodeRef, transform } = useSortable({\r\n id: cell.column.id,\r\n });\r\n // const { enableWordBreakAll } = featureOptions;\r\n const { wrapColumns } = tableStates;\r\n\r\n const isPinned = cell.column.getIsPinned();\r\n\r\n return (\r\n <TableBodyCell\r\n ref={setNodeRef}\r\n align={(cell.column.columnDef.meta as align)?.align || \"left\"}\r\n style={{\r\n opacity: isDragging ? 0.8 : 1,\r\n transform: CSS.Translate.toString(transform),\r\n transition: \"width transform 0.2s ease-in-out\",\r\n width: cell.column.getSize(),\r\n ...getColumnPinningStylesBody(cell.column),\r\n ...((wrapColumns.all_wrap || wrapColumns[cell.column.id]) && {\r\n wordBreak: \"break-all\",\r\n whiteSpace: \"normal\",\r\n }),\r\n zIndex: isPinned ? 2 : isDragging ? 1 : 0,\r\n }}\r\n >\r\n {cell.getIsPlaceholder()\r\n ? null\r\n : flexRender(cell.column.columnDef.cell, cell.getContext())}\r\n </TableBodyCell>\r\n );\r\n}\r\n\r\nexport default DragAlongCell;\r\n","import React, { useEffect, useRef } from \"react\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\n\r\ninterface CheckboxProps {\r\n type?: \"checkbox\";\r\n checked: boolean;\r\n disabled?: boolean;\r\n onChange: (checked: boolean) => void;\r\n indeterminate?: boolean;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nconst Checkbox = ({\r\n checked = false,\r\n disabled = false,\r\n onChange = () => {},\r\n indeterminate = false,\r\n className,\r\n style,\r\n ...props\r\n}: CheckboxProps) => {\r\n const id = uuidv4();\r\n const [check, setCheck] = React.useState<boolean>(checked);\r\n const ref = useRef(null);\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const isChecked = e.target.checked;\r\n setCheck(isChecked);\r\n\r\n if (onChange) onChange(isChecked);\r\n };\r\n\r\n useEffect(() => {\r\n setCheck(checked);\r\n }, [checked]);\r\n\r\n useEffect(() => {\r\n if (ref.current) {\r\n (ref.current as HTMLInputElement).indeterminate = indeterminate;\r\n }\r\n }, [indeterminate]);\r\n\r\n return (\r\n <input\r\n id={id}\r\n ref={ref}\r\n type=\"checkbox\"\r\n checked={check}\r\n onChange={handleChange}\r\n disabled={disabled}\r\n className={className}\r\n {...props}\r\n />\r\n );\r\n};\r\n\r\nexport default Checkbox;\r\n","import React from \"react\";\r\nimport {\r\n ColumnOrderState,\r\n flexRender,\r\n Row,\r\n Table,\r\n} from \"@tanstack/react-table\";\r\nimport {\r\n CraftTableFeatureProps,\r\n CraftTableOptionsProps,\r\n} from \"../../types/table-options\";\r\nimport { align } from \"../../types/common\";\r\nimport DragAlongCell from \"./table-body-dnd-cell\";\r\nimport {\r\n horizontalListSortingStrategy,\r\n SortableContext,\r\n} from \"@dnd-kit/sortable\";\r\nimport { getColumnPinningStylesBody } from \"../../libs/utils/common\";\r\nimport Checkbox from \"../inputs/checkbox\";\r\nimport { TableBodyCell, TableBodyRow } from \"./table-body.styles\";\r\n\r\ninterface TableBodyProps<T> {\r\n table: Table<T>;\r\n featureOptions: CraftTableFeatureProps;\r\n NestedComponent?: React.ComponentType<{ row: Row<T> }>;\r\n columnOrder: ColumnOrderState;\r\n tableStates: CraftTableOptionsProps;\r\n}\r\n\r\nfunction TableBody<T>({\r\n table,\r\n featureOptions,\r\n NestedComponent,\r\n columnOrder,\r\n tableStates,\r\n}: TableBodyProps<T>) {\r\n const { enableColumnReordering, enableRowSelection } = featureOptions;\r\n\r\n const { wrapColumns } = tableStates;\r\n\r\n const renderRow = (row: Row<T>) => {\r\n const renderedRow = (\r\n <TableBodyRow\r\n key={row?.id}\r\n hoverable\r\n striped={featureOptions.striped}\r\n selected={row.getIsSelected()}\r\n expanded={row.getIsExpanded()}\r\n >\r\n {enableRowSelection && (\r\n <TableBodyCell\r\n style={{\r\n position: \"sticky\",\r\n left: 0,\r\n width: \"50px\",\r\n }}\r\n >\r\n <Checkbox\r\n checked={row.getIsSelected()}\r\n indeterminate={row.getIsSomeSelected()}\r\n onChange={row.getToggleSelectedHandler()}\r\n className=\"checkbox__input\"\r\n />\r\n </TableBodyCell>\r\n )}\r\n\r\n {row?.getVisibleCells()?.map((cell) => {\r\n return enableColumnReordering ? (\r\n <SortableContext\r\n key={cell.id}\r\n items={columnOrder}\r\n strategy={horizontalListSortingStrategy}\r\n >\r\n <DragAlongCell\r\n cell={cell}\r\n featureOptions={featureOptions}\r\n tableStates={tableStates}\r\n />\r\n </SortableContext>\r\n ) : (\r\n <TableBodyCell\r\n style={{\r\n ...getColumnPinningStylesBody(cell.column),\r\n width: cell.column.getSize(),\r\n ...((wrapColumns.all_wrap || wrapColumns[cell.column.id]) && {\r\n wordBreak: \"break-all\",\r\n whiteSpace: \"normal\",\r\n }),\r\n }}\r\n align={(cell.column.columnDef.meta as align)?.align || \"left\"}\r\n >\r\n {flexRender(cell?.column?.columnDef?.cell, cell?.getContext())}\r\n </TableBodyCell>\r\n );\r\n })}\r\n </TableBodyRow>\r\n );\r\n\r\n if (row.getIsExpanded()) {\r\n return (\r\n <React.Fragment key={row.id}>\r\n {renderedRow}\r\n {NestedComponent && (\r\n <TableBodyRow\r\n hoverable\r\n striped={featureOptions.striped}\r\n selected={row.getIsSelected()}\r\n expanded={row.getIsExpanded()}\r\n >\r\n {<NestedComponent {...{ row }} />}\r\n </TableBodyRow>\r\n )}\r\n </React.Fragment>\r\n );\r\n } else {\r\n return renderedRow;\r\n }\r\n };\r\n\r\n return (\r\n <tbody>{table?.getRowModel()?.rows?.map((row) => renderRow(row))}</tbody>\r\n );\r\n}\r\n\r\nexport default TableBody;\r\n","// columnResize.styles.ts\r\nimport { Box } from \"@mui/material\";\r\nimport { styled } from \"@mui/material/styles\";\r\n\r\nexport const ColumnResizeHandle = styled(Box, {\r\n shouldForwardProp: (prop) => prop !== \"isResizing\",\r\n})<{ isResizing?: boolean }>(({ theme, isResizing }) => ({\r\n position: \"absolute\",\r\n top: 0,\r\n right: 0,\r\n height: \"100%\",\r\n width: theme.spacing(0.5),\r\n cursor: \"col-resize\",\r\n userSelect: \"none\",\r\n touchAction: \"none\",\r\n opacity: isResizing ? 1 : 0,\r\n background: isResizing ? \"rgba(0, 0, 0, 0.8)\" : \"rgba(0, 0, 0, 0.5)\",\r\n\r\n \"&:hover\": {\r\n opacity: 1,\r\n },\r\n}));\r\n\r\nexport const TableHeadButton = styled(Box)(({ theme }) => ({\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n cursor: \"pointer\",\r\n transition: \"transform 0.15s ease\",\r\n\r\n \"&:hover\": {\r\n transform: \"scale(1.1)\",\r\n },\r\n\r\n \"& svg\": {\r\n color: theme.palette.grey[700],\r\n },\r\n}));\r\n\r\nexport const TableHeadSort = styled(Box, {\r\n shouldForwardProp: (prop) => prop !== \"sortable\",\r\n})<{ sortable?: boolean }>(({ theme, sortable }) => ({\r\n userSelect: sortable ? \"none\" : \"auto\",\r\n fontSize: theme.typography.pxToRem(14),\r\n\r\n \"& svg\": {\r\n marginLeft: \"0.25rem\",\r\n },\r\n}));\r\n\r\nexport const TableDndButton = styled(Box)(({ theme }) => ({\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n color: theme.palette.grey[600],\r\n cursor: \"grab\",\r\n transition: \"transform 0.15s ease, color 0.15s ease\",\r\n\r\n \"&:hover\": {\r\n transform: \"scale(1.1)\",\r\n color: theme.palette.grey[900],\r\n cursor: \"grabbing\",\r\n },\r\n}));\r\n\r\nexport const TableHeadContent = styled(Box)(({ theme }) => ({\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n gap: theme.spacing(1),\r\n}));\r\n\r\nexport const TableHeadRoot = styled(\"thead\", {\r\n shouldForwardProp: (prop) => prop !== \"sticky\",\r\n})<{ sticky?: boolean }>(({ sticky }) => ({\r\n position: sticky ? \"sticky\" : \"relative\",\r\n top: sticky ? 0 : \"auto\",\r\n zIndex: sticky ? 3 : \"auto\",\r\n}));\r\n\r\nexport const TableHeadRow = styled(\"tr\", {\r\n shouldForwardProp: (prop) => prop !== \"striped\",\r\n})<{ striped?: boolean }>(({ theme, striped }) => ({\r\n backgroundColor: striped\r\n ? theme.palette.common.white\r\n : theme.palette.grey[50],\r\n}));\r\n\r\nexport const TableHeadCell = styled(\"th\", {\r\n shouldForwardProp: (prop) =>\r\n prop !== \"compact\" && prop !== \"isDragging\" && prop !== \"isPinned\",\r\n})<{\r\n compact?: boolean;\r\n isDragging?: boolean;\r\n isPinned?: boolean;\r\n sticky?: boolean;\r\n}>(({ theme, compact, isDragging, isPinned, sticky }) => ({\r\n position: \"relative\",\r\n padding: compact ? theme.spacing(0.5, 0.75) : theme.spacing(0.75, 1.25),\r\n border: `0.5px solid ${theme.palette.grey[200]}`,\r\n cursor: \"pointer\",\r\n backgroundColor: theme.palette.common.white,\r\n userSelect: \"none\",\r\n // smoother drag feedback\r\n opacity: isDragging ? 0.8 : 1,\r\n zIndex: isPinned ? 3 : isDragging ? 1 : 0,\r\n\r\n ...(sticky && {\r\n position: \"sticky\",\r\n left: 0,\r\n zIndex: 4,\r\n }),\r\n}));\r\n","import { IconPinOffOutline } from \"../../../assets/svg\";\r\nimport { TableHeaderProps } from \"../../types/table\";\r\nimport { TableHeadButton } from \"./table-head.styles\";\r\n\r\nfunction TableHeadPin<T>({ header }: TableHeaderProps<T>) {\r\n // ! Header now is pinned via dropdown on table head\r\n // if (header.column.getIsPinned() !== \"left\") {\r\n // return (\r\n // <TableHeadButton onClick={() => header.column.pin(\"left\")}>\r\n // {/* <IconPinOutline /> */}\r\n // </TableHeadButton>\r\n // );\r\n // }\r\n\r\n return (\r\n header.column.getIsPinned() && (\r\n <TableHeadButton\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n header.column.pin(false);\r\n }}\r\n >\r\n <IconPinOffOutline />\r\n </TableHeadButton>\r\n )\r\n );\r\n}\r\n\r\nexport default TableHeadPin;\r\n","import {\r\n Popover,\r\n List,\r\n ListItemButton,\r\n ListItemText,\r\n ListItemIcon,\r\n Switch,\r\n} from \"@mui/material\";\r\nimport { Header } from \"@tanstack/react-table\";\r\nimport {\r\n UpArrow,\r\n DownArrow,\r\n HideIcon,\r\n IconPinOffOutline,\r\n IconPinOutline,\r\n} from \"../../../assets/svg\";\r\nimport {\r\n craftTableFilterSettingsOptionsProps,\r\n CraftTableOptionsProps,\r\n} from \"../../types/table-options\";\r\nimport { useFullscreenPopoverContainer } from \"../../libs/hooks/useFullScreen\";\r\n\r\ntype Props<T> = {\r\n anchorEl: HTMLElement | null;\r\n activeTab?: string;\r\n onClose: () => void;\r\n header: Header<T, unknown>;\r\n tableStates: CraftTableOptionsProps;\r\n filterSettingStates?: craftTableFilterSettingsOptionsProps;\r\n onSaveSettings?: (columnId: string) => void;\r\n};\r\n\r\nfunction TableHeadPopover<T>({\r\n anchorEl,\r\n onClose,\r\n header,\r\n tableStates,\r\n onSaveSettings,\r\n}: Props<T>) {\r\n const open = Boolean(anchorEl);\r\n const column = header.column;\r\n const isPinned = column.getIsPinned() === \"left\";\r\n const { container: fullscreenContainer } = useFullscreenPopoverContainer();\r\n const { wrapColumns, setWrapColumns } = tableStates;\r\n\r\n const toggleWrapForColumn = (columnId: string) => {\r\n setWrapColumns((prev: Record<string, boolean>) => ({\r\n ...prev,\r\n [columnId]: !prev[columnId],\r\n all_wrap: false,\r\n }));\r\n };\r\n const handleUpdateSettings = (columnId: string) => {\r\n onSaveSettings && onSaveSettings(columnId);\r\n };\r\n\r\n return (\r\n <Popover\r\n open={open}\r\n anchorEl={anchorEl}\r\n onClose={onClose}\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"left\" }}\r\n container={fullscreenContainer}\r\n >\r\n <List dense>\r\n <ListItemButton onClick={() => column.toggleSorting(false)}>\r\n <ListItemIcon>\r\n <UpArrow />\r\n </ListItemIcon>\r\n <ListItemText primary=\"Sort ascending\" />\r\n </ListItemButton>\r\n <ListItemButton onClick={() => column.toggleSorting(true)}>\r\n <ListItemIcon>\r\n <DownArrow />\r\n </ListItemIcon>\r\n <ListItemText primary=\"Sort descending\" />\r\n </ListItemButton>\r\n <ListItemButton onClick={() => handleUpdateSettings(column?.id)}>\r\n <ListItemIcon>\r\n <HideIcon />\r\n </ListItemIcon>\r\n <ListItemText primary=\"Hide in view\" />\r\n </ListItemButton>\r\n <ListItemButton\r\n onClick={() => {\r\n column.pin(isPinned ? false : \"left\");\r\n }}\r\n >\r\n <ListItemIcon>\r\n {isPinned ? <IconPinOffOutline /> : <IconPinOutline />}\r\n </ListItemIcon>\r\n <ListItemText\r\n primary={isPinned ? \"Unfreeze column\" : \"Freeze column\"}\r\n />\r\n </ListItemButton>\r\n\r\n <ListItemButton>\r\n <ListItemText primary=\"Wrap Cell\" />\r\n <Switch\r\n checked={wrapColumns.all_wrap || wrapColumns[column.id]}\r\n onChange={() => toggleWrapForColumn(column.id)}\r\n />\r\n </ListItemButton>\r\n </List>\r\n </Popover>\r\n );\r\n}\r\n\r\nexport default TableHeadPopover;\r\n","import { Header } from \"@tanstack/react-table\";\r\nimport { ColumnResizeHandle } from \"./table-head.styles\";\r\n\r\ninterface Props<T> {\r\n header: Header<T, unknown>;\r\n}\r\n\r\nfunction TableColumnResizeHandle<T>({ header }: Props<T>) {\r\n return (\r\n <ColumnResizeHandle\r\n isResizing={header.column.getIsResizing()}\r\n onDoubleClick={() => header.column.resetSize()}\r\n onMouseDown={header.getResizeHandler()}\r\n onTouchStart={header.getResizeHandler()}\r\n className={`column__resize ${\r\n header.column.getIsResizing() ? \"is__resizing\" : \"\"\r\n }`}\r\n />\r\n );\r\n}\r\n\r\nexport default TableColumnResizeHandle;\r\n","import { flexRender } from \"@tanstack/react-table\";\r\nimport { useSortable } from \"@dnd-kit/sortable\";\r\nimport { useState } from \"react\";\r\nimport { CSS } from \"@dnd-kit/utilities\";\r\nimport { DownArrow, DragHandleIcon, UpArrow } from \"../../../assets/svg\";\r\nimport { getColumnPinningStyles } from \"../../libs/utils/common\";\r\nimport { TableHeaderProps } from \"../../types/table\";\r\nimport TableHeadPin from \"./table-head-pin\";\r\nimport TableHeadPopover from \"./table-head-popover\";\r\nimport TableColumnResizeHandle from \"./table-head-resizer\";\r\nimport {\r\n TableDndButton,\r\n TableHeadCell,\r\n TableHeadContent,\r\n TableHeadSort,\r\n} from \"./table-head.styles\";\r\nimport { Box } from \"@mui/material\";\r\n\r\nfunction DraggableTableHeader<T>({\r\n header,\r\n activeTab,\r\n featureOptions,\r\n tableStates,\r\n onSaveSettings,\r\n}: TableHeaderProps<T>) {\r\n const { enableColumnPinning } = featureOptions;\r\n\r\n // Popover\r\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\r\n\r\n const handleMenuToggle = (event: React.MouseEvent<HTMLElement>) => {\r\n if (header.column.getIsResizing()) return;\r\n\r\n setAnchorEl((prev) => (prev ? null : event.currentTarget));\r\n };\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const { isDragging, transform, attributes, listeners } = useSortable({\r\n id: header.column.id,\r\n });\r\n\r\n const isPinned = header.column.getIsPinned();\r\n\r\n return (\r\n <TableHeadCell\r\n onMouseLeave={handleClose}\r\n colSpan={header.colSpan}\r\n compact={featureOptions?.compactTable}\r\n isDragging={isDragging}\r\n isPinned={Boolean(isPinned)}\r\n style={{\r\n width: `${header.column.getSize()}px`,\r\n minWidth: `${header.column.columnDef.minSize ?? 180}px`,\r\n maxWidth: `${header.column.columnDef.maxSize}px`,\r\n transform: CSS.Translate.toString(transform),\r\n transition: \"width transform 0.2s ease-in-out\",\r\n ...getColumnPinningStyles(header.column),\r\n }}\r\n >\r\n {header.isPlaceholder ? null : (\r\n <TableHeadContent onClick={handleMenuToggle}>\r\n <TableHeadSort sortable={header.column.getCanSort()}>\r\n {flexRender(header.column.columnDef.header, header.getContext())}\r\n </TableHeadSort>\r\n\r\n <Box\r\n display={\"flex\"}\r\n alignItems={\"center\"}\r\n justifyContent={\"center\"}\r\n gap={0.5}\r\n >\r\n {{\r\n asc: <UpArrow />,\r\n desc: <DownArrow />,\r\n }[header.column.getIsSorted() as \"asc\" | \"desc\"] ?? null}\r\n\r\n {enableColumnPinning && (\r\n <TableHeadPin\r\n header={header}\r\n featureOptions={featureOptions}\r\n tableStates={tableStates}\r\n />\r\n )}\r\n\r\n <TableDndButton {...attributes} {...listeners}>\r\n <DragHandleIcon />\r\n </TableDndButton>\r\n </Box>\r\n </TableHeadContent>\r\n )}\r\n\r\n {/* column resizing */}\r\n {header.column.getCanResize() ? (\r\n <TableColumnResizeHandle header={header} />\r\n ) : null}\r\n\r\n {/* Popover */}\r\n <TableHeadPopover\r\n anchorEl={anchorEl}\r\n activeTab={activeTab}\r\n onClose={handleClose}\r\n header={header}\r\n tableStates={tableStates}\r\n onSaveSettings={onSaveSettings}\r\n />\r\n </TableHeadCell>\r\n );\r\n}\r\n\r\nexport default DraggableTableHeader;\r\n","import {\r\n ColumnOrderState,\r\n flexRender,\r\n Header,\r\n Table,\r\n} from \"@tanstack/react-table\";\r\nimport {\r\n CraftTableFeatureProps,\r\n craftTableFilterSettingsOptionsProps,\r\n CraftTableOptionsProps,\r\n} from \"../../types/table-options\";\r\nimport { DownArrow, UpArrow } from \"../../../assets/svg\";\r\nimport { useState } from \"react\";\r\nimport { getColumnPinningStyles } from \"../../libs/utils/common\";\r\nimport {\r\n horizontalListSortingStrategy,\r\n SortableContext,\r\n} from \"@dnd-kit/sortable\";\r\nimport DraggableTableHeader from \"./table-head-dnd-cell\";\r\nimport TableHeadPin from \"./table-head-pin\";\r\nimport Checkbox from \"../inputs/checkbox\";\r\nimport TableColumnResizeHandle from \"./table-head-resizer\";\r\nimport {\r\n TableHeadCell,\r\n TableHeadContent,\r\n TableHeadRoot,\r\n TableHeadRow,\r\n TableHeadSort,\r\n} from \"./table-head.styles\";\r\n\r\ninterface TableHeadProps<T> {\r\n table: Table<T>;\r\n activeTab?: string;\r\n featureOptions: CraftTableFeatureProps;\r\n columnOrder: ColumnOrderState;\r\n tableStates: CraftTableOptionsProps;\r\n filterSettingStates: craftTableFilterSettingsOptionsProps;\r\n onSaveSettings?: (columnId: string) => void;\r\n}\r\n\r\nfunction TableHead<T>({\r\n table,\r\n activeTab,\r\n featureOptions,\r\n columnOrder,\r\n tableStates,\r\n filterSettingStates,\r\n onSaveSettings,\r\n}: TableHeadProps<T>) {\r\n const {\r\n stickyHeader,\r\n enableColumnReordering,\r\n enableColumnPinning,\r\n enableRowSelection,\r\n } = featureOptions;\r\n\r\n // Popover\r\n const [, setAnchorEl] = useState<HTMLElement | null>(null);\r\n\r\n const handleMenuToggle = (\r\n event: React.MouseEvent<HTMLElement>,\r\n header: Header<T, unknown>\r\n ) => {\r\n if (header.column.getIsResizing()) return;\r\n\r\n setAnchorEl((prev) => (prev ? null : event.currentTarget));\r\n };\r\n\r\n return (\r\n <TableHeadRoot sticky={stickyHeader}>\r\n {table.getHeaderGroups().map((headerGroup) => (\r\n <TableHeadRow striped={featureOptions.striped} key={headerGroup?.id}>\r\n {enableRowSelection && (\r\n <TableHeadCell\r\n sticky\r\n compact={featureOptions.compactTable}\r\n style={{ width: 50 }}\r\n >\r\n <TableHeadContent>\r\n <Checkbox\r\n checked={table.getIsAllRowsSelected()}\r\n indeterminate={table.getIsSomeRowsSelected()}\r\n onChange={() => table.toggleAllRowsSelected()}\r\n />\r\n </TableHeadContent>\r\n </TableHeadCell>\r\n )}\r\n\r\n {headerGroup.headers.map((header) => {\r\n return enableColumnReordering ? (\r\n <SortableContext\r\n key={header?.id}\r\n items={columnOrder}\r\n strategy={horizontalListSortingStrategy}\r\n >\r\n <DraggableTableHeader\r\n header={header}\r\n activeTab={activeTab}\r\n featureOptions={featureOptions}\r\n tableStates={tableStates}\r\n filterSettingStates={filterSettingStates}\r\n onSaveSettings={onSaveSettings}\r\n />\r\n </SortableContext>\r\n ) : (\r\n <TableHeadCell\r\n key={header?.id}\r\n colSpan={header.colSpan}\r\n compact={featureOptions.compactTable}\r\n style={{\r\n ...getColumnPinningStyles(header.column),\r\n width: `${header.column.getSize()}px`,\r\n minWidth: `${header.column.columnDef.minSize}px`,\r\n maxWidth: `${header.column.columnDef.maxSize}px`,\r\n }}\r\n >\r\n {header.isPlaceholder ? null : (\r\n <TableHeadContent\r\n onClick={(event) => handleMenuToggle(event, header)}\r\n >\r\n <TableHeadSort sortable={header.column.getCanSort()}>\r\n {flexRender(\r\n header.column.columnDef.header,\r\n header.getContext()\r\n )}\r\n\r\n {{ asc: <UpArrow />, desc: <DownArrow /> }[\r\n header.column.getIsSorted() as \"asc\" | \"desc\"\r\n ] ?? null}\r\n </TableHeadSort>\r\n\r\n {enableColumnPinning && (\r\n <TableHeadPin\r\n header={header}\r\n featureOptions={featureOptions}\r\n tableStates={tableStates}\r\n />\r\n )}\r\n </TableHeadContent>\r\n )}\r\n\r\n {/* column resizing */}\r\n {header.column.getCanResize() ? (\r\n <TableColumnResizeHandle header={header} />\r\n ) : null}\r\n\r\n {/* Popover */}\r\n {/* <TableHeadPopover\r\n anchorEl={anchorEl}\r\n onClose={handleClose}\r\n header={header}\r\n wrap={wrap}\r\n tableStates={tableStates}\r\n /> */}\r\n </TableHeadCell>\r\n );\r\n })}\r\n </TableHeadRow>\r\n ))}\r\n </TableHeadRoot>\r\n );\r\n}\r\n\r\nexport default TableHead;\r\n","import { formatClassName } from \"../libs/utils/common\";\r\nimport { CraftTableComponentProps } from \"../types/table\";\r\nimport TableBody from \"./table-body/table-body\";\r\nimport TableHead from \"./table-head/table-head\";\r\n\r\nfunction Table<T>({\r\n table,\r\n activeTab,\r\n featureOptions,\r\n NestedComponent,\r\n columnOrder,\r\n isCompactTable,\r\n tableStates,\r\n filterSettingStates,\r\n onSaveSettings,\r\n}: CraftTableComponentProps<T>) {\r\n const { striped } = featureOptions;\r\n\r\n return (\r\n <table\r\n className={formatClassName(\r\n `ts__table ${striped ? \"ts--striped\" : \"\"} ${\r\n isCompactTable ? \"ts--compact\" : \"\"\r\n }`\r\n )}\r\n >\r\n <TableHead\r\n table={table}\r\n activeTab={activeTab}\r\n featureOptions={featureOptions}\r\n columnOrder={columnOrder}\r\n tableStates={tableStates}\r\n filterSettingStates={filterSettingStates}\r\n onSaveSettings={onSaveSettings}\r\n />\r\n <TableBody\r\n table={table}\r\n featureOptions={featureOptions}\r\n NestedComponent={NestedComponent}\r\n columnOrder={columnOrder}\r\n tableStates={tableStates}\r\n />\r\n </table>\r\n );\r\n}\r\n\r\nexport default Table;\r\n","import {\r\n closestCenter,\r\n DndContext,\r\n DragEndEvent,\r\n KeyboardSensor,\r\n MouseSensor,\r\n SensorDescriptor,\r\n SensorOptions,\r\n TouchSensor,\r\n useSensor,\r\n useSensors,\r\n} from \"@dnd-kit/core\";\r\nimport { CraftTableComponentProps } from \"../types/table\";\r\nimport Table from \"./table\";\r\nimport { restrictToHorizontalAxis } from \"@dnd-kit/modifiers\";\r\nimport { arrayMove } from \"@dnd-kit/sortable\";\r\n\r\nfunction TableDND<T>({\r\n table,\r\n activeTab,\r\n featureOptions,\r\n NestedComponent,\r\n columnOrder,\r\n setColumnOrder,\r\n isCompactTable,\r\n tableStates,\r\n filterSettingStates,\r\n onSaveSettings,\r\n}: CraftTableComponentProps<T>) {\r\n const sensors: SensorDescriptor<SensorOptions>[] = useSensors(\r\n useSensor(MouseSensor, {}),\r\n useSensor(TouchSensor, {}),\r\n useSensor(KeyboardSensor, {})\r\n );\r\n\r\n const handleDragEnd = (event: DragEndEvent) => {\r\n const { active, over } = event;\r\n if (active && over && active.id !== over.id) {\r\n setColumnOrder((columnOrder) => {\r\n const oldIndex = columnOrder.indexOf(active.id as string);\r\n const newIndex = columnOrder.indexOf(over.id as string);\r\n return arrayMove(columnOrder, oldIndex, newIndex);\r\n });\r\n }\r\n };\r\n\r\n return (\r\n <DndContext\r\n collisionDetection={closestCenter}\r\n modifiers={[restrictToHorizontalAxis]}\r\n onDragEnd={handleDragEnd}\r\n sensors={sensors}\r\n >\r\n <Table\r\n table={table}\r\n activeTab={activeTab}\r\n featureOptions={featureOptions}\r\n NestedComponent={NestedComponent}\r\n columnOrder={columnOrder}\r\n setColumnOrder={setColumnOrder}\r\n isCompactTable={isCompactTable}\r\n tableStates={tableStates}\r\n filterSettingStates={filterSettingStates}\r\n onSaveSettings={onSaveSettings}\r\n />\r\n </DndContext>\r\n );\r\n}\r\n\r\nexport default TableDND;\r\n","// tableTabs.styles.ts\r\nimport { styled } from \"@mui/material/styles\";\r\nimport Tabs, { tabsClasses } from \"@mui/material/Tabs\";\r\nimport Tab, { tabClasses } from \"@mui/material/Tab\";\r\nimport Box from \"@mui/material/Box\";\r\n\r\nexport const TableTabsRoot = styled(Tabs)(({ theme }) => ({\r\n minHeight: theme.spacing(3.5),\r\n\r\n [`& .${tabsClasses.flexContainer}`]: {\r\n minHeight: theme.spacing(3.5),\r\n },\r\n\r\n // hide indicator (instead of slotProps every time)\r\n [`& .${tabsClasses.indicator}`]: {\r\n display: \"none\",\r\n },\r\n}));\r\n\r\nexport const TableTab = styled(Tab)(({ theme }) => ({\r\n color: theme.palette.grey[600],\r\n padding: theme.spacing(1, 1.5),\r\n minHeight: theme.spacing(3.5),\r\n maxHeight: theme.spacing(3.5),\r\n textTransform: \"none\",\r\n minWidth: \"unset\",\r\n whiteSpace: \"nowrap\",\r\n\r\n [`&.${tabClasses.selected}`]: {\r\n color: theme.palette.text.primary,\r\n fontWeight: 700,\r\n },\r\n}));\r\n\r\nexport const TableTabCount = styled(Box, {\r\n shouldForwardProp: (prop) => prop !== \"selected\",\r\n})<{ selected?: boolean }>(({ theme, selected }) => ({\r\n padding: theme.spacing(0.25),\r\n borderRadius: theme.shape.borderRadius,\r\n border: `1px solid ${\r\n selected ? theme.palette.text.primary : theme.palette.grey[700]\r\n }`,\r\n color: selected ? theme.palette.common.white : theme.palette.text.primary,\r\n backgroundColor: selected ? theme.palette.text.primary : \"transparent\",\r\n fontWeight: selected ? 500 : 400,\r\n lineHeight: 1,\r\n minWidth: 20,\r\n textAlign: \"center\",\r\n}));\r\n","import React, { useState } from \"react\";\r\nimport {\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n DialogActions,\r\n Typography,\r\n TextField,\r\n Button,\r\n IconButton,\r\n Box,\r\n SxProps,\r\n} from \"@mui/material\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport { Theme } from \"@emotion/react\";\r\n\r\n// Types for the component props\r\nexport interface ModalButton {\r\n label: string;\r\n onClick: (inputValue?: string, error?: string, setError?: any) => void;\r\n variant?: \"text\" | \"outlined\" | \"contained\";\r\n color?: \"primary\" | \"secondary\" | \"error\" | \"info\" | \"success\" | \"warning\";\r\n disabled?: boolean;\r\n sx?: SxProps<Theme>;\r\n}\r\n\r\nexport interface InputField {\r\n label: string;\r\n placeholder?: string;\r\n required?: boolean;\r\n type?: \"text\" | \"email\" | \"password\" | \"number\";\r\n multiline?: boolean;\r\n rows?: number;\r\n defaultValue?: string;\r\n labelClassName?: string;\r\n}\r\n\r\nexport interface ConfirmModalProps {\r\n open: boolean;\r\n onClose: () => void;\r\n title: string;\r\n description?: string;\r\n buttons: ModalButton[];\r\n input?: InputField;\r\n maxWidth?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\r\n fullWidth?: boolean;\r\n className?: string;\r\n}\r\n\r\nconst ConfirmModal: React.FC<ConfirmModalProps> = ({\r\n open,\r\n onClose,\r\n title,\r\n description,\r\n buttons,\r\n input,\r\n maxWidth = \"sm\",\r\n fullWidth = true,\r\n}) => {\r\n const [inputValue, setInputValue] = useState(input?.defaultValue || \"\");\r\n const [error, setError] = useState(\"\");\r\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setInputValue(event.target.value);\r\n };\r\n\r\n const handleButtonClick = (button: ModalButton) => {\r\n if (input) {\r\n button.onClick(inputValue, error, setError);\r\n } else {\r\n button.onClick();\r\n }\r\n setInputValue(\"\");\r\n };\r\n\r\n const handleClose = () => {\r\n setInputValue(input?.defaultValue || \"\");\r\n onClose();\r\n };\r\n\r\n return (\r\n <Dialog\r\n open={open}\r\n onClose={(event, reason) => {\r\n if (reason !== \"backdropClick\" && reason !== \"escapeKeyDown\") {\r\n handleClose();\r\n }\r\n }}\r\n maxWidth={maxWidth}\r\n fullWidth={fullWidth}\r\n PaperProps={{\r\n sx: {\r\n borderRadius: 2,\r\n padding: 1,\r\n },\r\n }}\r\n >\r\n <DialogTitle\r\n sx={{\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n // padding: \"16px 0px\",\r\n px: \"0px\",\r\n marginX: \"24px\",\r\n paddingBottom: description ? \"18px\" : \"20px\",\r\n borderBottom: \"1px solid #eeeeee\",\r\n }}\r\n >\r\n <Typography variant=\"h6\" component=\"h2\" fontWeight=\"bold\">\r\n {title}\r\n </Typography>\r\n <IconButton\r\n onClick={handleClose}\r\n size=\"small\"\r\n sx={{\r\n color: \"text.secondary\",\r\n }}\r\n >\r\n <CloseIcon />\r\n </IconButton>\r\n </DialogTitle>\r\n\r\n <DialogContent sx={{ padding: \"0 24px 16px 24px\", mt: 2 }}>\r\n {description && (\r\n <Typography\r\n variant=\"body2\"\r\n color=\"text.secondary\"\r\n sx={{ marginBottom: input ? 3 : 0 }}\r\n >\r\n {description}\r\n </Typography>\r\n )}\r\n\r\n {input && (\r\n <Box sx={{ marginTop: description ? 0 : 2 }}>\r\n <Typography\r\n variant=\"body2\"\r\n component=\"label\"\r\n className={input.labelClassName}\r\n sx={{\r\n display: \"block\",\r\n marginBottom: 1,\r\n fontWeight: 500,\r\n color: \"text.primary\",\r\n }}\r\n >\r\n {input.label}\r\n {input.required && (\r\n <Typography component=\"span\" color=\"error.main\">\r\n {\" \"}\r\n *\r\n </Typography>\r\n )}\r\n </Typography>\r\n <TextField\r\n fullWidth\r\n value={inputValue}\r\n onChange={handleInputChange}\r\n placeholder={input.placeholder}\r\n type={input.type || \"text\"}\r\n multiline={input.multiline}\r\n rows={input.rows}\r\n variant=\"outlined\"\r\n size=\"small\"\r\n sx={{\r\n \"& .MuiOutlinedInput-root\": {\r\n maxWidth: 280,\r\n borderRadius: 1,\r\n \"&.Mui-focused .MuiOutlinedInput-notchedOutline\": {\r\n border: \"2px solid #7A5AF8\",\r\n },\r\n },\r\n }}\r\n />\r\n {error && (\r\n <Typography variant=\"body2\" color=\"error.main\">\r\n {error}\r\n </Typography>\r\n )}\r\n </Box>\r\n )}\r\n </DialogContent>\r\n\r\n <DialogActions\r\n sx={{\r\n padding: \"16px 24px 24px 24px\",\r\n gap: 1,\r\n }}\r\n >\r\n {buttons.map((button, index) => (\r\n <Button\r\n key={index}\r\n variant={button.variant || \"outlined\"}\r\n color={button.color || \"primary\"}\r\n className=\"confirm-modal-button\"\r\n sx={button.sx}\r\n onClick={() => handleButtonClick(button)}\r\n disabled={\r\n button.disabled ||\r\n (input?.required &&\r\n !inputValue.trim() &&\r\n button.variant === \"contained\")\r\n }\r\n >\r\n {button.label}\r\n </Button>\r\n ))}\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n};\r\n\r\nexport default ConfirmModal;\r\n","import * as React from \"react\";\r\nimport Box from \"@mui/material/Box\";\r\nimport { SxProps, Theme } from \"@mui/material\";\r\n\r\ninterface TabPanelProps {\r\n children?: React.ReactNode;\r\n index: number;\r\n value: number;\r\n sx?: SxProps<Theme>;\r\n}\r\n\r\nconst CustomTabPanel = ({\r\n children,\r\n value,\r\n index,\r\n sx,\r\n ...props\r\n}: TabPanelProps) => {\r\n return (\r\n <div\r\n role=\"tabpanel\"\r\n hidden={value !== index}\r\n id={`simple-tabpanel-${index}`}\r\n aria-labelledby={`simple-tab-${index}`}\r\n style={{ height: \"100%\" }}\r\n {...props}\r\n >\r\n {value === index && <Box sx={{ height: \"100%\", ...sx }}>{children}</Box>}\r\n </div>\r\n );\r\n};\r\n\r\nexport default CustomTabPanel;\r\n","import { useState } from \"react\";\r\nimport { Tabs, Tab, TabsProps, Box } from \"@mui/material\";\r\nimport { CheckBox, CrossBox } from \"../../../../../assets/svg\";\r\n\r\nexport interface TabItem {\r\n label: string;\r\n}\r\n\r\ninterface StyledTabsProps extends TabsProps {\r\n tabItems: TabItem[];\r\n activeFilterIndex: number;\r\n handleCrossClick: (index: number) => void;\r\n}\r\n\r\nconst CustomTabs = ({\r\n tabItems,\r\n activeFilterIndex = -1,\r\n handleCrossClick,\r\n value,\r\n onChange,\r\n ...tabsProps\r\n}: StyledTabsProps) => {\r\n const [hoveredTab, setHoveredTab] = useState<number | null>(null);\r\n\r\n return (\r\n <Tabs\r\n value={value}\r\n onChange={onChange}\r\n variant=\"fullWidth\"\r\n sx={{\r\n px: \"12px\",\r\n borderBottom: `1px solid #ccc`,\r\n \"& .MuiTabs-indicator\": {\r\n backgroundColor: \"black\",\r\n },\r\n }}\r\n {...tabsProps}\r\n >\r\n {tabItems.map((tab, idx) => {\r\n const isActive = activeFilterIndex === idx;\r\n const isHovered = hoveredTab === idx;\r\n\r\n return (\r\n <Tab\r\n key={idx}\r\n label={\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5 }}>\r\n <span>{tab.label}</span>\r\n {isActive && (\r\n <Box\r\n onMouseEnter={() => setHoveredTab(idx)}\r\n onMouseLeave={() => setHoveredTab(null)}\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n cursor: isHovered ? \"pointer\" : \"default\",\r\n }}\r\n onClick={\r\n isHovered ? () => handleCrossClick(idx) : undefined\r\n }\r\n >\r\n {isHovered ? <CrossBox /> : <CheckBox />}\r\n </Box>\r\n )}\r\n </Box>\r\n }\r\n sx={{\r\n fontSize: \"14px\",\r\n textTransform: \"capitalize\",\r\n color: \"#888888\",\r\n fontWeight: \"normal\",\r\n whiteSpace: \"nowrap\",\r\n \"&.Mui-selected\": {\r\n color: \"black\",\r\n fontWeight: \"bold\",\r\n },\r\n }}\r\n />\r\n );\r\n })}\r\n </Tabs>\r\n );\r\n};\r\n\r\nexport default CustomTabs;\r\n","// !! DON'T DELETE THIS OLD CODE !! //\r\n\r\nimport { FormControl, MenuItem, Select, SxProps, Theme } from \"@mui/material\";\r\nimport { Controller, UseFormSetValue } from \"react-hook-form\";\r\nimport { FilterStateProps } from \"../../../../../types/filter\";\r\nimport moment from \"moment\";\r\n\r\ninterface FormDropdownProps {\r\n filter: FilterStateProps;\r\n control: any;\r\n setValue: UseFormSetValue<any>;\r\n dropdownList: {\r\n label?: string;\r\n value?: string;\r\n }[];\r\n isLoading?: boolean;\r\n sx?: SxProps<Theme>;\r\n onValueChange?: () => void;\r\n}\r\n\r\nconst FormDropdown = ({\r\n filter,\r\n control,\r\n setValue,\r\n dropdownList,\r\n isLoading = false,\r\n sx,\r\n onValueChange,\r\n}: FormDropdownProps) => {\r\n return (\r\n <Controller\r\n name={`${filter?.filter_attribute_name}.operator`}\r\n control={control}\r\n defaultValue={filter?.filter_operator || dropdownList?.[0]?.value || \"\"}\r\n render={({ field }) => (\r\n <FormControl sx={sx} size=\"small\">\r\n <Select\r\n {...field}\r\n variant=\"standard\"\r\n sx={{\r\n fontSize: \"0.875rem\",\r\n minWidth: 50,\r\n border: \"none\",\r\n boxShadow: \"none\",\r\n \"& .MuiSelect-icon\": {\r\n top: \"45%\",\r\n transform: \"translateY(-50%)\",\r\n \"& .MuiOutlinedInput-input\": {\r\n padding: \"12px 20px\",\r\n },\r\n },\r\n }}\r\n disabled={isLoading}\r\n disableUnderline\r\n onChange={(e) => {\r\n const newOperator = e.target.value;\r\n const oldOperator = field.value;\r\n\r\n field.onChange(e);\r\n\r\n if (\r\n (filter?.filter_attribute_data_type === \"date\" ||\r\n filter?.filter_attribute_data_type === \"year\") &&\r\n newOperator !== oldOperator\r\n ) {\r\n if (newOperator === \"today\") {\r\n setValue(\r\n `${filter?.filter_attribute_name}.value`,\r\n moment().format(\"YYYY-MM-DD\"),\r\n {\r\n shouldDirty: true,\r\n }\r\n );\r\n } else if (newOperator === \"between\") {\r\n setValue(`${filter?.filter_attribute_name}.value`, [\"\", \"\"], {\r\n shouldDirty: true,\r\n });\r\n } else if (\r\n oldOperator === \"between\" ||\r\n oldOperator === \"today\"\r\n ) {\r\n setValue(`${filter?.filter_attribute_name}.value`, \"\", {\r\n shouldDirty: true,\r\n });\r\n }\r\n }\r\n\r\n onValueChange?.();\r\n }}\r\n >\r\n {dropdownList?.map((item, idx) => (\r\n <MenuItem key={idx} value={item.value}>\r\n {item.label}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n )}\r\n />\r\n );\r\n};\r\n\r\nexport default FormDropdown;\r\n","import { SxProps, Theme } from \"@mui/material\";\r\n\r\ninterface StyleProps {\r\n filterContainer: SxProps<Theme>;\r\n filterMainHeader: SxProps<Theme>;\r\n filterMainComponentWrapper: SxProps<Theme>;\r\n filterAttributeMainSelect: SxProps<Theme>;\r\n scrollbarCustom: SxProps<Theme>;\r\n}\r\n\r\ninterface filterFormStyleType {\r\n formEditModeStyle: SxProps<Theme>;\r\n formFlexContainer: SxProps<Theme>;\r\n formListItem: SxProps<Theme>;\r\n formListSectionHeader: SxProps<Theme>;\r\n formListItemHeader: SxProps<Theme>;\r\n formListItemHeaderName: SxProps<Theme>;\r\n formListItemHeaderDropdown: SxProps<Theme>;\r\n}\r\n\r\nexport const filterStyles: StyleProps = {\r\n scrollbarCustom: {\r\n overflowY: \"auto\",\r\n pr: 1,\r\n\r\n \"&::-webkit-scrollbar\": {\r\n width: \"4px\",\r\n },\r\n \"&::-webkit-scrollbar-thumb\": {\r\n backgroundColor: \"#999\",\r\n borderRadius: \"4px\",\r\n },\r\n \"&::-webkit-scrollbar-track\": {\r\n backgroundColor: \"#f0f0f0\",\r\n },\r\n },\r\n\r\n filterContainer: {\r\n backgroundColor: \"#fff\",\r\n height: \"100%\",\r\n overflowY: \"hidden\",\r\n boxShadow: \"0px 3px 8px 0px rgba(34, 48, 62, 0.10)\",\r\n borderRadius: \"0.5rem\",\r\n },\r\n\r\n filterMainHeader: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n bgcolor: \"#EEEEEE\",\r\n height: \"50px\",\r\n px: 2,\r\n borderBottom: \"1px solid #ccc\",\r\n mx: \"auto\",\r\n },\r\n\r\n filterMainComponentWrapper: {\r\n height: \"calc(100% - 90px)\",\r\n overflowY: \"auto\",\r\n },\r\n\r\n filterAttributeMainSelect: {\r\n \"& .MuiOutlinedInput-root\": {\r\n borderRadius: \"6px\",\r\n fontSize: \"14px\",\r\n bgcolor: \"#fafafa\",\r\n \"& fieldset\": {\r\n borderColor: \"#7a5af8 !important\",\r\n },\r\n \"&:hover fieldset\": {\r\n borderColor: \"#7a5af8 !important\",\r\n },\r\n \"&.Mui-focused fieldset\": {\r\n borderColor: \"#7a5af8 !important\",\r\n boxShadow: \"none\",\r\n },\r\n },\r\n \"& .MuiSelect-select\": {\r\n padding: \"8px 14px\",\r\n },\r\n },\r\n};\r\n\r\nexport const filterFormStyles: filterFormStyleType = {\r\n formEditModeStyle: {\r\n border: \"1px solid #c5c5c5\",\r\n borderRadius: \"6px\",\r\n padding: \"5px 10px 10px 10px\",\r\n },\r\n\r\n formFlexContainer: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"0.75rem\",\r\n },\r\n\r\n formListItem: {\r\n p: 1,\r\n backgroundColor: \"#FFFFFF\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 0.5,\r\n },\r\n\r\n formListSectionHeader: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n gap: 1,\r\n p: 1,\r\n backgroundColor: \"#FAFAF9\",\r\n },\r\n\r\n formListItemHeader: {\r\n display: \"flex\",\r\n justifyContent: \"flex-start\",\r\n alignItems: \"center\",\r\n gap: 2,\r\n },\r\n\r\n formListItemHeaderName: {\r\n fontWeight: 500,\r\n fontSize: \"13px\",\r\n color: \"#797877\",\r\n },\r\n\r\n formListItemHeaderDropdown: {\r\n fontSize: \"12px\",\r\n minWidth: 50,\r\n border: \"none\",\r\n boxShadow: \"none\",\r\n\r\n \"& .MuiSelect-root\": {\r\n fontSize: \"0.75rem\",\r\n\r\n \"& .MuiSelect-select\": {\r\n paddingBottom: \"0rem\",\r\n },\r\n },\r\n },\r\n};\r\n","import React, { useState } from \"react\";\r\nimport { TextField, InputAdornment, IconButton } from \"@mui/material\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\nimport { CloseIcon } from \"../../../../../assets/svg\";\r\n\r\ninterface SearchInputProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n placeholder?: string;\r\n className?: string;\r\n}\r\n\r\nconst CustomSearch = ({\r\n value = \"\",\r\n onChange,\r\n placeholder = \"Search...\",\r\n}: SearchInputProps) => {\r\n const [search, setSearch] = useState(value);\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const val = e.target.value;\r\n setSearch(val);\r\n onChange?.(val);\r\n };\r\n\r\n const handleClear = () => {\r\n setSearch(\"\"); // Clear the search value\r\n onChange?.(\"\"); // Propagate the cleared value\r\n };\r\n\r\n return (\r\n <TextField\r\n fullWidth\r\n size=\"small\"\r\n value={search}\r\n onChange={handleChange}\r\n placeholder={placeholder}\r\n className={\"search-input\"}\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <SearchIcon\r\n sx={{ color: \"#888888\", fontSize: \"20px\" }}\r\n className=\"search-icon-svg\"\r\n />\r\n </InputAdornment>\r\n ),\r\n endAdornment: search && ( // Show the clear icon only when there's a value\r\n <InputAdornment position=\"end\">\r\n <IconButton\r\n edge=\"end\"\r\n onClick={handleClear}\r\n sx={{ color: \"#888888\", fontSize: \"20px\" }}\r\n className=\"cross-icon\"\r\n >\r\n <CloseIcon />\r\n </IconButton>\r\n </InputAdornment>\r\n ),\r\n }}\r\n sx={{\r\n \"& .MuiOutlinedInput-root\": {\r\n borderRadius: \"6px\",\r\n fontSize: \"14px\",\r\n bgcolor: \"#fafafa\",\r\n \"& fieldset\": {\r\n borderColor: \"#c1c1c1\",\r\n },\r\n \"&.Mui-focused fieldset\": {\r\n borderColor: \"#7A5AF8\",\r\n },\r\n },\r\n }}\r\n />\r\n );\r\n};\r\n\r\nexport default CustomSearch;\r\n","import { Typography } from \"@mui/material\";\r\n\r\nconst EmptyList = ({ label }: { label?: string }) => {\r\n return (\r\n <Typography\r\n variant=\"body2\"\r\n align=\"center\"\r\n fontSize={14}\r\n fontStyle={\"italic\"}\r\n color=\"text.secondary\"\r\n >\r\n {label ? label : \"No results found\"}\r\n </Typography>\r\n );\r\n};\r\n\r\nexport default EmptyList;\r\n","import { Box, List, ListItem, ListItemText } from \"@mui/material\";\r\nimport React from \"react\";\r\nimport CustomSearch from \"../../search\";\r\nimport { CraftTableOptionsProps } from \"../../../../../types/table-options\";\r\nimport {\r\n FilterComponentOptions,\r\n FilterDataMainFilterEntityListProps,\r\n} from \"../../../../../types/filter\";\r\nimport EmptyList from \"./empty-list\";\r\n\r\ninterface Props {\r\n tableStates: CraftTableOptionsProps;\r\n filterComponentOptions?: FilterComponentOptions;\r\n}\r\n\r\nconst FilterCriteriaEntityList = ({\r\n tableStates,\r\n filterComponentOptions,\r\n}: Props) => {\r\n const [searchTerm, setSearchTerm] = React.useState<string>(\"\");\r\n\r\n const { filters, filterData, setSelectedFilterEntity } = tableStates;\r\n\r\n const handleSelectEntity = (entity: FilterDataMainFilterEntityListProps) => {\r\n setSelectedFilterEntity(entity);\r\n };\r\n\r\n const isSingleEntity = filterComponentOptions?.tabOptions?.isSingleEntity;\r\n\r\n // 🔍 get all entities from main filter data\r\n const allEntities = filterData?.mainFilter?.entityList?.data || [];\r\n\r\n // ✅ determine which entities should be displayed\r\n const entitiesToShow = React.useMemo(() => {\r\n // Case 1: isSingleEntity is true and filters already has entities\r\n if (isSingleEntity && filters?.length > 0) {\r\n const filterEntityTypes = filters.map((f) => f?.filter_entity_type);\r\n return allEntities.filter((entity) =>\r\n filterEntityTypes.includes(entity.value)\r\n );\r\n }\r\n\r\n // Case 2: default behavior (apply search filter)\r\n return allEntities.filter((entity) =>\r\n entity.label?.toLowerCase().includes(searchTerm?.toLowerCase())\r\n );\r\n }, [isSingleEntity, filters, allEntities, searchTerm]);\r\n\r\n return (\r\n <List>\r\n <CustomSearch\r\n placeholder=\"Filter by...\"\r\n value={searchTerm}\r\n onChange={setSearchTerm}\r\n />\r\n\r\n <Box\r\n sx={{\r\n my: 2,\r\n overflowY: \"auto\",\r\n transition: \"all 0.4s ease-in-out\",\r\n }}\r\n >\r\n {entitiesToShow.length === 0 ? (\r\n <EmptyList />\r\n ) : (\r\n entitiesToShow.map((entity, index) => (\r\n <ListItem\r\n key={index}\r\n onClick={() => handleSelectEntity(entity)}\r\n sx={{\r\n cursor: \"pointer\",\r\n \"&:hover\": { backgroundColor: \"#f4f4f4\" },\r\n }}\r\n >\r\n <ListItemText primary={entity.label} />\r\n </ListItem>\r\n ))\r\n )}\r\n </Box>\r\n </List>\r\n );\r\n};\r\n\r\nexport default FilterCriteriaEntityList;\r\n","import { Box, CircularProgress, Typography } from \"@mui/material\";\r\n\r\nconst Loader = ({ loaderText }: { loaderText?: string }) => {\r\n return (\r\n <Box\r\n display={\"flex\"}\r\n justifyContent=\"center\"\r\n alignItems={\"center\"}\r\n flexDirection={\"column\"}\r\n gap={2}\r\n paddingBlock={2}\r\n height={\"100%\"}\r\n width={\"100%\"}\r\n >\r\n <CircularProgress />\r\n {loaderText && <Typography variant=\"h6\">{loaderText}</Typography>}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default Loader;\r\n","import {\r\n Box,\r\n IconButton,\r\n List,\r\n ListItem,\r\n ListItemText,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport CustomSearch from \"../../search\";\r\nimport React, { useMemo } from \"react\";\r\nimport { CraftTableOptionsProps } from \"../../../../../types/table-options\";\r\nimport { filterFormStyles } from \"../../../style\";\r\nimport { CloseIcon } from \"../../../../../../assets/svg\";\r\nimport EmptyList from \"./empty-list\";\r\nimport Loader from \"../../../../common/loader/loader\";\r\nimport {\r\n FilterComponentOptions,\r\n FilterDataMainFilterEntityWiseCriteriaProps,\r\n} from \"../../../../../types/filter\";\r\n\r\ninterface Props {\r\n tableStates: CraftTableOptionsProps;\r\n handleAddFilter: (\r\n column: FilterDataMainFilterEntityWiseCriteriaProps\r\n ) => void;\r\n filterComponentOptions?: FilterComponentOptions;\r\n}\r\n\r\nconst FilterCriteriaList = ({\r\n tableStates,\r\n handleAddFilter,\r\n filterComponentOptions,\r\n}: Props) => {\r\n const [searchTerm, setSearchTerm] = React.useState<string>(\"\");\r\n\r\n const { filterData, filters, selectedFilterEntity, setSelectedFilterEntity } =\r\n tableStates;\r\n\r\n const isSingleEntity = filterComponentOptions?.tabOptions?.isSingleEntity;\r\n\r\n // Show Close button if:\r\n // - isSingleEntity is false → always show\r\n // - isSingleEntity is true → only show if filters is empty OR\r\n // no filter exists with same filter_entity_type as selectedFilterEntity.value\r\n const shouldShowCloseButton = useMemo(() => {\r\n return isSingleEntity\r\n ? filters?.length === 0 ||\r\n !filters?.some(\r\n (filter) =>\r\n filter?.filter_entity_type === selectedFilterEntity?.value\r\n )\r\n : true;\r\n }, [filters, isSingleEntity, selectedFilterEntity?.value]);\r\n\r\n return (\r\n <>\r\n <Box\r\n className=\"group-header\"\r\n sx={{\r\n ...filterFormStyles.formListSectionHeader,\r\n position: \"sticky\",\r\n top: 0,\r\n zIndex: 1,\r\n }}\r\n >\r\n <Typography fontSize={14}>{selectedFilterEntity?.label}</Typography>\r\n {shouldShowCloseButton && (\r\n <IconButton\r\n size=\"small\"\r\n onClick={() =>\r\n !isSingleEntity && setSelectedFilterEntity(undefined)\r\n }\r\n className=\"cross-icon\"\r\n >\r\n <CloseIcon />\r\n </IconButton>\r\n )}\r\n </Box>\r\n {filterData?.mainFilter?.entityWiseCriteria?.isPending ? (\r\n <Loader />\r\n ) : (\r\n <List>\r\n <CustomSearch\r\n placeholder=\"Filter by...\"\r\n value={searchTerm}\r\n onChange={setSearchTerm}\r\n />\r\n\r\n <Box\r\n sx={{\r\n my: 2,\r\n overflowY: \"auto\",\r\n transition: \"all 0.4s ease-in-out\",\r\n }}\r\n >\r\n {(() => {\r\n const filteredEntities =\r\n filterData?.mainFilter?.entityWiseCriteria?.data?.filter(\r\n (entity) =>\r\n entity.name.toLowerCase().includes(searchTerm.toLowerCase())\r\n ) ?? [];\r\n\r\n if (filteredEntities.length === 0) {\r\n return <EmptyList />;\r\n }\r\n\r\n return filteredEntities.map((entity, index) => {\r\n const isAlreadySelected = filters?.some(\r\n (filter) => filter.filter_attribute === entity.attribute_key\r\n );\r\n\r\n return (\r\n <ListItem\r\n key={index}\r\n sx={{\r\n opacity: isAlreadySelected ? 0.5 : 1,\r\n cursor: isAlreadySelected ? \"not-allowed\" : \"pointer\",\r\n \"&:hover\": {\r\n backgroundColor: isAlreadySelected\r\n ? \"inherit\"\r\n : \"#f4f4f4\",\r\n },\r\n }}\r\n onClick={() =>\r\n !isAlreadySelected && handleAddFilter(entity)\r\n }\r\n >\r\n <ListItemText primary={entity.name} />\r\n </ListItem>\r\n );\r\n });\r\n })()}\r\n </Box>\r\n </List>\r\n )}\r\n </>\r\n );\r\n};\r\n\r\nexport default FilterCriteriaList;\r\n","import { Box, Button, styled, Paper, ClickAwayListener } from \"@mui/material\";\r\nimport { useMemo, useRef } from \"react\";\r\nimport { AddIcon } from \"../../../../../../assets/svg\";\r\nimport {\r\n FilterColumnsDataProps,\r\n FilterComponentOptions,\r\n FilterDataMainFilterEntityWiseCriteriaProps,\r\n} from \"../../../../../types/filter\";\r\nimport { CraftTableOptionsProps } from \"../../../../../types/table-options\";\r\nimport { filterStyles } from \"../../../style\";\r\nimport useElementWidth from \"../../../../../libs/hooks/useElementWidth\";\r\nimport { onFilterChangeFunctionProps } from \"../../../../../types/common\";\r\nimport FilterCriteriaEntityList from \"./filter-criteria-entity-list\";\r\nimport FilterCriteriaList from \"./filter-criteria-list\";\r\n\r\nconst FilterCriteria = ({\r\n columnsData,\r\n tableStates,\r\n onChangeFunction,\r\n filterComponentOptions,\r\n}: {\r\n columnsData: FilterColumnsDataProps;\r\n tableStates: CraftTableOptionsProps;\r\n onChangeFunction: ({\r\n updatedFilters,\r\n filterMaster,\r\n }: onFilterChangeFunctionProps) => void;\r\n filterComponentOptions?: FilterComponentOptions;\r\n}) => {\r\n const FilterButton = styled(Button)(({ theme }) => ({\r\n borderRadius: 20,\r\n borderColor: theme.palette.primary.main,\r\n color: theme.palette.primary.main,\r\n textTransform: \"none\",\r\n padding: \"8px 16px\",\r\n \"&:hover\": {\r\n borderColor: theme.palette.primary.dark,\r\n },\r\n }));\r\n\r\n const {\r\n filters,\r\n setFilters,\r\n showFilterOptions,\r\n setShowFilterOption,\r\n filterMaster,\r\n selectedFilterEntity,\r\n setSelectedFilterEntity,\r\n } = tableStates;\r\n\r\n const filterButtonRef = useRef<HTMLButtonElement>(null);\r\n const filterButtonWidth = useElementWidth(filterButtonRef);\r\n\r\n const isSingleEntity = filterComponentOptions?.tabOptions?.isSingleEntity;\r\n // Disable button if only one filter is allowed\r\n const isSingleFilter =\r\n filterComponentOptions?.tabOptions?.isSingleFilter || false;\r\n const disableButton = useMemo(() => {\r\n return isSingleFilter && filters?.length > 0;\r\n }, [filters?.length, isSingleFilter]);\r\n\r\n const handleAddFilter = (\r\n attribute: FilterDataMainFilterEntityWiseCriteriaProps\r\n ) => {\r\n const dropdownOptions =\r\n columnsData?.operation_list[attribute?.element_type];\r\n\r\n const defaultValue = attribute.element_type === \"multiselect\" ? [] : \"\";\r\n\r\n const defaultOperator = dropdownOptions?.[0]?.value || \"\";\r\n\r\n const matchingDropdownList =\r\n columnsData?.operation_list[attribute.element_type] || [];\r\n\r\n const newFilter = {\r\n filter_attribute: attribute.attribute_key,\r\n filter_operator: defaultOperator,\r\n filter_value: defaultValue,\r\n filter_entity_type: selectedFilterEntity?.value,\r\n };\r\n\r\n const newSelectedFilter = {\r\n ...newFilter,\r\n // id: attribute?.id,\r\n filter_attribute_name: attribute?.name,\r\n filter_attribute_data_type:\r\n attribute?.element_type || attribute?.element_type,\r\n datasource_list: attribute?.datasource_list,\r\n dropdown_list: matchingDropdownList,\r\n filter_entity_name: selectedFilterEntity?.label,\r\n attribute_key: attribute?.attribute_key,\r\n };\r\n\r\n setFilters((prev) => [...prev, newSelectedFilter]);\r\n\r\n const newFilterState = [...filters, newSelectedFilter];\r\n const newState = {\r\n filterMaster: filterMaster,\r\n filters: newFilterState,\r\n };\r\n\r\n onChangeFunction && onChangeFunction(newState);\r\n\r\n setShowFilterOption(false);\r\n\r\n if (!isSingleEntity) {\r\n setSelectedFilterEntity(undefined);\r\n }\r\n };\r\n\r\n const toggleFilterOptions = () => {\r\n setShowFilterOption((prev) => !prev);\r\n };\r\n\r\n return (\r\n <Box>\r\n <FilterButton\r\n fullWidth\r\n startIcon={<AddIcon />}\r\n onClick={toggleFilterOptions}\r\n disabled={disableButton}\r\n sx={{\r\n bgcolor: \"#eae4fe\",\r\n borderRadius: \"6px\",\r\n color: \"#7a5af8\",\r\n fontSize: \"13px\",\r\n fontWeight: 500,\r\n }}\r\n ref={filterButtonRef}\r\n >\r\n Filter Criteria\r\n </FilterButton>\r\n\r\n {showFilterOptions && (\r\n <ClickAwayListener onClickAway={() => setShowFilterOption(false)}>\r\n <Paper\r\n sx={{\r\n width: filterButtonWidth || 360, // Dynamic width based on button\r\n p: 1,\r\n mt: 1.5,\r\n cursor: \"pointer\",\r\n position: \"absolute\",\r\n zIndex: 1300,\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n maxHeight: filterMaster?.saved_filters?.selectedId\r\n ? `calc(100vh - 601px)`\r\n : `calc(100vh - 440px)`,\r\n overflowY: \"auto\",\r\n width: \"100%\",\r\n ...filterStyles.scrollbarCustom,\r\n }}\r\n className=\"filter-criteria-list-box\"\r\n >\r\n {selectedFilterEntity ? (\r\n <FilterCriteriaList\r\n tableStates={tableStates}\r\n handleAddFilter={handleAddFilter}\r\n filterComponentOptions={filterComponentOptions}\r\n />\r\n ) : (\r\n <FilterCriteriaEntityList\r\n tableStates={tableStates}\r\n filterComponentOptions={filterComponentOptions}\r\n />\r\n )}\r\n </Box>\r\n </Paper>\r\n </ClickAwayListener>\r\n )}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default FilterCriteria;\r\n","import { useState, useEffect } from \"react\";\r\n\r\n// Custom hook to track the width of an element\r\nconst useElementWidth = (ref: React.RefObject<HTMLElement>) => {\r\n const [width, setWidth] = useState<number>(0);\r\n\r\n useEffect(() => {\r\n // If there's no element to observe, just return early\r\n if (!ref.current) return;\r\n\r\n // ResizeObserver callback function\r\n const resizeObserver = new ResizeObserver(() => {\r\n if (ref.current) {\r\n setWidth(ref.current.clientWidth); // Update width state\r\n }\r\n });\r\n\r\n // Start observing the element's size changes\r\n resizeObserver.observe(ref.current);\r\n\r\n // Clean up observer on component unmount\r\n return () => resizeObserver.disconnect();\r\n }, [ref, ref.current?.clientWidth]);\r\n\r\n return width; // Return the current width\r\n};\r\n\r\nexport default useElementWidth;\r\n","export const TextFieldStyles = {\r\n \"& .MuiOutlinedInput-root\": {\r\n borderRadius: \"6px\",\r\n fontSize: \"14px\",\r\n bgcolor: \"#fff\",\r\n\r\n \"& fieldset\": { borderColor: \"#c1c1c1\" },\r\n \"&.Mui-focused fieldset\": {\r\n borderColor: \"#7A5AF8\",\r\n },\r\n },\r\n};\r\n","import { TextField } from \"@mui/material\";\r\nimport { Controller } from \"react-hook-form\";\r\nimport { TextFieldStyles } from \"./styles\";\r\nimport { FilterStateProps } from \"../../../../../types/filter\";\r\n\r\ninterface FormTextfieldProps {\r\n filter: FilterStateProps;\r\n control: any;\r\n isLoading?: boolean;\r\n onValueChange?: () => void;\r\n}\r\n\r\nconst FormTextfield = ({\r\n filter,\r\n control,\r\n isLoading = false,\r\n onValueChange,\r\n}: FormTextfieldProps) => {\r\n return (\r\n <Controller\r\n name={`${filter?.filter_attribute_name}.value`}\r\n control={control}\r\n defaultValue={filter.filter_value || \"\"}\r\n render={({ field }) => (\r\n <TextField\r\n {...field}\r\n fullWidth\r\n variant=\"outlined\"\r\n size=\"small\"\r\n sx={{\r\n ...TextFieldStyles,\r\n \"& .MuiOutlinedInput-input\": {\r\n padding: \"12px 20px\",\r\n },\r\n }}\r\n // type={filter?.filter_attribute_data_type || \"text\" || \"number\"}\r\n type={\r\n filter?.filter_attribute_data_type === \"number\" ? \"number\" : \"text\"\r\n }\r\n placeholder={\"Enter value\"}\r\n disabled={isLoading}\r\n onChange={(e) => {\r\n field.onChange(e);\r\n onValueChange?.();\r\n }}\r\n />\r\n )}\r\n />\r\n );\r\n};\r\n\r\nexport default FormTextfield;\r\n","import { Controller } from \"react-hook-form\";\r\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\r\nimport { DatePicker } from \"@mui/x-date-pickers/DatePicker\";\r\nimport { AdapterDateFns } from \"@mui/x-date-pickers/AdapterDateFns\";\r\nimport moment from \"moment\";\r\nimport { FilterStateProps } from \"../../../../../types/filter\";\r\nimport { SxProps, Theme, Box, TextField } from \"@mui/material\";\r\n\r\ntype FormDatePickerProps = {\r\n filter: FilterStateProps;\r\n control: any;\r\n sx?: SxProps<Theme>;\r\n views?: Array<\"year\" | \"month\" | \"day\">;\r\n onValueChange?: () => void;\r\n};\r\n\r\nconst FormDatePicker = ({\r\n filter,\r\n control,\r\n sx,\r\n views = [\"day\"],\r\n onValueChange,\r\n}: FormDatePickerProps) => {\r\n const isRange = filter.filter_operator === \"between\";\r\n const isRelativeToToday = filter.filter_operator === \"today\";\r\n const isEmptyOperator =\r\n filter.filter_operator === \"empty\" ||\r\n filter.filter_operator === \"not_empty\";\r\n\r\n if (isEmptyOperator) {\r\n return <TextField fullWidth disabled value=\"\" size=\"small\" />;\r\n }\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDateFns}>\r\n <Box display=\"flex\" gap={1}>\r\n <Controller\r\n name={`${filter?.filter_attribute_name}.value`}\r\n control={control}\r\n // defaultValue={\r\n // isRange\r\n // ? [\"\", \"\"]\r\n // : isRelativeToToday\r\n // ? moment().format(\"YYYY-MM-DD\")\r\n // : filter.filter_value\r\n // ? moment(filter.filter_value, \"YYYY-MM-DD\").toDate()\r\n // : null\r\n // }\r\n defaultValue={\r\n isRange\r\n ? [\"\", \"\"]\r\n : isRelativeToToday\r\n ? moment().format(\"YYYY-MM-DD\")\r\n : isEmptyOperator\r\n ? null\r\n : filter.filter_value\r\n ? moment(filter.filter_value, \"YYYY-MM-DD\").toDate()\r\n : null\r\n }\r\n render={({ field }) => {\r\n const value = field.value;\r\n const todayDate = moment().toDate();\r\n if (isRange) {\r\n const fromDate = Array.isArray(value) ? value[0] : \"\";\r\n const toDate = Array.isArray(value) ? value[1] : \"\";\r\n\r\n return (\r\n <>\r\n <DatePicker\r\n views={views}\r\n value={\r\n isRelativeToToday\r\n ? todayDate\r\n : fromDate\r\n ? moment(fromDate, \"YYYY-MM-DD\").toDate()\r\n : null\r\n }\r\n onChange={(date) => {\r\n if (isRelativeToToday) return;\r\n let formatted = \"\";\r\n if (date) {\r\n formatted =\r\n views?.length === 1 && views[0] === \"year\"\r\n ? moment(date).format(\"YYYY\")\r\n : moment(date).format(\"YYYY-MM-DD\");\r\n }\r\n const updated: [string, string] = [\r\n formatted,\r\n toDate || \"\",\r\n ];\r\n field.onChange(updated);\r\n onValueChange?.();\r\n }}\r\n // disabled={isRelativeToToday}\r\n disabled={isRelativeToToday || isEmptyOperator}\r\n format={\r\n views?.length === 1 && views[0] === \"year\"\r\n ? \"yyyy\"\r\n : \"dd-MM-yyyy\"\r\n }\r\n sx={{\r\n \"& .MuiOutlinedInput-input\": {\r\n padding: \"12px 20px\",\r\n },\r\n ...sx,\r\n }}\r\n slotProps={{\r\n textField: {\r\n size: \"small\",\r\n fullWidth: true,\r\n placeholder:\r\n views?.length === 1 && views[0] === \"year\"\r\n ? \"YYYY\"\r\n : \"From Date\",\r\n },\r\n }}\r\n />\r\n\r\n <DatePicker\r\n views={views}\r\n value={\r\n isRelativeToToday\r\n ? todayDate\r\n : toDate\r\n ? moment(toDate, \"YYYY-MM-DD\").toDate()\r\n : null\r\n }\r\n onChange={(date) => {\r\n if (isRelativeToToday) return;\r\n let formatted = \"\";\r\n if (date) {\r\n formatted =\r\n views?.length === 1 && views[0] === \"year\"\r\n ? moment(date).format(\"YYYY\")\r\n : moment(date).format(\"YYYY-MM-DD\");\r\n }\r\n const updated: [string, string] = [\r\n fromDate || \"\",\r\n formatted,\r\n ];\r\n field.onChange(updated);\r\n onValueChange?.();\r\n }}\r\n // disabled={isRelativeToToday}\r\n disabled={isRelativeToToday || isEmptyOperator}\r\n format={\r\n views?.length === 1 && views[0] === \"year\"\r\n ? \"yyyy\"\r\n : \"dd-MM-yyyy\"\r\n }\r\n sx={{\r\n \"& .MuiOutlinedInput-input\": {\r\n padding: \"12px 20px\",\r\n },\r\n ...sx,\r\n }}\r\n slotProps={{\r\n textField: {\r\n size: \"small\",\r\n fullWidth: true,\r\n placeholder:\r\n views?.length === 1 && views[0] === \"year\"\r\n ? \"YYYY\"\r\n : \"To Date\",\r\n },\r\n }}\r\n />\r\n </>\r\n );\r\n }\r\n\r\n // Single DatePicker\r\n return (\r\n <DatePicker\r\n {...field}\r\n views={views}\r\n value={\r\n isRelativeToToday\r\n ? todayDate\r\n : field.value\r\n ? moment(field.value, \"YYYY-MM-DD\").toDate()\r\n : null\r\n }\r\n onChange={(date) => {\r\n if (isRelativeToToday) return;\r\n let formatted = \"\";\r\n if (date) {\r\n formatted =\r\n views?.length === 1 && views[0] === \"year\"\r\n ? moment(date).format(\"YYYY\")\r\n : moment(date).format(\"YYYY-MM-DD\");\r\n }\r\n field.onChange(formatted);\r\n onValueChange?.();\r\n }}\r\n // disabled={isRelativeToToday}\r\n disabled={isRelativeToToday || isEmptyOperator}\r\n format={\r\n views?.length === 1 && views[0] === \"year\"\r\n ? \"yyyy\"\r\n : \"dd-MM-yyyy\"\r\n }\r\n sx={{\r\n \"& .MuiOutlinedInput-input\": {\r\n padding: \"12px 20px\",\r\n },\r\n ...sx,\r\n }}\r\n slotProps={{\r\n textField: {\r\n size: \"small\",\r\n fullWidth: true,\r\n placeholder:\r\n views?.length === 1 && views[0] === \"year\"\r\n ? \"YYYY\"\r\n : \"DD-MM-YYYY\",\r\n },\r\n }}\r\n />\r\n );\r\n }}\r\n />\r\n </Box>\r\n </LocalizationProvider>\r\n );\r\n};\r\n\r\nexport default FormDatePicker;\r\n","import { Controller } from \"react-hook-form\";\r\nimport {\r\n FormControl,\r\n Select,\r\n MenuItem,\r\n Theme,\r\n SxProps,\r\n Checkbox,\r\n} from \"@mui/material\";\r\nimport { FilterStateProps } from \"../../../../../types/filter\";\r\nimport { DropdownOption } from \"../../../../../types/common\";\r\n\r\nconst FormMultiSelect = ({\r\n filter,\r\n control,\r\n dropdownData,\r\n sx,\r\n onValueChange,\r\n isFlatJson,\r\n}: {\r\n filter: FilterStateProps;\r\n control: any;\r\n dropdownData: Record<string, DropdownOption[]>;\r\n sx?: SxProps<Theme>;\r\n onValueChange?: () => void;\r\n isFlatJson: boolean;\r\n}) => {\r\n const options = dropdownData[filter.filter_attribute] || [];\r\n\r\n // 🔑 single source of truth\r\n const getOptionValue = (item: DropdownOption) =>\r\n isFlatJson ? item.label : item.value;\r\n\r\n return (\r\n <Controller\r\n name={`${filter?.filter_attribute_name}.value`}\r\n control={control}\r\n defaultValue={\r\n Array.isArray(filter.filter_value)\r\n ? filter.filter_value.filter(Boolean)\r\n : []\r\n }\r\n render={({ field }) => {\r\n const cleanedValue = Array.isArray(field.value)\r\n ? field.value.filter(Boolean)\r\n : [];\r\n\r\n return (\r\n <FormControl sx={sx} fullWidth size=\"small\">\r\n <Select\r\n {...field}\r\n sx={{\r\n \"& .MuiOutlinedInput-input\": {\r\n padding: \"10px 20px\",\r\n height: \"21px\",\r\n },\r\n }}\r\n multiple\r\n value={cleanedValue}\r\n onChange={(e) => {\r\n const value = e.target.value;\r\n const filtered = Array.isArray(value)\r\n ? value.filter(Boolean)\r\n : [];\r\n field.onChange(filtered);\r\n onValueChange?.();\r\n }}\r\n renderValue={(selected) => {\r\n const filtered = Array.isArray(selected)\r\n ? selected.filter(Boolean)\r\n : [];\r\n\r\n return filtered\r\n .map((val) => {\r\n const match = options.find(\r\n (item) => getOptionValue(item) === val\r\n );\r\n return match?.label || val;\r\n })\r\n .join(\", \");\r\n }}\r\n >\r\n {options.map((item, idx) => {\r\n const optionValue = getOptionValue(item);\r\n\r\n return (\r\n <MenuItem key={idx} value={optionValue}>\r\n <Checkbox\r\n checked={cleanedValue.includes(optionValue)}\r\n sx={{ marginRight: 1 }}\r\n />\r\n {item.label}\r\n </MenuItem>\r\n );\r\n })}\r\n </Select>\r\n </FormControl>\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n\r\nexport default FormMultiSelect;\r\n","import { FormControl } from \"@mui/material\";\r\nimport { FilterStateProps } from \"../../../../../types/filter\";\r\nimport FormTextfield from \"../components/Textfield\";\r\nimport FormDatePicker from \"../components/Date\";\r\nimport FormMultiSelect from \"../components/Multi-Select\";\r\n\r\n// Operators that should show a Date Picker\r\nconst dateAllowedOperators = [\r\n \"equal\",\r\n \"before\",\r\n \"after\",\r\n \"between\",\r\n \"is\",\r\n \"today\",\r\n \"is_before\",\r\n \"is_after\",\r\n \"is_on_or_before\",\r\n \"is_on_or_after\",\r\n \"empty\",\r\n \"not_empty\",\r\n];\r\n\r\nexport const resolveFilterInput = ({\r\n filter,\r\n operator,\r\n control,\r\n dropdownData,\r\n updateFiltersFromForm,\r\n isFlatJson,\r\n}: {\r\n filter: FilterStateProps;\r\n operator: string | undefined;\r\n control: any;\r\n dropdownData: any;\r\n updateFiltersFromForm: () => void;\r\n isFlatJson: boolean;\r\n}) => {\r\n const dataType = filter?.filter_attribute_data_type;\r\n\r\n // TEXT / NUMBER → always textfield\r\n if (dataType === \"text\" || dataType === \"number\") {\r\n return (\r\n <FormTextfield\r\n filter={filter}\r\n control={control}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n );\r\n }\r\n\r\n // YEAR → DatePicker (Year mode)\r\n if (dataType === \"year\") {\r\n return (\r\n <FormDatePicker\r\n filter={filter}\r\n control={control}\r\n views={[\"year\"]}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n );\r\n }\r\n\r\n // DATE FIELD\r\n if (dataType === \"date\") {\r\n const showDatePicker = operator && dateAllowedOperators.includes(operator);\r\n\r\n if (showDatePicker) {\r\n // Date Picker\r\n return (\r\n <FormDatePicker\r\n filter={filter}\r\n control={control}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <FormTextfield\r\n filter={filter}\r\n control={control}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n );\r\n }\r\n\r\n // SELECT / MULTISELECT / RADIO / CHECKBOX\r\n if (\r\n filter?.filter_attribute_data_type !== undefined &&\r\n [\"select\", \"multiselect\", \"radio\", \"checkbox\"].includes(\r\n filter?.filter_attribute_data_type\r\n )\r\n ) {\r\n return (\r\n <FormMultiSelect\r\n filter={filter}\r\n control={control}\r\n dropdownData={dropdownData}\r\n onValueChange={updateFiltersFromForm}\r\n isFlatJson={isFlatJson}\r\n />\r\n );\r\n }\r\n\r\n return <FormControl fullWidth size=\"small\" />;\r\n};\r\n","import { Box, Button, IconButton, TextField, Typography } from \"@mui/material\";\r\nimport { CloseIcon, DeleteIcon } from \"../../../../../assets/svg\";\r\nimport {\r\n FilterColumnsDataProps,\r\n FilterComponentOptions,\r\n FilterDropdownDataProps,\r\n FilterMasterStateProps,\r\n FilterStateProps,\r\n} from \"../../../../types/filter\";\r\nimport { Controller, useForm } from \"react-hook-form\";\r\nimport React, { useEffect, useMemo, useCallback } from \"react\";\r\nimport FormDropdown from \"./components/Dropdown\";\r\nimport { CraftTableOptionsProps } from \"../../../../types/table-options\";\r\nimport FilterCriteria from \"./components/Filter-criteria\";\r\nimport CustomSearch from \"../search\";\r\nimport { customDebounce } from \"../../../../libs/utils/debounce\";\r\nimport { filterFormStyles } from \"../../style\";\r\nimport { onFilterChangeFunctionProps } from \"../../../../types/common\";\r\nimport { resolveFilterInput } from \"./utils/filter-date-input-resolver\";\r\n\r\ninterface FormValues {\r\n filterName: string;\r\n [key: string]:\r\n | {\r\n value: string | string[];\r\n operator: string;\r\n }\r\n | string;\r\n}\r\n\r\nconst FilterForm = ({\r\n columnsData,\r\n dropdownData,\r\n searchTerm = \"\",\r\n setSearchTerm,\r\n handleRemoveFilter,\r\n editMode = false,\r\n tableStates,\r\n onSaveFilterButtonClick,\r\n setDeleteFilterModalOpen,\r\n onChangeFunction,\r\n filterComponentOptions,\r\n isFlatJson,\r\n}: {\r\n columnsData: FilterColumnsDataProps;\r\n dropdownData: FilterDropdownDataProps;\r\n searchTerm?: string;\r\n setSearchTerm: React.Dispatch<React.SetStateAction<string>>;\r\n handleRemoveFilter: (filter_attribute: string) => void;\r\n editMode?: boolean;\r\n tableStates: CraftTableOptionsProps;\r\n onSaveFilterButtonClick?: () => void;\r\n setDeleteFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;\r\n onChangeFunction: ({\r\n updatedFilters,\r\n filterMaster,\r\n }: onFilterChangeFunctionProps) => void;\r\n filterComponentOptions?: FilterComponentOptions;\r\n isFlatJson: boolean;\r\n}) => {\r\n const { filterMaster, filters, setFilters, setFilterMaster, setPagination } =\r\n tableStates;\r\n\r\n const showSaveButton =\r\n filterComponentOptions?.tabOptions?.mainFilter?.showSaveButton;\r\n const showClearAllButton =\r\n filterComponentOptions?.tabOptions?.mainFilter?.showClearAllButton;\r\n const customButtons =\r\n filterComponentOptions?.tabOptions?.mainFilter?.customButtons;\r\n\r\n const filterName = filterMaster?.saved_filters?.selectedName || \"\";\r\n const isOwner = filterMaster?.saved_filters?.is_owner || false;\r\n\r\n const defaultValues = useMemo(() => {\r\n const filterValues = filters?.reduce((acc, curr) => {\r\n if (curr?.filter_attribute_name) {\r\n acc[curr?.filter_attribute_name] = {\r\n value: curr?.filter_value ?? \"\",\r\n operator:\r\n curr?.filter_operator ?? curr?.dropdown_list?.[0]?.value ?? \"\",\r\n };\r\n }\r\n return acc;\r\n }, {} as Record<string, { value: string | string[]; operator: string }>);\r\n\r\n return {\r\n filterName: filterName ?? \"\",\r\n dummyChange: \"\",\r\n ...filterValues,\r\n };\r\n }, [filters, filterName]);\r\n\r\n const { control, watch, reset, setValue, unregister } = useForm<\r\n FormValues & { dummyChange: string }\r\n >({\r\n mode: \"onChange\",\r\n defaultValues,\r\n resetOptions: {\r\n keepDirtyValues: false,\r\n keepErrors: false,\r\n },\r\n });\r\n\r\n const formValues = watch();\r\n\r\n useEffect(() => {\r\n reset(defaultValues);\r\n }, [filters]);\r\n\r\n const debouncedUpdateFilters = useCallback(\r\n customDebounce((updatedFilters: FilterStateProps[]) => {\r\n setFilters(updatedFilters);\r\n\r\n const newState = {\r\n filterMaster: filterMaster,\r\n filters: updatedFilters,\r\n };\r\n\r\n onChangeFunction && onChangeFunction(newState);\r\n }, 1000),\r\n [setFilters]\r\n );\r\n\r\n const updateFiltersFromForm = useCallback(() => {\r\n const updatedFilters = filters?.map((filter) => {\r\n if (\r\n filter?.filter_attribute_name &&\r\n typeof formValues[filter?.filter_attribute_name] === \"object\"\r\n ) {\r\n const filterValue = formValues[filter?.filter_attribute_name] as {\r\n value: string | string[];\r\n operator: string;\r\n };\r\n\r\n return {\r\n ...filter,\r\n filter_value: filterValue.value,\r\n filter_operator: filterValue.operator,\r\n };\r\n }\r\n return filter;\r\n });\r\n\r\n setPagination((prev) => ({ ...prev, pageIndex: 0 }));\r\n debouncedUpdateFilters(updatedFilters);\r\n }, [formValues, filters, debouncedUpdateFilters]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n reset();\r\n filters?.forEach((filter) => {\r\n if (filter?.filter_attribute_name) {\r\n unregister(filter?.filter_attribute_name);\r\n }\r\n });\r\n };\r\n }, []);\r\n\r\n const groupedFilters = useMemo(() => {\r\n return filters?.reduce((acc, filter) => {\r\n const key = filter?.filter_entity_name || \"\";\r\n if (!acc[key]) {\r\n acc[key] = [];\r\n }\r\n acc[key].push(filter);\r\n return acc;\r\n }, {} as Record<string, FilterStateProps[]>);\r\n }, [filters]);\r\n\r\n const handleRemoveEntityType = (entityType: string) => {\r\n const remainingFilters = filters?.filter(\r\n (f) => f.filter_entity_name !== entityType\r\n );\r\n\r\n // unregister all fields belonging to this entity type\r\n filters?.forEach((f) => {\r\n if (f?.filter_entity_name === entityType && f?.filter_attribute_name) {\r\n unregister(`${f?.filter_attribute_name}.value`);\r\n unregister(`${f?.filter_attribute_name}.operator`);\r\n }\r\n });\r\n\r\n setFilters(remainingFilters);\r\n\r\n const newState = {\r\n filterMaster,\r\n filters: remainingFilters,\r\n };\r\n\r\n onChangeFunction && onChangeFunction(newState);\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={(e) => {\r\n e.preventDefault(); // This prevents the page from reloading\r\n }}\r\n >\r\n <Box sx={editMode ? filterFormStyles.formEditModeStyle : {}}>\r\n {editMode && (\r\n <Box\r\n sx={{\r\n \"& .MuiOutlinedInput-root\": {\r\n borderRadius: \"6px\",\r\n fontSize: \"14px\",\r\n bgcolor: \"#fafafa\",\r\n \"& fieldset\": { borderColor: \"#c1c1c1\" },\r\n \"&.Mui-focused fieldset\": { borderColor: \"#7A5AF8\" },\r\n },\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n padding: \"0.5rem 0 1rem 0\",\r\n gap: 1,\r\n }}\r\n >\r\n <Controller\r\n name=\"filterName\"\r\n control={control}\r\n render={({ field }) => (\r\n <TextField\r\n fullWidth\r\n size=\"small\"\r\n placeholder=\"Filter Name\"\r\n value={filterName || field.value}\r\n onChange={(e) => {\r\n field.onChange(e);\r\n if (editMode) {\r\n setFilterMaster(\r\n (prev) =>\r\n ({\r\n ...prev,\r\n saved_filters: {\r\n ...prev?.saved_filters,\r\n selectedName: e.target.value,\r\n },\r\n } as FilterMasterStateProps)\r\n );\r\n }\r\n }}\r\n inputRef={field.ref}\r\n sx={{\r\n maxWidth: 400,\r\n\r\n \"& .MuiOutlinedInput-root\": {\r\n bgcolor: \"white\",\r\n borderRadius: \"0px\",\r\n fontSize: \"14px\",\r\n color: \"#272524\",\r\n fontWeight: \"500\",\r\n \"& fieldset\": { borderColor: \"#c5c5c5\" },\r\n \"&.Mui-focused fieldset\": { borderColor: \"#7A5AF8\" },\r\n },\r\n }}\r\n />\r\n )}\r\n />\r\n {isOwner && (\r\n <Box onClick={(e) => e.stopPropagation()}>\r\n <IconButton\r\n size=\"small\"\r\n onClick={() =>\r\n setDeleteFilterModalOpen && setDeleteFilterModalOpen(true)\r\n }\r\n >\r\n <DeleteIcon />\r\n </IconButton>\r\n </Box>\r\n )}\r\n </Box>\r\n )}\r\n\r\n <Box\r\n className=\"filter-criteria-form\"\r\n sx={{\r\n ...filterFormStyles.formFlexContainer,\r\n ...(editMode && {\r\n maxHeight: \"calc(100vh - 570px)\",\r\n overflowY: \"auto\",\r\n }),\r\n }}\r\n >\r\n <FilterCriteria\r\n columnsData={columnsData}\r\n tableStates={tableStates}\r\n onChangeFunction={onChangeFunction}\r\n filterComponentOptions={filterComponentOptions}\r\n />\r\n\r\n {!editMode && (\r\n <CustomSearch value={searchTerm} onChange={setSearchTerm} />\r\n )}\r\n\r\n <Box\r\n className=\"filter-form-inputs\"\r\n sx={filterFormStyles.formFlexContainer}\r\n >\r\n {Object.entries(groupedFilters).map(([entityType, filters]) => (\r\n <Box\r\n key={entityType}\r\n sx={{\r\n border: \"1px solid #c5c5c5\",\r\n borderRadius: 2,\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n {/* Group Header */}\r\n <Box\r\n className=\"group-header\"\r\n sx={filterFormStyles.formListSectionHeader}\r\n >\r\n <Typography fontSize={14}>{entityType}</Typography>\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => handleRemoveEntityType(entityType)}\r\n >\r\n <CloseIcon />\r\n </IconButton>\r\n </Box>\r\n\r\n {filters\r\n .filter(\r\n (filter) =>\r\n filter?.filter_attribute_name\r\n ?.toLowerCase()\r\n .includes(searchTerm.toLowerCase()) ||\r\n filter.filter_value\r\n ?.toString()\r\n .toLowerCase()\r\n .includes(searchTerm.toLowerCase())\r\n )\r\n .reverse()\r\n .map((filter) => {\r\n const dropdown_list = filter.dropdown_list || [];\r\n return (\r\n <Box\r\n key={filter.filter_attribute}\r\n sx={filterFormStyles.formListItem}\r\n >\r\n <Box sx={filterFormStyles.formListItemHeader}>\r\n <Typography\r\n sx={filterFormStyles.formListItemHeaderName}\r\n >\r\n {filter?.filter_attribute_name}\r\n </Typography>\r\n <FormDropdown\r\n filter={filter}\r\n control={control}\r\n setValue={setValue}\r\n dropdownList={dropdown_list}\r\n sx={filterFormStyles.formListItemHeaderDropdown}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n <IconButton\r\n sx={{ marginLeft: \"auto\" }}\r\n onClick={() => {\r\n unregister(\r\n `${filter?.filter_attribute_name}.value`\r\n );\r\n unregister(\r\n `${filter?.filter_attribute_name}.operator`\r\n );\r\n\r\n // Toggle dummy field to force form dirty\r\n const dummy = watch(\"dummyChange\");\r\n setValue(\r\n \"dummyChange\",\r\n dummy === \"changed\" ? \"reset\" : \"changed\",\r\n {\r\n shouldDirty: true,\r\n }\r\n );\r\n\r\n handleRemoveFilter(filter.filter_attribute);\r\n }}\r\n size=\"small\"\r\n >\r\n <CloseIcon />\r\n </IconButton>\r\n </Box>\r\n\r\n <Box>\r\n {(() => {\r\n const fieldValue = formValues[\r\n filter?.filter_attribute_name as keyof FormValues\r\n ] as\r\n | { value: string | string[]; operator: string }\r\n | undefined;\r\n\r\n const operator = fieldValue?.operator;\r\n\r\n return resolveFilterInput({\r\n filter,\r\n operator,\r\n control,\r\n dropdownData,\r\n updateFiltersFromForm,\r\n isFlatJson,\r\n });\r\n })()}\r\n </Box>\r\n </Box>\r\n );\r\n })}\r\n </Box>\r\n ))}\r\n </Box>\r\n </Box>\r\n </Box>\r\n\r\n {filters?.length > 0 && (showClearAllButton || showSaveButton) && (\r\n <Box sx={{ display: \"flex\", justifyContent: \"center\", gap: 1, mt: 3 }}>\r\n {showClearAllButton && (\r\n <Button\r\n variant=\"outlined\"\r\n sx={{\r\n color: \"#7A5AF8\",\r\n border: `1px solid #7A5AF8`,\r\n borderRadius: \"6px\",\r\n textTransform: \"none\",\r\n fontSize: \"14px\",\r\n }}\r\n fullWidth\r\n onClick={() => {\r\n setFilters([]);\r\n\r\n const filterMaster = {\r\n ...tableStates.filterMaster,\r\n activeFilterTabIndex: -1,\r\n };\r\n\r\n const newState = {\r\n filterMaster: filterMaster,\r\n filters: [],\r\n };\r\n\r\n onChangeFunction && onChangeFunction(newState);\r\n }}\r\n >\r\n Clear All\r\n </Button>\r\n )}\r\n\r\n {showSaveButton && (\r\n <Button\r\n variant=\"contained\"\r\n fullWidth\r\n sx={{\r\n color: \"white\",\r\n backgroundColor: \"#7A5AF8\",\r\n \"&.Mui-disabled\": {\r\n backgroundColor: \"#d7cefd\",\r\n color: \"rgba(255, 255, 255, 0.7)\",\r\n },\r\n }}\r\n onClick={() => {\r\n onSaveFilterButtonClick && onSaveFilterButtonClick();\r\n }}\r\n >\r\n Save Filter\r\n </Button>\r\n )}\r\n\r\n {/* Custom buttons from props */}\r\n {customButtons?.map((btn, idx) => (\r\n <Button\r\n key={idx}\r\n fullWidth\r\n variant={btn?.variant ?? \"outlined\"}\r\n sx={btn?.sx}\r\n {...btn}\r\n >\r\n {btn?.label}\r\n </Button>\r\n ))}\r\n </Box>\r\n )}\r\n </form>\r\n );\r\n};\r\n\r\nexport default FilterForm;\r\n","import { Box } from \"@mui/material\";\r\nimport { useEffect, useState } from \"react\";\r\nimport FilterForm from \"./forms\";\r\nimport {\r\n FilterFormComponentProps,\r\n FilterMasterStateProps,\r\n} from \"../../../types/filter\";\r\nimport { filterStyles } from \"../style\";\r\n\r\nconst MainFilter = ({\r\n columnsData,\r\n dropdownData,\r\n tableStates,\r\n onSaveFilterButtonClick,\r\n onChangeFunction,\r\n filterComponentOptions,\r\n isFlatJson,\r\n}: FilterFormComponentProps) => {\r\n const [searchTerm, setSearchTerm] = useState<string>(\"\");\r\n\r\n const { setFilters, setFilterMaster, filterMaster } = tableStates;\r\n\r\n useEffect(() => {\r\n setFilterMaster(\r\n (prev) =>\r\n ({\r\n ...prev,\r\n activeFilterTabIndex: 0,\r\n } as FilterMasterStateProps)\r\n );\r\n }, []);\r\n\r\n const handleRemoveFilter = (filter_attribute: string) => {\r\n setFilters((prev) =>\r\n prev.filter((filter) => filter.filter_attribute !== filter_attribute)\r\n );\r\n setFilters((prev) => {\r\n const newFilters = prev.filter(\r\n (f) => f.filter_attribute !== filter_attribute\r\n );\r\n\r\n onChangeFunction &&\r\n onChangeFunction({\r\n filterMaster: filterMaster,\r\n filters: newFilters,\r\n });\r\n return newFilters;\r\n });\r\n };\r\n\r\n const mainBoxStyles = {\r\n ...filterStyles.filterMainComponentWrapper,\r\n ...filterStyles.scrollbarCustom,\r\n };\r\n\r\n return (\r\n <Box sx={mainBoxStyles} className=\"main-filter-component-wrapper\">\r\n {/* Render selectedFilters state */}\r\n <FilterForm\r\n columnsData={columnsData}\r\n searchTerm={searchTerm}\r\n setSearchTerm={setSearchTerm}\r\n handleRemoveFilter={handleRemoveFilter}\r\n tableStates={tableStates}\r\n onSaveFilterButtonClick={onSaveFilterButtonClick}\r\n dropdownData={dropdownData}\r\n onChangeFunction={onChangeFunction}\r\n filterComponentOptions={filterComponentOptions}\r\n isFlatJson={isFlatJson}\r\n />\r\n </Box>\r\n );\r\n};\r\n\r\nexport default MainFilter;\r\n","import { Box, Typography } from \"@mui/material\";\r\nimport FilterForm from \"./forms\";\r\nimport BackArrow from \"@mui/icons-material/ArrowBackIosNew\";\r\nimport {\r\n FilterColumnsDataProps,\r\n FilterComponentOptions,\r\n FilterDropdownDataProps,\r\n FilterMasterStateProps,\r\n} from \"../../../types/filter\";\r\nimport { CraftTableOptionsProps } from \"../../../types/table-options\";\r\nimport { onFilterChangeFunctionProps } from \"../../../types/common\";\r\n\r\nconst SavedFilterEditComponent = ({\r\n columnsData,\r\n dropdownData,\r\n tableStates,\r\n editMode,\r\n setEditMode,\r\n searchTerm,\r\n setSearchTerm,\r\n onSaveFilterButtonClick,\r\n setDeleteFilterModalOpen,\r\n onChangeFunction,\r\n filterComponentOptions,\r\n}: {\r\n columnsData: FilterColumnsDataProps;\r\n dropdownData: FilterDropdownDataProps;\r\n tableStates: CraftTableOptionsProps;\r\n editMode?: boolean;\r\n setEditMode?: React.Dispatch<React.SetStateAction<boolean>>;\r\n searchTerm?: string;\r\n setSearchTerm: React.Dispatch<React.SetStateAction<string>>;\r\n onSaveFilterButtonClick?: () => void;\r\n setDeleteFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;\r\n onChangeFunction: ({\r\n updatedFilters,\r\n filterMaster,\r\n }: onFilterChangeFunctionProps) => void;\r\n filterComponentOptions?: FilterComponentOptions;\r\n}) => {\r\n const { setFilters, setFilterMaster } = tableStates;\r\n\r\n const showBackButton =\r\n filterComponentOptions?.tabOptions?.savedFilter?.showBackButton;\r\n\r\n const handleRemoveFilter = (filter_attribute: string) => {\r\n setFilters((prev) =>\r\n prev.filter((filter) => filter?.filter_attribute !== filter_attribute)\r\n );\r\n };\r\n\r\n const handleBackButtonClick = () => {\r\n setEditMode && setEditMode(false);\r\n setFilters([]);\r\n\r\n setFilterMaster(\r\n (prev) =>\r\n ({\r\n ...prev,\r\n saved_filters: {\r\n ...prev?.saved_filters,\r\n selectedId: \"\",\r\n selectedName: \"\",\r\n selectedCode: \"\",\r\n shareWithTeam: false,\r\n allowTeamEdit: false,\r\n },\r\n activeFilterTabIndex: -1,\r\n } as FilterMasterStateProps)\r\n );\r\n };\r\n\r\n return (\r\n <>\r\n {showBackButton && (\r\n <Box>\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 1,\r\n cursor: \"pointer\",\r\n mb: 2,\r\n }}\r\n onClick={handleBackButtonClick}\r\n >\r\n <BackArrow sx={{ width: \"13px\", height: \"13px\" }} />\r\n <Typography variant=\"body2\" sx={{ color: \"#8592A3\" }}>\r\n Back To Saved Filters\r\n </Typography>\r\n </Box>\r\n </Box>\r\n )}\r\n\r\n {/* Render selectedFilters state */}\r\n <FilterForm\r\n handleRemoveFilter={handleRemoveFilter}\r\n editMode={editMode}\r\n tableStates={tableStates}\r\n columnsData={columnsData}\r\n dropdownData={dropdownData}\r\n searchTerm={searchTerm}\r\n setSearchTerm={setSearchTerm}\r\n onSaveFilterButtonClick={onSaveFilterButtonClick}\r\n setDeleteFilterModalOpen={setDeleteFilterModalOpen}\r\n onChangeFunction={onChangeFunction}\r\n filterComponentOptions={filterComponentOptions}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nexport default SavedFilterEditComponent;\r\n","import { useEffect, useState } from \"react\";\r\nimport {\r\n FilterFormComponentProps,\r\n FilterMasterStateProps,\r\n FilterOperationListProps,\r\n} from \"../../../types/filter\";\r\nimport {\r\n Accordion,\r\n AccordionDetails,\r\n AccordionSummary,\r\n Box,\r\n Divider,\r\n IconButton,\r\n List,\r\n ListItem,\r\n ListItemText,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport CustomSearch from \"./search\";\r\nimport { DeleteIcon, EditIcon } from \"../../../../assets/svg\";\r\nimport SavedFilterEditComponent from \"./saved-edit-filter\";\r\nimport { CheckBox } from \"../../../../assets/svg\";\r\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\n\r\nconst SavedFilter = ({\r\n columnsData,\r\n dropdownData,\r\n tableStates,\r\n editMode,\r\n setEditMode,\r\n setDeleteFilterModalOpen,\r\n onSaveFilterButtonClick,\r\n tabValue,\r\n onChangeFunction,\r\n filterComponentOptions,\r\n isFlatJson,\r\n}: FilterFormComponentProps) => {\r\n const { filters, filterMaster, setFilterMaster, setFilterToDelete } =\r\n tableStates;\r\n\r\n const [searchTerm, setSearchTerm] = useState<string>(\"\");\r\n\r\n const MyFilter = (f: any): FilterOperationListProps => {\r\n return {\r\n label: f.name || f.label || \"Unnamed Filter\",\r\n value: f.id || f.value,\r\n code: f.code ?? \"\",\r\n is_shared: false,\r\n created_by: f.created_by || \"\",\r\n description: f.description || \"\",\r\n is_owner: true, // My filter = always owner\r\n is_editable: f.is_editable === true || f.is_editable === \"true\",\r\n };\r\n };\r\n\r\n const SharedFilter = (f: any): FilterOperationListProps => {\r\n const prefs =\r\n f.sharedPreferences || f.preferences || f.meta || f.shared_meta || {};\r\n\r\n return {\r\n label: f.name || f.label || \"Unnamed Filter\",\r\n value: f.id || f.value,\r\n code: f.code ?? \"\",\r\n is_shared: f.is_shared ?? prefs.is_shared ?? true,\r\n created_by: f.created_by || \"shared_filter\",\r\n description: f.description || \"\",\r\n is_owner: f.is_owner === true || prefs.is_owner === \"true\",\r\n is_editable:\r\n f.is_editable === true ||\r\n f.is_editable === \"true\" ||\r\n prefs.is_editable === true ||\r\n prefs.is_editable === \"true\",\r\n };\r\n };\r\n\r\n // SEPARATE DATA MAPPINGS\r\n\r\n const myFilters: FilterOperationListProps[] =\r\n columnsData?.saved_filter?.map(MyFilter) ?? [];\r\n\r\n const sharedFilters: FilterOperationListProps[] =\r\n columnsData?.shared_filter?.map(SharedFilter) ?? [];\r\n\r\n // Reset on unmount\r\n useEffect(() => {\r\n return () => {\r\n const editModeFromTab =\r\n filterComponentOptions?.tabOptions?.savedFilter?.editMode;\r\n\r\n if (!editModeFromTab) {\r\n setEditMode && setEditMode(false);\r\n setFilterMaster(\r\n (prev) =>\r\n ({\r\n ...prev,\r\n saved_filters: {\r\n ...(prev?.saved_filters ?? {}),\r\n selectedId: \"\",\r\n selectedName: \"\",\r\n description: \"\",\r\n selectedCode: \"\",\r\n shareWithTeam: undefined,\r\n allowTeamEdit: undefined,\r\n },\r\n } as FilterMasterStateProps)\r\n );\r\n }\r\n };\r\n }, []);\r\n\r\n // APPLY FILTER\r\n\r\n const applyFilterStates = (filter: FilterOperationListProps) => {\r\n const newFilterMaster = {\r\n ...filterMaster,\r\n saved_filters: {\r\n ...(filterMaster?.saved_filters ?? {}),\r\n selectedId: filter.value,\r\n selectedName: filter.label,\r\n description: filter.description,\r\n selectedCode: filter.code,\r\n shareWithTeam: filter.is_shared,\r\n allowTeamEdit: filter.is_editable,\r\n is_owner: filter.is_owner,\r\n },\r\n attributes: {\r\n ...filterMaster?.attributes,\r\n radio: [],\r\n },\r\n activeFilterTabIndex: tabValue,\r\n } as FilterMasterStateProps;\r\n\r\n setFilterMaster(newFilterMaster);\r\n\r\n onChangeFunction &&\r\n onChangeFunction({\r\n filterMaster: newFilterMaster,\r\n filters,\r\n });\r\n };\r\n\r\n const handleListItemClick = (filter: FilterOperationListProps) => {\r\n applyFilterStates(filter);\r\n setEditMode && setEditMode(true);\r\n setFilterToDelete(filter);\r\n };\r\n\r\n const handleApplyFilter = (filter: FilterOperationListProps) => {\r\n applyFilterStates(filter);\r\n };\r\n\r\n const [openAccordion, setOpenAccordion] = useState<\"my\" | \"shared\" | null>(\r\n \"my\"\r\n );\r\n\r\n const toggleAccodion = (accordion: \"my\" | \"shared\" | null) => {\r\n setOpenAccordion((prev) => (prev === accordion ? null : accordion));\r\n };\r\n\r\n // RENDER: MY FILTERS\r\n\r\n const renderMyFilters = (source: FilterOperationListProps[]) =>\r\n source.length === 0 ? (\r\n <Typography>No My Filters</Typography>\r\n ) : (\r\n <List sx={{ display: \"flex\", flexDirection: \"column\", gap: 1 }}>\r\n {source\r\n .filter((f) =>\r\n f.label?.toLowerCase().includes(searchTerm.toLowerCase())\r\n )\r\n .map((filter) => (\r\n <ListItem\r\n key={filter.value}\r\n sx={{\r\n cursor: \"pointer\",\r\n borderRadius: \"8px\",\r\n bgcolor: \"#f2f6f8ff\",\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n gap: 1,\r\n alignItems: \"center\",\r\n \"&:hover .action-icons\": {\r\n opacity: 1,\r\n visibility: \"visible\",\r\n },\r\n }}\r\n onClick={() => handleApplyFilter(filter)}\r\n >\r\n {filter.value === filterMaster?.saved_filters?.selectedId && (\r\n <Box sx={{ display: \"flex\", alignItems: \"center\" }}>\r\n <CheckBox />\r\n </Box>\r\n )}\r\n\r\n <ListItemText primary={filter.label} />\r\n\r\n <Box\r\n onClick={(e) => e.stopPropagation()}\r\n className=\"action-icons\"\r\n sx={{\r\n display: \"flex\",\r\n gap: 1,\r\n opacity: 0,\r\n visibility: \"hidden\",\r\n transition: \"opacity 0.2s ease, visibility 0.2s ease\",\r\n }}\r\n >\r\n <IconButton\r\n size=\"large\"\r\n onClick={() => handleListItemClick(filter)}\r\n >\r\n <EditIcon />\r\n </IconButton>\r\n\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => {\r\n setFilterToDelete(filter);\r\n setDeleteFilterModalOpen?.(true);\r\n }}\r\n >\r\n <DeleteIcon />\r\n </IconButton>\r\n </Box>\r\n </ListItem>\r\n ))}\r\n </List>\r\n );\r\n\r\n // ----------------------------------------\r\n // RENDER: SHARED FILTERS\r\n // ----------------------------------------\r\n const renderSharedFilters = (source: FilterOperationListProps[]) =>\r\n source.length === 0 ? (\r\n <Typography>No Shared Filters</Typography>\r\n ) : (\r\n <List sx={{ display: \"flex\", flexDirection: \"column\", gap: 1 }}>\r\n {source\r\n .filter((f) =>\r\n f.label?.toLowerCase().includes(searchTerm.toLowerCase())\r\n )\r\n .map((filter) => (\r\n <ListItem\r\n key={filter.value}\r\n sx={{\r\n cursor: \"pointer\",\r\n borderRadius: \"8px\",\r\n bgcolor: \"#f2f6f8ff\",\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n gap: 1,\r\n alignItems: \"center\",\r\n \"&:hover .action-icons\": {\r\n opacity: 1,\r\n visibility: \"visible\",\r\n },\r\n }}\r\n onClick={() => handleApplyFilter(filter)}\r\n >\r\n {filter.value === filterMaster?.saved_filters?.selectedId && (\r\n <Box sx={{ display: \"flex\", alignItems: \"center\" }}>\r\n <CheckBox />\r\n </Box>\r\n )}\r\n\r\n <ListItemText primary={filter.label} />\r\n\r\n <Box\r\n onClick={(e) => e.stopPropagation()}\r\n className=\"action-icons\"\r\n sx={{\r\n display: \"flex\",\r\n gap: 1,\r\n opacity: 0,\r\n visibility: \"hidden\",\r\n transition: \"opacity 0.2s ease, visibility 0.2s ease\",\r\n }}\r\n >\r\n {(filter.is_editable || filter.is_owner) && (\r\n <IconButton\r\n size=\"large\"\r\n onClick={() => handleListItemClick(filter)}\r\n >\r\n <EditIcon />\r\n </IconButton>\r\n )}\r\n {filter.is_owner && (\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => {\r\n setFilterToDelete(filter);\r\n setDeleteFilterModalOpen?.(true);\r\n }}\r\n >\r\n <DeleteIcon />\r\n </IconButton>\r\n )}\r\n </Box>\r\n </ListItem>\r\n ))}\r\n </List>\r\n );\r\n\r\n // ----------------------------------------\r\n // RENDER MAIN COMPONENT\r\n // ----------------------------------------\r\n return (\r\n <Box className=\"saved-filter-component-wrapper\">\r\n {!editMode && (\r\n <>\r\n {/* Search */}\r\n <Box sx={{ mb: 2 }}>\r\n <CustomSearch\r\n value={searchTerm}\r\n onChange={setSearchTerm}\r\n className=\"search-input\"\r\n />\r\n </Box>\r\n\r\n {/* ---- My Filters ---- */}\r\n <Box\r\n sx={{\r\n background: \"#fff\",\r\n borderRadius: \"12px\",\r\n border: \"1px solid #eee\",\r\n mb: 2,\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n <Accordion\r\n disableGutters\r\n elevation={0}\r\n expanded={openAccordion === \"my\"}\r\n onChange={() =>\r\n // setOpenAccordion(openAccordion === \"my\" ? \"shared\" : \"my\")\r\n toggleAccodion(\"my\")\r\n }\r\n >\r\n <AccordionSummary\r\n expandIcon={<ExpandMoreIcon fontSize=\"small\" />}\r\n >\r\n <Typography fontWeight={600}>My Filters</Typography>\r\n </AccordionSummary>\r\n <Divider sx={{ width: \"100%\" }} />\r\n <AccordionDetails\r\n sx={{\r\n p: \"9px\",\r\n maxHeight: \"230px\",\r\n overflowY: \"auto\",\r\n scrollbarWidth: \"thin\",\r\n }}\r\n >\r\n {renderMyFilters(myFilters)}\r\n </AccordionDetails>\r\n </Accordion>\r\n </Box>\r\n\r\n {/* ---- Shared Filters ---- */}\r\n <Box\r\n sx={{\r\n background: \"#fff\",\r\n borderRadius: \"12px\",\r\n border: \"1px solid #eee\",\r\n mb: 2,\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n <Accordion\r\n disableGutters\r\n elevation={0}\r\n expanded={openAccordion === \"shared\"}\r\n onChange={() =>\r\n // setOpenAccordion(openAccordion === \"shared\" ? \"my\" : \"shared\")\r\n toggleAccodion(\"shared\")\r\n }\r\n >\r\n <AccordionSummary\r\n expandIcon={<ExpandMoreIcon fontSize=\"small\" />}\r\n >\r\n <Typography fontWeight={600}>Shared Filters</Typography>\r\n </AccordionSummary>\r\n <Divider sx={{ width: \"100%\" }} />\r\n <AccordionDetails\r\n sx={{\r\n p: \"9px\",\r\n maxHeight: \"230px\",\r\n overflowY: \"auto\",\r\n scrollbarWidth: \"thin\",\r\n }}\r\n >\r\n {renderSharedFilters(sharedFilters)}\r\n </AccordionDetails>\r\n </Accordion>\r\n </Box>\r\n </>\r\n )}\r\n\r\n {/* Edit Component */}\r\n {editMode && (\r\n <SavedFilterEditComponent\r\n columnsData={columnsData}\r\n dropdownData={dropdownData}\r\n tableStates={tableStates}\r\n editMode={editMode}\r\n setEditMode={setEditMode}\r\n searchTerm={searchTerm}\r\n setSearchTerm={setSearchTerm}\r\n onSaveFilterButtonClick={onSaveFilterButtonClick}\r\n setDeleteFilterModalOpen={setDeleteFilterModalOpen}\r\n onChangeFunction={onChangeFunction}\r\n filterComponentOptions={filterComponentOptions}\r\n />\r\n )}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default SavedFilter;\r\n","import {\r\n Box,\r\n FormControl,\r\n FormControlLabel,\r\n MenuItem,\r\n Radio,\r\n Select,\r\n SelectChangeEvent,\r\n} from \"@mui/material\";\r\nimport {\r\n AttributesFilterProps,\r\n FilterMasterStateProps,\r\n FilterStateProps,\r\n} from \"../../../types/filter\";\r\nimport CustomSearch from \"./search\";\r\nimport { useMemo } from \"react\";\r\n\r\nconst AttributesFilter = ({\r\n columnsData,\r\n tableStates,\r\n dropdownData,\r\n searchTerm,\r\n setSearchTerm,\r\n tabValue,\r\n onChangeFunction,\r\n isFlatJson,\r\n}: AttributesFilterProps) => {\r\n const { filterMaster, setFilterMaster, filters, setFilters } = tableStates;\r\n\r\n const selectedAttribute = filterMaster?.attributes?.selected;\r\n\r\n const currentRadio = useMemo(() => {\r\n return Array.isArray(filterMaster?.attributes?.radio)\r\n ? (filterMaster!.attributes!.radio as string[])\r\n : [];\r\n }, [filterMaster?.attributes?.radio]);\r\n\r\n const handleSelectChange = (event: SelectChangeEvent) => {\r\n const attributeKey = event.target.value as string;\r\n\r\n const newFilterMasterState = {\r\n ...filterMaster,\r\n attributes: {\r\n ...filterMaster?.attributes,\r\n selected: attributeKey,\r\n radio: [],\r\n },\r\n };\r\n\r\n setFilterMaster(newFilterMasterState as FilterMasterStateProps);\r\n\r\n const newState = {\r\n filterMaster: newFilterMasterState,\r\n filters: filters,\r\n };\r\n\r\n onChangeFunction && onChangeFunction(newState);\r\n };\r\n\r\n const handleSingleRadioSelect = (value: string) => {\r\n const selectedAttr = filterMaster?.attributes.selected;\r\n if (!selectedAttr) return;\r\n\r\n const matchingColumn = columnsData?.column_list?.find(\r\n (column) => column.datasource_list === selectedAttr\r\n );\r\n if (!matchingColumn) return;\r\n\r\n let updatedFilters: FilterStateProps[] = [...filters];\r\n let updatedRadio: string[] = [];\r\n\r\n if (value === \"\") {\r\n // If deselecting, remove the filter\r\n updatedFilters = filters?.filter(\r\n (f) => f.filter_attribute !== matchingColumn.attribute_key\r\n );\r\n } else {\r\n // Else, replace with new single selection\r\n const defaultOperator =\r\n columnsData?.operation_list[matchingColumn.element_type]?.[0]?.value ||\r\n \"in\";\r\n\r\n const newFilter = {\r\n ...matchingColumn,\r\n filter_attribute: matchingColumn.attribute_key,\r\n filter_operator: defaultOperator,\r\n filter_value: [value],\r\n };\r\n\r\n const exists = filters?.some(\r\n (f) => f?.filter_attribute === matchingColumn?.attribute_key\r\n );\r\n if (exists) {\r\n updatedFilters = filters?.map((f) =>\r\n f?.filter_attribute === matchingColumn?.attribute_key ? newFilter : f\r\n ) as FilterStateProps[];\r\n } else {\r\n updatedFilters = [...filters, newFilter] as FilterStateProps[];\r\n }\r\n\r\n updatedRadio = [value];\r\n }\r\n\r\n setFilters(updatedFilters);\r\n\r\n const updatedFilterMaster = {\r\n ...filterMaster,\r\n attributes: {\r\n ...filterMaster.attributes,\r\n radio: updatedRadio,\r\n },\r\n activeFilterTabIndex: tabValue as number,\r\n };\r\n\r\n setFilterMaster(updatedFilterMaster);\r\n\r\n onChangeFunction &&\r\n onChangeFunction({\r\n filters: updatedFilters,\r\n filterMaster: updatedFilterMaster,\r\n });\r\n };\r\n\r\n const selectedAttributeOptions = useMemo(() => {\r\n const selected = columnsData?.column_list?.find(\r\n (col) => col.datasource_list === selectedAttribute\r\n )?.attribute_key;\r\n\r\n return selected ? dropdownData[selected] : [];\r\n }, [selectedAttribute, dropdownData]);\r\n\r\n return (\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"1.25rem\",\r\n }}\r\n className=\"attributes-filter-component-wrapper\"\r\n >\r\n {/* Attribute Select Dropdown */}\r\n <FormControl fullWidth size=\"small\">\r\n <Select\r\n value={selectedAttribute || \"\"}\r\n onChange={handleSelectChange}\r\n displayEmpty\r\n renderValue={(selected) => {\r\n if (!selected) {\r\n return <span>Select Attribute</span>;\r\n }\r\n return columnsData?.column_list?.find(\r\n (col) => col.datasource_list === selected\r\n )?.name;\r\n }}\r\n sx={{\r\n \"& .MuiOutlinedInput-root\": {\r\n borderRadius: \"6px\",\r\n fontSize: \"14px\",\r\n bgcolor: \"#fafafa\",\r\n \"& fieldset\": {\r\n borderColor: \"#7a5af8 !important\",\r\n },\r\n \"&:hover fieldset\": {\r\n borderColor: \"#7a5af8 !important\",\r\n },\r\n \"&.Mui-focused fieldset\": {\r\n borderColor: \"#7a5af8 !important\",\r\n boxShadow: \"none\",\r\n },\r\n },\r\n \"& .MuiSelect-select\": {\r\n padding: \"8px 14px\",\r\n },\r\n }}\r\n >\r\n {columnsData?.column_list\r\n ?.filter((column) => column.element_type.includes(\"select\"))\r\n .map((column, index) => (\r\n <MenuItem\r\n key={index}\r\n value={column.datasource_list}\r\n disabled={column.datasource_list === selectedAttribute}\r\n >\r\n {column.name}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n\r\n {/* Search and Single Radio Options */}\r\n <Box>\r\n {selectedAttribute && (\r\n <CustomSearch value={searchTerm} onChange={setSearchTerm} />\r\n )}\r\n\r\n {dropdownData && (\r\n <Box\r\n className=\"attributes-filter-list\"\r\n sx={{ mt: 2, overflow: \"auto\", maxHeight: \"calc(100dvh - 300px)\" }}\r\n >\r\n <FormControl>\r\n {selectedAttributeOptions\r\n ?.filter((option) => {\r\n if (!searchTerm) return true;\r\n return option.label\r\n .toLowerCase()\r\n .includes(searchTerm.toLowerCase());\r\n })\r\n .map((option) => {\r\n const isSelected = currentRadio.includes(option.value);\r\n // const isSelected = currentFilterValue.includes(option.value);\r\n\r\n return (\r\n <FormControlLabel\r\n key={option.value}\r\n control={\r\n <Radio\r\n checked={isSelected}\r\n onClick={() =>\r\n isSelected\r\n ? handleSingleRadioSelect(\"\")\r\n : handleSingleRadioSelect(option.value)\r\n }\r\n />\r\n }\r\n label={option.label}\r\n />\r\n );\r\n })}\r\n </FormControl>\r\n </Box>\r\n )}\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default AttributesFilter;\r\n","export function deepMergeObjects<T>(target: T, source: Partial<T>): T {\r\n const output = { ...target };\r\n for (const key in source) {\r\n if (\r\n source[key] &&\r\n typeof source[key] === \"object\" &&\r\n !Array.isArray(source[key])\r\n ) {\r\n output[key] = deepMergeObjects(\r\n (target as any)[key] || {},\r\n (source as any)[key]\r\n );\r\n } else {\r\n (output as any)[key] = source[key];\r\n }\r\n }\r\n return output;\r\n}\r\n","import { Box } from \"@mui/material\";\r\nimport { FilterFormComponentProps } from \"../../../types/filter\";\r\nimport MainFilter from \"./main-filter\";\r\nimport SavedFilter from \"./saved-filter\";\r\nimport AttributesFilter from \"./attributes-filter\";\r\n\r\ninterface Props extends FilterFormComponentProps {\r\n searchTerm: string;\r\n setSearchTerm: React.Dispatch<React.SetStateAction<string>>;\r\n}\r\n\r\nconst SingleFilterRendering = ({\r\n columnsData,\r\n dropdownData,\r\n tableStates,\r\n onSaveFilterButtonClick,\r\n onChangeFunction,\r\n filterComponentOptions,\r\n editMode,\r\n setEditMode,\r\n setDeleteFilterModalOpen,\r\n tabValue,\r\n searchTerm,\r\n setSearchTerm,\r\n}: Props) => {\r\n const showFilter = filterComponentOptions?.tabOptions?.showFilter;\r\n\r\n const commonProps = {\r\n columnsData,\r\n dropdownData,\r\n tableStates,\r\n onChangeFunction,\r\n };\r\n\r\n const editProps = {\r\n editMode,\r\n setEditMode,\r\n setDeleteFilterModalOpen,\r\n tabValue,\r\n };\r\n\r\n const attributesProps = {\r\n searchTerm,\r\n setSearchTerm,\r\n tabValue,\r\n };\r\n\r\n return (\r\n <Box sx={{ padding: \"1.5rem 0.75rem\", height: \"100%\" }}>\r\n {showFilter === \"main\" && (\r\n <MainFilter\r\n {...commonProps}\r\n onSaveFilterButtonClick={onSaveFilterButtonClick}\r\n filterComponentOptions={filterComponentOptions}\r\n />\r\n )}\r\n\r\n {showFilter === \"saved\" && (\r\n <SavedFilter\r\n {...commonProps}\r\n {...editProps}\r\n onSaveFilterButtonClick={onSaveFilterButtonClick}\r\n filterComponentOptions={filterComponentOptions}\r\n />\r\n )}\r\n\r\n {showFilter === \"attributes\" && (\r\n <AttributesFilter {...commonProps} {...attributesProps} />\r\n )}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default SingleFilterRendering;\r\n","import {\r\n ChangeEvent,\r\n Dispatch,\r\n SetStateAction,\r\n useEffect,\r\n useState,\r\n} from \"react\";\r\nimport {\r\n Box,\r\n Button,\r\n Checkbox,\r\n Dialog,\r\n DialogContent,\r\n DialogTitle,\r\n Divider,\r\n FormControlLabel,\r\n IconButton,\r\n TextField,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport { CloseIcon } from \"../../../../assets/svg\";\r\nimport {\r\n FilterFormComponentProps,\r\n FilterMasterStateProps,\r\n} from \"../../../types/filter\";\r\nimport CalendarTodayIcon from \"@mui/icons-material/CalendarToday\";\r\nimport { USER_ID } from \"../../../libs/utils/common\";\r\n// import { set } from \"react-hook-form\";\r\n\r\nconst primary = \"#7A5AF8\";\r\n\r\ninterface SavedFilterModalViewProps {\r\n open: boolean;\r\n onClose: () => void;\r\n onSave: () => void;\r\n filterMaster: FilterMasterStateProps | null;\r\n setFilterMaster: Dispatch<SetStateAction<FilterMasterStateProps | null>>;\r\n columnsData: FilterFormComponentProps | undefined;\r\n hasSavedFilters?: boolean;\r\n forceShowSharingControls?: boolean;\r\n disableShareFilter?: boolean;\r\n}\r\n\r\nconst SavedFilterModalView = ({\r\n open,\r\n onClose,\r\n onSave,\r\n filterMaster,\r\n setFilterMaster,\r\n columnsData,\r\n disableShareFilter = false,\r\n forceShowSharingControls = false,\r\n}: SavedFilterModalViewProps) => {\r\n const [shareWithTeam, setShareWithTeam] = useState<boolean>(false);\r\n const [allowTeamEdit, setAllowTeamEdit] = useState<boolean>(false);\r\n const filterNameValue = filterMaster?.saved_filters?.selectedName ?? \"\";\r\n const discriptionValue = filterMaster?.saved_filters?.description ?? \"\";\r\n\r\n const isSaveDisabled =\r\n !filterNameValue.trim() || (allowTeamEdit && !shareWithTeam);\r\n\r\n const selectedFilterId = filterMaster?.saved_filters?.selectedId || \"\";\r\n\r\n // Reset modal state when modal opens for a new filter\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const filterId = filterMaster?.saved_filters?.selectedId;\r\n const filterObj1 = columnsData?.shared_filter?.find(\r\n (f: any) => f.id === filterId\r\n );\r\n // NEW FILTER → RESET everything\r\n if (!filterId && !filterObj1) {\r\n setFilterMaster((prev: any) => {\r\n if (!prev) return prev;\r\n return {\r\n ...prev,\r\n saved_filters: {\r\n ...(prev.saved_filters ?? {}),\r\n selectedId: null,\r\n selectedName: \"\",\r\n description: \"\",\r\n is_shared: false,\r\n is_editable: false,\r\n },\r\n };\r\n });\r\n setShareWithTeam(false);\r\n setAllowTeamEdit(false);\r\n return;\r\n }\r\n\r\n // EXISTING FILTER → Load from columnsData.saved_filter\r\n const filterObj = columnsData?.shared_filter?.find(\r\n (f: any) => f.id === filterId\r\n );\r\n if (filterObj) {\r\n setFilterMaster((prev) => {\r\n if (!prev) return prev;\r\n return {\r\n ...prev,\r\n saved_filters: {\r\n ...(prev.saved_filters ?? {}),\r\n selectedId: filterId,\r\n selectedName: filterObj.name || \"\",\r\n description: filterObj.description || \"\",\r\n is_shared: filterObj.is_shared || false,\r\n is_editable: filterObj.is_editable === \"true\",\r\n },\r\n };\r\n });\r\n // const initialShare = filterObj.is_shared ?? false;\r\n // const initialAllow = initialShare\r\n // ? filterObj.is_editable === \"true\"\r\n // : false;\r\n // setShareWithTeam(initialShare);\r\n // setAllowTeamEdit(initialAllow);\r\n const initialShare =\r\n filterObj.is_shared === true || filterObj.is_shared === \"true\";\r\n const initialAllow =\r\n initialShare &&\r\n (filterObj.is_editable === true || filterObj.is_editable === \"true\");\r\n\r\n setShareWithTeam(initialShare);\r\n setAllowTeamEdit(initialAllow);\r\n\r\n persistPreferences(initialShare, initialAllow);\r\n }\r\n }, [\r\n open,\r\n columnsData,\r\n filterMaster?.saved_filters?.selectedId,\r\n setFilterMaster,\r\n ]); // Added dependencies for loading\r\n\r\n // Persist toggle state to filterMaster\r\n const persistPreferences = (sharedValue: boolean, editableValue: boolean) => {\r\n setFilterMaster((prev) => {\r\n if (!prev) return prev;\r\n\r\n return {\r\n ...prev,\r\n saved_filters: {\r\n ...(prev.saved_filters ?? {}),\r\n is_shared: sharedValue,\r\n is_editable: editableValue,\r\n },\r\n };\r\n });\r\n };\r\n\r\n // Handle Share Toggle\r\n\r\n const handleShareToggle = (\r\n _: ChangeEvent<HTMLInputElement>,\r\n checked: boolean\r\n ) => {\r\n setShareWithTeam(checked);\r\n\r\n const nextAllow = checked ? allowTeamEdit : false;\r\n setAllowTeamEdit(nextAllow);\r\n\r\n persistPreferences(checked, nextAllow);\r\n };\r\n\r\n // Handle Allow Edit Toggle\r\n\r\n const handleAllowEditToggle = (\r\n _: ChangeEvent<HTMLInputElement>,\r\n checked: boolean\r\n ) => {\r\n if (!shareWithTeam) return; // Cannot enable edit without sharing\r\n\r\n setAllowTeamEdit(checked);\r\n persistPreferences(shareWithTeam, checked);\r\n };\r\n\r\n const shouldShowSharingControls = forceShowSharingControls || true; // always show\r\n\r\n const getModalTitle = () => {\r\n const selectedId = filterMaster?.saved_filters?.selectedId;\r\n\r\n if (!selectedId) return \"Save Filter\"; // new filter\r\n\r\n const filterObj = columnsData?.shared_filter?.find(\r\n (f: any) => f.id === selectedId\r\n );\r\n if (filterObj?.is_shared) {\r\n return \"Shared Filter\";\r\n }\r\n return \"My Filter\";\r\n };\r\n\r\n const handleSave = () => {\r\n persistPreferences(shareWithTeam, allowTeamEdit);\r\n onSave(); // call original save handler\r\n };\r\n\r\n // Get the selected filter object from columnsData.saved_filter\r\n const selectedFilter = columnsData?.shared_filter?.find(\r\n (f: any) => f.id === selectedFilterId\r\n );\r\n\r\n const selectedSavedFilter = columnsData?.shared_filter?.find(\r\n (f: any) => f.id === selectedFilterId\r\n );\r\n\r\n const isOwner = String(selectedSavedFilter?.is_owner) === \"true\";\r\n\r\n // Check if we should show prefields\r\n const showPrefields =\r\n (selectedSavedFilter && selectedSavedFilter.is_editable === \"true\") ||\r\n selectedSavedFilter;\r\n\r\n // Disable checkboxes if prefields are shown\r\n const showCheckboxes = !showPrefields;\r\n\r\n const isNewFilter = !selectedSavedFilter;\r\n\r\n const isshow = isOwner;\r\n\r\n return (\r\n <Dialog open={open} onClose={onClose} maxWidth=\"sm\" fullWidth>\r\n <DialogTitle sx={{ display: \"flex\", justifyContent: \"space-between\" }}>\r\n <Typography fontSize={18} fontWeight={600} marginTop={1}>\r\n {getModalTitle()}\r\n </Typography>\r\n <Box onClick={onClose} sx={{ cursor: \"pointer\" }}>\r\n <CloseIcon />\r\n </Box>\r\n </DialogTitle>\r\n\r\n <Divider sx={{ mx: \"25px\", my: \"2px\", bgcolor: \"#f9f7f727\" }} />\r\n\r\n <DialogContent sx={{ pt: 0 }}>\r\n <Typography my={1} fontSize={\"14px\"}>\r\n Give a name to this filter so you can easily reuse it later.\r\n </Typography>\r\n {/* Filter Name */}\r\n <Typography mt={2} fontSize={11}>\r\n Filter Name\r\n </Typography>\r\n <TextField\r\n fullWidth\r\n size=\"small\"\r\n value={filterNameValue}\r\n onChange={(e) =>\r\n setFilterMaster((prev) => {\r\n if (!prev) return prev;\r\n return {\r\n ...prev,\r\n saved_filters: {\r\n ...(prev.saved_filters ?? {}),\r\n selectedName: e.target.value,\r\n },\r\n };\r\n })\r\n }\r\n sx={{\r\n mb: 0,\r\n \"& .MuiOutlinedInput-root\": {\r\n width: \"50%\",\r\n \"& fieldset\": { borderColor: \"#888\" },\r\n \"&:hover fieldset\": { borderColor: \"black\" },\r\n \"&.Mui-focused fieldset\": { borderColor: primary },\r\n \"& .MuiInputBase-input\": { fontSize: \"12px\" },\r\n },\r\n }}\r\n />\r\n {/* Description */}\r\n <Typography mt={2} fontSize={11}>\r\n Description\r\n </Typography>\r\n <TextField\r\n fullWidth\r\n minRows={3}\r\n value={discriptionValue}\r\n size=\"small\"\r\n sx={{\r\n mb: 1,\r\n \"& .MuiOutlinedInput-root\": {\r\n \"& fieldset\": { borderColor: \"#888\" },\r\n \"&:hover fieldset\": { borderColor: \"black\" },\r\n \"&.Mui-focused fieldset\": { borderColor: primary },\r\n },\r\n }}\r\n onChange={(e) => {\r\n const val = e.target.value;\r\n\r\n // block more than 200 chars\r\n if (val.length > 200) return;\r\n\r\n setFilterMaster((prev) => {\r\n if (!prev) return prev;\r\n return {\r\n ...prev,\r\n saved_filters: {\r\n ...(prev.saved_filters ?? {}),\r\n description: val,\r\n },\r\n };\r\n });\r\n }}\r\n />\r\n\r\n <Typography sx={{ mb: 1, fontSize: 12, color: \"#888\" }}>\r\n (Max. 200 Characters)\r\n </Typography>\r\n {/* Sharing Controls */}\r\n {shouldShowSharingControls &&\r\n (showCheckboxes || isshow) &&\r\n !disableShareFilter && (\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 0.5,\r\n \"& .MuiFormControlLabel-label\": { fontSize: \"14px\" },\r\n }}\r\n >\r\n <FormControlLabel\r\n control={\r\n <Checkbox\r\n size=\"small\"\r\n checked={shareWithTeam}\r\n onChange={handleShareToggle}\r\n sx={{\r\n color: \"black\",\r\n \"&.Mui-checked\": { color: \"black\" },\r\n }}\r\n />\r\n }\r\n label=\"Share with team member.\"\r\n />\r\n\r\n {shareWithTeam && (\r\n <FormControlLabel\r\n control={\r\n <Checkbox\r\n size=\"small\"\r\n checked={allowTeamEdit}\r\n onChange={handleAllowEditToggle}\r\n sx={{\r\n color: \"black\",\r\n \"&.Mui-checked\": { color: \"black\" },\r\n }}\r\n />\r\n }\r\n label=\"Allow editing to Team member\"\r\n />\r\n )}\r\n </Box>\r\n )}\r\n {/* prefields */}\r\n {showPrefields && !isshow && (\r\n <Box\r\n sx={{\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr 1fr\",\r\n gap: 3,\r\n mt: 2,\r\n }}\r\n >\r\n <Box>\r\n <Typography\r\n sx={{\r\n fontSize: \"14px\",\r\n fontWeight: 500,\r\n color: \"#6b6b6b\",\r\n mb: 0.5,\r\n }}\r\n >\r\n Created On*\r\n </Typography>\r\n\r\n <TextField\r\n fullWidth\r\n size=\"small\"\r\n value={\r\n selectedFilter?.created_date\r\n ? new Date(selectedFilter.created_date).toLocaleString()\r\n : \"\"\r\n } // format date\r\n InputProps={{\r\n readOnly: true,\r\n endAdornment: (\r\n <IconButton size=\"small\">\r\n <CalendarTodayIcon fontSize=\"small\" />\r\n </IconButton>\r\n ),\r\n sx: {\r\n backgroundColor: \"#0E0C0B0F\",\r\n borderRadius: \"4px\",\r\n },\r\n }}\r\n />\r\n </Box>\r\n\r\n <Box>\r\n <Typography\r\n sx={{\r\n fontSize: \"14px\",\r\n fontWeight: 500,\r\n color: \"#6b6b6b\",\r\n mb: 0.5,\r\n }}\r\n >\r\n Created By*\r\n </Typography>\r\n <TextField\r\n fullWidth\r\n size=\"small\"\r\n value={selectedFilter?.created_by || \"\"}\r\n InputProps={{\r\n readOnly: true,\r\n sx: {\r\n backgroundColor: \"#0E0C0B0F\",\r\n borderRadius: \"4px\",\r\n },\r\n }}\r\n />\r\n </Box>\r\n\r\n <Box>\r\n <Typography\r\n sx={{\r\n fontSize: \"14px\",\r\n fontWeight: 500,\r\n color: \"#6b6b6b\",\r\n mb: 0.5,\r\n }}\r\n >\r\n Modified On*\r\n </Typography>\r\n\r\n <TextField\r\n fullWidth\r\n size=\"small\"\r\n value={\r\n selectedFilter?.modified_date\r\n ? new Date(selectedFilter.modified_date).toLocaleString()\r\n : \"\"\r\n }\r\n InputProps={{\r\n readOnly: true,\r\n endAdornment: (\r\n <IconButton size=\"small\">\r\n <CalendarTodayIcon fontSize=\"small\" />\r\n </IconButton>\r\n ),\r\n\r\n sx: {\r\n backgroundColor: \"#0E0C0B0F\",\r\n borderRadius: \"4px\",\r\n },\r\n }}\r\n />\r\n </Box>\r\n\r\n <Box>\r\n <Typography\r\n sx={{\r\n fontSize: \"14px\",\r\n fontWeight: 500,\r\n color: \"#6b6b6b\",\r\n mb: 0.5,\r\n }}\r\n >\r\n Modified By*\r\n </Typography>\r\n <TextField\r\n fullWidth\r\n size=\"small\"\r\n value={selectedFilter?.modified_by || \"\"}\r\n InputProps={{\r\n readOnly: true,\r\n sx: {\r\n backgroundColor: \"#0E0C0B0F\",\r\n borderRadius: \"4px\",\r\n },\r\n }}\r\n />\r\n </Box>\r\n </Box>\r\n )}\r\n {/* Buttons */}\r\n <Box\r\n sx={{ display: \"flex\", justifyContent: \"flex-end\", gap: 1, mt: 3 }}\r\n >\r\n <Button\r\n variant=\"outlined\"\r\n onClick={onClose}\r\n sx={{\r\n borderColor: primary,\r\n color: primary,\r\n \"&:hover\": {\r\n borderColor: primary,\r\n backgroundColor: \"rgba(122, 90, 248, 0.04)\",\r\n },\r\n }}\r\n >\r\n Cancel\r\n </Button>\r\n\r\n <Button\r\n variant=\"contained\"\r\n onClick={handleSave}\r\n disabled={isSaveDisabled}\r\n sx={{\r\n backgroundColor: primary,\r\n \"&:hover\": { backgroundColor: \"#6A4DE8\" },\r\n \"&.Mui-disabled\": {\r\n backgroundColor: \"#d7cefd\",\r\n color: \"rgba(255, 255, 255, 0.7)\",\r\n },\r\n }}\r\n >\r\n Save\r\n </Button>\r\n </Box>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n};\r\n\r\nexport default SavedFilterModalView;\r\n","import { SxProps, Theme } from \"@mui/material\";\r\n\r\ninterface VerticalTabStyleProps {\r\n mainTabsContainer: SxProps<Theme>;\r\n mainTabContainer: SxProps<Theme>;\r\n mainTabLabel: SxProps<Theme>;\r\n}\r\n\r\nexport const verticalTabStyles: VerticalTabStyleProps = {\r\n mainTabsContainer: {\r\n backgroundColor: \"#FAFAF9\",\r\n height: \"100%\",\r\n minWidth: \"6.75rem\",\r\n position: \"sticky\",\r\n top: \"0\",\r\n left: \"0\",\r\n\r\n \"& .MuiTabs-indicator\": {\r\n display: \"none\",\r\n },\r\n },\r\n\r\n mainTabContainer: {\r\n borderRadius: \"0.375rem\",\r\n padding: \"0.5rem 1.25rem\",\r\n alignItems: \"flex-start\",\r\n color: \"rgba(14, 12, 11, 0.9)\",\r\n textTransform: \"initial\",\r\n minHeight: \"38px\",\r\n\r\n \"&.Mui-selected\": {\r\n backgroundColor: \"rgba(122, 90, 248, 0.16)\",\r\n color: \"#7A5AF8\",\r\n borderRadius: \"0.375rem\",\r\n },\r\n },\r\n\r\n mainTabLabel: {},\r\n};\r\n\r\ninterface HorizontalTabStyleProps {\r\n mainTabsContainer: SxProps<Theme>;\r\n mainTabContainer: SxProps<Theme>;\r\n mainTabLabel: SxProps<Theme>;\r\n}\r\n\r\nexport const horizontalTabStyles: HorizontalTabStyleProps = {\r\n mainTabsContainer: {\r\n mb: 2,\r\n \"& .MuiTab-root\": {\r\n color: \"#0E0C0BE5\",\r\n textTransform: \"none\",\r\n fontWeight: 500,\r\n },\r\n \"& .Mui-selected\": {\r\n color: \"#7A5AF8\",\r\n },\r\n \"& .MuiTabs-indicator\": {\r\n backgroundColor: \"#7A5AF8\",\r\n height: 3,\r\n },\r\n },\r\n\r\n mainTabContainer: {},\r\n\r\n mainTabLabel: {},\r\n};\r\n","import { Tabs, Tab, TabsProps, Box } from \"@mui/material\";\r\nimport { verticalTabStyles } from \"../styles\";\r\n\r\ninterface StyledTabsProps extends TabsProps {\r\n tabItems: { label: string }[];\r\n}\r\n\r\nconst CustomVerticalTabs = ({ tabItems, ...props }: StyledTabsProps) => {\r\n const { value, onChange } = props;\r\n\r\n return (\r\n <Tabs\r\n value={value}\r\n onChange={onChange}\r\n aria-label=\"vertical-tabs\"\r\n orientation=\"vertical\"\r\n variant=\"scrollable\"\r\n sx={verticalTabStyles.mainTabsContainer}\r\n {...props}\r\n >\r\n {tabItems.map((tab, idx) => {\r\n return (\r\n <Tab\r\n key={idx}\r\n sx={verticalTabStyles.mainTabContainer}\r\n label={\r\n <Box sx={verticalTabStyles.mainTabLabel}>\r\n <span>{tab.label}</span>\r\n </Box>\r\n }\r\n />\r\n );\r\n })}\r\n </Tabs>\r\n );\r\n};\r\n\r\nexport default CustomVerticalTabs;\r\n","import * as React from \"react\";\r\nimport Box from \"@mui/material/Box\";\r\n\r\ninterface TabPanelProps {\r\n children?: React.ReactNode;\r\n index: number;\r\n value: number;\r\n}\r\n\r\nconst CustomTabPanel = ({\r\n children,\r\n value,\r\n index,\r\n ...props\r\n}: TabPanelProps) => {\r\n return (\r\n <Box\r\n role=\"tabpanel\"\r\n hidden={value !== index}\r\n id={`simple-tabpanel-${index}`}\r\n aria-labelledby={`simple-tab-${index}`}\r\n {...props}\r\n sx={{ height: \"100%\" }}\r\n >\r\n {value === index && children}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default CustomTabPanel;\r\n","import React from \"react\";\r\nimport { useSortable } from \"@dnd-kit/sortable\";\r\nimport { CSS } from \"@dnd-kit/utilities\";\r\nimport { Box } from \"@mui/material\";\r\nimport { DragIndicator } from \"@mui/icons-material\";\r\n\r\nexport interface SortableFilterItemProps {\r\n id: string;\r\n containerId: string;\r\n children: React.ReactNode;\r\n}\r\n\r\nconst DraggableListItem = ({\r\n id,\r\n containerId,\r\n children,\r\n}: SortableFilterItemProps) => {\r\n const {\r\n attributes,\r\n listeners,\r\n setNodeRef,\r\n transform,\r\n transition,\r\n isDragging,\r\n } = useSortable({\r\n id,\r\n data: {\r\n type: \"filter-item\",\r\n containerId,\r\n id,\r\n },\r\n });\r\n\r\n const style = {\r\n transform: CSS.Transform.toString(transform),\r\n transition,\r\n opacity: isDragging ? 0.8 : 1,\r\n };\r\n\r\n return (\r\n <Box\r\n ref={setNodeRef}\r\n style={style}\r\n {...attributes}\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n \"&:hover\": { bgcolor: \"#f5f5f5\" },\r\n borderRadius: 1,\r\n marginBottom: 1,\r\n cursor: isDragging ? \"grabbing\" : \"default\",\r\n boxShadow: isDragging ? \"0 2px 8px rgba(0,0,0,0.1)\" : \"none\",\r\n }}\r\n >\r\n <Box\r\n {...listeners}\r\n sx={{ cursor: \"grab\", display: \"flex\", alignItems: \"center\" }}\r\n >\r\n <DragIndicator sx={{ mr: 1, color: \"#ccc\" }} />\r\n </Box>\r\n {children}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default DraggableListItem;\r\n","import { SxProps, Theme } from \"@mui/material\";\r\n\r\ninterface DialogStyleProps {\r\n dialogTitle: SxProps<Theme>;\r\n dialogContent: SxProps<Theme>;\r\n dialogActionsButton: SxProps<Theme>;\r\n}\r\n\r\ninterface ListingValuesStyleProps {\r\n wrapper: SxProps<Theme>;\r\n heading: SxProps<Theme>;\r\n button: SxProps<Theme>;\r\n draggableContainer: SxProps<Theme>;\r\n draggableCover: SxProps<Theme>;\r\n itemLabel: SxProps<Theme>;\r\n headerContainer: SxProps<Theme>;\r\n}\r\ninterface TabStyleProps {\r\n mainTabsHeader: SxProps<Theme>;\r\n mainTabSelect: SxProps<Theme>;\r\n mainTabDropdown: SxProps<Theme>;\r\n selectDropdownSeparator: SxProps<Theme>;\r\n checkboxStyle: SxProps<Theme>;\r\n}\r\n\r\nexport const dialogStyles: DialogStyleProps = {\r\n dialogTitle: {\r\n backgroundColor: \"#FBFBFC\",\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n padding: \"0.75rem\",\r\n },\r\n\r\n dialogContent: {\r\n display: \"flex\",\r\n gap: \"1rem\",\r\n paddingTop: \"1rem !important\",\r\n },\r\n\r\n dialogActionsButton: {\r\n backgroundColor: \"#7A5AF8\",\r\n color: \"#fff\",\r\n },\r\n};\r\n\r\nexport const listingValuesStyles: ListingValuesStyleProps = {\r\n wrapper: {\r\n border: \"0.5px solid #0E0C0B1F\",\r\n borderRadius: \"8px\",\r\n // minHeight: \"10rem\",\r\n backgroundColor: \"#fdfdfc\",\r\n zIndex: 10,\r\n overflow: \"hidden\",\r\n },\r\n heading: { fontWeight: 400, color: \"#0E0C0BB2\", fontSize: \"16px\" },\r\n button: { fontSize: \"13px\", textTransform: \"none\", color: \"#0E0C0BB2\" },\r\n draggableContainer: {\r\n maxHeight: 200,\r\n borderRadius: 1,\r\n mt: 2,\r\n transition: \"background-color 0.2s ease\",\r\n },\r\n draggableCover: {\r\n minHeight: \"200px\",\r\n maxHeight: \"200px\",\r\n overflowY: \"auto\",\r\n },\r\n itemLabel: { display: \"flex\", alignItems: \"center\", flex: 1 },\r\n headerContainer: {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n mb: 2,\r\n },\r\n};\r\n\r\nexport const TabsStyles: TabStyleProps = {\r\n mainTabsHeader: {\r\n fontStyle: \"italic\",\r\n fontWeight: 400,\r\n fontSize: \"12px\",\r\n color: \"#0E0C0BB2\",\r\n },\r\n mainTabDropdown: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n width: \"50%\",\r\n paddingRight: 1,\r\n },\r\n mainTabSelect: {\r\n width: \"65%\",\r\n \"& .MuiOutlinedInput-root\": {\r\n borderRadius: \"6px\",\r\n \"&.Mui-focused .MuiOutlinedInput-notchedOutline\": {\r\n borderColor: \"#7A5AF8\",\r\n },\r\n },\r\n },\r\n\r\n selectDropdownSeparator: {\r\n width: \"30%\",\r\n \"& .MuiOutlinedInput-root\": {\r\n borderRadius: \"6px\",\r\n \"&.Mui-focused .MuiOutlinedInput-notchedOutline\": {\r\n borderColor: \"#7A5AF8\",\r\n },\r\n },\r\n },\r\n\r\n checkboxStyle: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n },\r\n};\r\n","import {\r\n Alert,\r\n Box,\r\n Button,\r\n Grid,\r\n IconButton,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport CustomSearch from \"../../filter/components/search/index.tsx\";\r\nimport {\r\n SortableContext,\r\n verticalListSortingStrategy,\r\n} from \"@dnd-kit/sortable\";\r\nimport { useDroppable } from \"@dnd-kit/core\";\r\nimport DraggableListItem from \"./draggable-listitem.tsx\";\r\nimport { listingValuesStyles } from \"../style.ts\";\r\nimport Loader from \"../../common/loader/loader.tsx\";\r\nimport { ClosedEyeIcon, EyeIcon } from \"../../../../assets/svg.tsx\";\r\nimport React from \"react\";\r\n``;\r\n\r\ninterface FilterValue {\r\n label: string;\r\n value: string;\r\n}\r\n\r\ninterface ListingValuesProps {\r\n filteredValues: FilterValue[];\r\n buttonText: string;\r\n onClick: () => void;\r\n headerText: string;\r\n searchTerm?: string;\r\n setSearchTerm?: React.Dispatch<React.SetStateAction<string>>;\r\n containerId: string;\r\n tabsApiDataLoading?: boolean;\r\n onItemToggle: (\r\n item: { label: string; value: string },\r\n fromContainerId: string\r\n ) => void;\r\n enableDragAndDrop?: boolean;\r\n isQuickTabActive?: boolean;\r\n AlertComponenet?: React.ReactNode;\r\n}\r\n\r\nconst ListingValuesContent = ({\r\n item,\r\n containerId,\r\n onItemToggle,\r\n}: {\r\n item: FilterValue;\r\n containerId: string;\r\n onItemToggle: (\r\n item: { label: string; value: string },\r\n fromContainerId: string\r\n ) => void;\r\n}) => {\r\n return (\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n gap: 1,\r\n flex: 1,\r\n color: containerId === \"tabs\" ? \"black\" : \"#9e9d9b\",\r\n }}\r\n >\r\n <Typography>{item.label}</Typography>\r\n <IconButton size=\"small\" onClick={() => onItemToggle(item, containerId)}>\r\n {containerId === \"tabs\" ? <EyeIcon /> : <ClosedEyeIcon />}\r\n </IconButton>\r\n </Box>\r\n );\r\n};\r\n\r\nconst ListingValues = ({\r\n filteredValues,\r\n buttonText,\r\n onClick,\r\n headerText,\r\n searchTerm,\r\n setSearchTerm,\r\n containerId,\r\n tabsApiDataLoading,\r\n onItemToggle,\r\n enableDragAndDrop = true,\r\n AlertComponenet,\r\n}: ListingValuesProps) => {\r\n const { setNodeRef } = useDroppable({\r\n id: containerId,\r\n data: {\r\n type: \"container\",\r\n containerId: containerId,\r\n },\r\n });\r\n\r\n return (\r\n <Grid size={6} sx={listingValuesStyles.wrapper}>\r\n {tabsApiDataLoading ? (\r\n <Loader />\r\n ) : (\r\n <>\r\n <Box\r\n sx={{\r\n p: 2,\r\n // border: \"1px solid #1a191934\",\r\n backgroundColor: \"#fdfdfc\",\r\n borderRadius: \"12px\",\r\n top: 2,\r\n // height: \"100%\",\r\n }}\r\n >\r\n <Box sx={listingValuesStyles.headerContainer}>\r\n <Typography variant=\"h6\" sx={listingValuesStyles.heading}>\r\n {headerText}\r\n </Typography>\r\n <Button\r\n onClick={onClick}\r\n variant=\"text\"\r\n size=\"small\"\r\n sx={listingValuesStyles.button}\r\n disabled={filteredValues.length === 0}\r\n >\r\n {buttonText}\r\n </Button>\r\n </Box>\r\n\r\n {searchTerm !== undefined && setSearchTerm !== undefined && (\r\n <CustomSearch value={searchTerm} onChange={setSearchTerm} />\r\n )}\r\n\r\n <Box ref={setNodeRef} sx={listingValuesStyles.draggableContainer}>\r\n {enableDragAndDrop ? (\r\n <SortableContext\r\n items={filteredValues.map((item) => item.value)}\r\n strategy={verticalListSortingStrategy}\r\n >\r\n <Box sx={listingValuesStyles.draggableCover}>\r\n {filteredValues.map((item) => (\r\n <DraggableListItem\r\n key={item.value}\r\n id={item.value}\r\n containerId={containerId}\r\n >\r\n <ListingValuesContent\r\n item={item}\r\n containerId={containerId}\r\n onItemToggle={onItemToggle}\r\n />\r\n </DraggableListItem>\r\n ))}\r\n </Box>\r\n </SortableContext>\r\n ) : (\r\n <Box sx={listingValuesStyles.draggableCover}>\r\n {filteredValues?.length > 0 &&\r\n filteredValues.map((item) => (\r\n <ListingValuesContent\r\n key={item.value}\r\n item={item}\r\n containerId={containerId}\r\n onItemToggle={onItemToggle}\r\n />\r\n ))}\r\n </Box>\r\n )}\r\n </Box>\r\n </Box>\r\n {AlertComponenet && AlertComponenet}\r\n </>\r\n )}\r\n </Grid>\r\n );\r\n};\r\n\r\nexport default ListingValues;\r\n","import { Alert, Box } from \"@mui/material\";\r\n\r\ninterface InfoAlertProps {\r\n message: string;\r\n width?: string | number;\r\n top?: number | string;\r\n color?: string;\r\n zIndex?: number;\r\n position?: \"absolute\" | \"relative\" | \"fixed\" | \"sticky\";\r\n}\r\n\r\nconst InfoAlert = ({\r\n message,\r\n width = \"100%\",\r\n top = 10,\r\n color = \"#088AB2\",\r\n zIndex = -1,\r\n position = \"absolute\",\r\n}: InfoAlertProps) => {\r\n return (\r\n <Box\r\n sx={{\r\n fontSize: \"12px\",\r\n color,\r\n width,\r\n height: \"fit-content\",\r\n position,\r\n zIndex,\r\n top,\r\n }}\r\n >\r\n <Alert sx={{ borderRadius: \"12px 12px 0 0 !important\" }} severity=\"info\">\r\n {message}\r\n </Alert>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default InfoAlert;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport {\r\n Box,\r\n Select,\r\n MenuItem,\r\n FormControl,\r\n Typography,\r\n Checkbox,\r\n FormControlLabel,\r\n Grid,\r\n Alert,\r\n} from \"@mui/material\";\r\n\r\nimport ListingValues from \"../common/listing-values\";\r\nimport {\r\n DndContext,\r\n closestCenter,\r\n KeyboardSensor,\r\n MouseSensor,\r\n TouchSensor,\r\n useSensor,\r\n useSensors,\r\n DragEndEvent,\r\n} from \"@dnd-kit/core\";\r\nimport {\r\n QuickTabConfigProps,\r\n SettingsQuickTabProps,\r\n} from \"../../../types/filter-settings\";\r\nimport { TabsStyles } from \"../style\";\r\nimport InfoAlert from \"../common/info-alert\";\r\nimport { useFullscreenPopoverContainer } from \"../../../libs/hooks/useFullScreen\";\r\nimport { ColumnItem } from \"./column\";\r\n\r\nconst QuickTab = ({\r\n filterSettingStates,\r\n columnsData,\r\n tabsApiData,\r\n tabsApiDataLoading,\r\n activeTab,\r\n columnTabAttributes,\r\n isFlatJson,\r\n}: SettingsQuickTabProps) => {\r\n const {\r\n settingsData,\r\n setSettingsData,\r\n saveButtonError,\r\n setSaveButtonError,\r\n columnTabState,\r\n sortingTabState,\r\n } = filterSettingStates;\r\n const { container: fullscreenContainer } = useFullscreenPopoverContainer();\r\n\r\n const [searchTerm, setSearchTerm] = useState<string>(\"\");\r\n const [currentQuickAttribute, setCurrentQuickAttribute] = useState<string>(\r\n settingsData?.quick_tab?.attribute || \"\"\r\n );\r\n\r\n const quickTabStates = settingsData?.quick_tab as QuickTabConfigProps;\r\n const mappedColumns: ColumnItem[] =\r\n columnTabAttributes?.map((column) => ({\r\n label: column?.name,\r\n value: column?.attribute_key,\r\n })) || [];\r\n // const activeTabIndex = filterSettingStates?.columnTabState?.tabs?.findIndex(\r\n // (tab) => tab?.tab_name?.value == activeTab\r\n // // tab?.tab_name?.label?.toLowerCase() == activeTab?.toLowerCase()\r\n // );\r\n // In case there is no quick tab state from API\r\n const normalizeTabItem = (item: any) => ({\r\n label: item.label,\r\n value: isFlatJson ? item.label : item.value,\r\n });\r\n useEffect(() => {\r\n const stateToArray =\r\n (quickTabStates && Object.entries(quickTabStates)) || [];\r\n const isEmptyState = stateToArray.length ? false : true;\r\n\r\n if (isEmptyState) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n attribute: columnsData[0]?.value,\r\n sorting: \"asc\",\r\n },\r\n }));\r\n }\r\n }, [columnsData]);\r\n\r\n // When user changes attribute\r\n useEffect(() => {\r\n if (currentQuickAttribute === settingsData?.quick_tab?.attribute) return;\r\n\r\n const normalizedTabs = tabsApiData?.map(normalizeTabItem) || [];\r\n\r\n if (tabsApiData?.length) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n hide_list: normalizedTabs,\r\n show_list: [],\r\n },\r\n }));\r\n\r\n setCurrentQuickAttribute(settingsData?.quick_tab?.attribute || \"\");\r\n } else {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n hide_list: [],\r\n show_list: [],\r\n },\r\n }));\r\n\r\n setCurrentQuickAttribute(\"\");\r\n }\r\n }, [tabsApiData]);\r\n\r\n // Validation when user changes show list or hide list\r\n useEffect(() => {\r\n const showList = quickTabStates?.show_list || [];\r\n const hideList = quickTabStates?.hide_list || [];\r\n\r\n if (showList || hideList) {\r\n // Check if showList is valid (between 1 and 5 items)\r\n const isValidShowList = showList.length > 0 && showList.length <= 5;\r\n const ERROR_CODE = \"quick_tab_error\";\r\n\r\n if (!isValidShowList) {\r\n const errorMessage = {\r\n type: ERROR_CODE,\r\n message:\r\n showList.length === 0\r\n ? \"Quick Tab: Please select at least one item\"\r\n : \"Quick Tab: Please select no more than 5 items\",\r\n };\r\n\r\n // Check if the error is already present in the messages array\r\n const hasQuickTabError = saveButtonError?.messages?.some(\r\n (message) => message.type === ERROR_CODE\r\n );\r\n\r\n // Update the error state\r\n\r\n // Later we can use this to show error message when we will make error logic more simple\r\n // setSaveButtonError((prev) => {\r\n // const otherMessages =\r\n // prev?.messages?.filter((message) => message.type !== ERROR_CODE) ||\r\n // [];\r\n\r\n // return {\r\n // ...prev,\r\n // hasError: true,\r\n // messages: hasQuickTabError\r\n // ? [...prev?.messages]\r\n // : [...otherMessages, errorMessage],\r\n // };\r\n // });\r\n } else {\r\n const hasOtherMessages = saveButtonError?.messages?.some(\r\n (message) => message.type !== ERROR_CODE\r\n );\r\n // Reset error state if the list is valid\r\n // setSaveButtonError((prev) => ({\r\n // ...prev,\r\n // hasError: hasOtherMessages,\r\n // messages:\r\n // prev?.messages?.filter((message) => message.type !== ERROR_CODE) ||\r\n // [],\r\n // }));\r\n }\r\n }\r\n }, [quickTabStates?.hide_list, quickTabStates?.show_list]);\r\n\r\n const sortingOptions = [\r\n { label: \"A-Z\", value: \"asc\" },\r\n { label: \"Z-A\", value: \"dsc\" },\r\n { label: \"Count (Ascending)\", value: \"count_asc\" },\r\n { label: \"Count (Descending)\", value: \"count_dsc\" },\r\n { label: \"Custom\", value: \"custom\" },\r\n ];\r\n\r\n // Convert show_list/hide_list to FilterValue[] for rendering only\r\n\r\n const constructHideList = () => {\r\n const normalizedTabs = tabsApiData?.map(normalizeTabItem) || [];\r\n\r\n // remove items already in show_list (value-safe comparison)\r\n return normalizedTabs?.filter(\r\n (tab) => !showListValues?.some((i) => i?.value === tab?.value)\r\n );\r\n };\r\n\r\n const showListValues = quickTabStates?.show_list || [];\r\n const hideListValues = constructHideList() || [];\r\n\r\n const sensors = useSensors(\r\n useSensor(MouseSensor),\r\n useSensor(TouchSensor),\r\n useSensor(KeyboardSensor)\r\n );\r\n\r\n // Drag and drop logic, update only local state\r\n const handleDragEnd = (event: DragEndEvent) => {\r\n const { active, over } = event;\r\n if (!over) return;\r\n\r\n const currentContainer = active.data.current?.containerId;\r\n const overContainer = over.data.current?.containerId;\r\n\r\n if (!currentContainer || !overContainer) return;\r\n\r\n let newShowList = [...(quickTabStates.show_list ?? [])];\r\n let newHideList = [...(quickTabStates.hide_list ?? [])];\r\n\r\n // -------------------------------------\r\n // CASE 1: REORDER INSIDE SAME LIST\r\n // -------------------------------------\r\n if (currentContainer === overContainer) {\r\n if (currentContainer === \"list\") {\r\n const oldIndex = newHideList.findIndex((i) => i.value === active.id);\r\n const newIndex = newHideList.findIndex((i) => i.value === over.id);\r\n\r\n if (oldIndex !== -1 && newIndex !== -1) {\r\n const [removed] = newHideList.splice(oldIndex, 1);\r\n newHideList.splice(newIndex, 0, removed);\r\n }\r\n } else {\r\n const oldIndex = newShowList.findIndex((i) => i.value === active.id);\r\n const newIndex = newShowList.findIndex((i) => i.value === over.id);\r\n\r\n if (oldIndex !== -1 && newIndex !== -1) {\r\n const [removed] = newShowList.splice(oldIndex, 1);\r\n newShowList.splice(newIndex, 0, removed);\r\n }\r\n }\r\n }\r\n\r\n // -------------------------------------\r\n // CASE 2: MOVE BETWEEN LISTS\r\n // -------------------------------------\r\n if (currentContainer !== overContainer) {\r\n if (currentContainer === \"list\" && overContainer === \"tabs\") {\r\n if (newShowList.length < 5) {\r\n const idx = newHideList.findIndex(\r\n (i) => i.value === String(active.id)\r\n );\r\n if (idx !== -1) {\r\n const item = newHideList.splice(idx, 1)[0];\r\n newShowList.push(item);\r\n\r\n // 🌟 ALSO create sorting tab entry if missing\r\n // if (!settingsData?.sorting?.isDefault) {\r\n // const exists = settingsData.sorting?.tabs?.some(\r\n // (t) => t.tab_name.value === item.value\r\n // );\r\n\r\n // if (!exists) {\r\n // settingsData?.sorting.tabs.push({\r\n // tab_name: item,\r\n // sortby: [{ column: \"\", order: \"asc\" }],\r\n // });\r\n // }\r\n // }\r\n\r\n setSettingsData((prev) => {\r\n let updatedSorting = prev.sorting;\r\n let updatedColumn = prev.column;\r\n\r\n // ---------------------------------------------------\r\n // ⭐ Add to sorting.tabs (if not default and not exist)\r\n // ---------------------------------------------------\r\n if (!prev?.sorting?.isDefault) {\r\n const sortingExists = prev.sorting?.tabs?.some(\r\n (t) => t.tab_name.value === item.value\r\n );\r\n\r\n if (!sortingExists) {\r\n updatedSorting = {\r\n ...prev.sorting,\r\n tabs: [\r\n ...prev.sorting.tabs,\r\n {\r\n tab_name: item,\r\n sortby: [],\r\n },\r\n ],\r\n };\r\n }\r\n }\r\n\r\n // ---------------------------------------------------\r\n // ⭐ Add to column.tabs (if not default and not exist)\r\n // ---------------------------------------------------\r\n if (!prev?.column?.isDefault) {\r\n const columnExists = prev.column?.tabs?.some(\r\n (t) => t.tab_name.value === item.value\r\n );\r\n\r\n if (!columnExists) {\r\n updatedColumn = {\r\n ...prev.column,\r\n tabs: [\r\n ...prev.column.tabs,\r\n {\r\n tab_name: item,\r\n show_list: mappedColumns,\r\n hide_list: [],\r\n },\r\n ],\r\n };\r\n }\r\n }\r\n\r\n // ---------------------------------------------------\r\n // ⭐ FINAL RETURN\r\n // ---------------------------------------------------\r\n return {\r\n ...prev,\r\n sorting: updatedSorting,\r\n column: updatedColumn,\r\n };\r\n });\r\n }\r\n }\r\n } else if (currentContainer === \"tabs\" && overContainer === \"list\") {\r\n const idx = newShowList.findIndex((i) => i.value === String(active.id));\r\n if (idx !== -1) {\r\n const item = newShowList.splice(idx, 1)[0];\r\n newHideList.push(item);\r\n setSettingsData((prev) => {\r\n let updatedSorting = prev.sorting;\r\n let updatedColumn = prev.column;\r\n\r\n // ---------------------------------------------------\r\n // Remove from sorting.tabs (if not default)\r\n // ---------------------------------------------------\r\n if (!prev?.sorting?.isDefault) {\r\n updatedSorting = {\r\n ...prev.sorting,\r\n tabs: prev?.sorting?.tabs?.filter(\r\n (t) => t.tab_name?.value !== item?.value\r\n ),\r\n };\r\n }\r\n\r\n // ---------------------------------------------------\r\n // Remove from column.tabs (if not default)\r\n // ---------------------------------------------------\r\n if (!prev?.column?.isDefault) {\r\n updatedColumn = {\r\n ...prev.column,\r\n tabs: prev?.column?.tabs?.filter(\r\n (t) => t.tab_name?.value !== item?.value\r\n ),\r\n };\r\n }\r\n\r\n // ---------------------------------------------------\r\n // ⭐ FINAL RETURN\r\n // ---------------------------------------------------\r\n return {\r\n ...prev,\r\n sorting: updatedSorting,\r\n column: updatedColumn,\r\n };\r\n });\r\n }\r\n }\r\n }\r\n\r\n // ----------------------------------------------------------\r\n // ⭐ APPLY MASTER UPDATE (with isDefault CHECK for columns)\r\n // ----------------------------------------------------------\r\n setSettingsData((prev) => {\r\n let updatedColumn = prev.column;\r\n\r\n // -----------------------------------------\r\n // ⭐ COLUMN REORDER (only if NOT default)\r\n // -----------------------------------------\r\n if (!prev?.column?.isDefault) {\r\n updatedColumn = {\r\n ...prev.column,\r\n tabs: prev.column?.tabs\r\n ? [...prev.column.tabs].sort((a, b) => {\r\n const i1 = newShowList.findIndex(\r\n (t) => t.value === a.tab_name.value\r\n );\r\n const i2 = newShowList.findIndex(\r\n (t) => t.value === b.tab_name.value\r\n );\r\n return i1 - i2;\r\n })\r\n : [],\r\n };\r\n }\r\n\r\n // -----------------------------------------\r\n // ⭐ SORTING REORDER (same pattern as column)\r\n // -----------------------------------------\r\n const updatedSorting = (() => {\r\n // If default → clear tabs\r\n if (prev.sorting?.isDefault) {\r\n return {\r\n isDefault: true,\r\n sort_by: prev.sorting?.sort_by || \"asc\",\r\n };\r\n }\r\n\r\n // If custom → reorder tabs based on newShowList\r\n const sorted = {\r\n ...prev.sorting,\r\n tabs: prev.sorting?.tabs\r\n ? [...prev.sorting.tabs].sort((a, b) => {\r\n const i1 = newShowList.findIndex(\r\n (t) => t.value === a.tab_name.value\r\n );\r\n const i2 = newShowList.findIndex(\r\n (t) => t.value === b.tab_name.value\r\n );\r\n return i1 - i2;\r\n })\r\n : [],\r\n };\r\n return sorted;\r\n })();\r\n\r\n // FINAL RETURN\r\n return {\r\n ...prev,\r\n quick_tab: {\r\n ...prev.quick_tab,\r\n show_list: newShowList,\r\n hide_list: newHideList,\r\n },\r\n column: updatedColumn,\r\n sorting: updatedSorting,\r\n };\r\n });\r\n };\r\n\r\n const filteredListValues = hideListValues.filter((value) =>\r\n value?.label?.toLowerCase().includes(searchTerm.toLowerCase())\r\n );\r\n\r\n // Show All/Hide All logic (local only)\r\n const handleShowAll = () => {\r\n const currentShowList = quickTabStates.show_list || [];\r\n const currentHideList = quickTabStates.hide_list || [];\r\n\r\n const availableSlots = 5 - currentShowList.length;\r\n\r\n if (availableSlots <= 0) return; // Already at limit\r\n\r\n const limitedHideList = currentHideList.slice(0, availableSlots);\r\n\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n show_list: [...currentShowList, ...limitedHideList],\r\n hide_list: currentHideList.filter(\r\n (item) => !limitedHideList.find((i) => i.value === item.value)\r\n ),\r\n },\r\n }));\r\n };\r\n\r\n const handleHideAll = () => {\r\n setSettingsData((prev) => {\r\n const updatedQuickTab = {\r\n ...prev?.quick_tab,\r\n hide_list: [\r\n ...(prev?.quick_tab?.hide_list || []),\r\n ...(prev?.quick_tab?.show_list || []),\r\n ],\r\n show_list: [],\r\n };\r\n\r\n // Reset only the lists, not the whole structure\r\n const updatedColumn = (() => {\r\n if (prev?.column?.isDefault) {\r\n return {\r\n ...prev.column,\r\n show_list: [],\r\n hide_list: [\r\n ...(prev.column?.hide_list || []),\r\n ...(prev.column?.show_list || []),\r\n ],\r\n };\r\n }\r\n\r\n // Tab mode → reset each tab's field lists\r\n const updatedTabs = prev?.column?.tabs?.map((t) => ({\r\n ...t,\r\n show_list: [],\r\n hide_list: [...(t.hide_list || []), ...(t.show_list || [])],\r\n }));\r\n\r\n return {\r\n ...prev.column,\r\n tabs: updatedTabs,\r\n };\r\n })();\r\n\r\n const updatedSorting = (() => {\r\n // DEFAULT MODE: sorting applies globally\r\n if (prev.sorting?.isDefault) {\r\n return {\r\n ...prev.sorting,\r\n sortby: [], // reset sort\r\n };\r\n }\r\n\r\n // TAB MODE: need to clear sorting per tab\r\n return {\r\n ...prev.sorting,\r\n tabs: prev.quick_tab?.show_list?.map(() => ({\r\n sortby: [],\r\n })),\r\n };\r\n })();\r\n\r\n return {\r\n ...prev,\r\n quick_tab: updatedQuickTab,\r\n column: updatedColumn,\r\n sorting: updatedSorting,\r\n };\r\n });\r\n };\r\n\r\n // Checkbox logic (local only)\r\n const handleShowAllTabChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n isAllSelected: e.target.checked,\r\n },\r\n }));\r\n };\r\n const handleCombineOtherTabChange = (\r\n e: React.ChangeEvent<HTMLInputElement>\r\n ) => {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n isCombineOther: e.target.checked,\r\n },\r\n }));\r\n };\r\n\r\n const handleItemToggle = (\r\n item: { label: string; value: string },\r\n fromContainerId: string\r\n ) => {\r\n const toShowList = [...(quickTabStates.show_list ?? [])];\r\n const toHideList = [...(quickTabStates.hide_list ?? [])];\r\n\r\n setSettingsData((prev) => {\r\n let updatedColumn = prev.column; // default (unchanged)\r\n let updatedSorting = prev.sorting;\r\n\r\n if (fromContainerId === \"list\") {\r\n if (toShowList.length >= 5) return prev;\r\n\r\n const index = toHideList.findIndex((i) => i.value == item.value);\r\n if (index > -1) {\r\n toHideList.splice(index, 1);\r\n toShowList.push(item);\r\n // 🌟 ALSO create sorting tab entry if missing\r\n if (!sortingTabState?.isDefault) {\r\n const exists = prev.sorting?.tabs?.some(\r\n (t) => t.tab_name.value === item.value\r\n );\r\n if (!exists) {\r\n updatedSorting = {\r\n ...prev.sorting,\r\n tabs: [\r\n ...prev.sorting.tabs,\r\n {\r\n tab_name: {\r\n label: item.label,\r\n value: item.value,\r\n },\r\n sortby: [],\r\n },\r\n ],\r\n };\r\n }\r\n }\r\n if (!columnTabState?.isDefault) {\r\n const exists = prev?.column?.tabs?.some(\r\n (t) => t.tab_name.value === item.value\r\n );\r\n if (!exists) {\r\n updatedColumn = {\r\n ...prev.column,\r\n tabs: [\r\n ...prev.column.tabs,\r\n {\r\n tab_name: {\r\n label: item.label,\r\n value: item.value,\r\n },\r\n show_list: mappedColumns,\r\n hide_list: [],\r\n },\r\n ],\r\n };\r\n }\r\n }\r\n }\r\n } else if (fromContainerId === \"tabs\") {\r\n const index = toShowList.findIndex((i) => i.value == item.value);\r\n if (index > -1) {\r\n toShowList.splice(index, 1);\r\n toHideList.push(item);\r\n // let itemIndex =\r\n // filterSettingStates?.quickTabStates?.show_list?.findIndex(\r\n // (i) => i.value == item.value\r\n // );\r\n // 🔥 REMOVE COLUMN WHEN TAB REMOVED (if not default)\r\n if (!columnTabState?.isDefault) {\r\n const updatedTabs = prev?.column?.tabs.filter(\r\n (tab) => tab.tab_name?.value !== item.value\r\n );\r\n\r\n updatedColumn = {\r\n ...prev.column,\r\n tabs: updatedTabs,\r\n };\r\n }\r\n\r\n if (!sortingTabState.isDefault) {\r\n const updatedSortingTabs = prev?.sorting?.tabs?.filter(\r\n (tab) => tab.tab_name?.value != item.value\r\n );\r\n updatedSorting = {\r\n ...prev.sorting,\r\n tabs: updatedSortingTabs,\r\n };\r\n }\r\n }\r\n }\r\n\r\n return {\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n show_list: toShowList,\r\n hide_list: toHideList,\r\n },\r\n column: updatedColumn,\r\n sorting: updatedSorting,\r\n };\r\n });\r\n };\r\n\r\n const enableDND = quickTabStates?.sorting === \"custom\" ? true : false;\r\n\r\n return (\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n // gap: \"0.5rem\",\r\n height: \"100%\",\r\n }}\r\n >\r\n <Typography variant=\"caption\" sx={TabsStyles.mainTabsHeader}>\r\n *Quick filter settings will be reflected in horizontal tabs\r\n </Typography>\r\n <Box>\r\n <Grid sx={{ position: \"relative\" }} container>\r\n <Grid size={12}>\r\n <Box>\r\n <Grid sx={TabsStyles.mainTabDropdown} size={6}>\r\n <FormControl sx={TabsStyles.mainTabSelect} size=\"small\">\r\n <Select\r\n value={quickTabStates?.attribute || \"\"}\r\n onChange={(e) =>\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n attribute: e.target.value,\r\n },\r\n column: prev?.column?.isDefault\r\n ? {\r\n ...prev?.column,\r\n show_list: mappedColumns,\r\n hide_list: [],\r\n }\r\n : {\r\n ...prev?.column,\r\n tabs: [],\r\n },\r\n\r\n sorting: prev?.sorting?.isDefault\r\n ? {\r\n ...prev?.sorting,\r\n sortby: [],\r\n }\r\n : {\r\n ...prev?.sorting,\r\n tabs: [],\r\n },\r\n }))\r\n }\r\n MenuProps={{ container: fullscreenContainer }}\r\n >\r\n {columnsData?.map((column: any) => (\r\n <MenuItem key={column?.value} value={column?.value}>\r\n {column?.label}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n <FormControl\r\n sx={TabsStyles.selectDropdownSeparator}\r\n size=\"small\"\r\n >\r\n <Select\r\n value={quickTabStates?.sorting || \"asc\"}\r\n onChange={(e) =>\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n sorting: e.target.value,\r\n },\r\n }))\r\n }\r\n MenuProps={{ container: fullscreenContainer }}\r\n >\r\n {sortingOptions.map((option) => (\r\n <MenuItem key={option?.value} value={option?.value}>\r\n {option?.label}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Grid>\r\n </Box>\r\n </Grid>\r\n <Grid>\r\n {/* <Alert\r\n severity=\"info\"\r\n sx={{\r\n fontSize: \"12px\",\r\n color: \"#088AB2\",\r\n }}\r\n >\r\n Please select at least 1 and at most 5 values to display as tabs.\r\n </Alert> */}\r\n </Grid>\r\n <DndContext\r\n sensors={sensors}\r\n collisionDetection={closestCenter}\r\n onDragEnd={handleDragEnd}\r\n >\r\n <Grid sx={{ mt: 1 }} container spacing={2} size={12}>\r\n <ListingValues\r\n buttonText=\"Show All\"\r\n onClick={handleShowAll}\r\n headerText=\"List of Values\"\r\n filteredValues={filteredListValues}\r\n searchTerm={searchTerm}\r\n setSearchTerm={setSearchTerm}\r\n containerId=\"list\"\r\n tabsApiDataLoading={tabsApiDataLoading}\r\n onItemToggle={handleItemToggle}\r\n enableDragAndDrop={enableDND}\r\n />\r\n <ListingValues\r\n buttonText=\"Hide All\"\r\n onClick={handleHideAll}\r\n headerText=\"View as Tabs\"\r\n filteredValues={showListValues}\r\n containerId=\"tabs\"\r\n // tabsApiDataLoading={tabsApiDataLoading}\r\n onItemToggle={handleItemToggle}\r\n enableDragAndDrop={enableDND}\r\n AlertComponenet={\r\n <InfoAlert\r\n message=\"Please select at least 1 and at most 5 values to display as\r\n tabs.\"\r\n width={\"49.2%\"}\r\n // position=\"absolute\"\r\n // color=\"#088AB2\"\r\n // top={10}\r\n zIndex={-1}\r\n />\r\n }\r\n />\r\n </Grid>\r\n </DndContext>\r\n <Grid size={12}>\r\n <Box sx={TabsStyles.checkboxStyle}>\r\n <FormControlLabel\r\n control={\r\n <Checkbox\r\n checked={quickTabStates?.isAllSelected || false}\r\n onChange={handleShowAllTabChange}\r\n size=\"small\"\r\n sx={{\r\n \"&.Mui-checked\": {\r\n color: \"#7A5AF8\",\r\n },\r\n }}\r\n />\r\n }\r\n label='Show \"All\" tab'\r\n />\r\n <FormControlLabel\r\n control={\r\n <Checkbox\r\n checked={quickTabStates?.isCombineOther || false}\r\n onChange={handleCombineOtherTabChange}\r\n size=\"small\"\r\n sx={{\r\n \"&.Mui-checked\": {\r\n color: \"#7A5AF8\",\r\n },\r\n }}\r\n />\r\n }\r\n label='Combine remaining values under \"Other\" tab'\r\n />\r\n </Box>\r\n </Grid>\r\n </Grid>\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default QuickTab;\r\n","import {\r\n SxProps,\r\n ToggleButton,\r\n ToggleButtonGroup,\r\n ToggleButtonGroupProps,\r\n} from \"@mui/material\";\r\nimport { ToggleButtonTabsProps } from \"../../../types/filter-settings\";\r\n\r\nconst selectedTabStyle: SxProps = {\r\n textTransform: \"initial\",\r\n minWidth: \"5rem\",\r\n minHeight: \"1.875rem\",\r\n color: \"#7A5AF8\",\r\n fontWeight: 500,\r\n fontSize: \"0.813rem\",\r\n borderColor: \"#7A5AF8\",\r\n\r\n \"&.Mui-selected\": {\r\n backgroundColor: \"#7A5AF8\",\r\n color: \"#fff\",\r\n fontWeight: 600,\r\n \"&:hover\": {\r\n backgroundColor: \"#6346e2\",\r\n },\r\n },\r\n};\r\n\r\nexport default function CustomToggleSwitchButton({\r\n buttons,\r\n ...props\r\n}: { buttons: ToggleButtonTabsProps[] } & ToggleButtonGroupProps) {\r\n return (\r\n <ToggleButtonGroup\r\n exclusive\r\n size=\"small\"\r\n color=\"primary\"\r\n sx={{ marginTop: \"-4px\", marginBottom: \"6px\" }}\r\n {...props}\r\n >\r\n {buttons.map((button) => (\r\n <ToggleButton\r\n key={button?.label}\r\n value={button?.value}\r\n disabled={button?.isDisabled}\r\n sx={selectedTabStyle}\r\n >\r\n {button?.label}\r\n </ToggleButton>\r\n ))}\r\n </ToggleButtonGroup>\r\n );\r\n}\r\n","import { ToggleButtonTabsProps } from \"../../types/filter-settings\";\r\n\r\nexport const SETTINGS_TABS: { label: string }[] = [\r\n { label: \"Quick Tab\" },\r\n { label: \"Column\" },\r\n { label: \"Sorting\" },\r\n];\r\n\r\nexport const KANBAN_SETTINGS_TABS: { label: string }[] = [\r\n { label: \"Lane\" },\r\n { label: \"Group By\" },\r\n];\r\n\r\nexport const LANE_SELECTS = [\r\n { key: \"stage_group\", value: \"Stage Group\" },\r\n { key: \"stage\", value: \"Stage\" },\r\n { key: \"source\", value: \"Source\" },\r\n { key: \"status\", value: \"Status\" },\r\n];\r\n\r\nexport const TOGGLE_BUTTON_TABS: ToggleButtonTabsProps[] = [\r\n { label: \"Default\", value: true, isDisabled: false },\r\n { label: \"Tab Wise\", value: false, isDisabled: false },\r\n];\r\n","import { Tabs, TabsProps } from \"@mui/material\";\r\nimport { horizontalTabStyles } from \"../styles\";\r\n\r\nconst CustomTabs = ({ children, ...props }: TabsProps) => {\r\n const { value, onChange } = props;\r\n\r\n return (\r\n <Tabs\r\n value={value}\r\n onChange={onChange}\r\n aria-label=\"horizontal-tabs\"\r\n variant=\"scrollable\"\r\n sx={horizontalTabStyles.mainTabsContainer}\r\n {...props}\r\n >\r\n {children}\r\n </Tabs>\r\n );\r\n};\r\n\r\nexport default CustomTabs;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { Box, Typography, Tab, Grid } from \"@mui/material\";\r\n\r\nimport ListingValues from \"../common/listing-values\";\r\nimport {\r\n DndContext,\r\n closestCenter,\r\n KeyboardSensor,\r\n MouseSensor,\r\n TouchSensor,\r\n useSensor,\r\n useSensors,\r\n DragEndEvent,\r\n} from \"@dnd-kit/core\";\r\nimport { craftTableFilterSettingsOptionsProps } from \"../../../types/table-options\";\r\nimport CustomToggleSwitchButton from \"./toggle-button-switch\";\r\nimport { FilterColumnsDataProps } from \"../../../types/filter\";\r\nimport { TOGGLE_BUTTON_TABS } from \"../constants\";\r\nimport CustomTabs from \"../tabs/horizontal\";\r\nimport { ColumnTabConfigProps } from \"../../../types/filter-settings\";\r\nimport InfoAlert from \"../common/info-alert\";\r\n\r\nexport interface ColumnItem {\r\n label: string;\r\n value: string;\r\n}\r\n\r\nexport interface TabData {\r\n tab_name: string;\r\n show_list: ColumnItem[];\r\n hide_list: ColumnItem[];\r\n}\r\n\r\ninterface ColumnTabProps {\r\n filterSettingStates: craftTableFilterSettingsOptionsProps;\r\n columnsData: FilterColumnsDataProps;\r\n columnTabAttributes?: any[];\r\n columnTabAttributesLoading?: boolean;\r\n}\r\n\r\nconst ColumnTab = ({\r\n filterSettingStates,\r\n columnsData,\r\n columnTabAttributes,\r\n columnTabAttributesLoading,\r\n}: ColumnTabProps) => {\r\n const [searchTerm, setSearchTerm] = useState<string>(\"\");\r\n const [selectedTabIndex, setSelectedTabIndex] = useState<number>(0);\r\n\r\n const {\r\n quickTabStates,\r\n settingsData,\r\n setSettingsData,\r\n saveButtonError,\r\n setSaveButtonError,\r\n } = filterSettingStates;\r\n const settingsColumnState = (settingsData?.column ||\r\n {}) as ColumnTabConfigProps;\r\n const isColumnDefault = settingsColumnState?.isDefault || false;\r\n const ERROR_CODE = \"column_error\";\r\n\r\n /**\r\n * ? What is this for?\r\n *\r\n * Three main conditions are checked here:\r\n * - If the state is empty, then set the state to default and add all columns in show_list\r\n * - if Default is selected and Default is empty, then add all columns in show_list\r\n * - If Default is not selected and tabs is empty, then add all columns in show_list\r\n * of their respective tabs\r\n */\r\n useEffect(() => {\r\n const stateToArray = Object.entries(settingsColumnState) || [];\r\n const isStateEmpty = stateToArray.length ? false : true;\r\n const isDefaultEmpty =\r\n settingsColumnState?.show_list?.length ||\r\n settingsColumnState?.hide_list?.length\r\n ? false\r\n : true;\r\n const isTabWiseEmpty = settingsColumnState?.tabs?.length ? false : true;\r\n\r\n const mappedColumns: ColumnItem[] =\r\n columnTabAttributes?.map((column) => ({\r\n ...column,\r\n label: column?.name,\r\n value: column?.attribute_key,\r\n })) || [];\r\n\r\n if (isStateEmpty) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n isDefault: true,\r\n show_list: mappedColumns,\r\n hide_list: [],\r\n },\r\n }));\r\n } else if (isColumnDefault && isDefaultEmpty) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column,\r\n show_list: mappedColumns,\r\n hide_list: [],\r\n },\r\n }));\r\n } else if (!isColumnDefault) {\r\n const mappedTabs: TabData[] = isTabWiseEmpty\r\n ? quickTabStates?.show_list?.map((tab) => ({\r\n tab_name: tab,\r\n show_list: mappedColumns,\r\n hide_list: [],\r\n })) || []\r\n : quickTabStates?.show_list?.map((tab, index) => ({\r\n tab_name: tab,\r\n show_list:\r\n settingsColumnState?.tabs[index]?.show_list || mappedColumns,\r\n hide_list: settingsColumnState?.tabs[index]?.hide_list || [],\r\n })) || [];\r\n\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column, // ✅ required to satisfy SettingsDataProps\r\n tabs: mappedTabs, // updating only tabs\r\n },\r\n }));\r\n }\r\n }, [isColumnDefault]);\r\n\r\n useEffect(() => {\r\n const showList = settingsColumnState?.show_list || [];\r\n const hideList = settingsColumnState?.hide_list || [];\r\n\r\n if (showList || hideList) {\r\n const isValidShowList = showList?.length > 0;\r\n\r\n if (!isValidShowList) {\r\n const hasColumnError = saveButtonError.messages.some(\r\n (message) => message.type === ERROR_CODE\r\n );\r\n\r\n if (!hasColumnError) {\r\n setSaveButtonError((prev) => ({\r\n ...prev,\r\n hasError: true,\r\n messages: [\r\n ...prev.messages,\r\n {\r\n type: ERROR_CODE,\r\n message: \"Column: Please select at least one column\",\r\n },\r\n ],\r\n }));\r\n }\r\n } else {\r\n const hasOtherMessages = saveButtonError?.messages?.some(\r\n (message) => message.type !== ERROR_CODE\r\n );\r\n\r\n // Reset error state if the list is valid\r\n setSaveButtonError((prev) => ({\r\n ...prev,\r\n hasError: hasOtherMessages,\r\n messages:\r\n prev?.messages?.filter((message) => message.type !== ERROR_CODE) ||\r\n [],\r\n }));\r\n }\r\n }\r\n }, [settingsColumnState?.show_list, settingsColumnState?.hide_list]);\r\n\r\n const sensors = useSensors(\r\n useSensor(MouseSensor),\r\n useSensor(TouchSensor),\r\n useSensor(KeyboardSensor)\r\n );\r\n\r\n const handleToggleChange = (\r\n _: React.MouseEvent<HTMLElement>,\r\n newValue: boolean\r\n ) => {\r\n if (newValue !== null) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column,\r\n isDefault: newValue,\r\n },\r\n }));\r\n }\r\n };\r\n\r\n const constructHideList = (): ColumnItem[] => {\r\n return (\r\n columnTabAttributes\r\n ?.map((column) => ({\r\n label: column?.name,\r\n value: column?.attribute_key,\r\n }))\r\n ?.filter(\r\n (tab) =>\r\n !settingsColumnState?.show_list?.find((i) => i.value === tab.value)\r\n ) || []\r\n );\r\n };\r\n const getCurrentLists = () => {\r\n if (settingsColumnState?.isDefault) {\r\n return {\r\n showList: settingsColumnState.show_list || [],\r\n hideList: constructHideList() || [],\r\n };\r\n } else {\r\n const currentTab = settingsColumnState?.tabs?.[selectedTabIndex];\r\n return {\r\n showList: currentTab?.show_list || [],\r\n hideList:\r\n currentTab?.hide_list ||\r\n columnTabAttributes?.map((column) => ({\r\n label: column?.name,\r\n value: column?.attribute_key,\r\n })) ||\r\n [],\r\n };\r\n }\r\n };\r\n\r\n const { showList, hideList } = getCurrentLists();\r\n\r\n const showListValues = showList.map((item) => ({\r\n value: item.value,\r\n label: item.label,\r\n visible: true,\r\n }));\r\n\r\n const hideListValues = hideList.map((item) => ({\r\n value: item.value,\r\n label: item.label,\r\n visible: false,\r\n }));\r\n\r\n const filteredListValues = hideListValues.filter((value) =>\r\n value.label.toLowerCase().includes(searchTerm.toLowerCase())\r\n );\r\n\r\n const handleItemToggle = (\r\n item: { label: string; value: string },\r\n fromContainerId: string\r\n ) => {\r\n let newShowList = [...showList];\r\n let newHideList = [...hideList];\r\n\r\n if (fromContainerId === \"tabs\") {\r\n const idx = newShowList.findIndex((i) => i.value === item.value);\r\n if (idx > -1) {\r\n const [moved] = newShowList.splice(idx, 1);\r\n newHideList.push(moved);\r\n }\r\n } else if (fromContainerId === \"list\") {\r\n const idx = newHideList.findIndex((i) => i.value === item.value);\r\n if (idx > -1) {\r\n const [moved] = newHideList.splice(idx, 1);\r\n newShowList.push(moved);\r\n }\r\n }\r\n\r\n if (isColumnDefault) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column,\r\n show_list: newShowList,\r\n hide_list: newHideList,\r\n },\r\n }));\r\n } else {\r\n const updatedTabs = [...(settingsColumnState?.tabs || [])];\r\n updatedTabs[selectedTabIndex] = {\r\n ...updatedTabs[selectedTabIndex],\r\n show_list: newShowList,\r\n hide_list: newHideList,\r\n };\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column,\r\n tabs: updatedTabs,\r\n },\r\n }));\r\n }\r\n };\r\n\r\n const handleDragEnd = (event: DragEndEvent) => {\r\n const { active, over } = event;\r\n if (!over) return;\r\n\r\n const currentContainer = active.data.current?.containerId;\r\n const overContainer = over.data.current?.containerId;\r\n if (!currentContainer || !overContainer) return;\r\n\r\n const activeItem = [...showList, ...hideList].find(\r\n (item) => item.value === String(active.id)\r\n );\r\n if (!activeItem) return;\r\n\r\n let newShowList = [...showList];\r\n let newHideList = [...hideList];\r\n\r\n if (currentContainer === overContainer) {\r\n const list = currentContainer === \"list\" ? newHideList : newShowList;\r\n const oldIndex = list.findIndex(\r\n (item) => item.value === String(active.id)\r\n );\r\n const newIndex = list.findIndex((item) => item.value === String(over.id));\r\n if (oldIndex !== -1 && newIndex !== -1) {\r\n const [removed] = list.splice(oldIndex, 1);\r\n list.splice(newIndex, 0, removed);\r\n }\r\n } else {\r\n if (currentContainer === \"list\" && overContainer === \"tabs\") {\r\n const idx = newHideList.findIndex(\r\n (item) => item.value === String(active.id)\r\n );\r\n if (idx !== -1) {\r\n newHideList.splice(idx, 1);\r\n newShowList.push(activeItem);\r\n }\r\n } else if (currentContainer === \"tabs\" && overContainer === \"list\") {\r\n const idx = newShowList.findIndex(\r\n (item) => item.value === String(active.id)\r\n );\r\n if (idx !== -1) {\r\n newShowList.splice(idx, 1);\r\n newHideList.push(activeItem);\r\n }\r\n }\r\n }\r\n\r\n if (isColumnDefault) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column,\r\n show_list: newShowList,\r\n hide_list: newHideList,\r\n },\r\n }));\r\n } else {\r\n const updatedTabs = [...(settingsColumnState?.tabs || [])];\r\n updatedTabs[selectedTabIndex] = {\r\n ...updatedTabs[selectedTabIndex],\r\n show_list: newShowList,\r\n hide_list: newHideList,\r\n };\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column,\r\n tabs: updatedTabs,\r\n },\r\n }));\r\n }\r\n };\r\n\r\n const handleShowAll = () => {\r\n if (isColumnDefault) {\r\n // Default mode → update global lists\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column,\r\n show_list: [...showList, ...hideList],\r\n hide_list: [],\r\n },\r\n }));\r\n } else {\r\n // Tab mode → update only selected tab\r\n const updatedTabs = [...(settingsColumnState.tabs || [])];\r\n\r\n updatedTabs[selectedTabIndex] = {\r\n ...updatedTabs[selectedTabIndex],\r\n show_list: [...showList, ...hideList],\r\n hide_list: [],\r\n };\r\n\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column,\r\n tabs: updatedTabs,\r\n },\r\n }));\r\n }\r\n };\r\n\r\n const handleHideAll = () => {\r\n if (isColumnDefault) {\r\n // Default mode → update global lists\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column,\r\n show_list: [],\r\n hide_list: [...hideList, ...showList],\r\n },\r\n }));\r\n } else {\r\n // Tab mode → update only selected tab\r\n const updatedTabs = [...(settingsColumnState.tabs || [])];\r\n\r\n updatedTabs[selectedTabIndex] = {\r\n ...updatedTabs[selectedTabIndex],\r\n show_list: [],\r\n hide_list: [...hideList, ...showList],\r\n };\r\n\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column,\r\n tabs: updatedTabs,\r\n },\r\n }));\r\n }\r\n };\r\n\r\n const handleTabChange = (_: React.SyntheticEvent, newValue: number) => {\r\n setSelectedTabIndex(newValue);\r\n };\r\n\r\n const hasShowListQuickTabs =\r\n quickTabStates?.show_list?.length !== 0 || isColumnDefault;\r\n\r\n return (\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n // gap: \"0.75rem\",\r\n height: \"100%\",\r\n position: \"relative\",\r\n }}\r\n >\r\n <Box>\r\n <Typography variant=\"subtitle2\" sx={{ mb: 1 }}>\r\n Customize column by\r\n </Typography>\r\n <CustomToggleSwitchButton\r\n buttons={TOGGLE_BUTTON_TABS}\r\n value={isColumnDefault}\r\n onChange={handleToggleChange}\r\n />\r\n </Box>\r\n\r\n <Box sx={{ flex: 1 }}>\r\n {!isColumnDefault && hasShowListQuickTabs && (\r\n <CustomTabs value={selectedTabIndex} onChange={handleTabChange}>\r\n {quickTabStates?.show_list?.map(\r\n (tab: { label: string; value: string }) => (\r\n <Tab key={tab?.value} label={tab?.label} />\r\n )\r\n )}\r\n </CustomTabs>\r\n )}\r\n\r\n {hasShowListQuickTabs ? (\r\n <DndContext\r\n sensors={sensors}\r\n collisionDetection={closestCenter}\r\n onDragEnd={handleDragEnd}\r\n >\r\n <Grid container spacing={2}>\r\n <ListingValues\r\n containerId=\"list\"\r\n headerText=\"Hidden In List\"\r\n filteredValues={filteredListValues}\r\n buttonText=\"Show All\"\r\n onClick={handleShowAll}\r\n searchTerm={searchTerm}\r\n setSearchTerm={setSearchTerm}\r\n onItemToggle={handleItemToggle}\r\n />\r\n <ListingValues\r\n containerId=\"tabs\"\r\n headerText=\"Show In List\"\r\n filteredValues={showListValues}\r\n buttonText=\"Hide All\"\r\n onClick={handleHideAll}\r\n onItemToggle={handleItemToggle}\r\n AlertComponenet={\r\n <InfoAlert\r\n message={\r\n \"Please select at least 1 value to display as tabs.\"\r\n }\r\n width={\"49.2%\"}\r\n // position=\"absolute\"\r\n // color=\"#088AB2\"\r\n top={93}\r\n // zIndex={1}\r\n />\r\n }\r\n />\r\n </Grid>\r\n </DndContext>\r\n ) : (\r\n <Typography>View as Tabs empty in Quick Tab</Typography>\r\n )}\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default ColumnTab;\r\n","import React, { useEffect, useMemo, useState } from \"react\";\r\nimport {\r\n Box,\r\n Button,\r\n IconButton,\r\n MenuItem,\r\n Select,\r\n Tab,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport {\r\n ColumnTabConfigProps,\r\n SettingsSortingProps,\r\n SortingConfigProps,\r\n SortingConfigSortByProps,\r\n} from \"../../../types/filter-settings\";\r\nimport CustomTabs from \"../tabs/horizontal\";\r\nimport {\r\n closestCenter,\r\n DndContext,\r\n PointerSensor,\r\n useSensor,\r\n useSensors,\r\n} from \"@dnd-kit/core\";\r\nimport SortableItem from \"../../sorting-modal.tsx/sorting-item\";\r\nimport {\r\n arrayMove,\r\n SortableContext,\r\n verticalListSortingStrategy,\r\n} from \"@dnd-kit/sortable\";\r\nimport { AddIcon, CloseIcon } from \"../../../../assets/svg\";\r\nimport CustomToggleSwitchButton from \"./toggle-button-switch\";\r\nimport { TOGGLE_BUTTON_TABS } from \"../constants\";\r\n\r\nconst Sorting = ({\r\n filterSettingStates,\r\n columnsData,\r\n}: SettingsSortingProps) => {\r\n const { quickTabStates, saveButtonError, settingsData, setSettingsData } =\r\n filterSettingStates;\r\n\r\n const [activeTab, setActiveTab] = useState<string | undefined>(\r\n quickTabStates?.show_list?.[0]?.value\r\n );\r\n\r\n const columnTabState = settingsData?.column as ColumnTabConfigProps;\r\n const sortingTabState = settingsData?.sorting as SortingConfigProps;\r\n const isSortingDefault = sortingTabState?.isDefault;\r\n\r\n const isStateEmpty = useMemo(() => {\r\n return !sortingTabState || Object.entries(sortingTabState).length === 0;\r\n }, [sortingTabState]);\r\n\r\n const isEmptyDefault = useMemo(() => {\r\n return !isStateEmpty && !sortingTabState?.sortby?.length;\r\n }, [isStateEmpty, sortingTabState]);\r\n\r\n const ERROR_CODE = \"sorting_error\";\r\n\r\n // useEffect(() => {\r\n // const emptySortBy: SortingConfigSortByProps[] = [\r\n // { column: \"\", order: \"asc\" },\r\n // ];\r\n\r\n // if (isStateEmpty) {\r\n // setSettingsData((prev) => ({\r\n // ...prev,\r\n // sorting: {\r\n // isDefault: true,\r\n // sortby: emptySortBy,\r\n // },\r\n // }));\r\n // } else if (isEmptyDefault) {\r\n // setSettingsData((prev) => ({\r\n // ...prev,\r\n // sorting: {\r\n // ...prev.sorting,\r\n // isDefault: true,\r\n // },\r\n // }));\r\n\r\n // if (!sortingTabState?.isDefault) {\r\n // setSettingsData((prev) => ({\r\n // ...prev,\r\n // sorting: {\r\n // ...prev.sorting,\r\n // sortby: emptySortBy,\r\n // },\r\n // }));\r\n // }\r\n // }\r\n // }, [\r\n // isStateEmpty,\r\n // isEmptyDefault,\r\n // sortingTabState,\r\n // quickTabStates,\r\n // setSettingsData,\r\n // ]);\r\n\r\n useEffect(() => {\r\n const emptySortBy: SortingConfigSortByProps[] = [\r\n { column: \"\", order: \"asc\" },\r\n ];\r\n\r\n // CASE 1: Initialize sorting if completely empty\r\n if (!sortingTabState || Object.keys(sortingTabState).length === 0) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n sorting: {\r\n isDefault: true,\r\n sortby: [],\r\n },\r\n }));\r\n return;\r\n }\r\n\r\n // CASE 2: sorting is default BUT missing sortby\r\n // if (\r\n // (!sortingTabState?.sortby || sortingTabState?.sortby.length === 0) &&\r\n // sortingTabState?.isDefault\r\n // ) {\r\n // setSettingsData((prev) => ({\r\n // ...prev,\r\n // sorting: {\r\n // ...prev.sorting,\r\n // sortby: emptySortBy,\r\n // isDefault: true,\r\n // },\r\n // }));\r\n // return;\r\n // }\r\n\r\n // CASE 3: CUSTOM MODE → Populate tabs automatically\r\n if (\r\n sortingTabState?.isDefault === false &&\r\n (!sortingTabState?.tabs || sortingTabState?.tabs.length === 0)\r\n ) {\r\n setSettingsData((prev) => {\r\n const quickTabs = prev.quick_tab?.show_list || [];\r\n\r\n const generatedTabs = quickTabs.map((t) => ({\r\n tab_name: { value: t.value, label: t.label },\r\n sortby: emptySortBy,\r\n }));\r\n\r\n return {\r\n ...prev,\r\n sorting: {\r\n ...prev.sorting,\r\n tabs: generatedTabs,\r\n },\r\n };\r\n });\r\n }\r\n }, []);\r\n\r\n // sortingTabState.sortby is filtered based on columnTabState.show_list\r\n // useEffect(() => {\r\n // // filter sorting sortby based on column show list\r\n // if (columnTabState?.isDefault) {\r\n // setSettingsData((prev) => ({\r\n // ...prev,\r\n // sorting: {\r\n // ...prev.sorting,\r\n // // remove sortby items that are not in column show list\r\n // sortby: prev.sorting?.sortby?.filter((item) =>\r\n // columnTabState?.show_list?.some(\r\n // (columnItem) => columnItem.value === item.column\r\n // )\r\n // ),\r\n // },\r\n // }));\r\n // }\r\n // }, [columnTabState?.show_list]);\r\n\r\n const sensors = useSensors(useSensor(PointerSensor));\r\n\r\n const activeTabIndex = columnTabState?.isDefault\r\n ? quickTabStates?.show_list?.findIndex(\r\n (tab) =>\r\n tab?.value === activeTab ||\r\n tab?.label?.toLowerCase() === activeTab?.toLowerCase()\r\n )\r\n : columnTabState?.tabs?.findIndex(\r\n (tab) =>\r\n tab?.tab_name?.value == activeTab ||\r\n tab?.tab_name?.label?.toLowerCase() == activeTab?.toLowerCase()\r\n );\r\n /**\r\n * * What is happening here?\r\n *\r\n * * If isDefault is true\r\n * * - Return the sortby array from the state\r\n *\r\n * * If isDefault is false\r\n * * - Filter tabs array from sortingTabState according to activeTab index\r\n *\r\n * * If activeTab is undefined\r\n * * - Return an empty array\r\n */\r\n\r\n const tabSortedList = useMemo(() => {\r\n return isSortingDefault\r\n ? sortingTabState?.sortby || [{ column: \"\", order: \"asc\" }]\r\n : activeTab !== undefined\r\n ? sortingTabState?.tabs?.[activeTabIndex || 0]?.sortby\r\n ? sortingTabState?.tabs?.[activeTabIndex || 0]?.sortby\r\n : []\r\n : [];\r\n }, [sortingTabState, activeTab]);\r\n\r\n const updateSortList = (updated: SortingConfigSortByProps[]) => {\r\n setSettingsData((prev) => {\r\n if (prev?.sorting?.isDefault) {\r\n return { ...prev, sorting: { ...prev?.sorting, sortby: updated } };\r\n } else {\r\n const tabs = [...(prev?.sorting?.tabs || [])];\r\n tabs[activeTabIndex || 0] = {\r\n ...tabs[activeTabIndex || 0],\r\n tab_name: settingsData?.column?.tabs?.[activeTabIndex || 0]\r\n ?.tab_name || {\r\n label: \"\",\r\n value: \"\",\r\n },\r\n sortby: updated,\r\n };\r\n return { ...prev, sorting: { ...prev?.sorting, tabs } };\r\n }\r\n });\r\n };\r\n\r\n const handleDNDDropdownChange = (\r\n key: \"column\" | \"order\",\r\n value: string,\r\n index: number\r\n ) => {\r\n if (!tabSortedList) return;\r\n\r\n const updated = [...tabSortedList];\r\n updated[index] = { ...updated[index], [key]: value };\r\n updateSortList(updated);\r\n };\r\n\r\n const handleAddSort = () => {\r\n if (!tabSortedList) return;\r\n\r\n const newItem: SortingConfigSortByProps = {\r\n column: \"\",\r\n order: \"asc\",\r\n };\r\n\r\n updateSortList([...tabSortedList, newItem]);\r\n };\r\n\r\n const handleRemove = (columnKey: string) => {\r\n if (!tabSortedList) return;\r\n\r\n const updated = tabSortedList.filter((item) => item.column !== columnKey);\r\n updateSortList(updated);\r\n };\r\n\r\n const handleModeChange = (\r\n _: React.MouseEvent<HTMLElement>,\r\n value: boolean\r\n ) => {\r\n if (value !== null) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n sorting: {\r\n ...prev.sorting,\r\n isDefault: value,\r\n },\r\n }));\r\n }\r\n };\r\n\r\n const handleDragEnd = (event: any) => {\r\n if (!tabSortedList) return;\r\n\r\n const { active, over } = event;\r\n if (!over || active.id === over.id) return;\r\n\r\n const oldIndex = tabSortedList.findIndex((i) => i.column === active.id);\r\n const newIndex = tabSortedList.findIndex((i) => i.column === over.id);\r\n\r\n if (oldIndex !== -1 && newIndex !== -1) {\r\n const reordered = arrayMove(tabSortedList, oldIndex, newIndex);\r\n updateSortList(reordered);\r\n }\r\n };\r\n\r\n const hasShowListQuickTabs =\r\n quickTabStates?.show_list?.length !== 0 || isSortingDefault ? true : false;\r\n\r\n /**\r\n * ? What is happening here?\r\n *\r\n * If column show list is present then takes it's length\r\n * else it takes columnsData.column_list length\r\n *\r\n * compare it with sortingTabState.sortby.length\r\n *\r\n * if both are equal then showAddSortButton is false\r\n */\r\n const showAddSortButton = useMemo(() => {\r\n const stateLength = columnsData?.length ?? 0;\r\n const sortLength = sortingTabState?.sortby?.length ?? 0;\r\n\r\n return sortLength !== stateLength;\r\n }, [columnsData, sortingTabState]);\r\n\r\n /**\r\n * ? What is happening here?\r\n *\r\n * Check if sorting_error exists in saveButtonError state\r\n * Check if sortingTabState sortby column is empty\r\n */\r\n const isAddSortDisabled = useMemo(() => {\r\n const hasEmptyColumn = sortingTabState?.sortby?.some(\r\n (item) => item.column === \"\"\r\n );\r\n\r\n return hasEmptyColumn;\r\n }, [saveButtonError, sortingTabState]);\r\n\r\n const getCurrentLists = () => {\r\n if (sortingTabState?.isDefault) {\r\n return {\r\n showList:\r\n columnsData?.map((column: any) => ({\r\n label: column?.name,\r\n value: column?.attribute_key,\r\n })) || [],\r\n hideList: columnTabState?.hide_list || [],\r\n };\r\n } else {\r\n const currentTab = sortingTabState?.tabs?.[activeTabIndex || 0];\r\n return {\r\n showList:\r\n columnsData?.map((column: any) => ({\r\n label: column?.name,\r\n value: column?.attribute_key,\r\n })) || [],\r\n // hideList: currentTab?.hide_list || [],\r\n };\r\n }\r\n };\r\n\r\n const { showList } = getCurrentLists();\r\n\r\n return (\r\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: \"0.75rem\" }}>\r\n <Typography>Select attribute(s) you want to sort by</Typography>\r\n\r\n <CustomToggleSwitchButton\r\n buttons={TOGGLE_BUTTON_TABS}\r\n value={isSortingDefault}\r\n onChange={handleModeChange}\r\n />\r\n\r\n {hasShowListQuickTabs ? (\r\n <>\r\n <Box>\r\n {!isSortingDefault && (\r\n <CustomTabs\r\n value={activeTab}\r\n onChange={(_, tab) => setActiveTab(tab)}\r\n >\r\n {quickTabStates?.show_list?.map((tab) => (\r\n <Tab key={tab?.value} label={tab?.label} value={tab?.value} />\r\n ))}\r\n </CustomTabs>\r\n )}\r\n\r\n <DndContext\r\n sensors={sensors}\r\n collisionDetection={closestCenter}\r\n onDragEnd={handleDragEnd}\r\n >\r\n <SortableContext\r\n items={tabSortedList?.map((s) => s.column) || []}\r\n strategy={verticalListSortingStrategy}\r\n >\r\n {tabSortedList?.map((sort, index) => (\r\n <SortableItem key={sort.column} id={sort.column}>\r\n <Box display=\"flex\" gap={1} alignItems=\"center\" mb={1}>\r\n <Select\r\n value={sort.column}\r\n onChange={(e) =>\r\n handleDNDDropdownChange(\r\n \"column\",\r\n e.target.value,\r\n index\r\n )\r\n }\r\n size=\"small\"\r\n fullWidth\r\n >\r\n {showList\r\n // ?.filter((column) => column.value != \"action\")\r\n .map(\r\n (\r\n column: { label: string; value: string },\r\n index: number\r\n ) => (\r\n <MenuItem\r\n key={index}\r\n value={column.value}\r\n disabled={tabSortedList.some(\r\n (s) => s.column === column?.value\r\n )}\r\n >\r\n {column?.label}\r\n </MenuItem>\r\n )\r\n )}\r\n </Select>\r\n <Select\r\n value={sort.order}\r\n onChange={(e) =>\r\n handleDNDDropdownChange(\r\n \"order\",\r\n e.target.value,\r\n index\r\n )\r\n }\r\n size=\"small\"\r\n fullWidth\r\n >\r\n <MenuItem value=\"asc\">Ascending</MenuItem>\r\n <MenuItem value=\"dsc\">Descending</MenuItem>\r\n </Select>\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => handleRemove(sort.column)}\r\n >\r\n <CloseIcon />\r\n </IconButton>\r\n </Box>\r\n </SortableItem>\r\n ))}\r\n </SortableContext>\r\n </DndContext>\r\n\r\n {showAddSortButton && (\r\n <Box>\r\n <Button\r\n onClick={handleAddSort}\r\n startIcon={<AddIcon />}\r\n variant=\"text\"\r\n sx={{\r\n fontSize: 13,\r\n color: \"#7A5AF8\",\r\n }}\r\n disabled={isAddSortDisabled}\r\n >\r\n Add Sort\r\n </Button>\r\n </Box>\r\n )}\r\n </Box>\r\n </>\r\n ) : (\r\n <Typography>View as Tabs empty in Quick Tab</Typography>\r\n )}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default Sorting;\r\n","import { Dialog, Slide, styled } from \"@mui/material\";\r\nimport { dialogStyles } from \"../style\";\r\nimport React from \"react\";\r\nimport { TransitionProps } from \"@mui/material/transitions\";\r\n\r\nexport const CustomDialog = styled(Dialog)(({ theme }) => ({\r\n \"& .MuiPaper-root\": {\r\n borderRadius: 0,\r\n height: \"100%\",\r\n },\r\n \"& .MuiDialogContent-root\": {\r\n ...dialogStyles.dialogContent,\r\n padding: theme.spacing(2),\r\n },\r\n \"& .MuiDialogActions-root\": {\r\n padding: theme.spacing(2),\r\n },\r\n}));\r\n\r\nexport const DialogTransition = React.forwardRef(function Transition(\r\n props: TransitionProps & {\r\n children: React.ReactElement<any, any>;\r\n },\r\n ref: React.Ref<unknown>\r\n) {\r\n return <Slide direction=\"down\" ref={ref} {...props} />;\r\n});\r\n","import { Button, ButtonProps } from \"@mui/material\";\r\nimport { dialogStyles } from \"../style\";\r\ninterface CustomButtonProps extends ButtonProps {}\r\n\r\nconst CustomButton = ({ ...props }: CustomButtonProps) => {\r\n const customSx = { ...dialogStyles.dialogActionsButton, ...props.sx };\r\n\r\n return (\r\n <Button variant=\"contained\" {...props} sx={customSx}>\r\n {props.children}\r\n </Button>\r\n );\r\n};\r\n\r\nexport default CustomButton;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport {\r\n Box,\r\n Select,\r\n MenuItem,\r\n FormControl,\r\n Typography,\r\n Checkbox,\r\n FormControlLabel,\r\n Grid,\r\n Alert,\r\n} from \"@mui/material\";\r\n\r\nimport ListingValues from \"../common/listing-values\";\r\nimport {\r\n DndContext,\r\n closestCenter,\r\n KeyboardSensor,\r\n MouseSensor,\r\n TouchSensor,\r\n useSensor,\r\n useSensors,\r\n DragEndEvent,\r\n} from \"@dnd-kit/core\";\r\nimport {\r\n QuickTabConfigProps,\r\n SettingsQuickTabProps,\r\n} from \"../../../types/filter-settings\";\r\nimport { TabsStyles } from \"../style\";\r\nimport InfoAlert from \"../common/info-alert\";\r\nimport { craftTableFilterSettingsOptionsProps } from \"../../../types/table-options\";\r\nimport { LANE_SELECTS } from \"../constants\";\r\n\r\nconst Lane = ({\r\n filterSettingStates,\r\n columnsData,\r\n tabsApiData,\r\n tabsApiDataLoading,\r\n}: {\r\n filterSettingStates: craftTableFilterSettingsOptionsProps;\r\n columnsData: any;\r\n tabsApiData?: { label: string; value: string }[];\r\n tabsApiDataLoading?: boolean;\r\n}) => {\r\n const { settingsData, setSettingsData, saveButtonError, setSaveButtonError } =\r\n filterSettingStates;\r\n\r\n const [searchTerm, setSearchTerm] = useState<string>(\"\");\r\n const [currentQuickAttribute, setCurrentQuickAttribute] = useState<string>(\r\n settingsData?.quick_tab?.attribute || \"\"\r\n );\r\n\r\n const quickTabStates = settingsData?.quick_tab as any;\r\n\r\n // In case there is no quick tab state from API\r\n useEffect(() => {\r\n const stateToArray =\r\n (quickTabStates && Object.entries(quickTabStates)) || [];\r\n const isEmptyState = stateToArray.length ? false : true;\r\n\r\n if (isEmptyState) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n attribute: LANE_SELECTS[0].value,\r\n sorting: \"asc\",\r\n },\r\n }));\r\n }\r\n }, [columnsData]);\r\n\r\n // When user changes attribute\r\n useEffect(() => {\r\n if (currentQuickAttribute === settingsData?.quick_tab?.attribute) return;\r\n\r\n if (tabsApiData?.length) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n hide_list: tabsApiData,\r\n show_list: [],\r\n },\r\n }));\r\n\r\n setCurrentQuickAttribute(settingsData?.quick_tab?.attribute || \"\");\r\n }\r\n }, [tabsApiData]);\r\n\r\n // Validation when user changes show list or hide list\r\n useEffect(() => {\r\n const showList = quickTabStates?.show_list || [];\r\n const hideList = quickTabStates?.hide_list || [];\r\n\r\n if (showList || hideList) {\r\n // Check if showList is valid (between 1 and 5 items)\r\n const isValidShowList = showList.length > 0 && showList.length <= 5;\r\n const ERROR_CODE = \"quick_tab_error\";\r\n\r\n if (!isValidShowList) {\r\n const errorMessage = {\r\n type: ERROR_CODE,\r\n message:\r\n showList.length === 0\r\n ? \"Quick Lane: Please select at least one item\"\r\n : \"Quick Lane: Please select no more than 5 items\",\r\n };\r\n\r\n // Check if the error is already present in the messages array\r\n const hasQuickTabError = saveButtonError?.messages?.some(\r\n (message) => message.type === ERROR_CODE\r\n );\r\n\r\n // Update the error state\r\n\r\n // Later we can use this to show error message when we will make error logic more simple\r\n // setSaveButtonError((prev) => {\r\n // const otherMessages =\r\n // prev?.messages?.filter((message) => message.type !== ERROR_CODE) ||\r\n // [];\r\n\r\n // return {\r\n // ...prev,\r\n // hasError: true,\r\n // messages: hasQuickTabError\r\n // ? [...prev?.messages]\r\n // : [...otherMessages, errorMessage],\r\n // };\r\n // });\r\n } else {\r\n const hasOtherMessages = saveButtonError?.messages?.some(\r\n (message) => message.type !== ERROR_CODE\r\n );\r\n // Reset error state if the list is valid\r\n // setSaveButtonError((prev) => ({\r\n // ...prev,\r\n // hasError: hasOtherMessages,\r\n // messages:\r\n // prev?.messages?.filter((message) => message.type !== ERROR_CODE) ||\r\n // [],\r\n // }));\r\n }\r\n }\r\n }, [quickTabStates?.hide_list, quickTabStates?.show_list]);\r\n\r\n const sortingOptions = [\r\n { label: \"A-Z\", value: \"asc\" },\r\n { label: \"Z-A\", value: \"dsc\" },\r\n { label: \"Count (Ascending)\", value: \"count_asc\" },\r\n { label: \"Count (Descending)\", value: \"count_dsc\" },\r\n { label: \"Custom\", value: \"custom\" },\r\n ];\r\n\r\n // Convert show_list/hide_list to FilterValue[] for rendering only\r\n const showListValues = (quickTabStates?.show_list || [])?.map((id: any) => ({\r\n id,\r\n label: id?.charAt(0)?.toUpperCase() + id?.slice(1),\r\n }));\r\n const hideListValues = (quickTabStates?.hide_list || [])?.map((id: any) => ({\r\n id,\r\n label: id?.charAt(0)?.toUpperCase() + id?.slice(1),\r\n }));\r\n\r\n const sensors = useSensors(\r\n useSensor(MouseSensor),\r\n useSensor(TouchSensor),\r\n useSensor(KeyboardSensor)\r\n );\r\n\r\n // Drag and drop logic, update only local state\r\n const handleDragEnd = (event: DragEndEvent) => {\r\n const { active, over } = event;\r\n if (!over) {\r\n return;\r\n }\r\n const currentContainer = active.data.current?.containerId;\r\n const overContainer = over.data.current?.containerId;\r\n if (!currentContainer || !overContainer) return;\r\n if (currentContainer === overContainer) {\r\n // Reorder within the same list\r\n let newShowList = [...(quickTabStates.show_list ?? [])];\r\n let newHideList = [...(quickTabStates.hide_list ?? [])];\r\n if (currentContainer === \"list\") {\r\n const oldIndex = newHideList.indexOf(String(active.id));\r\n const newIndex = newHideList.indexOf(String(over.id));\r\n if (oldIndex !== -1 && newIndex !== -1) {\r\n const [removed] = newHideList.splice(oldIndex, 1);\r\n newHideList.splice(newIndex, 0, removed);\r\n }\r\n } else {\r\n const oldIndex = newShowList.indexOf(String(active.id));\r\n const newIndex = newShowList.indexOf(String(over.id));\r\n if (oldIndex !== -1 && newIndex !== -1) {\r\n const [removed] = newShowList.splice(oldIndex, 1);\r\n newShowList.splice(newIndex, 0, removed);\r\n }\r\n }\r\n\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n show_list: newShowList,\r\n hide_list: newHideList,\r\n },\r\n }));\r\n } else {\r\n // Move between lists\r\n let newShowList = [...(quickTabStates.show_list ?? [])];\r\n let newHideList = [...(quickTabStates.hide_list ?? [])];\r\n if (currentContainer === \"list\" && overContainer === \"lanes\") {\r\n if (newShowList.length >= 5) return; // prevent overflow\r\n // Move from hide to show\r\n\r\n const idx = newHideList.indexOf(String(active.id));\r\n if (idx !== -1) {\r\n newHideList.splice(idx, 1);\r\n newShowList.push(String(active.id));\r\n }\r\n } else if (currentContainer === \"lanes\" && overContainer === \"list\") {\r\n // Move from show to hide\r\n const idx = newShowList.indexOf(String(active.id));\r\n if (idx !== -1) {\r\n newShowList.splice(idx, 1);\r\n newHideList.push(String(active.id));\r\n }\r\n }\r\n\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n show_list: newShowList,\r\n hide_list: newHideList,\r\n },\r\n }));\r\n }\r\n };\r\n\r\n const filteredListValues = hideListValues.filter((value: any) =>\r\n value?.label?.toLowerCase().includes(searchTerm.toLowerCase())\r\n );\r\n\r\n // Show All/Hide All logic (local only)\r\n const handleShowAll = () => {\r\n const currentShowList = quickTabStates.show_list || [];\r\n const currentHideList = quickTabStates.hide_list || [];\r\n\r\n const availableSlots = 5 - currentShowList.length;\r\n\r\n if (availableSlots <= 0) return; // Already at limit\r\n\r\n const limitedHideList = currentHideList.slice(0, availableSlots);\r\n\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n show_list: [...currentShowList, ...limitedHideList],\r\n hide_list: currentHideList.filter(\r\n (item: string) => !limitedHideList.includes(item)\r\n ),\r\n },\r\n }));\r\n };\r\n\r\n const handleHideAll = () => {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n hide_list: [\r\n ...(prev?.quick_tab?.hide_list || []),\r\n ...(prev?.quick_tab?.show_list || []),\r\n ],\r\n show_list: [],\r\n },\r\n }));\r\n };\r\n\r\n // Checkbox logic (local only)\r\n const handleShowSubLaneChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n showSubLane: e.target.checked,\r\n },\r\n }));\r\n };\r\n\r\n const handleShowColorColumnsChange = (\r\n e: React.ChangeEvent<HTMLInputElement>\r\n ) => {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n showColorColumns: e.target.checked,\r\n },\r\n }));\r\n };\r\n\r\n const handleItemToggle = (itemId: string, fromContainerId: string) => {\r\n const toShowList = [...(quickTabStates.show_list ?? [])];\r\n const toHideList = [...(quickTabStates.hide_list ?? [])];\r\n\r\n if (fromContainerId === \"list\") {\r\n if (toShowList.length >= 5) return; // prevent overflow\r\n // Move from hide_list to show_list\r\n const index = toHideList.indexOf(itemId);\r\n if (index > -1) {\r\n toHideList.splice(index, 1);\r\n toShowList.push(itemId);\r\n }\r\n } else if (fromContainerId === \"lanes\") {\r\n // Move from show_list to hide_list\r\n const index = toShowList.indexOf(itemId);\r\n if (index > -1) {\r\n toShowList.splice(index, 1);\r\n toHideList.push(itemId);\r\n }\r\n }\r\n\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n show_list: toShowList,\r\n hide_list: toHideList,\r\n },\r\n }));\r\n };\r\n\r\n const enableDND = quickTabStates?.sorting === \"custom\" ? true : false;\r\n\r\n return (\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n // gap: \"0.5rem\",\r\n height: \"100%\",\r\n }}\r\n >\r\n <Typography variant=\"caption\" sx={TabsStyles.mainTabsHeader}>\r\n *Quick filter settings will be reflected in vertical lanes\r\n </Typography>\r\n <Box>\r\n <Grid sx={{ position: \"relative\" }} container>\r\n <Grid size={12}>\r\n <Box>\r\n <Grid sx={TabsStyles.mainTabDropdown} size={6}>\r\n <FormControl sx={TabsStyles.mainTabSelect} size=\"small\">\r\n <Select\r\n value={quickTabStates?.attribute || \"\"}\r\n onChange={(e) =>\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n attribute: e.target.value,\r\n },\r\n }))\r\n }\r\n displayEmpty\r\n renderValue={(selected) => {\r\n if (!selected) {\r\n return <em>Select Attribute</em>;\r\n }\r\n return selected;\r\n }}\r\n >\r\n {LANE_SELECTS?.map((lane: any) => (\r\n <MenuItem key={lane?.key} value={lane?.value}>\r\n {lane?.value}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n <FormControl\r\n sx={TabsStyles.selectDropdownSeparator}\r\n size=\"small\"\r\n >\r\n <Select\r\n value={quickTabStates?.sorting || \"asc\"}\r\n onChange={(e) =>\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n sorting: e.target.value,\r\n },\r\n }))\r\n }\r\n displayEmpty\r\n renderValue={(selected) => {\r\n if (!selected) {\r\n return <em>Sort by</em>;\r\n }\r\n const option = sortingOptions.find(\r\n (opt) => opt.value === selected\r\n );\r\n return option?.label || selected;\r\n }}\r\n >\r\n {sortingOptions.map((option) => (\r\n <MenuItem key={option?.value} value={option?.value}>\r\n {option?.label}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Grid>\r\n </Box>\r\n </Grid>\r\n <Grid>\r\n {/* <Alert\r\n severity=\"info\"\r\n sx={{\r\n fontSize: \"12px\",\r\n color: \"#088AB2\",\r\n }}\r\n >\r\n Please select at least 1 and at most 5 values to display as lanes.\r\n </Alert> */}\r\n </Grid>\r\n <DndContext\r\n sensors={sensors}\r\n collisionDetection={closestCenter}\r\n onDragEnd={handleDragEnd}\r\n >\r\n <Grid sx={{ mt: 2 }} container spacing={2} size={12}>\r\n <ListingValues\r\n buttonText=\"Show All\"\r\n onClick={handleShowAll}\r\n headerText=\"List of Values\"\r\n filteredValues={filteredListValues}\r\n searchTerm={searchTerm}\r\n setSearchTerm={setSearchTerm}\r\n containerId=\"list\"\r\n tabsApiDataLoading={tabsApiDataLoading}\r\n onItemToggle={handleItemToggle}\r\n enableDragAndDrop={enableDND}\r\n />\r\n <ListingValues\r\n buttonText=\"Hide All\"\r\n onClick={handleHideAll}\r\n headerText=\"View as Lanes\"\r\n filteredValues={showListValues}\r\n containerId=\"lanes\"\r\n // tabsApiDataLoading={tabsApiDataLoading}\r\n onItemToggle={handleItemToggle}\r\n enableDragAndDrop={enableDND}\r\n AlertComponenet={\r\n <InfoAlert\r\n message=\"Please select at least 1 and at most 5 values to display as\r\n lanes.\"\r\n width={\"49%\"}\r\n position=\"absolute\"\r\n color=\"#088AB2\"\r\n top={10}\r\n zIndex={1}\r\n />\r\n }\r\n />\r\n </Grid>\r\n </DndContext>\r\n <Grid size={12}>\r\n <Box sx={TabsStyles.checkboxStyle}>\r\n <FormControlLabel\r\n control={\r\n <Checkbox\r\n checked={quickTabStates?.showSubLane || false}\r\n onChange={handleShowSubLaneChange}\r\n size=\"small\"\r\n sx={{\r\n \"&.Mui-checked\": {\r\n color: \"#7A5AF8\",\r\n },\r\n }}\r\n />\r\n }\r\n label=\"Show Sublane\"\r\n />\r\n <FormControlLabel\r\n control={\r\n <Checkbox\r\n checked={quickTabStates?.showColorColumns || false}\r\n onChange={handleShowColorColumnsChange}\r\n size=\"small\"\r\n sx={{\r\n \"&.Mui-checked\": {\r\n color: \"#7A5AF8\",\r\n },\r\n }}\r\n />\r\n }\r\n label=\"Show Color columns\"\r\n />\r\n </Box>\r\n </Grid>\r\n </Grid>\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default Lane;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport {\r\n Box,\r\n Select,\r\n MenuItem,\r\n FormControl,\r\n Typography,\r\n Checkbox,\r\n FormControlLabel,\r\n Grid,\r\n Alert,\r\n} from \"@mui/material\";\r\n\r\nimport ListingValues from \"../common/listing-values\";\r\nimport {\r\n DndContext,\r\n closestCenter,\r\n KeyboardSensor,\r\n MouseSensor,\r\n TouchSensor,\r\n useSensor,\r\n useSensors,\r\n DragEndEvent,\r\n} from \"@dnd-kit/core\";\r\nimport {\r\n QuickTabConfigProps,\r\n SettingsQuickTabProps,\r\n} from \"../../../types/filter-settings\";\r\nimport { TabsStyles } from \"../style\";\r\nimport InfoAlert from \"../common/info-alert\";\r\nimport { craftTableFilterSettingsOptionsProps } from \"../../../types/table-options\";\r\nimport { LANE_SELECTS } from \"../constants\";\r\nimport { Group } from \"@mui/icons-material\";\r\n\r\nconst GroupBy = ({\r\n filterSettingStates,\r\n columnsData,\r\n tabsApiData,\r\n tabsApiDataLoading,\r\n}: {\r\n filterSettingStates: craftTableFilterSettingsOptionsProps;\r\n columnsData: any;\r\n tabsApiData?: { label: string; value: string }[];\r\n tabsApiDataLoading?: boolean;\r\n}) => {\r\n const { settingsData, setSettingsData, saveButtonError, setSaveButtonError } =\r\n filterSettingStates;\r\n\r\n const [searchTerm, setSearchTerm] = useState<string>(\"\");\r\n const [currentQuickAttribute, setCurrentQuickAttribute] = useState<string>(\r\n settingsData?.quick_tab?.attribute || \"\"\r\n );\r\n\r\n const quickTabStates = settingsData?.quick_tab as any;\r\n\r\n // In case there is no quick tab state from API\r\n useEffect(() => {\r\n const stateToArray =\r\n (quickTabStates && Object.entries(quickTabStates)) || [];\r\n const isEmptyState = stateToArray.length ? false : true;\r\n\r\n if (isEmptyState) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n attribute: LANE_SELECTS[0].value,\r\n sorting: \"asc\",\r\n },\r\n }));\r\n }\r\n }, [columnsData]);\r\n\r\n // When user changes attribute\r\n useEffect(() => {\r\n if (currentQuickAttribute === settingsData?.quick_tab?.attribute) return;\r\n\r\n if (tabsApiData?.length) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n hide_list: tabsApiData,\r\n show_list: [],\r\n },\r\n }));\r\n\r\n setCurrentQuickAttribute(settingsData?.quick_tab?.attribute || \"\");\r\n }\r\n }, [tabsApiData]);\r\n\r\n // Validation when user changes show list or hide list\r\n useEffect(() => {\r\n const showList = quickTabStates?.show_list || [];\r\n const hideList = quickTabStates?.hide_list || [];\r\n\r\n if (showList || hideList) {\r\n // Check if showList is valid (between 1 and 5 items)\r\n const isValidShowList = showList.length > 0 && showList.length <= 5;\r\n const ERROR_CODE = \"quick_tab_error\";\r\n\r\n if (!isValidShowList) {\r\n const errorMessage = {\r\n type: ERROR_CODE,\r\n message:\r\n showList.length === 0\r\n ? \"Quick Lane: Please select at least one item\"\r\n : \"Quick Lane: Please select no more than 5 items\",\r\n };\r\n\r\n // Check if the error is already present in the messages array\r\n const hasQuickTabError = saveButtonError?.messages?.some(\r\n (message) => message.type === ERROR_CODE\r\n );\r\n\r\n // Update the error state\r\n\r\n // Later we can use this to show error message when we will make error logic more simple\r\n // setSaveButtonError((prev) => {\r\n // const otherMessages =\r\n // prev?.messages?.filter((message) => message.type !== ERROR_CODE) ||\r\n // [];\r\n\r\n // return {\r\n // ...prev,\r\n // hasError: true,\r\n // messages: hasQuickTabError\r\n // ? [...prev?.messages]\r\n // : [...otherMessages, errorMessage],\r\n // };\r\n // });\r\n } else {\r\n const hasOtherMessages = saveButtonError?.messages?.some(\r\n (message) => message.type !== ERROR_CODE\r\n );\r\n // Reset error state if the list is valid\r\n // setSaveButtonError((prev) => ({\r\n // ...prev,\r\n // hasError: hasOtherMessages,\r\n // messages:\r\n // prev?.messages?.filter((message) => message.type !== ERROR_CODE) ||\r\n // [],\r\n // }));\r\n }\r\n }\r\n }, [quickTabStates?.hide_list, quickTabStates?.show_list]);\r\n\r\n const sortingOptions = [\r\n { label: \"A-Z\", value: \"asc\" },\r\n { label: \"Z-A\", value: \"dsc\" },\r\n { label: \"Count (Ascending)\", value: \"count_asc\" },\r\n { label: \"Count (Descending)\", value: \"count_dsc\" },\r\n { label: \"Custom\", value: \"custom\" },\r\n ];\r\n\r\n // Convert show_list/hide_list to FilterValue[] for rendering only\r\n const showListValues = (quickTabStates?.show_list || [])?.map((id: any) => ({\r\n id,\r\n label: id?.charAt(0)?.toUpperCase() + id?.slice(1),\r\n }));\r\n const hideListValues = (quickTabStates?.hide_list || [])?.map((id: any) => ({\r\n id,\r\n label: id?.charAt(0)?.toUpperCase() + id?.slice(1),\r\n }));\r\n\r\n const sensors = useSensors(\r\n useSensor(MouseSensor),\r\n useSensor(TouchSensor),\r\n useSensor(KeyboardSensor)\r\n );\r\n\r\n // Drag and drop logic, update only local state\r\n const handleDragEnd = (event: DragEndEvent) => {\r\n const { active, over } = event;\r\n if (!over) {\r\n return;\r\n }\r\n const currentContainer = active.data.current?.containerId;\r\n const overContainer = over.data.current?.containerId;\r\n if (!currentContainer || !overContainer) return;\r\n if (currentContainer === overContainer) {\r\n // Reorder within the same list\r\n let newShowList = [...(quickTabStates.show_list ?? [])];\r\n let newHideList = [...(quickTabStates.hide_list ?? [])];\r\n if (currentContainer === \"list\") {\r\n const oldIndex = newHideList.indexOf(String(active.id));\r\n const newIndex = newHideList.indexOf(String(over.id));\r\n if (oldIndex !== -1 && newIndex !== -1) {\r\n const [removed] = newHideList.splice(oldIndex, 1);\r\n newHideList.splice(newIndex, 0, removed);\r\n }\r\n } else {\r\n const oldIndex = newShowList.indexOf(String(active.id));\r\n const newIndex = newShowList.indexOf(String(over.id));\r\n if (oldIndex !== -1 && newIndex !== -1) {\r\n const [removed] = newShowList.splice(oldIndex, 1);\r\n newShowList.splice(newIndex, 0, removed);\r\n }\r\n }\r\n\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n show_list: newShowList,\r\n hide_list: newHideList,\r\n },\r\n }));\r\n } else {\r\n // Move between lists\r\n let newShowList = [...(quickTabStates.show_list ?? [])];\r\n let newHideList = [...(quickTabStates.hide_list ?? [])];\r\n if (currentContainer === \"list\" && overContainer === \"lanes\") {\r\n if (newShowList.length >= 5) return; // prevent overflow\r\n // Move from hide to show\r\n\r\n const idx = newHideList.indexOf(String(active.id));\r\n if (idx !== -1) {\r\n newHideList.splice(idx, 1);\r\n newShowList.push(String(active.id));\r\n }\r\n } else if (currentContainer === \"lanes\" && overContainer === \"list\") {\r\n // Move from show to hide\r\n const idx = newShowList.indexOf(String(active.id));\r\n if (idx !== -1) {\r\n newShowList.splice(idx, 1);\r\n newHideList.push(String(active.id));\r\n }\r\n }\r\n\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n show_list: newShowList,\r\n hide_list: newHideList,\r\n },\r\n }));\r\n }\r\n };\r\n\r\n const filteredListValues = hideListValues.filter((value: any) =>\r\n value?.label?.toLowerCase().includes(searchTerm.toLowerCase())\r\n );\r\n\r\n // Show All/Hide All logic (local only)\r\n const handleShowAll = () => {\r\n const currentShowList = quickTabStates.show_list || [];\r\n const currentHideList = quickTabStates.hide_list || [];\r\n\r\n const availableSlots = 5 - currentShowList.length;\r\n\r\n if (availableSlots <= 0) return; // Already at limit\r\n\r\n const limitedHideList = currentHideList.slice(0, availableSlots);\r\n\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n show_list: [...currentShowList, ...limitedHideList],\r\n hide_list: currentHideList.filter(\r\n (item: string) => !limitedHideList.includes(item)\r\n ),\r\n },\r\n }));\r\n };\r\n\r\n const handleHideAll = () => {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n hide_list: [\r\n ...(prev?.quick_tab?.hide_list || []),\r\n ...(prev?.quick_tab?.show_list || []),\r\n ],\r\n show_list: [],\r\n },\r\n }));\r\n };\r\n\r\n // Checkbox logic (local only)\r\n const handleShowSubLaneChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n showSubLane: e.target.checked,\r\n },\r\n }));\r\n };\r\n\r\n const handleShowColorColumnsChange = (\r\n e: React.ChangeEvent<HTMLInputElement>\r\n ) => {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n showColorColumns: e.target.checked,\r\n },\r\n }));\r\n };\r\n\r\n const handleItemToggle = (itemId: string, fromContainerId: string) => {\r\n const toShowList = [...(quickTabStates.show_list ?? [])];\r\n const toHideList = [...(quickTabStates.hide_list ?? [])];\r\n\r\n if (fromContainerId === \"list\") {\r\n if (toShowList.length >= 5) return; // prevent overflow\r\n // Move from hide_list to show_list\r\n const index = toHideList.indexOf(itemId);\r\n if (index > -1) {\r\n toHideList.splice(index, 1);\r\n toShowList.push(itemId);\r\n }\r\n } else if (fromContainerId === \"lanes\") {\r\n // Move from show_list to hide_list\r\n const index = toShowList.indexOf(itemId);\r\n if (index > -1) {\r\n toShowList.splice(index, 1);\r\n toHideList.push(itemId);\r\n }\r\n }\r\n\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n show_list: toShowList,\r\n hide_list: toHideList,\r\n },\r\n }));\r\n };\r\n\r\n const enableDND = quickTabStates?.sorting === \"custom\" ? true : false;\r\n\r\n return (\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n // gap: \"0.5rem\",\r\n height: \"100%\",\r\n }}\r\n >\r\n <Typography variant=\"caption\" sx={TabsStyles.mainTabsHeader}>\r\n *Quick filter settings will be reflected in vertical lanes\r\n </Typography>\r\n <Box>\r\n <Grid sx={{ position: \"relative\" }} container>\r\n <Grid size={12}>\r\n <Box>\r\n <Grid sx={TabsStyles.mainTabDropdown} size={6}>\r\n <FormControl sx={TabsStyles.mainTabSelect} size=\"small\">\r\n <Select\r\n value={quickTabStates?.attribute || \"\"}\r\n onChange={(e) =>\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n attribute: e.target.value,\r\n },\r\n }))\r\n }\r\n displayEmpty\r\n renderValue={(selected) => {\r\n if (!selected) {\r\n return <em>Select Attribute</em>;\r\n }\r\n return selected;\r\n }}\r\n >\r\n {LANE_SELECTS?.map((lane: any) => (\r\n <MenuItem key={lane?.key} value={lane?.value}>\r\n {lane?.value}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n <FormControl\r\n sx={TabsStyles.selectDropdownSeparator}\r\n size=\"small\"\r\n >\r\n <Select\r\n value={quickTabStates?.sorting || \"asc\"}\r\n onChange={(e) =>\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n sorting: e.target.value,\r\n },\r\n }))\r\n }\r\n displayEmpty\r\n renderValue={(selected) => {\r\n if (!selected) {\r\n return <em>Sort by</em>;\r\n }\r\n const option = sortingOptions.find(\r\n (opt) => opt.value === selected\r\n );\r\n return option?.label || selected;\r\n }}\r\n >\r\n {sortingOptions?.map((option) => (\r\n <MenuItem key={option?.value} value={option?.value}>\r\n {option?.label}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Grid>\r\n </Box>\r\n </Grid>\r\n <Grid>\r\n {/* <Alert\r\n severity=\"info\"\r\n sx={{\r\n fontSize: \"12px\",\r\n color: \"#088AB2\",\r\n }}\r\n >\r\n Please select at least 1 and at most 5 values to display as lanes.\r\n </Alert> */}\r\n </Grid>\r\n <DndContext\r\n sensors={sensors}\r\n collisionDetection={closestCenter}\r\n onDragEnd={handleDragEnd}\r\n >\r\n <Grid sx={{ mt: 2 }} container spacing={2} size={12}>\r\n <ListingValues\r\n buttonText=\"Show All\"\r\n onClick={handleShowAll}\r\n headerText=\"List of Values\"\r\n filteredValues={filteredListValues}\r\n searchTerm={searchTerm}\r\n setSearchTerm={setSearchTerm}\r\n containerId=\"list\"\r\n tabsApiDataLoading={tabsApiDataLoading}\r\n onItemToggle={handleItemToggle}\r\n enableDragAndDrop={enableDND}\r\n />\r\n <ListingValues\r\n buttonText=\"Hide All\"\r\n onClick={handleHideAll}\r\n headerText=\"View as Lanes\"\r\n filteredValues={showListValues}\r\n containerId=\"lanes\"\r\n // tabsApiDataLoading={tabsApiDataLoading}\r\n onItemToggle={handleItemToggle}\r\n enableDragAndDrop={enableDND}\r\n // AlertComponenet={\r\n // <InfoAlert\r\n // message=\"Please select at least 1 and at most 5 values to display as\r\n // lanes.\"\r\n // width={\"49%\"}\r\n // position=\"absolute\"\r\n // color=\"#088AB2\"\r\n // top={10}\r\n // zIndex={1}\r\n // />\r\n // }\r\n />\r\n </Grid>\r\n </DndContext>\r\n <Grid size={12}>\r\n <Box sx={TabsStyles.checkboxStyle}>\r\n <FormControlLabel\r\n control={\r\n <Checkbox\r\n checked={quickTabStates?.showSubLane || false}\r\n onChange={handleShowSubLaneChange}\r\n size=\"small\"\r\n sx={{\r\n \"&.Mui-checked\": {\r\n color: \"#7A5AF8\",\r\n },\r\n }}\r\n />\r\n }\r\n label=\"Show Sublane\"\r\n />\r\n <FormControlLabel\r\n control={\r\n <Checkbox\r\n checked={quickTabStates?.showColorColumns || false}\r\n onChange={handleShowColorColumnsChange}\r\n size=\"small\"\r\n sx={{\r\n \"&.Mui-checked\": {\r\n color: \"#7A5AF8\",\r\n },\r\n }}\r\n />\r\n }\r\n label=\"Show Color columns\"\r\n />\r\n </Box>\r\n </Grid>\r\n </Grid>\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default GroupBy;\r\n","import { Theme } from \"@emotion/react\";\r\nimport { SxProps } from \"@mui/material\";\r\n\r\ninterface KanbanStyles {\r\n syncingStyle: SxProps<Theme>;\r\n topHeader: SxProps<Theme>;\r\n laneHeader: SxProps<Theme>;\r\n badge: SxProps<Theme>;\r\n swimlaneWrapperStyle: SxProps<Theme>;\r\n columnStyle: SxProps<Theme>;\r\n stageStyle: SxProps<Theme>;\r\n stageBadge: SxProps<Theme>;\r\n cardContainer: SxProps<Theme>;\r\n cardContent: SxProps<Theme>;\r\n cardHeaderStyle: SxProps<Theme>;\r\n cardAvatar: SxProps<Theme>;\r\n statusStyle: SxProps<Theme>;\r\n codeStyle: SxProps<Theme>;\r\n nameIconContainer: SxProps<Theme>;\r\n leadName: SxProps<Theme>;\r\n iconStyle: SxProps<Theme>;\r\n leadOwnerStyle: SxProps<Theme>;\r\n calendarIcon: SxProps<Theme>;\r\n dateStyle: SxProps<Theme>;\r\n subSectionAccordion: SxProps<Theme>;\r\n subSectionCountContainer: SxProps<Theme>;\r\n cardsContainer: SxProps<Theme>;\r\n settingStyle: SxProps<Theme>;\r\n swimLaneAccordionStyle: SxProps<Theme>;\r\n subSectionHeaderContainer: SxProps<Theme>;\r\n}\r\n\r\nexport const kanbanStyles: KanbanStyles = {\r\n syncingStyle: {\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n gap: \"8px\",\r\n width: \"100%\",\r\n },\r\n topHeader: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 1,\r\n px: 1,\r\n pt: 2,\r\n bgcolor: \"white\",\r\n width: \"fit-content\",\r\n position: \"sticky\", // Add sticky positioning\r\n top: 0, // Stick to the top of the viewport\r\n right: 0,\r\n zIndex: 1100, // Ensure it stays above other content\r\n },\r\n laneHeader: {\r\n flex: 1, // Equal width distribution\r\n minWidth: \"263px\",\r\n maxWidth: \"263px\",\r\n display: \"flex\",\r\n fontWeight: 700,\r\n fontSize: \"16px\",\r\n borderRadius: \"6px\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n py: \"8px\",\r\n px: \"12px\",\r\n position: \"relative\",\r\n },\r\n badge: {\r\n position: \"absolute\",\r\n top: \"-12px\",\r\n left: \"8px\",\r\n px: 1,\r\n color: \"white\",\r\n borderRadius: \"8px\",\r\n },\r\n swimlaneWrapperStyle: {\r\n flexDirection: \"row-reverse\",\r\n bgcolor: \"white\",\r\n minHeight: 44, // overall height\r\n px: 2,\r\n py: 0, // remove vertical padding\r\n \"&.Mui-expanded\": {\r\n minHeight: 44,\r\n },\r\n \"& .MuiAccordionSummary-content\": {\r\n margin: \"8px 0\", // reduced vertical spacing\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"flex-start\",\r\n gap: 5,\r\n \"&.Mui-expanded\": {\r\n margin: \"8px 0\", // maintain same margin when expanded\r\n },\r\n },\r\n \"& .MuiAccordionSummary-expandIconWrapper\": {\r\n mr: 0, // reduce gap between icon and content\r\n },\r\n },\r\n columnStyle: {\r\n flex: 1, // Equal width distribution\r\n p: \"12px\",\r\n // px: \"2px\",\r\n minHeight: \"500px\",\r\n // borderRight: \"1px solid #e0e0e0\",\r\n\r\n borderRadius: \"6px\",\r\n minWidth: \"263px\",\r\n maxWidth: \"263px\",\r\n },\r\n stageStyle: {\r\n mb: 2,\r\n bgcolor: \"#f9fafb\",\r\n borderTopLeftRadius: \"8px !important\",\r\n borderBottomLeftRadius: \"8px !important\",\r\n borderTopRightRadius: \"8px !important\",\r\n // borderRadius: 2,\r\n overflow: \"hidden\",\r\n boxShadow: \"none\",\r\n \"&:before\": { display: \"none\" }, // remove default divider line\r\n },\r\n stageBadge: {\r\n \"& .MuiBadge-badge\": {\r\n color: \"black\",\r\n fontWeight: \"bold\",\r\n fontSize: \"0.75rem\",\r\n },\r\n },\r\n cardContainer: {\r\n borderRadius: 2,\r\n bgcolor: \"#fff\",\r\n position: \"relative\",\r\n\r\n boxShadow:\r\n \"0px 1.36px 2.72px rgba(23, 23, 23, 0.06), 0px 2.72px 5.44px rgba(23, 23, 23, 0.1)\",\r\n border: \"none\", // explicitly remove border\r\n },\r\n cardContent: {\r\n p: \"12px !important\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"4px\",\r\n },\r\n cardHeaderStyle: {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"flex-start\",\r\n // mb: 1,\r\n },\r\n cardAvatar: {\r\n width: \"18px\",\r\n height: \"18px\",\r\n fontSize: \"12px\",\r\n fontWeight: 600,\r\n bgcolor: \"#e5e7eb\",\r\n color: \"#374151\",\r\n mr: 1,\r\n },\r\n statusStyle: {\r\n height: 20,\r\n fontSize: \"0.6875rem\",\r\n\r\n fontWeight: 500,\r\n },\r\n codeStyle: {\r\n fontSize: \"12px\",\r\n color: \"#6b7280\",\r\n fontWeight: 500,\r\n mb: 0.5,\r\n cursor: \"pointer\",\r\n },\r\n nameIconContainer: {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"flex-start\",\r\n borderBottom: \"1px solid #e5e7eb\",\r\n pb: 2,\r\n },\r\n leadName: {\r\n fontSize: \"15px\",\r\n fontWeight: 500,\r\n color: \"#1f2937\",\r\n lineHeight: 1.3,\r\n },\r\n iconStyle: {\r\n color: \"#6b7280\",\r\n bgcolor: \"#f3f4f6\",\r\n borderRadius: \"50%\",\r\n width: \"20px\",\r\n height: \"20px\",\r\n p: 0.6,\r\n },\r\n leadOwnerStyle: {\r\n fontSize: \"12px\",\r\n color: \"#374151\",\r\n fontWeight: 500,\r\n },\r\n calendarIcon: {\r\n width: \"14px\",\r\n height: \"14px\",\r\n color: \"#7b7a79\",\r\n mr: 0.5,\r\n },\r\n dateStyle: {\r\n fontSize: \"12px\",\r\n color: \"#7b7a79\",\r\n\r\n fontWeight: 500,\r\n },\r\n subSectionAccordion: {\r\n height: \"52px\", // fixed height\r\n minHeight: \"52px\", // prevent auto-expansion\r\n \"&.Mui-expanded\": {\r\n minHeight: \"52px\", // fix expanded state height\r\n height: \"52px\",\r\n },\r\n border: \"1px solid #e2e8f0\",\r\n borderTopRightRadius: \"8px\",\r\n px: 2,\r\n },\r\n subSectionCountContainer: {\r\n // px: 1,\r\n color: \"white\",\r\n height: \"26px\",\r\n width: \"26px !important\",\r\n fontSize: \"10px\",\r\n fontWeight: \"bold\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n borderRadius: \"50%\",\r\n },\r\n cardsContainer: {\r\n px: 1,\r\n gap: \"12px\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n p: \"8px\",\r\n },\r\n settingStyle: {\r\n bgcolor: \"#f8fafc\",\r\n width: \"56px\",\r\n height: \"41px\",\r\n borderRadius: \"6px\",\r\n border: \"1px solid #e2e8f0\",\r\n },\r\n swimLaneAccordionStyle: {\r\n mb: 1,\r\n \"&:before\": { display: \"none\" },\r\n py: 0,\r\n boxShadow: \"none\",\r\n },\r\n subSectionHeaderContainer: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"8px\",\r\n },\r\n};\r\n","export const rawData = {\r\n lanes: [\r\n { id: 1, name: \"Enquiry\", color: \"#fff0f3\", darkColor: \"#fea3b4\" },\r\n { id: 2, name: \"Qualified Lead\", color: \"#fffbed\", darkColor: \"#fde272\" },\r\n { id: 3, name: \"Application\", color: \"#ebf9fc\", darkColor: \"#67e3f9\" },\r\n { id: 4, name: \"Admission\", color: \"#edf9f3\", darkColor: \"#73e2a3\" },\r\n { id: 5, name: \"Documents\", color: \"#edf9f3\", darkColor: \"#73e2a3\" },\r\n { id: 6, name: \"Admission\", color: \"#edf9f3\", darkColor: \"#73e2a3\" },\r\n ],\r\n swim_lanes: [\r\n {\r\n id: 12,\r\n name: \"Active\",\r\n sub_lanes: [\r\n {\r\n id: 1,\r\n name: \"Lead Assignment\",\r\n color: \"red\",\r\n lane_id: 1,\r\n expanded: true,\r\n },\r\n {\r\n id: 2,\r\n name: \"Initial Outreach\",\r\n color: \"green\",\r\n lane_id: 1,\r\n expanded: true,\r\n },\r\n {\r\n id: 3,\r\n name: \"Lead Assessment\",\r\n color: \"yellow\",\r\n lane_id: 2,\r\n expanded: true,\r\n },\r\n {\r\n id: 4,\r\n name: \"Campus Visit\",\r\n color: \"#FFE885\",\r\n lane_id: 2,\r\n expanded: true,\r\n },\r\n {\r\n id: 5,\r\n name: \"Application Collection\",\r\n color: \"#90E0F3\",\r\n lane_id: 3,\r\n expanded: true,\r\n },\r\n {\r\n id: 6,\r\n name: \"Student Assessment\",\r\n color: \"#90E0F3\",\r\n lane_id: 3,\r\n expanded: true,\r\n },\r\n {\r\n id: 7,\r\n name: \"Fee Collection\",\r\n color: \"#90EE90\",\r\n lane_id: 4,\r\n expanded: true,\r\n },\r\n {\r\n id: 8,\r\n name: \"System Integration\",\r\n color: \"#90EE90\",\r\n lane_id: 4,\r\n expanded: true,\r\n },\r\n ],\r\n },\r\n {\r\n id: 13,\r\n name: \"Dormant\",\r\n sub_lanes: [],\r\n },\r\n {\r\n id: 14,\r\n name: \"Disqualify\",\r\n sub_lanes: [],\r\n },\r\n {\r\n id: 15,\r\n name: \"Lost\",\r\n sub_lanes: [],\r\n },\r\n ],\r\n data: [\r\n // Lead Assignment\r\n {\r\n id: 1,\r\n name: \"Aditi Sharma\",\r\n sub_lane_id: 1,\r\n email: \"aditisharma@gmail.com\",\r\n phone: \"+91 9846213495\",\r\n status: \"Active\",\r\n progress: 0,\r\n days: \"10 Days\",\r\n reference_id: \"INQ2024XY\",\r\n priority: null,\r\n lost: false,\r\n },\r\n {\r\n id: 2,\r\n name: \"Aditi Sharma\",\r\n sub_lane_id: 1,\r\n email: \"aditisharma@gmail.com\",\r\n phone: \"+91 9846213495\",\r\n status: \"Active\",\r\n progress: 0,\r\n days: \"10 Days\",\r\n reference_id: \"INQ2024XY\",\r\n priority: null,\r\n lost: false,\r\n },\r\n // Initial Outreach\r\n {\r\n id: 3,\r\n name: \"Rashmi Desai\",\r\n sub_lane_id: 2,\r\n email: \"aditisharma@gmail.com\",\r\n phone: \"+91 9765874320\",\r\n status: \"Active\",\r\n progress: 0,\r\n days: \"10 Days\",\r\n reference_id: \"INQ2024XY\",\r\n priority: null,\r\n lost: false,\r\n },\r\n // Lead Assessment\r\n {\r\n id: 4,\r\n name: \"Aditi Sharma\",\r\n sub_lane_id: 3,\r\n email: \"aditisharma@gmail.com\",\r\n phone: \"+91 9846213495\",\r\n status: \"Active\",\r\n progress: 0,\r\n days: \"10 Days\",\r\n reference_id: \"INQ2024XY\",\r\n priority: null,\r\n lost: false,\r\n },\r\n // Campus Visit\r\n {\r\n id: 5,\r\n name: \"Aditi Sharma\",\r\n sub_lane_id: 4,\r\n email: \"aditisharma@gmail.com\",\r\n phone: \"+91 9846213495\",\r\n status: \"Lost\",\r\n progress: 0,\r\n days: \"10 Days\",\r\n reference_id: \"2DQ2024XY\",\r\n priority: null,\r\n lost: true,\r\n },\r\n {\r\n id: 6,\r\n name: \"Aditi Sharma\",\r\n sub_lane_id: 4,\r\n email: \"aditisharma@gmail.com\",\r\n phone: \"+91 9846213495\",\r\n status: \"Active\",\r\n progress: 0,\r\n days: \"10 Days\",\r\n reference_id: \"INQ2024XY\",\r\n priority: null,\r\n lost: false,\r\n },\r\n // Application Collection\r\n {\r\n id: 7,\r\n name: \"Aditi Sharma\",\r\n sub_lane_id: 5,\r\n email: \"aditisharma@gmail.com\",\r\n phone: \"+91 9452013495\",\r\n status: \"Active\",\r\n progress: 0,\r\n days: \"10 Days\",\r\n reference_id: \"INQ2024XY\",\r\n priority: null,\r\n lost: false,\r\n },\r\n {\r\n id: 8,\r\n name: \"Aditi Sharma\",\r\n sub_lane_id: 5,\r\n email: \"aditisharma@gmail.com\",\r\n phone: \"+91 9452013495\",\r\n status: \"Active\",\r\n progress: 0,\r\n days: \"10 Days\",\r\n reference_id: \"INQ2024XY\",\r\n priority: null,\r\n lost: false,\r\n },\r\n // Student Assessment\r\n {\r\n id: 9,\r\n name: \"Aditi Sharma\",\r\n sub_lane_id: 6,\r\n email: \"aditisharma@gmail.com\",\r\n phone: \"+91 9452013495\",\r\n status: \"Active\",\r\n progress: 0,\r\n days: \"10 Days\",\r\n reference_id: \"INQ2024XY\",\r\n priority: null,\r\n lost: false,\r\n },\r\n // Fee Collection\r\n {\r\n id: 10,\r\n name: \"Aditi Sharma\",\r\n sub_lane_id: 7,\r\n email: \"aditisharma@gmail.com\",\r\n phone: \"+91 9846015495\",\r\n status: \"Active\",\r\n progress: 0,\r\n days: \"You\",\r\n reference_id: \"INQ2024XY\",\r\n priority: \"High\",\r\n lost: false,\r\n },\r\n // System Integration\r\n {\r\n id: 11,\r\n name: \"Aditi Sharma\",\r\n sub_lane_id: 8,\r\n email: \"aditisharma@gmail.com\",\r\n phone: \"+91 9846015495\",\r\n status: \"Lost\",\r\n progress: 0,\r\n days: \"You\",\r\n reference_id: \"INQ2024XY\",\r\n priority: \"Low\",\r\n lost: true,\r\n },\r\n ],\r\n};\r\n\r\nexport const COLOR_CONSTANTS = [\r\n { color: \"#fff0f3\", darkColor: \"#fea3b4\" },\r\n { color: \"#fffbed\", darkColor: \"#fde272\" },\r\n { color: \"#ebf9fc\", darkColor: \"#67e3f9\" },\r\n { color: \"#edf9f3\", darkColor: \"#73e2a3\" },\r\n];\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { Box, IconButton, Typography } from \"@mui/material\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport {\r\n FilterComponentOptions,\r\n FilterDrawerProps,\r\n FilterMasterStateProps,\r\n} from \"../../types/filter\";\r\nimport ConfirmModal, { InputField } from \"../common/confirm-modal\";\r\nimport CustomTabPanel from \"./components/tabs/custom-tab-panel\";\r\nimport CustomTabs, { TabItem } from \"./components/tabs/index\";\r\nimport MainFilter from \"./components/main-filter\";\r\nimport SavedFilter from \"./components/saved-filter\";\r\nimport AttributesFilter from \"./components/attributes-filter\";\r\nimport { filterStyles } from \"./style\";\r\nimport { deepMergeObjects } from \"../../libs/utils/deep-merge-objects\";\r\nimport SingleFilterRendering from \"./components/single-filter-rendering\";\r\nimport SavedFilterModalView from \"../common/saved-filter-modal\";\r\n\r\nexport function TableFilter({\r\n onClose,\r\n columnsData,\r\n tableStates,\r\n onDeleteFilter,\r\n onSaveFilter,\r\n onUpdateFilter,\r\n dropdownData,\r\n onChangeFunction,\r\n filterComponentOptions,\r\n isFlatJson,\r\n}: FilterDrawerProps) {\r\n const [tabValue, setTabValue] = useState(0);\r\n const [editMode, setEditMode] = useState(false);\r\n\r\n // remove this\r\n const [saveFilterModalOpen, setSaveFilterModalOpen] = useState(false);\r\n const [savedFilterModalOpen, setSavedFilterModalOpen] = useState(false);\r\n\r\n const [deleteFilterModalOpen, setDeleteFilterModalOpen] = useState(false);\r\n\r\n const [searchTerm, setSearchTerm] = useState<string>(\"\");\r\n\r\n const {\r\n filters,\r\n setFilters,\r\n filterToDelete,\r\n filterMaster,\r\n setFilterMaster,\r\n setShowFilterOption,\r\n } = tableStates;\r\n\r\n const defaultOptions: FilterComponentOptions = {\r\n showMainHeader: true,\r\n mainHeaderTitle: \"Filter\",\r\n showTabs: true,\r\n tabOptions: {\r\n isSingleFilter: false,\r\n disableShareFilter: false,\r\n isSingleEntity: false,\r\n showFilter: \"main\",\r\n mainFilter: {\r\n showSaveButton: true,\r\n showClearAllButton: true,\r\n },\r\n savedFilter: {\r\n showBackButton: true,\r\n editMode: false,\r\n },\r\n },\r\n showMainFilter: true,\r\n showSavedFilter: true,\r\n showAttributesFilter: true,\r\n };\r\n\r\n const finalComponentOptions = deepMergeObjects<FilterComponentOptions>(\r\n defaultOptions,\r\n filterComponentOptions ?? {}\r\n );\r\n\r\n const showMainHeader = finalComponentOptions?.showMainHeader;\r\n const mainHeaderTitle = finalComponentOptions?.mainHeaderTitle;\r\n const showTabs = finalComponentOptions?.showTabs;\r\n const showMainFilter = showTabs && finalComponentOptions?.showMainFilter;\r\n const showSavedFilter = showTabs && finalComponentOptions?.showSavedFilter;\r\n const showAttributesFilter =\r\n showTabs && finalComponentOptions?.showAttributesFilter;\r\n const editModeFromTabOptions =\r\n finalComponentOptions?.tabOptions?.savedFilter?.editMode;\r\n\r\n useEffect(() => {\r\n if (editModeFromTabOptions) {\r\n setEditMode(editModeFromTabOptions);\r\n }\r\n }, [editModeFromTabOptions]);\r\n\r\n // Map tabs to type\r\n const tabMapping: TabItem[] = [];\r\n if (showMainFilter) tabMapping.push({ label: \"Filter\" });\r\n if (showSavedFilter) tabMapping.push({ label: \"Saved Filter\" });\r\n if (showAttributesFilter) tabMapping.push({ label: \"Attributes\" });\r\n\r\n const clearAttributeRadio = () => {\r\n const newFilterMaster = {\r\n ...filterMaster,\r\n attributes: {\r\n ...filterMaster?.attributes,\r\n radio: [],\r\n },\r\n activeFilterTabIndex: 0,\r\n };\r\n\r\n setFilterMaster(newFilterMaster as FilterMasterStateProps);\r\n };\r\n\r\n const filterNameInput: InputField = {\r\n label: \"Filter Name\",\r\n placeholder: 'e.g., \"Website Leads - This Week\"',\r\n required: true,\r\n type: \"text\",\r\n };\r\n\r\n const hasSavedFilterRecords = Boolean(columnsData?.saved_filter?.length);\r\n\r\n // const handleSaveFilterButtonClick = () => {\r\n // if (editMode) {\r\n // setSavedFilterModalOpen(true);\r\n // return;\r\n // }\r\n\r\n // setSavedFilterModalOpen(true);\r\n // };\r\n\r\n // const handleSaveFilterButtonClick = () => {\r\n // // Reset filterMaster fields when creating a new filter\r\n // if (!editMode) {\r\n // setFilterMaster((prev) => ({\r\n // ...prev,\r\n // saved_filters: {\r\n // selectedId: \"\",\r\n // selectedName: \"\",\r\n // selectedCode: \"\",\r\n // description: \"\",\r\n // shareWithTeam: false,\r\n // allowTeamEdit: false,\r\n // },\r\n // }));\r\n // }\r\n\r\n // setSavedFilterModalOpen(true);\r\n // };\r\n\r\n const handleSaveFilterButtonClick = () => {\r\n if (!editMode) {\r\n setFilterMaster((prev) => {\r\n if (!prev) return prev;\r\n\r\n return {\r\n ...prev,\r\n saved_filters: {\r\n ...prev.saved_filters,\r\n shareWithTeam: false,\r\n allowTeamEdit: false,\r\n },\r\n };\r\n });\r\n }\r\n\r\n setSavedFilterModalOpen(true);\r\n };\r\n\r\n const handleSavedFilterModalSave = () => {\r\n const selectedId = filterMaster?.saved_filters?.selectedId;\r\n const selectedName = filterMaster?.saved_filters?.selectedName || \"\";\r\n const description = filterMaster?.saved_filters?.description || \"\";\r\n\r\n const selectedCode = filterMaster?.saved_filters?.selectedCode;\r\n\r\n const newFilterMasterState = {\r\n ...filterMaster,\r\n saved_filters: {\r\n ...(filterMaster?.saved_filters ?? {}),\r\n selectedId,\r\n selectedName,\r\n selectedCode,\r\n description,\r\n },\r\n } as FilterMasterStateProps;\r\n\r\n setFilterMaster(newFilterMasterState);\r\n\r\n const newState = {\r\n filterMaster: newFilterMasterState,\r\n filters,\r\n };\r\n\r\n onChangeFunction && onChangeFunction(newState);\r\n\r\n if (editMode) {\r\n onUpdateFilter && onUpdateFilter(selectedName);\r\n const isSingleSavedFilterEditMode =\r\n filterComponentOptions?.tabOptions?.savedFilter?.editMode;\r\n if (!isSingleSavedFilterEditMode) {\r\n setEditMode(false);\r\n }\r\n } else {\r\n onSaveFilter && onSaveFilter(selectedName);\r\n setTabValue(1);\r\n }\r\n\r\n setSavedFilterModalOpen(false);\r\n };\r\n\r\n const handleTabChange = (_: React.SyntheticEvent, newValue: number) => {\r\n const tabType = tabMapping[newValue]?.label;\r\n\r\n if (tabType === \"Attributes\" && tabMapping[tabValue]?.label === \"Filter\") {\r\n clearAttributeRadio();\r\n }\r\n\r\n setTabValue(newValue);\r\n if (newValue === 0) {\r\n setFilterMaster((prev) => {\r\n if (!prev) return prev;\r\n return {\r\n ...prev,\r\n saved_filters: {\r\n ...(prev.saved_filters ?? {}),\r\n selectedId: \"\",\r\n selectedName: \"\",\r\n description: \"\",\r\n is_shared: false,\r\n is_editable: false,\r\n },\r\n };\r\n });\r\n }\r\n\r\n if (tabType === \"Filter\") {\r\n setEditMode(false);\r\n\r\n setFilterMaster(\r\n (prev) =>\r\n ({ ...prev, activeFilterTabIndex: 0 } as FilterMasterStateProps)\r\n );\r\n }\r\n };\r\n\r\n const handleTabCrossClick = (index: number) => {\r\n const tabType = tabMapping[index];\r\n\r\n setFilters([]);\r\n\r\n if (tabType?.label === \"Saved Filter\") setEditMode(false);\r\n\r\n const patches: Partial<FilterMasterStateProps> = {};\r\n\r\n if (tabType?.label === \"Saved Filter\") {\r\n patches.saved_filters = {\r\n ...(filterMaster?.saved_filters ?? {}),\r\n selectedId: \"\",\r\n selectedName: \"\",\r\n selectedCode: \"\",\r\n is_shared: undefined,\r\n is_editable: undefined,\r\n };\r\n } else if (tabType?.label === \"Attributes\") {\r\n patches.attributes = { radio: [], selected: \"\" };\r\n }\r\n\r\n const newFilterMasterState = {\r\n ...filterMaster,\r\n activeFilterTabIndex: -1,\r\n ...patches,\r\n } as FilterMasterStateProps;\r\n\r\n setFilterMaster(newFilterMasterState);\r\n\r\n onChangeFunction &&\r\n onChangeFunction({ filterMaster: newFilterMasterState, filters });\r\n };\r\n\r\n const commonProps = {\r\n columnsData,\r\n tableStates,\r\n onChangeFunction,\r\n dropdownData,\r\n };\r\n\r\n const savedFilterProps = {\r\n editMode,\r\n setEditMode,\r\n setDeleteFilterModalOpen,\r\n tabValue,\r\n };\r\n\r\n const attributesProps = {\r\n searchTerm,\r\n setSearchTerm,\r\n };\r\n\r\n return (\r\n <Box sx={filterStyles.filterContainer}>\r\n {showMainHeader && (\r\n <Box sx={filterStyles.filterMainHeader}>\r\n <Typography variant=\"h6\" fontWeight=\"bold\" fontSize=\"18px\">\r\n {mainHeaderTitle}\r\n </Typography>\r\n <IconButton\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onClose && onClose();\r\n setShowFilterOption(false);\r\n }}\r\n aria-label=\"close\"\r\n >\r\n <CloseIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Box>\r\n )}\r\n\r\n {showTabs && (\r\n <CustomTabs\r\n value={tabValue}\r\n onChange={handleTabChange}\r\n tabItems={tabMapping}\r\n activeFilterIndex={filterMaster?.activeFilterTabIndex ?? 0}\r\n handleCrossClick={handleTabCrossClick}\r\n />\r\n )}\r\n\r\n {!showTabs && (\r\n <SingleFilterRendering\r\n {...commonProps}\r\n {...savedFilterProps}\r\n {...attributesProps}\r\n onSaveFilterButtonClick={handleSaveFilterButtonClick}\r\n filterComponentOptions={finalComponentOptions}\r\n />\r\n )}\r\n\r\n {showMainFilter && (\r\n <CustomTabPanel\r\n value={tabValue}\r\n index={tabMapping.findIndex((tab) => tab.label === \"Filter\")}\r\n sx={{ p: \"1.5rem 0.75rem\" }}\r\n >\r\n <MainFilter\r\n {...commonProps}\r\n onSaveFilterButtonClick={handleSaveFilterButtonClick}\r\n filterComponentOptions={finalComponentOptions}\r\n isFlatJson={isFlatJson}\r\n />\r\n </CustomTabPanel>\r\n )}\r\n\r\n {showSavedFilter && (\r\n <CustomTabPanel\r\n value={tabValue}\r\n index={tabMapping.findIndex((tab) => tab.label === \"Saved Filter\")}\r\n sx={{ p: \"1.5rem 0.75rem\" }}\r\n >\r\n <SavedFilter\r\n {...commonProps}\r\n {...savedFilterProps}\r\n onSaveFilterButtonClick={handleSaveFilterButtonClick}\r\n filterComponentOptions={finalComponentOptions}\r\n isFlatJson={isFlatJson}\r\n />\r\n </CustomTabPanel>\r\n )}\r\n\r\n {showAttributesFilter && (\r\n <CustomTabPanel\r\n value={tabValue}\r\n index={tabMapping.findIndex((tab) => tab.label === \"Attributes\")}\r\n sx={{ p: \"1.5rem 0.75rem\" }}\r\n >\r\n <AttributesFilter\r\n {...commonProps}\r\n {...attributesProps}\r\n tabValue={tabValue}\r\n isFlatJson={isFlatJson}\r\n />\r\n </CustomTabPanel>\r\n )}\r\n\r\n {!filterComponentOptions?.isRuleEngine && (\r\n <ConfirmModal\r\n open={saveFilterModalOpen}\r\n onClose={() => setSaveFilterModalOpen(false)}\r\n title={editMode ? \"Replace Existing Filter ?\" : \"Save Filter\"}\r\n description={\r\n editMode\r\n ? \"You already have a filter applied. Applying a new filter will replace the current one. Do you want to continue?\"\r\n : \"Give a name to this filter so you can easily reuse it later.\"\r\n }\r\n buttons={[\r\n {\r\n label: \"Cancel\",\r\n onClick: () => {\r\n setSaveFilterModalOpen(false);\r\n },\r\n variant: \"outlined\",\r\n color: \"primary\",\r\n sx: {\r\n color: \"#7A5AF8\",\r\n border: `1px solid #7A5AF8`,\r\n },\r\n },\r\n {\r\n label: editMode ? \"Replace Filter\" : \"Save\",\r\n onClick: (inputValue) => {\r\n if (editMode) {\r\n const selectedId = filterMaster?.saved_filters?.selectedId;\r\n const selectedName =\r\n inputValue || filterMaster?.saved_filters?.selectedName;\r\n const selectedCode =\r\n filterMaster?.saved_filters?.selectedCode;\r\n const description =\r\n inputValue || filterMaster?.saved_filters?.description;\r\n\r\n const newFilterMasterState = {\r\n ...filterMaster,\r\n saved_filters: {\r\n ...(filterMaster?.saved_filters ?? {}),\r\n selectedId,\r\n selectedName,\r\n selectedCode,\r\n description,\r\n },\r\n } as FilterMasterStateProps;\r\n\r\n setFilterMaster(newFilterMasterState);\r\n\r\n const newState = {\r\n filterMaster: newFilterMasterState,\r\n filters: filters,\r\n };\r\n\r\n onChangeFunction && onChangeFunction(newState);\r\n\r\n onUpdateFilter && onUpdateFilter(inputValue || \"\");\r\n setSaveFilterModalOpen(false);\r\n setEditMode(false);\r\n return;\r\n }\r\n\r\n onSaveFilter && onSaveFilter(inputValue || \"\");\r\n setSaveFilterModalOpen(false);\r\n setTabValue(1);\r\n },\r\n variant: \"contained\",\r\n color: \"primary\",\r\n sx: {\r\n color: \"white\",\r\n backgroundColor: editMode ? \"#7A5AF8\" : \"#7A5AF8\",\r\n },\r\n },\r\n ]}\r\n input={editMode ? undefined : filterNameInput}\r\n />\r\n )}\r\n\r\n {!filterComponentOptions?.isRuleEngine && (\r\n <ConfirmModal\r\n open={deleteFilterModalOpen}\r\n onClose={() => setDeleteFilterModalOpen(false)}\r\n title=\"Delete Saved Filter?\"\r\n description={`You're about to delete the saved filter: \"${\r\n filterToDelete?.label || \"[Filter Name]\"\r\n }\". This action cannot be undone. Are you sure you want to continue?`}\r\n buttons={[\r\n {\r\n label: \"Cancel\",\r\n onClick: () => {\r\n setDeleteFilterModalOpen(false);\r\n },\r\n variant: \"outlined\",\r\n color: \"primary\",\r\n sx: { color: \"#7A5AF8\", border: `1px solid #7A5AF8` },\r\n },\r\n {\r\n label: \"Delete\",\r\n onClick: () => {\r\n onDeleteFilter && onDeleteFilter();\r\n setDeleteFilterModalOpen(false);\r\n setEditMode && setEditMode(false);\r\n },\r\n variant: \"contained\",\r\n sx: {\r\n color: \"white\",\r\n backgroundColor: \"#f63d68\",\r\n \"&:hover\": { backgroundColor: \"#f63d68\" },\r\n },\r\n },\r\n ]}\r\n maxWidth=\"xs\"\r\n />\r\n )}\r\n\r\n {filterComponentOptions?.isRuleEngine && (\r\n <ConfirmModal\r\n open={saveFilterModalOpen}\r\n onClose={() => setSaveFilterModalOpen(false)}\r\n title={\r\n editMode\r\n ? filterComponentOptions?.recordFilterComponentProps?.edit\r\n ?.title || \"Replace Existing Filter ?\"\r\n : filterComponentOptions?.recordFilterComponentProps?.save\r\n ?.title || \"Save Filter\"\r\n }\r\n description={\r\n editMode\r\n ? filterComponentOptions?.recordFilterComponentProps?.edit\r\n ?.description ||\r\n \"You already have a filter applied. Applying a new filter will replace the current one. Do you want to continue?\"\r\n : filterComponentOptions?.recordFilterComponentProps?.save\r\n ?.description ||\r\n \"Give a name to this filter so you can easily reuse it later.\"\r\n }\r\n buttons={[\r\n {\r\n label:\r\n filterComponentOptions?.recordFilterComponentProps?.save.button\r\n ?.primary || \"Cancel\",\r\n onClick: () => {\r\n setSaveFilterModalOpen(false);\r\n },\r\n variant: \"outlined\",\r\n color: \"primary\",\r\n sx: {\r\n color: \"#7A5AF8\",\r\n border: `1px solid #7A5AF8`,\r\n },\r\n },\r\n {\r\n label: editMode\r\n ? filterComponentOptions?.recordFilterComponentProps?.edit\r\n .button?.secondary || \"Replace Filter\"\r\n : filterComponentOptions?.recordFilterComponentProps?.save\r\n .button?.secondary || \"Save\",\r\n onClick: (inputValue) => {\r\n if (editMode) {\r\n const selectedId = filterMaster?.saved_filters?.selectedId;\r\n const selectedName =\r\n inputValue || filterMaster?.saved_filters?.selectedName;\r\n const selectedCode =\r\n filterMaster?.saved_filters?.selectedCode;\r\n\r\n const newFilterMasterState = {\r\n ...filterMaster,\r\n saved_filters: {\r\n ...(filterMaster?.saved_filters ?? {}),\r\n selectedId,\r\n selectedName,\r\n selectedCode,\r\n },\r\n } as FilterMasterStateProps;\r\n\r\n setFilterMaster(newFilterMasterState);\r\n\r\n const newState = {\r\n filterMaster: newFilterMasterState,\r\n filters: filters,\r\n };\r\n\r\n onChangeFunction && onChangeFunction(newState);\r\n\r\n onUpdateFilter && onUpdateFilter(inputValue || \"\");\r\n setSaveFilterModalOpen(false);\r\n let isSingleSavedFilterEditMode =\r\n filterComponentOptions?.tabOptions?.savedFilter?.editMode;\r\n if (!isSingleSavedFilterEditMode) setEditMode(false);\r\n return;\r\n }\r\n\r\n onSaveFilter && onSaveFilter(inputValue || \"\");\r\n setSaveFilterModalOpen(false);\r\n setTabValue(1);\r\n },\r\n variant: \"contained\",\r\n color: \"primary\",\r\n sx: {\r\n color: \"white\",\r\n backgroundColor: editMode ? \"#7A5AF8\" : \"#7A5AF8\",\r\n },\r\n },\r\n ]}\r\n input={editMode ? undefined : filterNameInput}\r\n />\r\n )}\r\n\r\n {filterComponentOptions?.isRuleEngine && (\r\n <ConfirmModal\r\n open={deleteFilterModalOpen}\r\n onClose={() => setDeleteFilterModalOpen(false)}\r\n title={\r\n filterComponentOptions?.recordFilterComponentProps?.delete.title ||\r\n \"Delete Saved Filter?\"\r\n }\r\n description={\r\n filterComponentOptions?.recordFilterComponentProps?.delete\r\n .description ||\r\n `You're about to delete the saved filter: \"${\r\n filterToDelete?.label || \"[Filter Name]\"\r\n }\". This action cannot be undone. Are you sure you want to continue?`\r\n }\r\n buttons={[\r\n {\r\n label:\r\n filterComponentOptions?.recordFilterComponentProps?.delete\r\n .button?.primary || \"Cancel\",\r\n onClick: () => {\r\n setDeleteFilterModalOpen(false);\r\n },\r\n variant: \"outlined\",\r\n color: \"primary\",\r\n sx: { color: \"#7A5AF8\", border: `1px solid #7A5AF8` },\r\n },\r\n {\r\n label:\r\n filterComponentOptions?.recordFilterComponentProps?.delete\r\n .button?.secondary || \"Delete\",\r\n onClick: () => {\r\n onDeleteFilter && onDeleteFilter();\r\n setDeleteFilterModalOpen(false);\r\n let isSingleSavedFilterEditMode =\r\n filterComponentOptions?.tabOptions?.savedFilter?.editMode;\r\n if (!isSingleSavedFilterEditMode) {\r\n setEditMode && setEditMode(false);\r\n }\r\n },\r\n variant: \"contained\",\r\n sx: {\r\n color: \"white\",\r\n backgroundColor: \"#f63d68\",\r\n \"&:hover\": { backgroundColor: \"#f63d68\" },\r\n },\r\n },\r\n ]}\r\n maxWidth=\"xs\"\r\n />\r\n )}\r\n <SavedFilterModalView\r\n open={savedFilterModalOpen}\r\n onClose={() => setSavedFilterModalOpen(false)}\r\n onSave={handleSavedFilterModalSave}\r\n filterMaster={tableStates.filterMaster}\r\n setFilterMaster={tableStates.setFilterMaster}\r\n hasSavedFilters={hasSavedFilterRecords}\r\n columnsData={columnsData}\r\n disableShareFilter={\r\n filterComponentOptions?.tabOptions?.disableShareFilter\r\n }\r\n />\r\n </Box>\r\n );\r\n}\r\n","import React, { useState } from \"react\";\r\nimport {\r\n DialogTitle,\r\n IconButton,\r\n Box,\r\n Typography,\r\n DialogContent,\r\n DialogActions,\r\n} from \"@mui/material\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport CustomVerticalTabs from \"./tabs/vertical\";\r\nimport CustomTabPanel from \"./tabs/vertical/custom-tab-panel\";\r\nimport QuickTab from \"./components/quick-tab\";\r\nimport Column from \"./components/column\";\r\nimport Sorting from \"./components/sorting\";\r\nimport { QuickFilterModalProps } from \"../../types/filter-settings\";\r\nimport { CustomDialog, DialogTransition } from \"./components/custom-dialog\";\r\nimport { dialogStyles } from \"./style\";\r\nimport CustomButton from \"./components/custom-button\";\r\nimport { KANBAN_SETTINGS_TABS, SETTINGS_TABS } from \"./constants\";\r\nimport Loader from \"../common/loader/loader\";\r\nimport Lane from \"./components/lane\";\r\nimport GroupBy from \"./components/group-by\";\r\nimport { useFullscreenPopoverContainer } from \"../../libs/hooks/useFullScreen\";\r\n\r\nexport function QuickFilterSettings({\r\n view = \"listing\",\r\n isFlatJson,\r\n show,\r\n filterSettingStates,\r\n onClose,\r\n columnsData,\r\n columnsDataLoading,\r\n quickTabAttributes,\r\n quickTabAttributesLoading,\r\n columnTabAttributes,\r\n columnTabAttributesLoading,\r\n sortingTabAttributes,\r\n sortingTabAttributesLoading,\r\n tabsApiData,\r\n tabsApiDataLoading,\r\n onSaveSettingsData,\r\n activeTab,\r\n}: QuickFilterModalProps) {\r\n const [tabValue, setTabValue] = useState(0);\r\n const { container: fullscreenContainer } = useFullscreenPopoverContainer();\r\n\r\n const {\r\n showListViewSettings,\r\n quickTabStates,\r\n columnTabState,\r\n sortingTabState,\r\n saveButtonError,\r\n } = filterSettingStates;\r\n\r\n const hasAPIData = Boolean(Object.entries(columnsData).length);\r\n let disbaledCondition =\r\n // quickTabStates?.show_list?.length === 0 || --> commented as per the requirement\r\n columnTabState?.isDefault\r\n ? columnTabState?.show_list?.length === 0\r\n : columnTabState?.tabs?.find((tab) => tab?.show_list?.length === 0)\r\n ?.show_list?.length === 0;\r\n\r\n const handleTabChange = (_: React.SyntheticEvent, newValue: number) => {\r\n setTabValue(newValue);\r\n };\r\n\r\n const handleSaveSetSettingsData = () => {\r\n const copyColumnTabState = columnTabState?.isDefault\r\n ? {\r\n isDefault: true,\r\n show_list: columnTabState?.show_list || [],\r\n hide_list: columnTabState?.hide_list || [],\r\n }\r\n : {\r\n isDefault: false,\r\n tabs: columnTabState?.tabs || [],\r\n };\r\n\r\n const copySortingTabState = sortingTabState?.isDefault\r\n ? {\r\n isDefault: true,\r\n sortby:\r\n sortingTabState?.sortby?.filter((item) => item.column !== \"\") || [],\r\n }\r\n : {\r\n isDefault: false,\r\n tabs: sortingTabState?.tabs || [],\r\n };\r\n\r\n const modifiedSettingsData = {\r\n quick_tab: quickTabStates,\r\n column: copyColumnTabState,\r\n sorting: copySortingTabState,\r\n };\r\n\r\n onSaveSettingsData && onSaveSettingsData(modifiedSettingsData);\r\n onClose && onClose();\r\n };\r\n\r\n return (\r\n <CustomDialog\r\n open={show || showListViewSettings}\r\n fullWidth\r\n maxWidth=\"lg\"\r\n slots={{\r\n transition: DialogTransition,\r\n }}\r\n container={fullscreenContainer}\r\n >\r\n <DialogTitle sx={dialogStyles.dialogTitle}>\r\n <Typography sx={{ fontSize: \"1.125rem\" }}>List View Setting</Typography>\r\n <IconButton\r\n size=\"small\"\r\n color=\"inherit\"\r\n onClick={() => {\r\n onClose && onClose();\r\n }}\r\n >\r\n <CloseIcon />\r\n </IconButton>\r\n </DialogTitle>\r\n\r\n <DialogContent>\r\n {columnsDataLoading ? (\r\n <Loader loaderText=\"Loading settings...\" />\r\n ) : !hasAPIData ? ( // check if columns data is available\r\n <Typography>Please pass meta data in component</Typography>\r\n ) : (\r\n <>\r\n <CustomVerticalTabs\r\n value={tabValue}\r\n onChange={handleTabChange}\r\n tabItems={\r\n view === \"listing\" ? SETTINGS_TABS : KANBAN_SETTINGS_TABS\r\n }\r\n />\r\n\r\n <Box sx={{ flex: \"1\" }}>\r\n {view.toLowerCase() === \"listing\" && (\r\n <CustomTabPanel value={tabValue} index={0}>\r\n {tabValue === 0 && (\r\n <QuickTab\r\n filterSettingStates={filterSettingStates}\r\n columnsData={quickTabAttributes}\r\n tabsApiData={tabsApiData}\r\n tabsApiDataLoading={tabsApiDataLoading}\r\n activeTab={activeTab}\r\n columnTabAttributes={columnTabAttributes}\r\n isFlatJson={isFlatJson}\r\n />\r\n )}\r\n </CustomTabPanel>\r\n )}\r\n\r\n {view.toLowerCase() === \"listing\" && (\r\n <CustomTabPanel value={tabValue} index={1}>\r\n {tabValue === 1 && (\r\n <Column\r\n filterSettingStates={filterSettingStates}\r\n columnsData={columnsData}\r\n columnTabAttributes={columnTabAttributes}\r\n columnTabAttributesLoading={columnTabAttributesLoading}\r\n />\r\n )}\r\n </CustomTabPanel>\r\n )}\r\n\r\n {view.toLowerCase() === \"listing\" && (\r\n <CustomTabPanel value={tabValue} index={2}>\r\n {tabValue === 2 && (\r\n <Sorting\r\n filterSettingStates={filterSettingStates}\r\n columnsData={sortingTabAttributes}\r\n />\r\n )}\r\n </CustomTabPanel>\r\n )}\r\n {view.toLowerCase() === \"kanban\" && (\r\n <CustomTabPanel value={tabValue} index={0}>\r\n {tabValue === 0 && (\r\n <Lane\r\n filterSettingStates={filterSettingStates}\r\n columnsData={columnsData}\r\n />\r\n )}\r\n </CustomTabPanel>\r\n )}\r\n\r\n {view.toLowerCase() === \"kanban\" && (\r\n <CustomTabPanel value={tabValue} index={1}>\r\n {tabValue === 1 && (\r\n <GroupBy\r\n filterSettingStates={filterSettingStates}\r\n columnsData={columnsData}\r\n />\r\n )}\r\n </CustomTabPanel>\r\n )}\r\n </Box>\r\n </>\r\n )}\r\n </DialogContent>\r\n\r\n {!columnsDataLoading && hasAPIData && (\r\n <DialogActions>\r\n <CustomButton\r\n // disabled={saveButtonError?.hasError}\r\n // disabled={saveButtonError?.hasError}\r\n disabled={disbaledCondition}\r\n onClick={handleSaveSetSettingsData}\r\n >\r\n {view === \"listing\" ? \"Save Quick Filter\" : \"Save Kanban Layout\"}\r\n </CustomButton>\r\n </DialogActions>\r\n )}\r\n </CustomDialog>\r\n );\r\n}\r\n","import { Box, CircularProgress, IconButton } from \"@mui/material\";\r\nimport { CraftTableOptionsProps } from \"../../types/table-options\";\r\nimport { settingsOptionsProps } from \"../../types/table\";\r\nimport { useMemo } from \"react\";\r\nimport { TableTab, TableTabCount, TableTabsRoot } from \"./tabs.styles\";\r\nimport { SettingsOutlined } from \"@mui/icons-material\";\r\n\r\ninterface TabDataProps {\r\n tab_name: string | null;\r\n count?: string | number;\r\n}\r\n\r\ninterface TableTabsProps {\r\n loading?: boolean;\r\n tabsData?: TabDataProps[];\r\n activeTab?: TabDataProps;\r\n tableStates: CraftTableOptionsProps;\r\n onClick: (state: string) => void;\r\n settingsOptions?: settingsOptionsProps;\r\n}\r\n\r\nexport function TableTabs({\r\n loading = false,\r\n tabsData = [],\r\n activeTab = { tab_name: \"All\", count: 0 },\r\n onClick,\r\n tableStates,\r\n settingsOptions,\r\n}: TableTabsProps) {\r\n if (loading) return <CircularProgress size={24} />;\r\n\r\n const handleTabClick = (tab: string) => {\r\n onClick(tab);\r\n tableStates.setPagination((prev) => ({\r\n ...prev,\r\n pageIndex: 0,\r\n }));\r\n };\r\n\r\n const normalizedTabs = useMemo(() => {\r\n return tabsData\r\n ?.filter((tab) => tab.tab_name !== null)\r\n ?.map((tab) => ({\r\n ...tab,\r\n tab_name: tab.tab_name,\r\n }));\r\n }, [tabsData]);\r\n\r\n const defaultTab = useMemo(() => {\r\n return (\r\n normalizedTabs.find((t) => t.tab_name === \"All\")?.tab_name ||\r\n normalizedTabs[0]?.tab_name ||\r\n \"\"\r\n );\r\n }, [normalizedTabs]);\r\n\r\n const selectedTab = activeTab?.tab_name || defaultTab;\r\n\r\n return (\r\n <Box display=\"flex\" alignItems=\"center\" justifyContent=\"flex-start\">\r\n {/* Settings icon */}\r\n {settingsOptions?.showIcon && (\r\n <IconButton size=\"small\" onClick={settingsOptions?.onClick}>\r\n <SettingsOutlined fontSize=\"small\" />\r\n </IconButton>\r\n )}\r\n\r\n {/* Tabs */}\r\n <TableTabsRoot\r\n value={selectedTab}\r\n onChange={(_, newValue) => handleTabClick(newValue)}\r\n variant=\"scrollable\"\r\n scrollButtons=\"auto\"\r\n >\r\n {normalizedTabs.map((tab) => {\r\n const isSelected = activeTab?.tab_name === tab?.tab_name;\r\n\r\n return (\r\n <TableTab\r\n key={tab?.tab_name}\r\n value={tab}\r\n label={\r\n <Box display=\"flex\" alignItems=\"center\" gap={1}>\r\n <Box sx={{ color: isSelected ? \"#000\" : \"\" }}>\r\n {tab?.tab_name}\r\n </Box>\r\n <TableTabCount selected={isSelected}>\r\n {tab?.count == 0\r\n ? \"0\"\r\n : String(tab?.count).padStart(2, \"0\")}\r\n </TableTabCount>\r\n </Box>\r\n }\r\n />\r\n );\r\n })}\r\n </TableTabsRoot>\r\n </Box>\r\n );\r\n}\r\n","import React, { useEffect, useState } from \"react\";\r\nimport {\r\n Box,\r\n Typography,\r\n Accordion,\r\n AccordionSummary,\r\n AccordionDetails,\r\n IconButton,\r\n} from \"@mui/material\";\r\nimport SettingsOutlinedIcon from \"@mui/icons-material/SettingsOutlined\";\r\nimport {\r\n ExpandMore as ExpandMoreIcon,\r\n Settings as SettingsIcon,\r\n} from \"@mui/icons-material\";\r\nimport ArrowDropDownIcon from \"@mui/icons-material/ArrowDropDown\";\r\nimport { kanbanStyles } from \"./styles/styles\";\r\nimport { Lane, SubLane, SwimLane } from \"./types/types\";\r\nimport { COLOR_CONSTANTS } from \"./constants/kanban-constants\";\r\nimport Loader from \"../listing/components/common/loader/loader\";\r\n\r\nconst Kanban = ({\r\n metaData,\r\n data,\r\n isLoading,\r\n KanbanCardComponent,\r\n showSettings,\r\n onOpenSettings,\r\n}: {\r\n metaData: any;\r\n data: any;\r\n isLoading?: boolean;\r\n KanbanCardComponent: React.ComponentType<{\r\n key: string | number;\r\n cardData: any;\r\n }>;\r\n showSettings: boolean;\r\n onOpenSettings?: () => void;\r\n}) => {\r\n const [expandedPanels, setExpandedPanels] = useState<{\r\n [key: string]: boolean;\r\n }>({\r\n Active: true,\r\n });\r\n\r\n const [subLaneExpanded, setSubLaneExpanded] = useState<{\r\n [key: string]: boolean;\r\n }>({});\r\n\r\n useEffect(() => {\r\n if (metaData?.swim_lanes?.length) {\r\n const initial: { [key: string]: boolean } = {};\r\n metaData?.swim_lanes.forEach((swim_lane: SwimLane) => {\r\n swim_lane?.sub_lanes?.forEach((sub_lane) => {\r\n const key = `${swim_lane.id}-${sub_lane.lane_id}-${sub_lane.id}`;\r\n initial[key] = sub_lane.expanded || false;\r\n });\r\n });\r\n setSubLaneExpanded(initial);\r\n }\r\n }, [metaData]);\r\n\r\n const handleAccordionChange =\r\n (panel: string) => (event: React.SyntheticEvent, isExpanded: boolean) => {\r\n setExpandedPanels((prev) => ({\r\n ...prev,\r\n [panel]: isExpanded,\r\n }));\r\n };\r\n\r\n const toggleSubLane = (subLaneId: number | string) => {\r\n setSubLaneExpanded((prev) => ({\r\n ...prev,\r\n [subLaneId]: !prev[subLaneId],\r\n }));\r\n };\r\n\r\n const getLeadCount = (laneId: number): number => {\r\n if (!metaData?.swim_lanes || !data) return 0;\r\n\r\n const seenLeadIds = new Set<number | string>();\r\n let count = 0;\r\n\r\n metaData?.swim_lanes.forEach((swimLane: SwimLane) => {\r\n swimLane.sub_lanes\r\n ?.filter((subLane) => subLane.lane_id == laneId)\r\n ?.forEach((subLane) => {\r\n data?.forEach((lead: any) => {\r\n if (lead?.stage_id == subLane?.id && !seenLeadIds.has(lead?.id)) {\r\n seenLeadIds.add(lead.id);\r\n count++;\r\n }\r\n });\r\n });\r\n });\r\n\r\n return count;\r\n };\r\n\r\n return (\r\n <>\r\n {isLoading ? (\r\n <Loader />\r\n ) : (\r\n <Box>\r\n <Box\r\n className=\"kanban-container\"\r\n sx={{ width: \"100%\", bgcolor: \"white\", overflowX: \"auto\" }}\r\n >\r\n {/* Header */}\r\n <Box sx={kanbanStyles.topHeader}>\r\n <IconButton\r\n onClick={onOpenSettings}\r\n sx={{\r\n ...kanbanStyles.settingStyle,\r\n visibility: showSettings ? \"visible\" : \"hidden\",\r\n }}\r\n >\r\n <SettingsOutlinedIcon />\r\n </IconButton>\r\n\r\n {/* Lane Headers - Replaced Grid with Flex */}\r\n <Box\r\n sx={{\r\n ...kanbanStyles.syncingStyle,\r\n flex: 1,\r\n }}\r\n >\r\n {metaData?.lanes?.map((lane: Lane, index: number) => (\r\n <Box\r\n className=\"lane-header\"\r\n sx={{\r\n ...kanbanStyles.laneHeader,\r\n\r\n bgcolor: lane.color || COLOR_CONSTANTS[index % 4].color,\r\n }}\r\n key={lane.id}\r\n >\r\n <Box\r\n sx={{\r\n ...kanbanStyles.badge,\r\n\r\n bgcolor:\r\n lane.darkColor ||\r\n COLOR_CONSTANTS[index % 4].darkColor,\r\n }}\r\n >\r\n {getLeadCount(Number(lane.id))}\r\n </Box>\r\n\r\n <Typography variant=\"h6\" fontWeight=\"bold\" sx={{ px: 2 }}>\r\n {lane?.name}\r\n </Typography>\r\n </Box>\r\n ))}\r\n </Box>\r\n </Box>\r\n\r\n {/* Content */}\r\n <Box\r\n className=\"kanban-content\"\r\n id=\"kanban-content\"\r\n sx={{\r\n maxHeight: \"calc(100vh - 186px)\",\r\n // minWidth: \"100%\",\r\n\r\n width: \"fit-content\",\r\n }}\r\n >\r\n {/* Swim Lanes */}\r\n {metaData?.swim_lanes?.map((swim_lane: SwimLane) => (\r\n <Accordion\r\n key={swim_lane.id}\r\n expanded={!!expandedPanels[swim_lane.name]}\r\n onChange={handleAccordionChange(swim_lane.name)}\r\n sx={kanbanStyles.swimLaneAccordionStyle}\r\n // disabled={getSwimLaneCount(swim_lane.id) === 0 ? true : false}\r\n >\r\n <AccordionSummary\r\n disabled={swim_lane?.sub_lanes?.length > 0 ? false : true}\r\n expandIcon={\r\n <ArrowDropDownIcon\r\n sx={{\r\n color: \"black\",\r\n }}\r\n />\r\n }\r\n sx={kanbanStyles.swimlaneWrapperStyle}\r\n >\r\n <Typography\r\n variant=\"body1\"\r\n fontWeight=\"medium\"\r\n sx={{ ml: 1.5 }}\r\n >\r\n {swim_lane?.name} (\r\n {\r\n data?.filter(\r\n (lead: any) => lead?.lead_status_id == swim_lane?.id\r\n ).length\r\n }\r\n )\r\n </Typography>\r\n </AccordionSummary>\r\n\r\n <AccordionDetails\r\n sx={{ pl: \"16px\", pr: \"8px\", width: \"fit-content\", py: 0 }}\r\n >\r\n {/* Replaced Grid with Flex */}\r\n <Box sx={{ ...kanbanStyles.syncingStyle, pl: 7 }}>\r\n {metaData?.lanes?.map((lane: Lane, index: number) => (\r\n <Box\r\n className=\"column\"\r\n sx={{\r\n ...kanbanStyles.columnStyle,\r\n bgcolor:\r\n lane?.color || COLOR_CONSTANTS[index % 4].color,\r\n }}\r\n key={lane.id}\r\n >\r\n {/* Sub-lanes for this lane */}\r\n {swim_lane?.sub_lanes\r\n ?.filter(\r\n (sub_lane: SubLane) =>\r\n sub_lane.lane_id.toString() == lane?.id\r\n )\r\n ?.map((sub_section: SubLane) => {\r\n const subLaneKey = `${swim_lane?.id}-${lane?.id}-${sub_section?.id}`;\r\n return (\r\n <Accordion\r\n key={sub_section.id}\r\n expanded={\r\n data?.filter(\r\n (lead: any) =>\r\n lead?.stage_id == sub_section?.id &&\r\n lead?.lead_status_id == swim_lane?.id\r\n )?.length === 0\r\n ? false\r\n : subLaneExpanded[subLaneKey] || false\r\n }\r\n onChange={() => toggleSubLane(subLaneKey)}\r\n sx={{\r\n ...kanbanStyles.stageStyle,\r\n borderLeft: `4px solid ${\r\n lane.darkColor ||\r\n COLOR_CONSTANTS[index % 4].darkColor\r\n }`,\r\n }}\r\n // disabled={\r\n // metaData?.data?.filter(\r\n // (lead: LeadData) =>\r\n // lead.sub_lane_id === sub_section.id &&\r\n // !usedLeadIds.has(lead.id)\r\n // )?.length === 0\r\n // ? true\r\n // : false\r\n // }\r\n >\r\n <AccordionSummary\r\n expandIcon={\r\n <ExpandMoreIcon\r\n sx={{\r\n display:\r\n data?.filter(\r\n (lead: any) =>\r\n lead?.stage_id ==\r\n sub_section?.id &&\r\n lead?.lead_status_id ==\r\n swim_lane?.id\r\n )?.length === 0\r\n ? \"none\"\r\n : \"block\",\r\n }}\r\n />\r\n }\r\n sx={kanbanStyles.subSectionAccordion}\r\n >\r\n <Box\r\n sx={\r\n kanbanStyles.subSectionHeaderContainer\r\n }\r\n >\r\n <Box\r\n className=\"sub-section-count\"\r\n sx={{\r\n ...kanbanStyles.subSectionCountContainer,\r\n bgcolor:\r\n lane?.darkColor ||\r\n COLOR_CONSTANTS[index % 4]\r\n .darkColor,\r\n }}\r\n >\r\n {data?.filter(\r\n (lead: any) =>\r\n lead?.stage_id == sub_section?.id &&\r\n lead?.lead_status_id ==\r\n swim_lane?.id\r\n )?.length || 0}\r\n </Box>\r\n <Typography\r\n fontWeight=\"700\"\r\n color=\"#555354\"\r\n fontSize=\"12px\"\r\n >\r\n {sub_section?.name}\r\n </Typography>\r\n </Box>\r\n </AccordionSummary>\r\n\r\n <AccordionDetails\r\n sx={kanbanStyles.cardsContainer}\r\n >\r\n {(() => {\r\n const leadsForThisSubLane =\r\n data?.filter(\r\n (lead: any) =>\r\n lead?.stage_id == sub_section?.id &&\r\n lead?.lead_status_id ==\r\n swim_lane?.id &&\r\n lead?.stage_group_id == lane?.id\r\n ) || [];\r\n\r\n return leadsForThisSubLane.map(\r\n (card: any) =>\r\n (KanbanCardComponent && (\r\n <KanbanCardComponent\r\n key={card?.id}\r\n cardData={card}\r\n />\r\n )) ||\r\n null\r\n );\r\n })()}\r\n </AccordionDetails>\r\n </Accordion>\r\n );\r\n })}\r\n </Box>\r\n ))}\r\n </Box>\r\n </AccordionDetails>\r\n </Accordion>\r\n ))}\r\n </Box>\r\n </Box>\r\n </Box>\r\n )}\r\n </>\r\n );\r\n};\r\n\r\nexport default Kanban;\r\n","import {\r\n ColumnDef,\r\n ColumnMeta,\r\n getCoreRowModel,\r\n getExpandedRowModel,\r\n getPaginationRowModel,\r\n getSortedRowModel,\r\n useReactTable,\r\n} from \"@tanstack/react-table\";\r\nimport \"./index.scss\";\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport {\r\n CraftTablePaginationProps,\r\n CraftTableProps,\r\n TopbarOptionsProps,\r\n} from \"../types/table\";\r\nimport { CraftTableFeatureProps } from \"../types/table-options\";\r\nimport { LoaderAnimation } from \"../../assets/svg\";\r\nimport Topbar from \"./topbar\";\r\nimport DefaultPagination from \"./pagination/default\";\r\nimport TableDND from \"./table-dnd\";\r\nimport Table from \"./table\";\r\nimport { useFullscreenPopoverContainer } from \"../libs/hooks/useFullScreen\";\r\n\r\ninterface CustomColumnMeta<T> extends ColumnMeta<T, unknown> {\r\n defaultPinned?: \"left\" | \"right\" | undefined;\r\n}\r\n\r\nfunction TableWrapper<T>({\r\n data = [],\r\n columns = [],\r\n tableStates,\r\n filterSettingStates,\r\n onSaveSettings,\r\n paginationOptions,\r\n featureOptions,\r\n topbarOptions,\r\n nestedComponent,\r\n loadingOptions = { isLoading: false },\r\n customRenderFn = {},\r\n // styleOptions,\r\n shouldHideColumn,\r\n emptyListComponent,\r\n filterOptions,\r\n activeTab,\r\n}: CraftTableProps<T>) {\r\n if (!Array.isArray(data)) {\r\n throw new Error(\"data must be an array of objects.\");\r\n }\r\n const [metaColumns, setMetaColumns] = useState<ColumnDef<T>[]>([]);\r\n\r\n useEffect(() => {\r\n if (columns?.length > 0) {\r\n const updatedColumns = columns\r\n ?.filter((col) => {\r\n const accessorKey =\r\n \"accessorKey\" in col\r\n ? (col as { accessorKey: string })?.accessorKey\r\n : undefined;\r\n return typeof shouldHideColumn === \"function\"\r\n ? !shouldHideColumn(accessorKey)\r\n : true;\r\n })\r\n ?.map((col, index) => {\r\n const id =\r\n \"accessorKey\" in col\r\n ? (col as { accessorKey: string })?.accessorKey\r\n : `col_${index}`;\r\n\r\n const cell = (ctx: any) => {\r\n if (col?.meta?.type === \"custom\" && col?.meta?.propName) {\r\n const customFn = customRenderFn?.[col?.meta?.propName];\r\n return typeof customFn === \"function\"\r\n ? customFn({\r\n value: ctx?.getValue(),\r\n row: ctx?.row,\r\n table: ctx?.table?.getRowModel()?.rows,\r\n })\r\n : ctx?.getValue();\r\n }\r\n\r\n if (typeof col?.cell === \"function\") {\r\n return col?.cell(ctx);\r\n }\r\n\r\n return ctx?.getValue();\r\n };\r\n\r\n return { ...col, id, cell };\r\n });\r\n\r\n setMetaColumns(updatedColumns);\r\n }\r\n }, [columns]);\r\n\r\n //For Default Column Pinning to work\r\n useEffect(() => {\r\n table.getAllLeafColumns().forEach((col) => {\r\n const where = (col.columnDef.meta as CustomColumnMeta<T>)\r\n ?.defaultPinned as \"left\" | \"right\" | undefined;\r\n if (where && !col.getIsPinned()) {\r\n col.pin(where);\r\n }\r\n });\r\n }, [tableStates?.columnPinning?.left, metaColumns]);\r\n\r\n const [columnOrder, setColumnOrder] = useState<string[]>(() =>\r\n metaColumns.map((c) => c.id!)\r\n );\r\n\r\n useEffect(() => {\r\n if (metaColumns.length > 0) {\r\n setColumnOrder(metaColumns.map((c) => c.id!));\r\n }\r\n }, [metaColumns]);\r\n\r\n const [isCompactTable, setIsCompactTable] = useState<boolean>(\r\n featureOptions?.compactTable ?? false\r\n );\r\n\r\n const tableRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n setIsCompactTable(featureOptions?.compactTable ?? false);\r\n }, [featureOptions?.compactTable]);\r\n\r\n const craftPaginationOptions: CraftTablePaginationProps = {\r\n showPagination: true,\r\n paginationPosition: \"bottom\",\r\n paginationView: \"full\",\r\n\r\n ...paginationOptions,\r\n };\r\n\r\n const totalRows = craftPaginationOptions?.totalRows ?? data.length;\r\n const rowsPerPageArray = craftPaginationOptions?.rowsPerPageArray ?? [\r\n 25, 50, 100, 150,\r\n ];\r\n const craftTopbarOptions: TopbarOptionsProps = {\r\n showColumnToggle: true,\r\n showCompactTableToggle: true,\r\n showChangeLayoutToggle: true,\r\n viewMoreToggle: true,\r\n showSearch: true,\r\n showSortingToggle: false,\r\n showFilterToggle: true,\r\n tableStates,\r\n\r\n // Add other conditions above topbarOptions\r\n ...topbarOptions,\r\n };\r\n\r\n const craftFeatureOptions: CraftTableFeatureProps = {\r\n enableTopbar: true,\r\n enableSorting: true,\r\n enableServerSidePagination: false,\r\n enableServerSideSorting: false,\r\n enableRowSelection: false,\r\n enableColumnResizing: true,\r\n enableColumnReordering: true,\r\n enableColumnPinning: true,\r\n enableMultiColumnSorting: true,\r\n compactTable: false,\r\n stickyHeader: true,\r\n enableWordBreakAll: false,\r\n striped: false,\r\n\r\n // Add other conditions above featureOptions\r\n ...featureOptions,\r\n };\r\n\r\n const {\r\n enableTopbar,\r\n enableRowSelection,\r\n enableServerSidePagination,\r\n enableServerSideSorting,\r\n enableSorting,\r\n enableColumnResizing,\r\n enableColumnReordering,\r\n enableColumnPinning,\r\n // enableMultiColumnSorting,\r\n } = craftFeatureOptions;\r\n\r\n const {\r\n sorting,\r\n setSorting,\r\n pagination,\r\n setPagination,\r\n rowSelection,\r\n setRowSelection,\r\n expanded,\r\n setExpanded,\r\n } = tableStates;\r\n\r\n const table = useReactTable({\r\n data,\r\n columns: metaColumns,\r\n state: {\r\n sorting,\r\n pagination,\r\n rowSelection,\r\n columnOrder,\r\n expanded,\r\n },\r\n\r\n getCoreRowModel: getCoreRowModel(),\r\n\r\n /** Sorting options start here */\r\n enableSorting: enableSorting,\r\n onSortingChange: setSorting,\r\n getSortedRowModel: getSortedRowModel(),\r\n manualSorting: enableServerSideSorting,\r\n // isMultiSortEvent: () => enableMultiColumnSorting || false,\r\n /** Sorting options end here */\r\n\r\n /** Pagination options start here */\r\n getPaginationRowModel: getPaginationRowModel(),\r\n onPaginationChange: setPagination,\r\n rowCount: totalRows,\r\n manualPagination: enableServerSidePagination,\r\n /** Pagination options end here */\r\n\r\n /** Row selection options start here */\r\n enableRowSelection: enableRowSelection,\r\n onRowSelectionChange: setRowSelection,\r\n /** Row selection options end here */\r\n\r\n /** Column Sizing options start here */\r\n enableColumnResizing: enableColumnResizing,\r\n columnResizeDirection: \"ltr\",\r\n columnResizeMode: \"onChange\",\r\n /** Column Sizing options end here */\r\n\r\n /** Column Ordering options start here */\r\n onColumnOrderChange: setColumnOrder,\r\n /** Column Ordering options end here */\r\n\r\n /** Column Pinning options end here */\r\n enableColumnPinning: enableColumnPinning,\r\n /** Column Pinning options end here */\r\n\r\n /** Row expanding options start here */\r\n getExpandedRowModel: getExpandedRowModel(),\r\n onExpandedChange: setExpanded,\r\n getSubRows: (row) => (row as { subRows?: T[] }).subRows ?? [],\r\n /** Row expanding options end here */\r\n });\r\n\r\n const { isLoading, loadingComponent, loaderText } = loadingOptions;\r\n const { isFullscreen } = useFullscreenPopoverContainer();\r\n\r\n const handleFullscreenToggle = () => {\r\n if (!document.fullscreenElement) {\r\n tableRef.current?.requestFullscreen().catch((err) => {\r\n console.error(\"Error attempting to enable fullscreen mode:\", err);\r\n });\r\n } else {\r\n document.exitFullscreen();\r\n }\r\n };\r\n\r\n // const tableWrapperProps = {\r\n // ...(styleOptions?.wrapperStyle && { style: styleOptions.wrapperStyle }),\r\n // className: \"ts__table__wrapper\",\r\n // };\r\n // const emptyListComponentCondition = () => {\r\n // if(isLoading) {}\r\n // }\r\n\r\n const showFilterCondition = filterOptions?.show;\r\n\r\n return (\r\n <div className=\"ts__table__container\">\r\n <div\r\n className={`ts__table__layout ${\r\n showFilterCondition ? \"has-filter\" : \"\"\r\n }`}\r\n >\r\n {/* Main Table Area */}\r\n <div\r\n className={`ts__table__main ${isFullscreen ? \"is-fullscreen\" : \"\"}`}\r\n ref={tableRef}\r\n >\r\n {enableTopbar && (\r\n <Topbar\r\n table={table}\r\n topbarOptions={craftTopbarOptions}\r\n isCompactTable={isCompactTable}\r\n setIsCompactTable={setIsCompactTable}\r\n isFullscreen={isFullscreen}\r\n fullscreenToggle={handleFullscreenToggle}\r\n paginationComponent={\r\n craftPaginationOptions?.showPagination === true &&\r\n craftPaginationOptions?.paginationPosition === \"top\" ? (\r\n <DefaultPagination\r\n table={table}\r\n rowsPerPageArray={rowsPerPageArray}\r\n paginationOptions={craftPaginationOptions}\r\n />\r\n ) : null\r\n }\r\n searchValue={craftTopbarOptions.searchValue}\r\n onSearchChange={craftTopbarOptions.onSearchChange}\r\n tableStates={tableStates}\r\n onFilterButtonClick={topbarOptions?.onFilterButtonClick}\r\n />\r\n )}\r\n\r\n {isLoading ? (\r\n loadingComponent ?? (\r\n <div className=\"ts__loader\">\r\n <LoaderAnimation />\r\n {loaderText && <p>{loaderText}</p>}\r\n </div>\r\n )\r\n ) : !isLoading && data.length === 0 && emptyListComponent ? (\r\n emptyListComponent\r\n ) : (\r\n <div\r\n // {...tableWrapperProps}\r\n className={`ts__table__wrapper ${\r\n isFullscreen ? \"is-fullscreen\" : \"\"\r\n }`}\r\n >\r\n {enableColumnReordering ? (\r\n <TableDND\r\n table={table}\r\n activeTab={activeTab}\r\n columnOrder={columnOrder}\r\n featureOptions={craftFeatureOptions}\r\n NestedComponent={nestedComponent}\r\n setColumnOrder={setColumnOrder}\r\n isCompactTable={isCompactTable}\r\n tableStates={tableStates}\r\n filterSettingStates={filterSettingStates}\r\n onSaveSettings={onSaveSettings}\r\n />\r\n ) : (\r\n <Table\r\n table={table}\r\n activeTab={activeTab}\r\n featureOptions={craftFeatureOptions}\r\n NestedComponent={nestedComponent}\r\n columnOrder={columnOrder}\r\n setColumnOrder={setColumnOrder}\r\n isCompactTable={isCompactTable}\r\n tableStates={tableStates}\r\n filterSettingStates={filterSettingStates}\r\n onSaveSettings={onSaveSettings}\r\n />\r\n )}\r\n </div>\r\n )}\r\n\r\n {craftPaginationOptions?.showPagination === true &&\r\n craftPaginationOptions?.paginationPosition === \"bottom\" ? (\r\n <DefaultPagination\r\n table={table}\r\n rowsPerPageArray={rowsPerPageArray}\r\n paginationOptions={craftPaginationOptions}\r\n />\r\n ) : null}\r\n </div>\r\n\r\n <div\r\n className={`ts__table__filter ${\r\n showFilterCondition ? \"show\" : \"\"\r\n }`.trim()}\r\n >\r\n {filterOptions?.component && filterOptions?.component}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default TableWrapper;\r\n","import {\r\n ColumnPinningState,\r\n ExpandedState,\r\n PaginationState,\r\n RowSelectionState,\r\n SortingState,\r\n} from \"@tanstack/react-table\";\r\nimport { useState } from \"react\";\r\nimport { CraftTableOptionsProps } from \"../../types/table-options\";\r\nimport {\r\n FilterDataMainFilterEntityListProps,\r\n FilterDataProps,\r\n FilterMasterStateProps,\r\n FilterOperationListProps,\r\n FilterStateProps,\r\n} from \"../../types/filter\";\r\n\r\nexport function useCraftTable(paginationPageSize: number = 25) {\r\n const [pagination, setPagination] = useState<PaginationState>({\r\n pageIndex: 0,\r\n pageSize: paginationPageSize,\r\n });\r\n const [sorting, setSorting] = useState<SortingState>([]);\r\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({});\r\n const [expanded, setExpanded] = useState<ExpandedState>({});\r\n const [wrapColumns, setWrapColumns] = useState<Record<string, boolean>>({\r\n all_wrap: true,\r\n });\r\n\r\n // Filters to be rendered in form\r\n const [filters, setFilters] = useState<FilterStateProps[]>([]);\r\n // Saved filter Component - savedFilterEditValue is set on list click\r\n const [savedFilterEditValue, setSavedFilterEditValue] = useState<\r\n string | number\r\n >(\"\");\r\n const [filterToDelete, setFilterToDelete] =\r\n useState<FilterOperationListProps | null>(null);\r\n const [filterSelectedAttributeValue, setFilterSelectedAttributeValue] =\r\n useState<string>(\"\");\r\n\r\n const [filterMaster, setFilterMaster] =\r\n useState<FilterMasterStateProps | null>(null);\r\n\r\n const [showTableFilter, setShowTableFilter] = useState<boolean>(false);\r\n\r\n //For filter criteria paper\r\n const [showFilterOptions, setShowFilterOption] = useState<boolean>(false);\r\n const [filterData, setFilterData] = useState<FilterDataProps | null>(null);\r\n const [selectedFilterEntity, setSelectedFilterEntity] =\r\n useState<FilterDataMainFilterEntityListProps>();\r\n\r\n if (pagination.pageIndex < 0 || pagination.pageSize <= 0) {\r\n throw new Error(\r\n \"Invalid pagination values: pageIndex and pageSize must be positive.\"\r\n );\r\n }\r\n\r\n // For Default Column Pinning\r\n const [columnPinning, setColumnPinning] = useState<ColumnPinningState>({\r\n left: [],\r\n right: [],\r\n });\r\n\r\n const craftTableOptions: CraftTableOptionsProps = {\r\n sorting: sorting,\r\n setSorting: setSorting,\r\n pagination: pagination,\r\n setPagination: setPagination,\r\n rowSelection: rowSelection,\r\n setRowSelection: setRowSelection,\r\n expanded: expanded,\r\n setExpanded: setExpanded,\r\n wrapColumns: wrapColumns,\r\n setWrapColumns: setWrapColumns,\r\n filters: filters,\r\n setFilters: setFilters,\r\n savedFilterEditValue: savedFilterEditValue,\r\n setSavedFilterEditValue: setSavedFilterEditValue,\r\n filterToDelete: filterToDelete,\r\n setFilterToDelete: setFilterToDelete,\r\n filterSelectedAttributeValue: filterSelectedAttributeValue,\r\n setFilterSelectedAttributeValue: setFilterSelectedAttributeValue,\r\n filterMaster: filterMaster,\r\n setFilterMaster: setFilterMaster,\r\n showTableFilter: showTableFilter,\r\n setShowTableFilter: setShowTableFilter,\r\n showFilterOptions: showFilterOptions,\r\n setShowFilterOption: setShowFilterOption,\r\n columnPinning: columnPinning,\r\n setColumnPinning: setColumnPinning,\r\n filterData: filterData,\r\n setFilterData: setFilterData,\r\n selectedFilterEntity: selectedFilterEntity,\r\n setSelectedFilterEntity: setSelectedFilterEntity,\r\n };\r\n\r\n return craftTableOptions;\r\n}\r\n","import { useEffect, useState } from \"react\";\r\nimport { craftTableFilterSettingsOptionsProps } from \"../../types/table-options\";\r\nimport {\r\n ColumnTabConfigProps,\r\n QuickTabConfigProps,\r\n SavedButtonErrorProps,\r\n SettingsDataProps,\r\n SortingConfigProps,\r\n} from \"../../types/filter-settings\";\r\n\r\nexport function useCraftTableFilterSettings() {\r\n //states for the quick filter layout\r\n const [showListViewSettings, setShowListViewSettings] =\r\n useState<boolean>(false);\r\n\r\n const [settingsData, setSettingsData] = useState<SettingsDataProps>({});\r\n\r\n // Quick FIlter settings local states\r\n\r\n const [quickTabStates, setQuickTabStates] = useState<QuickTabConfigProps>({});\r\n const [columnTabState, setColumnTabState] = useState<ColumnTabConfigProps>(\r\n {}\r\n );\r\n const [sortingTabState, setSortingTabState] = useState<SortingConfigProps>(\r\n {}\r\n );\r\n\r\n // This state will be used for settings validation\r\n const [saveButtonError, setSaveButtonError] = useState<SavedButtonErrorProps>(\r\n { hasError: false, messages: [] }\r\n );\r\n\r\n useEffect(() => {\r\n if (settingsData?.quick_tab) {\r\n setQuickTabStates(settingsData?.quick_tab);\r\n }\r\n if (settingsData?.column) {\r\n setColumnTabState(settingsData?.column);\r\n }\r\n if (settingsData?.sorting) {\r\n setSortingTabState(settingsData?.sorting);\r\n }\r\n }, [settingsData]);\r\n\r\n const craftTableFilterSettingsOptions: craftTableFilterSettingsOptionsProps =\r\n {\r\n settingsData: settingsData,\r\n setSettingsData: setSettingsData,\r\n showListViewSettings: showListViewSettings,\r\n setShowListViewSettings: setShowListViewSettings,\r\n quickTabStates: quickTabStates,\r\n setQuickTabStates: setQuickTabStates,\r\n columnTabState: columnTabState,\r\n setColumnTabState: setColumnTabState,\r\n sortingTabState: sortingTabState,\r\n setSortingTabState: setSortingTabState,\r\n saveButtonError: saveButtonError,\r\n setSaveButtonError: setSaveButtonError,\r\n };\r\n\r\n return craftTableFilterSettingsOptions;\r\n}\r\n"],"names":["styleInject","css","ref","insertAt","document","head","getElementsByTagName","style","createElement","type","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","UpArrow","_jsxs","xmlns","viewBox","width","height","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","children","_jsx","x1","y1","x2","y2","points","DownArrow","TableFirstPageIcon","role","d","TableLastPageIcon","EditIcon","fillOpacity","DeleteIcon","HideColumnIcon","DragHandleIcon","className","transform","IconPinOutline","props","IconPinOffOutline","LoaderAnimation","cx","cy","r","attributeName","dur","values","repeatCount","begin","ChangeLayoutIcon","id","maskType","maskUnits","x","y","mask","CloseIcon","SearchIcon","SortingIcon","FilterationIcon","color","HideIcon","VisibilityIcon","VisibilityOffIcon","DragandDrogIcon","AddIcon","CheckBox","CrossBox","EyeIcon","ClosedEyeIcon","layoutIcons","Board","Table","Timeline","List","Calendar","Gallery","Charts","LayoutSelector","onSelect","selectedLayout","Box","sx","maxWidth","display","justifyContent","alignItems","px","py","backgroundColor","Typography","variant","fontWeight","fontSize","IconButton","onClick","Grid","container","spacing","p","Object","keys","map","layout","isSelected","size","ButtonBase","border","borderRadius","flexDirection","transition","boxShadow","mb","opacity","useFullscreenPopoverContainer","isFullscreen","setIsFullscreen","useState","fullscreenElement","setContainer","undefined","useEffect","handleFullscreenChange","el","addEventListener","removeEventListener","ViewMore","compactMode","onCompactToggle","onFullscreenToggle","tableStates","onClose","fullscreenContainer","wrapColumns","setWrapColumns","MUISwitch","checked","all_wrap","onChange","prev","Select","value","e","target","minWidth","MenuProps","disablePortal","PaperProps","zIndex","MenuItem","SortableItem","attributes","listeners","setNodeRef","useSortable","CSS","Transform","toString","gap","cursor","flexGrow","SortPopover","anchorEl","columns","sorts","setSorts","sensors","useSensors","useSensor","MouseSensor","TouchSensor","KeyboardSensor","handleChange","field","updated","item","triggerTableSortUpdate","sortItems","sortingPayload","desc","direction","Popover","open","Boolean","anchorOrigin","vertical","horizontal","margin","length","DndContext","collisionDetection","closestCenter","onDragEnd","event","active","over","oldIndex","findIndex","newIndex","arrayMove","SortableContext","items","s","strategy","verticalListSortingStrategy","sort","fullWidth","col","label","filter","handleRemove","Button","newSort","Date","now","startIcon","DraggableColumn","column","onToggle","isVisible","getIsVisible","columnDef","header","str","replace","char","toUpperCase","trim","ColumnToggle","table","columnOrder","setColumnOrder","allColumns","getAllLeafColumns","shownColumns","find","hiddenColumns","toggleVisibility","columnId","getColumn","activeCol","overCol","indexOf","forEach","fontStyle","customDebounce","func","delay","timerId","args","context","this","clearTimeout","setTimeout","apply","searchStyles","showSearchInput","marginRight","paddingRight","paddingLeft","TableSearch","setShowSearchInput","localValue","setLocalValue","searchContainerRef","useRef","debouncedOnChange","useCallback","newValue","handler","handleClickOutside","current","contains","useOutsideClick","position","TextField","placeholder","onKeyDown","key","InputProps","startAdornment","InputAdornment","querySelector","focus","edge","endAdornment","CloseRoundedIcon","Topbar","isCompactTable","fullscreenToggle","setIsCompactTable","paginationComponent","topbarOptions","onFilterButtonClick","sortAnchorEl","setSortAnchorEl","groupBy","setGroupBy","layoutAnchorEl","setLayoutAnchorEl","setSelectedLayout","columnAnchorEl","setColumnAnchorEl","setViewMoreAnchorEl","leftSideComponent","rightSideComponent","showColumnToggle","showChangeLayoutToggle","showSortingToggle","showFilterToggle","showSearch","searchValue","onSearchChange","handleExternalLayoutTrigger","detail","handleExternalFilterTrigger","handleExternalViewMoreTrigger","handleExternalSearchTrigger","window","viewMoreAnchorEl","isViewMoreOpen","overflowX","whiteSpace","title","customEvent","CustomEvent","dispatchEvent","_Fragment","currentTarget","mt","meta","sortingRules","setSorting","showTableFilter","filters","top","right","transformOrigin","onGroupByChange","PaginationContainer","styled","theme","padding","typography","pxToRem","palette","common","white","breakpoints","down","GoToPageContainer","RowsPerPageContainer","RecordsRangeContainer","PageRangeContainer","PaginationButtons","PaginationButton","grey","action","disabled","RowsPerPageSelect","shape","GoToPageInput","InputBase","textAlign","divider","DefaultPagination","rowsPerPageArray","paginationOptions","pageIndex","getState","pagination","pageCount","getPageCount","pageSize","rowCount","getRowCount","recordsRangeFirst","recordsRangeLast","Math","min","isFullView","paginationView","mr","defaultValue","inputProps","name","max","page","Number","setPageIndex","setPageSize","getCanPreviousPage","previousPage","NavigateBeforeRounded","getCanNextPage","nextPage","NavigateNextRounded","getColumnPinningStyles","isPinned","getIsPinned","isLastLeftPinnedColumn","getIsLastColumn","isFirstRightPinnedColumn","getIsFirstColumn","background","left","getStart","getAfter","getSize","getColumnPinningStylesBody","environments","adm_dev","crm_dev","uat","axios","create","baseURL","timeout","headers","interceptors","request","use","config","token","localStorage","getItem","Authorization","error","Promise","reject","TableBodyRow","shouldForwardProp","prop","hoverable","selected","striped","paper","mode","hover","TableBodyCell","compact","isDragging","wrap","borderBottom","wordBreak","DragAlongCell","cell","align","Translate","getIsPlaceholder","flexRender","getContext","Checkbox","indeterminate","uuidv4","check","setCheck","React","isChecked","TableBody","featureOptions","NestedComponent","enableColumnReordering","enableRowSelection","getRowModel","rows","row","renderedRow","getIsSelected","expanded","getIsExpanded","getIsSomeSelected","getToggleSelectedHandler","getVisibleCells","horizontalListSortingStrategy","Fragment","renderRow","ColumnResizeHandle","isResizing","userSelect","touchAction","TableHeadButton","TableHeadSort","sortable","marginLeft","TableDndButton","TableHeadContent","TableHeadRoot","sticky","TableHeadRow","TableHeadCell","TableHeadPin","stopPropagation","pin","TableHeadPopover","onSaveSettings","dense","ListItemButton","toggleSorting","ListItemIcon","ListItemText","primary","handleUpdateSettings","Switch","toggleWrapForColumn","TableColumnResizeHandle","getIsResizing","onDoubleClick","resetSize","onMouseDown","getResizeHandler","onTouchStart","DraggableTableHeader","activeTab","enableColumnPinning","setAnchorEl","handleClose","onMouseLeave","colSpan","compactTable","minSize","maxSize","isPlaceholder","getCanSort","asc","getIsSorted","getCanResize","TableHead","filterSettingStates","stickyHeader","getHeaderGroups","headerGroup","getIsAllRowsSelected","getIsSomeRowsSelected","toggleAllRowsSelected","handleMenuToggle","TableDND","modifiers","restrictToHorizontalAxis","TableTabsRoot","Tabs","minHeight","tabsClasses","flexContainer","indicator","TableTab","Tab","maxHeight","textTransform","tabClasses","text","TableTabCount","lineHeight","ConfirmModal","description","buttons","input","inputValue","setInputValue","setError","Dialog","reason","DialogTitle","marginX","paddingBottom","component","DialogContent","marginBottom","marginTop","labelClassName","required","multiline","DialogActions","button","index","handleButtonClick","CustomTabPanel","hidden","CustomTabs","tabItems","activeFilterIndex","handleCrossClick","tabsProps","hoveredTab","setHoveredTab","tab","idx","isActive","isHovered","onMouseEnter","FormDropdown","control","setValue","dropdownList","isLoading","onValueChange","Controller","filter_attribute_name","filter_operator","render","FormControl","disableUnderline","newOperator","oldOperator","filter_attribute_data_type","moment","format","shouldDirty","filterStyles","scrollbarCustom","overflowY","pr","filterContainer","filterMainHeader","bgcolor","mx","filterMainComponentWrapper","filterFormStyles","formEditModeStyle","formFlexContainer","formListItem","formListSectionHeader","formListItemHeader","formListItemHeaderName","formListItemHeaderDropdown","CustomSearch","search","setSearch","val","borderColor","EmptyList","FilterCriteriaEntityList","filterComponentOptions","searchTerm","setSearchTerm","filterData","setSelectedFilterEntity","isSingleEntity","tabOptions","allEntities","mainFilter","entityList","data","entitiesToShow","useMemo","filterEntityTypes","f","filter_entity_type","entity","includes","toLowerCase","my","ListItem","handleSelectEntity","Loader","loaderText","paddingBlock","CircularProgress","FilterCriteriaList","handleAddFilter","selectedFilterEntity","shouldShowCloseButton","some","entityWiseCriteria","isPending","filteredEntities","isAlreadySelected","filter_attribute","attribute_key","FilterCriteria","columnsData","onChangeFunction","FilterButton","main","dark","setFilters","showFilterOptions","setShowFilterOption","filterMaster","filterButtonRef","filterButtonWidth","setWidth","resizeObserver","ResizeObserver","clientWidth","observe","disconnect","useElementWidth","isSingleFilter","disableButton","ClickAwayListener","onClickAway","Paper","saved_filters","selectedId","attribute","dropdownOptions","operation_list","element_type","defaultOperator","matchingDropdownList","newSelectedFilter","filter_value","datasource_list","dropdown_list","filter_entity_name","newFilterState","TextFieldStyles","FormTextfield","FormDatePicker","views","isRange","isRelativeToToday","isEmptyOperator","LocalizationProvider","dateAdapter","AdapterDateFns","toDate","todayDate","fromDate","Array","isArray","DatePicker","date","formatted","slotProps","textField","FormMultiSelect","dropdownData","isFlatJson","options","getOptionValue","cleanedValue","multiple","filtered","renderValue","match","join","optionValue","dateAllowedOperators","FilterForm","handleRemoveFilter","editMode","onSaveFilterButtonClick","setDeleteFilterModalOpen","setFilterMaster","setPagination","showSaveButton","showClearAllButton","customButtons","filterName","selectedName","isOwner","is_owner","defaultValues","filterValues","reduce","acc","curr","operator","dummyChange","watch","reset","unregister","useForm","resetOptions","keepDirtyValues","keepErrors","formValues","debouncedUpdateFilters","updatedFilters","updateFiltersFromForm","filterValue","groupedFilters","push","handleRemoveEntityType","entityType","remainingFilters","onSubmit","preventDefault","inputRef","entries","overflow","reverse","dummy","fieldValue","dataType","resolveFilterInput","activeFilterTabIndex","btn","MainFilter","mainBoxStyles","newFilters","SavedFilterEditComponent","setEditMode","showBackButton","savedFilter","selectedCode","shareWithTeam","allowTeamEdit","BackArrow","SavedFilter","tabValue","setFilterToDelete","myFilters","saved_filter","code","is_shared","created_by","is_editable","sharedFilters","shared_filter","prefs","sharedPreferences","preferences","shared_meta","editModeFromTab","applyFilterStates","newFilterMaster","radio","handleListItemClick","handleApplyFilter","openAccordion","setOpenAccordion","toggleAccodion","accordion","Accordion","disableGutters","elevation","AccordionSummary","expandIcon","ExpandMoreIcon","Divider","AccordionDetails","scrollbarWidth","source","visibility","renderSharedFilters","AttributesFilter","selectedAttribute","currentRadio","handleSingleRadioSelect","selectedAttr","matchingColumn","column_list","updatedRadio","newFilter","exists","updatedFilterMaster","selectedAttributeOptions","attributeKey","newFilterMasterState","displayEmpty","option","FormControlLabel","Radio","deepMergeObjects","output","SingleFilterRendering","showFilter","commonProps","editProps","attributesProps","SavedFilterModalView","onSave","disableShareFilter","forceShowSharingControls","setShareWithTeam","setAllowTeamEdit","filterNameValue","discriptionValue","isSaveDisabled","selectedFilterId","filterId","filterObj1","filterObj","initialShare","initialAllow","persistPreferences","sharedValue","editableValue","selectedFilter","selectedSavedFilter","String","showPrefields","showCheckboxes","isshow","getModalTitle","pt","minRows","_","nextAllow","gridTemplateColumns","created_date","toLocaleString","readOnly","CalendarTodayIcon","modified_date","modified_by","verticalTabStyles","mainTabsContainer","mainTabContainer","mainTabLabel","horizontalTabStyles","CustomVerticalTabs","orientation","DraggableListItem","containerId","DragIndicator","dialogStyles","dialogTitle","dialogContent","paddingTop","dialogActionsButton","listingValuesStyles","wrapper","heading","draggableContainer","draggableCover","headerContainer","TabsStyles","mainTabsHeader","mainTabDropdown","mainTabSelect","selectDropdownSeparator","checkboxStyle","ListingValuesContent","onItemToggle","flex","ListingValues","filteredValues","buttonText","headerText","tabsApiDataLoading","enableDragAndDrop","AlertComponenet","useDroppable","InfoAlert","message","Alert","severity","QuickTab","tabsApiData","columnTabAttributes","settingsData","setSettingsData","saveButtonError","setSaveButtonError","columnTabState","sortingTabState","currentQuickAttribute","setCurrentQuickAttribute","quick_tab","quickTabStates","mappedColumns","normalizeTabItem","sorting","normalizedTabs","hide_list","show_list","showList","isValidShowList","ERROR_CODE","messages","showListValues","hideListValues","i","constructHideList","filteredListValues","handleItemToggle","fromContainerId","toShowList","toHideList","updatedColumn","updatedSorting","splice","isDefault","tabs","t","tab_name","sortby","updatedTabs","updatedSortingTabs","enableDND","currentContainer","overContainer","newShowList","newHideList","removed","sortingExists","columnExists","a","b","sort_by","currentShowList","currentHideList","availableSlots","limitedHideList","slice","updatedQuickTab","isAllSelected","isCombineOther","selectedTabStyle","CustomToggleSwitchButton","ToggleButtonGroup","exclusive","ToggleButton","isDisabled","SETTINGS_TABS","KANBAN_SETTINGS_TABS","LANE_SELECTS","TOGGLE_BUTTON_TABS","ColumnTab","columnTabAttributesLoading","selectedTabIndex","setSelectedTabIndex","settingsColumnState","isColumnDefault","isStateEmpty","isDefaultEmpty","isTabWiseEmpty","mappedTabs","hasOtherMessages","hasError","hideList","currentTab","getCurrentLists","visible","moved","hasShowListQuickTabs","activeItem","list","Sorting","setActiveTab","isSortingDefault","emptySortBy","order","generatedTabs","PointerSensor","activeTabIndex","tabSortedList","updateSortList","handleDNDDropdownChange","showAddSortButton","stateLength","isAddSortDisabled","hasEmptyColumn","reordered","columnKey","CustomDialog","DialogTransition","forwardRef","Slide","CustomButton","customSx","Lane","sortingOptions","charAt","itemId","lane","opt","showSubLane","showColorColumns","GroupBy","kanbanStyles","syncingStyle","topHeader","laneHeader","badge","swimlaneWrapperStyle","columnStyle","stageStyle","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","subSectionAccordion","subSectionCountContainer","cardsContainer","settingStyle","swimLaneAccordionStyle","subSectionHeaderContainer","COLOR_CONSTANTS","darkColor","onDeleteFilter","onSaveFilter","onUpdateFilter","setTabValue","saveFilterModalOpen","setSaveFilterModalOpen","savedFilterModalOpen","setSavedFilterModalOpen","deleteFilterModalOpen","filterToDelete","finalComponentOptions","showMainHeader","mainHeaderTitle","showTabs","showMainFilter","showSavedFilter","showAttributesFilter","editModeFromTabOptions","tabMapping","filterNameInput","hasSavedFilterRecords","handleSaveFilterButtonClick","savedFilterProps","tabType","clearAttributeRadio","patches","isRuleEngine","recordFilterComponentProps","edit","save","secondary","isSingleSavedFilterEditMode","delete","hasSavedFilters","view","show","columnsDataLoading","quickTabAttributes","quickTabAttributesLoading","sortingTabAttributes","sortingTabAttributesLoading","onSaveSettingsData","showListViewSettings","hasAPIData","disbaledCondition","slots","Column","copyColumnTabState","copySortingTabState","loading","tabsData","count","settingsOptions","defaultTab","selectedTab","showIcon","SettingsOutlined","scrollButtons","padStart","metaData","KanbanCardComponent","showSettings","onOpenSettings","expandedPanels","setExpandedPanels","Active","subLaneExpanded","setSubLaneExpanded","swim_lanes","initial","swim_lane","sub_lanes","sub_lane","lane_id","getLeadCount","laneId","seenLeadIds","Set","swimLane","subLane","lead","stage_id","has","add","SettingsOutlinedIcon","lanes","panel","isExpanded","ArrowDropDownIcon","ml","lead_status_id","pl","sub_section","subLaneKey","toggleSubLane","subLaneId","borderLeft","stage_group_id","card","cardData","nestedComponent","loadingOptions","customRenderFn","shouldHideColumn","emptyListComponent","filterOptions","Error","metaColumns","setMetaColumns","updatedColumns","accessorKey","ctx","propName","customFn","getValue","where","defaultPinned","columnPinning","c","tableRef","craftPaginationOptions","showPagination","paginationPosition","totalRows","craftTopbarOptions","showCompactTableToggle","viewMoreToggle","craftFeatureOptions","enableTopbar","enableSorting","enableServerSidePagination","enableServerSideSorting","enableColumnResizing","enableMultiColumnSorting","enableWordBreakAll","rowSelection","setRowSelection","setExpanded","useReactTable","state","getCoreRowModel","onSortingChange","getSortedRowModel","manualSorting","getPaginationRowModel","onPaginationChange","manualPagination","onRowSelectionChange","columnResizeDirection","columnResizeMode","onColumnOrderChange","getExpandedRowModel","onExpandedChange","getSubRows","subRows","loadingComponent","showFilterCondition","exitFullscreen","requestFullscreen","catch","err","console","paginationPageSize","savedFilterEditValue","setSavedFilterEditValue","filterSelectedAttributeValue","setFilterSelectedAttributeValue","setShowTableFilter","setFilterData","setColumnPinning","setShowListViewSettings","setQuickTabStates","setColumnTabState","setSortingTabState"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../node_modules/style-inject/dist/style-inject.es.js","../src/assets/svg.tsx","../src/listing/components/table-change-layout.tsx","../src/listing/libs/hooks/useFullScreen.tsx","../src/listing/components/viewmore/index.tsx","../src/listing/components/sorting-modal.tsx/sorting-item.tsx","../src/listing/components/sorting-modal.tsx/index.tsx","../src/listing/components/column-visibility-modal/column-list-item.tsx","../src/listing/types/common.ts","../src/listing/components/column-visibility-modal/index.tsx","../src/listing/libs/utils/debounce.ts","../src/listing/components/search/style.ts","../src/listing/components/search/index.tsx","../src/listing/libs/hooks/useOutsideClick.tsx","../src/listing/components/topbar/index.tsx","../src/listing/components/pagination/default/pagination.styles.ts","../src/listing/components/pagination/default/index.tsx","../src/listing/libs/utils/common.ts","../src/listing/components/table-body/table-body.styles.ts","../src/listing/components/table-body/table-body-dnd-cell.tsx","../src/listing/components/inputs/checkbox/index.tsx","../src/listing/components/table-body/table-body.tsx","../src/listing/components/table-head/table-head.styles.ts","../src/listing/components/table-head/table-head-pin.tsx","../src/listing/components/table-head/table-head-popover.tsx","../src/listing/components/table-head/table-head-resizer.tsx","../src/listing/components/table-head/table-head-dnd-cell.tsx","../src/listing/components/table-head/table-head.tsx","../src/listing/components/table.tsx","../src/listing/components/table-dnd.tsx","../src/listing/components/tabs/tabs.styles.ts","../src/listing/components/common/confirm-modal/index.tsx","../src/listing/components/filter/components/tabs/custom-tab-panel.tsx","../src/listing/components/filter/components/tabs/index.tsx","../src/listing/components/filter/components/forms/components/Dropdown.tsx","../src/listing/components/filter/style.ts","../src/listing/components/filter/components/search/index.tsx","../src/listing/components/filter/components/forms/components/empty-list.tsx","../src/listing/components/filter/components/forms/components/filter-criteria-entity-list.tsx","../src/listing/components/common/loader/loader.tsx","../src/listing/components/filter/components/forms/components/filter-criteria-list.tsx","../src/listing/components/filter/components/forms/components/styles.tsx","../src/listing/components/filter/components/forms/components/Textfield.tsx","../src/listing/components/filter/components/forms/components/Date.tsx","../src/listing/components/filter/components/forms/components/Multi-Select.tsx","../src/listing/components/filter/components/forms/utils/filter-date-input-resolver.tsx","../src/listing/components/filter/components/forms/components/Filter-criteria.tsx","../src/listing/libs/hooks/useElementWidth.tsx","../src/listing/components/filter/components/forms/index.tsx","../src/listing/components/filter/components/main-filter.tsx","../src/listing/components/filter/components/saved-edit-filter.tsx","../src/listing/components/filter/components/saved-filter.tsx","../src/listing/components/filter/components/attributes-filter.tsx","../src/listing/libs/utils/deep-merge-objects.ts","../src/listing/components/filter/components/single-filter-rendering.tsx","../src/listing/components/common/saved-filter-modal/index.tsx","../src/listing/components/table-settings/tabs/styles.ts","../src/listing/components/table-settings/tabs/vertical/index.tsx","../src/listing/components/table-settings/tabs/vertical/custom-tab-panel.tsx","../src/listing/components/table-settings/common/draggable-listitem.tsx","../src/listing/components/table-settings/style.ts","../src/listing/components/table-settings/common/listing-values.tsx","../src/listing/components/table-settings/common/info-alert.tsx","../src/listing/components/table-settings/components/quick-tab.tsx","../src/listing/components/table-settings/components/toggle-button-switch.tsx","../src/listing/components/table-settings/constants.ts","../src/listing/components/table-settings/tabs/horizontal/index.tsx","../src/listing/components/table-settings/components/column.tsx","../src/listing/components/table-settings/components/sorting.tsx","../src/listing/components/table-settings/components/custom-dialog.tsx","../src/listing/components/table-settings/components/custom-button.tsx","../src/listing/components/table-settings/components/lane.tsx","../src/listing/components/table-settings/components/swim-lane.tsx","../src/kanban/styles/styles.tsx","../src/kanban/constants/kanban-constants.ts","../src/listing/components/filter/index.tsx","../src/listing/components/table-settings/index.tsx","../src/listing/components/tabs/index.tsx","../src/kanban/index.tsx","../src/listing/components/index-table.tsx","../src/listing/libs/hooks/useCraftTable.tsx","../src/listing/libs/hooks/useCraftTableFilterSettings.tsx"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import React from \"react\";\r\n\r\nexport const SortIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n strokeWidth={1.5}\r\n stroke=\"currentColor\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n d=\"M3 7.5L7.5 3m0 0L12 7.5M7.5 3v13.5m13.5 0L16.5 21m0 0L12 16.5m4.5 4.5V7.5\"\r\n />\r\n </svg>\r\n);\r\n\r\nexport const GreenDot = () => (\r\n <svg\r\n width=\"8\"\r\n height=\"8\"\r\n viewBox=\"0 0 8 8\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <circle cx=\"4\" cy=\"4\" r=\"4\" fill=\"#5CD961\" />\r\n </svg>\r\n);\r\n\r\nexport const RedDot = () => (\r\n <svg\r\n width=\"8\"\r\n height=\"8\"\r\n viewBox=\"0 0 8 8\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <circle cx=\"4\" cy=\"4\" r=\"4\" fill=\"#F94144\" />\r\n </svg>\r\n);\r\n\r\nexport const BlueDot = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"8\"\r\n height=\"8\"\r\n viewBox=\"0 0 8 8\"\r\n fill=\"none\"\r\n >\r\n <circle cx=\"4\" cy=\"4\" r=\"4\" fill=\"#04769A\" />\r\n </svg>\r\n);\r\n\r\nexport const UpArrow = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n width=\"14\"\r\n height=\"14\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line>\r\n <polyline points=\"19 12 12 5 5 12\"></polyline>\r\n </svg>\r\n);\r\n\r\nexport const DownArrow = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 24 24\"\r\n width=\"14\"\r\n height=\"14\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"5\"></line>\r\n <polyline points=\"5 12 12 19 19 12\"></polyline>\r\n </svg>\r\n);\r\n\r\nexport const TableFirstPageIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n aria-hidden=\"true\"\r\n role=\"presentation\"\r\n >\r\n <path d=\"M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z\"></path>\r\n <path fill=\"none\" d=\"M24 24H0V0h24v24z\"></path>\r\n </svg>\r\n);\r\n\r\nexport const TablePreviousPageIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n aria-hidden=\"true\"\r\n role=\"presentation\"\r\n >\r\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"></path>\r\n <path d=\"M0 0h24v24H0z\" fill=\"none\"></path>\r\n </svg>\r\n);\r\n\r\nexport const TableNextPageIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n aria-hidden=\"true\"\r\n role=\"presentation\"\r\n >\r\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"></path>\r\n <path d=\"M0 0h24v24H0z\" fill=\"none\"></path>\r\n </svg>\r\n);\r\n\r\nexport const TableLastPageIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n aria-hidden=\"true\"\r\n role=\"presentation\"\r\n >\r\n <path d=\"M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z\"></path>\r\n <path fill=\"none\" d=\"M0 0h24v24H0V0z\"></path>\r\n </svg>\r\n);\r\n\r\nexport const VerticalThreeDots = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"14\"\r\n height=\"14\"\r\n fill=\"currentColor\"\r\n className=\"bi bi-three-dots-vertical\"\r\n viewBox=\"0 0 16 16\"\r\n >\r\n <path d=\"M9.5 13a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0m0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0m0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0\" />\r\n </svg>\r\n);\r\n\r\nexport const ArrowDownUp = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"12\"\r\n height=\"12\"\r\n fill=\"currentColor\"\r\n className=\"bi bi-arrow-down-up\"\r\n viewBox=\"0 0 16 16\"\r\n >\r\n <path\r\n fillRule=\"evenodd\"\r\n d=\"M11.5 15a.5.5 0 0 0 .5-.5V2.707l3.146 3.147a.5.5 0 0 0 .708-.708l-4-4a.5.5 0 0 0-.708 0l-4 4a.5.5 0 1 0 .708.708L11 2.707V14.5a.5.5 0 0 0 .5.5m-7-14a.5.5 0 0 1 .5.5v11.793l3.146-3.147a.5.5 0 0 1 .708.708l-4 4a.5.5 0 0 1-.708 0l-4-4a.5.5 0 0 1 .708-.708L4 13.293V1.5a.5.5 0 0 1 .5-.5\"\r\n />\r\n </svg>\r\n);\r\nexport const EditIcon = () => (\r\n <svg\r\n width=\"18\"\r\n height=\"12\"\r\n viewBox=\"0 0 12 12\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M1.33331 10.6663H2.17431L8.99865 3.84201L8.15765 3.00101L1.33331 9.82534V10.6663ZM0.93598 11.6663C0.765202 11.6663 0.622091 11.6086 0.506646 11.493C0.391091 11.3776 0.333313 11.2345 0.333313 11.0637V9.90867C0.333313 9.74612 0.364535 9.59118 0.42698 9.44384C0.489313 9.29651 0.575202 9.16812 0.684646 9.05868L9.12698 0.620174C9.22776 0.528619 9.33904 0.457897 9.46081 0.408008C9.5827 0.358008 9.71048 0.333008 9.84415 0.333008C9.97781 0.333008 10.1073 0.35673 10.2325 0.404175C10.3578 0.451619 10.4688 0.527063 10.5653 0.630507L11.3795 1.45484C11.4829 1.5514 11.5566 1.66251 11.6006 1.78817C11.6446 1.91384 11.6666 2.03951 11.6666 2.16517C11.6666 2.29929 11.6438 2.42723 11.598 2.54901C11.5522 2.6709 11.4794 2.78223 11.3795 2.88301L2.94098 11.315C2.83154 11.4245 2.70315 11.5103 2.55581 11.5727C2.40848 11.6351 2.25354 11.6663 2.09098 11.6663H0.93598ZM8.57081 3.42884L8.15765 3.00101L8.99865 3.84201L8.57081 3.42884Z\"\r\n fill=\"#0E0C0B\"\r\n fillOpacity={0.4}\r\n />\r\n </svg>\r\n);\r\n\r\nexport const DeleteIcon = () => (\r\n <svg\r\n width=\"18\"\r\n height=\"20\"\r\n viewBox=\"0 0 10 12\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M1.87183 11.6665C1.54039 11.6665 1.25667 11.5485 1.02067 11.3125C0.784667 11.0765 0.666667 10.7928 0.666667 10.4613V1.99982H0.5C0.358333 1.99982 0.239611 1.95188 0.143833 1.85599C0.0479445 1.7601 0 1.64132 0 1.49966C0 1.35788 0.0479445 1.23916 0.143833 1.14349C0.239611 1.04771 0.358333 0.999823 0.5 0.999823H3C3 0.836601 3.0575 0.69749 3.1725 0.58249C3.28739 0.467601 3.42644 0.410156 3.58967 0.410156H6.41033C6.57356 0.410156 6.71261 0.467601 6.8275 0.58249C6.9425 0.69749 7 0.836601 7 0.999823H9.5C9.64167 0.999823 9.76039 1.04777 9.85617 1.14366C9.95206 1.23955 10 1.35832 10 1.49999C10 1.64177 9.95206 1.76049 9.85617 1.85616C9.76039 1.95193 9.64167 1.99982 9.5 1.99982H9.33333V10.4613C9.33333 10.7928 9.21533 11.0765 8.97933 11.3125C8.74333 11.5485 8.45961 11.6665 8.12817 11.6665H1.87183ZM8.33333 1.99982H1.66667V10.4613C1.66667 10.5212 1.68589 10.5704 1.72433 10.6088C1.76278 10.6473 1.81194 10.6665 1.87183 10.6665H8.12817C8.18806 10.6665 8.23722 10.6473 8.27567 10.6088C8.31411 10.5704 8.33333 10.5212 8.33333 10.4613V1.99982ZM3.7695 9.33316C3.91117 9.33316 4.02989 9.28527 4.12567 9.18949C4.22133 9.0936 4.26917 8.97482 4.26917 8.83316V3.83316C4.26917 3.69149 4.22122 3.57271 4.12533 3.47682C4.02956 3.38104 3.91078 3.33316 3.769 3.33316C3.62733 3.33316 3.50861 3.38104 3.41283 3.47682C3.31717 3.57271 3.26933 3.69149 3.26933 3.83316V8.83316C3.26933 8.97482 3.31722 9.0936 3.413 9.18949C3.50889 9.28527 3.62772 9.33316 3.7695 9.33316ZM6.231 9.33316C6.37267 9.33316 6.49139 9.28527 6.58717 9.18949C6.68283 9.0936 6.73067 8.97482 6.73067 8.83316V3.83316C6.73067 3.69149 6.68278 3.57271 6.587 3.47682C6.49111 3.38104 6.37228 3.33316 6.2305 3.33316C6.08883 3.33316 5.97011 3.38104 5.87433 3.47682C5.77867 3.57271 5.73083 3.69149 5.73083 3.83316V8.83316C5.73083 8.97482 5.77878 9.0936 5.87467 9.18949C5.97044 9.28527 6.08922 9.33316 6.231 9.33316Z\"\r\n fill=\"#F63D68\"\r\n />\r\n </svg>\r\n);\r\n\r\nexport const CrossSearchIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className=\"tabler-icon tabler-icon-search-off\"\r\n >\r\n <path d=\"M5.039 5.062a7 7 0 0 0 9.91 9.89m1.584 -2.434a7 7 0 0 0 -9.038 -9.057\"></path>\r\n <path d=\"M3 3l18 18\"></path>\r\n </svg>\r\n);\r\n\r\nexport const FilterIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\"\r\n height=\"20\"\r\n fill=\"currentColor\"\r\n className=\"bi bi-funnel\"\r\n viewBox=\"0 0 16 16\"\r\n >\r\n <path d=\"M1.5 1.5A.5.5 0 0 1 2 1h12a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.128.334L10 8.692V13.5a.5.5 0 0 1-.342.474l-3 1A.5.5 0 0 1 6 14.5V8.692L1.628 3.834A.5.5 0 0 1 1.5 3.5zm1 .5v1.308l4.372 4.858A.5.5 0 0 1 7 8.5v5.306l2-.666V8.5a.5.5 0 0 1 .128-.334L13.5 3.308V2z\" />\r\n </svg>\r\n);\r\n\r\nexport const HideColumnIcon = () => (\r\n <svg\r\n width=\"28\"\r\n height=\"28\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M15 3.5H3C2.175 3.5 1.5 4.175 1.5 5V14C1.5 14.825 2.175 15.5 3 15.5H15C15.825 15.5 16.5 14.825 16.5 14V5C16.5 4.175 15.825 3.5 15 3.5ZM6 14H3V5H6V14ZM10.5 14H7.5V5H10.5V14ZM15 14H12V5H15V14Z\"\r\n fill=\"currentColor\"\r\n stroke=\"white\"\r\n strokeWidth=\"0.5\"\r\n />\r\n </svg>\r\n);\r\n\r\nexport const PaddingMD = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className=\"tabler-icon tabler-icon-baseline-density-medium\"\r\n >\r\n <path d=\"M4 20h16\"></path>\r\n <path d=\"M4 12h16\"></path>\r\n <path d=\"M4 4h16\"></path>\r\n </svg>\r\n);\r\n\r\nexport const PaddingSM = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className=\"tabler-icon tabler-icon-baseline-density-small\"\r\n >\r\n <path d=\"M4 3h16\"></path>\r\n <path d=\"M4 9h16\"></path>\r\n <path d=\"M4 15h16\"></path>\r\n <path d=\"M4 21h16\"></path>\r\n </svg>\r\n);\r\n\r\nexport const PaddingLG = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className=\"tabler-icon tabler-icon-baseline-density-large\"\r\n >\r\n <path d=\"M4 4h16\"></path>\r\n <path d=\"M4 20h16\"></path>\r\n </svg>\r\n);\r\n\r\nexport const DragHandleIcon = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className=\"tabler-icon tabler-icon-grip-horizontal\"\r\n transform=\"rotate(90)\"\r\n >\r\n <path d=\"M10 9m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\"></path>\r\n <path d=\"M10 15m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\"></path>\r\n <path d=\"M18 9m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\"></path>\r\n <path d=\"M18 15m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\"></path>\r\n </svg>\r\n);\r\n\r\nexport const IconPinOutline = (props: React.SVGProps<SVGSVGElement>) => {\r\n return (\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"currentColor\"\r\n height=\"1rem\"\r\n width=\"1rem\"\r\n {...props}\r\n >\r\n <path d=\"M16 12V4h1V2H7v2h1v8l-2 2v2h5.2v6h1.6v-6H18v-2l-2-2m-7.2 2l1.2-1.2V4h4v8.8l1.2 1.2H8.8z\" />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const IconPinOffOutline = (props: React.SVGProps<SVGSVGElement>) => {\r\n return (\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"currentColor\"\r\n height=\"1rem\"\r\n width=\"1rem\"\r\n {...props}\r\n >\r\n <path d=\"M8 6.2V4H7V2h10v2h-1v8l2 2v2h-.2L14 12.2V4h-4v4.2l-2-2m12 14.5L18.7 22l-5.9-5.9V22h-1.6v-6H6v-2l2-2v-.7l-6-6L3.3 4 20 20.7M8.8 14h1.8l-.9-.9-.9.9z\" />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const IconExpand = (props: React.SVGProps<SVGSVGElement>) => {\r\n return (\r\n <svg\r\n viewBox=\"0 0 1024 1024\"\r\n fill=\"currentColor\"\r\n height=\"1rem\"\r\n width=\"1rem\"\r\n {...props}\r\n >\r\n <defs>\r\n <style />\r\n </defs>\r\n <path d=\"M342 88H120c-17.7 0-32 14.3-32 32v224c0 8.8 7.2 16 16 16h48c8.8 0 16-7.2 16-16V168h174c8.8 0 16-7.2 16-16v-48c0-8.8-7.2-16-16-16zm578 576h-48c-8.8 0-16 7.2-16 16v176H682c-8.8 0-16 7.2-16 16v48c0 8.8 7.2 16 16 16h222c17.7 0 32-14.3 32-32V680c0-8.8-7.2-16-16-16zM342 856H168V680c0-8.8-7.2-16-16-16h-48c-8.8 0-16 7.2-16 16v224c0 17.7 14.3 32 32 32h222c8.8 0 16-7.2 16-16v-48c0-8.8-7.2-16-16-16zM904 88H682c-8.8 0-16 7.2-16 16v48c0 8.8 7.2 16 16 16h174v176c0 8.8 7.2 16 16 16h48c8.8 0 16-7.2 16-16V120c0-17.7-14.3-32-32-32z\" />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const LoaderAnimation = () => {\r\n return (\r\n <svg viewBox=\"0 0 60 60\" width={\"4rem\"}>\r\n <circle fill=\"currentColor\" stroke=\"none\" cx=\"6\" cy=\"30\" r=\"5\">\r\n <animateTransform\r\n attributeName=\"transform\"\r\n dur=\"1s\"\r\n type=\"translate\"\r\n values=\"0 15 ; 0 -15; 0 15\"\r\n repeatCount=\"indefinite\"\r\n begin=\"0.1\"\r\n />\r\n </circle>\r\n <circle fill=\"currentColor\" stroke=\"none\" cx=\"24\" cy=\"30\" r=\"5\">\r\n <animateTransform\r\n attributeName=\"transform\"\r\n dur=\"1s\"\r\n type=\"translate\"\r\n values=\"0 10 ; 0 -10; 0 10\"\r\n repeatCount=\"indefinite\"\r\n begin=\"0.2\"\r\n />\r\n </circle>\r\n <circle fill=\"currentColor\" stroke=\"none\" cx=\"42\" cy=\"30\" r=\"5\">\r\n <animateTransform\r\n attributeName=\"transform\"\r\n dur=\"1s\"\r\n type=\"translate\"\r\n values=\"0 5 ; 0 -5; 0 5\"\r\n repeatCount=\"indefinite\"\r\n begin=\"0.3\"\r\n />\r\n </circle>\r\n </svg>\r\n );\r\n};\r\n\r\nexport const ChangeLayoutIcon = () => {\r\n return (\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <mask\r\n id=\"mask0_811_12587\"\r\n style={{ maskType: \"alpha\" }}\r\n maskUnits=\"userSpaceOnUse\"\r\n x=\"0\"\r\n y=\"0\"\r\n width=\"20\"\r\n height=\"20\"\r\n >\r\n <rect width=\"20\" height=\"20\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_811_12587)\">\r\n <path\r\n d=\"M4.42311 17.0834C4.00214 17.0834 3.64582 16.9375 3.35416 16.6459C3.06249 16.3542 2.91666 15.9979 2.91666 15.5769V4.42315C2.91666 4.00217 3.06249 3.64585 3.35416 3.35419C3.64582 3.06252 4.00214 2.91669 4.42311 2.91669H15.5769C15.9978 2.91669 16.3542 3.06252 16.6458 3.35419C16.9375 3.64585 17.0833 4.00217 17.0833 4.42315V15.5769C17.0833 15.9979 16.9375 16.3542 16.6458 16.6459C16.3542 16.9375 15.9978 17.0834 15.5769 17.0834H4.42311ZM4.42311 15.8334H9.37499V4.16669H4.42311C4.35895 4.16669 4.3002 4.19342 4.24687 4.24689C4.19339 4.30023 4.16666 4.35898 4.16666 4.42315V15.5769C4.16666 15.6411 4.19339 15.6998 4.24687 15.7531C4.3002 15.8066 4.35895 15.8334 4.42311 15.8334ZM10.625 15.8334H15.5769C15.641 15.8334 15.6998 15.8066 15.7531 15.7531C15.8066 15.6998 15.8333 15.6411 15.8333 15.5769V10H10.625V15.8334ZM10.625 8.75002H15.8333V4.42315C15.8333 4.35898 15.8066 4.30023 15.7531 4.24689C15.6998 4.19342 15.641 4.16669 15.5769 4.16669H10.625V8.75002Z\"\r\n fill=\"#1E1E1E\"\r\n />\r\n </g>\r\n </svg>\r\n );\r\n};\r\n\r\nexport const BoardIcon = () => {\r\n return (\r\n <svg\r\n width=\"13\"\r\n height=\"10\"\r\n viewBox=\"0 0 13 10\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M1.37179 9H4.05763V1H1.37179C1.3119 1 1.26274 1.01922 1.22429 1.05767C1.18585 1.09611 1.16663 1.14528 1.16663 1.20517V8.79483C1.16663 8.85472 1.18585 8.90389 1.22429 8.94233C1.26274 8.98078 1.3119 9 1.37179 9ZM5.05763 9H7.94229V1H5.05763V9ZM8.94229 9H11.6281C11.688 9 11.7372 8.98078 11.7756 8.94233C11.8141 8.90389 11.8333 8.85472 11.8333 8.79483V1.20517C11.8333 1.14528 11.8141 1.09611 11.7756 1.05767C11.7372 1.01922 11.688 1 11.6281 1H8.94229V9ZM1.37179 10C1.03501 10 0.749959 9.88333 0.516626 9.65C0.283293 9.41667 0.166626 9.13161 0.166626 8.79483V1.20517C0.166626 0.868389 0.283293 0.583333 0.516626 0.35C0.749959 0.116667 1.03501 0 1.37179 0H11.6281C11.9649 0 12.25 0.116667 12.4833 0.35C12.7166 0.583333 12.8333 0.868389 12.8333 1.20517V8.79483C12.8333 9.13161 12.7166 9.41667 12.4833 9.65C12.25 9.88333 11.9649 10 11.6281 10H1.37179Z\"\r\n fill=\"#A6A6A6\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const TableIcon = () => {\r\n return (\r\n <svg\r\n width=\"13\"\r\n height=\"12\"\r\n viewBox=\"0 0 13 12\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M3.17954 9.16671H5.82054C5.96243 9.16671 6.08121 9.11882 6.17687 9.02304C6.27265 8.92737 6.32054 8.8086 6.32054 8.66671C6.32054 8.52482 6.27265 8.40604 6.17687 8.31037C6.08121 8.2146 5.96243 8.16671 5.82054 8.16671H3.17954C3.03765 8.16671 2.91887 8.2146 2.82321 8.31037C2.72743 8.40604 2.67954 8.52482 2.67954 8.66671C2.67954 8.8086 2.72743 8.92737 2.82321 9.02304C2.91887 9.11882 3.03765 9.16671 3.17954 9.16671ZM5.17954 6.50004H7.82054C7.96243 6.50004 8.08121 6.45215 8.17687 6.35637C8.27265 6.26071 8.32054 6.14193 8.32054 6.00004C8.32054 5.85815 8.27265 5.73937 8.17687 5.64371C8.08121 5.54793 7.96243 5.50004 7.82054 5.50004H5.17954C5.03765 5.50004 4.91887 5.54793 4.82321 5.64371C4.72743 5.73937 4.67954 5.85815 4.67954 6.00004C4.67954 6.14193 4.72743 6.26071 4.82321 6.35637C4.91887 6.45215 5.03765 6.50004 5.17954 6.50004ZM7.17954 3.83337H9.82054C9.96243 3.83337 10.0812 3.78549 10.1769 3.68971C10.2727 3.59404 10.3205 3.47526 10.3205 3.33337C10.3205 3.19148 10.2727 3.07271 10.1769 2.97704C10.0812 2.88126 9.96243 2.83337 9.82054 2.83337H7.17954C7.03765 2.83337 6.91887 2.88126 6.82321 2.97704C6.72743 3.07271 6.67954 3.19148 6.67954 3.33337C6.67954 3.47526 6.72743 3.59404 6.82321 3.68971C6.91887 3.78549 7.03765 3.83337 7.17954 3.83337ZM2.03854 11.6667C1.70176 11.6667 1.41671 11.55 1.18337 11.3167C0.950041 11.0834 0.833374 10.7983 0.833374 10.4615V1.53854C0.833374 1.20176 0.950041 0.916707 1.18337 0.683374C1.41671 0.450041 1.70176 0.333374 2.03854 0.333374H10.9615C11.2983 0.333374 11.5834 0.450041 11.8167 0.683374C12.05 0.916707 12.1667 1.20176 12.1667 1.53854V10.4615C12.1667 10.7983 12.05 11.0834 11.8167 11.3167C11.5834 11.55 11.2983 11.6667 10.9615 11.6667H2.03854ZM2.03854 10.6667H10.9615C11.0129 10.6667 11.0599 10.6453 11.1025 10.6025C11.1453 10.5599 11.1667 10.5129 11.1667 10.4615V1.53854C11.1667 1.48721 11.1453 1.44021 11.1025 1.39754C11.0599 1.35476 11.0129 1.33337 10.9615 1.33337H2.03854C1.98721 1.33337 1.94021 1.35476 1.89754 1.39754C1.85476 1.44021 1.83337 1.48721 1.83337 1.53854V10.4615C1.83337 10.5129 1.85476 10.5599 1.89754 10.6025C1.94021 10.6453 1.98721 10.6667 2.03854 10.6667Z\"\r\n fill=\"#A6A6A6\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const TimeLineIcon = () => {\r\n return (\r\n <svg\r\n width=\"13\"\r\n height=\"12\"\r\n viewBox=\"0 0 13 12\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M3.17954 9.16671H5.82054C5.96243 9.16671 6.08121 9.11882 6.17687 9.02304C6.27265 8.92737 6.32054 8.8086 6.32054 8.66671C6.32054 8.52482 6.27265 8.40604 6.17687 8.31037C6.08121 8.2146 5.96243 8.16671 5.82054 8.16671H3.17954C3.03765 8.16671 2.91887 8.2146 2.82321 8.31037C2.72743 8.40604 2.67954 8.52482 2.67954 8.66671C2.67954 8.8086 2.72743 8.92737 2.82321 9.02304C2.91887 9.11882 3.03765 9.16671 3.17954 9.16671ZM5.17954 6.50004H7.82054C7.96243 6.50004 8.08121 6.45215 8.17687 6.35637C8.27265 6.26071 8.32054 6.14193 8.32054 6.00004C8.32054 5.85815 8.27265 5.73937 8.17687 5.64371C8.08121 5.54793 7.96243 5.50004 7.82054 5.50004H5.17954C5.03765 5.50004 4.91887 5.54793 4.82321 5.64371C4.72743 5.73937 4.67954 5.85815 4.67954 6.00004C4.67954 6.14193 4.72743 6.26071 4.82321 6.35637C4.91887 6.45215 5.03765 6.50004 5.17954 6.50004ZM7.17954 3.83337H9.82054C9.96243 3.83337 10.0812 3.78549 10.1769 3.68971C10.2727 3.59404 10.3205 3.47526 10.3205 3.33337C10.3205 3.19148 10.2727 3.07271 10.1769 2.97704C10.0812 2.88126 9.96243 2.83337 9.82054 2.83337H7.17954C7.03765 2.83337 6.91887 2.88126 6.82321 2.97704C6.72743 3.07271 6.67954 3.19148 6.67954 3.33337C6.67954 3.47526 6.72743 3.59404 6.82321 3.68971C6.91887 3.78549 7.03765 3.83337 7.17954 3.83337ZM2.03854 11.6667C1.70176 11.6667 1.41671 11.55 1.18337 11.3167C0.950041 11.0834 0.833374 10.7983 0.833374 10.4615V1.53854C0.833374 1.20176 0.950041 0.916707 1.18337 0.683374C1.41671 0.450041 1.70176 0.333374 2.03854 0.333374H10.9615C11.2983 0.333374 11.5834 0.450041 11.8167 0.683374C12.05 0.916707 12.1667 1.20176 12.1667 1.53854V10.4615C12.1667 10.7983 12.05 11.0834 11.8167 11.3167C11.5834 11.55 11.2983 11.6667 10.9615 11.6667H2.03854ZM2.03854 10.6667H10.9615C11.0129 10.6667 11.0599 10.6453 11.1025 10.6025C11.1453 10.5599 11.1667 10.5129 11.1667 10.4615V1.53854C11.1667 1.48721 11.1453 1.44021 11.1025 1.39754C11.0599 1.35476 11.0129 1.33337 10.9615 1.33337H2.03854C1.98721 1.33337 1.94021 1.35476 1.89754 1.39754C1.85476 1.44021 1.83337 1.48721 1.83337 1.53854V10.4615C1.83337 10.5129 1.85476 10.5599 1.89754 10.6025C1.94021 10.6453 1.98721 10.6667 2.03854 10.6667Z\"\r\n fill=\"#A6A6A6\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const ListIcon = () => {\r\n return (\r\n <svg\r\n width=\"13\"\r\n height=\"12\"\r\n viewBox=\"0 0 13 12\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M5.20521 10.5C5.06354 10.5 4.94476 10.452 4.84887 10.3562C4.7531 10.2603 4.70521 10.1415 4.70521 9.99982C4.70521 9.85805 4.7531 9.73932 4.84887 9.64366C4.94476 9.54788 5.06354 9.49999 5.20521 9.49999H11.6667C11.8084 9.49999 11.9271 9.54794 12.0229 9.64382C12.1188 9.73971 12.1667 9.85849 12.1667 10.0002C12.1667 10.1419 12.1188 10.2607 12.0229 10.3563C11.9271 10.4521 11.8084 10.5 11.6667 10.5H5.20521ZM5.20521 6.49999C5.06354 6.49999 4.94476 6.45205 4.84887 6.35616C4.7531 6.26027 4.70521 6.14149 4.70521 5.99982C4.70521 5.85805 4.7531 5.73932 4.84887 5.64366C4.94476 5.54788 5.06354 5.49999 5.20521 5.49999H11.6667C11.8084 5.49999 11.9271 5.54794 12.0229 5.64382C12.1188 5.73971 12.1667 5.85849 12.1667 6.00016C12.1667 6.14194 12.1188 6.26066 12.0229 6.35632C11.9271 6.4521 11.8084 6.49999 11.6667 6.49999H5.20521ZM5.20521 2.49999C5.06354 2.49999 4.94476 2.45205 4.84887 2.35616C4.7531 2.26027 4.70521 2.14149 4.70521 1.99982C4.70521 1.85805 4.7531 1.73932 4.84887 1.64366C4.94476 1.54788 5.06354 1.49999 5.20521 1.49999H11.6667C11.8084 1.49999 11.9271 1.54794 12.0229 1.64382C12.1188 1.73971 12.1667 1.85849 12.1667 2.00016C12.1667 2.14194 12.1188 2.26066 12.0229 2.35632C11.9271 2.4521 11.8084 2.49999 11.6667 2.49999H5.20521ZM1.94237 11.109C1.63737 11.109 1.37632 11.0004 1.15921 10.7832C0.941985 10.566 0.833374 10.305 0.833374 9.99999C0.833374 9.69499 0.941985 9.43394 1.15921 9.21682C1.37632 8.9996 1.63737 8.89099 1.94237 8.89099C2.24737 8.89099 2.50843 8.9996 2.72554 9.21682C2.94276 9.43394 3.05137 9.69499 3.05137 9.99999C3.05137 10.305 2.94276 10.566 2.72554 10.7832C2.50843 11.0004 2.24737 11.109 1.94237 11.109ZM1.94237 7.10899C1.63737 7.10899 1.37632 7.00038 1.15921 6.78316C0.941985 6.56605 0.833374 6.30499 0.833374 5.99999C0.833374 5.69499 0.941985 5.43394 1.15921 5.21682C1.37632 4.9996 1.63737 4.89099 1.94237 4.89099C2.24737 4.89099 2.50843 4.9996 2.72554 5.21682C2.94276 5.43394 3.05137 5.69499 3.05137 5.99999C3.05137 6.30499 2.94276 6.56605 2.72554 6.78316C2.50843 7.00038 2.24737 7.10899 1.94237 7.10899ZM1.94237 3.10899C1.63737 3.10899 1.37632 3.00038 1.15921 2.78316C0.941985 2.56605 0.833374 2.30499 0.833374 1.99999C0.833374 1.69499 0.941985 1.43394 1.15921 1.21682C1.37632 0.999602 1.63737 0.890991 1.94237 0.890991C2.24737 0.890991 2.50843 0.999602 2.72554 1.21682C2.94276 1.43394 3.05137 1.69499 3.05137 1.99999C3.05137 2.30499 2.94276 2.56605 2.72554 2.78316C2.50843 3.00038 2.24737 3.10899 1.94237 3.10899Z\"\r\n fill=\"#A6A6A6\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const CalendarIcon = () => {\r\n return (\r\n <svg\r\n width=\"13\"\r\n height=\"14\"\r\n viewBox=\"0 0 13 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M2.03854 13.3333C1.70176 13.3333 1.41671 13.2167 1.18337 12.9833C0.950041 12.75 0.833374 12.465 0.833374 12.1282V3.20518C0.833374 2.8684 0.950041 2.58334 1.18337 2.35001C1.41671 2.11668 1.70176 2.00001 2.03854 2.00001H2.96154V1.10251C2.96154 0.956399 3.01049 0.834399 3.10837 0.73651C3.20626 0.638732 3.32826 0.589844 3.47437 0.589844C3.6206 0.589844 3.7426 0.638732 3.84037 0.73651C3.93826 0.834399 3.98721 0.956399 3.98721 1.10251V2.00001H9.03854V1.08984C9.03854 0.947955 9.08637 0.829121 9.18204 0.733344C9.27782 0.637677 9.39665 0.589844 9.53854 0.589844C9.68043 0.589844 9.79921 0.637677 9.89487 0.733344C9.99065 0.829121 10.0385 0.947955 10.0385 1.08984V2.00001H10.9615C11.2983 2.00001 11.5834 2.11668 11.8167 2.35001C12.05 2.58334 12.1667 2.8684 12.1667 3.20518V12.1282C12.1667 12.465 12.05 12.75 11.8167 12.9833C11.5834 13.2167 11.2983 13.3333 10.9615 13.3333H2.03854ZM2.03854 12.3333H10.9615C11.0129 12.3333 11.0599 12.312 11.1025 12.2692C11.1453 12.2265 11.1667 12.1795 11.1667 12.1282V5.87184H1.83337V12.1282C1.83337 12.1795 1.85476 12.2265 1.89754 12.2692C1.94021 12.312 1.98721 12.3333 2.03854 12.3333ZM1.83337 4.87184H11.1667V3.20518C11.1667 3.15384 11.1453 3.10684 11.1025 3.06418C11.0599 3.0214 11.0129 3.00001 10.9615 3.00001H2.03854C1.98721 3.00001 1.94021 3.0214 1.89754 3.06418C1.85476 3.10684 1.83337 3.15384 1.83337 3.20518V4.87184ZM6.50004 8.38468C6.33682 8.38468 6.19771 8.32718 6.08271 8.21218C5.96782 8.09729 5.91037 7.95818 5.91037 7.79484C5.91037 7.63162 5.96782 7.49251 6.08271 7.37751C6.19771 7.26262 6.33682 7.20518 6.50004 7.20518C6.66326 7.20518 6.80237 7.26262 6.91737 7.37751C7.03226 7.49251 7.08971 7.63162 7.08971 7.79484C7.08971 7.95818 7.03226 8.09729 6.91737 8.21218C6.80237 8.32718 6.66326 8.38468 6.50004 8.38468ZM3.83337 8.38468C3.67015 8.38468 3.53104 8.32718 3.41604 8.21218C3.30115 8.09729 3.24371 7.95818 3.24371 7.79484C3.24371 7.63162 3.30115 7.49251 3.41604 7.37751C3.53104 7.26262 3.67015 7.20518 3.83337 7.20518C3.9966 7.20518 4.13571 7.26262 4.25071 7.37751C4.3656 7.49251 4.42304 7.63162 4.42304 7.79484C4.42304 7.95818 4.3656 8.09729 4.25071 8.21218C4.13571 8.32718 3.9966 8.38468 3.83337 8.38468ZM9.16671 8.38468C9.00348 8.38468 8.86437 8.32718 8.74937 8.21218C8.63449 8.09729 8.57704 7.95818 8.57704 7.79484C8.57704 7.63162 8.63449 7.49251 8.74937 7.37751C8.86437 7.26262 9.00348 7.20518 9.16671 7.20518C9.32993 7.20518 9.46904 7.26262 9.58404 7.37751C9.69893 7.49251 9.75637 7.63162 9.75637 7.79484C9.75637 7.95818 9.69893 8.09729 9.58404 8.21218C9.46904 8.32718 9.32993 8.38468 9.16671 8.38468ZM6.50004 11C6.33682 11 6.19771 10.9425 6.08271 10.8275C5.96782 10.7126 5.91037 10.5736 5.91037 10.4103C5.91037 10.247 5.96782 10.1079 6.08271 9.99301C6.19771 9.87801 6.33682 9.82051 6.50004 9.82051C6.66326 9.82051 6.80237 9.87801 6.91737 9.99301C7.03226 10.1079 7.08971 10.247 7.08971 10.4103C7.08971 10.5736 7.03226 10.7126 6.91737 10.8275C6.80237 10.9425 6.66326 11 6.50004 11ZM3.83337 11C3.67015 11 3.53104 10.9425 3.41604 10.8275C3.30115 10.7126 3.24371 10.5736 3.24371 10.4103C3.24371 10.247 3.30115 10.1079 3.41604 9.99301C3.53104 9.87801 3.67015 9.82051 3.83337 9.82051C3.9966 9.82051 4.13571 9.87801 4.25071 9.99301C4.3656 10.1079 4.42304 10.247 4.42304 10.4103C4.42304 10.5736 4.3656 10.7126 4.25071 10.8275C4.13571 10.9425 3.9966 11 3.83337 11ZM9.16671 11C9.00348 11 8.86437 10.9425 8.74937 10.8275C8.63449 10.7126 8.57704 10.5736 8.57704 10.4103C8.57704 10.247 8.63449 10.1079 8.74937 9.99301C8.86437 9.87801 9.00348 9.82051 9.16671 9.82051C9.32993 9.82051 9.46904 9.87801 9.58404 9.99301C9.69893 10.1079 9.75637 10.247 9.75637 10.4103C9.75637 10.5736 9.69893 10.7126 9.58404 10.8275C9.46904 10.9425 9.32993 11 9.16671 11Z\"\r\n fill=\"#A6A6A6\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const GalleryIcon = () => {\r\n return (\r\n <svg\r\n width=\"15\"\r\n height=\"10\"\r\n viewBox=\"0 0 15 10\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M1.87179 9.33329C1.54035 9.33329 1.25663 9.21529 1.02063 8.97929C0.784626 8.74329 0.666626 8.45957 0.666626 8.12813V1.87179C0.666626 1.54035 0.784626 1.25663 1.02063 1.02063C1.25663 0.784626 1.54035 0.666626 1.87179 0.666626H8.12813C8.45957 0.666626 8.74329 0.784626 8.97929 1.02063C9.21529 1.25663 9.33329 1.54035 9.33329 1.87179V8.12813C9.33329 8.45957 9.21529 8.74329 8.97929 8.97929C8.74329 9.21529 8.45957 9.33329 8.12813 9.33329H1.87179ZM11.2723 4.33329C11.0984 4.33329 10.954 4.27579 10.8391 4.16079C10.7241 4.0459 10.6666 3.90151 10.6666 3.72763V1.27246C10.6666 1.09846 10.7241 0.954014 10.8391 0.839126C10.954 0.724126 11.0984 0.666626 11.2723 0.666626H13.7275C13.9015 0.666626 14.0459 0.724126 14.1608 0.839126C14.2758 0.954014 14.3333 1.09846 14.3333 1.27246V3.72763C14.3333 3.90151 14.2758 4.0459 14.1608 4.16079C14.0459 4.27579 13.9015 4.33329 13.7275 4.33329H11.2723ZM11.6666 3.33329H13.3333V1.66663H11.6666V3.33329ZM1.87179 8.33329H8.12813C8.18802 8.33329 8.23718 8.31407 8.27563 8.27563C8.31407 8.23718 8.33329 8.18802 8.33329 8.12813V1.87179C8.33329 1.8119 8.31407 1.76274 8.27563 1.72429C8.23718 1.68585 8.18802 1.66663 8.12813 1.66663H1.87179C1.8119 1.66663 1.76274 1.68585 1.72429 1.72429C1.68585 1.76274 1.66663 1.8119 1.66663 1.87179V8.12813C1.66663 8.18802 1.68585 8.23718 1.72429 8.27563C1.76274 8.31407 1.8119 8.33329 1.87179 8.33329ZM2.99996 6.96796H6.99996C7.11829 6.96796 7.20707 6.91324 7.26629 6.80379C7.32552 6.69435 7.31707 6.58835 7.24096 6.48579L6.15763 5.03579C6.09529 4.95546 6.01496 4.91529 5.91663 4.91529C5.81829 4.91529 5.73796 4.95546 5.67563 5.03579L4.66663 6.38463L3.99096 5.48579C3.92863 5.40546 3.84829 5.36529 3.74996 5.36529C3.65163 5.36529 3.57129 5.40546 3.50896 5.48579L2.75896 6.48579C2.68285 6.58835 2.6744 6.69435 2.73363 6.80379C2.79285 6.91324 2.88163 6.96796 2.99996 6.96796ZM11.2723 9.33329C11.0984 9.33329 10.954 9.27579 10.8391 9.16079C10.7241 9.0459 10.6666 8.90146 10.6666 8.72746V6.27229C10.6666 6.0984 10.7241 5.95402 10.8391 5.83913C10.954 5.72413 11.0984 5.66663 11.2723 5.66663H13.7275C13.9015 5.66663 14.0459 5.72413 14.1608 5.83913C14.2758 5.95402 14.3333 6.0984 14.3333 6.27229V8.72746C14.3333 8.90146 14.2758 9.0459 14.1608 9.16079C14.0459 9.27579 13.9015 9.33329 13.7275 9.33329H11.2723ZM11.6666 8.33329H13.3333V6.66663H11.6666V8.33329Z\"\r\n fill=\"#A6A6A6\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const ChartsIcon = () => {\r\n return (\r\n <svg\r\n width=\"13\"\r\n height=\"14\"\r\n viewBox=\"0 0 13 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M7.14485 1.42317C7.14485 1.22028 7.22413 1.058 7.38268 0.936332C7.54124 0.814666 7.71879 0.777333 7.91535 0.824333C9.12135 1.07389 10.16 1.64056 11.0314 2.52433C11.9028 3.40811 12.4633 4.46328 12.7128 5.68983C12.753 5.86583 12.7148 6.02133 12.5985 6.15633C12.4822 6.29144 12.3228 6.359 12.1205 6.359H8.42435C8.38424 6.359 8.34907 6.34894 8.31885 6.32883C8.28874 6.30872 8.26363 6.27861 8.24352 6.2385C8.14352 6.01794 8.00863 5.82105 7.83885 5.64783C7.66896 5.47461 7.47779 5.34072 7.26535 5.24617C7.22524 5.22628 7.19513 5.20389 7.17502 5.179C7.1549 5.15411 7.14485 5.12178 7.14485 5.082V1.42317ZM8.14485 1.95133V4.60267C8.29274 4.70689 8.43079 4.82206 8.55902 4.94817C8.68724 5.07417 8.80135 5.21111 8.90135 5.359H11.5653C11.3158 4.54278 10.8874 3.831 10.2802 3.22367C9.67285 2.61644 8.96107 2.19233 8.14485 1.95133ZM5.10518 13.1692C3.6804 12.8462 2.5039 12.113 1.57568 10.9697C0.647461 9.82644 0.18335 8.50322 0.18335 7C0.18335 5.49367 0.647461 4.17028 1.57568 3.02983C2.5039 1.8895 3.6804 1.1565 5.10518 0.830832C5.30607 0.783832 5.48685 0.8265 5.64752 0.958833C5.80818 1.09117 5.88852 1.25917 5.88852 1.46283V5.108C5.88852 5.11867 5.85729 5.16128 5.79485 5.23583C5.43852 5.38294 5.15352 5.61672 4.93985 5.93717C4.72607 6.25772 4.61918 6.61244 4.61918 7.00133C4.61918 7.39022 4.72607 7.74 4.93985 8.05067C5.15352 8.36133 5.43852 8.58805 5.79485 8.73083C5.81285 8.73761 5.84407 8.77989 5.88852 8.85767V12.5577C5.88852 12.7643 5.80818 12.9297 5.64752 13.0537C5.48685 13.1777 5.30607 13.2162 5.10518 13.1692ZM4.88852 1.95133C3.78341 2.28033 2.88957 2.91194 2.20702 3.84617C1.52457 4.78039 1.18335 5.83167 1.18335 7C1.18335 8.16833 1.52457 9.21961 2.20702 10.1538C2.88957 11.0881 3.78341 11.7265 4.88852 12.0692V9.37183C4.50052 9.08805 4.19196 8.74122 3.96285 8.33133C3.73385 7.92156 3.61935 7.47672 3.61935 6.99683C3.61935 6.51694 3.73279 6.071 3.95968 5.659C4.18657 5.247 4.49618 4.89911 4.88852 4.61533V1.95133ZM7.89618 13.1757C7.69963 13.2183 7.52524 13.1806 7.37302 13.0625C7.2209 12.9443 7.14485 12.7867 7.14485 12.5897V8.90133C7.14485 8.86111 7.1549 8.82594 7.17502 8.79583C7.19513 8.76572 7.22524 8.74061 7.26535 8.7205C7.48335 8.62472 7.67707 8.49194 7.84652 8.32217C8.01596 8.15228 8.14829 7.96111 8.24352 7.74867C8.2504 7.735 8.30713 7.69483 8.41368 7.62817H12.1205C12.3022 7.62817 12.4536 7.70405 12.5747 7.85583C12.6958 8.0075 12.7363 8.17822 12.6962 8.368C12.4355 9.59444 11.8667 10.6417 10.9897 11.5097C10.1128 12.3776 9.08163 12.9329 7.89618 13.1757ZM8.90135 8.62817C8.79957 8.77172 8.68502 8.90656 8.55768 9.03267C8.43035 9.15878 8.29274 9.27183 8.14485 9.37183V12.0487C8.9654 11.8034 9.67824 11.3772 10.2833 10.7698C10.8885 10.1626 11.3158 9.44872 11.5653 8.62817H8.90135Z\"\r\n fill=\"#A6A6A6\"\r\n />\r\n </svg>\r\n );\r\n};\r\nexport const ViewMoreIcon = () => {\r\n return (\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <mask\r\n id=\"mask0_811_12719\"\r\n style={{ maskType: \"alpha\" }}\r\n maskUnits=\"userSpaceOnUse\"\r\n x=\"0\"\r\n y=\"0\"\r\n width=\"20\"\r\n height=\"20\"\r\n >\r\n <rect width=\"20\" height=\"20\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_811_12719)\">\r\n <path\r\n d=\"M4.99998 11.6666C4.54165 11.6666 4.14929 11.5035 3.8229 11.1771C3.49651 10.8507 3.33331 10.4583 3.33331 9.99998C3.33331 9.54165 3.49651 9.14929 3.8229 8.8229C4.14929 8.49651 4.54165 8.33331 4.99998 8.33331C5.45831 8.33331 5.85067 8.49651 6.17706 8.8229C6.50345 9.14929 6.66665 9.54165 6.66665 9.99998C6.66665 10.4583 6.50345 10.8507 6.17706 11.1771C5.85067 11.5035 5.45831 11.6666 4.99998 11.6666ZM9.99998 11.6666C9.54165 11.6666 9.14929 11.5035 8.8229 11.1771C8.49651 10.8507 8.33331 10.4583 8.33331 9.99998C8.33331 9.54165 8.49651 9.14929 8.8229 8.8229C9.14929 8.49651 9.54165 8.33331 9.99998 8.33331C10.4583 8.33331 10.8507 8.49651 11.1771 8.8229C11.5035 9.14929 11.6666 9.54165 11.6666 9.99998C11.6666 10.4583 11.5035 10.8507 11.1771 11.1771C10.8507 11.5035 10.4583 11.6666 9.99998 11.6666ZM15 11.6666C14.5416 11.6666 14.1493 11.5035 13.8229 11.1771C13.4965 10.8507 13.3333 10.4583 13.3333 9.99998C13.3333 9.54165 13.4965 9.14929 13.8229 8.8229C14.1493 8.49651 14.5416 8.33331 15 8.33331C15.4583 8.33331 15.8507 8.49651 16.1771 8.8229C16.5035 9.14929 16.6666 9.54165 16.6666 9.99998C16.6666 10.4583 16.5035 10.8507 16.1771 11.1771C15.8507 11.5035 15.4583 11.6666 15 11.6666Z\"\r\n fill=\"#1C1B1F\"\r\n />\r\n </g>\r\n </svg>\r\n );\r\n};\r\n\r\nexport const CloseIcon = () => {\r\n return (\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 14 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M11.0833 3.73919L10.2608 2.91669L6.99996 6.17752L3.73913 2.91669L2.91663 3.73919L6.17746 7.00002L2.91663 10.2609L3.73913 11.0834L6.99996 7.82252L10.2608 11.0834L11.0833 10.2609L7.82246 7.00002L11.0833 3.73919Z\"\r\n fill=\"#0C2033\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const SearchIcon = () => {\r\n return (\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <mask\r\n id=\"mask0_811_12583\"\r\n style={{ maskType: \"alpha\" }}\r\n maskUnits=\"userSpaceOnUse\"\r\n x=\"0\"\r\n y=\"0\"\r\n width=\"20\"\r\n height=\"20\"\r\n >\r\n <rect width=\"20\" height=\"20\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_811_12583)\">\r\n <path\r\n d=\"M7.93274 13.0127C6.50969 13.0127 5.30455 12.5192 4.31733 11.5321C3.33024 10.5449 2.8367 9.33971 2.8367 7.91666C2.8367 6.4936 3.33024 5.28847 4.31733 4.30124C5.30455 3.31416 6.50969 2.82062 7.93274 2.82062C9.3558 2.82062 10.5609 3.31416 11.5482 4.30124C12.5352 5.28847 13.0288 6.4936 13.0288 7.91666C13.0288 8.5118 12.9289 9.0802 12.7292 9.62187C12.5293 10.1635 12.2627 10.6346 11.9294 11.0352L16.7244 15.8302C16.8398 15.9455 16.8989 16.0905 16.9015 16.2652C16.9041 16.4399 16.8451 16.5876 16.7244 16.7083C16.6037 16.829 16.4573 16.8894 16.2852 16.8894C16.1133 16.8894 15.967 16.829 15.8463 16.7083L11.0513 11.9133C10.6346 12.2574 10.1554 12.5266 9.61378 12.721C9.07212 12.9155 8.51177 13.0127 7.93274 13.0127ZM7.93274 11.7629C9.00649 11.7629 9.91594 11.3903 10.6611 10.645C11.4064 9.89985 11.779 8.99041 11.779 7.91666C11.779 6.84291 11.4064 5.93346 10.6611 5.18833C9.91594 4.44305 9.00649 4.07041 7.93274 4.07041C6.85899 4.07041 5.94955 4.44305 5.20441 5.18833C4.45913 5.93346 4.08649 6.84291 4.08649 7.91666C4.08649 8.99041 4.45913 9.89985 5.20441 10.645C5.94955 11.3903 6.85899 11.7629 7.93274 11.7629Z\"\r\n fill=\"#1E1E1E\"\r\n />\r\n </g>\r\n </svg>\r\n );\r\n};\r\n\r\nexport const SortingIcon = () => {\r\n return (\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <mask\r\n id=\"mask0_811_12710\"\r\n style={{ maskType: \"alpha\" }}\r\n maskUnits=\"userSpaceOnUse\"\r\n x=\"0\"\r\n y=\"0\"\r\n width=\"20\"\r\n height=\"20\"\r\n >\r\n <rect width=\"20\" height=\"20\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_811_12710)\">\r\n <path\r\n d=\"M7.63605 10.5369C7.45883 10.5369 7.31036 10.477 7.19064 10.3571C7.07105 10.2374 7.01126 10.089 7.01126 9.9119V4.4696L5.08022 6.40065C4.96744 6.51606 4.82654 6.57377 4.65751 6.57377C4.48848 6.57377 4.33932 6.51398 4.21001 6.3944C4.0807 6.26398 4.01605 6.11488 4.01605 5.94711C4.01605 5.77947 4.0807 5.63099 4.21001 5.50169L7.10105 2.61065C7.17897 2.53259 7.26154 2.47759 7.34876 2.44565C7.43612 2.41356 7.52966 2.39752 7.62939 2.39752C7.72911 2.39752 7.82383 2.41363 7.91355 2.44586C8.00327 2.47822 8.08661 2.53315 8.16355 2.61065L11.0754 5.52252C11.1993 5.64641 11.2604 5.79009 11.2588 5.95356C11.2572 6.11704 11.1918 6.26398 11.0625 6.3944C10.9332 6.51398 10.7868 6.57592 10.6233 6.58023C10.4599 6.5844 10.3136 6.5219 10.1844 6.39273L8.26126 4.4696V9.91981C8.26126 10.0947 8.20133 10.2412 8.08147 10.3594C7.96161 10.4777 7.81314 10.5369 7.63605 10.5369ZM12.3706 17.5946C12.2709 17.5946 12.1762 17.5784 12.0865 17.5461C11.9967 17.5138 11.9134 17.459 11.8365 17.3815L8.92459 14.4696C8.8007 14.3456 8.73959 14.2019 8.74126 14.0386C8.74279 13.8751 8.8082 13.7281 8.93751 13.5977C9.06682 13.4781 9.2132 13.4162 9.37668 13.4119C9.54015 13.4076 9.68647 13.4701 9.81564 13.5994L11.7388 15.5225V10.0721C11.7388 9.89738 11.7987 9.75085 11.9186 9.63252C12.0384 9.51433 12.1869 9.45523 12.364 9.45523C12.5412 9.45523 12.6897 9.51509 12.8094 9.63481C12.929 9.75467 12.9888 9.90315 12.9888 10.0802V15.5225L14.9198 13.5913C15.0326 13.476 15.1735 13.4184 15.3425 13.4184C15.5115 13.4184 15.6607 13.4781 15.79 13.5977C15.9193 13.7281 15.984 13.8772 15.984 14.0448C15.984 14.2126 15.9193 14.3611 15.79 14.4904L12.899 17.3815C12.8211 17.4594 12.7385 17.5144 12.6513 17.5465C12.5639 17.5786 12.4704 17.5946 12.3706 17.5946Z\"\r\n fill=\"#1C1B1F\"\r\n />\r\n </g>\r\n </svg>\r\n );\r\n};\r\n\r\nexport const FilterationIcon = ({ color = \"#1C1B1F\", ...props }) => {\r\n return (\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <mask\r\n id=\"mask0_811_12698\"\r\n style={{ maskType: \"alpha\" }}\r\n maskUnits=\"userSpaceOnUse\"\r\n x=\"0\"\r\n y=\"0\"\r\n width=\"20\"\r\n height=\"20\"\r\n >\r\n <rect width=\"20\" height=\"20\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_811_12698)\">\r\n <path\r\n d=\"M8.33333 15V13.3333H11.6667V15H8.33333ZM5 10.8333V9.16667H15V10.8333H5ZM2.5 6.66667V5H17.5V6.66667H2.5Z\"\r\n fill={color}\r\n {...props}\r\n />\r\n </g>\r\n </svg>\r\n );\r\n};\r\n\r\nexport const HideIcon = () => {\r\n return (\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <mask\r\n id=\"mask0_957_24305\"\r\n style={{ maskType: \"alpha\" }}\r\n maskUnits=\"userSpaceOnUse\"\r\n x=\"0\"\r\n y=\"0\"\r\n width=\"16\"\r\n height=\"16\"\r\n >\r\n <rect width=\"16\" height=\"16\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_957_24305)\">\r\n <path\r\n d=\"M9.91805 5.74863C10.1889 6.01963 10.3983 6.34891 10.5462 6.73647C10.6941 7.12413 10.75 7.51325 10.714 7.9038C10.714 8.03202 10.6679 8.14058 10.5757 8.22947C10.4834 8.31836 10.3731 8.3628 10.2449 8.3628C10.1167 8.3628 10.0081 8.31836 9.91922 8.22947C9.83033 8.14058 9.78588 8.03202 9.78588 7.9038C9.82866 7.61069 9.80455 7.33291 9.71355 7.07047C9.62255 6.80813 9.4826 6.58252 9.29372 6.39363C9.10483 6.20475 8.87705 6.06136 8.61038 5.96347C8.34372 5.86558 8.06249 5.84013 7.76672 5.88713C7.63849 5.89147 7.52783 5.84852 7.43472 5.7583C7.34149 5.66819 7.29277 5.55902 7.28855 5.4308C7.28422 5.30258 7.32544 5.19186 7.41222 5.09863C7.49899 5.00552 7.60649 4.95686 7.73472 4.95263C8.12272 4.90819 8.51266 4.9588 8.90455 5.10447C9.29644 5.25025 9.63427 5.46497 9.91805 5.74863ZM8.00005 3.99997C7.76327 3.99997 7.53099 4.01152 7.30322 4.03463C7.07544 4.05763 6.84872 4.09563 6.62305 4.14863C6.48116 4.17774 6.35338 4.15747 6.23972 4.0878C6.12605 4.01813 6.04788 3.91791 6.00522 3.78713C5.96244 3.65213 5.97655 3.52375 6.04755 3.40197C6.11844 3.28019 6.22138 3.20474 6.35638 3.17563C6.62483 3.11152 6.89599 3.06625 7.16988 3.0398C7.44388 3.01325 7.7206 2.99997 8.00005 2.99997C9.43249 2.99997 10.7483 3.37219 11.9475 4.11663C13.1467 4.86108 14.0688 5.86836 14.714 7.13847C14.7585 7.22302 14.7908 7.30825 14.8109 7.39413C14.831 7.48002 14.841 7.57086 14.841 7.66663C14.841 7.76241 14.8327 7.85325 14.816 7.93913C14.7994 8.02502 14.7688 8.11024 14.7244 8.1948C14.5202 8.62213 14.2719 9.02063 13.9796 9.3903C13.6872 9.75997 13.3654 10.0995 13.0141 10.409C12.9107 10.5013 12.7926 10.5395 12.6597 10.5236C12.5267 10.5079 12.4175 10.4414 12.332 10.3243C12.2466 10.2072 12.2112 10.0816 12.2257 9.94747C12.2403 9.81325 12.2992 9.69997 12.4026 9.60763C12.7034 9.33497 12.9778 9.03691 13.2257 8.71347C13.4736 8.38991 13.6873 8.04097 13.8667 7.66663C13.3112 6.54441 12.5084 5.65275 11.4584 4.99163C10.4084 4.33052 9.2556 3.99997 8.00005 3.99997ZM8.00005 12.3333C6.5966 12.3333 5.31027 11.9583 4.14105 11.2083C2.97183 10.4583 2.04238 9.47047 1.35272 8.2448C1.29716 8.16025 1.25655 8.06836 1.23088 7.96913C1.20522 7.87002 1.19238 7.76919 1.19238 7.66663C1.19238 7.56408 1.20349 7.46491 1.22572 7.36913C1.24794 7.27347 1.28683 7.17991 1.34238 7.08847C1.59027 6.63547 1.87105 6.20402 2.18472 5.79413C2.49838 5.38436 2.85905 5.01708 3.26672 4.6923L1.76155 3.1768C1.66933 3.07769 1.62383 2.95997 1.62505 2.82363C1.62638 2.6873 1.67533 2.57086 1.77188 2.4743C1.86844 2.37775 1.98555 2.32947 2.12322 2.32947C2.26077 2.32947 2.37783 2.37775 2.47438 2.4743L13.5257 13.5256C13.618 13.618 13.667 13.7322 13.6725 13.8685C13.6781 14.0048 13.6292 14.1247 13.5257 14.2281C13.4292 14.3247 13.312 14.373 13.1744 14.373C13.0368 14.373 12.9198 14.3247 12.8232 14.2281L10.477 11.9025C10.0838 12.0546 9.67972 12.1644 9.26472 12.232C8.84983 12.2995 8.42827 12.3333 8.00005 12.3333ZM3.96938 5.3948C3.57872 5.69658 3.22761 6.0378 2.91605 6.41847C2.60449 6.79924 2.3436 7.2153 2.13338 7.66663C2.68894 8.78886 3.49172 9.68052 4.54172 10.3416C5.59172 11.0027 6.74449 11.3333 8.00005 11.3333C8.28638 11.3333 8.56822 11.3141 8.84555 11.2756C9.12288 11.2372 9.39833 11.1778 9.67188 11.0975L8.82822 10.2333C8.69322 10.2923 8.55838 10.3322 8.42372 10.3531C8.28916 10.3741 8.14794 10.3846 8.00005 10.3846C7.2436 10.3846 6.60149 10.1207 6.07372 9.59297C5.54594 9.06519 5.28205 8.42308 5.28205 7.66663C5.28205 7.51874 5.2936 7.37752 5.31672 7.24297C5.33983 7.1083 5.37872 6.97347 5.43338 6.83847L3.96938 5.3948Z\"\r\n fill=\"#1C1B1F\"\r\n />\r\n </g>\r\n </svg>\r\n );\r\n};\r\n\r\nexport const PinIcon = () => {\r\n return (\r\n <svg\r\n width=\"8\"\r\n height=\"13\"\r\n viewBox=\"0 0 8 13\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M6.33337 1.33337V6.14104L7.37686 7.18471C7.42642 7.23426 7.46364 7.29004 7.48853 7.35204C7.51331 7.41393 7.5257 7.47793 7.5257 7.54404V7.82904C7.5257 7.96949 7.47714 8.08865 7.38003 8.18654C7.28303 8.28443 7.16275 8.33337 7.0192 8.33337H4.50003V11.9257C4.50003 12.0674 4.45209 12.1861 4.3562 12.2819C4.26031 12.3777 4.14153 12.4255 3.99987 12.4255C3.85809 12.4255 3.73937 12.3777 3.6437 12.2819C3.54792 12.1861 3.50003 12.0674 3.50003 11.9257V8.33337H0.980865C0.83731 8.33337 0.717032 8.28443 0.620032 8.18654C0.522921 8.08865 0.474365 7.96949 0.474365 7.82904V7.54404C0.474365 7.47793 0.486754 7.41393 0.511532 7.35204C0.536421 7.29004 0.573643 7.23426 0.623199 7.18471L1.6667 6.14104V1.33337H1.50003C1.35837 1.33337 1.23964 1.28543 1.14387 1.18954C1.04798 1.09365 1.00003 0.974874 1.00003 0.833207C1.00003 0.691429 1.04798 0.572707 1.14387 0.477041C1.23964 0.381263 1.35837 0.333374 1.50003 0.333374H6.50003C6.6417 0.333374 6.76042 0.381319 6.8562 0.477207C6.95209 0.573096 7.00003 0.691874 7.00003 0.833541C7.00003 0.975319 6.95209 1.09404 6.8562 1.18971C6.76042 1.28549 6.6417 1.33337 6.50003 1.33337H6.33337ZM1.90003 7.33337H6.10003L5.33336 6.56671V1.33337H2.6667V6.56671L1.90003 7.33337Z\"\r\n fill=\"#1C1B1F\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const VisibilityIcon = () => {\r\n return (\r\n <svg\r\n width=\"14\"\r\n height=\"10\"\r\n viewBox=\"0 0 14 10\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M7.00147 7.38467C7.75692 7.38467 8.39853 7.12028 8.92631 6.5915C9.45408 6.06272 9.71797 5.42061 9.71797 4.66517C9.71797 3.90972 9.45358 3.26811 8.9248 2.74033C8.39603 2.21256 7.75392 1.94867 6.99847 1.94867C6.24303 1.94867 5.60142 2.21306 5.07364 2.74183C4.54586 3.27061 4.28197 3.91272 4.28197 4.66817C4.28197 5.42361 4.54636 6.06522 5.07514 6.593C5.60392 7.12078 6.24603 7.38467 7.00147 7.38467ZM6.99997 6.46667C6.49997 6.46667 6.07497 6.29167 5.72497 5.94167C5.37497 5.59167 5.19997 5.16667 5.19997 4.66667C5.19997 4.16667 5.37497 3.74167 5.72497 3.39167C6.07497 3.04167 6.49997 2.86667 6.99997 2.86667C7.49997 2.86667 7.92497 3.04167 8.27497 3.39167C8.62497 3.74167 8.79997 4.16667 8.79997 4.66667C8.79997 5.16667 8.62497 5.59167 8.27497 5.94167C7.92497 6.29167 7.49997 6.46667 6.99997 6.46667ZM6.99997 9.33333C5.59653 9.33333 4.31297 8.95894 3.1493 8.21017C1.98564 7.4615 1.0568 6.4765 0.362803 5.25517C0.307248 5.15939 0.266637 5.06289 0.24097 4.96567C0.215414 4.86844 0.202637 4.76867 0.202637 4.66633C0.202637 4.564 0.215414 4.46433 0.24097 4.36733C0.266637 4.27033 0.307248 4.17394 0.362803 4.07817C1.0568 2.85683 1.98564 1.87183 3.1493 1.12317C4.31297 0.374389 5.59653 0 6.99997 0C8.40342 0 9.68697 0.374389 10.8506 1.12317C12.0143 1.87183 12.9431 2.85683 13.6371 4.07817C13.6927 4.17394 13.7333 4.27044 13.759 4.36767C13.7845 4.46489 13.7973 4.56467 13.7973 4.667C13.7973 4.76933 13.7845 4.869 13.759 4.966C13.7333 5.063 13.6927 5.15939 13.6371 5.25517C12.9431 6.4765 12.0143 7.4615 10.8506 8.21017C9.68697 8.95894 8.40342 9.33333 6.99997 9.33333ZM6.99997 8.33333C8.25553 8.33333 9.4083 8.00278 10.4583 7.34167C11.5083 6.68055 12.3111 5.78889 12.8666 4.66667C12.3111 3.54444 11.5083 2.65278 10.4583 1.99167C9.4083 1.33056 8.25553 1 6.99997 1C5.74442 1 4.59164 1.33056 3.54164 1.99167C2.49164 2.65278 1.68886 3.54444 1.1333 4.66667C1.68886 5.78889 2.49164 6.68055 3.54164 7.34167C4.59164 8.00278 5.74442 8.33333 6.99997 8.33333Z\"\r\n fill=\"#505050\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const VisibilityOffIcon = () => {\r\n return (\r\n <svg\r\n width=\"14\"\r\n height=\"13\"\r\n viewBox=\"0 0 14 13\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M8.91793 3.74863C9.18882 4.01963 9.39821 4.34891 9.54609 4.73647C9.69398 5.12413 9.74993 5.51325 9.71393 5.9038C9.71393 6.03202 9.66782 6.14058 9.57559 6.22947C9.48326 6.31836 9.37298 6.3628 9.24476 6.3628C9.11654 6.3628 9.00798 6.31836 8.9191 6.22947C8.83021 6.14058 8.78576 6.03202 8.78576 5.9038C8.82854 5.61069 8.80443 5.33291 8.71343 5.07047C8.62243 4.80813 8.48248 4.58252 8.29359 4.39363C8.1047 4.20475 7.87693 4.06136 7.61026 3.96347C7.34359 3.86558 7.06237 3.84013 6.76659 3.88713C6.63837 3.89147 6.52771 3.84852 6.43459 3.7583C6.34137 3.66819 6.29265 3.55902 6.28843 3.4308C6.28409 3.30258 6.32532 3.19186 6.41209 3.09863C6.49887 3.00552 6.60637 2.95686 6.73459 2.95263C7.12259 2.90819 7.51254 2.9588 7.90443 3.10447C8.29632 3.25025 8.63415 3.46497 8.91793 3.74863ZM6.99993 1.99997C6.76315 1.99997 6.53087 2.01152 6.30309 2.03463C6.07532 2.05763 5.84859 2.09563 5.62293 2.14863C5.48104 2.17774 5.35326 2.15747 5.23959 2.0878C5.12593 2.01813 5.04776 1.91791 5.00509 1.78713C4.96232 1.65213 4.97643 1.52375 5.04743 1.40197C5.11832 1.28019 5.22126 1.20474 5.35626 1.17563C5.62471 1.11152 5.89587 1.06625 6.16976 1.0398C6.44376 1.01325 6.72048 0.999967 6.99993 0.999967C8.43237 0.999967 9.74821 1.37219 10.9474 2.11663C12.1465 2.86108 13.0687 3.86836 13.7139 5.13847C13.7584 5.22302 13.7907 5.30825 13.8108 5.39413C13.8309 5.48002 13.8409 5.57086 13.8409 5.66663C13.8409 5.76241 13.8326 5.85325 13.8159 5.93913C13.7993 6.02502 13.7687 6.11024 13.7243 6.1948C13.52 6.62213 13.2718 7.02063 12.9794 7.3903C12.6871 7.75997 12.3653 8.09952 12.0139 8.40897C11.9106 8.5013 11.7925 8.53952 11.6596 8.52363C11.5266 8.50786 11.4174 8.44141 11.3319 8.3243C11.2465 8.20719 11.211 8.08158 11.2256 7.94747C11.2402 7.81325 11.2991 7.69997 11.4024 7.60763C11.7033 7.33497 11.9777 7.03691 12.2256 6.71347C12.4735 6.38991 12.6872 6.04097 12.8666 5.66663C12.311 4.54441 11.5083 3.65275 10.4583 2.99163C9.40826 2.33052 8.25548 1.99997 6.99993 1.99997ZM6.99993 10.3333C5.59648 10.3333 4.31015 9.9583 3.14093 9.2083C1.97171 8.4583 1.04226 7.47047 0.352594 6.2448C0.297039 6.16025 0.256427 6.06836 0.230761 5.96913C0.205094 5.87002 0.192261 5.76919 0.192261 5.66663C0.192261 5.56408 0.203372 5.46491 0.225594 5.36913C0.247816 5.27347 0.286705 5.17991 0.342261 5.08847C0.59015 4.63547 0.870927 4.20402 1.18459 3.79413C1.49826 3.38436 1.85893 3.01708 2.26659 2.6923L0.761427 1.1768C0.669205 1.07769 0.623705 0.959967 0.624927 0.823634C0.626261 0.6873 0.675205 0.570857 0.771761 0.474301C0.868316 0.377746 0.985427 0.329468 1.12309 0.329468C1.26065 0.329468 1.37771 0.377746 1.47426 0.474301L12.5256 11.5256C12.6179 11.618 12.6669 11.7322 12.6724 11.8685C12.678 12.0048 12.629 12.1247 12.5256 12.2281C12.429 12.3247 12.3119 12.373 12.1743 12.373C12.0367 12.373 11.9197 12.3247 11.8231 12.2281L9.47693 9.90247C9.08371 10.0546 8.67959 10.1644 8.2646 10.232C7.84971 10.2995 7.42815 10.3333 6.99993 10.3333ZM2.96926 3.3948C2.57859 3.69658 2.22748 4.0378 1.91593 4.41847C1.60437 4.79924 1.34348 5.2153 1.13326 5.66663C1.68882 6.78886 2.49159 7.68052 3.54159 8.34163C4.59159 9.00274 5.74437 9.3333 6.99993 9.3333C7.28626 9.3333 7.56809 9.31408 7.84543 9.27563C8.12276 9.23719 8.3982 9.1778 8.67176 9.09747L7.82809 8.2333C7.69309 8.2923 7.55826 8.33224 7.42359 8.35313C7.28904 8.37413 7.14782 8.38463 6.99993 8.38463C6.24348 8.38463 5.60137 8.12074 5.07359 7.59297C4.54582 7.06519 4.28193 6.42308 4.28193 5.66663C4.28193 5.51874 4.29348 5.37752 4.31659 5.24297C4.33971 5.1083 4.37859 4.97347 4.43326 4.83847L2.96926 3.3948Z\"\r\n fill=\"#C5C5C5\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const DragandDrogIcon = () => {\r\n return (\r\n <svg\r\n width=\"8\"\r\n height=\"12\"\r\n viewBox=\"0 0 8 12\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M2.00005 11.0768C1.70394 11.0768 1.45044 10.9714 1.23955 10.7605C1.02866 10.5496 0.923218 10.2961 0.923218 9.99999C0.923218 9.70388 1.02866 9.45038 1.23955 9.23949C1.45044 9.0286 1.70394 8.92316 2.00005 8.92316C2.29616 8.92316 2.54966 9.0286 2.76055 9.23949C2.97144 9.45038 3.07688 9.70388 3.07688 9.99999C3.07688 10.2961 2.97144 10.5496 2.76055 10.7605C2.54966 10.9714 2.29616 11.0768 2.00005 11.0768ZM6.00005 11.0768C5.70394 11.0768 5.45044 10.9714 5.23955 10.7605C5.02866 10.5496 4.92322 10.2961 4.92322 9.99999C4.92322 9.70388 5.02866 9.45038 5.23955 9.23949C5.45044 9.0286 5.70394 8.92316 6.00005 8.92316C6.29616 8.92316 6.54966 9.0286 6.76055 9.23949C6.97144 9.45038 7.07688 9.70388 7.07688 9.99999C7.07688 10.2961 6.97144 10.5496 6.76055 10.7605C6.54966 10.9714 6.29616 11.0768 6.00005 11.0768ZM2.00005 7.07682C1.70394 7.07682 1.45044 6.97138 1.23955 6.76049C1.02866 6.5496 0.923218 6.2961 0.923218 5.99999C0.923218 5.70388 1.02866 5.45038 1.23955 5.23949C1.45044 5.0286 1.70394 4.92316 2.00005 4.92316C2.29616 4.92316 2.54966 5.0286 2.76055 5.23949C2.97144 5.45038 3.07688 5.70388 3.07688 5.99999C3.07688 6.2961 2.97144 6.5496 2.76055 6.76049C2.54966 6.97138 2.29616 7.07682 2.00005 7.07682ZM6.00005 7.07682C5.70394 7.07682 5.45044 6.97138 5.23955 6.76049C5.02866 6.5496 4.92322 6.2961 4.92322 5.99999C4.92322 5.70388 5.02866 5.45038 5.23955 5.23949C5.45044 5.0286 5.70394 4.92316 6.00005 4.92316C6.29616 4.92316 6.54966 5.0286 6.76055 5.23949C6.97144 5.45038 7.07688 5.70388 7.07688 5.99999C7.07688 6.2961 6.97144 6.5496 6.76055 6.76049C6.54966 6.97138 6.29616 7.07682 6.00005 7.07682ZM2.00005 3.07682C1.70394 3.07682 1.45044 2.97138 1.23955 2.76049C1.02866 2.5496 0.923218 2.2961 0.923218 1.99999C0.923218 1.70388 1.02866 1.45038 1.23955 1.23949C1.45044 1.0286 1.70394 0.923157 2.00005 0.923157C2.29616 0.923157 2.54966 1.0286 2.76055 1.23949C2.97144 1.45038 3.07688 1.70388 3.07688 1.99999C3.07688 2.2961 2.97144 2.5496 2.76055 2.76049C2.54966 2.97138 2.29616 3.07682 2.00005 3.07682ZM6.00005 3.07682C5.70394 3.07682 5.45044 2.97138 5.23955 2.76049C5.02866 2.5496 4.92322 2.2961 4.92322 1.99999C4.92322 1.70388 5.02866 1.45038 5.23955 1.23949C5.45044 1.0286 5.70394 0.923157 6.00005 0.923157C6.29616 0.923157 6.54966 1.0286 6.76055 1.23949C6.97144 1.45038 7.07688 1.70388 7.07688 1.99999C7.07688 2.2961 6.97144 2.5496 6.76055 2.76049C6.54966 2.97138 6.29616 3.07682 6.00005 3.07682Z\"\r\n fill=\"#A6A6A6\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\n// export const SettingIcon = () => {\r\n// return (\r\n// <svg\r\n// width=\"18\"\r\n// height=\"17\"\r\n// viewBox=\"0 0 18 17\"\r\n// fill=\"none\"\r\n// xmlns=\"http://www.w3.org/2000/svg\"\r\n// >\r\n// <path\r\n// d=\"M15.1935 9.31669C15.2269 9.05002 15.2519 8.78335 15.2519 8.50002C15.2519 8.21669 15.2269 7.95002 15.1935 7.68335L16.9519 6.30835C17.1102 6.18335 17.1518 5.95835 17.0518 5.77502L15.3852 2.89169C15.3102 2.75835 15.1685 2.68335 15.0185 2.68335C14.9685 2.68335 14.9185 2.69169 14.8768 2.70835L12.8018 3.54169C12.3685 3.20835 11.9018 2.93335 11.3935 2.72502L11.0768 0.516687C11.0518 0.316687 10.8769 0.166687 10.6685 0.166687H7.33518C7.12685 0.166687 6.95185 0.316687 6.92685 0.516687L6.61018 2.72502C6.10185 2.93335 5.63518 3.21669 5.20185 3.54169L3.12685 2.70835C3.07685 2.69169 3.02685 2.68335 2.97685 2.68335C2.83518 2.68335 2.69352 2.75835 2.61852 2.89169L0.95185 5.77502C0.843516 5.95835 0.893517 6.18335 1.05185 6.30835L2.81018 7.68335C2.77685 7.95002 2.75185 8.22502 2.75185 8.50002C2.75185 8.77502 2.77685 9.05002 2.81018 9.31669L1.05185 10.6917C0.893517 10.8167 0.85185 11.0417 0.95185 11.225L2.61852 14.1084C2.69352 14.2417 2.83518 14.3167 2.98518 14.3167C3.03518 14.3167 3.08518 14.3084 3.12685 14.2917L5.20185 13.4584C5.63518 13.7917 6.10185 14.0667 6.61018 14.275L6.92685 16.4834C6.95185 16.6834 7.12685 16.8334 7.33518 16.8334H10.6685C10.8769 16.8334 11.0518 16.6834 11.0768 16.4834L11.3935 14.275C11.9018 14.0667 12.3685 13.7834 12.8018 13.4584L14.8768 14.2917C14.9268 14.3084 14.9768 14.3167 15.0268 14.3167C15.1685 14.3167 15.3102 14.2417 15.3852 14.1084L17.0518 11.225C17.1518 11.0417 17.1102 10.8167 16.9519 10.6917L15.1935 9.31669ZM13.5435 7.89169C13.5769 8.15002 13.5852 8.32502 13.5852 8.50002C13.5852 8.67502 13.5685 8.85835 13.5435 9.10835L13.4268 10.05L14.1685 10.6334L15.0685 11.3334L14.4852 12.3417L13.4268 11.9167L12.5602 11.5667L11.8102 12.1334C11.4518 12.4 11.1102 12.6 10.7685 12.7417L9.88518 13.1L9.75185 14.0417L9.58518 15.1667H8.41852L8.12685 13.1L7.24352 12.7417C6.88518 12.5917 6.55185 12.4 6.21852 12.15L5.46018 11.5667L4.57685 11.925L3.51852 12.35L2.93518 11.3417L3.83518 10.6417L4.57685 10.0584L4.46018 9.11669C4.43518 8.85835 4.41852 8.66669 4.41852 8.50002C4.41852 8.33335 4.43518 8.14169 4.46018 7.89169L4.57685 6.95002L3.83518 6.36669L2.93518 5.66669L3.51852 4.65835L4.57685 5.08335L5.44352 5.43335L6.19352 4.86669C6.55185 4.60002 6.89352 4.40002 7.23518 4.25835L8.11852 3.90002L8.25185 2.95835L8.41852 1.83335H9.57685L9.86852 3.90002L10.7519 4.25835C11.1102 4.40835 11.4435 4.60002 11.7768 4.85002L12.5352 5.43335L13.4185 5.07502L14.4768 4.65002L15.0602 5.65835L14.1685 6.36669L13.4268 6.95002L13.5435 7.89169ZM9.00185 5.16669C7.16018 5.16669 5.66852 6.65835 5.66852 8.50002C5.66852 10.3417 7.16018 11.8334 9.00185 11.8334C10.8435 11.8334 12.3352 10.3417 12.3352 8.50002C12.3352 6.65835 10.8435 5.16669 9.00185 5.16669ZM9.00185 10.1667C8.08518 10.1667 7.33518 9.41669 7.33518 8.50002C7.33518 7.58335 8.08518 6.83335 9.00185 6.83335C9.91852 6.83335 10.6685 7.58335 10.6685 8.50002C10.6685 9.41669 9.91852 10.1667 9.00185 10.1667Z\"\r\n// fill=\"#1E1E1E\"\r\n// />\r\n// </svg>\r\n// );\r\n// };\r\n\r\nexport const DropDownIcon = () => {\r\n return (\r\n <svg\r\n width=\"10\"\r\n height=\"7\"\r\n viewBox=\"0 0 10 7\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M8.825 0.412476L5 4.22914L1.175 0.412476L0 1.58748L5 6.58748L10 1.58748L8.825 0.412476Z\"\r\n fill=\"#1E1E1E\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const AddIcon = ({ ...props }) => {\r\n return (\r\n <svg\r\n width=\"10\"\r\n height=\"10\"\r\n viewBox=\"0 0 10 10\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n {...props}\r\n >\r\n <path\r\n d=\"M4.50002 5.50002H1.16669C1.02502 5.50002 0.906298 5.45208 0.81052 5.35619C0.714632 5.2603 0.666687 5.14152 0.666687 4.99985C0.666687 4.85808 0.714632 4.73935 0.81052 4.64369C0.906298 4.54791 1.02502 4.50002 1.16669 4.50002H4.50002V1.16669C4.50002 1.02502 4.54797 0.906298 4.64385 0.81052C4.73974 0.714632 4.85852 0.666687 5.00019 0.666687C5.14197 0.666687 5.26069 0.714632 5.35635 0.81052C5.45213 0.906298 5.50002 1.02502 5.50002 1.16669V4.50002H8.83335C8.97502 4.50002 9.09374 4.54797 9.18952 4.64385C9.28541 4.73974 9.33335 4.85852 9.33335 5.00019C9.33335 5.14197 9.28541 5.26069 9.18952 5.35635C9.09374 5.45213 8.97502 5.50002 8.83335 5.50002H5.50002V8.83335C5.50002 8.97502 5.45208 9.09374 5.35619 9.18952C5.2603 9.28541 5.14152 9.33335 4.99985 9.33335C4.85808 9.33335 4.73935 9.28541 4.64369 9.18952C4.54791 9.09374 4.50002 8.97502 4.50002 8.83335V5.50002Z\"\r\n fill=\"currentColor\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const ChevronDownIcon = () => {\r\n return (\r\n <svg\r\n width=\"12\"\r\n height=\"6\"\r\n viewBox=\"0 0 12 6\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M1 0.5L6 5.5L11 0.5\"\r\n stroke=\"#181D27\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n};\r\nexport const CheckBox = () => {\r\n return (\r\n <svg\r\n width=\"13\"\r\n height=\"14\"\r\n viewBox=\"0 0 13 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M5.72054 8.43116L4.17187 6.88233C4.07954 6.7901 3.96349 6.74288 3.82371 6.74066C3.68404 6.73855 3.56587 6.78577 3.46921 6.88233C3.37265 6.97899 3.32437 7.0961 3.32437 7.23366C3.32437 7.37121 3.37265 7.48833 3.46921 7.58499L5.29871 9.41449C5.41926 9.53494 5.55987 9.59516 5.72054 9.59516C5.88121 9.59516 6.02182 9.53494 6.14237 9.41449L9.85137 5.70549C9.9436 5.61316 9.99082 5.4971 9.99304 5.35733C9.99515 5.21766 9.94793 5.09949 9.85137 5.00283C9.75471 4.90627 9.6376 4.85799 9.50004 4.85799C9.36249 4.85799 9.24537 4.90627 9.14871 5.00283L5.72054 8.43116ZM6.66787 13.3337C5.79187 13.3337 4.96848 13.1674 4.19771 12.835C3.42693 12.5025 2.75648 12.0514 2.18637 11.4815C1.61626 10.9116 1.16487 10.2414 0.832207 9.47099C0.499652 8.70055 0.333374 7.87738 0.333374 7.00149C0.333374 6.12549 0.499596 5.3021 0.832041 4.53133C1.16449 3.76055 1.61565 3.0901 2.18554 2.51999C2.75543 1.94988 3.4256 1.49849 4.19604 1.16583C4.96649 0.83327 5.78965 0.666992 6.66554 0.666992C7.54154 0.666992 8.36493 0.833214 9.13571 1.16566C9.90649 1.4981 10.5769 1.94927 11.147 2.51916C11.7172 3.08905 12.1685 3.75921 12.5012 4.52966C12.8338 5.3001 13 6.12327 13 6.99916C13 7.87516 12.8338 8.69855 12.5014 9.46933C12.1689 10.2401 11.7178 10.9105 11.1479 11.4807C10.578 12.0508 9.90782 12.5022 9.13737 12.8348C8.36693 13.1674 7.54376 13.3337 6.66787 13.3337Z\"\r\n fill=\"#16B364\"\r\n />\r\n </svg>\r\n );\r\n};\r\nexport const CrossBox = () => {\r\n return (\r\n <svg\r\n width=\"13\"\r\n height=\"14\"\r\n viewBox=\"0 0 13 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M6.66659 7.70283L8.71525 9.75166C8.80759 9.84388 8.92364 9.8911 9.06342 9.89333C9.20309 9.89544 9.32125 9.84821 9.41792 9.75166C9.51447 9.65499 9.56275 9.53788 9.56275 9.40033C9.56275 9.26277 9.51447 9.14566 9.41792 9.04899L7.36909 7.00033L9.41792 4.95166C9.51014 4.85933 9.55736 4.74327 9.55959 4.60349C9.5617 4.46383 9.51447 4.34566 9.41792 4.24899C9.32125 4.15244 9.20414 4.10416 9.06659 4.10416C8.92903 4.10416 8.81192 4.15244 8.71525 4.24899L6.66659 6.29783L4.61792 4.24899C4.52559 4.15677 4.40953 4.10955 4.26975 4.10733C4.13009 4.10521 4.01192 4.15244 3.91525 4.24899C3.8187 4.34566 3.77042 4.46277 3.77042 4.60033C3.77042 4.73788 3.8187 4.85499 3.91525 4.95166L5.96409 7.00033L3.91525 9.04899C3.82303 9.14133 3.77581 9.25738 3.77359 9.39716C3.77147 9.53683 3.8187 9.65499 3.91525 9.75166C4.01192 9.84821 4.12903 9.89649 4.26659 9.89649C4.40414 9.89649 4.52125 9.84821 4.61792 9.75166L6.66659 7.70283ZM6.66775 13.3337C5.79175 13.3337 4.96836 13.1674 4.19759 12.835C3.42681 12.5025 2.75636 12.0514 2.18625 11.4815C1.61614 10.9116 1.16475 10.2414 0.832085 9.47099C0.49953 8.70055 0.333252 7.87738 0.333252 7.00149C0.333252 6.12549 0.499474 5.3021 0.831919 4.53133C1.16436 3.76055 1.61553 3.0901 2.18542 2.51999C2.75531 1.94988 3.42547 1.49849 4.19592 1.16583C4.96636 0.83327 5.78953 0.666992 6.66542 0.666992C7.54142 0.666992 8.36481 0.833214 9.13559 1.16566C9.90636 1.4981 10.5768 1.94927 11.1469 2.51916C11.717 3.08905 12.1684 3.75921 12.5011 4.52966C12.8336 5.3001 12.9999 6.12327 12.9999 6.99916C12.9999 7.87516 12.8337 8.69855 12.5013 9.46933C12.1688 10.2401 11.7176 10.9105 11.1478 11.4807C10.5779 12.0508 9.9077 12.5022 9.13725 12.8348C8.36681 13.1674 7.54364 13.3337 6.66775 13.3337Z\"\r\n fill=\"#F63D68\"\r\n />\r\n </svg>\r\n );\r\n};\r\n\r\nexport const EyeIcon = () => {\r\n return (\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <mask\r\n id=\"mask0_6673_82208\"\r\n style={{ maskType: \"alpha\" }}\r\n maskUnits=\"userSpaceOnUse\"\r\n x=\"0\"\r\n y=\"0\"\r\n width=\"16\"\r\n height=\"16\"\r\n >\r\n <rect width=\"16\" height=\"16\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_6673_82208)\">\r\n <path\r\n d=\"M8.00147 10.3847C8.75692 10.3847 9.39853 10.1203 9.92631 9.5915C10.4541 9.06272 10.718 8.42061 10.718 7.66517C10.718 6.90972 10.4536 6.26811 9.9248 5.74033C9.39603 5.21256 8.75392 4.94867 7.99847 4.94867C7.24303 4.94867 6.60142 5.21306 6.07364 5.74183C5.54586 6.27061 5.28197 6.91272 5.28197 7.66817C5.28197 8.42361 5.54636 9.06522 6.07514 9.593C6.60392 10.1208 7.24603 10.3847 8.00147 10.3847ZM7.99997 9.46667C7.49997 9.46667 7.07497 9.29167 6.72497 8.94167C6.37497 8.59167 6.19997 8.16667 6.19997 7.66667C6.19997 7.16667 6.37497 6.74167 6.72497 6.39167C7.07497 6.04167 7.49997 5.86667 7.99997 5.86667C8.49997 5.86667 8.92497 6.04167 9.27497 6.39167C9.62497 6.74167 9.79997 7.16667 9.79997 7.66667C9.79997 8.16667 9.62497 8.59167 9.27497 8.94167C8.92497 9.29167 8.49997 9.46667 7.99997 9.46667ZM7.99997 12.3333C6.59653 12.3333 5.31297 11.9589 4.1493 11.2102C2.98564 10.4615 2.0568 9.4765 1.3628 8.25517C1.30725 8.15939 1.26664 8.06289 1.24097 7.96567C1.21541 7.86844 1.20264 7.76867 1.20264 7.66633C1.20264 7.564 1.21541 7.46433 1.24097 7.36733C1.26664 7.27033 1.30725 7.17394 1.3628 7.07817C2.0568 5.85683 2.98564 4.87183 4.1493 4.12317C5.31297 3.37439 6.59653 3 7.99997 3C9.40342 3 10.687 3.37439 11.8506 4.12317C13.0143 4.87183 13.9431 5.85683 14.6371 7.07817C14.6927 7.17394 14.7333 7.27044 14.759 7.36767C14.7845 7.46489 14.7973 7.56467 14.7973 7.667C14.7973 7.76933 14.7845 7.869 14.759 7.966C14.7333 8.063 14.6927 8.15939 14.6371 8.25517C13.9431 9.4765 13.0143 10.4615 11.8506 11.2102C10.687 11.9589 9.40342 12.3333 7.99997 12.3333ZM7.99997 11.3333C9.25553 11.3333 10.4083 11.0028 11.4583 10.3417C12.5083 9.68055 13.3111 8.78889 13.8666 7.66667C13.3111 6.54444 12.5083 5.65278 11.4583 4.99167C10.4083 4.33056 9.25553 4 7.99997 4C6.74442 4 5.59164 4.33056 4.54164 4.99167C3.49164 5.65278 2.68886 6.54444 2.1333 7.66667C2.68886 8.78889 3.49164 9.68055 4.54164 10.3417C5.59164 11.0028 6.74442 11.3333 7.99997 11.3333Z\"\r\n fill=\"#505050\"\r\n />\r\n </g>\r\n </svg>\r\n );\r\n};\r\n\r\nexport const ClosedEyeIcon = () => {\r\n return (\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <mask\r\n id=\"mask0_6673_82183\"\r\n style={{ maskType: \"alpha\" }}\r\n maskUnits=\"userSpaceOnUse\"\r\n x=\"0\"\r\n y=\"0\"\r\n width=\"16\"\r\n height=\"16\"\r\n >\r\n <rect width=\"16\" height=\"16\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_6673_82183)\">\r\n <path\r\n d=\"M9.91793 5.74876C10.1888 6.01976 10.3982 6.34903 10.5461 6.73659C10.694 7.12426 10.7499 7.51337 10.7139 7.90392C10.7139 8.03215 10.6678 8.1407 10.5756 8.22959C10.4833 8.31848 10.373 8.36292 10.2448 8.36292C10.1165 8.36292 10.008 8.31848 9.9191 8.22959C9.83021 8.1407 9.78576 8.03215 9.78576 7.90392C9.82854 7.61081 9.80443 7.33303 9.71343 7.07059C9.62243 6.80826 9.48248 6.58264 9.29359 6.39376C9.1047 6.20487 8.87693 6.06148 8.61026 5.96359C8.34359 5.8657 8.06237 5.84026 7.76659 5.88726C7.63837 5.89159 7.52771 5.84864 7.43459 5.75842C7.34137 5.66831 7.29265 5.55914 7.28843 5.43092C7.28409 5.3027 7.32532 5.19198 7.41209 5.09876C7.49887 5.00564 7.60637 4.95698 7.73459 4.95276C8.12259 4.90831 8.51254 4.95892 8.90443 5.10459C9.29632 5.25037 9.63415 5.46509 9.91793 5.74876ZM7.99993 4.00009C7.76315 4.00009 7.53087 4.01165 7.30309 4.03476C7.07532 4.05776 6.84859 4.09576 6.62293 4.14876C6.48104 4.17787 6.35326 4.15759 6.23959 4.08792C6.12593 4.01826 6.04776 3.91803 6.00509 3.78726C5.96232 3.65226 5.97643 3.52387 6.04743 3.40209C6.11832 3.28031 6.22126 3.20487 6.35626 3.17576C6.62471 3.11164 6.89587 3.06637 7.16976 3.03992C7.44376 3.01337 7.72048 3.00009 7.99993 3.00009C9.43237 3.00009 10.7482 3.37231 11.9474 4.11676C13.1465 4.8612 14.0687 5.86848 14.7139 7.13859C14.7584 7.22315 14.7907 7.30837 14.8108 7.39426C14.8309 7.48014 14.8409 7.57098 14.8409 7.66676C14.8409 7.76253 14.8326 7.85337 14.8159 7.93926C14.7993 8.02515 14.7687 8.11037 14.7243 8.19492C14.52 8.62226 14.2718 9.02076 13.9794 9.39042C13.6871 9.76009 13.3653 10.0996 13.0139 10.4091C12.9106 10.5014 12.7925 10.5396 12.6596 10.5238C12.5266 10.508 12.4174 10.4415 12.3319 10.3244C12.2465 10.2073 12.211 10.0817 12.2256 9.94759C12.2402 9.81337 12.2991 9.70009 12.4024 9.60776C12.7033 9.33509 12.9777 9.03703 13.2256 8.71359C13.4735 8.39003 13.6872 8.04109 13.8666 7.66676C13.311 6.54453 12.5083 5.65287 11.4583 4.99176C10.4083 4.33065 9.25548 4.00009 7.99993 4.00009ZM7.99993 12.3334C6.59648 12.3334 5.31015 11.9584 4.14093 11.2084C2.97171 10.4584 2.04226 9.47059 1.35259 8.24492C1.29704 8.16037 1.25643 8.06848 1.23076 7.96926C1.20509 7.87014 1.19226 7.76931 1.19226 7.66676C1.19226 7.5642 1.20337 7.46503 1.22559 7.36926C1.24782 7.27359 1.28671 7.18003 1.34226 7.08859C1.59015 6.63559 1.87093 6.20415 2.18459 5.79426C2.49826 5.38448 2.85893 5.0172 3.26659 4.69242L1.76143 3.17692C1.66921 3.07781 1.62371 2.96009 1.62493 2.82376C1.62626 2.68742 1.67521 2.57098 1.77176 2.47442C1.86832 2.37787 1.98543 2.32959 2.12309 2.32959C2.26065 2.32959 2.37771 2.37787 2.47426 2.47442L13.5256 13.5258C13.6179 13.6181 13.6669 13.7324 13.6724 13.8686C13.678 14.0049 13.629 14.1248 13.5256 14.2283C13.429 14.3248 13.3119 14.3731 13.1743 14.3731C13.0367 14.3731 12.9197 14.3248 12.8231 14.2283L10.4769 11.9026C10.0837 12.0547 9.67959 12.1645 9.2646 12.2321C8.84971 12.2996 8.42815 12.3334 7.99993 12.3334ZM3.96926 5.39492C3.57859 5.6967 3.22748 6.03792 2.91593 6.41859C2.60437 6.79937 2.34348 7.21542 2.13326 7.66676C2.68882 8.78898 3.49159 9.68064 4.54159 10.3418C5.59159 11.0029 6.74437 11.3334 7.99993 11.3334C8.28626 11.3334 8.56809 11.3142 8.84543 11.2758C9.12276 11.2373 9.3982 11.1779 9.67176 11.0976L8.82809 10.2334C8.69309 10.2924 8.55826 10.3324 8.42359 10.3533C8.28904 10.3743 8.14782 10.3848 7.99993 10.3848C7.24348 10.3848 6.60137 10.1209 6.07359 9.59309C5.54582 9.06531 5.28193 8.4232 5.28193 7.66676C5.28193 7.51887 5.29348 7.37765 5.31659 7.24309C5.33971 7.10842 5.37859 6.97359 5.43326 6.83859L3.96926 5.39492Z\"\r\n fill=\"#C5C5C5\"\r\n />\r\n </g>\r\n </svg>\r\n );\r\n};\r\n\r\nexport const SettingIcon: React.FC = () => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\"\r\n height=\"21\"\r\n viewBox=\"0 0 20 21\"\r\n fill=\"none\"\r\n >\r\n <path\r\n d=\"M11.3748 18.8346H8.62484C8.47206 18.8346 8.33664 18.786 8.21859 18.6888C8.10053 18.5916 8.02762 18.4666 7.99984 18.3138L7.6665 16.2096C7.40262 16.1124 7.12484 15.9805 6.83317 15.8138C6.5415 15.6471 6.28456 15.4735 6.06234 15.293L4.12484 16.1888C3.97206 16.2582 3.81928 16.2687 3.6665 16.2201C3.51373 16.1714 3.39567 16.0707 3.31234 15.918L1.93734 13.4805C1.854 13.3416 1.83317 13.1957 1.87484 13.043C1.9165 12.8902 1.99984 12.7652 2.12484 12.668L3.9165 11.3555C3.88873 11.2305 3.87137 11.0881 3.86442 10.9284C3.85748 10.7687 3.854 10.6263 3.854 10.5013C3.854 10.3763 3.85748 10.2339 3.86442 10.0742C3.87137 9.9145 3.88873 9.77214 3.9165 9.64714L2.12484 8.33464C1.99984 8.23741 1.9165 8.11241 1.87484 7.95964C1.83317 7.80686 1.854 7.66102 1.93734 7.52214L3.31234 5.08464C3.39567 4.93186 3.51373 4.83116 3.6665 4.78255C3.81928 4.73394 3.97206 4.74436 4.12484 4.8138L6.06234 5.70964C6.28456 5.52908 6.5415 5.35547 6.83317 5.1888C7.12484 5.02214 7.40262 4.89714 7.6665 4.8138L7.99984 2.6888C8.02762 2.53602 8.10053 2.41102 8.21859 2.3138C8.33664 2.21658 8.47206 2.16797 8.62484 2.16797H11.3748C11.5276 2.16797 11.663 2.21658 11.7811 2.3138C11.8991 2.41102 11.9721 2.53602 11.9998 2.6888L12.3332 4.79297C12.5971 4.89019 12.8783 5.01866 13.1769 5.17839C13.4755 5.33811 13.729 5.51519 13.9373 5.70964L15.8748 4.8138C16.0276 4.74436 16.1804 4.73394 16.3332 4.78255C16.4859 4.83116 16.604 4.93186 16.6873 5.08464L18.0623 7.5013C18.1457 7.64019 18.17 7.7895 18.1353 7.94922C18.1005 8.10894 18.0137 8.23741 17.8748 8.33464L16.0832 9.60547C16.1109 9.74436 16.1283 9.89366 16.1353 10.0534C16.1422 10.2131 16.1457 10.3624 16.1457 10.5013C16.1457 10.6402 16.1422 10.786 16.1353 10.9388C16.1283 11.0916 16.1109 11.2374 16.0832 11.3763L17.8748 12.668C17.9998 12.7652 18.0832 12.8902 18.1248 13.043C18.1665 13.1957 18.1457 13.3416 18.0623 13.4805L16.6873 15.918C16.604 16.0707 16.4859 16.1714 16.3332 16.2201C16.1804 16.2687 16.0276 16.2582 15.8748 16.1888L13.9373 15.293C13.7151 15.4735 13.4616 15.6506 13.1769 15.8242C12.8922 15.9978 12.6109 16.1263 12.3332 16.2096L11.9998 18.3138C11.9721 18.4666 11.8991 18.5916 11.7811 18.6888C11.663 18.786 11.5276 18.8346 11.3748 18.8346ZM9.99984 13.2096C10.7498 13.2096 11.3887 12.9457 11.9165 12.418C12.4443 11.8902 12.7082 11.2513 12.7082 10.5013C12.7082 9.7513 12.4443 9.11241 11.9165 8.58464C11.3887 8.05686 10.7498 7.79297 9.99984 7.79297C9.24984 7.79297 8.61095 8.05686 8.08317 8.58464C7.55539 9.11241 7.2915 9.7513 7.2915 10.5013C7.2915 11.2513 7.55539 11.8902 8.08317 12.418C8.61095 12.9457 9.24984 13.2096 9.99984 13.2096ZM9.99984 11.9596C9.59706 11.9596 9.25331 11.8173 8.96859 11.5326C8.68387 11.2478 8.5415 10.9041 8.5415 10.5013C8.5415 10.0985 8.68387 9.75477 8.96859 9.47005C9.25331 9.18533 9.59706 9.04297 9.99984 9.04297C10.4026 9.04297 10.7464 9.18533 11.0311 9.47005C11.3158 9.75477 11.4582 10.0985 11.4582 10.5013C11.4582 10.9041 11.3158 11.2478 11.0311 11.5326C10.7464 11.8173 10.4026 11.9596 9.99984 11.9596ZM9.08317 17.5846H10.9165L11.2082 15.2513C11.6665 15.1402 12.1005 14.9666 12.5103 14.7305C12.92 14.4944 13.2915 14.2096 13.6248 13.8763L15.8332 14.8346L16.6665 13.3346L14.7082 11.8971C14.7637 11.661 14.8089 11.4284 14.8436 11.1992C14.8783 10.9701 14.8957 10.7374 14.8957 10.5013C14.8957 10.2652 14.8818 10.0326 14.854 9.80339C14.8262 9.57422 14.7776 9.34158 14.7082 9.10547L16.6665 7.66797L15.8332 6.16797L13.6248 7.1263C13.3054 6.76519 12.9443 6.46311 12.5415 6.22005C12.1387 5.977 11.6943 5.82075 11.2082 5.7513L10.9165 3.41797H9.08317L8.7915 5.7513C8.31928 5.84852 7.87831 6.01519 7.46859 6.2513C7.05887 6.48741 6.69428 6.77908 6.37484 7.1263L4.1665 6.16797L3.33317 7.66797L5.2915 9.10547C5.23595 9.34158 5.19081 9.57422 5.15609 9.80339C5.12137 10.0326 5.104 10.2652 5.104 10.5013C5.104 10.7374 5.12137 10.9701 5.15609 11.1992C5.19081 11.4284 5.23595 11.661 5.2915 11.8971L3.33317 13.3346L4.1665 14.8346L6.37484 13.8763C6.70817 14.2096 7.0797 14.4944 7.48942 14.7305C7.89914 14.9666 8.33317 15.1402 8.7915 15.2513L9.08317 17.5846Z\"\r\n fill=\"#0E0C0B\"\r\n fill-opacity=\"0.7\"\r\n />\r\n </svg>\r\n);\r\n","import {\r\n BoardIcon,\r\n CalendarIcon,\r\n ChartsIcon,\r\n CloseIcon,\r\n GalleryIcon,\r\n ListIcon,\r\n TableIcon,\r\n TimeLineIcon,\r\n} from \"../../assets/svg\";\r\nimport { Box, Typography, ButtonBase, Grid, IconButton } from \"@mui/material\";\r\n\r\ninterface LayoutSelectorProps {\r\n onSelect: (layout: string) => void;\r\n selectedLayout?: string;\r\n}\r\n\r\nconst layoutIcons: Record<string, JSX.Element> = {\r\n Board: <BoardIcon />,\r\n Table: <TableIcon />,\r\n Timeline: <TimeLineIcon />,\r\n List: <ListIcon />,\r\n Calendar: <CalendarIcon />,\r\n Gallery: <GalleryIcon />,\r\n Charts: <ChartsIcon />,\r\n};\r\n\r\nconst LayoutSelector = ({ onSelect, selectedLayout }: LayoutSelectorProps) => {\r\n return (\r\n <Box\r\n sx={{\r\n width: \"100%\",\r\n maxWidth: \"500px\",\r\n height: \"330px\",\r\n // backgroundColor: \"#fff\",\r\n // borderRadius: 2,\r\n // overflow: \"hidden\",\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 px: 3,\r\n py: 2,\r\n // borderBottom: \"1px solid #eee\",\r\n backgroundColor: \"#FBFBFC\",\r\n }}\r\n >\r\n <Typography\r\n variant=\"h5\"\r\n sx={{ fontWeight: 400, fontSize: 18, color: \"#0C2033\" }}\r\n >\r\n Layouts\r\n </Typography>\r\n <IconButton onClick={() => onSelect(\"close\")}>\r\n <CloseIcon />\r\n </IconButton>\r\n </Box>\r\n\r\n {/* Layout Grid */}\r\n <Grid container spacing={2} sx={{ p: 3 }}>\r\n {Object.keys(layoutIcons).map((layout) => {\r\n const isSelected = layout === selectedLayout;\r\n return (\r\n <Grid size={3} key={layout}>\r\n <ButtonBase\r\n onClick={() => onSelect(layout)}\r\n sx={{\r\n border: isSelected\r\n ? \"1.5px solid #1E1E1E\"\r\n : \"1.5px solid #E5E7EB\",\r\n borderRadius: 2,\r\n p: 2,\r\n width: \"100%\",\r\n height: \"100%\",\r\n flexDirection: \"column\",\r\n backgroundColor: isSelected ? \"#fff\" : \"\",\r\n transition: \"0.3s\",\r\n boxShadow: isSelected\r\n ? \"0px 2px 6px rgba(0,0,0,0.06)\"\r\n : \"none\",\r\n }}\r\n >\r\n <Box mb={1}>{layoutIcons[layout]}</Box>\r\n <Typography\r\n variant=\"subtitle1\"\r\n sx={{\r\n color: \"#1E1E1E\",\r\n fontWeight: isSelected ? 400 : 200,\r\n opacity: isSelected ? 1 : 0.5,\r\n }}\r\n >\r\n {layout}\r\n </Typography>\r\n </ButtonBase>\r\n </Grid>\r\n );\r\n })}\r\n </Grid>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default LayoutSelector;\r\n","import { useEffect, useState } from \"react\";\r\n\r\nexport function useFullscreenPopoverContainer() {\r\n const [isFullscreen, setIsFullscreen] = useState<boolean>(\r\n !!document.fullscreenElement\r\n );\r\n const [container, setContainer] = useState<Element | undefined>(\r\n document.fullscreenElement ?? undefined\r\n );\r\n\r\n useEffect(() => {\r\n const handleFullscreenChange = () => {\r\n const el = document.fullscreenElement ?? undefined;\r\n setIsFullscreen(!!el);\r\n setContainer(el);\r\n };\r\n\r\n document.addEventListener(\"fullscreenchange\", handleFullscreenChange);\r\n return () => {\r\n document.removeEventListener(\"fullscreenchange\", handleFullscreenChange);\r\n };\r\n }, []);\r\n\r\n return { isFullscreen, container };\r\n}\r\n","import React from \"react\";\r\nimport {\r\n Popover,\r\n Typography,\r\n Box,\r\n MenuItem,\r\n Select,\r\n IconButton,\r\n Switch as MUISwitch,\r\n} from \"@mui/material\";\r\nimport { CloseIcon, ViewMoreIcon } from \"../../../assets/svg\";\r\nimport { useFullscreenPopoverContainer } from \"../../libs/hooks/useFullScreen\";\r\nimport { CraftTableOptionsProps } from \"../../types/table-options\";\r\n\r\n// interface ViewMorePopoverProps {\r\n// compactMode: boolean;\r\n// onCompactToggle: (value: string) => void;\r\n// isFullscreen: boolean;\r\n// onFullscreenToggle: () => void;\r\n// groupBy: string;\r\n// onGroupByChange: (value: string) => void;\r\n// tableStates: CraftTableOptionsProps;\r\n// }\r\n\r\n// const ViewMore = ({\r\n// compactMode,\r\n// onCompactToggle,\r\n// isFullscreen,\r\n// onFullscreenToggle,\r\n// // groupBy,\r\n// // onGroupByChange,\r\n// tableStates,\r\n// }: ViewMorePopoverProps) => {\r\n// const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\r\n\r\n// const open = Boolean(anchorEl);\r\n// const { container: fullscreenContainer } = useFullscreenPopoverContainer();\r\n\r\n// const handleClick = (event: React.MouseEvent<HTMLElement>) => {\r\n// setAnchorEl(event.currentTarget);\r\n// };\r\n\r\n// const handleClose = () => {\r\n// setAnchorEl(null);\r\n// };\r\n\r\n// const { wrapColumns, setWrapColumns } = tableStates;\r\n\r\n// const onWrapCellToggle = () => {\r\n// setWrapColumns((prev: Record<string, boolean>) => ({\r\n// all_wrap: !prev[\"all_wrap\"],\r\n// }));\r\n// };\r\n\r\n// return (\r\n// <>\r\n// <div onClick={handleClick}>\r\n// <ViewMoreIcon />\r\n// </div>\r\n\r\n// <Popover\r\n// open={open}\r\n// anchorEl={anchorEl}\r\n// onClose={handleClose}\r\n// container={fullscreenContainer}\r\n// anchorOrigin={{ vertical: \"bottom\", horizontal: \"left\" }}\r\n// transformOrigin={{ vertical: \"top\", horizontal: \"left\" }}\r\n// PaperProps={{\r\n// sx: {\r\n// mt: 2,\r\n// padding: 3,\r\n// width: 380,\r\n// borderRadius: 1,\r\n// boxShadow: 4,\r\n// },\r\n// }}\r\n// >\r\n// <Box\r\n// display=\"flex\"\r\n// justifyContent=\"space-between\"\r\n// alignItems=\"center\"\r\n// px={2}\r\n// py={2}\r\n// sx={{\r\n// backgroundColor: \"#F9FAFB\",\r\n// // borderBottom: \"1px solid #E0E0E0\",\r\n// // borderTopLeftRadius: 4,\r\n// // borderTopRightRadius: 4,\r\n// margin: \"-24px -24px 24px -24px\",\r\n// }}\r\n// >\r\n// <Typography fontSize=\"18px\" fontWeight={400} color=\"#0C2033\">\r\n// View\r\n// </Typography>\r\n// <IconButton size=\"small\" onClick={handleClose}>\r\n// <CloseIcon />\r\n// </IconButton>\r\n// </Box>\r\n\r\n// {/* Wrap Cell */}\r\n// <Box\r\n// display=\"flex\"\r\n// justifyContent=\"space-between\"\r\n// alignItems=\"center\"\r\n// mb={2}\r\n// >\r\n// <Typography fontSize=\"14px\" fontWeight={400} color=\"#000000DE\">\r\n// Wrap Cell\r\n// </Typography>\r\n// <MUISwitch\r\n// checked={wrapColumns?.all_wrap || false}\r\n// onChange={onWrapCellToggle}\r\n// />\r\n// </Box>\r\n\r\n// {/* List View */}\r\n// <Box\r\n// display=\"flex\"\r\n// justifyContent=\"space-between\"\r\n// alignItems=\"center\"\r\n// mb={2}\r\n// >\r\n// <Typography fontSize=\"14px\" fontWeight={400} color=\"#000000DE\">\r\n// List View\r\n// </Typography>\r\n// <Select\r\n// size=\"small\"\r\n// value={compactMode ? \"Compact\" : \"Comfy\"}\r\n// onChange={(e) => onCompactToggle(e.target.value)}\r\n// sx={{\r\n// minWidth: 120,\r\n// fontWeight: 400,\r\n// color: \"#000\",\r\n// fontSize: \"13px\",\r\n// }}\r\n// MenuProps={{\r\n// container: fullscreenContainer,\r\n// disablePortal: false,\r\n// PaperProps: {\r\n// style: {\r\n// zIndex: 1500,\r\n// },\r\n// },\r\n// }}\r\n// >\r\n// <MenuItem value=\"Comfy\">Comfy</MenuItem>\r\n// <MenuItem value=\"Compact\">Compact</MenuItem>\r\n// </Select>\r\n// </Box>\r\n\r\n// {/* Group By */}\r\n// {/* <Box\r\n// display=\"flex\"\r\n// justifyContent=\"space-between\"\r\n// alignItems=\"center\"\r\n// mb={2}\r\n// >\r\n// <Typography fontSize=\"14px\" fontWeight={400} color=\"#000000DE\">\r\n// Group By\r\n// </Typography>\r\n// <Select\r\n// size=\"small\"\r\n// value={groupBy}\r\n// onChange={(e) => onGroupByChange(e.target.value)}\r\n// sx={{\r\n// minWidth: 120,\r\n// fontWeight: 400,\r\n// color: \"#000\",\r\n// fontSize: \"13px\",\r\n// }}\r\n// MenuProps={{\r\n// container: fullscreenContainer,\r\n// disablePortal: false,\r\n// PaperProps: {\r\n// style: {\r\n// zIndex: 1500,\r\n// },\r\n// },\r\n// }}\r\n// >\r\n// <MenuItem value=\"None\">None</MenuItem>\r\n// <MenuItem value=\"Status\">Status</MenuItem>\r\n// <MenuItem value=\"Owner\">Owner</MenuItem>\r\n// </Select>\r\n// </Box> */}\r\n\r\n// {/* Fullscreen */}\r\n// <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\">\r\n// <Typography fontSize=\"14px\" fontWeight={400} color=\"#000000DE\">\r\n// Fullscreen\r\n// </Typography>\r\n// <MUISwitch checked={isFullscreen} onChange={onFullscreenToggle} />\r\n// </Box>\r\n// </Popover>\r\n// </>\r\n// );\r\n// };\r\n\r\n// export default ViewMore;\r\n\r\ninterface ViewMoreProps {\r\n compactMode: boolean;\r\n onCompactToggle: (value: string) => void;\r\n isFullscreen: boolean;\r\n onFullscreenToggle: () => void;\r\n groupBy?: string;\r\n onGroupByChange?: (value: string) => void;\r\n tableStates: CraftTableOptionsProps;\r\n onClose?: () => void;\r\n}\r\n\r\nconst ViewMore = ({\r\n compactMode,\r\n onCompactToggle,\r\n isFullscreen,\r\n onFullscreenToggle,\r\n // groupBy,\r\n // onGroupByChange,\r\n tableStates,\r\n onClose,\r\n}: ViewMoreProps) => {\r\n const { container: fullscreenContainer } = useFullscreenPopoverContainer();\r\n const { wrapColumns, setWrapColumns } = tableStates;\r\n\r\n const onWrapCellToggle = () => {\r\n setWrapColumns((prev: Record<string, boolean>) => ({\r\n all_wrap: !prev[\"all_wrap\"],\r\n }));\r\n };\r\n\r\n return (\r\n <Box sx={{ p: 3, width: 380 }}>\r\n {/* Header */}\r\n <Box\r\n display=\"flex\"\r\n justifyContent=\"space-between\"\r\n alignItems=\"center\"\r\n mb={3}\r\n >\r\n <Typography fontSize=\"18px\" fontWeight={400} color=\"#0C2033\">\r\n View\r\n </Typography>\r\n <IconButton size=\"small\" onClick={onClose}>\r\n <CloseIcon />\r\n </IconButton>\r\n </Box>\r\n\r\n {/* Wrap Cell */}\r\n <Box\r\n display=\"flex\"\r\n justifyContent=\"space-between\"\r\n alignItems=\"center\"\r\n mb={2}\r\n >\r\n <Typography fontSize=\"14px\" fontWeight={400} color=\"#000000DE\">\r\n Wrap Cell\r\n </Typography>\r\n <MUISwitch\r\n checked={wrapColumns?.all_wrap || false}\r\n onChange={onWrapCellToggle}\r\n />\r\n </Box>\r\n\r\n {/* List View */}\r\n <Box\r\n display=\"flex\"\r\n justifyContent=\"space-between\"\r\n alignItems=\"center\"\r\n mb={2}\r\n >\r\n <Typography fontSize=\"14px\" fontWeight={400} color=\"#000000DE\">\r\n List View\r\n </Typography>\r\n <Select\r\n size=\"small\"\r\n value={compactMode ? \"Compact\" : \"Comfy\"}\r\n onChange={(e) => onCompactToggle(e.target.value)}\r\n sx={{\r\n minWidth: 120,\r\n fontWeight: 400,\r\n color: \"#000\",\r\n fontSize: \"13px\",\r\n }}\r\n MenuProps={{\r\n container: fullscreenContainer,\r\n disablePortal: false,\r\n PaperProps: {\r\n style: {\r\n zIndex: 1500,\r\n },\r\n },\r\n }}\r\n >\r\n <MenuItem value=\"Comfy\">Comfy</MenuItem>\r\n <MenuItem value=\"Compact\">Compact</MenuItem>\r\n </Select>\r\n </Box>\r\n\r\n {/* Fullscreen */}\r\n <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\">\r\n <Typography fontSize=\"14px\" fontWeight={400} color=\"#000000DE\">\r\n Fullscreen\r\n </Typography>\r\n <MUISwitch checked={isFullscreen} onChange={onFullscreenToggle} />\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default ViewMore;\r\n","import React from \"react\";\r\nimport { useSortable } from \"@dnd-kit/sortable\";\r\nimport { CSS } from \"@dnd-kit/utilities\";\r\nimport { DragHandleIcon } from \"../../../assets/svg\";\r\n\r\nconst SortableItem = ({\r\n id,\r\n children,\r\n}: {\r\n id: string;\r\n children: React.ReactNode;\r\n}) => {\r\n const { attributes, listeners, setNodeRef, transform, transition } =\r\n useSortable({ id });\r\n\r\n return (\r\n <div\r\n ref={setNodeRef}\r\n style={{\r\n transform: CSS.Transform.toString(transform),\r\n transition,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 8,\r\n }}\r\n >\r\n <span {...attributes} {...listeners} style={{ cursor: \"grab\" }}>\r\n <DragHandleIcon />\r\n </span>\r\n <div style={{ flexGrow: 1 }}>{children}</div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default SortableItem;\r\n","import { useState } from \"react\";\r\nimport {\r\n Popover,\r\n Box,\r\n IconButton,\r\n MenuItem,\r\n Select,\r\n Typography,\r\n Button,\r\n} from \"@mui/material\";\r\nimport {\r\n DndContext,\r\n closestCenter,\r\n useSensor,\r\n useSensors,\r\n MouseSensor,\r\n TouchSensor,\r\n KeyboardSensor,\r\n} from \"@dnd-kit/core\";\r\nimport {\r\n arrayMove,\r\n SortableContext,\r\n verticalListSortingStrategy,\r\n} from \"@dnd-kit/sortable\";\r\nimport SortableItem from \"./sorting-item\";\r\nimport { AddIcon, CloseIcon } from \"../../../assets/svg\";\r\n\r\ninterface SortItem {\r\n id: string;\r\n field: string;\r\n direction: \"asc\" | \"desc\";\r\n}\r\n\r\ntype SortPopoverProps = {\r\n anchorEl: HTMLElement | null;\r\n onClose: () => void;\r\n columns: { id: string; label: string }[];\r\n onChange: (sorting: { id: string; desc: boolean }[]) => void;\r\n};\r\n\r\nconst SortPopover = ({\r\n anchorEl,\r\n onClose,\r\n columns,\r\n onChange,\r\n}: SortPopoverProps) => {\r\n const [sorts, setSorts] = useState<SortItem[]>([]);\r\n\r\n const sensors = useSensors(\r\n useSensor(MouseSensor),\r\n useSensor(TouchSensor),\r\n useSensor(KeyboardSensor)\r\n );\r\n\r\n const handleDragEnd = (event: any) => {\r\n const { active, over } = event;\r\n if (active.id !== over.id) {\r\n const oldIndex = sorts.findIndex((item) => item.id === active.id);\r\n const newIndex = sorts.findIndex((item) => item.id === over.id);\r\n const updated = arrayMove(sorts, oldIndex, newIndex);\r\n setSorts(updated);\r\n triggerTableSortUpdate(updated);\r\n }\r\n };\r\n\r\n const handleChange = (id: string, field: keyof SortItem, value: any) => {\r\n const updated = sorts.map((item) =>\r\n item.id === id ? { ...item, [field]: value } : item\r\n );\r\n setSorts(updated);\r\n triggerTableSortUpdate(updated);\r\n };\r\n\r\n const handleAddSort = () => {\r\n const newSort: SortItem = {\r\n id: Date.now().toString(),\r\n field: columns[0]?.id ?? \"\",\r\n direction: \"asc\",\r\n };\r\n const updated = [...sorts, newSort];\r\n setSorts(updated);\r\n triggerTableSortUpdate(updated);\r\n };\r\n\r\n const handleRemove = (id: string) => {\r\n const updated = sorts.filter((item) => item.id !== id);\r\n setSorts(updated);\r\n triggerTableSortUpdate(updated);\r\n };\r\n\r\n const triggerTableSortUpdate = (sortItems: SortItem[]) => {\r\n const sortingPayload = sortItems.map((item) => ({\r\n id: item.field,\r\n desc: item.direction === \"desc\",\r\n }));\r\n onChange(sortingPayload);\r\n };\r\n\r\n return (\r\n <Popover\r\n open={Boolean(anchorEl)}\r\n anchorEl={anchorEl}\r\n onClose={onClose}\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"left\" }}\r\n >\r\n <Box p={2} minWidth={300}>\r\n <Box\r\n display=\"flex\"\r\n justifyContent=\"space-between\"\r\n alignItems=\"center\"\r\n px={2}\r\n py={1}\r\n sx={{\r\n backgroundColor: \"#F9FAFB\",\r\n // borderBottom: \"1px solid #E0E0E0\",\r\n margin: \"-16px -16px 16px -16px\",\r\n }}\r\n >\r\n <Typography fontSize=\"18px\" fontWeight={600} color=\"#0C2033\">\r\n Sort By\r\n </Typography>\r\n <IconButton size=\"small\" onClick={onClose}>\r\n <CloseIcon />\r\n </IconButton>\r\n </Box>\r\n\r\n {sorts.length > 0 && (\r\n <DndContext\r\n sensors={sensors}\r\n collisionDetection={closestCenter}\r\n onDragEnd={handleDragEnd}\r\n >\r\n <SortableContext\r\n items={sorts.map((s) => s.id)}\r\n strategy={verticalListSortingStrategy}\r\n >\r\n {sorts.map((sort) => (\r\n <SortableItem key={sort.id} id={sort.id}>\r\n <Box display=\"flex\" gap={1} alignItems=\"center\" mb={1}>\r\n <Select\r\n value={sort.field}\r\n onChange={(e) =>\r\n handleChange(sort.id, \"field\", e.target.value)\r\n }\r\n size=\"small\"\r\n fullWidth\r\n sx={{ fontWeight: 400, fontSize: 14, color: \"#000\" }}\r\n >\r\n {columns.map((col) => (\r\n <MenuItem key={col.id} value={col.id}>\r\n {col.label}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n <Select\r\n value={sort.direction}\r\n onChange={(e) =>\r\n handleChange(sort.id, \"direction\", e.target.value)\r\n }\r\n size=\"small\"\r\n sx={{ fontWeight: 400, fontSize: 14, color: \"#000\" }}\r\n >\r\n <MenuItem value=\"asc\">Ascending</MenuItem>\r\n <MenuItem value=\"desc\">Descending</MenuItem>\r\n </Select>\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => handleRemove(sort.id)}\r\n >\r\n <CloseIcon />\r\n </IconButton>\r\n </Box>\r\n </SortableItem>\r\n ))}\r\n </SortableContext>\r\n </DndContext>\r\n )}\r\n\r\n <Button\r\n onClick={handleAddSort}\r\n startIcon={\r\n <span>\r\n <AddIcon />\r\n </span>\r\n }\r\n size=\"small\"\r\n sx={{\r\n fontWeight: 400,\r\n fontSize: 12,\r\n color: \"#888888\",\r\n }}\r\n >\r\n Add Sort\r\n </Button>\r\n </Box>\r\n </Popover>\r\n );\r\n};\r\n\r\nexport default SortPopover;\r\n","import { useSortable } from \"@dnd-kit/sortable\";\r\nimport { Box, Typography } from \"@mui/material\";\r\nimport {\r\n DragandDrogIcon,\r\n VisibilityIcon,\r\n VisibilityOffIcon,\r\n} from \"../../../assets/svg\";\r\nimport { CSS } from \"@dnd-kit/utilities\";\r\nimport { camelCaseToTitle } from \"../../types/common\";\r\n\r\nconst DraggableColumn = ({\r\n column,\r\n onToggle,\r\n}: {\r\n column: any;\r\n onToggle: () => void;\r\n}) => {\r\n const { attributes, listeners, setNodeRef, transform, transition } =\r\n useSortable({\r\n id: column.id,\r\n });\r\n\r\n const style = {\r\n transform: CSS.Transform.toString(transform),\r\n transition,\r\n };\r\n\r\n const isVisible = column.getIsVisible();\r\n const label =\r\n typeof column.columnDef.header === \"string\"\r\n ? column.columnDef.header\r\n : column.id;\r\n\r\n return (\r\n <div ref={setNodeRef} style={style} {...attributes} className=\"column-row\">\r\n <Box {...listeners} className=\"drag-icon\">\r\n <DragandDrogIcon />\r\n </Box>\r\n <Typography>{camelCaseToTitle(label as string)}</Typography>\r\n <Box onClick={onToggle} className=\"visibility-icon\">\r\n {isVisible ? <VisibilityIcon /> : <VisibilityOffIcon />}\r\n </Box>\r\n </div>\r\n );\r\n};\r\n\r\nexport default DraggableColumn;\r\n","export interface defaultColumnsProps {\r\n id: number;\r\n name: string;\r\n department: string;\r\n position: string;\r\n email: string;\r\n location: string;\r\n phone: string;\r\n dateOfJoining: string;\r\n salary: number;\r\n performanceRating: string;\r\n subRows?: any;\r\n}\r\n\r\nexport interface amountFormatProps {\r\n amount: number;\r\n decimal?: boolean;\r\n removeFloat?: boolean;\r\n compactFormat?: \"crore\" | \"10lakh\" | \"lakh\";\r\n}\r\n\r\nexport interface formatDateProps {\r\n date: string;\r\n style: string;\r\n}\r\n\r\nexport type alignProps = \"left\" | \"center\" | \"right\";\r\nexport interface align {\r\n align: alignProps;\r\n}\r\n\r\nexport const camelCaseToTitle = (str: string): string => {\r\n if (!str) return \"\";\r\n\r\n return str\r\n .replace(/_/g, \" \") // Replace underscores with spaces\r\n .replace(/([a-z])([A-Z])/g, \"$1 $2\") // Add space between camelCase transitions\r\n .replace(/\\b\\w/g, (char) => char.toUpperCase()) // Capitalize each word's first letter\r\n .trim();\r\n};\r\n\r\n//API INTEGRATION\r\nexport interface EntityTableAPIProps {\r\n entity_type?: string;\r\n page: number;\r\n size: number;\r\n tabs?: {\r\n columnName: string;\r\n sortBy: \"ASC\" | \"DSC\";\r\n value?: string;\r\n name?: string;\r\n };\r\n sortby?: {\r\n sortColum: string;\r\n sortType: \"ASC\" | \"DSC\";\r\n }[];\r\n quickFilter?: {\r\n filter_attribute: string;\r\n filter_operator: string;\r\n filter_value: string[] | string;\r\n }[];\r\n attributeFilter?: {\r\n filter_attribute: string;\r\n filter_operator: string;\r\n filter_value: string[] | string;\r\n }[];\r\n flatJson: boolean;\r\n module_code?: string;\r\n}\r\n\r\nexport interface viewSettingsDropDownAPIProps {\r\n entity_type: string;\r\n column: string | undefined;\r\n sort_by: string | undefined;\r\n}\r\n\r\ninterface EntityListTab {\r\n tab_name: string | null;\r\n count: string | number;\r\n}\r\n\r\ninterface EntityList {\r\n id: string;\r\n entity_type: string;\r\n name: string;\r\n status: string | null;\r\n parent_type: string | null;\r\n parent_id: string | null;\r\n code: string;\r\n created_by: string | null;\r\n created_date: string | null;\r\n modified_by: string | null;\r\n modified_date: string | null;\r\n enterprise_id: string | null;\r\n organization_id: number | null;\r\n app_code: string | null;\r\n is_system: number | null;\r\n description: string | null;\r\n}\r\n\r\nexport interface EntityListingResponse {\r\n data: {\r\n entity_tabs: EntityListTab[];\r\n entity_list: EntityList[];\r\n };\r\n}\r\n\r\nexport interface APIParamsProps {\r\n page?: number;\r\n size?: number;\r\n use_flatjson?: boolean;\r\n}\r\n\r\nexport type DropdownOption = {\r\n value: string | number;\r\n label: string;\r\n};\r\n\r\nexport interface onFilterChangeFunctionProps {\r\n updatedFilters?: any;\r\n filterMaster?: any;\r\n filters?: any;\r\n}\r\n","import React from \"react\";\r\nimport {\r\n DndContext,\r\n closestCenter,\r\n useSensor,\r\n useSensors,\r\n MouseSensor,\r\n TouchSensor,\r\n KeyboardSensor,\r\n DragEndEvent,\r\n} from \"@dnd-kit/core\";\r\nimport {\r\n SortableContext,\r\n arrayMove,\r\n verticalListSortingStrategy,\r\n} from \"@dnd-kit/sortable\";\r\nimport { Popover, IconButton, Typography, Box } from \"@mui/material\";\r\nimport { Table } from \"@tanstack/react-table\";\r\nimport DraggableColumn from \"./column-list-item\";\r\nimport \"./index.scss\";\r\nimport { CloseIcon } from \"../../../assets/svg\";\r\n\r\ninterface ColumnToggleProps<T> {\r\n anchorEl: HTMLElement | null;\r\n onClose: () => void;\r\n table: Table<T>;\r\n columnOrder: string[];\r\n setColumnOrder: React.Dispatch<React.SetStateAction<string[]>>;\r\n}\r\n\r\nconst ColumnToggle = <T,>({\r\n anchorEl,\r\n onClose,\r\n table,\r\n columnOrder,\r\n setColumnOrder,\r\n}: ColumnToggleProps<T>) => {\r\n const open = Boolean(anchorEl);\r\n const sensors = useSensors(\r\n useSensor(MouseSensor),\r\n useSensor(TouchSensor),\r\n useSensor(KeyboardSensor)\r\n );\r\n\r\n const allColumns = table.getAllLeafColumns();\r\n\r\n const shownColumns = columnOrder\r\n .map((id) => allColumns.find((col) => col.id === id))\r\n .filter((col) => col?.getIsVisible());\r\n\r\n const hiddenColumns = columnOrder\r\n .map((id) => allColumns.find((col) => col.id === id))\r\n .filter((col) => col && !col.getIsVisible());\r\n\r\n const handleDragEnd = (event: DragEndEvent) => {\r\n const { active, over } = event;\r\n\r\n if (!over || active.id === over.id) return;\r\n\r\n const activeCol = table.getColumn(active.id as string);\r\n const overCol = table.getColumn(over.id as string);\r\n if (!activeCol || !overCol) return;\r\n\r\n const activeVisible = activeCol.getIsVisible();\r\n const overVisible = overCol.getIsVisible();\r\n\r\n if (activeVisible !== overVisible) {\r\n activeCol.toggleVisibility();\r\n }\r\n\r\n const oldIndex = columnOrder.indexOf(active.id as string);\r\n const newIndex = columnOrder.indexOf(over.id as string);\r\n setColumnOrder(arrayMove(columnOrder, oldIndex, newIndex));\r\n };\r\n\r\n const toggleVisibility = (columnId: string) => {\r\n const col = table.getColumn(columnId);\r\n col?.toggleVisibility();\r\n };\r\n\r\n const handleHideAll = () => {\r\n allColumns.forEach((col) => col.toggleVisibility(false));\r\n };\r\n\r\n const handleShowAll = () => {\r\n allColumns.forEach((col) => col.toggleVisibility(true));\r\n };\r\n\r\n return (\r\n <Popover\r\n open={open}\r\n anchorEl={anchorEl}\r\n onClose={onClose}\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"left\" }}\r\n sx={{ width: \"600px\" }}\r\n >\r\n <div className=\"column-manager\">\r\n <div className=\"header\">\r\n <Typography variant=\"h6\">Column</Typography>\r\n <IconButton size=\"small\" onClick={onClose}>\r\n <CloseIcon />\r\n </IconButton>\r\n </div>\r\n\r\n <div className=\"content-wrapper\">\r\n <DndContext\r\n sensors={sensors}\r\n collisionDetection={closestCenter}\r\n onDragEnd={handleDragEnd}\r\n >\r\n <div className=\"list-section\">\r\n <div className=\"list-header\">\r\n <Typography variant=\"subtitle2\">Shown in List</Typography>\r\n {/* <button onClick={handleHideAll}>Hide All</button> */}\r\n <Box\r\n onClick={handleHideAll}\r\n fontStyle={{\r\n cursor: \"pointer\",\r\n color: \"#C5C5C5\",\r\n fontSize: \"12px\",\r\n }}\r\n >\r\n Hide All\r\n </Box>\r\n </div>\r\n <SortableContext\r\n items={shownColumns.map((col) => col!.id)}\r\n strategy={verticalListSortingStrategy}\r\n >\r\n {shownColumns.map((col) => (\r\n <DraggableColumn\r\n key={col!.id}\r\n column={col!}\r\n onToggle={() => toggleVisibility(col!.id)}\r\n />\r\n ))}\r\n </SortableContext>\r\n </div>\r\n\r\n <div className=\"list-section\">\r\n <div className=\"list-header\">\r\n <Typography variant=\"subtitle2\">Hidden in List</Typography>\r\n {/* <button onClick={handleShowAll}>Show All</button> */}\r\n <Box\r\n onClick={handleShowAll}\r\n fontStyle={{\r\n cursor: \"pointer\",\r\n color: \"#C5C5C5\",\r\n fontSize: \"12px\",\r\n }}\r\n >\r\n Show All\r\n </Box>\r\n </div>\r\n <SortableContext\r\n items={hiddenColumns.map((col) => col!.id)}\r\n strategy={verticalListSortingStrategy}\r\n >\r\n {hiddenColumns.map((col) => (\r\n <DraggableColumn\r\n key={col!.id}\r\n column={col!}\r\n onToggle={() => toggleVisibility(col!.id)}\r\n />\r\n ))}\r\n </SortableContext>\r\n </div>\r\n </DndContext>\r\n </div>\r\n </div>\r\n </Popover>\r\n );\r\n};\r\n\r\nexport default ColumnToggle;\r\n","export const customDebounce = <T extends (...args: any[]) => any>(\r\n func: T,\r\n delay: number\r\n) => {\r\n let timerId: NodeJS.Timeout;\r\n\r\n return function (this: any, ...args: Parameters<T>) {\r\n const context = this;\r\n\r\n clearTimeout(timerId);\r\n timerId = setTimeout(() => {\r\n func.apply(context, args);\r\n }, delay);\r\n };\r\n};\r\n","import { Theme } from \"@emotion/react\";\r\nimport { SxProps } from \"@mui/material\";\r\n\r\nexport interface StyleProps {\r\n searchField: (showSearchInput: boolean) => SxProps<Theme>;\r\n}\r\n\r\nexport const searchStyles: StyleProps = {\r\n searchField: (showSearchInput: boolean): SxProps<Theme> => ({\r\n width: showSearchInput ? \"180px\" : \"40px\",\r\n transition: \"all 0.3s ease\",\r\n opacity: showSearchInput ? 1 : 0.8,\r\n marginRight: \"0.5rem\",\r\n\r\n \"& .MuiOutlinedInput-root\": {\r\n paddingRight: \"4px\",\r\n height: \"32px\",\r\n borderRadius: \"6px\",\r\n backgroundColor: \"#fff\",\r\n border: showSearchInput ? \"1px solid #ccc\" : \"none\",\r\n },\r\n\r\n \"& .MuiOutlinedInput-notchedOutline\": {\r\n border: \"none\",\r\n },\r\n\r\n \"&:hover .MuiOutlinedInput-notchedOutline\": {\r\n border: \"none\",\r\n },\r\n\r\n \"&.Mui-focused .MuiOutlinedInput-notchedOutline\": {},\r\n\r\n \" & .css-4bojcr-MuiInputBase-root-MuiOutlinedInput-root \": {\r\n paddingLeft: \"6px !important\",\r\n },\r\n \"& .css-1mnoz6i-MuiInputBase-root-MuiOutlinedInput-root\": {\r\n paddingLeft: \"6px !important\",\r\n },\r\n }),\r\n};\r\n","import React, { useState, useRef, useEffect, useCallback } from \"react\";\r\nimport { SearchIcon } from \"../../../assets/svg\";\r\nimport useOutsideClick from \"../../libs/hooks/useOutsideClick\";\r\nimport { customDebounce } from \"../../libs/utils/debounce\";\r\nimport { Box, IconButton, InputAdornment, TextField } from \"@mui/material\";\r\nimport CloseRoundedIcon from \"@mui/icons-material/CloseRounded\";\r\nimport { searchStyles } from \"./style\";\r\n\r\ninterface TableSearchProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n}\r\n\r\nexport const TableSearch = ({\r\n value,\r\n onChange,\r\n}: TableSearchProps): JSX.Element => {\r\n const [showSearchInput, setShowSearchInput] = useState(false);\r\n const [localValue, setLocalValue] = useState(value);\r\n const searchContainerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Debounced onChange function\r\n const debouncedOnChange = useCallback(\r\n customDebounce((newValue: string) => {\r\n onChange(newValue);\r\n }, 1000),\r\n [onChange]\r\n );\r\n\r\n // Sync local state with prop value\r\n useEffect(() => {\r\n setLocalValue(value);\r\n }, [value]);\r\n\r\n useOutsideClick({\r\n ref: searchContainerRef,\r\n handler: () => {\r\n setShowSearchInput(false);\r\n },\r\n });\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const newValue = e.target.value;\r\n setLocalValue(newValue);\r\n debouncedOnChange(newValue);\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === \"Enter\") {\r\n onChange(localValue);\r\n }\r\n if (e.key === \"Escape\") {\r\n setShowSearchInput(false);\r\n }\r\n };\r\n\r\n return (\r\n <Box\r\n ref={searchContainerRef}\r\n className=\"search-container\"\r\n sx={{ position: \"relative\" }}\r\n >\r\n <TextField\r\n type=\"text\"\r\n placeholder=\"Search\"\r\n value={localValue}\r\n onChange={handleChange}\r\n onKeyDown={handleKeyDown}\r\n className={`search-input ${showSearchInput ? \"expanded\" : \"\"}`}\r\n sx={searchStyles.searchField(showSearchInput)}\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => {\r\n setShowSearchInput((prev) => !prev);\r\n if (!showSearchInput) {\r\n setTimeout(() => {\r\n searchContainerRef.current\r\n ?.querySelector(\"input\")\r\n ?.focus();\r\n }, 100);\r\n }\r\n }}\r\n sx={{ color: \"black\", fontSize: 14 }}\r\n edge=\"start\"\r\n >\r\n <SearchIcon />\r\n </IconButton>\r\n </InputAdornment>\r\n ),\r\n endAdornment:\r\n showSearchInput && localValue !== \"\" ? (\r\n <InputAdornment position=\"end\">\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => {\r\n setLocalValue(\"\");\r\n handleChange({ target: { value: \"\" } } as any);\r\n }}\r\n sx={{ color: \"black\", fontSize: 14 }}\r\n edge=\"end\"\r\n >\r\n <CloseRoundedIcon\r\n fontSize=\"small\"\r\n sx={{ color: \"black\", fontSize: 14 }}\r\n />\r\n </IconButton>\r\n </InputAdornment>\r\n ) : null,\r\n }}\r\n />\r\n </Box>\r\n );\r\n};\r\n","import React, { useEffect } from \"react\";\r\n\r\ninterface OutsideClickHandlerProps {\r\n ref: React.RefObject<HTMLElement>;\r\n handler: () => void;\r\n}\r\n\r\nconst useOutsideClick = ({ ref, handler }: OutsideClickHandlerProps) => {\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (ref.current && !ref.current.contains(event.target as Node)) {\r\n handler();\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n };\r\n }, [ref, handler]);\r\n};\r\n\r\nexport default useOutsideClick;\r\n","import React, { useState, useRef, useEffect } from \"react\";\r\nimport {\r\n ChangeLayoutIcon,\r\n SortingIcon,\r\n FilterationIcon,\r\n HideColumnIcon,\r\n} from \"../../../assets/svg.tsx\";\r\nimport { Box, Popover } from \"@mui/material\";\r\nimport LayoutSelector from \"../table-change-layout.tsx\";\r\nimport { Table } from \"@tanstack/react-table\";\r\nimport { TopbarOptionsProps } from \"../../types/table.ts\";\r\nimport \"./index.scss\";\r\nimport ViewMore from \"../viewmore/index.tsx\";\r\nimport { useFullscreenPopoverContainer } from \"../../libs/hooks/useFullScreen.tsx\";\r\nimport SortPopover from \"../sorting-modal.tsx/index.tsx\";\r\nimport ColumnToggle from \"../column-visibility-modal/index.tsx\";\r\nimport { CraftTableOptionsProps } from \"../../types/table-options.ts\";\r\nimport { TableSearch } from \"../search/index.tsx\";\r\n\r\ninterface TopbarProps<T> {\r\n table: Table<T>;\r\n isFullscreen: boolean;\r\n fullscreenToggle: () => void;\r\n isCompactTable: boolean;\r\n setIsCompactTable: React.Dispatch<React.SetStateAction<boolean>>;\r\n paginationComponent?: React.ReactNode;\r\n topbarOptions?: TopbarOptionsProps;\r\n columnOrder?: string[];\r\n setColumnOrder?: React.Dispatch<React.SetStateAction<string[]>>;\r\n tableStates: CraftTableOptionsProps;\r\n searchValue?: string;\r\n onSearchChange?: (val: string) => void;\r\n onFilterButtonClick?: () => void;\r\n}\r\n\r\nfunction Topbar<T>({\r\n table,\r\n isCompactTable,\r\n isFullscreen,\r\n fullscreenToggle,\r\n setIsCompactTable,\r\n paginationComponent,\r\n topbarOptions,\r\n tableStates,\r\n onFilterButtonClick,\r\n}: TopbarProps<T>) {\r\n const [sortAnchorEl, setSortAnchorEl] = useState<HTMLElement | null>(null);\r\n const [groupBy, setGroupBy] = useState<string>(\"None\");\r\n\r\n const [layoutAnchorEl, setLayoutAnchorEl] = useState<null | HTMLElement>(\r\n null\r\n );\r\n const [selectedLayout, setSelectedLayout] = useState(\"Table\");\r\n const [columnAnchorEl, setColumnAnchorEl] = useState<HTMLElement | null>(\r\n null\r\n );\r\n const [columnOrder, setColumnOrder] = useState<string[]>(\r\n table.getAllLeafColumns().map((col) => col.id)\r\n );\r\n\r\n const searchContainerRef = useRef<HTMLDivElement>(null);\r\n\r\n // sync column order with table instance\r\n useEffect(() => {\r\n table.setColumnOrder(columnOrder);\r\n }, [columnOrder]);\r\n\r\n useEffect(() => {\r\n if (isFullscreen) {\r\n // Close all popovers when fullscreen is enabled\r\n setLayoutAnchorEl(null);\r\n setSortAnchorEl(null);\r\n setColumnAnchorEl(null);\r\n setViewMoreAnchorEl(null);\r\n }\r\n }, [isFullscreen]);\r\n\r\n const {\r\n leftSideComponent,\r\n rightSideComponent,\r\n showColumnToggle,\r\n showChangeLayoutToggle,\r\n showSortingToggle,\r\n showFilterToggle,\r\n showSearch,\r\n searchValue,\r\n onSearchChange,\r\n } = topbarOptions ?? {};\r\n\r\n const { container: fullscreenContainer } = useFullscreenPopoverContainer();\r\n\r\n const handleLayoutSelect = (layout: string) => {\r\n setSelectedLayout(layout);\r\n setLayoutAnchorEl(null);\r\n };\r\n\r\n useEffect(() => {\r\n const handleExternalLayoutTrigger = (e: Event) => {\r\n const target = (e as CustomEvent).detail?.target as HTMLElement;\r\n setLayoutAnchorEl(target);\r\n };\r\n\r\n const handleExternalFilterTrigger = () => {\r\n onFilterButtonClick?.();\r\n };\r\n\r\n const handleExternalViewMoreTrigger = (e: Event) => {\r\n const target = (e as CustomEvent).detail?.target as HTMLElement;\r\n if (target) setViewMoreAnchorEl(target);\r\n };\r\n\r\n const handleExternalSearchTrigger = () => {\r\n setTimeout(() => {\r\n searchContainerRef.current?.querySelector(\"input\")?.focus();\r\n }, 100);\r\n };\r\n\r\n window.addEventListener(\r\n \"triggerLayoutPopover\",\r\n handleExternalLayoutTrigger\r\n );\r\n window.addEventListener(\"triggerFilterButton\", handleExternalFilterTrigger);\r\n window.addEventListener(\"triggerViewMore\", handleExternalViewMoreTrigger);\r\n window.addEventListener(\"triggerSearchInput\", handleExternalSearchTrigger); // ✅\r\n\r\n return () => {\r\n window.removeEventListener(\r\n \"triggerLayoutPopover\",\r\n handleExternalLayoutTrigger\r\n );\r\n window.removeEventListener(\r\n \"triggerFilterButton\",\r\n handleExternalFilterTrigger\r\n );\r\n window.removeEventListener(\r\n \"triggerViewMore\",\r\n handleExternalViewMoreTrigger\r\n );\r\n window.removeEventListener(\r\n \"triggerSearchInput\",\r\n handleExternalSearchTrigger\r\n ); // ✅\r\n };\r\n }, [onFilterButtonClick]);\r\n\r\n const [viewMoreAnchorEl, setViewMoreAnchorEl] = useState<HTMLElement | null>(\r\n null\r\n );\r\n\r\n const isViewMoreOpen = Boolean(viewMoreAnchorEl);\r\n\r\n return (\r\n <div className=\"ts-topbar\">\r\n <div className=\"tabs-section\">\r\n <div style={{ overflowX: \"auto\", whiteSpace: \"nowrap\" }}>\r\n {leftSideComponent}\r\n </div>\r\n </div>\r\n\r\n <div className=\"right-section\">\r\n {rightSideComponent}\r\n {paginationComponent}\r\n\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 0.5,\r\n }}\r\n >\r\n {showSearch && (\r\n <Box\r\n title=\"Search\"\r\n className=\"external-search-trigger\"\r\n onClick={() => {\r\n const customEvent = new CustomEvent(\"triggerSearchInput\");\r\n window.dispatchEvent(customEvent);\r\n }}\r\n ref={searchContainerRef}\r\n >\r\n <TableSearch\r\n value={searchValue ?? \"\"}\r\n onChange={onSearchChange ?? (() => {})}\r\n />\r\n </Box>\r\n )}\r\n\r\n {showChangeLayoutToggle && (\r\n <>\r\n <div className=\"change-layout ts--button\" title=\"Layout\">\r\n <div\r\n onClick={(e) => {\r\n const customEvent = new CustomEvent(\r\n \"triggerLayoutPopover\",\r\n {\r\n detail: { target: e.currentTarget },\r\n }\r\n );\r\n window.dispatchEvent(customEvent);\r\n }}\r\n className=\"external-layout-trigger\"\r\n >\r\n <ChangeLayoutIcon />\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n <Popover\r\n open={Boolean(layoutAnchorEl)}\r\n anchorEl={layoutAnchorEl}\r\n onClose={() => setLayoutAnchorEl(null)}\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"left\" }}\r\n container={fullscreenContainer}\r\n sx={{\r\n mt: 2.2,\r\n }}\r\n >\r\n <LayoutSelector\r\n onSelect={handleLayoutSelect}\r\n selectedLayout={selectedLayout}\r\n />\r\n </Popover>\r\n {showColumnToggle && (\r\n <>\r\n <div\r\n className=\"hide-column ts--button\"\r\n onClick={(e) => setColumnAnchorEl(e.currentTarget)}\r\n title=\"Column\"\r\n >\r\n <HideColumnIcon />\r\n </div>\r\n <ColumnToggle\r\n anchorEl={columnAnchorEl}\r\n onClose={() => setColumnAnchorEl(null)}\r\n table={table}\r\n columnOrder={columnOrder}\r\n setColumnOrder={setColumnOrder}\r\n />\r\n </>\r\n )}\r\n\r\n {showSortingToggle && (\r\n <>\r\n <div\r\n className=\"filter ts--button\"\r\n title=\"Sort\"\r\n onClick={(e) => setSortAnchorEl(e.currentTarget)}\r\n >\r\n <SortingIcon />\r\n </div>\r\n <SortPopover\r\n anchorEl={sortAnchorEl}\r\n onClose={() => setSortAnchorEl(null)}\r\n columns={table.getAllLeafColumns().map((col) => ({\r\n id: col.id,\r\n label: (col.columnDef.meta as any)?.label || col.id,\r\n }))}\r\n onChange={(sortingRules) => table.setSorting(sortingRules)}\r\n />\r\n </>\r\n )}\r\n\r\n {/* {showFilterToggle && (\r\n <div\r\n className=\"filter ts--button\"\r\n title=\"Filter\"\r\n onClick={onFilterButtonClick}\r\n style={{\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n backgroundColor:\r\n tableStates.showTableFilter || tableStates.filters.length > 0\r\n ? \"#e8e2fb\"\r\n : \"transparent\",\r\n height: \"25px\",\r\n width: \"25px\",\r\n borderRadius: \"6px\",\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n <FilterationIcon\r\n color={\r\n tableStates.showTableFilter || tableStates.filters.length > 0\r\n ? \"#7A5AF8\"\r\n : \"#1C1B1F\"\r\n }\r\n />\r\n </div>\r\n )} */}\r\n\r\n {showFilterToggle && (\r\n <div\r\n className=\"filter ts--button\"\r\n title=\"Filter\"\r\n onClick={onFilterButtonClick}\r\n style={{\r\n position: \"relative\",\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n backgroundColor:\r\n tableStates.showTableFilter || tableStates.filters.length > 0\r\n ? \"#eae4fe\"\r\n : \"transparent\",\r\n height: \"25px\",\r\n width: \"25px\",\r\n borderRadius: \"6px\",\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n <FilterationIcon\r\n color={\r\n tableStates.showTableFilter || tableStates.filters.length > 0\r\n ? \"#7A5AF8\"\r\n : \"#1C1B1F\"\r\n }\r\n />\r\n\r\n {tableStates.filters.length > 0 &&\r\n !tableStates.showTableFilter && (\r\n <span\r\n style={{\r\n position: \"absolute\",\r\n top: \"1px\",\r\n right: \"1px\",\r\n width: \"6px\",\r\n height: \"6px\",\r\n borderRadius: \"50%\",\r\n backgroundColor: \"#F63D68\",\r\n }}\r\n />\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* {viewMoreToggle && (\r\n <div className=\"view-more ts--button\" title=\"View More\">\r\n <ViewMore\r\n compactMode={isCompactTable}\r\n onCompactToggle={(value: string) =>\r\n setIsCompactTable(value === \"Compact\")\r\n }\r\n isFullscreen={isFullscreen}\r\n onFullscreenToggle={fullscreenToggle}\r\n groupBy={groupBy}\r\n onGroupByChange={(value: string) => setGroupBy(value)}\r\n tableStates={tableStates}\r\n />\r\n </div>\r\n )} */}\r\n {/* {viewMoreToggle && (\r\n <div\r\n className=\"view-more ts--button view-more-trigger\"\r\n title=\"View More\"\r\n >\r\n <ViewMore\r\n compactMode={isCompactTable}\r\n onCompactToggle={(value: string) =>\r\n setIsCompactTable(value === \"Compact\")\r\n }\r\n isFullscreen={isFullscreen}\r\n onFullscreenToggle={fullscreenToggle}\r\n groupBy={groupBy}\r\n onGroupByChange={(value: string) => setGroupBy(value)}\r\n tableStates={tableStates}\r\n />\r\n </div>\r\n )} */}\r\n <Popover\r\n open={isViewMoreOpen}\r\n anchorEl={viewMoreAnchorEl}\r\n onClose={() => setViewMoreAnchorEl(null)}\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"left\" }}\r\n transformOrigin={{ vertical: \"top\", horizontal: \"left\" }}\r\n container={fullscreenContainer}\r\n // PaperProps={{\r\n // sx: {\r\n // mt: 2,\r\n // padding: 0,\r\n // width: 380,\r\n // borderRadius: 1,\r\n // boxShadow: 4,\r\n // },\r\n // }}\r\n >\r\n <ViewMore\r\n compactMode={isCompactTable}\r\n onCompactToggle={(value: string) =>\r\n setIsCompactTable(value === \"Compact\")\r\n }\r\n isFullscreen={isFullscreen}\r\n onFullscreenToggle={fullscreenToggle}\r\n groupBy={groupBy}\r\n onGroupByChange={(value: string) => setGroupBy(value)}\r\n tableStates={tableStates}\r\n onClose={() => setViewMoreAnchorEl(null)}\r\n />\r\n </Popover>\r\n </Box>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default Topbar;\r\n","import { styled } from \"@mui/material/styles\";\r\nimport { Box, IconButton, Select, InputBase } from \"@mui/material\";\r\n\r\n/* Root container */\r\nexport const PaginationContainer = styled(Box)(({ theme }) => ({\r\n padding: theme.spacing(0.5),\r\n display: \"flex\",\r\n justifyContent: \"flex-end\",\r\n alignItems: \"center\",\r\n gap: theme.spacing(2),\r\n fontSize: theme.typography.pxToRem(14),\r\n backgroundColor: theme.palette.common.white,\r\n\r\n [theme.breakpoints.down(\"md\")]: {\r\n justifyContent: \"center\",\r\n fontSize: theme.typography.pxToRem(12),\r\n },\r\n}));\r\n\r\n/* Hide go-to-page on <= 991px */\r\nexport const GoToPageContainer = styled(Box)(({ theme }) => ({\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n\r\n [theme.breakpoints.down(\"md\")]: {\r\n display: \"none\",\r\n },\r\n}));\r\n\r\n/* Rows per page */\r\nexport const RowsPerPageContainer = styled(Box)(({ theme }) => ({\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n\r\n [theme.breakpoints.down(\"sm\")]: {\r\n display: \"none\",\r\n },\r\n}));\r\n\r\n/* Records range */\r\nexport const RecordsRangeContainer = styled(Box)(({ theme }) => ({\r\n whiteSpace: \"nowrap\",\r\n fontSize: theme.typography.pxToRem(14),\r\n\r\n [theme.breakpoints.down(\"sm\")]: {\r\n display: \"none\",\r\n },\r\n}));\r\n\r\n/* Page range */\r\nexport const PageRangeContainer = styled(Box)(({ theme }) => ({\r\n whiteSpace: \"nowrap\",\r\n fontSize: theme.typography.pxToRem(14),\r\n}));\r\n\r\n/* Buttons wrapper */\r\nexport const PaginationButtons = styled(Box)(({ theme }) => ({\r\n display: \"flex\",\r\n gap: theme.spacing(1),\r\n}));\r\n\r\n/* Pagination button */\r\nexport const PaginationButton = styled(IconButton)(({ theme }) => ({\r\n borderRadius: \"50%\",\r\n height: 24,\r\n width: 24,\r\n padding: 2,\r\n transition: \"0.4s\",\r\n\r\n \"&:hover\": {\r\n backgroundColor: theme.palette.grey[300],\r\n boxShadow: \"0 1px 2px 0 rgba(60,64,67,.6), 0 1px 3px 1px rgba(60,64,67,.3)\",\r\n },\r\n\r\n \"&.Mui-disabled\": {\r\n color: theme.palette.action.disabled,\r\n },\r\n\r\n [theme.breakpoints.down(\"sm\")]: {\r\n height: 24,\r\n width: 24,\r\n padding: 0,\r\n\r\n \"& svg\": {\r\n width: 20,\r\n height: 20,\r\n },\r\n },\r\n}));\r\n\r\n/* Select (rows per page) */\r\nexport const RowsPerPageSelect = styled(Select)(({ theme }) => ({\r\n borderRadius: theme.shape.borderRadius,\r\n padding: theme.spacing(0),\r\n fontSize: theme.typography.pxToRem(12),\r\n\r\n \"& .MuiSelect-select\": {\r\n fontSize: theme.typography.pxToRem(12),\r\n padding: theme.spacing(0.5, 0.75),\r\n },\r\n}));\r\n\r\n/* Input for go-to-page */\r\nexport const GoToPageInput = styled(InputBase)(({ theme }) => ({\r\n width: 60,\r\n textAlign: \"center\",\r\n borderRadius: theme.shape.borderRadius,\r\n border: `1px solid ${theme.palette.divider}`,\r\n fontSize: theme.typography.pxToRem(12),\r\n\r\n \"& .MuiInputBase-input\": {\r\n fontSize: theme.typography.pxToRem(12),\r\n padding: theme.spacing(0.25, 0.75),\r\n },\r\n}));\r\n","import { Table } from \"@tanstack/react-table\";\r\nimport { TableFirstPageIcon, TableLastPageIcon } from \"../../../../assets/svg\";\r\nimport NavigateBeforeRounded from \"@mui/icons-material/NavigateBeforeRounded\";\r\nimport NavigateNextRounded from \"@mui/icons-material/NavigateNextRounded\";\r\nimport { MenuItem, Typography } from \"@mui/material\";\r\nimport { CraftTablePaginationProps } from \"../../../types/table\";\r\nimport {\r\n PaginationContainer,\r\n GoToPageContainer,\r\n RowsPerPageContainer,\r\n RecordsRangeContainer,\r\n PageRangeContainer,\r\n PaginationButtons,\r\n PaginationButton,\r\n RowsPerPageSelect,\r\n GoToPageInput,\r\n} from \"./pagination.styles\";\r\n\r\ninterface DefaultPaginationProps<T> {\r\n table: Table<T>;\r\n rowsPerPageArray: number[];\r\n paginationOptions?: CraftTablePaginationProps;\r\n}\r\n\r\nfunction DefaultPagination<T>({\r\n table,\r\n rowsPerPageArray,\r\n paginationOptions,\r\n}: DefaultPaginationProps<T>) {\r\n const pageIndex = table.getState().pagination.pageIndex + 1;\r\n const pageCount = table.getPageCount();\r\n const pageSize = table.getState().pagination.pageSize;\r\n const rowCount = table.getRowCount();\r\n\r\n const recordsRangeFirst = pageIndex * pageSize - pageSize + 1;\r\n const recordsRangeLast = Math.min(pageIndex * pageSize, rowCount);\r\n\r\n const isFullView = paginationOptions?.paginationView === \"full\";\r\n\r\n return (\r\n <PaginationContainer>\r\n {isFullView && (\r\n <GoToPageContainer>\r\n <Typography variant=\"body2\" fontSize={14} mr={1}>\r\n Go to page:\r\n </Typography>\r\n <GoToPageInput\r\n defaultValue={pageIndex}\r\n type=\"number\"\r\n inputProps={{\r\n name: \"pagination-size\",\r\n min: 1,\r\n max: pageCount,\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n const page = e.currentTarget.value\r\n ? Number(e.currentTarget.value) - 1\r\n : 0;\r\n table.setPageIndex(page);\r\n }\r\n }}\r\n />\r\n </GoToPageContainer>\r\n )}\r\n\r\n <RowsPerPageContainer>\r\n {isFullView && (\r\n <Typography variant=\"body2\" fontSize={14} mr={1}>\r\n Rows per page:\r\n </Typography>\r\n )}\r\n <RowsPerPageSelect\r\n value={pageSize}\r\n onChange={(e) => table.setPageSize(Number(e.target.value))}\r\n >\r\n {rowsPerPageArray.map((size) => (\r\n <MenuItem key={size} value={size} sx={{ fontSize: 12 }}>\r\n {size}\r\n </MenuItem>\r\n ))}\r\n </RowsPerPageSelect>\r\n </RowsPerPageContainer>\r\n\r\n <RecordsRangeContainer>\r\n <strong>\r\n {recordsRangeFirst} – {recordsRangeLast} of {rowCount}\r\n </strong>\r\n </RecordsRangeContainer>\r\n\r\n {isFullView && (\r\n <PageRangeContainer>\r\n <strong>\r\n Page {pageIndex} of {pageCount}\r\n </strong>\r\n </PageRangeContainer>\r\n )}\r\n\r\n <PaginationButtons>\r\n {isFullView && (\r\n <PaginationButton\r\n title=\"First Page\"\r\n disabled={!table.getCanPreviousPage()}\r\n onClick={() => table.setPageIndex(0)}\r\n >\r\n <TableFirstPageIcon />\r\n </PaginationButton>\r\n )}\r\n\r\n <PaginationButton\r\n title=\"Previous Page\"\r\n disabled={!table.getCanPreviousPage()}\r\n onClick={() => table.previousPage()}\r\n >\r\n <NavigateBeforeRounded fontSize=\"small\" />\r\n </PaginationButton>\r\n\r\n <PaginationButton\r\n title=\"Next Page\"\r\n disabled={!table.getCanNextPage()}\r\n onClick={() => table.nextPage()}\r\n >\r\n <NavigateNextRounded fontSize=\"small\" />\r\n </PaginationButton>\r\n\r\n {isFullView && (\r\n <PaginationButton\r\n title=\"Last Page\"\r\n disabled={!table.getCanNextPage()}\r\n onClick={() => table.setPageIndex(pageCount - 1)}\r\n >\r\n <TableLastPageIcon />\r\n </PaginationButton>\r\n )}\r\n </PaginationButtons>\r\n </PaginationContainer>\r\n );\r\n}\r\n\r\nexport default DefaultPagination;\r\n","import { Column } from \"@tanstack/react-table\";\r\nimport { alignProps } from \"../../types/common\";\r\nimport { CSSProperties } from \"react\";\r\nimport axios from \"axios\";\r\n\r\nexport const formatClassName = (className: string): string => {\r\n return className.replace(/\\s+/g, \" \").trim();\r\n};\r\n\r\nexport const getColumnAlignment = (align: string) => {\r\n const contentAlignment = {\r\n left: \"flex-start\",\r\n center: \"center\",\r\n right: \"flex-end\",\r\n };\r\n\r\n const alignment = contentAlignment[(align as alignProps) || \"left\"];\r\n return alignment;\r\n};\r\n\r\nexport const getColumnPinningStyles = <T>(column: Column<T>): CSSProperties => {\r\n const isPinned = column.getIsPinned();\r\n const isLastLeftPinnedColumn =\r\n isPinned === \"left\" && column.getIsLastColumn(\"left\");\r\n const isFirstRightPinnedColumn =\r\n isPinned === \"right\" && column.getIsFirstColumn(\"right\");\r\n\r\n return {\r\n boxShadow: isLastLeftPinnedColumn\r\n ? \"-4px 0 4px -4px gray inset\"\r\n : isFirstRightPinnedColumn\r\n ? \"4px 0 4px -4px gray inset\"\r\n : undefined,\r\n background: \"inherit\",\r\n left: isPinned === \"left\" ? `${column.getStart(\"left\")}px` : undefined,\r\n right: isPinned === \"right\" ? `${column.getAfter(\"right\")}px` : undefined,\r\n position: isPinned ? \"sticky\" : \"relative\",\r\n width: column.getSize(),\r\n };\r\n};\r\n\r\nexport const getColumnPinningStylesBody = <T>(\r\n column: Column<T>\r\n): CSSProperties => {\r\n const isPinned = column.getIsPinned();\r\n const isLastLeftPinnedColumn =\r\n isPinned === \"left\" && column.getIsLastColumn(\"left\");\r\n const isFirstRightPinnedColumn =\r\n isPinned === \"right\" && column.getIsFirstColumn(\"right\");\r\n\r\n return {\r\n boxShadow: isLastLeftPinnedColumn\r\n ? \"-4px 0 4px -4px gray inset\"\r\n : isFirstRightPinnedColumn\r\n ? \"4px 0 4px -4px gray inset\"\r\n : undefined,\r\n background: \"inherit\",\r\n left: isPinned === \"left\" ? `${column.getStart(\"left\")}px` : undefined,\r\n right: isPinned === \"right\" ? `${column.getAfter(\"right\")}px` : undefined,\r\n position: isPinned ? \"sticky\" : \"relative\",\r\n width: column.getSize(),\r\n };\r\n};\r\n\r\nexport function customDebounce<T extends (...args: any[]) => any>(\r\n func: T,\r\n delay: number\r\n): (...args: Parameters<T>) => void {\r\n let timerId: ReturnType<typeof setTimeout> | null = null;\r\n\r\n return function (this: ThisParameterType<T>, ...args: Parameters<T>): void {\r\n if (timerId) clearTimeout(timerId);\r\n timerId = setTimeout(() => {\r\n func.apply(this, args);\r\n }, delay);\r\n };\r\n}\r\n\r\n//ENTITY TYPE\r\nconst ENVIRONMENT = \"crm_dev\";\r\nexport const ENTITY_TYPE = \"LEAD\";\r\nexport const MODULE_CODE = \"school_adm_org\";\r\nexport const MAPPED_ENTITY_TYPE = \"LYPR\"; // LAP OR LYPR\r\nexport const USER_ID = 226;\r\nexport const APP_CODE = \"crm\";\r\n\r\nconst environments = {\r\n adm_dev: \"http://localhost:6010/api\",\r\n crm_dev: \"http://localhost:6011/api\",\r\n uat: \"https://api.eth-qa.rezolut.in/api/enrol\",\r\n};\r\n\r\nconst getBaseUrl = () => environments[ENVIRONMENT];\r\n\r\n// API INTEGRATION\r\nexport const api = axios.create({\r\n baseURL: getBaseUrl(),\r\n timeout: 10000,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n});\r\n\r\napi.interceptors.request.use(\r\n (config) => {\r\n const token = localStorage.getItem(\"authToken\");\r\n if (token) {\r\n config.headers.Authorization = `Bearer ${token}`;\r\n }\r\n return config;\r\n },\r\n (error) => {\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\nexport const formatTableHeaders = (columns: any) => {\r\n const mapped = columns.map((col: any) => {\r\n const meta =\r\n col.attribute_key === \"status\" ||\r\n col.attribute_key === \"lead_status\" ||\r\n col.attribute_key === \"flag\" ||\r\n col.attribute_key === \"invitation_status\"\r\n ? { type: \"custom\", propName: \"renderStatus\", align: col.align }\r\n : col.attribute_key === \"profile_image\" ||\r\n col.attribute_key === \"short_logo\"\r\n ? {\r\n type: \"custom\",\r\n propName: \"profileImageFetch\",\r\n align: col.align,\r\n }\r\n : col.attribute_key === \"start_date\" || col.attribute_key === \"end_date\"\r\n ? { type: \"custom\", propName: \"dateFormater\", align: col.align }\r\n : col.attribute_key === \"action\"\r\n ? { type: \"custom\", propName: \"renderAction\", align: col.align }\r\n : col.attribute_key === \"code\"\r\n ? {\r\n type: \"custom\",\r\n propName: \"drillCellRenderer\",\r\n align: col.align,\r\n }\r\n : col.attribute_key === \"primary_mobile\"\r\n ? {\r\n type: \"custom\",\r\n propName: \"apiCallonClick\",\r\n align: col.align,\r\n }\r\n : undefined;\r\n\r\n return {\r\n header: col.name ?? \"\",\r\n accessorKey: col.attribute_key ?? \"\",\r\n size: col.size,\r\n meta,\r\n };\r\n });\r\n\r\n return mapped;\r\n};\r\n","import { styled } from \"@mui/material\";\r\n\r\nexport const TableBodyRow = styled(\"tr\", {\r\n shouldForwardProp: (prop) =>\r\n prop !== \"hoverable\" &&\r\n prop !== \"selected\" &&\r\n prop !== \"striped\" &&\r\n prop !== \"expanded\",\r\n})<{\r\n hoverable?: boolean;\r\n selected?: boolean;\r\n striped?: boolean;\r\n expanded?: boolean;\r\n}>(({ theme, hoverable, selected, striped }) => ({\r\n backgroundColor: selected\r\n ? theme.palette.action.selected\r\n : theme.palette.background.paper,\r\n\r\n ...(striped && {\r\n \"&:nth-of-type(odd)\": {\r\n backgroundColor:\r\n theme.palette.mode === \"dark\"\r\n ? theme.palette.action.hover\r\n : theme.palette.grey[50],\r\n },\r\n }),\r\n\r\n ...(hoverable && {\r\n transition: \"background-color 0.2s ease, box-shadow 0.2s ease\",\r\n \"&:hover\": {\r\n boxShadow: `inset 0 2px 2px rgba(0,0,0,0.05),\r\n inset 0 -2px 2px rgba(0,0,0,0.05)`,\r\n },\r\n }),\r\n}));\r\n\r\nexport const TableBodyCell = styled(\"td\", {\r\n shouldForwardProp: (prop) =>\r\n prop !== \"compact\" &&\r\n prop !== \"isDragging\" &&\r\n prop !== \"isPinned\" &&\r\n prop !== \"wrap\",\r\n})<{\r\n compact?: boolean;\r\n isDragging?: boolean;\r\n isPinned?: boolean;\r\n wrap?: boolean;\r\n}>(({ theme, compact, isDragging, wrap }) => ({\r\n fontSize: theme.typography.pxToRem(14),\r\n padding: compact ? theme.spacing(0.5, 0.75) : theme.spacing(0.75, 1.25),\r\n borderBottom: `1px solid ${theme.palette.grey[200]}`,\r\n\r\n ...(wrap && {\r\n wordBreak: \"break-all\",\r\n whiteSpace: \"normal\",\r\n }),\r\n\r\n ...(isDragging && {\r\n opacity: 0.85,\r\n backgroundColor: theme.palette.action.hover,\r\n }),\r\n}));\r\n","import { useSortable } from \"@dnd-kit/sortable\";\r\nimport { CSS } from \"@dnd-kit/utilities\";\r\nimport { Cell, flexRender } from \"@tanstack/react-table\";\r\nimport { align } from \"../../types/common\";\r\nimport { getColumnPinningStylesBody } from \"../../libs/utils/common\";\r\nimport {\r\n CraftTableFeatureProps,\r\n CraftTableOptionsProps,\r\n} from \"../../types/table-options\";\r\nimport { TableBodyCell } from \"./table-body.styles\";\r\n\r\ninterface DragAlongCellProps<T> {\r\n cell: Cell<T, unknown>;\r\n featureOptions: CraftTableFeatureProps;\r\n tableStates: CraftTableOptionsProps;\r\n}\r\n\r\nfunction DragAlongCell<T>({\r\n cell,\r\n // featureOptions,\r\n tableStates,\r\n}: DragAlongCellProps<T>) {\r\n const { isDragging, setNodeRef, transform } = useSortable({\r\n id: cell.column.id,\r\n });\r\n // const { enableWordBreakAll } = featureOptions;\r\n const { wrapColumns } = tableStates;\r\n\r\n const isPinned = cell.column.getIsPinned();\r\n\r\n return (\r\n <TableBodyCell\r\n ref={setNodeRef}\r\n align={(cell.column.columnDef.meta as align)?.align || \"left\"}\r\n style={{\r\n opacity: isDragging ? 0.8 : 1,\r\n transform: CSS.Translate.toString(transform),\r\n transition: \"width transform 0.2s ease-in-out\",\r\n width: cell.column.getSize(),\r\n ...getColumnPinningStylesBody(cell.column),\r\n ...((wrapColumns.all_wrap || wrapColumns[cell.column.id]) && {\r\n wordBreak: \"break-all\",\r\n whiteSpace: \"normal\",\r\n }),\r\n zIndex: isPinned ? 2 : isDragging ? 1 : 0,\r\n }}\r\n >\r\n {cell.getIsPlaceholder()\r\n ? null\r\n : flexRender(cell.column.columnDef.cell, cell.getContext())}\r\n </TableBodyCell>\r\n );\r\n}\r\n\r\nexport default DragAlongCell;\r\n","import React, { useEffect, useRef } from \"react\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\n\r\ninterface CheckboxProps {\r\n type?: \"checkbox\";\r\n checked: boolean;\r\n disabled?: boolean;\r\n onChange: (checked: boolean) => void;\r\n indeterminate?: boolean;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nconst Checkbox = ({\r\n checked = false,\r\n disabled = false,\r\n onChange = () => {},\r\n indeterminate = false,\r\n className,\r\n style,\r\n ...props\r\n}: CheckboxProps) => {\r\n const id = uuidv4();\r\n const [check, setCheck] = React.useState<boolean>(checked);\r\n const ref = useRef(null);\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const isChecked = e.target.checked;\r\n setCheck(isChecked);\r\n\r\n if (onChange) onChange(isChecked);\r\n };\r\n\r\n useEffect(() => {\r\n setCheck(checked);\r\n }, [checked]);\r\n\r\n useEffect(() => {\r\n if (ref.current) {\r\n (ref.current as HTMLInputElement).indeterminate = indeterminate;\r\n }\r\n }, [indeterminate]);\r\n\r\n return (\r\n <input\r\n id={id}\r\n ref={ref}\r\n type=\"checkbox\"\r\n checked={check}\r\n onChange={handleChange}\r\n disabled={disabled}\r\n className={className}\r\n {...props}\r\n />\r\n );\r\n};\r\n\r\nexport default Checkbox;\r\n","import React from \"react\";\r\nimport {\r\n ColumnOrderState,\r\n flexRender,\r\n Row,\r\n Table,\r\n} from \"@tanstack/react-table\";\r\nimport {\r\n CraftTableFeatureProps,\r\n CraftTableOptionsProps,\r\n} from \"../../types/table-options\";\r\nimport { align } from \"../../types/common\";\r\nimport DragAlongCell from \"./table-body-dnd-cell\";\r\nimport {\r\n horizontalListSortingStrategy,\r\n SortableContext,\r\n} from \"@dnd-kit/sortable\";\r\nimport { getColumnPinningStylesBody } from \"../../libs/utils/common\";\r\nimport Checkbox from \"../inputs/checkbox\";\r\nimport { TableBodyCell, TableBodyRow } from \"./table-body.styles\";\r\n\r\ninterface TableBodyProps<T> {\r\n table: Table<T>;\r\n featureOptions: CraftTableFeatureProps;\r\n NestedComponent?: React.ComponentType<{ row: Row<T> }>;\r\n columnOrder: ColumnOrderState;\r\n tableStates: CraftTableOptionsProps;\r\n}\r\n\r\nfunction TableBody<T>({\r\n table,\r\n featureOptions,\r\n NestedComponent,\r\n columnOrder,\r\n tableStates,\r\n}: TableBodyProps<T>) {\r\n const { enableColumnReordering, enableRowSelection } = featureOptions;\r\n\r\n const { wrapColumns } = tableStates;\r\n\r\n const renderRow = (row: Row<T>) => {\r\n const renderedRow = (\r\n <TableBodyRow\r\n key={row?.id}\r\n hoverable\r\n striped={featureOptions.striped}\r\n selected={row.getIsSelected()}\r\n expanded={row.getIsExpanded()}\r\n >\r\n {enableRowSelection && (\r\n <TableBodyCell\r\n style={{\r\n position: \"sticky\",\r\n left: 0,\r\n width: \"50px\",\r\n }}\r\n >\r\n <Checkbox\r\n checked={row.getIsSelected()}\r\n indeterminate={row.getIsSomeSelected()}\r\n onChange={row.getToggleSelectedHandler()}\r\n className=\"checkbox__input\"\r\n />\r\n </TableBodyCell>\r\n )}\r\n\r\n {row?.getVisibleCells()?.map((cell) => {\r\n return enableColumnReordering ? (\r\n <SortableContext\r\n key={cell.id}\r\n items={columnOrder}\r\n strategy={horizontalListSortingStrategy}\r\n >\r\n <DragAlongCell\r\n cell={cell}\r\n featureOptions={featureOptions}\r\n tableStates={tableStates}\r\n />\r\n </SortableContext>\r\n ) : (\r\n <TableBodyCell\r\n style={{\r\n ...getColumnPinningStylesBody(cell.column),\r\n width: cell.column.getSize(),\r\n ...((wrapColumns.all_wrap || wrapColumns[cell.column.id]) && {\r\n wordBreak: \"break-all\",\r\n whiteSpace: \"normal\",\r\n }),\r\n }}\r\n align={(cell.column.columnDef.meta as align)?.align || \"left\"}\r\n >\r\n {flexRender(cell?.column?.columnDef?.cell, cell?.getContext())}\r\n </TableBodyCell>\r\n );\r\n })}\r\n </TableBodyRow>\r\n );\r\n\r\n if (row.getIsExpanded()) {\r\n return (\r\n <React.Fragment key={row.id}>\r\n {renderedRow}\r\n {NestedComponent && (\r\n <TableBodyRow\r\n hoverable\r\n striped={featureOptions.striped}\r\n selected={row.getIsSelected()}\r\n expanded={row.getIsExpanded()}\r\n >\r\n {<NestedComponent {...{ row }} />}\r\n </TableBodyRow>\r\n )}\r\n </React.Fragment>\r\n );\r\n } else {\r\n return renderedRow;\r\n }\r\n };\r\n\r\n return (\r\n <tbody>{table?.getRowModel()?.rows?.map((row) => renderRow(row))}</tbody>\r\n );\r\n}\r\n\r\nexport default TableBody;\r\n","// columnResize.styles.ts\r\nimport { Box } from \"@mui/material\";\r\nimport { styled } from \"@mui/material/styles\";\r\n\r\nexport const ColumnResizeHandle = styled(Box, {\r\n shouldForwardProp: (prop) => prop !== \"isResizing\",\r\n})<{ isResizing?: boolean }>(({ theme, isResizing }) => ({\r\n position: \"absolute\",\r\n top: 0,\r\n right: 0,\r\n height: \"100%\",\r\n width: theme.spacing(0.5),\r\n cursor: \"col-resize\",\r\n userSelect: \"none\",\r\n touchAction: \"none\",\r\n opacity: isResizing ? 1 : 0,\r\n background: isResizing ? \"rgba(0, 0, 0, 0.8)\" : \"rgba(0, 0, 0, 0.5)\",\r\n\r\n \"&:hover\": {\r\n opacity: 1,\r\n },\r\n}));\r\n\r\nexport const TableHeadButton = styled(Box)(({ theme }) => ({\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n cursor: \"pointer\",\r\n transition: \"transform 0.15s ease\",\r\n\r\n \"&:hover\": {\r\n transform: \"scale(1.1)\",\r\n },\r\n\r\n \"& svg\": {\r\n color: theme.palette.grey[700],\r\n },\r\n}));\r\n\r\nexport const TableHeadSort = styled(Box, {\r\n shouldForwardProp: (prop) => prop !== \"sortable\",\r\n})<{ sortable?: boolean }>(({ theme, sortable }) => ({\r\n userSelect: sortable ? \"none\" : \"auto\",\r\n fontSize: theme.typography.pxToRem(14),\r\n\r\n \"& svg\": {\r\n marginLeft: \"0.25rem\",\r\n },\r\n}));\r\n\r\nexport const TableDndButton = styled(Box)(({ theme }) => ({\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n color: theme.palette.grey[600],\r\n cursor: \"grab\",\r\n transition: \"transform 0.15s ease, color 0.15s ease\",\r\n\r\n \"&:hover\": {\r\n transform: \"scale(1.1)\",\r\n color: theme.palette.grey[900],\r\n cursor: \"grabbing\",\r\n },\r\n}));\r\n\r\nexport const TableHeadContent = styled(Box)(({ theme }) => ({\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n gap: theme.spacing(1),\r\n}));\r\n\r\nexport const TableHeadRoot = styled(\"thead\", {\r\n shouldForwardProp: (prop) => prop !== \"sticky\",\r\n})<{ sticky?: boolean }>(({ sticky }) => ({\r\n position: sticky ? \"sticky\" : \"relative\",\r\n top: sticky ? 0 : \"auto\",\r\n zIndex: sticky ? 3 : \"auto\",\r\n}));\r\n\r\nexport const TableHeadRow = styled(\"tr\", {\r\n shouldForwardProp: (prop) => prop !== \"striped\",\r\n})<{ striped?: boolean }>(({ theme, striped }) => ({\r\n backgroundColor: striped\r\n ? theme.palette.common.white\r\n : theme.palette.grey[50],\r\n}));\r\n\r\nexport const TableHeadCell = styled(\"th\", {\r\n shouldForwardProp: (prop) =>\r\n prop !== \"compact\" && prop !== \"isDragging\" && prop !== \"isPinned\",\r\n})<{\r\n compact?: boolean;\r\n isDragging?: boolean;\r\n isPinned?: boolean;\r\n sticky?: boolean;\r\n}>(({ theme, compact, isDragging, isPinned, sticky }) => ({\r\n position: \"relative\",\r\n padding: compact ? theme.spacing(0.5, 0.75) : theme.spacing(0.75, 1.25),\r\n border: `0.5px solid ${theme.palette.grey[200]}`,\r\n cursor: \"pointer\",\r\n backgroundColor: theme.palette.common.white,\r\n userSelect: \"none\",\r\n // smoother drag feedback\r\n opacity: isDragging ? 0.8 : 1,\r\n zIndex: isPinned ? 3 : isDragging ? 1 : 0,\r\n\r\n ...(sticky && {\r\n position: \"sticky\",\r\n left: 0,\r\n zIndex: 4,\r\n }),\r\n}));\r\n","import { IconPinOffOutline } from \"../../../assets/svg\";\r\nimport { TableHeaderProps } from \"../../types/table\";\r\nimport { TableHeadButton } from \"./table-head.styles\";\r\n\r\nfunction TableHeadPin<T>({ header }: TableHeaderProps<T>) {\r\n // ! Header now is pinned via dropdown on table head\r\n // if (header.column.getIsPinned() !== \"left\") {\r\n // return (\r\n // <TableHeadButton onClick={() => header.column.pin(\"left\")}>\r\n // {/* <IconPinOutline /> */}\r\n // </TableHeadButton>\r\n // );\r\n // }\r\n\r\n return (\r\n header.column.getIsPinned() && (\r\n <TableHeadButton\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n header.column.pin(false);\r\n }}\r\n >\r\n <IconPinOffOutline />\r\n </TableHeadButton>\r\n )\r\n );\r\n}\r\n\r\nexport default TableHeadPin;\r\n","import {\r\n Popover,\r\n List,\r\n ListItemButton,\r\n ListItemText,\r\n ListItemIcon,\r\n Switch,\r\n} from \"@mui/material\";\r\nimport { Header } from \"@tanstack/react-table\";\r\nimport {\r\n UpArrow,\r\n DownArrow,\r\n HideIcon,\r\n IconPinOffOutline,\r\n IconPinOutline,\r\n} from \"../../../assets/svg\";\r\nimport {\r\n craftTableFilterSettingsOptionsProps,\r\n CraftTableOptionsProps,\r\n} from \"../../types/table-options\";\r\nimport { useFullscreenPopoverContainer } from \"../../libs/hooks/useFullScreen\";\r\n\r\ntype Props<T> = {\r\n anchorEl: HTMLElement | null;\r\n activeTab?: string;\r\n onClose: () => void;\r\n header: Header<T, unknown>;\r\n tableStates: CraftTableOptionsProps;\r\n filterSettingStates?: craftTableFilterSettingsOptionsProps;\r\n onSaveSettings?: (columnId: string) => void;\r\n};\r\n\r\nfunction TableHeadPopover<T>({\r\n anchorEl,\r\n onClose,\r\n header,\r\n tableStates,\r\n onSaveSettings,\r\n}: Props<T>) {\r\n const open = Boolean(anchorEl);\r\n const column = header.column;\r\n const isPinned = column.getIsPinned() === \"left\";\r\n const { container: fullscreenContainer } = useFullscreenPopoverContainer();\r\n const { wrapColumns, setWrapColumns } = tableStates;\r\n\r\n const toggleWrapForColumn = (columnId: string) => {\r\n setWrapColumns((prev: Record<string, boolean>) => ({\r\n ...prev,\r\n [columnId]: !prev[columnId],\r\n all_wrap: false,\r\n }));\r\n };\r\n const handleUpdateSettings = (columnId: string) => {\r\n onSaveSettings && onSaveSettings(columnId);\r\n };\r\n\r\n return (\r\n <Popover\r\n open={open}\r\n anchorEl={anchorEl}\r\n onClose={onClose}\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"left\" }}\r\n container={fullscreenContainer}\r\n >\r\n <List dense>\r\n <ListItemButton onClick={() => column.toggleSorting(false)}>\r\n <ListItemIcon>\r\n <UpArrow />\r\n </ListItemIcon>\r\n <ListItemText primary=\"Sort ascending\" />\r\n </ListItemButton>\r\n <ListItemButton onClick={() => column.toggleSorting(true)}>\r\n <ListItemIcon>\r\n <DownArrow />\r\n </ListItemIcon>\r\n <ListItemText primary=\"Sort descending\" />\r\n </ListItemButton>\r\n <ListItemButton onClick={() => handleUpdateSettings(column?.id)}>\r\n <ListItemIcon>\r\n <HideIcon />\r\n </ListItemIcon>\r\n <ListItemText primary=\"Hide in view\" />\r\n </ListItemButton>\r\n <ListItemButton\r\n onClick={() => {\r\n column.pin(isPinned ? false : \"left\");\r\n }}\r\n >\r\n <ListItemIcon>\r\n {isPinned ? <IconPinOffOutline /> : <IconPinOutline />}\r\n </ListItemIcon>\r\n <ListItemText\r\n primary={isPinned ? \"Unfreeze column\" : \"Freeze column\"}\r\n />\r\n </ListItemButton>\r\n\r\n <ListItemButton>\r\n <ListItemText primary=\"Wrap Cell\" />\r\n <Switch\r\n checked={wrapColumns.all_wrap || wrapColumns[column.id]}\r\n onChange={() => toggleWrapForColumn(column.id)}\r\n />\r\n </ListItemButton>\r\n </List>\r\n </Popover>\r\n );\r\n}\r\n\r\nexport default TableHeadPopover;\r\n","import { Header } from \"@tanstack/react-table\";\r\nimport { ColumnResizeHandle } from \"./table-head.styles\";\r\n\r\ninterface Props<T> {\r\n header: Header<T, unknown>;\r\n}\r\n\r\nfunction TableColumnResizeHandle<T>({ header }: Props<T>) {\r\n return (\r\n <ColumnResizeHandle\r\n isResizing={header.column.getIsResizing()}\r\n onDoubleClick={() => header.column.resetSize()}\r\n onMouseDown={header.getResizeHandler()}\r\n onTouchStart={header.getResizeHandler()}\r\n className={`column__resize ${\r\n header.column.getIsResizing() ? \"is__resizing\" : \"\"\r\n }`}\r\n />\r\n );\r\n}\r\n\r\nexport default TableColumnResizeHandle;\r\n","import { flexRender } from \"@tanstack/react-table\";\r\nimport { useSortable } from \"@dnd-kit/sortable\";\r\nimport { useState } from \"react\";\r\nimport { CSS } from \"@dnd-kit/utilities\";\r\nimport { DownArrow, DragHandleIcon, UpArrow } from \"../../../assets/svg\";\r\nimport { getColumnPinningStyles } from \"../../libs/utils/common\";\r\nimport { TableHeaderProps } from \"../../types/table\";\r\nimport TableHeadPin from \"./table-head-pin\";\r\nimport TableHeadPopover from \"./table-head-popover\";\r\nimport TableColumnResizeHandle from \"./table-head-resizer\";\r\nimport {\r\n TableDndButton,\r\n TableHeadCell,\r\n TableHeadContent,\r\n TableHeadSort,\r\n} from \"./table-head.styles\";\r\nimport { Box } from \"@mui/material\";\r\n\r\nfunction DraggableTableHeader<T>({\r\n header,\r\n activeTab,\r\n featureOptions,\r\n tableStates,\r\n onSaveSettings,\r\n}: TableHeaderProps<T>) {\r\n const { enableColumnPinning } = featureOptions;\r\n\r\n // Popover\r\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\r\n\r\n const handleMenuToggle = (event: React.MouseEvent<HTMLElement>) => {\r\n if (header.column.getIsResizing()) return;\r\n\r\n setAnchorEl((prev) => (prev ? null : event.currentTarget));\r\n };\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const { isDragging, transform, attributes, listeners } = useSortable({\r\n id: header.column.id,\r\n });\r\n\r\n const isPinned = header.column.getIsPinned();\r\n\r\n return (\r\n <TableHeadCell\r\n onMouseLeave={handleClose}\r\n colSpan={header.colSpan}\r\n compact={featureOptions?.compactTable}\r\n isDragging={isDragging}\r\n isPinned={Boolean(isPinned)}\r\n style={{\r\n width: `${header.column.getSize()}px`,\r\n minWidth: `${header.column.columnDef.minSize ?? 180}px`,\r\n maxWidth: `${header.column.columnDef.maxSize}px`,\r\n transform: CSS.Translate.toString(transform),\r\n transition: \"width transform 0.2s ease-in-out\",\r\n ...getColumnPinningStyles(header.column),\r\n }}\r\n >\r\n {header.isPlaceholder ? null : (\r\n <TableHeadContent onClick={handleMenuToggle}>\r\n <TableHeadSort sortable={header.column.getCanSort()}>\r\n {flexRender(header.column.columnDef.header, header.getContext())}\r\n </TableHeadSort>\r\n\r\n <Box\r\n display={\"flex\"}\r\n alignItems={\"center\"}\r\n justifyContent={\"center\"}\r\n gap={0.5}\r\n >\r\n {{\r\n asc: <UpArrow />,\r\n desc: <DownArrow />,\r\n }[header.column.getIsSorted() as \"asc\" | \"desc\"] ?? null}\r\n\r\n {enableColumnPinning && (\r\n <TableHeadPin\r\n header={header}\r\n featureOptions={featureOptions}\r\n tableStates={tableStates}\r\n />\r\n )}\r\n\r\n <TableDndButton {...attributes} {...listeners}>\r\n <DragHandleIcon />\r\n </TableDndButton>\r\n </Box>\r\n </TableHeadContent>\r\n )}\r\n\r\n {/* column resizing */}\r\n {header.column.getCanResize() ? (\r\n <TableColumnResizeHandle header={header} />\r\n ) : null}\r\n\r\n {/* Popover */}\r\n <TableHeadPopover\r\n anchorEl={anchorEl}\r\n activeTab={activeTab}\r\n onClose={handleClose}\r\n header={header}\r\n tableStates={tableStates}\r\n onSaveSettings={onSaveSettings}\r\n />\r\n </TableHeadCell>\r\n );\r\n}\r\n\r\nexport default DraggableTableHeader;\r\n","import {\r\n ColumnOrderState,\r\n flexRender,\r\n Header,\r\n Table,\r\n} from \"@tanstack/react-table\";\r\nimport {\r\n CraftTableFeatureProps,\r\n craftTableFilterSettingsOptionsProps,\r\n CraftTableOptionsProps,\r\n} from \"../../types/table-options\";\r\nimport { DownArrow, UpArrow } from \"../../../assets/svg\";\r\nimport { useState } from \"react\";\r\nimport { getColumnPinningStyles } from \"../../libs/utils/common\";\r\nimport {\r\n horizontalListSortingStrategy,\r\n SortableContext,\r\n} from \"@dnd-kit/sortable\";\r\nimport DraggableTableHeader from \"./table-head-dnd-cell\";\r\nimport TableHeadPin from \"./table-head-pin\";\r\nimport Checkbox from \"../inputs/checkbox\";\r\nimport TableColumnResizeHandle from \"./table-head-resizer\";\r\nimport {\r\n TableHeadCell,\r\n TableHeadContent,\r\n TableHeadRoot,\r\n TableHeadRow,\r\n TableHeadSort,\r\n} from \"./table-head.styles\";\r\n\r\ninterface TableHeadProps<T> {\r\n table: Table<T>;\r\n activeTab?: string;\r\n featureOptions: CraftTableFeatureProps;\r\n columnOrder: ColumnOrderState;\r\n tableStates: CraftTableOptionsProps;\r\n filterSettingStates: craftTableFilterSettingsOptionsProps;\r\n onSaveSettings?: (columnId: string) => void;\r\n}\r\n\r\nfunction TableHead<T>({\r\n table,\r\n activeTab,\r\n featureOptions,\r\n columnOrder,\r\n tableStates,\r\n filterSettingStates,\r\n onSaveSettings,\r\n}: TableHeadProps<T>) {\r\n const {\r\n stickyHeader,\r\n enableColumnReordering,\r\n enableColumnPinning,\r\n enableRowSelection,\r\n } = featureOptions;\r\n\r\n // Popover\r\n const [, setAnchorEl] = useState<HTMLElement | null>(null);\r\n\r\n const handleMenuToggle = (\r\n event: React.MouseEvent<HTMLElement>,\r\n header: Header<T, unknown>\r\n ) => {\r\n if (header.column.getIsResizing()) return;\r\n\r\n setAnchorEl((prev) => (prev ? null : event.currentTarget));\r\n };\r\n\r\n return (\r\n <TableHeadRoot sticky={stickyHeader}>\r\n {table.getHeaderGroups().map((headerGroup) => (\r\n <TableHeadRow striped={featureOptions.striped} key={headerGroup?.id}>\r\n {enableRowSelection && (\r\n <TableHeadCell\r\n sticky\r\n compact={featureOptions.compactTable}\r\n style={{ width: 50 }}\r\n >\r\n <TableHeadContent>\r\n <Checkbox\r\n checked={table.getIsAllRowsSelected()}\r\n indeterminate={table.getIsSomeRowsSelected()}\r\n onChange={() => table.toggleAllRowsSelected()}\r\n />\r\n </TableHeadContent>\r\n </TableHeadCell>\r\n )}\r\n\r\n {headerGroup.headers.map((header) => {\r\n return enableColumnReordering ? (\r\n <SortableContext\r\n key={header?.id}\r\n items={columnOrder}\r\n strategy={horizontalListSortingStrategy}\r\n >\r\n <DraggableTableHeader\r\n header={header}\r\n activeTab={activeTab}\r\n featureOptions={featureOptions}\r\n tableStates={tableStates}\r\n filterSettingStates={filterSettingStates}\r\n onSaveSettings={onSaveSettings}\r\n />\r\n </SortableContext>\r\n ) : (\r\n <TableHeadCell\r\n key={header?.id}\r\n colSpan={header.colSpan}\r\n compact={featureOptions.compactTable}\r\n style={{\r\n ...getColumnPinningStyles(header.column),\r\n width: `${header.column.getSize()}px`,\r\n minWidth: `${header.column.columnDef.minSize}px`,\r\n maxWidth: `${header.column.columnDef.maxSize}px`,\r\n }}\r\n >\r\n {header.isPlaceholder ? null : (\r\n <TableHeadContent\r\n onClick={(event) => handleMenuToggle(event, header)}\r\n >\r\n <TableHeadSort sortable={header.column.getCanSort()}>\r\n {flexRender(\r\n header.column.columnDef.header,\r\n header.getContext()\r\n )}\r\n\r\n {{ asc: <UpArrow />, desc: <DownArrow /> }[\r\n header.column.getIsSorted() as \"asc\" | \"desc\"\r\n ] ?? null}\r\n </TableHeadSort>\r\n\r\n {enableColumnPinning && (\r\n <TableHeadPin\r\n header={header}\r\n featureOptions={featureOptions}\r\n tableStates={tableStates}\r\n />\r\n )}\r\n </TableHeadContent>\r\n )}\r\n\r\n {/* column resizing */}\r\n {header.column.getCanResize() ? (\r\n <TableColumnResizeHandle header={header} />\r\n ) : null}\r\n\r\n {/* Popover */}\r\n {/* <TableHeadPopover\r\n anchorEl={anchorEl}\r\n onClose={handleClose}\r\n header={header}\r\n wrap={wrap}\r\n tableStates={tableStates}\r\n /> */}\r\n </TableHeadCell>\r\n );\r\n })}\r\n </TableHeadRow>\r\n ))}\r\n </TableHeadRoot>\r\n );\r\n}\r\n\r\nexport default TableHead;\r\n","import { formatClassName } from \"../libs/utils/common\";\r\nimport { CraftTableComponentProps } from \"../types/table\";\r\nimport TableBody from \"./table-body/table-body\";\r\nimport TableHead from \"./table-head/table-head\";\r\n\r\nfunction Table<T>({\r\n table,\r\n activeTab,\r\n featureOptions,\r\n NestedComponent,\r\n columnOrder,\r\n isCompactTable,\r\n tableStates,\r\n filterSettingStates,\r\n onSaveSettings,\r\n}: CraftTableComponentProps<T>) {\r\n const { striped } = featureOptions;\r\n\r\n return (\r\n <table\r\n className={formatClassName(\r\n `ts__table ${striped ? \"ts--striped\" : \"\"} ${\r\n isCompactTable ? \"ts--compact\" : \"\"\r\n }`\r\n )}\r\n >\r\n <TableHead\r\n table={table}\r\n activeTab={activeTab}\r\n featureOptions={featureOptions}\r\n columnOrder={columnOrder}\r\n tableStates={tableStates}\r\n filterSettingStates={filterSettingStates}\r\n onSaveSettings={onSaveSettings}\r\n />\r\n <TableBody\r\n table={table}\r\n featureOptions={featureOptions}\r\n NestedComponent={NestedComponent}\r\n columnOrder={columnOrder}\r\n tableStates={tableStates}\r\n />\r\n </table>\r\n );\r\n}\r\n\r\nexport default Table;\r\n","import {\r\n closestCenter,\r\n DndContext,\r\n DragEndEvent,\r\n KeyboardSensor,\r\n MouseSensor,\r\n SensorDescriptor,\r\n SensorOptions,\r\n TouchSensor,\r\n useSensor,\r\n useSensors,\r\n} from \"@dnd-kit/core\";\r\nimport { CraftTableComponentProps } from \"../types/table\";\r\nimport Table from \"./table\";\r\nimport { restrictToHorizontalAxis } from \"@dnd-kit/modifiers\";\r\nimport { arrayMove } from \"@dnd-kit/sortable\";\r\n\r\nfunction TableDND<T>({\r\n table,\r\n activeTab,\r\n featureOptions,\r\n NestedComponent,\r\n columnOrder,\r\n setColumnOrder,\r\n isCompactTable,\r\n tableStates,\r\n filterSettingStates,\r\n onSaveSettings,\r\n}: CraftTableComponentProps<T>) {\r\n const sensors: SensorDescriptor<SensorOptions>[] = useSensors(\r\n useSensor(MouseSensor, {}),\r\n useSensor(TouchSensor, {}),\r\n useSensor(KeyboardSensor, {})\r\n );\r\n\r\n const handleDragEnd = (event: DragEndEvent) => {\r\n const { active, over } = event;\r\n if (active && over && active.id !== over.id) {\r\n setColumnOrder((columnOrder) => {\r\n const oldIndex = columnOrder.indexOf(active.id as string);\r\n const newIndex = columnOrder.indexOf(over.id as string);\r\n return arrayMove(columnOrder, oldIndex, newIndex);\r\n });\r\n }\r\n };\r\n\r\n return (\r\n <DndContext\r\n collisionDetection={closestCenter}\r\n modifiers={[restrictToHorizontalAxis]}\r\n onDragEnd={handleDragEnd}\r\n sensors={sensors}\r\n >\r\n <Table\r\n table={table}\r\n activeTab={activeTab}\r\n featureOptions={featureOptions}\r\n NestedComponent={NestedComponent}\r\n columnOrder={columnOrder}\r\n setColumnOrder={setColumnOrder}\r\n isCompactTable={isCompactTable}\r\n tableStates={tableStates}\r\n filterSettingStates={filterSettingStates}\r\n onSaveSettings={onSaveSettings}\r\n />\r\n </DndContext>\r\n );\r\n}\r\n\r\nexport default TableDND;\r\n","// tableTabs.styles.ts\r\nimport { styled } from \"@mui/material/styles\";\r\nimport Tabs, { tabsClasses } from \"@mui/material/Tabs\";\r\nimport Tab, { tabClasses } from \"@mui/material/Tab\";\r\nimport Box from \"@mui/material/Box\";\r\n\r\nexport const TableTabsRoot = styled(Tabs)(({ theme }) => ({\r\n minHeight: theme.spacing(3.5),\r\n\r\n [`& .${tabsClasses.flexContainer}`]: {\r\n minHeight: theme.spacing(3.5),\r\n },\r\n\r\n // hide indicator (instead of slotProps every time)\r\n [`& .${tabsClasses.indicator}`]: {\r\n display: \"none\",\r\n },\r\n}));\r\n\r\nexport const TableTab = styled(Tab)(({ theme }) => ({\r\n color: theme.palette.grey[600],\r\n padding: theme.spacing(1, 1.5),\r\n minHeight: theme.spacing(3.5),\r\n maxHeight: theme.spacing(3.5),\r\n textTransform: \"none\",\r\n minWidth: \"unset\",\r\n whiteSpace: \"nowrap\",\r\n\r\n [`&.${tabClasses.selected}`]: {\r\n color: theme.palette.text.primary,\r\n fontWeight: 700,\r\n },\r\n}));\r\n\r\nexport const TableTabCount = styled(Box, {\r\n shouldForwardProp: (prop) => prop !== \"selected\",\r\n})<{ selected?: boolean }>(({ theme, selected }) => ({\r\n padding: theme.spacing(0.25),\r\n borderRadius: theme.shape.borderRadius,\r\n border: `1px solid ${\r\n selected ? theme.palette.text.primary : theme.palette.grey[700]\r\n }`,\r\n color: selected ? theme.palette.common.white : theme.palette.text.primary,\r\n backgroundColor: selected ? theme.palette.text.primary : \"transparent\",\r\n fontWeight: selected ? 500 : 400,\r\n lineHeight: 1,\r\n minWidth: 20,\r\n textAlign: \"center\",\r\n}));\r\n","import React, { useState } from \"react\";\r\nimport {\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n DialogActions,\r\n Typography,\r\n TextField,\r\n Button,\r\n IconButton,\r\n Box,\r\n SxProps,\r\n} from \"@mui/material\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport { Theme } from \"@emotion/react\";\r\n\r\n// Types for the component props\r\nexport interface ModalButton {\r\n label: string;\r\n onClick: (inputValue?: string, error?: string, setError?: any) => void;\r\n variant?: \"text\" | \"outlined\" | \"contained\";\r\n color?: \"primary\" | \"secondary\" | \"error\" | \"info\" | \"success\" | \"warning\";\r\n disabled?: boolean;\r\n sx?: SxProps<Theme>;\r\n}\r\n\r\nexport interface InputField {\r\n label: string;\r\n placeholder?: string;\r\n required?: boolean;\r\n type?: \"text\" | \"email\" | \"password\" | \"number\";\r\n multiline?: boolean;\r\n rows?: number;\r\n defaultValue?: string;\r\n labelClassName?: string;\r\n}\r\n\r\nexport interface ConfirmModalProps {\r\n open: boolean;\r\n onClose: () => void;\r\n title: string;\r\n description?: string;\r\n buttons: ModalButton[];\r\n input?: InputField;\r\n maxWidth?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\r\n fullWidth?: boolean;\r\n className?: string;\r\n}\r\n\r\nconst ConfirmModal: React.FC<ConfirmModalProps> = ({\r\n open,\r\n onClose,\r\n title,\r\n description,\r\n buttons,\r\n input,\r\n maxWidth = \"sm\",\r\n fullWidth = true,\r\n}) => {\r\n const [inputValue, setInputValue] = useState(input?.defaultValue || \"\");\r\n const [error, setError] = useState(\"\");\r\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setInputValue(event.target.value);\r\n };\r\n\r\n const handleButtonClick = (button: ModalButton) => {\r\n if (input) {\r\n button.onClick(inputValue, error, setError);\r\n } else {\r\n button.onClick();\r\n }\r\n setInputValue(\"\");\r\n };\r\n\r\n const handleClose = () => {\r\n setInputValue(input?.defaultValue || \"\");\r\n onClose();\r\n };\r\n\r\n return (\r\n <Dialog\r\n open={open}\r\n onClose={(event, reason) => {\r\n if (reason !== \"backdropClick\" && reason !== \"escapeKeyDown\") {\r\n handleClose();\r\n }\r\n }}\r\n maxWidth={maxWidth}\r\n fullWidth={fullWidth}\r\n PaperProps={{\r\n sx: {\r\n borderRadius: 2,\r\n padding: 1,\r\n },\r\n }}\r\n >\r\n <DialogTitle\r\n sx={{\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n // padding: \"16px 0px\",\r\n px: \"0px\",\r\n marginX: \"24px\",\r\n paddingBottom: description ? \"18px\" : \"20px\",\r\n borderBottom: \"1px solid #eeeeee\",\r\n }}\r\n >\r\n <Typography variant=\"h6\" component=\"h2\" fontWeight=\"bold\">\r\n {title}\r\n </Typography>\r\n <IconButton\r\n onClick={handleClose}\r\n size=\"small\"\r\n sx={{\r\n color: \"text.secondary\",\r\n }}\r\n >\r\n <CloseIcon />\r\n </IconButton>\r\n </DialogTitle>\r\n\r\n <DialogContent sx={{ padding: \"0 24px 16px 24px\", mt: 2 }}>\r\n {description && (\r\n <Typography\r\n variant=\"body2\"\r\n color=\"text.secondary\"\r\n sx={{ marginBottom: input ? 3 : 0 }}\r\n >\r\n {description}\r\n </Typography>\r\n )}\r\n\r\n {input && (\r\n <Box sx={{ marginTop: description ? 0 : 2 }}>\r\n <Typography\r\n variant=\"body2\"\r\n component=\"label\"\r\n className={input.labelClassName}\r\n sx={{\r\n display: \"block\",\r\n marginBottom: 1,\r\n fontWeight: 500,\r\n color: \"text.primary\",\r\n }}\r\n >\r\n {input.label}\r\n {input.required && (\r\n <Typography component=\"span\" color=\"error.main\">\r\n {\" \"}\r\n *\r\n </Typography>\r\n )}\r\n </Typography>\r\n <TextField\r\n fullWidth\r\n value={inputValue}\r\n onChange={handleInputChange}\r\n placeholder={input.placeholder}\r\n type={input.type || \"text\"}\r\n multiline={input.multiline}\r\n rows={input.rows}\r\n variant=\"outlined\"\r\n size=\"small\"\r\n sx={{\r\n \"& .MuiOutlinedInput-root\": {\r\n maxWidth: 280,\r\n borderRadius: 1,\r\n \"&.Mui-focused .MuiOutlinedInput-notchedOutline\": {\r\n border: \"2px solid #7A5AF8\",\r\n },\r\n },\r\n }}\r\n />\r\n {error && (\r\n <Typography variant=\"body2\" color=\"error.main\">\r\n {error}\r\n </Typography>\r\n )}\r\n </Box>\r\n )}\r\n </DialogContent>\r\n\r\n <DialogActions\r\n sx={{\r\n padding: \"16px 24px 24px 24px\",\r\n gap: 1,\r\n }}\r\n >\r\n {buttons.map((button, index) => (\r\n <Button\r\n key={index}\r\n variant={button.variant || \"outlined\"}\r\n color={button.color || \"primary\"}\r\n className=\"confirm-modal-button\"\r\n sx={button.sx}\r\n onClick={() => handleButtonClick(button)}\r\n disabled={\r\n button.disabled ||\r\n (input?.required &&\r\n !inputValue.trim() &&\r\n button.variant === \"contained\")\r\n }\r\n >\r\n {button.label}\r\n </Button>\r\n ))}\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n};\r\n\r\nexport default ConfirmModal;\r\n","import * as React from \"react\";\r\nimport Box from \"@mui/material/Box\";\r\nimport { SxProps, Theme } from \"@mui/material\";\r\n\r\ninterface TabPanelProps {\r\n children?: React.ReactNode;\r\n index: number;\r\n value: number;\r\n sx?: SxProps<Theme>;\r\n}\r\n\r\nconst CustomTabPanel = ({\r\n children,\r\n value,\r\n index,\r\n sx,\r\n ...props\r\n}: TabPanelProps) => {\r\n return (\r\n <div\r\n role=\"tabpanel\"\r\n hidden={value !== index}\r\n id={`simple-tabpanel-${index}`}\r\n aria-labelledby={`simple-tab-${index}`}\r\n style={{ height: \"100%\" }}\r\n {...props}\r\n >\r\n {value === index && <Box sx={{ height: \"100%\", ...sx }}>{children}</Box>}\r\n </div>\r\n );\r\n};\r\n\r\nexport default CustomTabPanel;\r\n","import { useState } from \"react\";\r\nimport { Tabs, Tab, TabsProps, Box } from \"@mui/material\";\r\nimport { CheckBox, CrossBox } from \"../../../../../assets/svg\";\r\n\r\nexport interface TabItem {\r\n label: string;\r\n}\r\n\r\ninterface StyledTabsProps extends TabsProps {\r\n tabItems: TabItem[];\r\n activeFilterIndex: number;\r\n handleCrossClick: (index: number) => void;\r\n}\r\n\r\nconst CustomTabs = ({\r\n tabItems,\r\n activeFilterIndex = -1,\r\n handleCrossClick,\r\n value,\r\n onChange,\r\n ...tabsProps\r\n}: StyledTabsProps) => {\r\n const [hoveredTab, setHoveredTab] = useState<number | null>(null);\r\n\r\n return (\r\n <Tabs\r\n value={value}\r\n onChange={onChange}\r\n variant=\"fullWidth\"\r\n sx={{\r\n px: \"12px\",\r\n borderBottom: `1px solid #ccc`,\r\n \"& .MuiTabs-indicator\": {\r\n backgroundColor: \"black\",\r\n },\r\n }}\r\n {...tabsProps}\r\n >\r\n {tabItems.map((tab, idx) => {\r\n const isActive = activeFilterIndex === idx;\r\n const isHovered = hoveredTab === idx;\r\n\r\n return (\r\n <Tab\r\n key={idx}\r\n label={\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5 }}>\r\n <span>{tab.label}</span>\r\n {isActive && (\r\n <Box\r\n onMouseEnter={() => setHoveredTab(idx)}\r\n onMouseLeave={() => setHoveredTab(null)}\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n cursor: isHovered ? \"pointer\" : \"default\",\r\n }}\r\n onClick={\r\n isHovered ? () => handleCrossClick(idx) : undefined\r\n }\r\n >\r\n {isHovered ? <CrossBox /> : <CheckBox />}\r\n </Box>\r\n )}\r\n </Box>\r\n }\r\n sx={{\r\n fontSize: \"14px\",\r\n textTransform: \"capitalize\",\r\n color: \"#888888\",\r\n fontWeight: \"normal\",\r\n whiteSpace: \"nowrap\",\r\n \"&.Mui-selected\": {\r\n color: \"black\",\r\n fontWeight: \"bold\",\r\n },\r\n }}\r\n />\r\n );\r\n })}\r\n </Tabs>\r\n );\r\n};\r\n\r\nexport default CustomTabs;\r\n","// !! DON'T DELETE THIS OLD CODE !! //\r\n\r\nimport { FormControl, MenuItem, Select, SxProps, Theme } from \"@mui/material\";\r\nimport { Controller, UseFormSetValue } from \"react-hook-form\";\r\nimport { FilterStateProps } from \"../../../../../types/filter\";\r\nimport moment from \"moment\";\r\n\r\ninterface FormDropdownProps {\r\n filter: FilterStateProps;\r\n control: any;\r\n setValue: UseFormSetValue<any>;\r\n dropdownList: {\r\n label?: string;\r\n value?: string;\r\n }[];\r\n isLoading?: boolean;\r\n sx?: SxProps<Theme>;\r\n onValueChange?: () => void;\r\n}\r\n\r\nconst FormDropdown = ({\r\n filter,\r\n control,\r\n setValue,\r\n dropdownList,\r\n isLoading = false,\r\n sx,\r\n onValueChange,\r\n}: FormDropdownProps) => {\r\n return (\r\n <Controller\r\n name={`${filter?.filter_attribute_name}.operator`}\r\n control={control}\r\n defaultValue={filter?.filter_operator || dropdownList?.[0]?.value || \"\"}\r\n render={({ field }) => (\r\n <FormControl sx={sx} size=\"small\">\r\n <Select\r\n {...field}\r\n variant=\"standard\"\r\n sx={{\r\n fontSize: \"0.875rem\",\r\n minWidth: 50,\r\n border: \"none\",\r\n boxShadow: \"none\",\r\n \"& .MuiSelect-icon\": {\r\n top: \"45%\",\r\n transform: \"translateY(-50%)\",\r\n \"& .MuiOutlinedInput-input\": {\r\n padding: \"12px 20px\",\r\n },\r\n },\r\n }}\r\n disabled={isLoading}\r\n disableUnderline\r\n onChange={(e) => {\r\n const newOperator = e.target.value;\r\n const oldOperator = field.value;\r\n\r\n field.onChange(e);\r\n\r\n if (\r\n (filter?.filter_attribute_data_type === \"date\" ||\r\n filter?.filter_attribute_data_type === \"year\") &&\r\n newOperator !== oldOperator\r\n ) {\r\n if (newOperator === \"today\") {\r\n setValue(\r\n `${filter?.filter_attribute_name}.value`,\r\n moment().format(\"YYYY-MM-DD\"),\r\n {\r\n shouldDirty: true,\r\n }\r\n );\r\n } else if (newOperator === \"between\") {\r\n setValue(`${filter?.filter_attribute_name}.value`, [\"\", \"\"], {\r\n shouldDirty: true,\r\n });\r\n } else if (\r\n oldOperator === \"between\" ||\r\n oldOperator === \"today\"\r\n ) {\r\n setValue(`${filter?.filter_attribute_name}.value`, \"\", {\r\n shouldDirty: true,\r\n });\r\n }\r\n }\r\n\r\n onValueChange?.();\r\n }}\r\n >\r\n {dropdownList?.map((item, idx) => (\r\n <MenuItem key={idx} value={item.value}>\r\n {item.label}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n )}\r\n />\r\n );\r\n};\r\n\r\nexport default FormDropdown;\r\n","import { SxProps, Theme } from \"@mui/material\";\r\n\r\ninterface StyleProps {\r\n filterContainer: SxProps<Theme>;\r\n filterMainHeader: SxProps<Theme>;\r\n filterMainComponentWrapper: SxProps<Theme>;\r\n filterAttributeMainSelect: SxProps<Theme>;\r\n scrollbarCustom: SxProps<Theme>;\r\n}\r\n\r\ninterface filterFormStyleType {\r\n formEditModeStyle: SxProps<Theme>;\r\n formFlexContainer: SxProps<Theme>;\r\n formListItem: SxProps<Theme>;\r\n formListSectionHeader: SxProps<Theme>;\r\n formListItemHeader: SxProps<Theme>;\r\n formListItemHeaderName: SxProps<Theme>;\r\n formListItemHeaderDropdown: SxProps<Theme>;\r\n}\r\n\r\nexport const filterStyles: StyleProps = {\r\n scrollbarCustom: {\r\n overflowY: \"auto\",\r\n pr: 1,\r\n\r\n \"&::-webkit-scrollbar\": {\r\n width: \"4px\",\r\n },\r\n \"&::-webkit-scrollbar-thumb\": {\r\n backgroundColor: \"#999\",\r\n borderRadius: \"4px\",\r\n },\r\n \"&::-webkit-scrollbar-track\": {\r\n backgroundColor: \"#f0f0f0\",\r\n },\r\n },\r\n\r\n filterContainer: {\r\n backgroundColor: \"#fff\",\r\n height: \"100%\",\r\n overflowY: \"hidden\",\r\n boxShadow: \"0px 3px 8px 0px rgba(34, 48, 62, 0.10)\",\r\n borderRadius: \"0.5rem\",\r\n },\r\n\r\n filterMainHeader: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n bgcolor: \"#EEEEEE\",\r\n height: \"50px\",\r\n px: 2,\r\n borderBottom: \"1px solid #ccc\",\r\n mx: \"auto\",\r\n },\r\n\r\n filterMainComponentWrapper: {\r\n height: \"calc(100% - 90px)\",\r\n overflowY: \"auto\",\r\n },\r\n\r\n filterAttributeMainSelect: {\r\n \"& .MuiOutlinedInput-root\": {\r\n borderRadius: \"6px\",\r\n fontSize: \"14px\",\r\n bgcolor: \"#fafafa\",\r\n \"& fieldset\": {\r\n borderColor: \"#7a5af8 !important\",\r\n },\r\n \"&:hover fieldset\": {\r\n borderColor: \"#7a5af8 !important\",\r\n },\r\n \"&.Mui-focused fieldset\": {\r\n borderColor: \"#7a5af8 !important\",\r\n boxShadow: \"none\",\r\n },\r\n },\r\n \"& .MuiSelect-select\": {\r\n padding: \"8px 14px\",\r\n },\r\n },\r\n};\r\n\r\nexport const filterFormStyles: filterFormStyleType = {\r\n formEditModeStyle: {\r\n border: \"1px solid #c5c5c5\",\r\n borderRadius: \"6px\",\r\n padding: \"5px 10px 10px 10px\",\r\n },\r\n\r\n formFlexContainer: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"0.75rem\",\r\n },\r\n\r\n formListItem: {\r\n p: 1,\r\n backgroundColor: \"#FFFFFF\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 0.5,\r\n },\r\n\r\n formListSectionHeader: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n gap: 1,\r\n p: 1,\r\n backgroundColor: \"#FAFAF9\",\r\n },\r\n\r\n formListItemHeader: {\r\n display: \"flex\",\r\n justifyContent: \"flex-start\",\r\n alignItems: \"center\",\r\n gap: 2,\r\n },\r\n\r\n formListItemHeaderName: {\r\n fontWeight: 500,\r\n fontSize: \"13px\",\r\n color: \"#797877\",\r\n },\r\n\r\n formListItemHeaderDropdown: {\r\n fontSize: \"12px\",\r\n minWidth: 50,\r\n border: \"none\",\r\n boxShadow: \"none\",\r\n\r\n \"& .MuiSelect-root\": {\r\n fontSize: \"0.75rem\",\r\n\r\n \"& .MuiSelect-select\": {\r\n paddingBottom: \"0rem\",\r\n },\r\n },\r\n },\r\n};\r\n","import React, { useState } from \"react\";\r\nimport { TextField, InputAdornment, IconButton } from \"@mui/material\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\nimport { CloseIcon } from \"../../../../../assets/svg\";\r\n\r\ninterface SearchInputProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n placeholder?: string;\r\n className?: string;\r\n}\r\n\r\nconst CustomSearch = ({\r\n value = \"\",\r\n onChange,\r\n placeholder = \"Search...\",\r\n}: SearchInputProps) => {\r\n const [search, setSearch] = useState(value);\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const val = e.target.value;\r\n setSearch(val);\r\n onChange?.(val);\r\n };\r\n\r\n const handleClear = () => {\r\n setSearch(\"\"); // Clear the search value\r\n onChange?.(\"\"); // Propagate the cleared value\r\n };\r\n\r\n return (\r\n <TextField\r\n fullWidth\r\n size=\"small\"\r\n value={search}\r\n onChange={handleChange}\r\n placeholder={placeholder}\r\n className={\"search-input\"}\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <SearchIcon\r\n sx={{ color: \"#888888\", fontSize: \"20px\" }}\r\n className=\"search-icon-svg\"\r\n />\r\n </InputAdornment>\r\n ),\r\n endAdornment: search && ( // Show the clear icon only when there's a value\r\n <InputAdornment position=\"end\">\r\n <IconButton\r\n edge=\"end\"\r\n onClick={handleClear}\r\n sx={{ color: \"#888888\", fontSize: \"20px\" }}\r\n className=\"cross-icon\"\r\n >\r\n <CloseIcon />\r\n </IconButton>\r\n </InputAdornment>\r\n ),\r\n }}\r\n sx={{\r\n \"& .MuiOutlinedInput-root\": {\r\n borderRadius: \"6px\",\r\n fontSize: \"14px\",\r\n bgcolor: \"#fafafa\",\r\n \"& fieldset\": {\r\n borderColor: \"#c1c1c1\",\r\n },\r\n \"&.Mui-focused fieldset\": {\r\n borderColor: \"#7A5AF8\",\r\n },\r\n },\r\n }}\r\n />\r\n );\r\n};\r\n\r\nexport default CustomSearch;\r\n","import { Typography } from \"@mui/material\";\r\n\r\nconst EmptyList = ({ label }: { label?: string }) => {\r\n return (\r\n <Typography\r\n variant=\"body2\"\r\n align=\"center\"\r\n fontSize={14}\r\n fontStyle={\"italic\"}\r\n color=\"text.secondary\"\r\n >\r\n {label ? label : \"No results found\"}\r\n </Typography>\r\n );\r\n};\r\n\r\nexport default EmptyList;\r\n","import { Box, List, ListItem, ListItemText } from \"@mui/material\";\r\nimport React from \"react\";\r\nimport CustomSearch from \"../../search\";\r\nimport { CraftTableOptionsProps } from \"../../../../../types/table-options\";\r\nimport {\r\n FilterComponentOptions,\r\n FilterDataMainFilterEntityListProps,\r\n} from \"../../../../../types/filter\";\r\nimport EmptyList from \"./empty-list\";\r\n\r\ninterface Props {\r\n tableStates: CraftTableOptionsProps;\r\n filterComponentOptions?: FilterComponentOptions;\r\n}\r\n\r\nconst FilterCriteriaEntityList = ({\r\n tableStates,\r\n filterComponentOptions,\r\n}: Props) => {\r\n const [searchTerm, setSearchTerm] = React.useState<string>(\"\");\r\n\r\n const { filters, filterData, setSelectedFilterEntity } = tableStates;\r\n\r\n const handleSelectEntity = (entity: FilterDataMainFilterEntityListProps) => {\r\n setSelectedFilterEntity(entity);\r\n };\r\n\r\n const isSingleEntity = filterComponentOptions?.tabOptions?.isSingleEntity;\r\n\r\n // 🔍 get all entities from main filter data\r\n const allEntities = filterData?.mainFilter?.entityList?.data || [];\r\n\r\n // ✅ determine which entities should be displayed\r\n const entitiesToShow = React.useMemo(() => {\r\n // Case 1: isSingleEntity is true and filters already has entities\r\n if (isSingleEntity && filters?.length > 0) {\r\n const filterEntityTypes = filters.map((f) => f?.filter_entity_type);\r\n return allEntities.filter((entity) =>\r\n filterEntityTypes.includes(entity.value)\r\n );\r\n }\r\n\r\n // Case 2: default behavior (apply search filter)\r\n return allEntities.filter((entity) =>\r\n entity.label?.toLowerCase().includes(searchTerm?.toLowerCase())\r\n );\r\n }, [isSingleEntity, filters, allEntities, searchTerm]);\r\n\r\n return (\r\n <List>\r\n <CustomSearch\r\n placeholder=\"Filter by...\"\r\n value={searchTerm}\r\n onChange={setSearchTerm}\r\n />\r\n\r\n <Box\r\n sx={{\r\n my: 2,\r\n overflowY: \"auto\",\r\n transition: \"all 0.4s ease-in-out\",\r\n }}\r\n >\r\n {entitiesToShow.length === 0 ? (\r\n <EmptyList />\r\n ) : (\r\n entitiesToShow.map((entity, index) => (\r\n <ListItem\r\n key={index}\r\n onClick={() => handleSelectEntity(entity)}\r\n sx={{\r\n cursor: \"pointer\",\r\n \"&:hover\": { backgroundColor: \"#f4f4f4\" },\r\n }}\r\n >\r\n <ListItemText primary={entity.label} />\r\n </ListItem>\r\n ))\r\n )}\r\n </Box>\r\n </List>\r\n );\r\n};\r\n\r\nexport default FilterCriteriaEntityList;\r\n","import { Box, CircularProgress, Typography } from \"@mui/material\";\r\n\r\nconst Loader = ({ loaderText }: { loaderText?: string }) => {\r\n return (\r\n <Box\r\n display={\"flex\"}\r\n justifyContent=\"center\"\r\n alignItems={\"center\"}\r\n flexDirection={\"column\"}\r\n gap={2}\r\n paddingBlock={2}\r\n height={\"100%\"}\r\n width={\"100%\"}\r\n >\r\n <CircularProgress />\r\n {loaderText && <Typography variant=\"h6\">{loaderText}</Typography>}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default Loader;\r\n","import {\r\n Box,\r\n IconButton,\r\n List,\r\n ListItem,\r\n ListItemText,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport CustomSearch from \"../../search\";\r\nimport React, { useMemo } from \"react\";\r\nimport { CraftTableOptionsProps } from \"../../../../../types/table-options\";\r\nimport { filterFormStyles } from \"../../../style\";\r\nimport { CloseIcon } from \"../../../../../../assets/svg\";\r\nimport EmptyList from \"./empty-list\";\r\nimport Loader from \"../../../../common/loader/loader\";\r\nimport {\r\n FilterComponentOptions,\r\n FilterDataMainFilterEntityWiseCriteriaProps,\r\n} from \"../../../../../types/filter\";\r\n\r\ninterface Props {\r\n tableStates: CraftTableOptionsProps;\r\n handleAddFilter: (\r\n column: FilterDataMainFilterEntityWiseCriteriaProps\r\n ) => void;\r\n filterComponentOptions?: FilterComponentOptions;\r\n}\r\n\r\nconst FilterCriteriaList = ({\r\n tableStates,\r\n handleAddFilter,\r\n filterComponentOptions,\r\n}: Props) => {\r\n const [searchTerm, setSearchTerm] = React.useState<string>(\"\");\r\n\r\n const { filterData, filters, selectedFilterEntity, setSelectedFilterEntity } =\r\n tableStates;\r\n\r\n const isSingleEntity = filterComponentOptions?.tabOptions?.isSingleEntity;\r\n\r\n // Show Close button if:\r\n // - isSingleEntity is false → always show\r\n // - isSingleEntity is true → only show if filters is empty OR\r\n // no filter exists with same filter_entity_type as selectedFilterEntity.value\r\n const shouldShowCloseButton = useMemo(() => {\r\n return isSingleEntity\r\n ? filters?.length === 0 ||\r\n !filters?.some(\r\n (filter) =>\r\n filter?.filter_entity_type === selectedFilterEntity?.value\r\n )\r\n : true;\r\n }, [filters, isSingleEntity, selectedFilterEntity?.value]);\r\n\r\n return (\r\n <>\r\n <Box\r\n className=\"group-header\"\r\n sx={{\r\n ...filterFormStyles.formListSectionHeader,\r\n position: \"sticky\",\r\n top: 0,\r\n zIndex: 1,\r\n }}\r\n >\r\n <Typography fontSize={14}>{selectedFilterEntity?.label}</Typography>\r\n {shouldShowCloseButton && (\r\n <IconButton\r\n size=\"small\"\r\n onClick={() =>\r\n !isSingleEntity && setSelectedFilterEntity(undefined)\r\n }\r\n className=\"cross-icon\"\r\n >\r\n <CloseIcon />\r\n </IconButton>\r\n )}\r\n </Box>\r\n {filterData?.mainFilter?.entityWiseCriteria?.isPending ? (\r\n <Loader />\r\n ) : (\r\n <List>\r\n <CustomSearch\r\n placeholder=\"Filter by...\"\r\n value={searchTerm}\r\n onChange={setSearchTerm}\r\n />\r\n\r\n <Box\r\n sx={{\r\n my: 2,\r\n overflowY: \"auto\",\r\n transition: \"all 0.4s ease-in-out\",\r\n }}\r\n >\r\n {(() => {\r\n const filteredEntities =\r\n filterData?.mainFilter?.entityWiseCriteria?.data?.filter(\r\n (entity) =>\r\n entity.name.toLowerCase().includes(searchTerm.toLowerCase())\r\n ) ?? [];\r\n\r\n if (filteredEntities.length === 0) {\r\n return <EmptyList />;\r\n }\r\n\r\n return filteredEntities.map((entity, index) => {\r\n const isAlreadySelected = filters?.some(\r\n (filter) => filter.filter_attribute === entity.attribute_key\r\n );\r\n\r\n return (\r\n <ListItem\r\n key={index}\r\n sx={{\r\n opacity: isAlreadySelected ? 0.5 : 1,\r\n cursor: isAlreadySelected ? \"not-allowed\" : \"pointer\",\r\n \"&:hover\": {\r\n backgroundColor: isAlreadySelected\r\n ? \"inherit\"\r\n : \"#f4f4f4\",\r\n },\r\n }}\r\n onClick={() =>\r\n !isAlreadySelected && handleAddFilter(entity)\r\n }\r\n >\r\n <ListItemText primary={entity.name} />\r\n </ListItem>\r\n );\r\n });\r\n })()}\r\n </Box>\r\n </List>\r\n )}\r\n </>\r\n );\r\n};\r\n\r\nexport default FilterCriteriaList;\r\n","export const TextFieldStyles = {\r\n \"& .MuiOutlinedInput-root\": {\r\n borderRadius: \"6px\",\r\n fontSize: \"14px\",\r\n bgcolor: \"#fff\",\r\n\r\n \"& fieldset\": { borderColor: \"#c1c1c1\" },\r\n \"&.Mui-focused fieldset\": {\r\n borderColor: \"#7A5AF8\",\r\n },\r\n },\r\n};\r\n","import { TextField } from \"@mui/material\";\r\nimport { Controller } from \"react-hook-form\";\r\nimport { TextFieldStyles } from \"./styles\";\r\nimport { FilterStateProps } from \"../../../../../types/filter\";\r\n\r\ninterface FormTextfieldProps {\r\n filter: FilterStateProps;\r\n control: any;\r\n isLoading?: boolean;\r\n onValueChange?: () => void;\r\n}\r\n\r\nconst FormTextfield = ({\r\n filter,\r\n control,\r\n isLoading = false,\r\n onValueChange,\r\n}: FormTextfieldProps) => {\r\n return (\r\n <Controller\r\n name={`${filter?.filter_attribute_name}.value`}\r\n control={control}\r\n defaultValue={filter.filter_value || \"\"}\r\n render={({ field }) => (\r\n <TextField\r\n {...field}\r\n fullWidth\r\n variant=\"outlined\"\r\n size=\"small\"\r\n sx={{\r\n ...TextFieldStyles,\r\n \"& .MuiOutlinedInput-input\": {\r\n padding: \"12px 20px\",\r\n },\r\n }}\r\n // type={filter?.filter_attribute_data_type || \"text\" || \"number\"}\r\n type={\r\n filter?.filter_attribute_data_type === \"number\" ? \"number\" : \"text\"\r\n }\r\n placeholder={\"Enter value\"}\r\n disabled={isLoading}\r\n onChange={(e) => {\r\n field.onChange(e);\r\n onValueChange?.();\r\n }}\r\n />\r\n )}\r\n />\r\n );\r\n};\r\n\r\nexport default FormTextfield;\r\n","import { Controller } from \"react-hook-form\";\r\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\r\nimport { DatePicker } from \"@mui/x-date-pickers/DatePicker\";\r\nimport { AdapterDateFns } from \"@mui/x-date-pickers/AdapterDateFns\";\r\nimport moment from \"moment\";\r\nimport { FilterStateProps } from \"../../../../../types/filter\";\r\nimport { SxProps, Theme, Box, TextField } from \"@mui/material\";\r\n\r\ntype FormDatePickerProps = {\r\n filter: FilterStateProps;\r\n control: any;\r\n sx?: SxProps<Theme>;\r\n views?: Array<\"year\" | \"month\" | \"day\">;\r\n onValueChange?: () => void;\r\n};\r\n\r\nconst FormDatePicker = ({\r\n filter,\r\n control,\r\n sx,\r\n views = [\"day\"],\r\n onValueChange,\r\n}: FormDatePickerProps) => {\r\n const isRange = filter.filter_operator === \"between\";\r\n const isRelativeToToday = filter.filter_operator === \"today\";\r\n const isEmptyOperator =\r\n filter.filter_operator === \"empty\" ||\r\n filter.filter_operator === \"not_empty\";\r\n\r\n if (isEmptyOperator) {\r\n return <TextField fullWidth disabled value=\"\" size=\"small\" />;\r\n }\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDateFns}>\r\n <Box display=\"flex\" gap={1}>\r\n <Controller\r\n name={`${filter?.filter_attribute_name}.value`}\r\n control={control}\r\n // defaultValue={\r\n // isRange\r\n // ? [\"\", \"\"]\r\n // : isRelativeToToday\r\n // ? moment().format(\"YYYY-MM-DD\")\r\n // : filter.filter_value\r\n // ? moment(filter.filter_value, \"YYYY-MM-DD\").toDate()\r\n // : null\r\n // }\r\n defaultValue={\r\n isRange\r\n ? [\"\", \"\"]\r\n : isRelativeToToday\r\n ? moment().format(\"YYYY-MM-DD\")\r\n : isEmptyOperator\r\n ? null\r\n : filter.filter_value\r\n ? moment(filter.filter_value, \"YYYY-MM-DD\").toDate()\r\n : null\r\n }\r\n render={({ field }) => {\r\n const value = field.value;\r\n const todayDate = moment().toDate();\r\n if (isRange) {\r\n const fromDate = Array.isArray(value) ? value[0] : \"\";\r\n const toDate = Array.isArray(value) ? value[1] : \"\";\r\n\r\n return (\r\n <>\r\n <DatePicker\r\n views={views}\r\n value={\r\n isRelativeToToday\r\n ? todayDate\r\n : fromDate\r\n ? moment(fromDate, \"YYYY-MM-DD\").toDate()\r\n : null\r\n }\r\n onChange={(date) => {\r\n if (isRelativeToToday) return;\r\n let formatted = \"\";\r\n if (date) {\r\n formatted =\r\n views?.length === 1 && views[0] === \"year\"\r\n ? moment(date).format(\"YYYY\")\r\n : moment(date).format(\"YYYY-MM-DD\");\r\n }\r\n const updated: [string, string] = [\r\n formatted,\r\n toDate || \"\",\r\n ];\r\n field.onChange(updated);\r\n onValueChange?.();\r\n }}\r\n // disabled={isRelativeToToday}\r\n disabled={isRelativeToToday || isEmptyOperator}\r\n format={\r\n views?.length === 1 && views[0] === \"year\"\r\n ? \"yyyy\"\r\n : \"dd-MM-yyyy\"\r\n }\r\n sx={{\r\n \"& .MuiOutlinedInput-input\": {\r\n padding: \"12px 20px\",\r\n },\r\n ...sx,\r\n }}\r\n slotProps={{\r\n textField: {\r\n size: \"small\",\r\n fullWidth: true,\r\n placeholder:\r\n views?.length === 1 && views[0] === \"year\"\r\n ? \"YYYY\"\r\n : \"From Date\",\r\n },\r\n }}\r\n />\r\n\r\n <DatePicker\r\n views={views}\r\n value={\r\n isRelativeToToday\r\n ? todayDate\r\n : toDate\r\n ? moment(toDate, \"YYYY-MM-DD\").toDate()\r\n : null\r\n }\r\n onChange={(date) => {\r\n if (isRelativeToToday) return;\r\n let formatted = \"\";\r\n if (date) {\r\n formatted =\r\n views?.length === 1 && views[0] === \"year\"\r\n ? moment(date).format(\"YYYY\")\r\n : moment(date).format(\"YYYY-MM-DD\");\r\n }\r\n const updated: [string, string] = [\r\n fromDate || \"\",\r\n formatted,\r\n ];\r\n field.onChange(updated);\r\n onValueChange?.();\r\n }}\r\n // disabled={isRelativeToToday}\r\n disabled={isRelativeToToday || isEmptyOperator}\r\n format={\r\n views?.length === 1 && views[0] === \"year\"\r\n ? \"yyyy\"\r\n : \"dd-MM-yyyy\"\r\n }\r\n sx={{\r\n \"& .MuiOutlinedInput-input\": {\r\n padding: \"12px 20px\",\r\n },\r\n ...sx,\r\n }}\r\n slotProps={{\r\n textField: {\r\n size: \"small\",\r\n fullWidth: true,\r\n placeholder:\r\n views?.length === 1 && views[0] === \"year\"\r\n ? \"YYYY\"\r\n : \"To Date\",\r\n },\r\n }}\r\n />\r\n </>\r\n );\r\n }\r\n\r\n // Single DatePicker\r\n return (\r\n <DatePicker\r\n {...field}\r\n views={views}\r\n value={\r\n isRelativeToToday\r\n ? todayDate\r\n : field.value\r\n ? moment(field.value, \"YYYY-MM-DD\").toDate()\r\n : null\r\n }\r\n onChange={(date) => {\r\n if (isRelativeToToday) return;\r\n let formatted = \"\";\r\n if (date) {\r\n formatted =\r\n views?.length === 1 && views[0] === \"year\"\r\n ? moment(date).format(\"YYYY\")\r\n : moment(date).format(\"YYYY-MM-DD\");\r\n }\r\n field.onChange(formatted);\r\n onValueChange?.();\r\n }}\r\n // disabled={isRelativeToToday}\r\n disabled={isRelativeToToday || isEmptyOperator}\r\n format={\r\n views?.length === 1 && views[0] === \"year\"\r\n ? \"yyyy\"\r\n : \"dd-MM-yyyy\"\r\n }\r\n sx={{\r\n \"& .MuiOutlinedInput-input\": {\r\n padding: \"12px 20px\",\r\n },\r\n ...sx,\r\n }}\r\n slotProps={{\r\n textField: {\r\n size: \"small\",\r\n fullWidth: true,\r\n placeholder:\r\n views?.length === 1 && views[0] === \"year\"\r\n ? \"YYYY\"\r\n : \"DD-MM-YYYY\",\r\n },\r\n }}\r\n />\r\n );\r\n }}\r\n />\r\n </Box>\r\n </LocalizationProvider>\r\n );\r\n};\r\n\r\nexport default FormDatePicker;\r\n","import { Controller } from \"react-hook-form\";\r\nimport {\r\n FormControl,\r\n Select,\r\n MenuItem,\r\n Theme,\r\n SxProps,\r\n Checkbox,\r\n} from \"@mui/material\";\r\nimport { FilterStateProps } from \"../../../../../types/filter\";\r\nimport { DropdownOption } from \"../../../../../types/common\";\r\n\r\nconst FormMultiSelect = ({\r\n filter,\r\n control,\r\n dropdownData,\r\n sx,\r\n onValueChange,\r\n isFlatJson,\r\n}: {\r\n filter: FilterStateProps;\r\n control: any;\r\n dropdownData: Record<string, DropdownOption[]>;\r\n sx?: SxProps<Theme>;\r\n onValueChange?: () => void;\r\n isFlatJson: boolean;\r\n}) => {\r\n const options = dropdownData[filter.filter_attribute] || [];\r\n\r\n // 🔑 single source of truth\r\n const getOptionValue = (item: DropdownOption) =>\r\n isFlatJson ? item.label : item.value;\r\n\r\n return (\r\n <Controller\r\n name={`${filter?.filter_attribute_name}.value`}\r\n control={control}\r\n defaultValue={\r\n Array.isArray(filter.filter_value)\r\n ? filter.filter_value.filter(Boolean)\r\n : []\r\n }\r\n render={({ field }) => {\r\n const cleanedValue = Array.isArray(field.value)\r\n ? field.value.filter(Boolean)\r\n : [];\r\n\r\n return (\r\n <FormControl sx={sx} fullWidth size=\"small\">\r\n <Select\r\n {...field}\r\n sx={{\r\n \"& .MuiOutlinedInput-input\": {\r\n padding: \"10px 20px\",\r\n height: \"21px\",\r\n },\r\n }}\r\n multiple\r\n value={cleanedValue}\r\n onChange={(e) => {\r\n const value = e.target.value;\r\n const filtered = Array.isArray(value)\r\n ? value.filter(Boolean)\r\n : [];\r\n field.onChange(filtered);\r\n onValueChange?.();\r\n }}\r\n renderValue={(selected) => {\r\n const filtered = Array.isArray(selected)\r\n ? selected.filter(Boolean)\r\n : [];\r\n\r\n return filtered\r\n .map((val) => {\r\n const match = options.find(\r\n (item) => getOptionValue(item) === val\r\n );\r\n return match?.label || val;\r\n })\r\n .join(\", \");\r\n }}\r\n >\r\n {options.map((item, idx) => {\r\n const optionValue = getOptionValue(item);\r\n\r\n return (\r\n <MenuItem key={idx} value={optionValue}>\r\n <Checkbox\r\n checked={cleanedValue.includes(optionValue)}\r\n sx={{ marginRight: 1 }}\r\n />\r\n {item.label}\r\n </MenuItem>\r\n );\r\n })}\r\n </Select>\r\n </FormControl>\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n\r\nexport default FormMultiSelect;\r\n","import { FormControl } from \"@mui/material\";\r\nimport { FilterStateProps } from \"../../../../../types/filter\";\r\nimport FormTextfield from \"../components/Textfield\";\r\nimport FormDatePicker from \"../components/Date\";\r\nimport FormMultiSelect from \"../components/Multi-Select\";\r\n\r\n// Operators that should show a Date Picker\r\nconst dateAllowedOperators = [\r\n \"equal\",\r\n \"before\",\r\n \"after\",\r\n \"between\",\r\n \"is\",\r\n \"today\",\r\n \"is_before\",\r\n \"is_after\",\r\n \"is_on_or_before\",\r\n \"is_on_or_after\",\r\n \"empty\",\r\n \"not_empty\",\r\n];\r\n\r\nexport const resolveFilterInput = ({\r\n filter,\r\n operator,\r\n control,\r\n dropdownData,\r\n updateFiltersFromForm,\r\n isFlatJson,\r\n}: {\r\n filter: FilterStateProps;\r\n operator: string | undefined;\r\n control: any;\r\n dropdownData: any;\r\n updateFiltersFromForm: () => void;\r\n isFlatJson: boolean;\r\n}) => {\r\n const dataType = filter?.filter_attribute_data_type;\r\n\r\n // TEXT / NUMBER → always textfield\r\n if (dataType === \"text\" || dataType === \"number\" || dataType === \"label\") {\r\n return (\r\n <FormTextfield\r\n filter={filter}\r\n control={control}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n );\r\n }\r\n\r\n // YEAR → DatePicker (Year mode)\r\n if (dataType === \"year\") {\r\n return (\r\n <FormDatePicker\r\n filter={filter}\r\n control={control}\r\n views={[\"year\"]}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n );\r\n }\r\n\r\n // DATE FIELD\r\n if (dataType === \"date\") {\r\n const showDatePicker = operator && dateAllowedOperators.includes(operator);\r\n\r\n if (showDatePicker) {\r\n // Date Picker\r\n return (\r\n <FormDatePicker\r\n filter={filter}\r\n control={control}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <FormTextfield\r\n filter={filter}\r\n control={control}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n );\r\n }\r\n\r\n // SELECT / MULTISELECT / RADIO / CHECKBOX\r\n if (\r\n filter?.filter_attribute_data_type !== undefined &&\r\n [\"select\", \"multiselect\", \"radio\", \"checkbox\"].includes(\r\n filter?.filter_attribute_data_type\r\n )\r\n ) {\r\n return (\r\n <FormMultiSelect\r\n filter={filter}\r\n control={control}\r\n dropdownData={dropdownData}\r\n onValueChange={updateFiltersFromForm}\r\n isFlatJson={isFlatJson}\r\n />\r\n );\r\n }\r\n\r\n return <FormControl fullWidth size=\"small\" />;\r\n};\r\n\r\nexport const getOperationKeyByElementType = (elementType: string) => {\r\n switch (elementType) {\r\n case \"text\":\r\n case \"textarea\":\r\n case \"email\":\r\n case \"phone\":\r\n case \"password\":\r\n case \"url\":\r\n case \"label\":\r\n return \"text\";\r\n\r\n case \"number\":\r\n case \"decimal\":\r\n case \"file-upload\":\r\n return \"number\";\r\n\r\n case \"date\":\r\n case \"datetime\":\r\n return \"date\";\r\n\r\n case \"select\":\r\n case \"radio\":\r\n case \"multiselect\":\r\n case \"multicheckbox\":\r\n case \"checkbox\":\r\n return \"select\";\r\n\r\n case \"year\":\r\n return \"year\";\r\n\r\n default:\r\n return \"text\";\r\n }\r\n};\r\n","import { Box, Button, styled, Paper, ClickAwayListener } from \"@mui/material\";\r\nimport { useMemo, useRef } from \"react\";\r\nimport { AddIcon } from \"../../../../../../assets/svg\";\r\nimport {\r\n FilterColumnsDataProps,\r\n FilterComponentOptions,\r\n FilterDataMainFilterEntityWiseCriteriaProps,\r\n} from \"../../../../../types/filter\";\r\nimport { CraftTableOptionsProps } from \"../../../../../types/table-options\";\r\nimport { filterStyles } from \"../../../style\";\r\nimport useElementWidth from \"../../../../../libs/hooks/useElementWidth\";\r\nimport { onFilterChangeFunctionProps } from \"../../../../../types/common\";\r\nimport FilterCriteriaEntityList from \"./filter-criteria-entity-list\";\r\nimport FilterCriteriaList from \"./filter-criteria-list\";\r\nimport { getOperationKeyByElementType } from \"../utils/filter-date-input-resolver\";\r\n\r\nconst FilterCriteria = ({\r\n columnsData,\r\n tableStates,\r\n onChangeFunction,\r\n filterComponentOptions,\r\n}: {\r\n columnsData: FilterColumnsDataProps;\r\n tableStates: CraftTableOptionsProps;\r\n onChangeFunction: ({\r\n updatedFilters,\r\n filterMaster,\r\n }: onFilterChangeFunctionProps) => void;\r\n filterComponentOptions?: FilterComponentOptions;\r\n}) => {\r\n const FilterButton = styled(Button)(({ theme }) => ({\r\n borderRadius: 20,\r\n borderColor: theme.palette.primary.main,\r\n color: theme.palette.primary.main,\r\n textTransform: \"none\",\r\n padding: \"8px 16px\",\r\n \"&:hover\": {\r\n borderColor: theme.palette.primary.dark,\r\n },\r\n }));\r\n\r\n const {\r\n filters,\r\n setFilters,\r\n showFilterOptions,\r\n setShowFilterOption,\r\n filterMaster,\r\n selectedFilterEntity,\r\n setSelectedFilterEntity,\r\n } = tableStates;\r\n\r\n const filterButtonRef = useRef<HTMLButtonElement>(null);\r\n const filterButtonWidth = useElementWidth(filterButtonRef);\r\n\r\n const isSingleEntity = filterComponentOptions?.tabOptions?.isSingleEntity;\r\n // Disable button if only one filter is allowed\r\n const isSingleFilter =\r\n filterComponentOptions?.tabOptions?.isSingleFilter || false;\r\n const disableButton = useMemo(() => {\r\n return isSingleFilter && filters?.length > 0;\r\n }, [filters?.length, isSingleFilter]);\r\n\r\n const handleAddFilter = (\r\n attribute: FilterDataMainFilterEntityWiseCriteriaProps\r\n ) => {\r\n const dropdownOptions =\r\n columnsData?.operation_list[attribute?.element_type];\r\n\r\n const defaultValue = attribute.element_type === \"multiselect\" ? [] : \"\";\r\n\r\n const operationKey = getOperationKeyByElementType(attribute?.element_type);\r\n\r\n const matchingDropdownList =\r\n columnsData?.operation_list?.[operationKey] || [];\r\n const defaultOperator = matchingDropdownList[0]?.value || \"\";\r\n\r\n const newFilter = {\r\n filter_attribute: attribute.attribute_key,\r\n filter_operator: defaultOperator,\r\n filter_value: defaultValue,\r\n filter_entity_type: selectedFilterEntity?.value,\r\n };\r\n\r\n const newSelectedFilter = {\r\n ...newFilter,\r\n // id: attribute?.id,\r\n filter_attribute_name: attribute?.name,\r\n filter_attribute_data_type:\r\n attribute?.element_type || attribute?.element_type,\r\n datasource_list: attribute?.datasource_list,\r\n dropdown_list: matchingDropdownList,\r\n filter_entity_name: selectedFilterEntity?.label,\r\n attribute_key: attribute?.attribute_key,\r\n };\r\n\r\n setFilters((prev) => [...prev, newSelectedFilter]);\r\n\r\n const newFilterState = [...filters, newSelectedFilter];\r\n const newState = {\r\n filterMaster: filterMaster,\r\n filters: newFilterState,\r\n };\r\n\r\n onChangeFunction && onChangeFunction(newState);\r\n\r\n setShowFilterOption(false);\r\n\r\n if (!isSingleEntity) {\r\n setSelectedFilterEntity(undefined);\r\n }\r\n };\r\n\r\n const toggleFilterOptions = () => {\r\n setShowFilterOption((prev) => !prev);\r\n };\r\n\r\n return (\r\n <Box>\r\n <FilterButton\r\n fullWidth\r\n startIcon={<AddIcon />}\r\n onClick={toggleFilterOptions}\r\n disabled={disableButton}\r\n sx={{\r\n bgcolor: \"#eae4fe\",\r\n borderRadius: \"6px\",\r\n color: \"#7a5af8\",\r\n fontSize: \"13px\",\r\n fontWeight: 500,\r\n }}\r\n ref={filterButtonRef}\r\n >\r\n Filter Criteria\r\n </FilterButton>\r\n\r\n {showFilterOptions && (\r\n <ClickAwayListener onClickAway={() => setShowFilterOption(false)}>\r\n <Paper\r\n sx={{\r\n width: filterButtonWidth || 360, // Dynamic width based on button\r\n p: 1,\r\n mt: 1.5,\r\n cursor: \"pointer\",\r\n position: \"absolute\",\r\n zIndex: 1300,\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n maxHeight: filterMaster?.saved_filters?.selectedId\r\n ? `calc(100vh - 601px)`\r\n : `calc(100vh - 440px)`,\r\n overflowY: \"auto\",\r\n width: \"100%\",\r\n ...filterStyles.scrollbarCustom,\r\n }}\r\n className=\"filter-criteria-list-box\"\r\n >\r\n {selectedFilterEntity ? (\r\n <FilterCriteriaList\r\n tableStates={tableStates}\r\n handleAddFilter={handleAddFilter}\r\n filterComponentOptions={filterComponentOptions}\r\n />\r\n ) : (\r\n <FilterCriteriaEntityList\r\n tableStates={tableStates}\r\n filterComponentOptions={filterComponentOptions}\r\n />\r\n )}\r\n </Box>\r\n </Paper>\r\n </ClickAwayListener>\r\n )}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default FilterCriteria;\r\n","import { useState, useEffect } from \"react\";\r\n\r\n// Custom hook to track the width of an element\r\nconst useElementWidth = (ref: React.RefObject<HTMLElement>) => {\r\n const [width, setWidth] = useState<number>(0);\r\n\r\n useEffect(() => {\r\n // If there's no element to observe, just return early\r\n if (!ref.current) return;\r\n\r\n // ResizeObserver callback function\r\n const resizeObserver = new ResizeObserver(() => {\r\n if (ref.current) {\r\n setWidth(ref.current.clientWidth); // Update width state\r\n }\r\n });\r\n\r\n // Start observing the element's size changes\r\n resizeObserver.observe(ref.current);\r\n\r\n // Clean up observer on component unmount\r\n return () => resizeObserver.disconnect();\r\n }, [ref, ref.current?.clientWidth]);\r\n\r\n return width; // Return the current width\r\n};\r\n\r\nexport default useElementWidth;\r\n","import { Box, Button, IconButton, TextField, Typography } from \"@mui/material\";\r\nimport { CloseIcon, DeleteIcon } from \"../../../../../assets/svg\";\r\nimport {\r\n FilterColumnsDataProps,\r\n FilterComponentOptions,\r\n FilterDropdownDataProps,\r\n FilterMasterStateProps,\r\n FilterStateProps,\r\n} from \"../../../../types/filter\";\r\nimport { Controller, useForm } from \"react-hook-form\";\r\nimport React, { useEffect, useMemo, useCallback } from \"react\";\r\nimport FormDropdown from \"./components/Dropdown\";\r\nimport { CraftTableOptionsProps } from \"../../../../types/table-options\";\r\nimport FilterCriteria from \"./components/Filter-criteria\";\r\nimport CustomSearch from \"../search\";\r\nimport { customDebounce } from \"../../../../libs/utils/debounce\";\r\nimport { filterFormStyles } from \"../../style\";\r\nimport { onFilterChangeFunctionProps } from \"../../../../types/common\";\r\nimport { resolveFilterInput } from \"./utils/filter-date-input-resolver\";\r\n\r\ninterface FormValues {\r\n filterName: string;\r\n [key: string]:\r\n | {\r\n value: string | string[];\r\n operator: string;\r\n }\r\n | string;\r\n}\r\n\r\nconst FilterForm = ({\r\n columnsData,\r\n dropdownData,\r\n searchTerm = \"\",\r\n setSearchTerm,\r\n handleRemoveFilter,\r\n editMode = false,\r\n tableStates,\r\n onSaveFilterButtonClick,\r\n setDeleteFilterModalOpen,\r\n onChangeFunction,\r\n filterComponentOptions,\r\n isFlatJson,\r\n}: {\r\n columnsData: FilterColumnsDataProps;\r\n dropdownData: FilterDropdownDataProps;\r\n searchTerm?: string;\r\n setSearchTerm: React.Dispatch<React.SetStateAction<string>>;\r\n handleRemoveFilter: (filter_attribute: string) => void;\r\n editMode?: boolean;\r\n tableStates: CraftTableOptionsProps;\r\n onSaveFilterButtonClick?: () => void;\r\n setDeleteFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;\r\n onChangeFunction: ({\r\n updatedFilters,\r\n filterMaster,\r\n }: onFilterChangeFunctionProps) => void;\r\n filterComponentOptions?: FilterComponentOptions;\r\n isFlatJson: boolean;\r\n}) => {\r\n const { filterMaster, filters, setFilters, setFilterMaster, setPagination } =\r\n tableStates;\r\n\r\n const showSaveButton =\r\n filterComponentOptions?.tabOptions?.mainFilter?.showSaveButton;\r\n const showClearAllButton =\r\n filterComponentOptions?.tabOptions?.mainFilter?.showClearAllButton;\r\n const customButtons =\r\n filterComponentOptions?.tabOptions?.mainFilter?.customButtons;\r\n\r\n const filterName = filterMaster?.saved_filters?.selectedName || \"\";\r\n const isOwner = filterMaster?.saved_filters?.is_owner || false;\r\n\r\n const defaultValues = useMemo(() => {\r\n const filterValues = filters?.reduce((acc, curr) => {\r\n if (curr?.filter_attribute_name) {\r\n acc[curr?.filter_attribute_name] = {\r\n value: curr?.filter_value ?? \"\",\r\n operator:\r\n curr?.filter_operator ?? curr?.dropdown_list?.[0]?.value ?? \"\",\r\n };\r\n }\r\n return acc;\r\n }, {} as Record<string, { value: string | string[]; operator: string }>);\r\n\r\n return {\r\n filterName: filterName ?? \"\",\r\n dummyChange: \"\",\r\n ...filterValues,\r\n };\r\n }, [filters, filterName]);\r\n\r\n const { control, watch, reset, setValue, unregister } = useForm<\r\n FormValues & { dummyChange: string }\r\n >({\r\n mode: \"onChange\",\r\n defaultValues,\r\n resetOptions: {\r\n keepDirtyValues: false,\r\n keepErrors: false,\r\n },\r\n });\r\n\r\n const formValues = watch();\r\n\r\n useEffect(() => {\r\n reset(defaultValues);\r\n }, [filters]);\r\n\r\n const debouncedUpdateFilters = useCallback(\r\n customDebounce((updatedFilters: FilterStateProps[]) => {\r\n setFilters(updatedFilters);\r\n\r\n const newState = {\r\n filterMaster: filterMaster,\r\n filters: updatedFilters,\r\n };\r\n\r\n onChangeFunction && onChangeFunction(newState);\r\n }, 1000),\r\n [setFilters]\r\n );\r\n\r\n const updateFiltersFromForm = useCallback(() => {\r\n const updatedFilters = filters?.map((filter) => {\r\n if (\r\n filter?.filter_attribute_name &&\r\n typeof formValues[filter?.filter_attribute_name] === \"object\"\r\n ) {\r\n const filterValue = formValues[filter?.filter_attribute_name] as {\r\n value: string | string[];\r\n operator: string;\r\n };\r\n\r\n return {\r\n ...filter,\r\n filter_value: filterValue.value,\r\n filter_operator: filterValue.operator,\r\n };\r\n }\r\n return filter;\r\n });\r\n\r\n setPagination((prev) => ({ ...prev, pageIndex: 0 }));\r\n debouncedUpdateFilters(updatedFilters);\r\n }, [formValues, filters, debouncedUpdateFilters]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n reset();\r\n filters?.forEach((filter) => {\r\n if (filter?.filter_attribute_name) {\r\n unregister(filter?.filter_attribute_name);\r\n }\r\n });\r\n };\r\n }, []);\r\n\r\n const groupedFilters = useMemo(() => {\r\n return filters?.reduce((acc, filter) => {\r\n const key = filter?.filter_entity_name || \"\";\r\n if (!acc[key]) {\r\n acc[key] = [];\r\n }\r\n acc[key].push(filter);\r\n return acc;\r\n }, {} as Record<string, FilterStateProps[]>);\r\n }, [filters]);\r\n\r\n const handleRemoveEntityType = (entityType: string) => {\r\n const remainingFilters = filters?.filter(\r\n (f) => f.filter_entity_name !== entityType\r\n );\r\n\r\n // unregister all fields belonging to this entity type\r\n filters?.forEach((f) => {\r\n if (f?.filter_entity_name === entityType && f?.filter_attribute_name) {\r\n unregister(`${f?.filter_attribute_name}.value`);\r\n unregister(`${f?.filter_attribute_name}.operator`);\r\n }\r\n });\r\n\r\n setFilters(remainingFilters);\r\n\r\n const newState = {\r\n filterMaster,\r\n filters: remainingFilters,\r\n };\r\n\r\n onChangeFunction && onChangeFunction(newState);\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={(e) => {\r\n e.preventDefault(); // This prevents the page from reloading\r\n }}\r\n >\r\n <Box sx={editMode ? filterFormStyles.formEditModeStyle : {}}>\r\n {editMode && (\r\n <Box\r\n sx={{\r\n \"& .MuiOutlinedInput-root\": {\r\n borderRadius: \"6px\",\r\n fontSize: \"14px\",\r\n bgcolor: \"#fafafa\",\r\n \"& fieldset\": { borderColor: \"#c1c1c1\" },\r\n \"&.Mui-focused fieldset\": { borderColor: \"#7A5AF8\" },\r\n },\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n padding: \"0.5rem 0 1rem 0\",\r\n gap: 1,\r\n }}\r\n >\r\n <Controller\r\n name=\"filterName\"\r\n control={control}\r\n render={({ field }) => (\r\n <TextField\r\n fullWidth\r\n size=\"small\"\r\n placeholder=\"Filter Name\"\r\n value={filterName || field.value}\r\n onChange={(e) => {\r\n field.onChange(e);\r\n if (editMode) {\r\n setFilterMaster(\r\n (prev) =>\r\n ({\r\n ...prev,\r\n saved_filters: {\r\n ...prev?.saved_filters,\r\n selectedName: e.target.value,\r\n },\r\n } as FilterMasterStateProps)\r\n );\r\n }\r\n }}\r\n inputRef={field.ref}\r\n sx={{\r\n maxWidth: 400,\r\n\r\n \"& .MuiOutlinedInput-root\": {\r\n bgcolor: \"white\",\r\n borderRadius: \"0px\",\r\n fontSize: \"14px\",\r\n color: \"#272524\",\r\n fontWeight: \"500\",\r\n \"& fieldset\": { borderColor: \"#c5c5c5\" },\r\n \"&.Mui-focused fieldset\": { borderColor: \"#7A5AF8\" },\r\n },\r\n }}\r\n />\r\n )}\r\n />\r\n {isOwner && (\r\n <Box onClick={(e) => e.stopPropagation()}>\r\n <IconButton\r\n size=\"small\"\r\n onClick={() =>\r\n setDeleteFilterModalOpen && setDeleteFilterModalOpen(true)\r\n }\r\n >\r\n <DeleteIcon />\r\n </IconButton>\r\n </Box>\r\n )}\r\n </Box>\r\n )}\r\n\r\n <Box\r\n className=\"filter-criteria-form\"\r\n sx={{\r\n ...filterFormStyles.formFlexContainer,\r\n ...(editMode && {\r\n maxHeight: \"calc(100vh - 570px)\",\r\n overflowY: \"auto\",\r\n }),\r\n }}\r\n >\r\n <FilterCriteria\r\n columnsData={columnsData}\r\n tableStates={tableStates}\r\n onChangeFunction={onChangeFunction}\r\n filterComponentOptions={filterComponentOptions}\r\n />\r\n\r\n {!editMode && (\r\n <CustomSearch value={searchTerm} onChange={setSearchTerm} />\r\n )}\r\n\r\n <Box\r\n className=\"filter-form-inputs\"\r\n sx={filterFormStyles.formFlexContainer}\r\n >\r\n {Object.entries(groupedFilters).map(([entityType, filters]) => (\r\n <Box\r\n key={entityType}\r\n sx={{\r\n border: \"1px solid #c5c5c5\",\r\n borderRadius: 2,\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n {/* Group Header */}\r\n <Box\r\n className=\"group-header\"\r\n sx={filterFormStyles.formListSectionHeader}\r\n >\r\n <Typography fontSize={14}>{entityType}</Typography>\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => handleRemoveEntityType(entityType)}\r\n >\r\n <CloseIcon />\r\n </IconButton>\r\n </Box>\r\n\r\n {filters\r\n .filter(\r\n (filter) =>\r\n filter?.filter_attribute_name\r\n ?.toLowerCase()\r\n .includes(searchTerm.toLowerCase()) ||\r\n filter.filter_value\r\n ?.toString()\r\n .toLowerCase()\r\n .includes(searchTerm.toLowerCase())\r\n )\r\n .reverse()\r\n .map((filter) => {\r\n const dropdown_list = filter.dropdown_list || [];\r\n return (\r\n <Box\r\n key={filter.filter_attribute}\r\n sx={filterFormStyles.formListItem}\r\n >\r\n <Box sx={filterFormStyles.formListItemHeader}>\r\n <Typography\r\n sx={filterFormStyles.formListItemHeaderName}\r\n >\r\n {filter?.filter_attribute_name}\r\n </Typography>\r\n <FormDropdown\r\n filter={filter}\r\n control={control}\r\n setValue={setValue}\r\n dropdownList={dropdown_list}\r\n sx={filterFormStyles.formListItemHeaderDropdown}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n <IconButton\r\n sx={{ marginLeft: \"auto\" }}\r\n onClick={() => {\r\n unregister(\r\n `${filter?.filter_attribute_name}.value`\r\n );\r\n unregister(\r\n `${filter?.filter_attribute_name}.operator`\r\n );\r\n\r\n // Toggle dummy field to force form dirty\r\n const dummy = watch(\"dummyChange\");\r\n setValue(\r\n \"dummyChange\",\r\n dummy === \"changed\" ? \"reset\" : \"changed\",\r\n {\r\n shouldDirty: true,\r\n }\r\n );\r\n\r\n handleRemoveFilter(filter.filter_attribute);\r\n }}\r\n size=\"small\"\r\n >\r\n <CloseIcon />\r\n </IconButton>\r\n </Box>\r\n\r\n <Box>\r\n {(() => {\r\n const fieldValue = formValues[\r\n filter?.filter_attribute_name as keyof FormValues\r\n ] as\r\n | { value: string | string[]; operator: string }\r\n | undefined;\r\n\r\n const operator = fieldValue?.operator;\r\n\r\n return resolveFilterInput({\r\n filter,\r\n operator,\r\n control,\r\n dropdownData,\r\n updateFiltersFromForm,\r\n isFlatJson,\r\n });\r\n })()}\r\n </Box>\r\n </Box>\r\n );\r\n })}\r\n </Box>\r\n ))}\r\n </Box>\r\n </Box>\r\n </Box>\r\n\r\n {filters?.length > 0 && (showClearAllButton || showSaveButton) && (\r\n <Box sx={{ display: \"flex\", justifyContent: \"center\", gap: 1, mt: 3 }}>\r\n {showClearAllButton && (\r\n <Button\r\n variant=\"outlined\"\r\n sx={{\r\n color: \"#7A5AF8\",\r\n border: `1px solid #7A5AF8`,\r\n borderRadius: \"6px\",\r\n textTransform: \"none\",\r\n fontSize: \"14px\",\r\n }}\r\n fullWidth\r\n onClick={() => {\r\n setFilters([]);\r\n\r\n const filterMaster = {\r\n ...tableStates.filterMaster,\r\n activeFilterTabIndex: -1,\r\n };\r\n\r\n const newState = {\r\n filterMaster: filterMaster,\r\n filters: [],\r\n };\r\n\r\n onChangeFunction && onChangeFunction(newState);\r\n }}\r\n >\r\n Clear All\r\n </Button>\r\n )}\r\n\r\n {showSaveButton && (\r\n <Button\r\n variant=\"contained\"\r\n fullWidth\r\n sx={{\r\n color: \"white\",\r\n backgroundColor: \"#7A5AF8\",\r\n \"&.Mui-disabled\": {\r\n backgroundColor: \"#d7cefd\",\r\n color: \"rgba(255, 255, 255, 0.7)\",\r\n },\r\n }}\r\n onClick={() => {\r\n onSaveFilterButtonClick && onSaveFilterButtonClick();\r\n }}\r\n >\r\n Save Filter\r\n </Button>\r\n )}\r\n\r\n {/* Custom buttons from props */}\r\n {customButtons?.map((btn, idx) => (\r\n <Button\r\n key={idx}\r\n fullWidth\r\n variant={btn?.variant ?? \"outlined\"}\r\n sx={btn?.sx}\r\n {...btn}\r\n >\r\n {btn?.label}\r\n </Button>\r\n ))}\r\n </Box>\r\n )}\r\n </form>\r\n );\r\n};\r\n\r\nexport default FilterForm;\r\n","import { Box } from \"@mui/material\";\r\nimport { useEffect, useState } from \"react\";\r\nimport FilterForm from \"./forms\";\r\nimport {\r\n FilterFormComponentProps,\r\n FilterMasterStateProps,\r\n} from \"../../../types/filter\";\r\nimport { filterStyles } from \"../style\";\r\n\r\nconst MainFilter = ({\r\n columnsData,\r\n dropdownData,\r\n tableStates,\r\n onSaveFilterButtonClick,\r\n onChangeFunction,\r\n filterComponentOptions,\r\n isFlatJson,\r\n}: FilterFormComponentProps) => {\r\n const [searchTerm, setSearchTerm] = useState<string>(\"\");\r\n\r\n const { setFilters, setFilterMaster, filterMaster } = tableStates;\r\n\r\n useEffect(() => {\r\n setFilterMaster(\r\n (prev) =>\r\n ({\r\n ...prev,\r\n activeFilterTabIndex: 0,\r\n } as FilterMasterStateProps)\r\n );\r\n }, []);\r\n\r\n const handleRemoveFilter = (filter_attribute: string) => {\r\n setFilters((prev) =>\r\n prev.filter((filter) => filter.filter_attribute !== filter_attribute)\r\n );\r\n setFilters((prev) => {\r\n const newFilters = prev.filter(\r\n (f) => f.filter_attribute !== filter_attribute\r\n );\r\n\r\n onChangeFunction &&\r\n onChangeFunction({\r\n filterMaster: filterMaster,\r\n filters: newFilters,\r\n });\r\n return newFilters;\r\n });\r\n };\r\n\r\n const mainBoxStyles = {\r\n ...filterStyles.filterMainComponentWrapper,\r\n ...filterStyles.scrollbarCustom,\r\n };\r\n\r\n return (\r\n <Box sx={mainBoxStyles} className=\"main-filter-component-wrapper\">\r\n {/* Render selectedFilters state */}\r\n <FilterForm\r\n columnsData={columnsData}\r\n searchTerm={searchTerm}\r\n setSearchTerm={setSearchTerm}\r\n handleRemoveFilter={handleRemoveFilter}\r\n tableStates={tableStates}\r\n onSaveFilterButtonClick={onSaveFilterButtonClick}\r\n dropdownData={dropdownData}\r\n onChangeFunction={onChangeFunction}\r\n filterComponentOptions={filterComponentOptions}\r\n isFlatJson={isFlatJson}\r\n />\r\n </Box>\r\n );\r\n};\r\n\r\nexport default MainFilter;\r\n","import { Box, Typography } from \"@mui/material\";\r\nimport FilterForm from \"./forms\";\r\nimport BackArrow from \"@mui/icons-material/ArrowBackIosNew\";\r\nimport {\r\n FilterColumnsDataProps,\r\n FilterComponentOptions,\r\n FilterDropdownDataProps,\r\n FilterMasterStateProps,\r\n} from \"../../../types/filter\";\r\nimport { CraftTableOptionsProps } from \"../../../types/table-options\";\r\nimport { onFilterChangeFunctionProps } from \"../../../types/common\";\r\n\r\nconst SavedFilterEditComponent = ({\r\n columnsData,\r\n dropdownData,\r\n tableStates,\r\n editMode,\r\n setEditMode,\r\n searchTerm,\r\n setSearchTerm,\r\n onSaveFilterButtonClick,\r\n setDeleteFilterModalOpen,\r\n onChangeFunction,\r\n filterComponentOptions,\r\n}: {\r\n columnsData: FilterColumnsDataProps;\r\n dropdownData: FilterDropdownDataProps;\r\n tableStates: CraftTableOptionsProps;\r\n editMode?: boolean;\r\n setEditMode?: React.Dispatch<React.SetStateAction<boolean>>;\r\n searchTerm?: string;\r\n setSearchTerm: React.Dispatch<React.SetStateAction<string>>;\r\n onSaveFilterButtonClick?: () => void;\r\n setDeleteFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;\r\n onChangeFunction: ({\r\n updatedFilters,\r\n filterMaster,\r\n }: onFilterChangeFunctionProps) => void;\r\n filterComponentOptions?: FilterComponentOptions;\r\n}) => {\r\n const { setFilters, setFilterMaster } = tableStates;\r\n\r\n const showBackButton =\r\n filterComponentOptions?.tabOptions?.savedFilter?.showBackButton;\r\n\r\n const handleRemoveFilter = (filter_attribute: string) => {\r\n setFilters((prev) =>\r\n prev.filter((filter) => filter?.filter_attribute !== filter_attribute)\r\n );\r\n };\r\n\r\n const handleBackButtonClick = () => {\r\n setEditMode && setEditMode(false);\r\n setFilters([]);\r\n\r\n setFilterMaster(\r\n (prev) =>\r\n ({\r\n ...prev,\r\n saved_filters: {\r\n ...prev?.saved_filters,\r\n selectedId: \"\",\r\n selectedName: \"\",\r\n selectedCode: \"\",\r\n shareWithTeam: false,\r\n allowTeamEdit: false,\r\n },\r\n activeFilterTabIndex: -1,\r\n } as FilterMasterStateProps)\r\n );\r\n };\r\n\r\n return (\r\n <>\r\n {showBackButton && (\r\n <Box>\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 1,\r\n cursor: \"pointer\",\r\n mb: 2,\r\n }}\r\n onClick={handleBackButtonClick}\r\n >\r\n <BackArrow sx={{ width: \"13px\", height: \"13px\" }} />\r\n <Typography variant=\"body2\" sx={{ color: \"#8592A3\" }}>\r\n Back To Saved Filters\r\n </Typography>\r\n </Box>\r\n </Box>\r\n )}\r\n\r\n {/* Render selectedFilters state */}\r\n <FilterForm\r\n handleRemoveFilter={handleRemoveFilter}\r\n editMode={editMode}\r\n tableStates={tableStates}\r\n columnsData={columnsData}\r\n dropdownData={dropdownData}\r\n searchTerm={searchTerm}\r\n setSearchTerm={setSearchTerm}\r\n onSaveFilterButtonClick={onSaveFilterButtonClick}\r\n setDeleteFilterModalOpen={setDeleteFilterModalOpen}\r\n onChangeFunction={onChangeFunction}\r\n filterComponentOptions={filterComponentOptions}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nexport default SavedFilterEditComponent;\r\n","import { useEffect, useState } from \"react\";\r\nimport {\r\n FilterFormComponentProps,\r\n FilterMasterStateProps,\r\n FilterOperationListProps,\r\n} from \"../../../types/filter\";\r\nimport {\r\n Accordion,\r\n AccordionDetails,\r\n AccordionSummary,\r\n Box,\r\n Divider,\r\n IconButton,\r\n List,\r\n ListItem,\r\n ListItemText,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport CustomSearch from \"./search\";\r\nimport { DeleteIcon, EditIcon } from \"../../../../assets/svg\";\r\nimport SavedFilterEditComponent from \"./saved-edit-filter\";\r\nimport { CheckBox } from \"../../../../assets/svg\";\r\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\n\r\nconst SavedFilter = ({\r\n columnsData,\r\n dropdownData,\r\n tableStates,\r\n editMode,\r\n setEditMode,\r\n setDeleteFilterModalOpen,\r\n onSaveFilterButtonClick,\r\n tabValue,\r\n onChangeFunction,\r\n filterComponentOptions,\r\n isFlatJson,\r\n}: FilterFormComponentProps) => {\r\n const { filters, filterMaster, setFilterMaster, setFilterToDelete } =\r\n tableStates;\r\n\r\n const [searchTerm, setSearchTerm] = useState<string>(\"\");\r\n\r\n const MyFilter = (f: any): FilterOperationListProps => {\r\n return {\r\n label: f.name || f.label || \"Unnamed Filter\",\r\n value: f.id || f.value,\r\n code: f.code ?? \"\",\r\n is_shared: false,\r\n created_by: f.created_by || \"\",\r\n description: f.description || \"\",\r\n is_owner: true, // My filter = always owner\r\n is_editable: f.is_editable === true || f.is_editable === \"true\",\r\n };\r\n };\r\n\r\n const SharedFilter = (f: any): FilterOperationListProps => {\r\n const prefs =\r\n f.sharedPreferences || f.preferences || f.meta || f.shared_meta || {};\r\n\r\n return {\r\n label: f.name || f.label || \"Unnamed Filter\",\r\n value: f.id || f.value,\r\n code: f.code ?? \"\",\r\n is_shared: f.is_shared ?? prefs.is_shared ?? true,\r\n created_by: f.created_by || \"shared_filter\",\r\n description: f.description || \"\",\r\n is_owner: f.is_owner === true || prefs.is_owner === \"true\",\r\n is_editable:\r\n f.is_editable === true ||\r\n f.is_editable === \"true\" ||\r\n prefs.is_editable === true ||\r\n prefs.is_editable === \"true\",\r\n };\r\n };\r\n\r\n // SEPARATE DATA MAPPINGS\r\n\r\n const myFilters: FilterOperationListProps[] =\r\n columnsData?.saved_filter?.map(MyFilter) ?? [];\r\n\r\n const sharedFilters: FilterOperationListProps[] =\r\n columnsData?.shared_filter?.map(SharedFilter) ?? [];\r\n\r\n // Reset on unmount\r\n useEffect(() => {\r\n return () => {\r\n const editModeFromTab =\r\n filterComponentOptions?.tabOptions?.savedFilter?.editMode;\r\n\r\n if (!editModeFromTab) {\r\n setEditMode && setEditMode(false);\r\n setFilterMaster(\r\n (prev) =>\r\n ({\r\n ...prev,\r\n saved_filters: {\r\n ...(prev?.saved_filters ?? {}),\r\n selectedId: \"\",\r\n selectedName: \"\",\r\n description: \"\",\r\n selectedCode: \"\",\r\n shareWithTeam: undefined,\r\n allowTeamEdit: undefined,\r\n },\r\n } as FilterMasterStateProps)\r\n );\r\n }\r\n };\r\n }, []);\r\n\r\n // APPLY FILTER\r\n\r\n const applyFilterStates = (filter: FilterOperationListProps) => {\r\n const newFilterMaster = {\r\n ...filterMaster,\r\n saved_filters: {\r\n ...(filterMaster?.saved_filters ?? {}),\r\n selectedId: filter.value,\r\n selectedName: filter.label,\r\n description: filter.description,\r\n selectedCode: filter.code,\r\n shareWithTeam: filter.is_shared,\r\n allowTeamEdit: filter.is_editable,\r\n is_owner: filter.is_owner,\r\n },\r\n attributes: {\r\n ...filterMaster?.attributes,\r\n radio: [],\r\n },\r\n activeFilterTabIndex: tabValue,\r\n } as FilterMasterStateProps;\r\n\r\n setFilterMaster(newFilterMaster);\r\n\r\n onChangeFunction &&\r\n onChangeFunction({\r\n filterMaster: newFilterMaster,\r\n filters,\r\n });\r\n };\r\n\r\n const handleListItemClick = (filter: FilterOperationListProps) => {\r\n applyFilterStates(filter);\r\n setEditMode && setEditMode(true);\r\n setFilterToDelete(filter);\r\n };\r\n\r\n const handleApplyFilter = (filter: FilterOperationListProps) => {\r\n applyFilterStates(filter);\r\n };\r\n\r\n const [openAccordion, setOpenAccordion] = useState<\"my\" | \"shared\" | null>(\r\n \"my\"\r\n );\r\n\r\n const toggleAccodion = (accordion: \"my\" | \"shared\" | null) => {\r\n setOpenAccordion((prev) => (prev === accordion ? null : accordion));\r\n };\r\n\r\n // RENDER: MY FILTERS\r\n\r\n const renderMyFilters = (source: FilterOperationListProps[]) =>\r\n source.length === 0 ? (\r\n <Typography>No My Filters</Typography>\r\n ) : (\r\n <List sx={{ display: \"flex\", flexDirection: \"column\", gap: 1 }}>\r\n {source\r\n .filter((f) =>\r\n f.label?.toLowerCase().includes(searchTerm.toLowerCase())\r\n )\r\n .map((filter) => (\r\n <ListItem\r\n key={filter.value}\r\n sx={{\r\n cursor: \"pointer\",\r\n borderRadius: \"8px\",\r\n bgcolor: \"#f2f6f8ff\",\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n gap: 1,\r\n alignItems: \"center\",\r\n \"&:hover .action-icons\": {\r\n opacity: 1,\r\n visibility: \"visible\",\r\n },\r\n }}\r\n onClick={() => handleApplyFilter(filter)}\r\n >\r\n {filter.value === filterMaster?.saved_filters?.selectedId && (\r\n <Box sx={{ display: \"flex\", alignItems: \"center\" }}>\r\n <CheckBox />\r\n </Box>\r\n )}\r\n\r\n <ListItemText primary={filter.label} />\r\n\r\n <Box\r\n onClick={(e) => e.stopPropagation()}\r\n className=\"action-icons\"\r\n sx={{\r\n display: \"flex\",\r\n gap: 1,\r\n opacity: 0,\r\n visibility: \"hidden\",\r\n transition: \"opacity 0.2s ease, visibility 0.2s ease\",\r\n }}\r\n >\r\n <IconButton\r\n size=\"large\"\r\n onClick={() => handleListItemClick(filter)}\r\n >\r\n <EditIcon />\r\n </IconButton>\r\n\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => {\r\n setFilterToDelete(filter);\r\n setDeleteFilterModalOpen?.(true);\r\n }}\r\n >\r\n <DeleteIcon />\r\n </IconButton>\r\n </Box>\r\n </ListItem>\r\n ))}\r\n </List>\r\n );\r\n\r\n // ----------------------------------------\r\n // RENDER: SHARED FILTERS\r\n // ----------------------------------------\r\n const renderSharedFilters = (source: FilterOperationListProps[]) =>\r\n source.length === 0 ? (\r\n <Typography>No Shared Filters</Typography>\r\n ) : (\r\n <List sx={{ display: \"flex\", flexDirection: \"column\", gap: 1 }}>\r\n {source\r\n .filter((f) =>\r\n f.label?.toLowerCase().includes(searchTerm.toLowerCase())\r\n )\r\n .map((filter) => (\r\n <ListItem\r\n key={filter.value}\r\n sx={{\r\n cursor: \"pointer\",\r\n borderRadius: \"8px\",\r\n bgcolor: \"#f2f6f8ff\",\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n gap: 1,\r\n alignItems: \"center\",\r\n \"&:hover .action-icons\": {\r\n opacity: 1,\r\n visibility: \"visible\",\r\n },\r\n }}\r\n onClick={() => handleApplyFilter(filter)}\r\n >\r\n {filter.value === filterMaster?.saved_filters?.selectedId && (\r\n <Box sx={{ display: \"flex\", alignItems: \"center\" }}>\r\n <CheckBox />\r\n </Box>\r\n )}\r\n\r\n <ListItemText primary={filter.label} />\r\n\r\n <Box\r\n onClick={(e) => e.stopPropagation()}\r\n className=\"action-icons\"\r\n sx={{\r\n display: \"flex\",\r\n gap: 1,\r\n opacity: 0,\r\n visibility: \"hidden\",\r\n transition: \"opacity 0.2s ease, visibility 0.2s ease\",\r\n }}\r\n >\r\n {(filter.is_editable || filter.is_owner) && (\r\n <IconButton\r\n size=\"large\"\r\n onClick={() => handleListItemClick(filter)}\r\n >\r\n <EditIcon />\r\n </IconButton>\r\n )}\r\n {filter.is_owner && (\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => {\r\n setFilterToDelete(filter);\r\n setDeleteFilterModalOpen?.(true);\r\n }}\r\n >\r\n <DeleteIcon />\r\n </IconButton>\r\n )}\r\n </Box>\r\n </ListItem>\r\n ))}\r\n </List>\r\n );\r\n\r\n // ----------------------------------------\r\n // RENDER MAIN COMPONENT\r\n // ----------------------------------------\r\n return (\r\n <Box className=\"saved-filter-component-wrapper\">\r\n {!editMode && (\r\n <>\r\n {/* Search */}\r\n <Box sx={{ mb: 2 }}>\r\n <CustomSearch\r\n value={searchTerm}\r\n onChange={setSearchTerm}\r\n className=\"search-input\"\r\n />\r\n </Box>\r\n\r\n {/* ---- My Filters ---- */}\r\n <Box\r\n sx={{\r\n background: \"#fff\",\r\n borderRadius: \"12px\",\r\n border: \"1px solid #eee\",\r\n mb: 2,\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n <Accordion\r\n disableGutters\r\n elevation={0}\r\n expanded={openAccordion === \"my\"}\r\n onChange={() =>\r\n // setOpenAccordion(openAccordion === \"my\" ? \"shared\" : \"my\")\r\n toggleAccodion(\"my\")\r\n }\r\n >\r\n <AccordionSummary\r\n expandIcon={<ExpandMoreIcon fontSize=\"small\" />}\r\n >\r\n <Typography fontWeight={600}>My Filters</Typography>\r\n </AccordionSummary>\r\n <Divider sx={{ width: \"100%\" }} />\r\n <AccordionDetails\r\n sx={{\r\n p: \"9px\",\r\n maxHeight: \"230px\",\r\n overflowY: \"auto\",\r\n scrollbarWidth: \"thin\",\r\n }}\r\n >\r\n {renderMyFilters(myFilters)}\r\n </AccordionDetails>\r\n </Accordion>\r\n </Box>\r\n\r\n {/* ---- Shared Filters ---- */}\r\n <Box\r\n sx={{\r\n background: \"#fff\",\r\n borderRadius: \"12px\",\r\n border: \"1px solid #eee\",\r\n mb: 2,\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n <Accordion\r\n disableGutters\r\n elevation={0}\r\n expanded={openAccordion === \"shared\"}\r\n onChange={() =>\r\n // setOpenAccordion(openAccordion === \"shared\" ? \"my\" : \"shared\")\r\n toggleAccodion(\"shared\")\r\n }\r\n >\r\n <AccordionSummary\r\n expandIcon={<ExpandMoreIcon fontSize=\"small\" />}\r\n >\r\n <Typography fontWeight={600}>Shared Filters</Typography>\r\n </AccordionSummary>\r\n <Divider sx={{ width: \"100%\" }} />\r\n <AccordionDetails\r\n sx={{\r\n p: \"9px\",\r\n maxHeight: \"230px\",\r\n overflowY: \"auto\",\r\n scrollbarWidth: \"thin\",\r\n }}\r\n >\r\n {renderSharedFilters(sharedFilters)}\r\n </AccordionDetails>\r\n </Accordion>\r\n </Box>\r\n </>\r\n )}\r\n\r\n {/* Edit Component */}\r\n {editMode && (\r\n <SavedFilterEditComponent\r\n columnsData={columnsData}\r\n dropdownData={dropdownData}\r\n tableStates={tableStates}\r\n editMode={editMode}\r\n setEditMode={setEditMode}\r\n searchTerm={searchTerm}\r\n setSearchTerm={setSearchTerm}\r\n onSaveFilterButtonClick={onSaveFilterButtonClick}\r\n setDeleteFilterModalOpen={setDeleteFilterModalOpen}\r\n onChangeFunction={onChangeFunction}\r\n filterComponentOptions={filterComponentOptions}\r\n />\r\n )}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default SavedFilter;\r\n","import {\r\n Box,\r\n FormControl,\r\n FormControlLabel,\r\n MenuItem,\r\n Radio,\r\n Select,\r\n SelectChangeEvent,\r\n} from \"@mui/material\";\r\nimport {\r\n AttributesFilterProps,\r\n FilterMasterStateProps,\r\n FilterStateProps,\r\n} from \"../../../types/filter\";\r\nimport CustomSearch from \"./search\";\r\nimport { useMemo } from \"react\";\r\n\r\nconst AttributesFilter = ({\r\n columnsData,\r\n tableStates,\r\n dropdownData,\r\n searchTerm,\r\n setSearchTerm,\r\n tabValue,\r\n onChangeFunction,\r\n isFlatJson,\r\n}: AttributesFilterProps) => {\r\n const { filterMaster, setFilterMaster, filters, setFilters } = tableStates;\r\n\r\n const selectedAttribute = filterMaster?.attributes?.selected;\r\n\r\n const currentRadio = useMemo(() => {\r\n return Array.isArray(filterMaster?.attributes?.radio)\r\n ? (filterMaster!.attributes!.radio as string[])\r\n : [];\r\n }, [filterMaster?.attributes?.radio]);\r\n\r\n const handleSelectChange = (event: SelectChangeEvent) => {\r\n const attributeKey = event.target.value as string;\r\n\r\n const newFilterMasterState = {\r\n ...filterMaster,\r\n attributes: {\r\n ...filterMaster?.attributes,\r\n selected: attributeKey,\r\n radio: [],\r\n },\r\n };\r\n\r\n setFilterMaster(newFilterMasterState as FilterMasterStateProps);\r\n\r\n const newState = {\r\n filterMaster: newFilterMasterState,\r\n filters: filters,\r\n };\r\n\r\n onChangeFunction && onChangeFunction(newState);\r\n };\r\n\r\n const handleSingleRadioSelect = (value: string) => {\r\n const selectedAttr = filterMaster?.attributes.selected;\r\n if (!selectedAttr) return;\r\n\r\n const matchingColumn = columnsData?.column_list?.find(\r\n (column) => column.datasource_list === selectedAttr\r\n );\r\n if (!matchingColumn) return;\r\n\r\n let updatedFilters: FilterStateProps[] = [...filters];\r\n let updatedRadio: string[] = [];\r\n\r\n if (value === \"\") {\r\n // If deselecting, remove the filter\r\n updatedFilters = filters?.filter(\r\n (f) => f.filter_attribute !== matchingColumn.attribute_key\r\n );\r\n } else {\r\n // Else, replace with new single selection\r\n const defaultOperator =\r\n columnsData?.operation_list[matchingColumn.element_type]?.[0]?.value ||\r\n \"in\";\r\n\r\n const newFilter = {\r\n ...matchingColumn,\r\n filter_attribute: matchingColumn.attribute_key,\r\n filter_operator: defaultOperator,\r\n filter_value: [value],\r\n };\r\n\r\n const exists = filters?.some(\r\n (f) => f?.filter_attribute === matchingColumn?.attribute_key\r\n );\r\n if (exists) {\r\n updatedFilters = filters?.map((f) =>\r\n f?.filter_attribute === matchingColumn?.attribute_key ? newFilter : f\r\n ) as FilterStateProps[];\r\n } else {\r\n updatedFilters = [...filters, newFilter] as FilterStateProps[];\r\n }\r\n\r\n updatedRadio = [value];\r\n }\r\n\r\n setFilters(updatedFilters);\r\n\r\n const updatedFilterMaster = {\r\n ...filterMaster,\r\n attributes: {\r\n ...filterMaster.attributes,\r\n radio: updatedRadio,\r\n },\r\n activeFilterTabIndex: tabValue as number,\r\n };\r\n\r\n setFilterMaster(updatedFilterMaster);\r\n\r\n onChangeFunction &&\r\n onChangeFunction({\r\n filters: updatedFilters,\r\n filterMaster: updatedFilterMaster,\r\n });\r\n };\r\n\r\n const selectedAttributeOptions = useMemo(() => {\r\n const selected = columnsData?.column_list?.find(\r\n (col) => col.datasource_list === selectedAttribute\r\n )?.attribute_key;\r\n\r\n return selected ? dropdownData[selected] : [];\r\n }, [selectedAttribute, dropdownData]);\r\n\r\n return (\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"1.25rem\",\r\n }}\r\n className=\"attributes-filter-component-wrapper\"\r\n >\r\n {/* Attribute Select Dropdown */}\r\n <FormControl fullWidth size=\"small\">\r\n <Select\r\n value={selectedAttribute || \"\"}\r\n onChange={handleSelectChange}\r\n displayEmpty\r\n renderValue={(selected) => {\r\n if (!selected) {\r\n return <span>Select Attribute</span>;\r\n }\r\n return columnsData?.column_list?.find(\r\n (col) => col.datasource_list === selected\r\n )?.name;\r\n }}\r\n sx={{\r\n \"& .MuiOutlinedInput-root\": {\r\n borderRadius: \"6px\",\r\n fontSize: \"14px\",\r\n bgcolor: \"#fafafa\",\r\n \"& fieldset\": {\r\n borderColor: \"#7a5af8 !important\",\r\n },\r\n \"&:hover fieldset\": {\r\n borderColor: \"#7a5af8 !important\",\r\n },\r\n \"&.Mui-focused fieldset\": {\r\n borderColor: \"#7a5af8 !important\",\r\n boxShadow: \"none\",\r\n },\r\n },\r\n \"& .MuiSelect-select\": {\r\n padding: \"8px 14px\",\r\n },\r\n }}\r\n >\r\n {columnsData?.column_list\r\n ?.filter((column) => column?.element_type?.includes(\"select\"))\r\n .map((column, index) => (\r\n <MenuItem\r\n key={index}\r\n value={column.datasource_list}\r\n disabled={column.datasource_list === selectedAttribute}\r\n >\r\n {column.name}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n\r\n {/* Search and Single Radio Options */}\r\n <Box>\r\n {selectedAttribute && (\r\n <CustomSearch value={searchTerm} onChange={setSearchTerm} />\r\n )}\r\n\r\n {dropdownData && (\r\n <Box\r\n className=\"attributes-filter-list\"\r\n sx={{ mt: 2, overflow: \"auto\", maxHeight: \"calc(100dvh - 300px)\" }}\r\n >\r\n <FormControl>\r\n {selectedAttributeOptions\r\n ?.filter((option) => {\r\n if (!searchTerm) return true;\r\n return option.label\r\n .toLowerCase()\r\n .includes(searchTerm.toLowerCase());\r\n })\r\n .map((option) => {\r\n const isSelected = currentRadio.includes(option.value);\r\n // const isSelected = currentFilterValue.includes(option.value);\r\n\r\n return (\r\n <FormControlLabel\r\n key={option.value}\r\n control={\r\n <Radio\r\n checked={isSelected}\r\n onClick={() =>\r\n isSelected\r\n ? handleSingleRadioSelect(\"\")\r\n : handleSingleRadioSelect(option.value)\r\n }\r\n />\r\n }\r\n label={option.label}\r\n />\r\n );\r\n })}\r\n </FormControl>\r\n </Box>\r\n )}\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default AttributesFilter;\r\n","export function deepMergeObjects<T>(target: T, source: Partial<T>): T {\r\n const output = { ...target };\r\n for (const key in source) {\r\n if (\r\n source[key] &&\r\n typeof source[key] === \"object\" &&\r\n !Array.isArray(source[key])\r\n ) {\r\n output[key] = deepMergeObjects(\r\n (target as any)[key] || {},\r\n (source as any)[key]\r\n );\r\n } else {\r\n (output as any)[key] = source[key];\r\n }\r\n }\r\n return output;\r\n}\r\n","import { Box } from \"@mui/material\";\r\nimport { FilterFormComponentProps } from \"../../../types/filter\";\r\nimport MainFilter from \"./main-filter\";\r\nimport SavedFilter from \"./saved-filter\";\r\nimport AttributesFilter from \"./attributes-filter\";\r\n\r\ninterface Props extends FilterFormComponentProps {\r\n searchTerm: string;\r\n setSearchTerm: React.Dispatch<React.SetStateAction<string>>;\r\n}\r\n\r\nconst SingleFilterRendering = ({\r\n columnsData,\r\n dropdownData,\r\n tableStates,\r\n onSaveFilterButtonClick,\r\n onChangeFunction,\r\n filterComponentOptions,\r\n editMode,\r\n setEditMode,\r\n setDeleteFilterModalOpen,\r\n tabValue,\r\n searchTerm,\r\n setSearchTerm,\r\n}: Props) => {\r\n const showFilter = filterComponentOptions?.tabOptions?.showFilter;\r\n\r\n const commonProps = {\r\n columnsData,\r\n dropdownData,\r\n tableStates,\r\n onChangeFunction,\r\n };\r\n\r\n const editProps = {\r\n editMode,\r\n setEditMode,\r\n setDeleteFilterModalOpen,\r\n tabValue,\r\n };\r\n\r\n const attributesProps = {\r\n searchTerm,\r\n setSearchTerm,\r\n tabValue,\r\n };\r\n\r\n return (\r\n <Box sx={{ padding: \"1.5rem 0.75rem\", height: \"100%\" }}>\r\n {showFilter === \"main\" && (\r\n <MainFilter\r\n {...commonProps}\r\n onSaveFilterButtonClick={onSaveFilterButtonClick}\r\n filterComponentOptions={filterComponentOptions}\r\n />\r\n )}\r\n\r\n {showFilter === \"saved\" && (\r\n <SavedFilter\r\n {...commonProps}\r\n {...editProps}\r\n onSaveFilterButtonClick={onSaveFilterButtonClick}\r\n filterComponentOptions={filterComponentOptions}\r\n />\r\n )}\r\n\r\n {showFilter === \"attributes\" && (\r\n <AttributesFilter {...commonProps} {...attributesProps} />\r\n )}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default SingleFilterRendering;\r\n","import {\r\n ChangeEvent,\r\n Dispatch,\r\n SetStateAction,\r\n useEffect,\r\n useState,\r\n} from \"react\";\r\nimport {\r\n Box,\r\n Button,\r\n Checkbox,\r\n Dialog,\r\n DialogContent,\r\n DialogTitle,\r\n Divider,\r\n FormControlLabel,\r\n IconButton,\r\n TextField,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport { CloseIcon } from \"../../../../assets/svg\";\r\nimport {\r\n FilterFormComponentProps,\r\n FilterMasterStateProps,\r\n} from \"../../../types/filter\";\r\nimport CalendarTodayIcon from \"@mui/icons-material/CalendarToday\";\r\nimport { USER_ID } from \"../../../libs/utils/common\";\r\n// import { set } from \"react-hook-form\";\r\n\r\nconst primary = \"#7A5AF8\";\r\n\r\ninterface SavedFilterModalViewProps {\r\n open: boolean;\r\n onClose: () => void;\r\n onSave: () => void;\r\n filterMaster: FilterMasterStateProps | null;\r\n setFilterMaster: Dispatch<SetStateAction<FilterMasterStateProps | null>>;\r\n columnsData: FilterFormComponentProps | undefined;\r\n hasSavedFilters?: boolean;\r\n forceShowSharingControls?: boolean;\r\n disableShareFilter?: boolean;\r\n}\r\n\r\nconst SavedFilterModalView = ({\r\n open,\r\n onClose,\r\n onSave,\r\n filterMaster,\r\n setFilterMaster,\r\n columnsData,\r\n disableShareFilter = false,\r\n forceShowSharingControls = false,\r\n}: SavedFilterModalViewProps) => {\r\n const [shareWithTeam, setShareWithTeam] = useState<boolean>(false);\r\n const [allowTeamEdit, setAllowTeamEdit] = useState<boolean>(false);\r\n const filterNameValue = filterMaster?.saved_filters?.selectedName ?? \"\";\r\n const discriptionValue = filterMaster?.saved_filters?.description ?? \"\";\r\n\r\n const isSaveDisabled =\r\n !filterNameValue.trim() || (allowTeamEdit && !shareWithTeam);\r\n\r\n const selectedFilterId = filterMaster?.saved_filters?.selectedId || \"\";\r\n\r\n // Reset modal state when modal opens for a new filter\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const filterId = filterMaster?.saved_filters?.selectedId;\r\n const filterObj1 = columnsData?.shared_filter?.find(\r\n (f: any) => f.id === filterId\r\n );\r\n // NEW FILTER → RESET everything\r\n if (!filterId && !filterObj1) {\r\n setFilterMaster((prev: any) => {\r\n if (!prev) return prev;\r\n return {\r\n ...prev,\r\n saved_filters: {\r\n ...(prev.saved_filters ?? {}),\r\n selectedId: null,\r\n selectedName: \"\",\r\n description: \"\",\r\n is_shared: false,\r\n is_editable: false,\r\n },\r\n };\r\n });\r\n setShareWithTeam(false);\r\n setAllowTeamEdit(false);\r\n return;\r\n }\r\n\r\n // EXISTING FILTER → Load from columnsData.saved_filter\r\n const filterObj = columnsData?.shared_filter?.find(\r\n (f: any) => f.id === filterId\r\n );\r\n if (filterObj) {\r\n setFilterMaster((prev) => {\r\n if (!prev) return prev;\r\n return {\r\n ...prev,\r\n saved_filters: {\r\n ...(prev.saved_filters ?? {}),\r\n selectedId: filterId,\r\n selectedName: filterObj.name || \"\",\r\n description: filterObj.description || \"\",\r\n is_shared: filterObj.is_shared || false,\r\n is_editable: filterObj.is_editable === \"true\",\r\n },\r\n };\r\n });\r\n // const initialShare = filterObj.is_shared ?? false;\r\n // const initialAllow = initialShare\r\n // ? filterObj.is_editable === \"true\"\r\n // : false;\r\n // setShareWithTeam(initialShare);\r\n // setAllowTeamEdit(initialAllow);\r\n const initialShare =\r\n filterObj.is_shared === true || filterObj.is_shared === \"true\";\r\n const initialAllow =\r\n initialShare &&\r\n (filterObj.is_editable === true || filterObj.is_editable === \"true\");\r\n\r\n setShareWithTeam(initialShare);\r\n setAllowTeamEdit(initialAllow);\r\n\r\n persistPreferences(initialShare, initialAllow);\r\n }\r\n }, [\r\n open,\r\n columnsData,\r\n filterMaster?.saved_filters?.selectedId,\r\n setFilterMaster,\r\n ]); // Added dependencies for loading\r\n\r\n // Persist toggle state to filterMaster\r\n const persistPreferences = (sharedValue: boolean, editableValue: boolean) => {\r\n setFilterMaster((prev) => {\r\n if (!prev) return prev;\r\n\r\n return {\r\n ...prev,\r\n saved_filters: {\r\n ...(prev.saved_filters ?? {}),\r\n is_shared: sharedValue,\r\n is_editable: editableValue,\r\n },\r\n };\r\n });\r\n };\r\n\r\n // Handle Share Toggle\r\n\r\n const handleShareToggle = (\r\n _: ChangeEvent<HTMLInputElement>,\r\n checked: boolean\r\n ) => {\r\n setShareWithTeam(checked);\r\n\r\n const nextAllow = checked ? allowTeamEdit : false;\r\n setAllowTeamEdit(nextAllow);\r\n\r\n persistPreferences(checked, nextAllow);\r\n };\r\n\r\n // Handle Allow Edit Toggle\r\n\r\n const handleAllowEditToggle = (\r\n _: ChangeEvent<HTMLInputElement>,\r\n checked: boolean\r\n ) => {\r\n if (!shareWithTeam) return; // Cannot enable edit without sharing\r\n\r\n setAllowTeamEdit(checked);\r\n persistPreferences(shareWithTeam, checked);\r\n };\r\n\r\n const shouldShowSharingControls = forceShowSharingControls || true; // always show\r\n\r\n const getModalTitle = () => {\r\n const selectedId = filterMaster?.saved_filters?.selectedId;\r\n\r\n if (!selectedId) return \"Save Filter\"; // new filter\r\n\r\n const filterObj = columnsData?.shared_filter?.find(\r\n (f: any) => f.id === selectedId\r\n );\r\n if (filterObj?.is_shared) {\r\n return \"Shared Filter\";\r\n }\r\n return \"My Filter\";\r\n };\r\n\r\n const handleSave = () => {\r\n persistPreferences(shareWithTeam, allowTeamEdit);\r\n onSave(); // call original save handler\r\n };\r\n\r\n // Get the selected filter object from columnsData.saved_filter\r\n const selectedFilter = columnsData?.shared_filter?.find(\r\n (f: any) => f.id === selectedFilterId\r\n );\r\n\r\n const selectedSavedFilter = columnsData?.shared_filter?.find(\r\n (f: any) => f.id === selectedFilterId\r\n );\r\n\r\n const isOwner = String(selectedSavedFilter?.is_owner) === \"true\";\r\n\r\n // Check if we should show prefields\r\n const showPrefields =\r\n (selectedSavedFilter && selectedSavedFilter.is_editable === \"true\") ||\r\n selectedSavedFilter;\r\n\r\n // Disable checkboxes if prefields are shown\r\n const showCheckboxes = !showPrefields;\r\n\r\n const isNewFilter = !selectedSavedFilter;\r\n\r\n const isshow = isOwner;\r\n\r\n return (\r\n <Dialog open={open} onClose={onClose} maxWidth=\"sm\" fullWidth>\r\n <DialogTitle sx={{ display: \"flex\", justifyContent: \"space-between\" }}>\r\n <Typography fontSize={18} fontWeight={600} marginTop={1}>\r\n {getModalTitle()}\r\n </Typography>\r\n <Box onClick={onClose} sx={{ cursor: \"pointer\" }}>\r\n <CloseIcon />\r\n </Box>\r\n </DialogTitle>\r\n\r\n <Divider sx={{ mx: \"25px\", my: \"2px\", bgcolor: \"#f9f7f727\" }} />\r\n\r\n <DialogContent sx={{ pt: 0 }}>\r\n <Typography my={1} fontSize={\"14px\"}>\r\n Give a name to this filter so you can easily reuse it later.\r\n </Typography>\r\n {/* Filter Name */}\r\n <Typography mt={2} fontSize={11}>\r\n Filter Name\r\n </Typography>\r\n <TextField\r\n fullWidth\r\n size=\"small\"\r\n value={filterNameValue}\r\n onChange={(e) =>\r\n setFilterMaster((prev) => {\r\n if (!prev) return prev;\r\n return {\r\n ...prev,\r\n saved_filters: {\r\n ...(prev.saved_filters ?? {}),\r\n selectedName: e.target.value,\r\n },\r\n };\r\n })\r\n }\r\n sx={{\r\n mb: 0,\r\n \"& .MuiOutlinedInput-root\": {\r\n width: \"50%\",\r\n \"& fieldset\": { borderColor: \"#888\" },\r\n \"&:hover fieldset\": { borderColor: \"black\" },\r\n \"&.Mui-focused fieldset\": { borderColor: primary },\r\n \"& .MuiInputBase-input\": { fontSize: \"12px\" },\r\n },\r\n }}\r\n />\r\n {/* Description */}\r\n <Typography mt={2} fontSize={11}>\r\n Description\r\n </Typography>\r\n <TextField\r\n fullWidth\r\n minRows={3}\r\n value={discriptionValue}\r\n size=\"small\"\r\n sx={{\r\n mb: 1,\r\n \"& .MuiOutlinedInput-root\": {\r\n \"& fieldset\": { borderColor: \"#888\" },\r\n \"&:hover fieldset\": { borderColor: \"black\" },\r\n \"&.Mui-focused fieldset\": { borderColor: primary },\r\n },\r\n }}\r\n onChange={(e) => {\r\n const val = e.target.value;\r\n\r\n // block more than 200 chars\r\n if (val.length > 200) return;\r\n\r\n setFilterMaster((prev) => {\r\n if (!prev) return prev;\r\n return {\r\n ...prev,\r\n saved_filters: {\r\n ...(prev.saved_filters ?? {}),\r\n description: val,\r\n },\r\n };\r\n });\r\n }}\r\n />\r\n\r\n <Typography sx={{ mb: 1, fontSize: 12, color: \"#888\" }}>\r\n (Max. 200 Characters)\r\n </Typography>\r\n {/* Sharing Controls */}\r\n {shouldShowSharingControls &&\r\n (showCheckboxes || isshow) &&\r\n !disableShareFilter && (\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 0.5,\r\n \"& .MuiFormControlLabel-label\": { fontSize: \"14px\" },\r\n }}\r\n >\r\n <FormControlLabel\r\n control={\r\n <Checkbox\r\n size=\"small\"\r\n checked={shareWithTeam}\r\n onChange={handleShareToggle}\r\n sx={{\r\n color: \"black\",\r\n \"&.Mui-checked\": { color: \"black\" },\r\n }}\r\n />\r\n }\r\n label=\"Share with team member.\"\r\n />\r\n\r\n {shareWithTeam && (\r\n <FormControlLabel\r\n control={\r\n <Checkbox\r\n size=\"small\"\r\n checked={allowTeamEdit}\r\n onChange={handleAllowEditToggle}\r\n sx={{\r\n color: \"black\",\r\n \"&.Mui-checked\": { color: \"black\" },\r\n }}\r\n />\r\n }\r\n label=\"Allow editing to Team member\"\r\n />\r\n )}\r\n </Box>\r\n )}\r\n {/* prefields */}\r\n {showPrefields && !isshow && (\r\n <Box\r\n sx={{\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr 1fr\",\r\n gap: 3,\r\n mt: 2,\r\n }}\r\n >\r\n <Box>\r\n <Typography\r\n sx={{\r\n fontSize: \"14px\",\r\n fontWeight: 500,\r\n color: \"#6b6b6b\",\r\n mb: 0.5,\r\n }}\r\n >\r\n Created On*\r\n </Typography>\r\n\r\n <TextField\r\n fullWidth\r\n size=\"small\"\r\n value={\r\n selectedFilter?.created_date\r\n ? new Date(selectedFilter.created_date).toLocaleString()\r\n : \"\"\r\n } // format date\r\n InputProps={{\r\n readOnly: true,\r\n endAdornment: (\r\n <IconButton size=\"small\">\r\n <CalendarTodayIcon fontSize=\"small\" />\r\n </IconButton>\r\n ),\r\n sx: {\r\n backgroundColor: \"#0E0C0B0F\",\r\n borderRadius: \"4px\",\r\n },\r\n }}\r\n />\r\n </Box>\r\n\r\n <Box>\r\n <Typography\r\n sx={{\r\n fontSize: \"14px\",\r\n fontWeight: 500,\r\n color: \"#6b6b6b\",\r\n mb: 0.5,\r\n }}\r\n >\r\n Created By*\r\n </Typography>\r\n <TextField\r\n fullWidth\r\n size=\"small\"\r\n value={selectedFilter?.created_by || \"\"}\r\n InputProps={{\r\n readOnly: true,\r\n sx: {\r\n backgroundColor: \"#0E0C0B0F\",\r\n borderRadius: \"4px\",\r\n },\r\n }}\r\n />\r\n </Box>\r\n\r\n <Box>\r\n <Typography\r\n sx={{\r\n fontSize: \"14px\",\r\n fontWeight: 500,\r\n color: \"#6b6b6b\",\r\n mb: 0.5,\r\n }}\r\n >\r\n Modified On*\r\n </Typography>\r\n\r\n <TextField\r\n fullWidth\r\n size=\"small\"\r\n value={\r\n selectedFilter?.modified_date\r\n ? new Date(selectedFilter.modified_date).toLocaleString()\r\n : \"\"\r\n }\r\n InputProps={{\r\n readOnly: true,\r\n endAdornment: (\r\n <IconButton size=\"small\">\r\n <CalendarTodayIcon fontSize=\"small\" />\r\n </IconButton>\r\n ),\r\n\r\n sx: {\r\n backgroundColor: \"#0E0C0B0F\",\r\n borderRadius: \"4px\",\r\n },\r\n }}\r\n />\r\n </Box>\r\n\r\n <Box>\r\n <Typography\r\n sx={{\r\n fontSize: \"14px\",\r\n fontWeight: 500,\r\n color: \"#6b6b6b\",\r\n mb: 0.5,\r\n }}\r\n >\r\n Modified By*\r\n </Typography>\r\n <TextField\r\n fullWidth\r\n size=\"small\"\r\n value={selectedFilter?.modified_by || \"\"}\r\n InputProps={{\r\n readOnly: true,\r\n sx: {\r\n backgroundColor: \"#0E0C0B0F\",\r\n borderRadius: \"4px\",\r\n },\r\n }}\r\n />\r\n </Box>\r\n </Box>\r\n )}\r\n {/* Buttons */}\r\n <Box\r\n sx={{ display: \"flex\", justifyContent: \"flex-end\", gap: 1, mt: 3 }}\r\n >\r\n <Button\r\n variant=\"outlined\"\r\n onClick={onClose}\r\n sx={{\r\n borderColor: primary,\r\n color: primary,\r\n \"&:hover\": {\r\n borderColor: primary,\r\n backgroundColor: \"rgba(122, 90, 248, 0.04)\",\r\n },\r\n }}\r\n >\r\n Cancel\r\n </Button>\r\n\r\n <Button\r\n variant=\"contained\"\r\n onClick={handleSave}\r\n disabled={isSaveDisabled}\r\n sx={{\r\n backgroundColor: primary,\r\n \"&:hover\": { backgroundColor: \"#6A4DE8\" },\r\n \"&.Mui-disabled\": {\r\n backgroundColor: \"#d7cefd\",\r\n color: \"rgba(255, 255, 255, 0.7)\",\r\n },\r\n }}\r\n >\r\n Save\r\n </Button>\r\n </Box>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n};\r\n\r\nexport default SavedFilterModalView;\r\n","import { SxProps, Theme } from \"@mui/material\";\r\n\r\ninterface VerticalTabStyleProps {\r\n mainTabsContainer: SxProps<Theme>;\r\n mainTabContainer: SxProps<Theme>;\r\n mainTabLabel: SxProps<Theme>;\r\n}\r\n\r\nexport const verticalTabStyles: VerticalTabStyleProps = {\r\n mainTabsContainer: {\r\n backgroundColor: \"#FAFAF9\",\r\n height: \"100%\",\r\n minWidth: \"6.75rem\",\r\n position: \"sticky\",\r\n top: \"0\",\r\n left: \"0\",\r\n\r\n \"& .MuiTabs-indicator\": {\r\n display: \"none\",\r\n },\r\n },\r\n\r\n mainTabContainer: {\r\n borderRadius: \"0.375rem\",\r\n padding: \"0.5rem 1.25rem\",\r\n alignItems: \"flex-start\",\r\n color: \"rgba(14, 12, 11, 0.9)\",\r\n textTransform: \"initial\",\r\n minHeight: \"38px\",\r\n\r\n \"&.Mui-selected\": {\r\n backgroundColor: \"rgba(122, 90, 248, 0.16)\",\r\n color: \"#7A5AF8\",\r\n borderRadius: \"0.375rem\",\r\n },\r\n },\r\n\r\n mainTabLabel: {},\r\n};\r\n\r\ninterface HorizontalTabStyleProps {\r\n mainTabsContainer: SxProps<Theme>;\r\n mainTabContainer: SxProps<Theme>;\r\n mainTabLabel: SxProps<Theme>;\r\n}\r\n\r\nexport const horizontalTabStyles: HorizontalTabStyleProps = {\r\n mainTabsContainer: {\r\n mb: 2,\r\n \"& .MuiTab-root\": {\r\n color: \"#0E0C0BE5\",\r\n textTransform: \"none\",\r\n fontWeight: 500,\r\n },\r\n \"& .Mui-selected\": {\r\n color: \"#7A5AF8\",\r\n },\r\n \"& .MuiTabs-indicator\": {\r\n backgroundColor: \"#7A5AF8\",\r\n height: 3,\r\n },\r\n },\r\n\r\n mainTabContainer: {},\r\n\r\n mainTabLabel: {},\r\n};\r\n","import { Tabs, Tab, TabsProps, Box } from \"@mui/material\";\r\nimport { verticalTabStyles } from \"../styles\";\r\n\r\ninterface StyledTabsProps extends TabsProps {\r\n tabItems: { label: string }[];\r\n}\r\n\r\nconst CustomVerticalTabs = ({ tabItems, ...props }: StyledTabsProps) => {\r\n const { value, onChange } = props;\r\n\r\n return (\r\n <Tabs\r\n value={value}\r\n onChange={onChange}\r\n aria-label=\"vertical-tabs\"\r\n orientation=\"vertical\"\r\n variant=\"scrollable\"\r\n sx={verticalTabStyles.mainTabsContainer}\r\n {...props}\r\n >\r\n {tabItems.map((tab, idx) => {\r\n return (\r\n <Tab\r\n key={idx}\r\n sx={verticalTabStyles.mainTabContainer}\r\n label={\r\n <Box sx={verticalTabStyles.mainTabLabel}>\r\n <span>{tab.label}</span>\r\n </Box>\r\n }\r\n />\r\n );\r\n })}\r\n </Tabs>\r\n );\r\n};\r\n\r\nexport default CustomVerticalTabs;\r\n","import * as React from \"react\";\r\nimport Box from \"@mui/material/Box\";\r\n\r\ninterface TabPanelProps {\r\n children?: React.ReactNode;\r\n index: number;\r\n value: number;\r\n}\r\n\r\nconst CustomTabPanel = ({\r\n children,\r\n value,\r\n index,\r\n ...props\r\n}: TabPanelProps) => {\r\n return (\r\n <Box\r\n role=\"tabpanel\"\r\n hidden={value !== index}\r\n id={`simple-tabpanel-${index}`}\r\n aria-labelledby={`simple-tab-${index}`}\r\n {...props}\r\n sx={{ height: \"100%\" }}\r\n >\r\n {value === index && children}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default CustomTabPanel;\r\n","import React from \"react\";\r\nimport { useSortable } from \"@dnd-kit/sortable\";\r\nimport { CSS } from \"@dnd-kit/utilities\";\r\nimport { Box } from \"@mui/material\";\r\nimport { DragIndicator } from \"@mui/icons-material\";\r\n\r\nexport interface SortableFilterItemProps {\r\n id: string;\r\n containerId: string;\r\n children: React.ReactNode;\r\n}\r\n\r\nconst DraggableListItem = ({\r\n id,\r\n containerId,\r\n children,\r\n}: SortableFilterItemProps) => {\r\n const {\r\n attributes,\r\n listeners,\r\n setNodeRef,\r\n transform,\r\n transition,\r\n isDragging,\r\n } = useSortable({\r\n id,\r\n data: {\r\n type: \"filter-item\",\r\n containerId,\r\n id,\r\n },\r\n });\r\n\r\n const style = {\r\n transform: CSS.Transform.toString(transform),\r\n transition,\r\n opacity: isDragging ? 0.8 : 1,\r\n };\r\n\r\n return (\r\n <Box\r\n ref={setNodeRef}\r\n style={style}\r\n {...attributes}\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n \"&:hover\": { bgcolor: \"#f5f5f5\" },\r\n borderRadius: 1,\r\n marginBottom: 1,\r\n cursor: isDragging ? \"grabbing\" : \"default\",\r\n boxShadow: isDragging ? \"0 2px 8px rgba(0,0,0,0.1)\" : \"none\",\r\n }}\r\n >\r\n <Box\r\n {...listeners}\r\n sx={{ cursor: \"grab\", display: \"flex\", alignItems: \"center\" }}\r\n >\r\n <DragIndicator sx={{ mr: 1, color: \"#ccc\" }} />\r\n </Box>\r\n {children}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default DraggableListItem;\r\n","import { SxProps, Theme } from \"@mui/material\";\r\n\r\ninterface DialogStyleProps {\r\n dialogTitle: SxProps<Theme>;\r\n dialogContent: SxProps<Theme>;\r\n dialogActionsButton: SxProps<Theme>;\r\n}\r\n\r\ninterface ListingValuesStyleProps {\r\n wrapper: SxProps<Theme>;\r\n heading: SxProps<Theme>;\r\n button: SxProps<Theme>;\r\n draggableContainer: SxProps<Theme>;\r\n draggableCover: SxProps<Theme>;\r\n itemLabel: SxProps<Theme>;\r\n headerContainer: SxProps<Theme>;\r\n}\r\ninterface TabStyleProps {\r\n mainTabsHeader: SxProps<Theme>;\r\n mainTabSelect: SxProps<Theme>;\r\n mainTabDropdown: SxProps<Theme>;\r\n selectDropdownSeparator: SxProps<Theme>;\r\n checkboxStyle: SxProps<Theme>;\r\n}\r\n\r\nexport const dialogStyles: DialogStyleProps = {\r\n dialogTitle: {\r\n backgroundColor: \"#FBFBFC\",\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n padding: \"0.75rem\",\r\n },\r\n\r\n dialogContent: {\r\n display: \"flex\",\r\n gap: \"1rem\",\r\n paddingTop: \"1rem !important\",\r\n },\r\n\r\n dialogActionsButton: {\r\n backgroundColor: \"#7A5AF8\",\r\n color: \"#fff\",\r\n },\r\n};\r\n\r\nexport const listingValuesStyles: ListingValuesStyleProps = {\r\n wrapper: {\r\n border: \"0.5px solid #0E0C0B1F\",\r\n borderRadius: \"8px\",\r\n // minHeight: \"10rem\",\r\n backgroundColor: \"#fdfdfc\",\r\n zIndex: 10,\r\n overflow: \"hidden\",\r\n },\r\n heading: { fontWeight: 400, color: \"#0E0C0BB2\", fontSize: \"16px\" },\r\n button: { fontSize: \"13px\", textTransform: \"none\", color: \"#0E0C0BB2\" },\r\n draggableContainer: {\r\n maxHeight: 200,\r\n borderRadius: 1,\r\n mt: 2,\r\n transition: \"background-color 0.2s ease\",\r\n },\r\n draggableCover: {\r\n minHeight: \"200px\",\r\n maxHeight: \"200px\",\r\n overflowY: \"auto\",\r\n },\r\n itemLabel: { display: \"flex\", alignItems: \"center\", flex: 1 },\r\n headerContainer: {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n mb: 2,\r\n },\r\n};\r\n\r\nexport const TabsStyles: TabStyleProps = {\r\n mainTabsHeader: {\r\n fontStyle: \"italic\",\r\n fontWeight: 400,\r\n fontSize: \"12px\",\r\n color: \"#0E0C0BB2\",\r\n },\r\n mainTabDropdown: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n width: \"50%\",\r\n paddingRight: 1,\r\n },\r\n mainTabSelect: {\r\n width: \"65%\",\r\n \"& .MuiOutlinedInput-root\": {\r\n borderRadius: \"6px\",\r\n \"&.Mui-focused .MuiOutlinedInput-notchedOutline\": {\r\n borderColor: \"#7A5AF8\",\r\n },\r\n },\r\n },\r\n\r\n selectDropdownSeparator: {\r\n width: \"30%\",\r\n \"& .MuiOutlinedInput-root\": {\r\n borderRadius: \"6px\",\r\n \"&.Mui-focused .MuiOutlinedInput-notchedOutline\": {\r\n borderColor: \"#7A5AF8\",\r\n },\r\n },\r\n },\r\n\r\n checkboxStyle: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n },\r\n};\r\n","import {\r\n Alert,\r\n Box,\r\n Button,\r\n Grid,\r\n IconButton,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport CustomSearch from \"../../filter/components/search/index.tsx\";\r\nimport {\r\n SortableContext,\r\n verticalListSortingStrategy,\r\n} from \"@dnd-kit/sortable\";\r\nimport { useDroppable } from \"@dnd-kit/core\";\r\nimport DraggableListItem from \"./draggable-listitem.tsx\";\r\nimport { listingValuesStyles } from \"../style.ts\";\r\nimport Loader from \"../../common/loader/loader.tsx\";\r\nimport { ClosedEyeIcon, EyeIcon } from \"../../../../assets/svg.tsx\";\r\nimport React from \"react\";\r\n``;\r\n\r\ninterface FilterValue {\r\n label: string;\r\n value: string;\r\n}\r\n\r\ninterface ListingValuesProps {\r\n filteredValues: FilterValue[];\r\n buttonText: string;\r\n onClick: () => void;\r\n headerText: string;\r\n searchTerm?: string;\r\n setSearchTerm?: React.Dispatch<React.SetStateAction<string>>;\r\n containerId: string;\r\n tabsApiDataLoading?: boolean;\r\n onItemToggle: (\r\n item: { label: string; value: string },\r\n fromContainerId: string\r\n ) => void;\r\n enableDragAndDrop?: boolean;\r\n isQuickTabActive?: boolean;\r\n AlertComponenet?: React.ReactNode;\r\n}\r\n\r\nconst ListingValuesContent = ({\r\n item,\r\n containerId,\r\n onItemToggle,\r\n}: {\r\n item: FilterValue;\r\n containerId: string;\r\n onItemToggle: (\r\n item: { label: string; value: string },\r\n fromContainerId: string\r\n ) => void;\r\n}) => {\r\n return (\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n gap: 1,\r\n flex: 1,\r\n color: containerId === \"tabs\" ? \"black\" : \"#9e9d9b\",\r\n }}\r\n >\r\n <Typography>{item.label}</Typography>\r\n <IconButton size=\"small\" onClick={() => onItemToggle(item, containerId)}>\r\n {containerId === \"tabs\" ? <EyeIcon /> : <ClosedEyeIcon />}\r\n </IconButton>\r\n </Box>\r\n );\r\n};\r\n\r\nconst ListingValues = ({\r\n filteredValues,\r\n buttonText,\r\n onClick,\r\n headerText,\r\n searchTerm,\r\n setSearchTerm,\r\n containerId,\r\n tabsApiDataLoading,\r\n onItemToggle,\r\n enableDragAndDrop = true,\r\n AlertComponenet,\r\n}: ListingValuesProps) => {\r\n const { setNodeRef } = useDroppable({\r\n id: containerId,\r\n data: {\r\n type: \"container\",\r\n containerId: containerId,\r\n },\r\n });\r\n\r\n return (\r\n <Grid size={6} sx={listingValuesStyles.wrapper}>\r\n {tabsApiDataLoading ? (\r\n <Loader />\r\n ) : (\r\n <>\r\n <Box\r\n sx={{\r\n p: 2,\r\n // border: \"1px solid #1a191934\",\r\n backgroundColor: \"#fdfdfc\",\r\n borderRadius: \"12px\",\r\n top: 2,\r\n // height: \"100%\",\r\n }}\r\n >\r\n <Box sx={listingValuesStyles.headerContainer}>\r\n <Typography variant=\"h6\" sx={listingValuesStyles.heading}>\r\n {headerText}\r\n </Typography>\r\n <Button\r\n onClick={onClick}\r\n variant=\"text\"\r\n size=\"small\"\r\n sx={listingValuesStyles.button}\r\n disabled={filteredValues.length === 0}\r\n >\r\n {buttonText}\r\n </Button>\r\n </Box>\r\n\r\n {searchTerm !== undefined && setSearchTerm !== undefined && (\r\n <CustomSearch value={searchTerm} onChange={setSearchTerm} />\r\n )}\r\n\r\n <Box ref={setNodeRef} sx={listingValuesStyles.draggableContainer}>\r\n {enableDragAndDrop ? (\r\n <SortableContext\r\n items={filteredValues.map((item) => item.value)}\r\n strategy={verticalListSortingStrategy}\r\n >\r\n <Box sx={listingValuesStyles.draggableCover}>\r\n {filteredValues.map((item) => (\r\n <DraggableListItem\r\n key={item.value}\r\n id={item.value}\r\n containerId={containerId}\r\n >\r\n <ListingValuesContent\r\n item={item}\r\n containerId={containerId}\r\n onItemToggle={onItemToggle}\r\n />\r\n </DraggableListItem>\r\n ))}\r\n </Box>\r\n </SortableContext>\r\n ) : (\r\n <Box sx={listingValuesStyles.draggableCover}>\r\n {filteredValues?.length > 0 &&\r\n filteredValues.map((item) => (\r\n <ListingValuesContent\r\n key={item.value}\r\n item={item}\r\n containerId={containerId}\r\n onItemToggle={onItemToggle}\r\n />\r\n ))}\r\n </Box>\r\n )}\r\n </Box>\r\n </Box>\r\n {AlertComponenet && AlertComponenet}\r\n </>\r\n )}\r\n </Grid>\r\n );\r\n};\r\n\r\nexport default ListingValues;\r\n","import { Alert, Box } from \"@mui/material\";\r\n\r\ninterface InfoAlertProps {\r\n message: string;\r\n width?: string | number;\r\n top?: number | string;\r\n color?: string;\r\n zIndex?: number;\r\n position?: \"absolute\" | \"relative\" | \"fixed\" | \"sticky\";\r\n}\r\n\r\nconst InfoAlert = ({\r\n message,\r\n width = \"100%\",\r\n top = 10,\r\n color = \"#088AB2\",\r\n zIndex = -1,\r\n position = \"absolute\",\r\n}: InfoAlertProps) => {\r\n return (\r\n <Box\r\n sx={{\r\n fontSize: \"12px\",\r\n color,\r\n width,\r\n height: \"fit-content\",\r\n position,\r\n zIndex,\r\n top,\r\n }}\r\n >\r\n <Alert sx={{ borderRadius: \"12px 12px 0 0 !important\" }} severity=\"info\">\r\n {message}\r\n </Alert>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default InfoAlert;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport {\r\n Box,\r\n Select,\r\n MenuItem,\r\n FormControl,\r\n Typography,\r\n Checkbox,\r\n FormControlLabel,\r\n Grid,\r\n Alert,\r\n} from \"@mui/material\";\r\n\r\nimport ListingValues from \"../common/listing-values\";\r\nimport {\r\n DndContext,\r\n closestCenter,\r\n KeyboardSensor,\r\n MouseSensor,\r\n TouchSensor,\r\n useSensor,\r\n useSensors,\r\n DragEndEvent,\r\n} from \"@dnd-kit/core\";\r\nimport {\r\n QuickTabConfigProps,\r\n SettingsQuickTabProps,\r\n} from \"../../../types/filter-settings\";\r\nimport { TabsStyles } from \"../style\";\r\nimport InfoAlert from \"../common/info-alert\";\r\nimport { useFullscreenPopoverContainer } from \"../../../libs/hooks/useFullScreen\";\r\nimport { ColumnItem } from \"./column\";\r\n\r\nconst QuickTab = ({\r\n filterSettingStates,\r\n columnsData,\r\n tabsApiData,\r\n tabsApiDataLoading,\r\n activeTab,\r\n columnTabAttributes,\r\n isFlatJson,\r\n}: SettingsQuickTabProps) => {\r\n const {\r\n settingsData,\r\n setSettingsData,\r\n saveButtonError,\r\n setSaveButtonError,\r\n columnTabState,\r\n sortingTabState,\r\n } = filterSettingStates;\r\n const { container: fullscreenContainer } = useFullscreenPopoverContainer();\r\n\r\n const [searchTerm, setSearchTerm] = useState<string>(\"\");\r\n const [currentQuickAttribute, setCurrentQuickAttribute] = useState<string>(\r\n settingsData?.quick_tab?.attribute || \"\"\r\n );\r\n\r\n const quickTabStates = settingsData?.quick_tab as QuickTabConfigProps;\r\n const mappedColumns: ColumnItem[] =\r\n columnTabAttributes?.map((column) => ({\r\n label: column?.name,\r\n value: column?.attribute_key,\r\n })) || [];\r\n // const activeTabIndex = filterSettingStates?.columnTabState?.tabs?.findIndex(\r\n // (tab) => tab?.tab_name?.value == activeTab\r\n // // tab?.tab_name?.label?.toLowerCase() == activeTab?.toLowerCase()\r\n // );\r\n // In case there is no quick tab state from API\r\n const normalizeTabItem = (item: any) => ({\r\n label: item.label,\r\n value: isFlatJson ? item.label : item.value,\r\n });\r\n useEffect(() => {\r\n const stateToArray =\r\n (quickTabStates && Object.entries(quickTabStates)) || [];\r\n const isEmptyState = stateToArray.length ? false : true;\r\n\r\n if (isEmptyState) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n attribute: columnsData[0]?.value,\r\n sorting: \"asc\",\r\n },\r\n }));\r\n }\r\n }, [columnsData]);\r\n\r\n // When user changes attribute\r\n useEffect(() => {\r\n if (currentQuickAttribute === settingsData?.quick_tab?.attribute) return;\r\n\r\n const normalizedTabs = tabsApiData?.map(normalizeTabItem) || [];\r\n\r\n if (tabsApiData?.length) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n hide_list: normalizedTabs,\r\n show_list: [],\r\n },\r\n }));\r\n\r\n setCurrentQuickAttribute(settingsData?.quick_tab?.attribute || \"\");\r\n } else {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n hide_list: [],\r\n show_list: [],\r\n },\r\n }));\r\n\r\n setCurrentQuickAttribute(\"\");\r\n }\r\n }, [tabsApiData]);\r\n\r\n // Validation when user changes show list or hide list\r\n useEffect(() => {\r\n const showList = quickTabStates?.show_list || [];\r\n const hideList = quickTabStates?.hide_list || [];\r\n\r\n if (showList || hideList) {\r\n // Check if showList is valid (between 1 and 5 items)\r\n const isValidShowList = showList.length > 0 && showList.length <= 5;\r\n const ERROR_CODE = \"quick_tab_error\";\r\n\r\n if (!isValidShowList) {\r\n const errorMessage = {\r\n type: ERROR_CODE,\r\n message:\r\n showList.length === 0\r\n ? \"Quick Tab: Please select at least one item\"\r\n : \"Quick Tab: Please select no more than 5 items\",\r\n };\r\n\r\n // Check if the error is already present in the messages array\r\n const hasQuickTabError = saveButtonError?.messages?.some(\r\n (message) => message.type === ERROR_CODE\r\n );\r\n\r\n // Update the error state\r\n\r\n // Later we can use this to show error message when we will make error logic more simple\r\n // setSaveButtonError((prev) => {\r\n // const otherMessages =\r\n // prev?.messages?.filter((message) => message.type !== ERROR_CODE) ||\r\n // [];\r\n\r\n // return {\r\n // ...prev,\r\n // hasError: true,\r\n // messages: hasQuickTabError\r\n // ? [...prev?.messages]\r\n // : [...otherMessages, errorMessage],\r\n // };\r\n // });\r\n } else {\r\n const hasOtherMessages = saveButtonError?.messages?.some(\r\n (message) => message.type !== ERROR_CODE\r\n );\r\n // Reset error state if the list is valid\r\n // setSaveButtonError((prev) => ({\r\n // ...prev,\r\n // hasError: hasOtherMessages,\r\n // messages:\r\n // prev?.messages?.filter((message) => message.type !== ERROR_CODE) ||\r\n // [],\r\n // }));\r\n }\r\n }\r\n }, [quickTabStates?.hide_list, quickTabStates?.show_list]);\r\n\r\n const sortingOptions = [\r\n { label: \"A-Z\", value: \"asc\" },\r\n { label: \"Z-A\", value: \"dsc\" },\r\n { label: \"Count (Ascending)\", value: \"count_asc\" },\r\n { label: \"Count (Descending)\", value: \"count_dsc\" },\r\n { label: \"Custom\", value: \"custom\" },\r\n ];\r\n\r\n // Convert show_list/hide_list to FilterValue[] for rendering only\r\n\r\n const constructHideList = () => {\r\n const normalizedTabs = tabsApiData?.map(normalizeTabItem) || [];\r\n\r\n // remove items already in show_list (value-safe comparison)\r\n return normalizedTabs?.filter(\r\n (tab) => !showListValues?.some((i) => i?.value === tab?.value)\r\n );\r\n };\r\n\r\n const showListValues = quickTabStates?.show_list || [];\r\n const hideListValues = constructHideList() || [];\r\n\r\n const sensors = useSensors(\r\n useSensor(MouseSensor),\r\n useSensor(TouchSensor),\r\n useSensor(KeyboardSensor)\r\n );\r\n\r\n // Drag and drop logic, update only local state\r\n const handleDragEnd = (event: DragEndEvent) => {\r\n const { active, over } = event;\r\n if (!over) return;\r\n\r\n const currentContainer = active.data.current?.containerId;\r\n const overContainer = over.data.current?.containerId;\r\n\r\n if (!currentContainer || !overContainer) return;\r\n\r\n let newShowList = [...(quickTabStates.show_list ?? [])];\r\n let newHideList = [...(quickTabStates.hide_list ?? [])];\r\n\r\n // -------------------------------------\r\n // CASE 1: REORDER INSIDE SAME LIST\r\n // -------------------------------------\r\n if (currentContainer === overContainer) {\r\n if (currentContainer === \"list\") {\r\n const oldIndex = newHideList.findIndex((i) => i.value === active.id);\r\n const newIndex = newHideList.findIndex((i) => i.value === over.id);\r\n\r\n if (oldIndex !== -1 && newIndex !== -1) {\r\n const [removed] = newHideList.splice(oldIndex, 1);\r\n newHideList.splice(newIndex, 0, removed);\r\n }\r\n } else {\r\n const oldIndex = newShowList.findIndex((i) => i.value === active.id);\r\n const newIndex = newShowList.findIndex((i) => i.value === over.id);\r\n\r\n if (oldIndex !== -1 && newIndex !== -1) {\r\n const [removed] = newShowList.splice(oldIndex, 1);\r\n newShowList.splice(newIndex, 0, removed);\r\n }\r\n }\r\n }\r\n\r\n // -------------------------------------\r\n // CASE 2: MOVE BETWEEN LISTS\r\n // -------------------------------------\r\n if (currentContainer !== overContainer) {\r\n if (currentContainer === \"list\" && overContainer === \"tabs\") {\r\n if (newShowList.length < 5) {\r\n const idx = newHideList.findIndex(\r\n (i) => i.value === String(active.id)\r\n );\r\n if (idx !== -1) {\r\n const item = newHideList.splice(idx, 1)[0];\r\n newShowList.push(item);\r\n\r\n // 🌟 ALSO create sorting tab entry if missing\r\n // if (!settingsData?.sorting?.isDefault) {\r\n // const exists = settingsData.sorting?.tabs?.some(\r\n // (t) => t.tab_name.value === item.value\r\n // );\r\n\r\n // if (!exists) {\r\n // settingsData?.sorting.tabs.push({\r\n // tab_name: item,\r\n // sortby: [{ column: \"\", order: \"asc\" }],\r\n // });\r\n // }\r\n // }\r\n\r\n setSettingsData((prev) => {\r\n let updatedSorting = prev.sorting;\r\n let updatedColumn = prev.column;\r\n\r\n // ---------------------------------------------------\r\n // ⭐ Add to sorting.tabs (if not default and not exist)\r\n // ---------------------------------------------------\r\n if (!prev?.sorting?.isDefault) {\r\n const sortingExists = prev.sorting?.tabs?.some(\r\n (t) => t.tab_name.value === item.value\r\n );\r\n\r\n if (!sortingExists) {\r\n updatedSorting = {\r\n ...prev.sorting,\r\n tabs: [\r\n ...prev.sorting.tabs,\r\n {\r\n tab_name: item,\r\n sortby: [],\r\n },\r\n ],\r\n };\r\n }\r\n }\r\n\r\n // ---------------------------------------------------\r\n // ⭐ Add to column.tabs (if not default and not exist)\r\n // ---------------------------------------------------\r\n if (!prev?.column?.isDefault) {\r\n const columnExists = prev.column?.tabs?.some(\r\n (t) => t.tab_name.value === item.value\r\n );\r\n\r\n if (!columnExists) {\r\n updatedColumn = {\r\n ...prev.column,\r\n tabs: [\r\n ...prev.column.tabs,\r\n {\r\n tab_name: item,\r\n show_list: mappedColumns,\r\n hide_list: [],\r\n },\r\n ],\r\n };\r\n }\r\n }\r\n\r\n // ---------------------------------------------------\r\n // ⭐ FINAL RETURN\r\n // ---------------------------------------------------\r\n return {\r\n ...prev,\r\n sorting: updatedSorting,\r\n column: updatedColumn,\r\n };\r\n });\r\n }\r\n }\r\n } else if (currentContainer === \"tabs\" && overContainer === \"list\") {\r\n const idx = newShowList.findIndex((i) => i.value === String(active.id));\r\n if (idx !== -1) {\r\n const item = newShowList.splice(idx, 1)[0];\r\n newHideList.push(item);\r\n setSettingsData((prev) => {\r\n let updatedSorting = prev.sorting;\r\n let updatedColumn = prev.column;\r\n\r\n // ---------------------------------------------------\r\n // Remove from sorting.tabs (if not default)\r\n // ---------------------------------------------------\r\n if (!prev?.sorting?.isDefault) {\r\n updatedSorting = {\r\n ...prev.sorting,\r\n tabs: prev?.sorting?.tabs?.filter(\r\n (t) => t.tab_name?.value !== item?.value\r\n ),\r\n };\r\n }\r\n\r\n // ---------------------------------------------------\r\n // Remove from column.tabs (if not default)\r\n // ---------------------------------------------------\r\n if (!prev?.column?.isDefault) {\r\n updatedColumn = {\r\n ...prev.column,\r\n tabs: prev?.column?.tabs?.filter(\r\n (t) => t.tab_name?.value !== item?.value\r\n ),\r\n };\r\n }\r\n\r\n // ---------------------------------------------------\r\n // ⭐ FINAL RETURN\r\n // ---------------------------------------------------\r\n return {\r\n ...prev,\r\n sorting: updatedSorting,\r\n column: updatedColumn,\r\n };\r\n });\r\n }\r\n }\r\n }\r\n\r\n // ----------------------------------------------------------\r\n // ⭐ APPLY MASTER UPDATE (with isDefault CHECK for columns)\r\n // ----------------------------------------------------------\r\n setSettingsData((prev) => {\r\n let updatedColumn = prev.column;\r\n\r\n // -----------------------------------------\r\n // ⭐ COLUMN REORDER (only if NOT default)\r\n // -----------------------------------------\r\n if (!prev?.column?.isDefault) {\r\n updatedColumn = {\r\n ...prev.column,\r\n tabs: prev.column?.tabs\r\n ? [...prev.column.tabs].sort((a, b) => {\r\n const i1 = newShowList.findIndex(\r\n (t) => t.value === a.tab_name.value\r\n );\r\n const i2 = newShowList.findIndex(\r\n (t) => t.value === b.tab_name.value\r\n );\r\n return i1 - i2;\r\n })\r\n : [],\r\n };\r\n }\r\n\r\n // -----------------------------------------\r\n // ⭐ SORTING REORDER (same pattern as column)\r\n // -----------------------------------------\r\n const updatedSorting = (() => {\r\n // If default → clear tabs\r\n if (prev.sorting?.isDefault) {\r\n return {\r\n isDefault: true,\r\n sort_by: prev.sorting?.sort_by || \"asc\",\r\n };\r\n }\r\n\r\n // If custom → reorder tabs based on newShowList\r\n const sorted = {\r\n ...prev.sorting,\r\n tabs: prev.sorting?.tabs\r\n ? [...prev.sorting.tabs].sort((a, b) => {\r\n const i1 = newShowList.findIndex(\r\n (t) => t.value === a.tab_name.value\r\n );\r\n const i2 = newShowList.findIndex(\r\n (t) => t.value === b.tab_name.value\r\n );\r\n return i1 - i2;\r\n })\r\n : [],\r\n };\r\n return sorted;\r\n })();\r\n\r\n // FINAL RETURN\r\n return {\r\n ...prev,\r\n quick_tab: {\r\n ...prev.quick_tab,\r\n show_list: newShowList,\r\n hide_list: newHideList,\r\n },\r\n column: updatedColumn,\r\n sorting: updatedSorting,\r\n };\r\n });\r\n };\r\n\r\n const filteredListValues = hideListValues.filter((value) =>\r\n value?.label?.toLowerCase().includes(searchTerm.toLowerCase())\r\n );\r\n\r\n // Show All/Hide All logic (local only)\r\n const handleShowAll = () => {\r\n const currentShowList = quickTabStates.show_list || [];\r\n const currentHideList = quickTabStates.hide_list || [];\r\n\r\n const availableSlots = 5 - currentShowList.length;\r\n\r\n if (availableSlots <= 0) return; // Already at limit\r\n\r\n const limitedHideList = currentHideList.slice(0, availableSlots);\r\n\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n show_list: [...currentShowList, ...limitedHideList],\r\n hide_list: currentHideList.filter(\r\n (item) => !limitedHideList.find((i) => i.value === item.value)\r\n ),\r\n },\r\n }));\r\n };\r\n\r\n const handleHideAll = () => {\r\n setSettingsData((prev) => {\r\n const updatedQuickTab = {\r\n ...prev?.quick_tab,\r\n hide_list: [\r\n ...(prev?.quick_tab?.hide_list || []),\r\n ...(prev?.quick_tab?.show_list || []),\r\n ],\r\n show_list: [],\r\n };\r\n\r\n // Reset only the lists, not the whole structure\r\n const updatedColumn = (() => {\r\n if (prev?.column?.isDefault) {\r\n return {\r\n ...prev.column,\r\n show_list: [],\r\n hide_list: [\r\n ...(prev.column?.hide_list || []),\r\n ...(prev.column?.show_list || []),\r\n ],\r\n };\r\n }\r\n\r\n // Tab mode → reset each tab's field lists\r\n const updatedTabs = prev?.column?.tabs?.map((t) => ({\r\n ...t,\r\n show_list: [],\r\n hide_list: [...(t.hide_list || []), ...(t.show_list || [])],\r\n }));\r\n\r\n return {\r\n ...prev.column,\r\n tabs: updatedTabs,\r\n };\r\n })();\r\n\r\n const updatedSorting = (() => {\r\n // DEFAULT MODE: sorting applies globally\r\n if (prev.sorting?.isDefault) {\r\n return {\r\n ...prev.sorting,\r\n sortby: [], // reset sort\r\n };\r\n }\r\n\r\n // TAB MODE: need to clear sorting per tab\r\n return {\r\n ...prev.sorting,\r\n tabs: prev.quick_tab?.show_list?.map(() => ({\r\n sortby: [],\r\n })),\r\n };\r\n })();\r\n\r\n return {\r\n ...prev,\r\n quick_tab: updatedQuickTab,\r\n column: updatedColumn,\r\n sorting: updatedSorting,\r\n };\r\n });\r\n };\r\n\r\n // Checkbox logic (local only)\r\n const handleShowAllTabChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n isAllSelected: e.target.checked,\r\n },\r\n }));\r\n };\r\n const handleCombineOtherTabChange = (\r\n e: React.ChangeEvent<HTMLInputElement>\r\n ) => {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n isCombineOther: e.target.checked,\r\n },\r\n }));\r\n };\r\n\r\n const handleItemToggle = (\r\n item: { label: string; value: string },\r\n fromContainerId: string\r\n ) => {\r\n const toShowList = [...(quickTabStates.show_list ?? [])];\r\n const toHideList = [...(quickTabStates.hide_list ?? [])];\r\n\r\n setSettingsData((prev) => {\r\n let updatedColumn = prev.column; // default (unchanged)\r\n let updatedSorting = prev.sorting;\r\n\r\n if (fromContainerId === \"list\") {\r\n if (toShowList.length >= 5) return prev;\r\n\r\n const index = toHideList.findIndex((i) => i.value == item.value);\r\n if (index > -1) {\r\n toHideList.splice(index, 1);\r\n toShowList.push(item);\r\n // 🌟 ALSO create sorting tab entry if missing\r\n if (!sortingTabState?.isDefault) {\r\n const exists = prev.sorting?.tabs?.some(\r\n (t) => t.tab_name.value === item.value\r\n );\r\n if (!exists) {\r\n updatedSorting = {\r\n ...prev.sorting,\r\n tabs: [\r\n ...prev.sorting.tabs,\r\n {\r\n tab_name: {\r\n label: item.label,\r\n value: item.value,\r\n },\r\n sortby: [],\r\n },\r\n ],\r\n };\r\n }\r\n }\r\n if (!columnTabState?.isDefault) {\r\n const exists = prev?.column?.tabs?.some(\r\n (t) => t.tab_name.value === item.value\r\n );\r\n if (!exists) {\r\n updatedColumn = {\r\n ...prev.column,\r\n tabs: [\r\n ...prev.column.tabs,\r\n {\r\n tab_name: {\r\n label: item.label,\r\n value: item.value,\r\n },\r\n show_list: mappedColumns,\r\n hide_list: [],\r\n },\r\n ],\r\n };\r\n }\r\n }\r\n }\r\n } else if (fromContainerId === \"tabs\") {\r\n const index = toShowList.findIndex((i) => i.value == item.value);\r\n if (index > -1) {\r\n toShowList.splice(index, 1);\r\n toHideList.push(item);\r\n // let itemIndex =\r\n // filterSettingStates?.quickTabStates?.show_list?.findIndex(\r\n // (i) => i.value == item.value\r\n // );\r\n // 🔥 REMOVE COLUMN WHEN TAB REMOVED (if not default)\r\n if (!columnTabState?.isDefault) {\r\n const updatedTabs = prev?.column?.tabs.filter(\r\n (tab) => tab.tab_name?.value !== item.value\r\n );\r\n\r\n updatedColumn = {\r\n ...prev.column,\r\n tabs: updatedTabs,\r\n };\r\n }\r\n\r\n if (!sortingTabState.isDefault) {\r\n const updatedSortingTabs = prev?.sorting?.tabs?.filter(\r\n (tab) => tab.tab_name?.value != item.value\r\n );\r\n updatedSorting = {\r\n ...prev.sorting,\r\n tabs: updatedSortingTabs,\r\n };\r\n }\r\n }\r\n }\r\n\r\n return {\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n show_list: toShowList,\r\n hide_list: toHideList,\r\n },\r\n column: updatedColumn,\r\n sorting: updatedSorting,\r\n };\r\n });\r\n };\r\n\r\n const enableDND = quickTabStates?.sorting === \"custom\" ? true : false;\r\n\r\n return (\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n // gap: \"0.5rem\",\r\n height: \"100%\",\r\n }}\r\n >\r\n <Typography variant=\"caption\" sx={TabsStyles.mainTabsHeader}>\r\n *Quick filter settings will be reflected in horizontal tabs\r\n </Typography>\r\n <Box>\r\n <Grid sx={{ position: \"relative\" }} container>\r\n <Grid size={12}>\r\n <Box>\r\n <Grid sx={TabsStyles.mainTabDropdown} size={6}>\r\n <FormControl sx={TabsStyles.mainTabSelect} size=\"small\">\r\n <Select\r\n value={quickTabStates?.attribute || \"\"}\r\n onChange={(e) =>\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n attribute: e.target.value,\r\n },\r\n column: prev?.column?.isDefault\r\n ? {\r\n ...prev?.column,\r\n show_list: mappedColumns,\r\n hide_list: [],\r\n }\r\n : {\r\n ...prev?.column,\r\n tabs: [],\r\n },\r\n\r\n sorting: prev?.sorting?.isDefault\r\n ? {\r\n ...prev?.sorting,\r\n sortby: [],\r\n }\r\n : {\r\n ...prev?.sorting,\r\n tabs: [],\r\n },\r\n }))\r\n }\r\n MenuProps={{ container: fullscreenContainer }}\r\n >\r\n {columnsData?.map((column: any) => (\r\n <MenuItem key={column?.value} value={column?.value}>\r\n {column?.label}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n <FormControl\r\n sx={TabsStyles.selectDropdownSeparator}\r\n size=\"small\"\r\n >\r\n <Select\r\n value={quickTabStates?.sorting || \"asc\"}\r\n onChange={(e) =>\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n quick_tab: {\r\n ...prev?.quick_tab,\r\n sorting: e.target.value,\r\n },\r\n }))\r\n }\r\n MenuProps={{ container: fullscreenContainer }}\r\n >\r\n {sortingOptions.map((option) => (\r\n <MenuItem key={option?.value} value={option?.value}>\r\n {option?.label}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Grid>\r\n </Box>\r\n </Grid>\r\n <Grid>\r\n {/* <Alert\r\n severity=\"info\"\r\n sx={{\r\n fontSize: \"12px\",\r\n color: \"#088AB2\",\r\n }}\r\n >\r\n Please select at least 1 and at most 5 values to display as tabs.\r\n </Alert> */}\r\n </Grid>\r\n <DndContext\r\n sensors={sensors}\r\n collisionDetection={closestCenter}\r\n onDragEnd={handleDragEnd}\r\n >\r\n <Grid sx={{ mt: 1 }} container spacing={2} size={12}>\r\n <ListingValues\r\n buttonText=\"Show All\"\r\n onClick={handleShowAll}\r\n headerText=\"List of Values\"\r\n filteredValues={filteredListValues}\r\n searchTerm={searchTerm}\r\n setSearchTerm={setSearchTerm}\r\n containerId=\"list\"\r\n tabsApiDataLoading={tabsApiDataLoading}\r\n onItemToggle={handleItemToggle}\r\n enableDragAndDrop={enableDND}\r\n />\r\n <ListingValues\r\n buttonText=\"Hide All\"\r\n onClick={handleHideAll}\r\n headerText=\"View as Tabs\"\r\n filteredValues={showListValues}\r\n containerId=\"tabs\"\r\n // tabsApiDataLoading={tabsApiDataLoading}\r\n onItemToggle={handleItemToggle}\r\n enableDragAndDrop={enableDND}\r\n AlertComponenet={\r\n <InfoAlert\r\n message=\"Please select at least 1 and at most 5 values to display as\r\n tabs.\"\r\n width={\"49.2%\"}\r\n // position=\"absolute\"\r\n // color=\"#088AB2\"\r\n // top={10}\r\n zIndex={-1}\r\n />\r\n }\r\n />\r\n </Grid>\r\n </DndContext>\r\n <Grid size={12}>\r\n <Box sx={TabsStyles.checkboxStyle}>\r\n <FormControlLabel\r\n control={\r\n <Checkbox\r\n checked={quickTabStates?.isAllSelected || false}\r\n onChange={handleShowAllTabChange}\r\n size=\"small\"\r\n sx={{\r\n \"&.Mui-checked\": {\r\n color: \"#7A5AF8\",\r\n },\r\n }}\r\n />\r\n }\r\n label='Show \"All\" tab'\r\n />\r\n <FormControlLabel\r\n control={\r\n <Checkbox\r\n checked={quickTabStates?.isCombineOther || false}\r\n onChange={handleCombineOtherTabChange}\r\n size=\"small\"\r\n sx={{\r\n \"&.Mui-checked\": {\r\n color: \"#7A5AF8\",\r\n },\r\n }}\r\n />\r\n }\r\n label='Combine remaining values under \"Other\" tab'\r\n />\r\n </Box>\r\n </Grid>\r\n </Grid>\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default QuickTab;\r\n","import {\r\n SxProps,\r\n ToggleButton,\r\n ToggleButtonGroup,\r\n ToggleButtonGroupProps,\r\n} from \"@mui/material\";\r\nimport { ToggleButtonTabsProps } from \"../../../types/filter-settings\";\r\n\r\nconst selectedTabStyle: SxProps = {\r\n textTransform: \"initial\",\r\n minWidth: \"5rem\",\r\n minHeight: \"1.875rem\",\r\n color: \"#7A5AF8\",\r\n fontWeight: 500,\r\n fontSize: \"0.813rem\",\r\n borderColor: \"#7A5AF8\",\r\n\r\n \"&.Mui-selected\": {\r\n backgroundColor: \"#7A5AF8\",\r\n color: \"#fff\",\r\n fontWeight: 600,\r\n \"&:hover\": {\r\n backgroundColor: \"#6346e2\",\r\n },\r\n },\r\n};\r\n\r\nexport default function CustomToggleSwitchButton({\r\n buttons,\r\n ...props\r\n}: { buttons: ToggleButtonTabsProps[] } & ToggleButtonGroupProps) {\r\n return (\r\n <ToggleButtonGroup\r\n exclusive\r\n size=\"small\"\r\n color=\"primary\"\r\n sx={{ marginTop: \"-4px\", marginBottom: \"6px\" }}\r\n {...props}\r\n >\r\n {buttons.map((button) => (\r\n <ToggleButton\r\n key={button?.label}\r\n value={button?.value}\r\n disabled={button?.isDisabled}\r\n sx={selectedTabStyle}\r\n >\r\n {button?.label}\r\n </ToggleButton>\r\n ))}\r\n </ToggleButtonGroup>\r\n );\r\n}\r\n","import { ToggleButtonTabsProps } from \"../../types/filter-settings\";\r\n\r\nexport const SETTINGS_TABS: { label: string }[] = [\r\n { label: \"Quick Tab\" },\r\n { label: \"Column\" },\r\n { label: \"Sorting\" },\r\n];\r\n\r\nexport const KANBAN_SETTINGS_TABS: { label: string }[] = [\r\n { label: \"Lane\" },\r\n { label: \"Swim Lane\" },\r\n];\r\n\r\nexport const LANE_SELECTS = [\r\n { key: \"stage_group\", value: \"Stage Group\" },\r\n { key: \"stage\", value: \"Stage\" },\r\n { key: \"source\", value: \"Source\" },\r\n { key: \"status\", value: \"Status\" },\r\n];\r\n\r\nexport const TOGGLE_BUTTON_TABS: ToggleButtonTabsProps[] = [\r\n { label: \"Default\", value: true, isDisabled: false },\r\n { label: \"Tab Wise\", value: false, isDisabled: false },\r\n];\r\n\r\n","import { Tabs, TabsProps } from \"@mui/material\";\r\nimport { horizontalTabStyles } from \"../styles\";\r\n\r\nconst CustomTabs = ({ children, ...props }: TabsProps) => {\r\n const { value, onChange } = props;\r\n\r\n return (\r\n <Tabs\r\n value={value}\r\n onChange={onChange}\r\n aria-label=\"horizontal-tabs\"\r\n variant=\"scrollable\"\r\n sx={horizontalTabStyles.mainTabsContainer}\r\n {...props}\r\n >\r\n {children}\r\n </Tabs>\r\n );\r\n};\r\n\r\nexport default CustomTabs;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { Box, Typography, Tab, Grid } from \"@mui/material\";\r\n\r\nimport ListingValues from \"../common/listing-values\";\r\nimport {\r\n DndContext,\r\n closestCenter,\r\n KeyboardSensor,\r\n MouseSensor,\r\n TouchSensor,\r\n useSensor,\r\n useSensors,\r\n DragEndEvent,\r\n} from \"@dnd-kit/core\";\r\nimport { craftTableFilterSettingsOptionsProps } from \"../../../types/table-options\";\r\nimport CustomToggleSwitchButton from \"./toggle-button-switch\";\r\nimport { FilterColumnsDataProps } from \"../../../types/filter\";\r\nimport { TOGGLE_BUTTON_TABS } from \"../constants\";\r\nimport CustomTabs from \"../tabs/horizontal\";\r\nimport { ColumnTabConfigProps } from \"../../../types/filter-settings\";\r\nimport InfoAlert from \"../common/info-alert\";\r\n\r\nexport interface ColumnItem {\r\n label: string;\r\n value: string;\r\n}\r\n\r\nexport interface TabData {\r\n tab_name: string;\r\n show_list: ColumnItem[];\r\n hide_list: ColumnItem[];\r\n}\r\n\r\ninterface ColumnTabProps {\r\n filterSettingStates: craftTableFilterSettingsOptionsProps;\r\n columnsData: FilterColumnsDataProps;\r\n columnTabAttributes?: any[];\r\n columnTabAttributesLoading?: boolean;\r\n}\r\n\r\nconst ColumnTab = ({\r\n filterSettingStates,\r\n columnsData,\r\n columnTabAttributes,\r\n columnTabAttributesLoading,\r\n}: ColumnTabProps) => {\r\n const [searchTerm, setSearchTerm] = useState<string>(\"\");\r\n const [selectedTabIndex, setSelectedTabIndex] = useState<number>(0);\r\n\r\n const {\r\n quickTabStates,\r\n settingsData,\r\n setSettingsData,\r\n saveButtonError,\r\n setSaveButtonError,\r\n } = filterSettingStates;\r\n const settingsColumnState = (settingsData?.column ||\r\n {}) as ColumnTabConfigProps;\r\n const isColumnDefault = settingsColumnState?.isDefault || false;\r\n const ERROR_CODE = \"column_error\";\r\n\r\n /**\r\n * ? What is this for?\r\n *\r\n * Three main conditions are checked here:\r\n * - If the state is empty, then set the state to default and add all columns in show_list\r\n * - if Default is selected and Default is empty, then add all columns in show_list\r\n * - If Default is not selected and tabs is empty, then add all columns in show_list\r\n * of their respective tabs\r\n */\r\n useEffect(() => {\r\n const stateToArray = Object.entries(settingsColumnState) || [];\r\n const isStateEmpty = stateToArray.length ? false : true;\r\n const isDefaultEmpty =\r\n settingsColumnState?.show_list?.length ||\r\n settingsColumnState?.hide_list?.length\r\n ? false\r\n : true;\r\n const isTabWiseEmpty = settingsColumnState?.tabs?.length ? false : true;\r\n\r\n const mappedColumns: ColumnItem[] =\r\n columnTabAttributes?.map((column) => ({\r\n ...column,\r\n label: column?.name,\r\n value: column?.attribute_key,\r\n })) || [];\r\n\r\n if (isStateEmpty) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n isDefault: true,\r\n show_list: mappedColumns,\r\n hide_list: [],\r\n },\r\n }));\r\n } else if (isColumnDefault && isDefaultEmpty) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column,\r\n show_list: mappedColumns,\r\n hide_list: [],\r\n },\r\n }));\r\n } else if (!isColumnDefault) {\r\n const mappedTabs: TabData[] = isTabWiseEmpty\r\n ? quickTabStates?.show_list?.map((tab) => ({\r\n tab_name: tab,\r\n show_list: mappedColumns,\r\n hide_list: [],\r\n })) || []\r\n : quickTabStates?.show_list?.map((tab, index) => ({\r\n tab_name: tab,\r\n show_list:\r\n settingsColumnState?.tabs[index]?.show_list || mappedColumns,\r\n hide_list: settingsColumnState?.tabs[index]?.hide_list || [],\r\n })) || [];\r\n\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column, // ✅ required to satisfy SettingsDataProps\r\n tabs: mappedTabs, // updating only tabs\r\n },\r\n }));\r\n }\r\n }, [isColumnDefault]);\r\n\r\n useEffect(() => {\r\n const showList = settingsColumnState?.show_list || [];\r\n const hideList = settingsColumnState?.hide_list || [];\r\n\r\n if (showList || hideList) {\r\n const isValidShowList = showList?.length > 0;\r\n\r\n if (!isValidShowList) {\r\n const hasColumnError = saveButtonError.messages.some(\r\n (message) => message.type === ERROR_CODE\r\n );\r\n\r\n if (!hasColumnError) {\r\n setSaveButtonError((prev) => ({\r\n ...prev,\r\n hasError: true,\r\n messages: [\r\n ...prev.messages,\r\n {\r\n type: ERROR_CODE,\r\n message: \"Column: Please select at least one column\",\r\n },\r\n ],\r\n }));\r\n }\r\n } else {\r\n const hasOtherMessages = saveButtonError?.messages?.some(\r\n (message) => message.type !== ERROR_CODE\r\n );\r\n\r\n // Reset error state if the list is valid\r\n setSaveButtonError((prev) => ({\r\n ...prev,\r\n hasError: hasOtherMessages,\r\n messages:\r\n prev?.messages?.filter((message) => message.type !== ERROR_CODE) ||\r\n [],\r\n }));\r\n }\r\n }\r\n }, [settingsColumnState?.show_list, settingsColumnState?.hide_list]);\r\n\r\n const sensors = useSensors(\r\n useSensor(MouseSensor),\r\n useSensor(TouchSensor),\r\n useSensor(KeyboardSensor)\r\n );\r\n\r\n const handleToggleChange = (\r\n _: React.MouseEvent<HTMLElement>,\r\n newValue: boolean\r\n ) => {\r\n if (newValue !== null) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column,\r\n isDefault: newValue,\r\n },\r\n }));\r\n }\r\n };\r\n\r\n const constructHideList = (): ColumnItem[] => {\r\n return (\r\n columnTabAttributes\r\n ?.map((column) => ({\r\n label: column?.name,\r\n value: column?.attribute_key,\r\n }))\r\n ?.filter(\r\n (tab) =>\r\n !settingsColumnState?.show_list?.find((i) => i.value === tab.value)\r\n ) || []\r\n );\r\n };\r\n const getCurrentLists = () => {\r\n if (settingsColumnState?.isDefault) {\r\n return {\r\n showList: settingsColumnState.show_list || [],\r\n hideList: constructHideList() || [],\r\n };\r\n } else {\r\n const currentTab = settingsColumnState?.tabs?.[selectedTabIndex];\r\n return {\r\n showList: currentTab?.show_list || [],\r\n hideList:\r\n currentTab?.hide_list ||\r\n columnTabAttributes?.map((column) => ({\r\n label: column?.name,\r\n value: column?.attribute_key,\r\n })) ||\r\n [],\r\n };\r\n }\r\n };\r\n\r\n const { showList, hideList } = getCurrentLists();\r\n\r\n const showListValues = showList.map((item) => ({\r\n value: item.value,\r\n label: item.label,\r\n visible: true,\r\n }));\r\n\r\n const hideListValues = hideList.map((item) => ({\r\n value: item.value,\r\n label: item.label,\r\n visible: false,\r\n }));\r\n\r\n const filteredListValues = hideListValues.filter((value) =>\r\n value.label.toLowerCase().includes(searchTerm.toLowerCase())\r\n );\r\n\r\n const handleItemToggle = (\r\n item: { label: string; value: string },\r\n fromContainerId: string\r\n ) => {\r\n let newShowList = [...showList];\r\n let newHideList = [...hideList];\r\n\r\n if (fromContainerId === \"tabs\") {\r\n const idx = newShowList.findIndex((i) => i.value === item.value);\r\n if (idx > -1) {\r\n const [moved] = newShowList.splice(idx, 1);\r\n newHideList.push(moved);\r\n }\r\n } else if (fromContainerId === \"list\") {\r\n const idx = newHideList.findIndex((i) => i.value === item.value);\r\n if (idx > -1) {\r\n const [moved] = newHideList.splice(idx, 1);\r\n newShowList.push(moved);\r\n }\r\n }\r\n\r\n if (isColumnDefault) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column,\r\n show_list: newShowList,\r\n hide_list: newHideList,\r\n },\r\n }));\r\n } else {\r\n const updatedTabs = [...(settingsColumnState?.tabs || [])];\r\n updatedTabs[selectedTabIndex] = {\r\n ...updatedTabs[selectedTabIndex],\r\n show_list: newShowList,\r\n hide_list: newHideList,\r\n };\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column,\r\n tabs: updatedTabs,\r\n },\r\n }));\r\n }\r\n };\r\n\r\n const handleDragEnd = (event: DragEndEvent) => {\r\n const { active, over } = event;\r\n if (!over) return;\r\n\r\n const currentContainer = active.data.current?.containerId;\r\n const overContainer = over.data.current?.containerId;\r\n if (!currentContainer || !overContainer) return;\r\n\r\n const activeItem = [...showList, ...hideList].find(\r\n (item) => item.value === String(active.id)\r\n );\r\n if (!activeItem) return;\r\n\r\n let newShowList = [...showList];\r\n let newHideList = [...hideList];\r\n\r\n if (currentContainer === overContainer) {\r\n const list = currentContainer === \"list\" ? newHideList : newShowList;\r\n const oldIndex = list.findIndex(\r\n (item) => item.value === String(active.id)\r\n );\r\n const newIndex = list.findIndex((item) => item.value === String(over.id));\r\n if (oldIndex !== -1 && newIndex !== -1) {\r\n const [removed] = list.splice(oldIndex, 1);\r\n list.splice(newIndex, 0, removed);\r\n }\r\n } else {\r\n if (currentContainer === \"list\" && overContainer === \"tabs\") {\r\n const idx = newHideList.findIndex(\r\n (item) => item.value === String(active.id)\r\n );\r\n if (idx !== -1) {\r\n newHideList.splice(idx, 1);\r\n newShowList.push(activeItem);\r\n }\r\n } else if (currentContainer === \"tabs\" && overContainer === \"list\") {\r\n const idx = newShowList.findIndex(\r\n (item) => item.value === String(active.id)\r\n );\r\n if (idx !== -1) {\r\n newShowList.splice(idx, 1);\r\n newHideList.push(activeItem);\r\n }\r\n }\r\n }\r\n\r\n if (isColumnDefault) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column,\r\n show_list: newShowList,\r\n hide_list: newHideList,\r\n },\r\n }));\r\n } else {\r\n const updatedTabs = [...(settingsColumnState?.tabs || [])];\r\n updatedTabs[selectedTabIndex] = {\r\n ...updatedTabs[selectedTabIndex],\r\n show_list: newShowList,\r\n hide_list: newHideList,\r\n };\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column,\r\n tabs: updatedTabs,\r\n },\r\n }));\r\n }\r\n };\r\n\r\n const handleShowAll = () => {\r\n if (isColumnDefault) {\r\n // Default mode → update global lists\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column,\r\n show_list: [...showList, ...hideList],\r\n hide_list: [],\r\n },\r\n }));\r\n } else {\r\n // Tab mode → update only selected tab\r\n const updatedTabs = [...(settingsColumnState.tabs || [])];\r\n\r\n updatedTabs[selectedTabIndex] = {\r\n ...updatedTabs[selectedTabIndex],\r\n show_list: [...showList, ...hideList],\r\n hide_list: [],\r\n };\r\n\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column,\r\n tabs: updatedTabs,\r\n },\r\n }));\r\n }\r\n };\r\n\r\n const handleHideAll = () => {\r\n if (isColumnDefault) {\r\n // Default mode → update global lists\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column,\r\n show_list: [],\r\n hide_list: [...hideList, ...showList],\r\n },\r\n }));\r\n } else {\r\n // Tab mode → update only selected tab\r\n const updatedTabs = [...(settingsColumnState.tabs || [])];\r\n\r\n updatedTabs[selectedTabIndex] = {\r\n ...updatedTabs[selectedTabIndex],\r\n show_list: [],\r\n hide_list: [...hideList, ...showList],\r\n };\r\n\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column,\r\n tabs: updatedTabs,\r\n },\r\n }));\r\n }\r\n };\r\n\r\n const handleTabChange = (_: React.SyntheticEvent, newValue: number) => {\r\n setSelectedTabIndex(newValue);\r\n };\r\n\r\n const hasShowListQuickTabs =\r\n quickTabStates?.show_list?.length !== 0 || isColumnDefault;\r\n\r\n return (\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n // gap: \"0.75rem\",\r\n height: \"100%\",\r\n position: \"relative\",\r\n }}\r\n >\r\n <Box>\r\n <Typography variant=\"subtitle2\" sx={{ mb: 1 }}>\r\n Customize column by\r\n </Typography>\r\n <CustomToggleSwitchButton\r\n buttons={TOGGLE_BUTTON_TABS}\r\n value={isColumnDefault}\r\n onChange={handleToggleChange}\r\n />\r\n </Box>\r\n\r\n <Box sx={{ flex: 1 }}>\r\n {!isColumnDefault && hasShowListQuickTabs && (\r\n <CustomTabs value={selectedTabIndex} onChange={handleTabChange}>\r\n {quickTabStates?.show_list?.map(\r\n (tab: { label: string; value: string }) => (\r\n <Tab key={tab?.value} label={tab?.label} />\r\n )\r\n )}\r\n </CustomTabs>\r\n )}\r\n\r\n {hasShowListQuickTabs ? (\r\n <DndContext\r\n sensors={sensors}\r\n collisionDetection={closestCenter}\r\n onDragEnd={handleDragEnd}\r\n >\r\n <Grid container spacing={2}>\r\n <ListingValues\r\n containerId=\"list\"\r\n headerText=\"Hidden In List\"\r\n filteredValues={filteredListValues}\r\n buttonText=\"Show All\"\r\n onClick={handleShowAll}\r\n searchTerm={searchTerm}\r\n setSearchTerm={setSearchTerm}\r\n onItemToggle={handleItemToggle}\r\n />\r\n <ListingValues\r\n containerId=\"tabs\"\r\n headerText=\"Show In List\"\r\n filteredValues={showListValues}\r\n buttonText=\"Hide All\"\r\n onClick={handleHideAll}\r\n onItemToggle={handleItemToggle}\r\n AlertComponenet={\r\n <InfoAlert\r\n message={\r\n \"Please select at least 1 value to display as tabs.\"\r\n }\r\n width={\"49.2%\"}\r\n // position=\"absolute\"\r\n // color=\"#088AB2\"\r\n top={93}\r\n // zIndex={1}\r\n />\r\n }\r\n />\r\n </Grid>\r\n </DndContext>\r\n ) : (\r\n <Typography>View as Tabs empty in Quick Tab</Typography>\r\n )}\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default ColumnTab;\r\n","import React, { useEffect, useMemo, useState } from \"react\";\r\nimport {\r\n Box,\r\n Button,\r\n IconButton,\r\n MenuItem,\r\n Select,\r\n Tab,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport {\r\n ColumnTabConfigProps,\r\n SettingsSortingProps,\r\n SortingConfigProps,\r\n SortingConfigSortByProps,\r\n} from \"../../../types/filter-settings\";\r\nimport CustomTabs from \"../tabs/horizontal\";\r\nimport {\r\n closestCenter,\r\n DndContext,\r\n PointerSensor,\r\n useSensor,\r\n useSensors,\r\n} from \"@dnd-kit/core\";\r\nimport SortableItem from \"../../sorting-modal.tsx/sorting-item\";\r\nimport {\r\n arrayMove,\r\n SortableContext,\r\n verticalListSortingStrategy,\r\n} from \"@dnd-kit/sortable\";\r\nimport { AddIcon, CloseIcon } from \"../../../../assets/svg\";\r\nimport CustomToggleSwitchButton from \"./toggle-button-switch\";\r\nimport { TOGGLE_BUTTON_TABS } from \"../constants\";\r\n\r\nconst Sorting = ({\r\n filterSettingStates,\r\n columnsData,\r\n}: SettingsSortingProps) => {\r\n const { quickTabStates, saveButtonError, settingsData, setSettingsData } =\r\n filterSettingStates;\r\n\r\n const [activeTab, setActiveTab] = useState<string | undefined>(\r\n quickTabStates?.show_list?.[0]?.value\r\n );\r\n\r\n const columnTabState = settingsData?.column as ColumnTabConfigProps;\r\n const sortingTabState = settingsData?.sorting as SortingConfigProps;\r\n const isSortingDefault = sortingTabState?.isDefault;\r\n\r\n const isStateEmpty = useMemo(() => {\r\n return !sortingTabState || Object.entries(sortingTabState).length === 0;\r\n }, [sortingTabState]);\r\n\r\n const isEmptyDefault = useMemo(() => {\r\n return !isStateEmpty && !sortingTabState?.sortby?.length;\r\n }, [isStateEmpty, sortingTabState]);\r\n\r\n const ERROR_CODE = \"sorting_error\";\r\n\r\n // useEffect(() => {\r\n // const emptySortBy: SortingConfigSortByProps[] = [\r\n // { column: \"\", order: \"asc\" },\r\n // ];\r\n\r\n // if (isStateEmpty) {\r\n // setSettingsData((prev) => ({\r\n // ...prev,\r\n // sorting: {\r\n // isDefault: true,\r\n // sortby: emptySortBy,\r\n // },\r\n // }));\r\n // } else if (isEmptyDefault) {\r\n // setSettingsData((prev) => ({\r\n // ...prev,\r\n // sorting: {\r\n // ...prev.sorting,\r\n // isDefault: true,\r\n // },\r\n // }));\r\n\r\n // if (!sortingTabState?.isDefault) {\r\n // setSettingsData((prev) => ({\r\n // ...prev,\r\n // sorting: {\r\n // ...prev.sorting,\r\n // sortby: emptySortBy,\r\n // },\r\n // }));\r\n // }\r\n // }\r\n // }, [\r\n // isStateEmpty,\r\n // isEmptyDefault,\r\n // sortingTabState,\r\n // quickTabStates,\r\n // setSettingsData,\r\n // ]);\r\n\r\n useEffect(() => {\r\n const emptySortBy: SortingConfigSortByProps[] = [\r\n { column: \"\", order: \"asc\" },\r\n ];\r\n\r\n // CASE 1: Initialize sorting if completely empty\r\n if (!sortingTabState || Object.keys(sortingTabState).length === 0) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n sorting: {\r\n isDefault: true,\r\n sortby: [],\r\n },\r\n }));\r\n return;\r\n }\r\n\r\n // CASE 2: sorting is default BUT missing sortby\r\n // if (\r\n // (!sortingTabState?.sortby || sortingTabState?.sortby.length === 0) &&\r\n // sortingTabState?.isDefault\r\n // ) {\r\n // setSettingsData((prev) => ({\r\n // ...prev,\r\n // sorting: {\r\n // ...prev.sorting,\r\n // sortby: emptySortBy,\r\n // isDefault: true,\r\n // },\r\n // }));\r\n // return;\r\n // }\r\n\r\n // CASE 3: CUSTOM MODE → Populate tabs automatically\r\n if (\r\n sortingTabState?.isDefault === false &&\r\n (!sortingTabState?.tabs || sortingTabState?.tabs.length === 0)\r\n ) {\r\n setSettingsData((prev) => {\r\n const quickTabs = prev.quick_tab?.show_list || [];\r\n\r\n const generatedTabs = quickTabs.map((t) => ({\r\n tab_name: { value: t.value, label: t.label },\r\n sortby: emptySortBy,\r\n }));\r\n\r\n return {\r\n ...prev,\r\n sorting: {\r\n ...prev.sorting,\r\n tabs: generatedTabs,\r\n },\r\n };\r\n });\r\n }\r\n }, []);\r\n\r\n // sortingTabState.sortby is filtered based on columnTabState.show_list\r\n // useEffect(() => {\r\n // // filter sorting sortby based on column show list\r\n // if (columnTabState?.isDefault) {\r\n // setSettingsData((prev) => ({\r\n // ...prev,\r\n // sorting: {\r\n // ...prev.sorting,\r\n // // remove sortby items that are not in column show list\r\n // sortby: prev.sorting?.sortby?.filter((item) =>\r\n // columnTabState?.show_list?.some(\r\n // (columnItem) => columnItem.value === item.column\r\n // )\r\n // ),\r\n // },\r\n // }));\r\n // }\r\n // }, [columnTabState?.show_list]);\r\n\r\n const sensors = useSensors(useSensor(PointerSensor));\r\n\r\n const activeTabIndex = columnTabState?.isDefault\r\n ? quickTabStates?.show_list?.findIndex(\r\n (tab) =>\r\n tab?.value === activeTab ||\r\n tab?.label?.toLowerCase() === activeTab?.toLowerCase()\r\n )\r\n : columnTabState?.tabs?.findIndex(\r\n (tab) =>\r\n tab?.tab_name?.value == activeTab ||\r\n tab?.tab_name?.label?.toLowerCase() == activeTab?.toLowerCase()\r\n );\r\n /**\r\n * * What is happening here?\r\n *\r\n * * If isDefault is true\r\n * * - Return the sortby array from the state\r\n *\r\n * * If isDefault is false\r\n * * - Filter tabs array from sortingTabState according to activeTab index\r\n *\r\n * * If activeTab is undefined\r\n * * - Return an empty array\r\n */\r\n\r\n const tabSortedList = useMemo(() => {\r\n return isSortingDefault\r\n ? sortingTabState?.sortby || [{ column: \"\", order: \"asc\" }]\r\n : activeTab !== undefined\r\n ? sortingTabState?.tabs?.[activeTabIndex || 0]?.sortby\r\n ? sortingTabState?.tabs?.[activeTabIndex || 0]?.sortby\r\n : []\r\n : [];\r\n }, [sortingTabState, activeTab]);\r\n\r\n const updateSortList = (updated: SortingConfigSortByProps[]) => {\r\n setSettingsData((prev) => {\r\n if (prev?.sorting?.isDefault) {\r\n return { ...prev, sorting: { ...prev?.sorting, sortby: updated } };\r\n } else {\r\n const tabs = [...(prev?.sorting?.tabs || [])];\r\n tabs[activeTabIndex || 0] = {\r\n ...tabs[activeTabIndex || 0],\r\n tab_name: settingsData?.column?.tabs?.[activeTabIndex || 0]\r\n ?.tab_name || {\r\n label: \"\",\r\n value: \"\",\r\n },\r\n sortby: updated,\r\n };\r\n return { ...prev, sorting: { ...prev?.sorting, tabs } };\r\n }\r\n });\r\n };\r\n\r\n const handleDNDDropdownChange = (\r\n key: \"column\" | \"order\",\r\n value: string,\r\n index: number\r\n ) => {\r\n if (!tabSortedList) return;\r\n\r\n const updated = [...tabSortedList];\r\n updated[index] = { ...updated[index], [key]: value };\r\n updateSortList(updated);\r\n };\r\n\r\n const handleAddSort = () => {\r\n if (!tabSortedList) return;\r\n\r\n const newItem: SortingConfigSortByProps = {\r\n column: \"\",\r\n order: \"asc\",\r\n };\r\n\r\n updateSortList([...tabSortedList, newItem]);\r\n };\r\n\r\n const handleRemove = (columnKey: string) => {\r\n if (!tabSortedList) return;\r\n\r\n const updated = tabSortedList.filter((item) => item.column !== columnKey);\r\n updateSortList(updated);\r\n };\r\n\r\n const handleModeChange = (\r\n _: React.MouseEvent<HTMLElement>,\r\n value: boolean\r\n ) => {\r\n if (value !== null) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n sorting: {\r\n ...prev.sorting,\r\n isDefault: value,\r\n },\r\n }));\r\n }\r\n };\r\n\r\n const handleDragEnd = (event: any) => {\r\n if (!tabSortedList) return;\r\n\r\n const { active, over } = event;\r\n if (!over || active.id === over.id) return;\r\n\r\n const oldIndex = tabSortedList.findIndex((i) => i.column === active.id);\r\n const newIndex = tabSortedList.findIndex((i) => i.column === over.id);\r\n\r\n if (oldIndex !== -1 && newIndex !== -1) {\r\n const reordered = arrayMove(tabSortedList, oldIndex, newIndex);\r\n updateSortList(reordered);\r\n }\r\n };\r\n\r\n const hasShowListQuickTabs =\r\n quickTabStates?.show_list?.length !== 0 || isSortingDefault ? true : false;\r\n\r\n /**\r\n * ? What is happening here?\r\n *\r\n * If column show list is present then takes it's length\r\n * else it takes columnsData.column_list length\r\n *\r\n * compare it with sortingTabState.sortby.length\r\n *\r\n * if both are equal then showAddSortButton is false\r\n */\r\n const showAddSortButton = useMemo(() => {\r\n const stateLength = columnsData?.length ?? 0;\r\n const sortLength = sortingTabState?.sortby?.length ?? 0;\r\n\r\n return sortLength !== stateLength;\r\n }, [columnsData, sortingTabState]);\r\n\r\n /**\r\n * ? What is happening here?\r\n *\r\n * Check if sorting_error exists in saveButtonError state\r\n * Check if sortingTabState sortby column is empty\r\n */\r\n const isAddSortDisabled = useMemo(() => {\r\n const hasEmptyColumn = sortingTabState?.sortby?.some(\r\n (item) => item.column === \"\"\r\n );\r\n\r\n return hasEmptyColumn;\r\n }, [saveButtonError, sortingTabState]);\r\n\r\n const getCurrentLists = () => {\r\n if (sortingTabState?.isDefault) {\r\n return {\r\n showList:\r\n columnsData?.map((column: any) => ({\r\n label: column?.name,\r\n value: column?.attribute_key,\r\n })) || [],\r\n hideList: columnTabState?.hide_list || [],\r\n };\r\n } else {\r\n const currentTab = sortingTabState?.tabs?.[activeTabIndex || 0];\r\n return {\r\n showList:\r\n columnsData?.map((column: any) => ({\r\n label: column?.name,\r\n value: column?.attribute_key,\r\n })) || [],\r\n // hideList: currentTab?.hide_list || [],\r\n };\r\n }\r\n };\r\n\r\n const { showList } = getCurrentLists();\r\n\r\n return (\r\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: \"0.75rem\" }}>\r\n <Typography>Select attribute(s) you want to sort by</Typography>\r\n\r\n <CustomToggleSwitchButton\r\n buttons={TOGGLE_BUTTON_TABS}\r\n value={isSortingDefault}\r\n onChange={handleModeChange}\r\n />\r\n\r\n {hasShowListQuickTabs ? (\r\n <>\r\n <Box>\r\n {!isSortingDefault && (\r\n <CustomTabs\r\n value={activeTab}\r\n onChange={(_, tab) => setActiveTab(tab)}\r\n >\r\n {quickTabStates?.show_list?.map((tab) => (\r\n <Tab key={tab?.value} label={tab?.label} value={tab?.value} />\r\n ))}\r\n </CustomTabs>\r\n )}\r\n\r\n <DndContext\r\n sensors={sensors}\r\n collisionDetection={closestCenter}\r\n onDragEnd={handleDragEnd}\r\n >\r\n <SortableContext\r\n items={tabSortedList?.map((s) => s.column) || []}\r\n strategy={verticalListSortingStrategy}\r\n >\r\n {tabSortedList?.map((sort, index) => (\r\n <SortableItem key={sort.column} id={sort.column}>\r\n <Box display=\"flex\" gap={1} alignItems=\"center\" mb={1}>\r\n <Select\r\n value={sort.column}\r\n onChange={(e) =>\r\n handleDNDDropdownChange(\r\n \"column\",\r\n e.target.value,\r\n index\r\n )\r\n }\r\n size=\"small\"\r\n fullWidth\r\n >\r\n {showList\r\n // ?.filter((column) => column.value != \"action\")\r\n .map(\r\n (\r\n column: { label: string; value: string },\r\n index: number\r\n ) => (\r\n <MenuItem\r\n key={index}\r\n value={column.value}\r\n disabled={tabSortedList.some(\r\n (s) => s.column === column?.value\r\n )}\r\n >\r\n {column?.label}\r\n </MenuItem>\r\n )\r\n )}\r\n </Select>\r\n <Select\r\n value={sort.order}\r\n onChange={(e) =>\r\n handleDNDDropdownChange(\r\n \"order\",\r\n e.target.value,\r\n index\r\n )\r\n }\r\n size=\"small\"\r\n fullWidth\r\n >\r\n <MenuItem value=\"asc\">Ascending</MenuItem>\r\n <MenuItem value=\"dsc\">Descending</MenuItem>\r\n </Select>\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => handleRemove(sort.column)}\r\n >\r\n <CloseIcon />\r\n </IconButton>\r\n </Box>\r\n </SortableItem>\r\n ))}\r\n </SortableContext>\r\n </DndContext>\r\n\r\n {showAddSortButton && (\r\n <Box>\r\n <Button\r\n onClick={handleAddSort}\r\n startIcon={<AddIcon />}\r\n variant=\"text\"\r\n sx={{\r\n fontSize: 13,\r\n color: \"#7A5AF8\",\r\n }}\r\n disabled={isAddSortDisabled}\r\n >\r\n Add Sort\r\n </Button>\r\n </Box>\r\n )}\r\n </Box>\r\n </>\r\n ) : (\r\n <Typography>View as Tabs empty in Quick Tab</Typography>\r\n )}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default Sorting;\r\n","import { Dialog, Slide, styled } from \"@mui/material\";\r\nimport { dialogStyles } from \"../style\";\r\nimport React from \"react\";\r\nimport { TransitionProps } from \"@mui/material/transitions\";\r\n\r\nexport const CustomDialog = styled(Dialog)(({ theme }) => ({\r\n \"& .MuiPaper-root\": {\r\n borderRadius: 0,\r\n height: \"100%\",\r\n },\r\n \"& .MuiDialogContent-root\": {\r\n ...dialogStyles.dialogContent,\r\n padding: theme.spacing(2),\r\n },\r\n \"& .MuiDialogActions-root\": {\r\n padding: theme.spacing(2),\r\n },\r\n}));\r\n\r\nexport const DialogTransition = React.forwardRef(function Transition(\r\n props: TransitionProps & {\r\n children: React.ReactElement<any, any>;\r\n },\r\n ref: React.Ref<unknown>\r\n) {\r\n return <Slide direction=\"down\" ref={ref} {...props} />;\r\n});\r\n","import { Button, ButtonProps } from \"@mui/material\";\r\nimport { dialogStyles } from \"../style\";\r\ninterface CustomButtonProps extends ButtonProps {}\r\n\r\nconst CustomButton = ({ ...props }: CustomButtonProps) => {\r\n const customSx = { ...dialogStyles.dialogActionsButton, ...props.sx };\r\n\r\n return (\r\n <Button variant=\"contained\" {...props} sx={customSx}>\r\n {props.children}\r\n </Button>\r\n );\r\n};\r\n\r\nexport default CustomButton;\r\n","import { useEffect, useState } from \"react\";\r\nimport {\r\n Box,\r\n Select,\r\n MenuItem,\r\n FormControl,\r\n Typography,\r\n Checkbox,\r\n FormControlLabel,\r\n Grid,\r\n} from \"@mui/material\";\r\n\r\nimport ListingValues from \"../common/listing-values\";\r\nimport {\r\n DndContext,\r\n closestCenter,\r\n KeyboardSensor,\r\n MouseSensor,\r\n TouchSensor,\r\n useSensor,\r\n useSensors,\r\n DragEndEvent,\r\n} from \"@dnd-kit/core\";\r\nimport { TabsStyles } from \"../style\";\r\nimport { craftTableFilterSettingsOptionsProps } from \"../../../types/table-options\";\r\n\r\nconst Lane = ({\r\n filterSettingStates,\r\n columnsData,\r\n tabsApiData,\r\n tabsApiDataLoading,\r\n selectAttributeData,\r\n laneHideListData,\r\n}: {\r\n filterSettingStates: craftTableFilterSettingsOptionsProps;\r\n columnsData: any;\r\n tabsApiData?: { label: string; value: string }[];\r\n tabsApiDataLoading?: boolean;\r\n selectAttributeData?: { label: string; value: string }[];\r\n laneHideListData?: { label: string; value: string }[];\r\n}) => {\r\n const { kanbanSettingsData, setKanbanSettingsData } = filterSettingStates;\r\n\r\n const [searchTerm, setSearchTerm] = useState<string>(\"\");\r\n const [currentLaneAttribute, setCurrentLaneAttribute] = useState<string>(\r\n kanbanSettingsData?.lane?.attribute || \"\"\r\n );\r\n\r\n console.log(\"selectAttributeData\", selectAttributeData);\r\n\r\n useEffect(() => {\r\n const stateToArray =\r\n (kanbanSettingsData?.lane && Object.entries(kanbanSettingsData?.lane)) ||\r\n [];\r\n const isEmptyState = stateToArray.length ? false : true;\r\n\r\n if (isEmptyState) {\r\n setKanbanSettingsData((prev) => ({\r\n ...prev,\r\n lane: {\r\n ...prev?.lane,\r\n attribute:\r\n selectAttributeData\r\n ?.filter(\r\n (i) => i?.value !== kanbanSettingsData?.swim_lane?.attribute\r\n )\r\n ?.find((i) => i?.value == \"stage_group\")?.value || \"\",\r\n },\r\n }));\r\n } else {\r\n if (\r\n kanbanSettingsData?.swim_lane?.attribute ==\r\n kanbanSettingsData?.lane?.attribute\r\n ) {\r\n setKanbanSettingsData((prev) => ({\r\n ...prev,\r\n swim_lane: {\r\n ...prev?.swim_lane,\r\n attribute:\r\n selectAttributeData\r\n ?.filter(\r\n (i) => i?.value !== kanbanSettingsData?.swim_lane?.attribute\r\n )\r\n ?.find((i) => i?.value == \"stage_group\")?.value || \"\",\r\n // sorting: \"asc\",\r\n },\r\n }));\r\n }\r\n }\r\n }, [selectAttributeData]);\r\n\r\n useEffect(() => {\r\n if (currentLaneAttribute === kanbanSettingsData?.lane?.attribute) return;\r\n\r\n if (laneHideListData?.length) {\r\n setKanbanSettingsData((prev) => ({\r\n ...prev,\r\n lane: {\r\n ...prev?.lane,\r\n hide_list: laneHideListData,\r\n show_list: [],\r\n },\r\n }));\r\n\r\n setCurrentLaneAttribute(kanbanSettingsData?.lane?.attribute || \"\");\r\n } else {\r\n setKanbanSettingsData((prev) => ({\r\n ...prev,\r\n lane: {\r\n ...prev?.lane,\r\n hide_list: [],\r\n show_list: [],\r\n },\r\n }));\r\n\r\n setCurrentLaneAttribute(\"\");\r\n }\r\n }, [laneHideListData]);\r\n\r\n const sortingOptions = [\r\n { label: \"A-Z\", value: \"asc\" },\r\n { label: \"Z-A\", value: \"dsc\" },\r\n { label: \"Count (Ascending)\", value: \"count_asc\" },\r\n { label: \"Count (Descending)\", value: \"count_dsc\" },\r\n { label: \"Custom\", value: \"custom\" },\r\n ];\r\n\r\n const isWorkflowAttribute =\r\n kanbanSettingsData?.lane?.attribute === \"stage_group\" ||\r\n kanbanSettingsData?.lane?.attribute === \"stage\";\r\n\r\n const isSourceAttribute =\r\n kanbanSettingsData?.lane?.attribute === \"lead_source\";\r\n\r\n useEffect(() => {\r\n if (isSourceAttribute) {\r\n setKanbanSettingsData((prev) => ({\r\n ...prev,\r\n lane: {\r\n ...prev.lane,\r\n sorting: prev.lane?.sorting || \"asc\",\r\n },\r\n }));\r\n }\r\n }, [kanbanSettingsData?.lane?.attribute]);\r\n\r\n const displaySortingValue = isWorkflowAttribute\r\n ? \"workflow_sequence\"\r\n : kanbanSettingsData?.lane?.sorting;\r\n\r\n const enableDND =\r\n isSourceAttribute && kanbanSettingsData?.lane?.sorting === \"custom\";\r\n\r\n const normalizeTabItem = (item: any) => ({\r\n label: item.label,\r\n value: item?.value,\r\n });\r\n const constructHideList = () => {\r\n const normalizedTabs = laneHideListData?.map(normalizeTabItem) || [];\r\n return normalizedTabs?.filter(\r\n (tab) => !showListValues?.some((i) => i?.value === tab?.value)\r\n );\r\n };\r\n\r\n const showListValues = kanbanSettingsData?.lane?.show_list || [];\r\n const hideListValues = constructHideList() || [];\r\n\r\n const filteredListValues = hideListValues.filter((value: any) =>\r\n value?.label?.toLowerCase().includes(searchTerm.toLowerCase())\r\n );\r\n\r\n /* ===========================================================\r\n DND CONFIG\r\n =========================================================== */\r\n const sensors = useSensors(\r\n useSensor(MouseSensor),\r\n useSensor(TouchSensor),\r\n useSensor(KeyboardSensor)\r\n );\r\n\r\n const handleDragEnd = (event: DragEndEvent) => {\r\n if (!enableDND) return; // protect reorder when drag is disabled\r\n\r\n const { active, over } = event;\r\n if (!over) return;\r\n\r\n const currentContainer = active.data.current?.containerId;\r\n const overContainer = over.data.current?.containerId;\r\n\r\n if (!currentContainer || !overContainer) return;\r\n\r\n let newShowList = [...(kanbanSettingsData?.lane?.show_list ?? [])];\r\n let newHideList = [...(kanbanSettingsData?.lane?.hide_list ?? [])];\r\n\r\n if (currentContainer === overContainer) {\r\n if (currentContainer === \"list\") {\r\n const oldIndex = newHideList.findIndex((i) => i.value === active.id);\r\n const newIndex = newHideList.findIndex((i) => i.value === over.id);\r\n\r\n if (oldIndex !== -1 && newIndex !== -1) {\r\n const [removed] = newHideList.splice(oldIndex, 1);\r\n newHideList.splice(newIndex, 0, removed);\r\n }\r\n } else {\r\n const oldIndex = newShowList.findIndex((i) => i.value === active.id);\r\n const newIndex = newShowList.findIndex((i) => i.value === over.id);\r\n\r\n if (oldIndex !== -1 && newIndex !== -1) {\r\n const [removed] = newShowList.splice(oldIndex, 1);\r\n newShowList.splice(newIndex, 0, removed);\r\n }\r\n }\r\n }\r\n\r\n if (currentContainer !== overContainer) {\r\n if (currentContainer === \"list\" && overContainer === \"tabs\") {\r\n const idx = newHideList.findIndex((i) => i.value === String(active.id));\r\n if (idx !== -1) {\r\n const item = newHideList.splice(idx, 1)[0];\r\n newShowList.push(item);\r\n }\r\n } else if (currentContainer === \"tabs\" && overContainer === \"list\") {\r\n const idx = newShowList.findIndex((i) => i.value === String(active.id));\r\n if (idx !== -1) {\r\n const item = newShowList.splice(idx, 1)[0];\r\n newHideList.push(item);\r\n }\r\n }\r\n }\r\n\r\n setKanbanSettingsData((prev) => ({\r\n ...prev,\r\n lane: {\r\n ...prev.lane,\r\n show_list: newShowList,\r\n hide_list: newHideList,\r\n },\r\n }));\r\n };\r\n\r\n const handleShowAll = () => {\r\n setKanbanSettingsData((prev) => ({\r\n ...prev,\r\n lane: {\r\n ...prev?.lane,\r\n show_list: [\r\n ...(prev?.lane?.show_list || []),\r\n ...(prev?.lane?.hide_list || []),\r\n ],\r\n hide_list: [],\r\n },\r\n }));\r\n };\r\n\r\n const handleHideAll = () => {\r\n setKanbanSettingsData((prev) => ({\r\n ...prev,\r\n lane: {\r\n ...prev?.lane,\r\n hide_list: [\r\n ...(prev?.lane?.hide_list || []),\r\n ...(prev?.lane?.show_list || []),\r\n ],\r\n show_list: [],\r\n },\r\n }));\r\n };\r\n\r\n const handleItemToggle = (\r\n item: { label: string; value: string },\r\n fromContainerId: string\r\n ) => {\r\n setKanbanSettingsData((prev) => {\r\n const toShowList = [...(kanbanSettingsData?.lane?.show_list ?? [])];\r\n const toHideList = [...(kanbanSettingsData?.lane?.hide_list ?? [])];\r\n\r\n if (fromContainerId === \"list\") {\r\n const index = toHideList.findIndex((i) => i.value == item.value);\r\n if (index > -1) {\r\n toHideList.splice(index, 1);\r\n toShowList.push(item);\r\n }\r\n } else if (fromContainerId === \"tabs\") {\r\n const index = toShowList.findIndex((i) => i.value == item.value);\r\n if (index > -1) {\r\n toShowList.splice(index, 1);\r\n toHideList.push(item);\r\n }\r\n }\r\n return {\r\n ...prev,\r\n lane: {\r\n ...prev?.lane,\r\n show_list: toShowList,\r\n hide_list: toHideList,\r\n },\r\n };\r\n });\r\n };\r\n\r\n console.log(\"kanban\", kanbanSettingsData);\r\n\r\n /* ===========================================================\r\n RENDER\r\n =========================================================== */\r\n return (\r\n <Box sx={{ display: \"flex\", flexDirection: \"column\", height: \"100%\" }}>\r\n <Typography variant=\"caption\" sx={TabsStyles.mainTabsHeader}>\r\n **Quick filter settings will be reflected in vertical lanes\r\n </Typography>\r\n\r\n <Grid sx={{ position: \"relative\" }} container>\r\n {/* Attribute + Sort */}\r\n <Grid size={12}>\r\n <Grid sx={TabsStyles.mainTabDropdown} size={6}>\r\n <FormControl sx={TabsStyles.mainTabSelect} size=\"small\">\r\n <Select\r\n value={kanbanSettingsData?.lane?.attribute || \"\"}\r\n onChange={(e) =>\r\n setKanbanSettingsData((prev) => ({\r\n ...prev,\r\n lane: {\r\n ...prev?.lane,\r\n attribute: e.target.value,\r\n },\r\n }))\r\n }\r\n >\r\n {selectAttributeData\r\n ?.filter(\r\n (i) => i?.value !== kanbanSettingsData?.swim_lane?.attribute\r\n )\r\n ?.map((lane: any) => (\r\n <MenuItem key={lane?.key} value={lane?.value}>\r\n {lane?.label}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n\r\n <FormControl sx={TabsStyles.selectDropdownSeparator} size=\"small\">\r\n <Select\r\n value={displaySortingValue || \"\"}\r\n disabled={isWorkflowAttribute}\r\n onChange={(e) => {\r\n if (!isWorkflowAttribute) {\r\n const value = e.target.value as\r\n | \"asc\"\r\n | \"dsc\"\r\n | \"count_asc\"\r\n | \"count_dsc\"\r\n | \"custom\";\r\n\r\n setKanbanSettingsData((prev) => ({\r\n ...prev,\r\n lane: {\r\n ...prev?.lane,\r\n sorting: value,\r\n },\r\n }));\r\n }\r\n }}\r\n >\r\n {isWorkflowAttribute && (\r\n <MenuItem value=\"workflow_sequence\">\r\n Workflow Sequence\r\n </MenuItem>\r\n )}\r\n\r\n {!isWorkflowAttribute &&\r\n sortingOptions.map((option) => (\r\n <MenuItem key={option.value} value={option.value}>\r\n {option.label}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Grid>\r\n </Grid>\r\n\r\n {/* LISTING + DRAG */}\r\n <DndContext\r\n sensors={sensors}\r\n collisionDetection={closestCenter}\r\n onDragEnd={handleDragEnd}\r\n >\r\n <Grid sx={{ mt: 2 }} container spacing={2} size={12}>\r\n <ListingValues\r\n buttonText=\"Show All\"\r\n onClick={handleShowAll}\r\n headerText=\"List of Values\"\r\n filteredValues={filteredListValues}\r\n searchTerm={searchTerm}\r\n setSearchTerm={setSearchTerm}\r\n containerId=\"list\"\r\n tabsApiDataLoading={tabsApiDataLoading}\r\n onItemToggle={handleItemToggle}\r\n enableDragAndDrop={enableDND}\r\n />\r\n\r\n <ListingValues\r\n buttonText=\"Hide All\"\r\n onClick={handleHideAll}\r\n headerText=\"View as Lanes\"\r\n filteredValues={showListValues}\r\n containerId=\"tabs\"\r\n onItemToggle={handleItemToggle}\r\n enableDragAndDrop={enableDND}\r\n />\r\n </Grid>\r\n </DndContext>\r\n\r\n {/* SUBLANE CHECKBOX */}\r\n {kanbanSettingsData?.lane?.attribute === \"stage_group\" && (\r\n <Grid size={12}>\r\n <Box sx={TabsStyles.checkboxStyle}>\r\n <FormControlLabel\r\n control={\r\n <Checkbox\r\n checked={kanbanSettingsData?.lane?.isSubLane || false}\r\n onChange={(e) =>\r\n setKanbanSettingsData((prev) => ({\r\n ...prev,\r\n lane: {\r\n ...prev?.lane,\r\n isSubLane: e.target.checked,\r\n },\r\n }))\r\n }\r\n size=\"small\"\r\n />\r\n }\r\n label=\"Show Sublane\"\r\n />\r\n </Box>\r\n </Grid>\r\n )}\r\n\r\n {/* SUBLANE STAGE SELECT */}\r\n {kanbanSettingsData?.lane?.attribute === \"stage_group\" &&\r\n kanbanSettingsData?.lane?.isSubLane && (\r\n <Grid size={12}>\r\n <Grid sx={TabsStyles.mainTabDropdown} size={6}>\r\n <FormControl sx={TabsStyles.mainTabSelect} size=\"small\">\r\n <Select value=\"Stage\">\r\n <MenuItem value=\"Stage\">Stage</MenuItem>\r\n </Select>\r\n </FormControl>\r\n </Grid>\r\n </Grid>\r\n )}\r\n </Grid>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default Lane;\r\n","import { useEffect, useState } from \"react\";\r\nimport {\r\n Box,\r\n Select,\r\n MenuItem,\r\n FormControl,\r\n Typography,\r\n Checkbox,\r\n FormControlLabel,\r\n Grid,\r\n} from \"@mui/material\";\r\n\r\nimport ListingValues from \"../common/listing-values\";\r\nimport {\r\n DndContext,\r\n closestCenter,\r\n KeyboardSensor,\r\n MouseSensor,\r\n TouchSensor,\r\n useSensor,\r\n useSensors,\r\n DragEndEvent,\r\n} from \"@dnd-kit/core\";\r\nimport { TabsStyles } from \"../style\";\r\nimport { craftTableFilterSettingsOptionsProps } from \"../../../types/table-options\";\r\n\r\nconst SwimLane = ({\r\n filterSettingStates,\r\n tabsApiDataLoading,\r\n selectSwinLandData,\r\n swimLaneHideListData,\r\n}: {\r\n filterSettingStates: craftTableFilterSettingsOptionsProps;\r\n columnsData: any;\r\n tabsApiData?: { label: string; value: string }[];\r\n tabsApiDataLoading?: boolean;\r\n selectSwinLandData?: { label: string; value: string }[];\r\n swimLaneHideListData?: { label: string; value: string }[];\r\n}) => {\r\n const { kanbanSettingsData, setKanbanSettingsData } = filterSettingStates;\r\n\r\n const [searchTerm, setSearchTerm] = useState<string>(\"\");\r\n const [currentSwimLaneAttribute, setCurrentSwimLaneAttribute] =\r\n useState<string>(kanbanSettingsData?.swim_lane?.attribute || \"\");\r\n\r\n const isStatusAttribute =\r\n kanbanSettingsData?.swim_lane?.attribute === \"lead_status\" ||\r\n kanbanSettingsData?.swim_lane?.attribute === \"status\";\r\n const isSourceAttribute =\r\n kanbanSettingsData?.swim_lane?.attribute === \"lead_source\";\r\n\r\n useEffect(() => {\r\n if (isStatusAttribute) {\r\n setKanbanSettingsData((prev) => ({\r\n ...prev,\r\n swim_lane: {\r\n ...prev.swim_lane,\r\n sorting: \"sort_by\",\r\n },\r\n }));\r\n }\r\n }, [kanbanSettingsData?.swim_lane?.attribute]);\r\n\r\n useEffect(() => {\r\n if (!isSourceAttribute) return;\r\n\r\n setKanbanSettingsData((prev) => ({\r\n ...prev,\r\n swim_lane: {\r\n ...prev.swim_lane,\r\n sorting: \"count_dsc\",\r\n },\r\n }));\r\n }, [isSourceAttribute]);\r\n\r\n useEffect(() => {\r\n const stateToArray =\r\n (kanbanSettingsData?.swim_lane &&\r\n Object.entries(kanbanSettingsData?.swim_lane)) ||\r\n [];\r\n const isEmptyState = stateToArray.length ? false : true;\r\n\r\n if (isEmptyState) {\r\n setKanbanSettingsData((prev) => ({\r\n ...prev,\r\n swim_lane: {\r\n ...prev?.swim_lane,\r\n attribute: selectSwinLandData\r\n ?.filter((i) => i?.value !== kanbanSettingsData?.lane?.attribute)\r\n ?.find((i) => i?.value == \"lead_status\" || i?.value == \"status\")\r\n ?.value,\r\n // sorting: \"asc\",\r\n },\r\n }));\r\n } else {\r\n if (\r\n kanbanSettingsData?.swim_lane?.attribute ==\r\n kanbanSettingsData?.lane?.attribute\r\n ) {\r\n setKanbanSettingsData((prev) => ({\r\n ...prev,\r\n swim_lane: {\r\n ...prev?.swim_lane,\r\n attribute: selectSwinLandData\r\n ?.filter((i) => i?.value !== kanbanSettingsData?.lane?.attribute)\r\n ?.find((i) => i?.value == \"lead_status\" || i?.value == \"status\")\r\n ?.value,\r\n // sorting: \"asc\",\r\n },\r\n }));\r\n }\r\n }\r\n }, [selectSwinLandData]);\r\n\r\n useEffect(() => {\r\n if (currentSwimLaneAttribute === kanbanSettingsData?.swim_lane?.attribute)\r\n return;\r\n\r\n if (swimLaneHideListData?.length) {\r\n setKanbanSettingsData((prev) => ({\r\n ...prev,\r\n swim_lane: {\r\n ...prev?.swim_lane,\r\n hide_list: swimLaneHideListData,\r\n show_list: [],\r\n },\r\n }));\r\n\r\n setCurrentSwimLaneAttribute(\r\n kanbanSettingsData?.swim_lane?.attribute || \"\"\r\n );\r\n } else {\r\n setKanbanSettingsData((prev) => ({\r\n ...prev,\r\n swim_lane: {\r\n ...prev?.swim_lane,\r\n hide_list: [],\r\n show_list: [],\r\n },\r\n }));\r\n\r\n setCurrentSwimLaneAttribute(\"\");\r\n }\r\n }, [swimLaneHideListData]);\r\n\r\n const sortingOptions = [\r\n { label: \"Sort By\", value: \"sort_by\" },\r\n { label: \"A-Z\", value: \"asc\" },\r\n { label: \"Z-A\", value: \"dsc\" },\r\n { label: \"Count (Ascending)\", value: \"count_asc\" },\r\n { label: \"Count (Descending)\", value: \"count_dsc\" },\r\n { label: \"Custom\", value: \"custom\" },\r\n ];\r\n\r\n const normalizeTabItem = (item: any) => ({\r\n label: item.label,\r\n value: item?.value,\r\n });\r\n\r\n const constructHideList = () => {\r\n const normalizedTabs = swimLaneHideListData?.map(normalizeTabItem) || [];\r\n\r\n // remove items already in show_list (value-safe comparison)\r\n return normalizedTabs?.filter(\r\n (tab) => !showListValues?.some((i) => i?.value === tab?.value)\r\n );\r\n };\r\n\r\n const showListValues = kanbanSettingsData?.swim_lane?.show_list || [];\r\n const hideListValues = constructHideList() || [];\r\n\r\n const filteredListValues = hideListValues.filter((value: any) =>\r\n value?.label?.toLowerCase().includes(searchTerm.toLowerCase())\r\n );\r\n\r\n const sensors = useSensors(\r\n useSensor(MouseSensor),\r\n useSensor(TouchSensor),\r\n useSensor(KeyboardSensor)\r\n );\r\n\r\n const handleDragEnd = (event: DragEndEvent) => {\r\n const { active, over } = event;\r\n if (!over) return;\r\n\r\n const currentContainer = active.data.current?.containerId;\r\n const overContainer = over.data.current?.containerId;\r\n\r\n if (!currentContainer || !overContainer) return;\r\n\r\n let newShowList = [...(kanbanSettingsData?.swim_lane?.show_list ?? [])];\r\n let newHideList = [...(kanbanSettingsData?.swim_lane?.hide_list ?? [])];\r\n\r\n if (currentContainer === overContainer) {\r\n if (currentContainer === \"list\") {\r\n const oldIndex = newHideList.findIndex((i) => i.value === active.id);\r\n const newIndex = newHideList.findIndex((i) => i.value === over.id);\r\n\r\n if (oldIndex !== -1 && newIndex !== -1) {\r\n const [removed] = newHideList.splice(oldIndex, 1);\r\n newHideList.splice(newIndex, 0, removed);\r\n }\r\n } else {\r\n const oldIndex = newShowList.findIndex((i) => i.value === active.id);\r\n const newIndex = newShowList.findIndex((i) => i.value === over.id);\r\n\r\n if (oldIndex !== -1 && newIndex !== -1) {\r\n const [removed] = newShowList.splice(oldIndex, 1);\r\n newShowList.splice(newIndex, 0, removed);\r\n }\r\n }\r\n }\r\n\r\n // -------------------------------------\r\n // CASE 2: MOVE BETWEEN LISTS\r\n // -------------------------------------\r\n if (currentContainer !== overContainer) {\r\n if (currentContainer === \"list\" && overContainer === \"tabs\") {\r\n // if (newShowList.length < 5) {\r\n const idx = newHideList.findIndex((i) => i.value === String(active.id));\r\n if (idx !== -1) {\r\n const item = newHideList.splice(idx, 1)[0];\r\n newShowList.push(item);\r\n }\r\n // }\r\n } else if (currentContainer === \"tabs\" && overContainer === \"list\") {\r\n const idx = newShowList.findIndex((i) => i.value === String(active.id));\r\n if (idx !== -1) {\r\n const item = newShowList.splice(idx, 1)[0];\r\n newHideList.push(item);\r\n }\r\n }\r\n }\r\n\r\n // ----------------------------------------------------------\r\n // ⭐ APPLY MASTER UPDATE (with isDefault CHECK for columns)\r\n // ----------------------------------------------------------\r\n setKanbanSettingsData((prev) => {\r\n // FINAL RETURN\r\n return {\r\n ...prev,\r\n swim_lane: {\r\n ...prev.swim_lane,\r\n show_list: newShowList,\r\n hide_list: newHideList,\r\n },\r\n };\r\n });\r\n };\r\n\r\n const handleShowAll = () => {\r\n setKanbanSettingsData((prev) => ({\r\n ...prev,\r\n swim_lane: {\r\n ...prev?.swim_lane,\r\n show_list: [\r\n ...(prev?.swim_lane?.show_list || []),\r\n ...(prev?.swim_lane?.hide_list || []),\r\n ],\r\n hide_list: [],\r\n },\r\n }));\r\n };\r\n\r\n const handleHideAll = () => {\r\n setKanbanSettingsData((prev) => ({\r\n ...prev,\r\n swim_lane: {\r\n ...prev?.swim_lane,\r\n hide_list: [\r\n ...(prev?.swim_lane?.hide_list || []),\r\n ...(prev?.swim_lane?.show_list || []),\r\n ],\r\n show_list: [],\r\n },\r\n }));\r\n };\r\n\r\n const handleItemToggle = (\r\n item: { label: string; value: string },\r\n fromContainerId: string\r\n ) => {\r\n setKanbanSettingsData((prev) => {\r\n const toShowList = [...(kanbanSettingsData?.swim_lane?.show_list ?? [])];\r\n const toHideList = [...(kanbanSettingsData?.swim_lane?.hide_list ?? [])];\r\n\r\n if (fromContainerId === \"list\") {\r\n const index = toHideList.findIndex((i) => i.value == item.value);\r\n if (index > -1) {\r\n toHideList.splice(index, 1);\r\n toShowList.push(item);\r\n // 🌟 ALSO create sorting tab entry if missing\r\n }\r\n } else if (fromContainerId === \"tabs\") {\r\n const index = toShowList.findIndex((i) => i.value == item.value);\r\n if (index > -1) {\r\n toShowList.splice(index, 1);\r\n toHideList.push(item);\r\n // let itemIndex =\r\n // filterSettingStates?.quickTabStates?.show_list?.findIndex(\r\n // (i) => i.value == item.value\r\n // );\r\n // 🔥 REMOVE COLUMN WHEN TAB REMOVED (if not default)\r\n }\r\n }\r\n return {\r\n ...prev,\r\n swim_lane: {\r\n ...prev?.swim_lane,\r\n show_list: toShowList,\r\n hide_list: toHideList,\r\n },\r\n };\r\n });\r\n };\r\n\r\n const enableDND =\r\n isSourceAttribute && kanbanSettingsData?.swim_lane?.sorting === \"custom\";\r\n\r\n return (\r\n <Box sx={{ display: \"flex\", flexDirection: \"column\", height: \"100%\" }}>\r\n <Typography variant=\"caption\" sx={TabsStyles.mainTabsHeader}>\r\n **Swim Lane settings will be reflected in vertical lanes\r\n </Typography>\r\n\r\n <Grid sx={{ position: \"relative\" }} container>\r\n {/* Attribute + Sort */}\r\n <Grid size={12}>\r\n <Grid sx={TabsStyles.mainTabDropdown} size={6}>\r\n <FormControl sx={TabsStyles.mainTabSelect} size=\"small\">\r\n <Select\r\n value={kanbanSettingsData?.swim_lane?.attribute || \"\"}\r\n onChange={(e) =>\r\n setKanbanSettingsData((prev) => ({\r\n ...prev,\r\n swim_lane: {\r\n ...prev?.swim_lane,\r\n attribute: e.target.value,\r\n },\r\n }))\r\n }\r\n >\r\n {selectSwinLandData\r\n ?.filter(\r\n (i) => i?.value !== kanbanSettingsData?.lane?.attribute\r\n )\r\n ?.map((lane: any) => (\r\n <MenuItem key={lane?.key} value={lane?.value}>\r\n {lane?.label}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n\r\n <FormControl sx={TabsStyles.selectDropdownSeparator} size=\"small\">\r\n <Select\r\n value={kanbanSettingsData?.swim_lane?.sorting || \"asc\"}\r\n disabled={isStatusAttribute}\r\n onChange={(e) =>\r\n setKanbanSettingsData((prev) => ({\r\n ...prev,\r\n swim_lane: {\r\n ...prev?.swim_lane,\r\n sorting: e.target.value,\r\n },\r\n }))\r\n }\r\n >\r\n {isStatusAttribute && (\r\n <MenuItem value=\"sort_by\" disabled>\r\n Sort By\r\n </MenuItem>\r\n )}\r\n\r\n {!isStatusAttribute &&\r\n sortingOptions\r\n .filter((option) => option.value !== \"sort_by\")\r\n .map((option) => (\r\n <MenuItem key={option.value} value={option.value}>\r\n {option.label}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Grid>\r\n </Grid>\r\n\r\n {/* Lists */}\r\n <DndContext\r\n sensors={sensors}\r\n collisionDetection={closestCenter}\r\n onDragEnd={handleDragEnd}\r\n >\r\n <Grid sx={{ mt: 2 }} container spacing={2} size={12}>\r\n <ListingValues\r\n buttonText=\"Show All\"\r\n onClick={handleShowAll}\r\n headerText=\"List of Values\"\r\n filteredValues={filteredListValues}\r\n searchTerm={searchTerm}\r\n setSearchTerm={setSearchTerm}\r\n containerId=\"list\"\r\n tabsApiDataLoading={tabsApiDataLoading}\r\n onItemToggle={handleItemToggle}\r\n enableDragAndDrop={enableDND}\r\n />\r\n\r\n <ListingValues\r\n buttonText=\"Hide All\"\r\n onClick={handleHideAll}\r\n headerText=\"View as Lanes\"\r\n filteredValues={showListValues}\r\n containerId=\"tabs\"\r\n onItemToggle={handleItemToggle}\r\n enableDragAndDrop={enableDND}\r\n />\r\n </Grid>\r\n </DndContext>\r\n </Grid>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default SwimLane;\r\n","import { Theme } from \"@emotion/react\";\r\nimport { SxProps } from \"@mui/material\";\r\n\r\ninterface KanbanStyles {\r\n syncingStyle: SxProps<Theme>;\r\n topHeader: SxProps<Theme>;\r\n laneHeader: SxProps<Theme>;\r\n badge: SxProps<Theme>;\r\n swimlaneWrapperStyle: SxProps<Theme>;\r\n columnStyle: SxProps<Theme>;\r\n stageStyle: SxProps<Theme>;\r\n stageBadge: SxProps<Theme>;\r\n cardContainer: SxProps<Theme>;\r\n cardContent: SxProps<Theme>;\r\n cardHeaderStyle: SxProps<Theme>;\r\n cardAvatar: SxProps<Theme>;\r\n statusStyle: SxProps<Theme>;\r\n codeStyle: SxProps<Theme>;\r\n nameIconContainer: SxProps<Theme>;\r\n leadName: SxProps<Theme>;\r\n iconStyle: SxProps<Theme>;\r\n leadOwnerStyle: SxProps<Theme>;\r\n calendarIcon: SxProps<Theme>;\r\n dateStyle: SxProps<Theme>;\r\n subSectionAccordion: SxProps<Theme>;\r\n subSectionCountContainer: SxProps<Theme>;\r\n cardsContainer: SxProps<Theme>;\r\n settingStyle: SxProps<Theme>;\r\n swimLaneAccordionStyle: SxProps<Theme>;\r\n subSectionHeaderContainer: SxProps<Theme>;\r\n}\r\n\r\nexport const kanbanStyles: KanbanStyles = {\r\n syncingStyle: {\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n gap: \"8px\",\r\n width: \"100%\",\r\n },\r\n topHeader: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 1,\r\n px: 1,\r\n pt: 2,\r\n bgcolor: \"white\",\r\n width: \"fit-content\",\r\n position: \"sticky\", // Add sticky positioning\r\n top: 0, // Stick to the top of the viewport\r\n right: 0,\r\n zIndex: 1100, // Ensure it stays above other content\r\n },\r\n laneHeader: {\r\n flex: 1, // Equal width distribution\r\n minWidth: \"263px\",\r\n maxWidth: \"263px\",\r\n display: \"flex\",\r\n fontWeight: 700,\r\n fontSize: \"16px\",\r\n borderRadius: \"6px\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n py: \"8px\",\r\n px: \"12px\",\r\n position: \"relative\",\r\n },\r\n badge: {\r\n position: \"absolute\",\r\n top: \"-12px\",\r\n left: \"8px\",\r\n px: 1,\r\n color: \"white\",\r\n borderRadius: \"8px\",\r\n },\r\n swimlaneWrapperStyle: {\r\n flexDirection: \"row-reverse\",\r\n bgcolor: \"white\",\r\n minHeight: 44, // overall height\r\n px: 2,\r\n py: 0, // remove vertical padding\r\n \"&.Mui-expanded\": {\r\n minHeight: 44,\r\n },\r\n \"& .MuiAccordionSummary-content\": {\r\n margin: \"8px 0\", // reduced vertical spacing\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"flex-start\",\r\n gap: 5,\r\n \"&.Mui-expanded\": {\r\n margin: \"8px 0\", // maintain same margin when expanded\r\n },\r\n },\r\n \"& .MuiAccordionSummary-expandIconWrapper\": {\r\n mr: 0, // reduce gap between icon and content\r\n },\r\n },\r\n columnStyle: {\r\n flex: 1, // Equal width distribution\r\n p: \"12px\",\r\n // px: \"2px\",\r\n minHeight: \"500px\",\r\n // borderRight: \"1px solid #e0e0e0\",\r\n\r\n borderRadius: \"6px\",\r\n minWidth: \"263px\",\r\n maxWidth: \"263px\",\r\n },\r\n stageStyle: {\r\n mb: 2,\r\n bgcolor: \"#f9fafb\",\r\n borderTopLeftRadius: \"8px !important\",\r\n borderBottomLeftRadius: \"8px !important\",\r\n borderTopRightRadius: \"8px !important\",\r\n // borderRadius: 2,\r\n overflow: \"hidden\",\r\n boxShadow: \"none\",\r\n \"&:before\": { display: \"none\" }, // remove default divider line\r\n },\r\n stageBadge: {\r\n \"& .MuiBadge-badge\": {\r\n color: \"black\",\r\n fontWeight: \"bold\",\r\n fontSize: \"0.75rem\",\r\n },\r\n },\r\n cardContainer: {\r\n borderRadius: 2,\r\n bgcolor: \"#fff\",\r\n position: \"relative\",\r\n\r\n boxShadow:\r\n \"0px 1.36px 2.72px rgba(23, 23, 23, 0.06), 0px 2.72px 5.44px rgba(23, 23, 23, 0.1)\",\r\n border: \"none\", // explicitly remove border\r\n },\r\n cardContent: {\r\n p: \"12px !important\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"4px\",\r\n },\r\n cardHeaderStyle: {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"flex-start\",\r\n // mb: 1,\r\n },\r\n cardAvatar: {\r\n width: \"18px\",\r\n height: \"18px\",\r\n fontSize: \"12px\",\r\n fontWeight: 600,\r\n bgcolor: \"#e5e7eb\",\r\n color: \"#374151\",\r\n mr: 1,\r\n },\r\n statusStyle: {\r\n height: 20,\r\n fontSize: \"0.6875rem\",\r\n\r\n fontWeight: 500,\r\n },\r\n codeStyle: {\r\n fontSize: \"12px\",\r\n color: \"#6b7280\",\r\n fontWeight: 500,\r\n mb: 0.5,\r\n cursor: \"pointer\",\r\n },\r\n nameIconContainer: {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"flex-start\",\r\n borderBottom: \"1px solid #e5e7eb\",\r\n pb: 2,\r\n },\r\n leadName: {\r\n fontSize: \"15px\",\r\n fontWeight: 500,\r\n color: \"#1f2937\",\r\n lineHeight: 1.3,\r\n },\r\n iconStyle: {\r\n color: \"#6b7280\",\r\n bgcolor: \"#f3f4f6\",\r\n borderRadius: \"50%\",\r\n width: \"20px\",\r\n height: \"20px\",\r\n p: 0.6,\r\n },\r\n leadOwnerStyle: {\r\n fontSize: \"12px\",\r\n color: \"#374151\",\r\n fontWeight: 500,\r\n },\r\n calendarIcon: {\r\n width: \"14px\",\r\n height: \"14px\",\r\n color: \"#7b7a79\",\r\n mr: 0.5,\r\n },\r\n dateStyle: {\r\n fontSize: \"12px\",\r\n color: \"#7b7a79\",\r\n\r\n fontWeight: 500,\r\n },\r\n subSectionAccordion: {\r\n height: \"52px\", // fixed height\r\n minHeight: \"52px\", // prevent auto-expansion\r\n \"&.Mui-expanded\": {\r\n minHeight: \"52px\", // fix expanded state height\r\n height: \"52px\",\r\n },\r\n border: \"1px solid #e2e8f0\",\r\n borderTopRightRadius: \"8px\",\r\n px: 2,\r\n },\r\n subSectionCountContainer: {\r\n // px: 1,\r\n color: \"white\",\r\n height: \"26px\",\r\n width: \"26px !important\",\r\n fontSize: \"10px\",\r\n fontWeight: \"bold\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n borderRadius: \"50%\",\r\n },\r\n cardsContainer: {\r\n px: 1,\r\n gap: \"12px\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n p: \"8px\",\r\n },\r\n settingStyle: {\r\n bgcolor: \"#f8fafc\",\r\n width: \"56px\",\r\n height: \"41px\",\r\n borderRadius: \"6px\",\r\n border: \"1px solid #e2e8f0\",\r\n },\r\n swimLaneAccordionStyle: {\r\n mb: 1,\r\n \"&:before\": { display: \"none\" },\r\n py: 0,\r\n boxShadow: \"none\",\r\n },\r\n subSectionHeaderContainer: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"8px\",\r\n },\r\n};\r\n","export const rawData = {\r\n lanes: [\r\n { id: 1, name: \"Enquiry\", color: \"#fff0f3\", darkColor: \"#fea3b4\" },\r\n { id: 2, name: \"Qualified Lead\", color: \"#fffbed\", darkColor: \"#fde272\" },\r\n { id: 3, name: \"Application\", color: \"#ebf9fc\", darkColor: \"#67e3f9\" },\r\n { id: 4, name: \"Admission\", color: \"#edf9f3\", darkColor: \"#73e2a3\" },\r\n { id: 5, name: \"Documents\", color: \"#edf9f3\", darkColor: \"#73e2a3\" },\r\n { id: 6, name: \"Admission\", color: \"#edf9f3\", darkColor: \"#73e2a3\" },\r\n ],\r\n swim_lanes: [\r\n {\r\n id: 12,\r\n name: \"Active\",\r\n sub_lanes: [\r\n {\r\n id: 1,\r\n name: \"Lead Assignment\",\r\n color: \"red\",\r\n lane_id: 1,\r\n expanded: true,\r\n },\r\n {\r\n id: 2,\r\n name: \"Initial Outreach\",\r\n color: \"green\",\r\n lane_id: 1,\r\n expanded: true,\r\n },\r\n {\r\n id: 3,\r\n name: \"Lead Assessment\",\r\n color: \"yellow\",\r\n lane_id: 2,\r\n expanded: true,\r\n },\r\n {\r\n id: 4,\r\n name: \"Campus Visit\",\r\n color: \"#FFE885\",\r\n lane_id: 2,\r\n expanded: true,\r\n },\r\n {\r\n id: 5,\r\n name: \"Application Collection\",\r\n color: \"#90E0F3\",\r\n lane_id: 3,\r\n expanded: true,\r\n },\r\n {\r\n id: 6,\r\n name: \"Student Assessment\",\r\n color: \"#90E0F3\",\r\n lane_id: 3,\r\n expanded: true,\r\n },\r\n {\r\n id: 7,\r\n name: \"Fee Collection\",\r\n color: \"#90EE90\",\r\n lane_id: 4,\r\n expanded: true,\r\n },\r\n {\r\n id: 8,\r\n name: \"System Integration\",\r\n color: \"#90EE90\",\r\n lane_id: 4,\r\n expanded: true,\r\n },\r\n ],\r\n },\r\n {\r\n id: 13,\r\n name: \"Dormant\",\r\n sub_lanes: [],\r\n },\r\n {\r\n id: 14,\r\n name: \"Disqualify\",\r\n sub_lanes: [],\r\n },\r\n {\r\n id: 15,\r\n name: \"Lost\",\r\n sub_lanes: [],\r\n },\r\n ],\r\n data: [\r\n // Lead Assignment\r\n {\r\n id: 1,\r\n name: \"Aditi Sharma\",\r\n sub_lane_id: 1,\r\n email: \"aditisharma@gmail.com\",\r\n phone: \"+91 9846213495\",\r\n status: \"Active\",\r\n progress: 0,\r\n days: \"10 Days\",\r\n reference_id: \"INQ2024XY\",\r\n priority: null,\r\n lost: false,\r\n },\r\n {\r\n id: 2,\r\n name: \"Aditi Sharma\",\r\n sub_lane_id: 1,\r\n email: \"aditisharma@gmail.com\",\r\n phone: \"+91 9846213495\",\r\n status: \"Active\",\r\n progress: 0,\r\n days: \"10 Days\",\r\n reference_id: \"INQ2024XY\",\r\n priority: null,\r\n lost: false,\r\n },\r\n // Initial Outreach\r\n {\r\n id: 3,\r\n name: \"Rashmi Desai\",\r\n sub_lane_id: 2,\r\n email: \"aditisharma@gmail.com\",\r\n phone: \"+91 9765874320\",\r\n status: \"Active\",\r\n progress: 0,\r\n days: \"10 Days\",\r\n reference_id: \"INQ2024XY\",\r\n priority: null,\r\n lost: false,\r\n },\r\n // Lead Assessment\r\n {\r\n id: 4,\r\n name: \"Aditi Sharma\",\r\n sub_lane_id: 3,\r\n email: \"aditisharma@gmail.com\",\r\n phone: \"+91 9846213495\",\r\n status: \"Active\",\r\n progress: 0,\r\n days: \"10 Days\",\r\n reference_id: \"INQ2024XY\",\r\n priority: null,\r\n lost: false,\r\n },\r\n // Campus Visit\r\n {\r\n id: 5,\r\n name: \"Aditi Sharma\",\r\n sub_lane_id: 4,\r\n email: \"aditisharma@gmail.com\",\r\n phone: \"+91 9846213495\",\r\n status: \"Lost\",\r\n progress: 0,\r\n days: \"10 Days\",\r\n reference_id: \"2DQ2024XY\",\r\n priority: null,\r\n lost: true,\r\n },\r\n {\r\n id: 6,\r\n name: \"Aditi Sharma\",\r\n sub_lane_id: 4,\r\n email: \"aditisharma@gmail.com\",\r\n phone: \"+91 9846213495\",\r\n status: \"Active\",\r\n progress: 0,\r\n days: \"10 Days\",\r\n reference_id: \"INQ2024XY\",\r\n priority: null,\r\n lost: false,\r\n },\r\n // Application Collection\r\n {\r\n id: 7,\r\n name: \"Aditi Sharma\",\r\n sub_lane_id: 5,\r\n email: \"aditisharma@gmail.com\",\r\n phone: \"+91 9452013495\",\r\n status: \"Active\",\r\n progress: 0,\r\n days: \"10 Days\",\r\n reference_id: \"INQ2024XY\",\r\n priority: null,\r\n lost: false,\r\n },\r\n {\r\n id: 8,\r\n name: \"Aditi Sharma\",\r\n sub_lane_id: 5,\r\n email: \"aditisharma@gmail.com\",\r\n phone: \"+91 9452013495\",\r\n status: \"Active\",\r\n progress: 0,\r\n days: \"10 Days\",\r\n reference_id: \"INQ2024XY\",\r\n priority: null,\r\n lost: false,\r\n },\r\n // Student Assessment\r\n {\r\n id: 9,\r\n name: \"Aditi Sharma\",\r\n sub_lane_id: 6,\r\n email: \"aditisharma@gmail.com\",\r\n phone: \"+91 9452013495\",\r\n status: \"Active\",\r\n progress: 0,\r\n days: \"10 Days\",\r\n reference_id: \"INQ2024XY\",\r\n priority: null,\r\n lost: false,\r\n },\r\n // Fee Collection\r\n {\r\n id: 10,\r\n name: \"Aditi Sharma\",\r\n sub_lane_id: 7,\r\n email: \"aditisharma@gmail.com\",\r\n phone: \"+91 9846015495\",\r\n status: \"Active\",\r\n progress: 0,\r\n days: \"You\",\r\n reference_id: \"INQ2024XY\",\r\n priority: \"High\",\r\n lost: false,\r\n },\r\n // System Integration\r\n {\r\n id: 11,\r\n name: \"Aditi Sharma\",\r\n sub_lane_id: 8,\r\n email: \"aditisharma@gmail.com\",\r\n phone: \"+91 9846015495\",\r\n status: \"Lost\",\r\n progress: 0,\r\n days: \"You\",\r\n reference_id: \"INQ2024XY\",\r\n priority: \"Low\",\r\n lost: true,\r\n },\r\n ],\r\n};\r\n\r\nexport const COLOR_CONSTANTS = [\r\n { color: \"#fff0f3\", darkColor: \"#fea3b4\" },\r\n { color: \"#fffbed\", darkColor: \"#fde272\" },\r\n { color: \"#ebf9fc\", darkColor: \"#67e3f9\" },\r\n { color: \"#edf9f3\", darkColor: \"#73e2a3\" },\r\n];\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { Box, IconButton, Typography } from \"@mui/material\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport {\r\n FilterComponentOptions,\r\n FilterDrawerProps,\r\n FilterMasterStateProps,\r\n} from \"../../types/filter\";\r\nimport ConfirmModal, { InputField } from \"../common/confirm-modal\";\r\nimport CustomTabPanel from \"./components/tabs/custom-tab-panel\";\r\nimport CustomTabs, { TabItem } from \"./components/tabs/index\";\r\nimport MainFilter from \"./components/main-filter\";\r\nimport SavedFilter from \"./components/saved-filter\";\r\nimport AttributesFilter from \"./components/attributes-filter\";\r\nimport { filterStyles } from \"./style\";\r\nimport { deepMergeObjects } from \"../../libs/utils/deep-merge-objects\";\r\nimport SingleFilterRendering from \"./components/single-filter-rendering\";\r\nimport SavedFilterModalView from \"../common/saved-filter-modal\";\r\n\r\nexport function TableFilter({\r\n onClose,\r\n columnsData,\r\n tableStates,\r\n onDeleteFilter,\r\n onSaveFilter,\r\n onUpdateFilter,\r\n dropdownData,\r\n onChangeFunction,\r\n filterComponentOptions,\r\n isFlatJson,\r\n}: FilterDrawerProps) {\r\n const [tabValue, setTabValue] = useState(0);\r\n const [editMode, setEditMode] = useState(false);\r\n\r\n // remove this\r\n const [saveFilterModalOpen, setSaveFilterModalOpen] = useState(false);\r\n const [savedFilterModalOpen, setSavedFilterModalOpen] = useState(false);\r\n\r\n const [deleteFilterModalOpen, setDeleteFilterModalOpen] = useState(false);\r\n\r\n const [searchTerm, setSearchTerm] = useState<string>(\"\");\r\n\r\n const {\r\n filters,\r\n setFilters,\r\n filterToDelete,\r\n filterMaster,\r\n setFilterMaster,\r\n setShowFilterOption,\r\n } = tableStates;\r\n\r\n const defaultOptions: FilterComponentOptions = {\r\n showMainHeader: true,\r\n mainHeaderTitle: \"Filter\",\r\n showTabs: true,\r\n tabOptions: {\r\n isSingleFilter: false,\r\n disableShareFilter: false,\r\n isSingleEntity: false,\r\n showFilter: \"main\",\r\n mainFilter: {\r\n showSaveButton: true,\r\n showClearAllButton: true,\r\n },\r\n savedFilter: {\r\n showBackButton: true,\r\n editMode: false,\r\n },\r\n },\r\n showMainFilter: true,\r\n showSavedFilter: true,\r\n showAttributesFilter: true,\r\n };\r\n\r\n const finalComponentOptions = deepMergeObjects<FilterComponentOptions>(\r\n defaultOptions,\r\n filterComponentOptions ?? {}\r\n );\r\n\r\n const showMainHeader = finalComponentOptions?.showMainHeader;\r\n const mainHeaderTitle = finalComponentOptions?.mainHeaderTitle;\r\n const showTabs = finalComponentOptions?.showTabs;\r\n const showMainFilter = showTabs && finalComponentOptions?.showMainFilter;\r\n const showSavedFilter = showTabs && finalComponentOptions?.showSavedFilter;\r\n const showAttributesFilter =\r\n showTabs && finalComponentOptions?.showAttributesFilter;\r\n const editModeFromTabOptions =\r\n finalComponentOptions?.tabOptions?.savedFilter?.editMode;\r\n\r\n useEffect(() => {\r\n if (editModeFromTabOptions) {\r\n setEditMode(editModeFromTabOptions);\r\n }\r\n }, [editModeFromTabOptions]);\r\n\r\n // Map tabs to type\r\n const tabMapping: TabItem[] = [];\r\n if (showMainFilter) tabMapping.push({ label: \"Filter\" });\r\n if (showSavedFilter) tabMapping.push({ label: \"Saved Filter\" });\r\n if (showAttributesFilter) tabMapping.push({ label: \"Attributes\" });\r\n\r\n const clearAttributeRadio = () => {\r\n const newFilterMaster = {\r\n ...filterMaster,\r\n attributes: {\r\n ...filterMaster?.attributes,\r\n radio: [],\r\n },\r\n activeFilterTabIndex: 0,\r\n };\r\n\r\n setFilterMaster(newFilterMaster as FilterMasterStateProps);\r\n };\r\n\r\n const filterNameInput: InputField = {\r\n label: \"Filter Name\",\r\n placeholder: 'e.g., \"Website Leads - This Week\"',\r\n required: true,\r\n type: \"text\",\r\n };\r\n\r\n const hasSavedFilterRecords = Boolean(columnsData?.saved_filter?.length);\r\n\r\n // const handleSaveFilterButtonClick = () => {\r\n // if (editMode) {\r\n // setSavedFilterModalOpen(true);\r\n // return;\r\n // }\r\n\r\n // setSavedFilterModalOpen(true);\r\n // };\r\n\r\n // const handleSaveFilterButtonClick = () => {\r\n // // Reset filterMaster fields when creating a new filter\r\n // if (!editMode) {\r\n // setFilterMaster((prev) => ({\r\n // ...prev,\r\n // saved_filters: {\r\n // selectedId: \"\",\r\n // selectedName: \"\",\r\n // selectedCode: \"\",\r\n // description: \"\",\r\n // shareWithTeam: false,\r\n // allowTeamEdit: false,\r\n // },\r\n // }));\r\n // }\r\n\r\n // setSavedFilterModalOpen(true);\r\n // };\r\n\r\n const handleSaveFilterButtonClick = () => {\r\n if (!editMode) {\r\n setFilterMaster((prev) => {\r\n if (!prev) return prev;\r\n\r\n return {\r\n ...prev,\r\n saved_filters: {\r\n ...prev.saved_filters,\r\n shareWithTeam: false,\r\n allowTeamEdit: false,\r\n },\r\n };\r\n });\r\n }\r\n\r\n setSavedFilterModalOpen(true);\r\n };\r\n\r\n const handleSavedFilterModalSave = () => {\r\n const selectedId = filterMaster?.saved_filters?.selectedId;\r\n const selectedName = filterMaster?.saved_filters?.selectedName || \"\";\r\n const description = filterMaster?.saved_filters?.description || \"\";\r\n\r\n const selectedCode = filterMaster?.saved_filters?.selectedCode;\r\n\r\n const newFilterMasterState = {\r\n ...filterMaster,\r\n saved_filters: {\r\n ...(filterMaster?.saved_filters ?? {}),\r\n selectedId,\r\n selectedName,\r\n selectedCode,\r\n description,\r\n },\r\n } as FilterMasterStateProps;\r\n\r\n setFilterMaster(newFilterMasterState);\r\n\r\n const newState = {\r\n filterMaster: newFilterMasterState,\r\n filters,\r\n };\r\n\r\n onChangeFunction && onChangeFunction(newState);\r\n\r\n if (editMode) {\r\n onUpdateFilter && onUpdateFilter(selectedName);\r\n const isSingleSavedFilterEditMode =\r\n filterComponentOptions?.tabOptions?.savedFilter?.editMode;\r\n if (!isSingleSavedFilterEditMode) {\r\n setEditMode(false);\r\n }\r\n } else {\r\n onSaveFilter && onSaveFilter(selectedName);\r\n setTabValue(1);\r\n }\r\n\r\n setSavedFilterModalOpen(false);\r\n };\r\n\r\n const handleTabChange = (_: React.SyntheticEvent, newValue: number) => {\r\n const tabType = tabMapping[newValue]?.label;\r\n\r\n if (tabType === \"Attributes\" && tabMapping[tabValue]?.label === \"Filter\") {\r\n clearAttributeRadio();\r\n }\r\n\r\n setTabValue(newValue);\r\n if (newValue === 0) {\r\n setFilterMaster((prev) => {\r\n if (!prev) return prev;\r\n return {\r\n ...prev,\r\n saved_filters: {\r\n ...(prev.saved_filters ?? {}),\r\n selectedId: \"\",\r\n selectedName: \"\",\r\n description: \"\",\r\n is_shared: false,\r\n is_editable: false,\r\n },\r\n };\r\n });\r\n }\r\n\r\n if (tabType === \"Filter\") {\r\n setEditMode(false);\r\n\r\n setFilterMaster(\r\n (prev) =>\r\n ({ ...prev, activeFilterTabIndex: 0 } as FilterMasterStateProps)\r\n );\r\n }\r\n };\r\n\r\n const handleTabCrossClick = (index: number) => {\r\n const tabType = tabMapping[index];\r\n\r\n setFilters([]);\r\n\r\n if (tabType?.label === \"Saved Filter\") setEditMode(false);\r\n\r\n const patches: Partial<FilterMasterStateProps> = {};\r\n\r\n if (tabType?.label === \"Saved Filter\") {\r\n patches.saved_filters = {\r\n ...(filterMaster?.saved_filters ?? {}),\r\n selectedId: \"\",\r\n selectedName: \"\",\r\n selectedCode: \"\",\r\n is_shared: undefined,\r\n is_editable: undefined,\r\n };\r\n } else if (tabType?.label === \"Attributes\") {\r\n patches.attributes = { radio: [], selected: \"\" };\r\n }\r\n\r\n const newFilterMasterState = {\r\n ...filterMaster,\r\n activeFilterTabIndex: -1,\r\n ...patches,\r\n } as FilterMasterStateProps;\r\n\r\n setFilterMaster(newFilterMasterState);\r\n\r\n onChangeFunction &&\r\n onChangeFunction({ filterMaster: newFilterMasterState, filters });\r\n };\r\n\r\n const commonProps = {\r\n columnsData,\r\n tableStates,\r\n onChangeFunction,\r\n dropdownData,\r\n };\r\n\r\n const savedFilterProps = {\r\n editMode,\r\n setEditMode,\r\n setDeleteFilterModalOpen,\r\n tabValue,\r\n };\r\n\r\n const attributesProps = {\r\n searchTerm,\r\n setSearchTerm,\r\n };\r\n\r\n return (\r\n <Box sx={filterStyles.filterContainer}>\r\n {showMainHeader && (\r\n <Box sx={filterStyles.filterMainHeader}>\r\n <Typography variant=\"h6\" fontWeight=\"bold\" fontSize=\"18px\">\r\n {mainHeaderTitle}\r\n </Typography>\r\n <IconButton\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onClose && onClose();\r\n setShowFilterOption(false);\r\n }}\r\n aria-label=\"close\"\r\n >\r\n <CloseIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Box>\r\n )}\r\n\r\n {showTabs && (\r\n <CustomTabs\r\n value={tabValue}\r\n onChange={handleTabChange}\r\n tabItems={tabMapping}\r\n activeFilterIndex={filterMaster?.activeFilterTabIndex ?? 0}\r\n handleCrossClick={handleTabCrossClick}\r\n />\r\n )}\r\n\r\n {!showTabs && (\r\n <SingleFilterRendering\r\n {...commonProps}\r\n {...savedFilterProps}\r\n {...attributesProps}\r\n onSaveFilterButtonClick={handleSaveFilterButtonClick}\r\n filterComponentOptions={finalComponentOptions}\r\n />\r\n )}\r\n\r\n {showMainFilter && (\r\n <CustomTabPanel\r\n value={tabValue}\r\n index={tabMapping.findIndex((tab) => tab.label === \"Filter\")}\r\n sx={{ p: \"1.5rem 0.75rem\" }}\r\n >\r\n <MainFilter\r\n {...commonProps}\r\n onSaveFilterButtonClick={handleSaveFilterButtonClick}\r\n filterComponentOptions={finalComponentOptions}\r\n isFlatJson={isFlatJson}\r\n />\r\n </CustomTabPanel>\r\n )}\r\n\r\n {showSavedFilter && (\r\n <CustomTabPanel\r\n value={tabValue}\r\n index={tabMapping.findIndex((tab) => tab.label === \"Saved Filter\")}\r\n sx={{ p: \"1.5rem 0.75rem\" }}\r\n >\r\n <SavedFilter\r\n {...commonProps}\r\n {...savedFilterProps}\r\n onSaveFilterButtonClick={handleSaveFilterButtonClick}\r\n filterComponentOptions={finalComponentOptions}\r\n isFlatJson={isFlatJson}\r\n />\r\n </CustomTabPanel>\r\n )}\r\n\r\n {showAttributesFilter && (\r\n <CustomTabPanel\r\n value={tabValue}\r\n index={tabMapping.findIndex((tab) => tab.label === \"Attributes\")}\r\n sx={{ p: \"1.5rem 0.75rem\" }}\r\n >\r\n <AttributesFilter\r\n {...commonProps}\r\n {...attributesProps}\r\n tabValue={tabValue}\r\n isFlatJson={isFlatJson}\r\n />\r\n </CustomTabPanel>\r\n )}\r\n\r\n {!filterComponentOptions?.isRuleEngine && (\r\n <ConfirmModal\r\n open={saveFilterModalOpen}\r\n onClose={() => setSaveFilterModalOpen(false)}\r\n title={editMode ? \"Replace Existing Filter ?\" : \"Save Filter\"}\r\n description={\r\n editMode\r\n ? \"You already have a filter applied. Applying a new filter will replace the current one. Do you want to continue?\"\r\n : \"Give a name to this filter so you can easily reuse it later.\"\r\n }\r\n buttons={[\r\n {\r\n label: \"Cancel\",\r\n onClick: () => {\r\n setSaveFilterModalOpen(false);\r\n },\r\n variant: \"outlined\",\r\n color: \"primary\",\r\n sx: {\r\n color: \"#7A5AF8\",\r\n border: `1px solid #7A5AF8`,\r\n },\r\n },\r\n {\r\n label: editMode ? \"Replace Filter\" : \"Save\",\r\n onClick: (inputValue) => {\r\n if (editMode) {\r\n const selectedId = filterMaster?.saved_filters?.selectedId;\r\n const selectedName =\r\n inputValue || filterMaster?.saved_filters?.selectedName;\r\n const selectedCode =\r\n filterMaster?.saved_filters?.selectedCode;\r\n const description =\r\n inputValue || filterMaster?.saved_filters?.description;\r\n\r\n const newFilterMasterState = {\r\n ...filterMaster,\r\n saved_filters: {\r\n ...(filterMaster?.saved_filters ?? {}),\r\n selectedId,\r\n selectedName,\r\n selectedCode,\r\n description,\r\n },\r\n } as FilterMasterStateProps;\r\n\r\n setFilterMaster(newFilterMasterState);\r\n\r\n const newState = {\r\n filterMaster: newFilterMasterState,\r\n filters: filters,\r\n };\r\n\r\n onChangeFunction && onChangeFunction(newState);\r\n\r\n onUpdateFilter && onUpdateFilter(inputValue || \"\");\r\n setSaveFilterModalOpen(false);\r\n setEditMode(false);\r\n return;\r\n }\r\n\r\n onSaveFilter && onSaveFilter(inputValue || \"\");\r\n setSaveFilterModalOpen(false);\r\n setTabValue(1);\r\n },\r\n variant: \"contained\",\r\n color: \"primary\",\r\n sx: {\r\n color: \"white\",\r\n backgroundColor: editMode ? \"#7A5AF8\" : \"#7A5AF8\",\r\n },\r\n },\r\n ]}\r\n input={editMode ? undefined : filterNameInput}\r\n />\r\n )}\r\n\r\n {!filterComponentOptions?.isRuleEngine && (\r\n <ConfirmModal\r\n open={deleteFilterModalOpen}\r\n onClose={() => setDeleteFilterModalOpen(false)}\r\n title=\"Delete Saved Filter?\"\r\n description={`You're about to delete the saved filter: \"${\r\n filterToDelete?.label || \"[Filter Name]\"\r\n }\". This action cannot be undone. Are you sure you want to continue?`}\r\n buttons={[\r\n {\r\n label: \"Cancel\",\r\n onClick: () => {\r\n setDeleteFilterModalOpen(false);\r\n },\r\n variant: \"outlined\",\r\n color: \"primary\",\r\n sx: { color: \"#7A5AF8\", border: `1px solid #7A5AF8` },\r\n },\r\n {\r\n label: \"Delete\",\r\n onClick: () => {\r\n onDeleteFilter && onDeleteFilter();\r\n setDeleteFilterModalOpen(false);\r\n setEditMode && setEditMode(false);\r\n },\r\n variant: \"contained\",\r\n sx: {\r\n color: \"white\",\r\n backgroundColor: \"#f63d68\",\r\n \"&:hover\": { backgroundColor: \"#f63d68\" },\r\n },\r\n },\r\n ]}\r\n maxWidth=\"xs\"\r\n />\r\n )}\r\n\r\n {filterComponentOptions?.isRuleEngine && (\r\n <ConfirmModal\r\n open={saveFilterModalOpen}\r\n onClose={() => setSaveFilterModalOpen(false)}\r\n title={\r\n editMode\r\n ? filterComponentOptions?.recordFilterComponentProps?.edit\r\n ?.title || \"Replace Existing Filter ?\"\r\n : filterComponentOptions?.recordFilterComponentProps?.save\r\n ?.title || \"Save Filter\"\r\n }\r\n description={\r\n editMode\r\n ? filterComponentOptions?.recordFilterComponentProps?.edit\r\n ?.description ||\r\n \"You already have a filter applied. Applying a new filter will replace the current one. Do you want to continue?\"\r\n : filterComponentOptions?.recordFilterComponentProps?.save\r\n ?.description ||\r\n \"Give a name to this filter so you can easily reuse it later.\"\r\n }\r\n buttons={[\r\n {\r\n label:\r\n filterComponentOptions?.recordFilterComponentProps?.save.button\r\n ?.primary || \"Cancel\",\r\n onClick: () => {\r\n setSaveFilterModalOpen(false);\r\n },\r\n variant: \"outlined\",\r\n color: \"primary\",\r\n sx: {\r\n color: \"#7A5AF8\",\r\n border: `1px solid #7A5AF8`,\r\n },\r\n },\r\n {\r\n label: editMode\r\n ? filterComponentOptions?.recordFilterComponentProps?.edit\r\n .button?.secondary || \"Replace Filter\"\r\n : filterComponentOptions?.recordFilterComponentProps?.save\r\n .button?.secondary || \"Save\",\r\n onClick: (inputValue) => {\r\n if (editMode) {\r\n const selectedId = filterMaster?.saved_filters?.selectedId;\r\n const selectedName =\r\n inputValue || filterMaster?.saved_filters?.selectedName;\r\n const selectedCode =\r\n filterMaster?.saved_filters?.selectedCode;\r\n\r\n const newFilterMasterState = {\r\n ...filterMaster,\r\n saved_filters: {\r\n ...(filterMaster?.saved_filters ?? {}),\r\n selectedId,\r\n selectedName,\r\n selectedCode,\r\n },\r\n } as FilterMasterStateProps;\r\n\r\n setFilterMaster(newFilterMasterState);\r\n\r\n const newState = {\r\n filterMaster: newFilterMasterState,\r\n filters: filters,\r\n };\r\n\r\n onChangeFunction && onChangeFunction(newState);\r\n\r\n onUpdateFilter && onUpdateFilter(inputValue || \"\");\r\n setSaveFilterModalOpen(false);\r\n let isSingleSavedFilterEditMode =\r\n filterComponentOptions?.tabOptions?.savedFilter?.editMode;\r\n if (!isSingleSavedFilterEditMode) setEditMode(false);\r\n return;\r\n }\r\n\r\n onSaveFilter && onSaveFilter(inputValue || \"\");\r\n setSaveFilterModalOpen(false);\r\n setTabValue(1);\r\n },\r\n variant: \"contained\",\r\n color: \"primary\",\r\n sx: {\r\n color: \"white\",\r\n backgroundColor: editMode ? \"#7A5AF8\" : \"#7A5AF8\",\r\n },\r\n },\r\n ]}\r\n input={editMode ? undefined : filterNameInput}\r\n />\r\n )}\r\n\r\n {filterComponentOptions?.isRuleEngine && (\r\n <ConfirmModal\r\n open={deleteFilterModalOpen}\r\n onClose={() => setDeleteFilterModalOpen(false)}\r\n title={\r\n filterComponentOptions?.recordFilterComponentProps?.delete.title ||\r\n \"Delete Saved Filter?\"\r\n }\r\n description={\r\n filterComponentOptions?.recordFilterComponentProps?.delete\r\n .description ||\r\n `You're about to delete the saved filter: \"${\r\n filterToDelete?.label || \"[Filter Name]\"\r\n }\". This action cannot be undone. Are you sure you want to continue?`\r\n }\r\n buttons={[\r\n {\r\n label:\r\n filterComponentOptions?.recordFilterComponentProps?.delete\r\n .button?.primary || \"Cancel\",\r\n onClick: () => {\r\n setDeleteFilterModalOpen(false);\r\n },\r\n variant: \"outlined\",\r\n color: \"primary\",\r\n sx: { color: \"#7A5AF8\", border: `1px solid #7A5AF8` },\r\n },\r\n {\r\n label:\r\n filterComponentOptions?.recordFilterComponentProps?.delete\r\n .button?.secondary || \"Delete\",\r\n onClick: () => {\r\n onDeleteFilter && onDeleteFilter();\r\n setDeleteFilterModalOpen(false);\r\n let isSingleSavedFilterEditMode =\r\n filterComponentOptions?.tabOptions?.savedFilter?.editMode;\r\n if (!isSingleSavedFilterEditMode) {\r\n setEditMode && setEditMode(false);\r\n }\r\n },\r\n variant: \"contained\",\r\n sx: {\r\n color: \"white\",\r\n backgroundColor: \"#f63d68\",\r\n \"&:hover\": { backgroundColor: \"#f63d68\" },\r\n },\r\n },\r\n ]}\r\n maxWidth=\"xs\"\r\n />\r\n )}\r\n <SavedFilterModalView\r\n open={savedFilterModalOpen}\r\n onClose={() => setSavedFilterModalOpen(false)}\r\n onSave={handleSavedFilterModalSave}\r\n filterMaster={tableStates.filterMaster}\r\n setFilterMaster={tableStates.setFilterMaster}\r\n hasSavedFilters={hasSavedFilterRecords}\r\n columnsData={columnsData}\r\n disableShareFilter={\r\n filterComponentOptions?.tabOptions?.disableShareFilter\r\n }\r\n />\r\n </Box>\r\n );\r\n}\r\n","import React, { useState } from \"react\";\r\nimport {\r\n DialogTitle,\r\n IconButton,\r\n Box,\r\n Typography,\r\n DialogContent,\r\n DialogActions,\r\n} from \"@mui/material\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport CustomVerticalTabs from \"./tabs/vertical\";\r\nimport CustomTabPanel from \"./tabs/vertical/custom-tab-panel\";\r\nimport QuickTab from \"./components/quick-tab\";\r\nimport Column from \"./components/column\";\r\nimport Sorting from \"./components/sorting\";\r\nimport { QuickFilterModalProps } from \"../../types/filter-settings\";\r\nimport { CustomDialog, DialogTransition } from \"./components/custom-dialog\";\r\nimport { dialogStyles } from \"./style\";\r\nimport CustomButton from \"./components/custom-button\";\r\nimport { KANBAN_SETTINGS_TABS, SETTINGS_TABS } from \"./constants\";\r\nimport Loader from \"../common/loader/loader\";\r\nimport Lane from \"./components/lane\";\r\nimport GroupBy from \"./components/swim-lane\";\r\nimport { useFullscreenPopoverContainer } from \"../../libs/hooks/useFullScreen\";\r\n\r\nexport function QuickFilterSettings({\r\n view = \"listing\",\r\n isFlatJson,\r\n show,\r\n filterSettingStates,\r\n onClose,\r\n columnsData,\r\n columnsDataLoading,\r\n quickTabAttributes,\r\n quickTabAttributesLoading,\r\n columnTabAttributes,\r\n columnTabAttributesLoading,\r\n sortingTabAttributes,\r\n sortingTabAttributesLoading,\r\n tabsApiData,\r\n tabsApiDataLoading,\r\n onSaveSettingsData,\r\n activeTab,\r\n selectAttributeData,\r\n selectSwinLandData,\r\n laneHideListData,\r\n swimLaneHideListData,\r\n onSaveKanbanSettingsData,\r\n}: QuickFilterModalProps) {\r\n const [tabValue, setTabValue] = useState(0);\r\n const { container: fullscreenContainer } = useFullscreenPopoverContainer();\r\n\r\n const {\r\n showListViewSettings,\r\n quickTabStates,\r\n columnTabState,\r\n sortingTabState,\r\n saveButtonError,\r\n kanbanSettingsData,\r\n } = filterSettingStates;\r\n\r\n const hasAPIData = Boolean(Object.entries(columnsData).length);\r\n let disbaledCondition =\r\n // quickTabStates?.show_list?.length === 0 || --> commented as per the requirement\r\n columnTabState?.isDefault\r\n ? columnTabState?.show_list?.length === 0\r\n : columnTabState?.tabs?.find((tab) => tab?.show_list?.length === 0)\r\n ?.show_list?.length === 0;\r\n\r\n const handleTabChange = (_: React.SyntheticEvent, newValue: number) => {\r\n setTabValue(newValue);\r\n };\r\n\r\n const handleSaveSetSettingsData = () => {\r\n const copyColumnTabState = {\r\n isDefault: columnTabState?.isDefault,\r\n show_list: columnTabState?.show_list || [],\r\n hide_list: columnTabState?.hide_list || [],\r\n tabs: columnTabState?.tabs || [],\r\n };\r\n // : {\r\n // isDefault: false,\r\n // tabs: columnTabState?.tabs || [],\r\n // };\r\n // commented as per the requirement\r\n const copySortingTabState = {\r\n isDefault: sortingTabState?.isDefault,\r\n sortby:\r\n sortingTabState?.sortby?.filter((item) => item.column !== \"\") || [],\r\n tabs: sortingTabState?.tabs || [],\r\n };\r\n // : {\r\n // isDefault: false,\r\n // tabs: sortingTabState?.tabs || [],\r\n // };\r\n\r\n const modifiedSettingsData = {\r\n quick_tab: quickTabStates,\r\n column: copyColumnTabState,\r\n sorting: copySortingTabState,\r\n };\r\n\r\n onSaveSettingsData && onSaveSettingsData(modifiedSettingsData);\r\n onClose && onClose();\r\n };\r\n\r\n const handleSaveKanbanSetSettingsData = () => {\r\n const modifiedKanbanSettingsData = {\r\n lane: kanbanSettingsData?.lane,\r\n swim_lane: kanbanSettingsData?.swim_lane,\r\n };\r\n onSaveKanbanSettingsData &&\r\n onSaveKanbanSettingsData(modifiedKanbanSettingsData);\r\n onClose && onClose();\r\n };\r\n\r\n return (\r\n <CustomDialog\r\n open={show || showListViewSettings}\r\n fullWidth\r\n maxWidth=\"lg\"\r\n slots={{\r\n transition: DialogTransition,\r\n }}\r\n container={fullscreenContainer}\r\n >\r\n <DialogTitle sx={dialogStyles.dialogTitle}>\r\n <Typography sx={{ fontSize: \"1.125rem\" }}>\r\n {view === \"listing\"\r\n ? \"Quick Filter Settings\"\r\n : \"Kanban View Settings\"}\r\n </Typography>\r\n\r\n <IconButton\r\n size=\"small\"\r\n color=\"inherit\"\r\n onClick={() => {\r\n onClose && onClose();\r\n }}\r\n >\r\n <CloseIcon />\r\n </IconButton>\r\n </DialogTitle>\r\n\r\n <DialogContent>\r\n {columnsDataLoading ? (\r\n <Loader loaderText=\"Loading settings...\" />\r\n ) : !hasAPIData ? ( // check if columns data is available\r\n <Typography>Please pass meta data in component</Typography>\r\n ) : (\r\n <>\r\n <CustomVerticalTabs\r\n value={tabValue}\r\n onChange={handleTabChange}\r\n tabItems={\r\n view === \"listing\" ? SETTINGS_TABS : KANBAN_SETTINGS_TABS\r\n }\r\n />\r\n\r\n <Box sx={{ flex: \"1\" }}>\r\n {view.toLowerCase() === \"listing\" && (\r\n <CustomTabPanel value={tabValue} index={0}>\r\n {tabValue === 0 && (\r\n <QuickTab\r\n filterSettingStates={filterSettingStates}\r\n columnsData={quickTabAttributes}\r\n tabsApiData={tabsApiData}\r\n tabsApiDataLoading={tabsApiDataLoading}\r\n activeTab={activeTab}\r\n columnTabAttributes={columnTabAttributes}\r\n isFlatJson={isFlatJson}\r\n />\r\n )}\r\n </CustomTabPanel>\r\n )}\r\n\r\n {view.toLowerCase() === \"listing\" && (\r\n <CustomTabPanel value={tabValue} index={1}>\r\n {tabValue === 1 && (\r\n <Column\r\n filterSettingStates={filterSettingStates}\r\n columnsData={columnsData}\r\n columnTabAttributes={columnTabAttributes}\r\n columnTabAttributesLoading={columnTabAttributesLoading}\r\n />\r\n )}\r\n </CustomTabPanel>\r\n )}\r\n\r\n {view.toLowerCase() === \"listing\" && (\r\n <CustomTabPanel value={tabValue} index={2}>\r\n {tabValue === 2 && (\r\n <Sorting\r\n filterSettingStates={filterSettingStates}\r\n columnsData={sortingTabAttributes}\r\n />\r\n )}\r\n </CustomTabPanel>\r\n )}\r\n {view.toLowerCase() === \"kanban\" && (\r\n <CustomTabPanel value={tabValue} index={0}>\r\n {tabValue === 0 && (\r\n <Lane\r\n filterSettingStates={filterSettingStates}\r\n columnsData={columnsData}\r\n selectAttributeData={selectAttributeData}\r\n laneHideListData={laneHideListData}\r\n />\r\n )}\r\n </CustomTabPanel>\r\n )}\r\n\r\n {view.toLowerCase() === \"kanban\" && (\r\n <CustomTabPanel value={tabValue} index={1}>\r\n {tabValue === 1 && (\r\n <GroupBy\r\n filterSettingStates={filterSettingStates}\r\n columnsData={columnsData}\r\n selectSwinLandData={selectSwinLandData}\r\n swimLaneHideListData={swimLaneHideListData}\r\n />\r\n )}\r\n </CustomTabPanel>\r\n )}\r\n </Box>\r\n </>\r\n )}\r\n </DialogContent>\r\n\r\n {!columnsDataLoading && hasAPIData && (\r\n // <DialogActions>\r\n // <CustomButton\r\n // // disabled={saveButtonError?.hasError}\r\n // // disabled={saveButtonError?.hasError}\r\n // disabled={disbaledCondition}\r\n // onClick={handleSaveSetSettingsData}\r\n // >\r\n // {view === \"listing\" ? \"Save Quick Filter\" : \"Save Kanban Layout\"}\r\n // </CustomButton>\r\n // </DialogActions>\r\n <DialogActions>\r\n {view === \"kanban\" && tabValue === 0 && (\r\n <>\r\n <CustomButton onClick={handleSaveSetSettingsData}>\r\n Save & Close\r\n </CustomButton>\r\n <CustomButton onClick={() => setTabValue(1)} variant=\"contained\">\r\n Next\r\n </CustomButton>\r\n </>\r\n )}\r\n\r\n {view === \"kanban\" && tabValue === 1 && (\r\n <CustomButton onClick={handleSaveKanbanSetSettingsData}>\r\n Save\r\n </CustomButton>\r\n )}\r\n </DialogActions>\r\n )}\r\n </CustomDialog>\r\n );\r\n}\r\n","import { Box, CircularProgress, IconButton } from \"@mui/material\";\r\nimport { CraftTableOptionsProps } from \"../../types/table-options\";\r\nimport { settingsOptionsProps } from \"../../types/table\";\r\nimport { useMemo } from \"react\";\r\nimport { TableTab, TableTabCount, TableTabsRoot } from \"./tabs.styles\";\r\nimport { SettingsOutlined } from \"@mui/icons-material\";\r\n\r\ninterface TabDataProps {\r\n tab_name: string | null;\r\n count?: string | number;\r\n}\r\n\r\ninterface TableTabsProps {\r\n loading?: boolean;\r\n tabsData?: TabDataProps[];\r\n activeTab?: TabDataProps;\r\n tableStates: CraftTableOptionsProps;\r\n onClick: (state: string) => void;\r\n settingsOptions?: settingsOptionsProps;\r\n}\r\n\r\nexport function TableTabs({\r\n loading = false,\r\n tabsData = [],\r\n activeTab = { tab_name: \"All\", count: 0 },\r\n onClick,\r\n tableStates,\r\n settingsOptions,\r\n}: TableTabsProps) {\r\n if (loading) return <CircularProgress size={24} />;\r\n\r\n const handleTabClick = (tab: string) => {\r\n onClick(tab);\r\n tableStates.setPagination((prev) => ({\r\n ...prev,\r\n pageIndex: 0,\r\n }));\r\n };\r\n\r\n const normalizedTabs = useMemo(() => {\r\n return tabsData\r\n ?.filter((tab) => tab.tab_name !== null)\r\n ?.map((tab) => ({\r\n ...tab,\r\n tab_name: tab.tab_name,\r\n }));\r\n }, [tabsData]);\r\n\r\n const defaultTab = useMemo(() => {\r\n return (\r\n normalizedTabs.find((t) => t.tab_name === \"All\")?.tab_name ||\r\n normalizedTabs[0]?.tab_name ||\r\n \"\"\r\n );\r\n }, [normalizedTabs]);\r\n\r\n const selectedTab = activeTab?.tab_name || defaultTab;\r\n\r\n return (\r\n <Box display=\"flex\" alignItems=\"center\" justifyContent=\"flex-start\">\r\n {/* Settings icon */}\r\n {settingsOptions?.showIcon && (\r\n <IconButton size=\"small\" onClick={settingsOptions?.onClick}>\r\n <SettingsOutlined fontSize=\"small\" />\r\n </IconButton>\r\n )}\r\n\r\n {/* Tabs */}\r\n <TableTabsRoot\r\n value={selectedTab}\r\n onChange={(_, newValue) => handleTabClick(newValue)}\r\n variant=\"scrollable\"\r\n scrollButtons=\"auto\"\r\n >\r\n {normalizedTabs.map((tab) => {\r\n const isSelected = activeTab?.tab_name === tab?.tab_name;\r\n\r\n return (\r\n <TableTab\r\n key={tab?.tab_name}\r\n value={tab}\r\n label={\r\n <Box display=\"flex\" alignItems=\"center\" gap={1}>\r\n <Box sx={{ color: isSelected ? \"#000\" : \"\" }}>\r\n {tab?.tab_name}\r\n </Box>\r\n <TableTabCount selected={isSelected}>\r\n {tab?.count == 0\r\n ? \"0\"\r\n : String(tab?.count).padStart(2, \"0\")}\r\n </TableTabCount>\r\n </Box>\r\n }\r\n />\r\n );\r\n })}\r\n </TableTabsRoot>\r\n </Box>\r\n );\r\n}\r\n","import React, { useEffect, useState } from \"react\";\r\nimport {\r\n Box,\r\n Typography,\r\n Accordion,\r\n AccordionSummary,\r\n AccordionDetails,\r\n IconButton,\r\n} from \"@mui/material\";\r\nimport SettingsOutlinedIcon from \"@mui/icons-material/SettingsOutlined\";\r\nimport {\r\n ExpandMore as ExpandMoreIcon,\r\n Settings as SettingsIcon,\r\n} from \"@mui/icons-material\";\r\nimport ArrowDropDownIcon from \"@mui/icons-material/ArrowDropDown\";\r\nimport { kanbanStyles } from \"./styles/styles\";\r\nimport { Lane, SubLane, SwimLane } from \"./types/types\";\r\nimport { COLOR_CONSTANTS } from \"./constants/kanban-constants\";\r\nimport Loader from \"../listing/components/common/loader/loader\";\r\n\r\nconst Kanban = ({\r\n metaData,\r\n data,\r\n isLoading,\r\n KanbanCardComponent,\r\n showSettings,\r\n onOpenSettings,\r\n}: {\r\n metaData: any;\r\n data: any;\r\n isLoading?: boolean;\r\n KanbanCardComponent: React.ComponentType<{\r\n key: string | number;\r\n cardData: any;\r\n }>;\r\n showSettings: boolean;\r\n onOpenSettings?: () => void;\r\n}) => {\r\n const [expandedPanels, setExpandedPanels] = useState<{\r\n [key: string]: boolean;\r\n }>({\r\n Active: true,\r\n });\r\n\r\n const [subLaneExpanded, setSubLaneExpanded] = useState<{\r\n [key: string]: boolean;\r\n }>({});\r\n\r\n useEffect(() => {\r\n if (metaData?.swim_lanes?.length) {\r\n const initial: { [key: string]: boolean } = {};\r\n metaData?.swim_lanes.forEach((swim_lane: SwimLane) => {\r\n swim_lane?.sub_lanes?.forEach((sub_lane) => {\r\n const key = `${swim_lane.id}-${sub_lane.lane_id}-${sub_lane.id}`;\r\n initial[key] = sub_lane.expanded || false;\r\n });\r\n });\r\n setSubLaneExpanded(initial);\r\n }\r\n }, [metaData]);\r\n\r\n const handleAccordionChange =\r\n (panel: string) => (event: React.SyntheticEvent, isExpanded: boolean) => {\r\n setExpandedPanels((prev) => ({\r\n ...prev,\r\n [panel]: isExpanded,\r\n }));\r\n };\r\n\r\n const toggleSubLane = (subLaneId: number | string) => {\r\n setSubLaneExpanded((prev) => ({\r\n ...prev,\r\n [subLaneId]: !prev[subLaneId],\r\n }));\r\n };\r\n\r\n const getLeadCount = (laneId: number): number => {\r\n if (!metaData?.swim_lanes || !data) return 0;\r\n\r\n const seenLeadIds = new Set<number | string>();\r\n let count = 0;\r\n\r\n metaData?.swim_lanes.forEach((swimLane: SwimLane) => {\r\n swimLane.sub_lanes\r\n ?.filter((subLane) => subLane.lane_id == laneId)\r\n ?.forEach((subLane) => {\r\n data?.forEach((lead: any) => {\r\n if (lead?.stage_id == subLane?.id && !seenLeadIds.has(lead?.id)) {\r\n seenLeadIds.add(lead.id);\r\n count++;\r\n }\r\n });\r\n });\r\n });\r\n\r\n return count;\r\n };\r\n\r\n return (\r\n <>\r\n {isLoading ? (\r\n <Loader />\r\n ) : (\r\n <Box>\r\n <Box\r\n className=\"kanban-container\"\r\n sx={{ width: \"100%\", bgcolor: \"white\", overflowX: \"auto\" }}\r\n >\r\n {/* Header */}\r\n <Box sx={kanbanStyles.topHeader}>\r\n <IconButton\r\n onClick={onOpenSettings}\r\n sx={{\r\n ...kanbanStyles.settingStyle,\r\n visibility: showSettings ? \"visible\" : \"hidden\",\r\n }}\r\n >\r\n <SettingsOutlinedIcon />\r\n </IconButton>\r\n\r\n {/* Lane Headers - Replaced Grid with Flex */}\r\n <Box\r\n sx={{\r\n ...kanbanStyles.syncingStyle,\r\n flex: 1,\r\n }}\r\n >\r\n {metaData?.lanes?.map((lane: Lane, index: number) => (\r\n <Box\r\n className=\"lane-header\"\r\n sx={{\r\n ...kanbanStyles.laneHeader,\r\n\r\n bgcolor: lane.color || COLOR_CONSTANTS[index % 4].color,\r\n }}\r\n key={lane.id}\r\n >\r\n <Box\r\n sx={{\r\n ...kanbanStyles.badge,\r\n\r\n bgcolor:\r\n lane.darkColor ||\r\n COLOR_CONSTANTS[index % 4].darkColor,\r\n }}\r\n >\r\n {getLeadCount(Number(lane.id))}\r\n </Box>\r\n\r\n <Typography variant=\"h6\" fontWeight=\"bold\" sx={{ px: 2 }}>\r\n {lane?.name}\r\n </Typography>\r\n </Box>\r\n ))}\r\n </Box>\r\n </Box>\r\n\r\n {/* Content */}\r\n <Box\r\n className=\"kanban-content\"\r\n id=\"kanban-content\"\r\n sx={{\r\n maxHeight: \"calc(100vh - 186px)\",\r\n // minWidth: \"100%\",\r\n\r\n width: \"fit-content\",\r\n }}\r\n >\r\n {/* Swim Lanes */}\r\n {metaData?.swim_lanes?.map((swim_lane: SwimLane) => (\r\n <Accordion\r\n key={swim_lane.id}\r\n expanded={!!expandedPanels[swim_lane.name]}\r\n onChange={handleAccordionChange(swim_lane.name)}\r\n sx={kanbanStyles.swimLaneAccordionStyle}\r\n // disabled={getSwimLaneCount(swim_lane.id) === 0 ? true : false}\r\n >\r\n <AccordionSummary\r\n disabled={swim_lane?.sub_lanes?.length > 0 ? false : true}\r\n expandIcon={\r\n <ArrowDropDownIcon\r\n sx={{\r\n color: \"black\",\r\n }}\r\n />\r\n }\r\n sx={kanbanStyles.swimlaneWrapperStyle}\r\n >\r\n <Typography\r\n variant=\"body1\"\r\n fontWeight=\"medium\"\r\n sx={{ ml: 1.5 }}\r\n >\r\n {swim_lane?.name} (\r\n {\r\n data?.filter(\r\n (lead: any) => lead?.lead_status_id == swim_lane?.id\r\n ).length\r\n }\r\n )\r\n </Typography>\r\n </AccordionSummary>\r\n\r\n <AccordionDetails\r\n sx={{ pl: \"16px\", pr: \"8px\", width: \"fit-content\", py: 0 }}\r\n >\r\n {/* Replaced Grid with Flex */}\r\n <Box sx={{ ...kanbanStyles.syncingStyle, pl: 7 }}>\r\n {metaData?.lanes?.map((lane: Lane, index: number) => (\r\n <Box\r\n className=\"column\"\r\n sx={{\r\n ...kanbanStyles.columnStyle,\r\n bgcolor:\r\n lane?.color || COLOR_CONSTANTS[index % 4].color,\r\n }}\r\n key={lane.id}\r\n >\r\n {/* Sub-lanes for this lane */}\r\n {swim_lane?.sub_lanes\r\n ?.filter(\r\n (sub_lane: SubLane) =>\r\n sub_lane.lane_id.toString() == lane?.id\r\n )\r\n ?.map((sub_section: SubLane) => {\r\n const subLaneKey = `${swim_lane?.id}-${lane?.id}-${sub_section?.id}`;\r\n return (\r\n <Accordion\r\n key={sub_section.id}\r\n expanded={\r\n data?.filter(\r\n (lead: any) =>\r\n lead?.stage_id == sub_section?.id &&\r\n lead?.lead_status_id == swim_lane?.id\r\n )?.length === 0\r\n ? false\r\n : subLaneExpanded[subLaneKey] || false\r\n }\r\n onChange={() => toggleSubLane(subLaneKey)}\r\n sx={{\r\n ...kanbanStyles.stageStyle,\r\n borderLeft: `4px solid ${\r\n lane.darkColor ||\r\n COLOR_CONSTANTS[index % 4].darkColor\r\n }`,\r\n }}\r\n // disabled={\r\n // metaData?.data?.filter(\r\n // (lead: LeadData) =>\r\n // lead.sub_lane_id === sub_section.id &&\r\n // !usedLeadIds.has(lead.id)\r\n // )?.length === 0\r\n // ? true\r\n // : false\r\n // }\r\n >\r\n <AccordionSummary\r\n expandIcon={\r\n <ExpandMoreIcon\r\n sx={{\r\n display:\r\n data?.filter(\r\n (lead: any) =>\r\n lead?.stage_id ==\r\n sub_section?.id &&\r\n lead?.lead_status_id ==\r\n swim_lane?.id\r\n )?.length === 0\r\n ? \"none\"\r\n : \"block\",\r\n }}\r\n />\r\n }\r\n sx={kanbanStyles.subSectionAccordion}\r\n >\r\n <Box\r\n sx={\r\n kanbanStyles.subSectionHeaderContainer\r\n }\r\n >\r\n <Box\r\n className=\"sub-section-count\"\r\n sx={{\r\n ...kanbanStyles.subSectionCountContainer,\r\n bgcolor:\r\n lane?.darkColor ||\r\n COLOR_CONSTANTS[index % 4]\r\n .darkColor,\r\n }}\r\n >\r\n {data?.filter(\r\n (lead: any) =>\r\n lead?.stage_id == sub_section?.id &&\r\n lead?.lead_status_id ==\r\n swim_lane?.id\r\n )?.length || 0}\r\n </Box>\r\n <Typography\r\n fontWeight=\"700\"\r\n color=\"#555354\"\r\n fontSize=\"12px\"\r\n >\r\n {sub_section?.name}\r\n </Typography>\r\n </Box>\r\n </AccordionSummary>\r\n\r\n <AccordionDetails\r\n sx={kanbanStyles.cardsContainer}\r\n >\r\n {(() => {\r\n const leadsForThisSubLane =\r\n data?.filter(\r\n (lead: any) =>\r\n lead?.stage_id == sub_section?.id &&\r\n lead?.lead_status_id ==\r\n swim_lane?.id &&\r\n lead?.stage_group_id == lane?.id\r\n ) || [];\r\n\r\n return leadsForThisSubLane.map(\r\n (card: any) =>\r\n (KanbanCardComponent && (\r\n <KanbanCardComponent\r\n key={card?.id}\r\n cardData={card}\r\n />\r\n )) ||\r\n null\r\n );\r\n })()}\r\n </AccordionDetails>\r\n </Accordion>\r\n );\r\n })}\r\n </Box>\r\n ))}\r\n </Box>\r\n </AccordionDetails>\r\n </Accordion>\r\n ))}\r\n </Box>\r\n </Box>\r\n </Box>\r\n )}\r\n </>\r\n );\r\n};\r\n\r\nexport default Kanban;\r\n","import {\r\n ColumnDef,\r\n ColumnMeta,\r\n getCoreRowModel,\r\n getExpandedRowModel,\r\n getPaginationRowModel,\r\n getSortedRowModel,\r\n useReactTable,\r\n} from \"@tanstack/react-table\";\r\nimport \"./index.scss\";\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport {\r\n CraftTablePaginationProps,\r\n CraftTableProps,\r\n TopbarOptionsProps,\r\n} from \"../types/table\";\r\nimport { CraftTableFeatureProps } from \"../types/table-options\";\r\nimport { LoaderAnimation } from \"../../assets/svg\";\r\nimport Topbar from \"./topbar\";\r\nimport DefaultPagination from \"./pagination/default\";\r\nimport TableDND from \"./table-dnd\";\r\nimport Table from \"./table\";\r\nimport { useFullscreenPopoverContainer } from \"../libs/hooks/useFullScreen\";\r\n\r\ninterface CustomColumnMeta<T> extends ColumnMeta<T, unknown> {\r\n defaultPinned?: \"left\" | \"right\" | undefined;\r\n}\r\n\r\nfunction TableWrapper<T>({\r\n data = [],\r\n columns = [],\r\n tableStates,\r\n filterSettingStates,\r\n onSaveSettings,\r\n paginationOptions,\r\n featureOptions,\r\n topbarOptions,\r\n nestedComponent,\r\n loadingOptions = { isLoading: false },\r\n customRenderFn = {},\r\n // styleOptions,\r\n shouldHideColumn,\r\n emptyListComponent,\r\n filterOptions,\r\n activeTab,\r\n}: CraftTableProps<T>) {\r\n if (!Array.isArray(data)) {\r\n throw new Error(\"data must be an array of objects.\");\r\n }\r\n const [metaColumns, setMetaColumns] = useState<ColumnDef<T>[]>([]);\r\n\r\n useEffect(() => {\r\n if (columns?.length > 0) {\r\n const updatedColumns = columns\r\n ?.filter((col) => {\r\n const accessorKey =\r\n \"accessorKey\" in col\r\n ? (col as { accessorKey: string })?.accessorKey\r\n : undefined;\r\n return typeof shouldHideColumn === \"function\"\r\n ? !shouldHideColumn(accessorKey)\r\n : true;\r\n })\r\n ?.map((col, index) => {\r\n const id =\r\n \"accessorKey\" in col\r\n ? (col as { accessorKey: string })?.accessorKey\r\n : `col_${index}`;\r\n\r\n const cell = (ctx: any) => {\r\n if (col?.meta?.type === \"custom\" && col?.meta?.propName) {\r\n const customFn = customRenderFn?.[col?.meta?.propName];\r\n return typeof customFn === \"function\"\r\n ? customFn({\r\n value: ctx?.getValue(),\r\n row: ctx?.row,\r\n table: ctx?.table?.getRowModel()?.rows,\r\n })\r\n : ctx?.getValue();\r\n }\r\n\r\n if (typeof col?.cell === \"function\") {\r\n return col?.cell(ctx);\r\n }\r\n\r\n return ctx?.getValue();\r\n };\r\n\r\n return { ...col, id, cell };\r\n });\r\n\r\n setMetaColumns(updatedColumns);\r\n }\r\n }, [columns]);\r\n\r\n //For Default Column Pinning to work\r\n useEffect(() => {\r\n table.getAllLeafColumns().forEach((col) => {\r\n const where = (col.columnDef.meta as CustomColumnMeta<T>)\r\n ?.defaultPinned as \"left\" | \"right\" | undefined;\r\n if (where && !col.getIsPinned()) {\r\n col.pin(where);\r\n }\r\n });\r\n }, [tableStates?.columnPinning?.left, metaColumns]);\r\n\r\n const [columnOrder, setColumnOrder] = useState<string[]>(() =>\r\n metaColumns.map((c) => c.id!)\r\n );\r\n\r\n useEffect(() => {\r\n if (metaColumns.length > 0) {\r\n setColumnOrder(metaColumns.map((c) => c.id!));\r\n }\r\n }, [metaColumns]);\r\n\r\n const [isCompactTable, setIsCompactTable] = useState<boolean>(\r\n featureOptions?.compactTable ?? false\r\n );\r\n\r\n const tableRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n setIsCompactTable(featureOptions?.compactTable ?? false);\r\n }, [featureOptions?.compactTable]);\r\n\r\n const craftPaginationOptions: CraftTablePaginationProps = {\r\n showPagination: true,\r\n paginationPosition: \"bottom\",\r\n paginationView: \"full\",\r\n\r\n ...paginationOptions,\r\n };\r\n\r\n const totalRows = craftPaginationOptions?.totalRows ?? data.length;\r\n const rowsPerPageArray = craftPaginationOptions?.rowsPerPageArray ?? [\r\n 25, 50, 100, 150,\r\n ];\r\n const craftTopbarOptions: TopbarOptionsProps = {\r\n showColumnToggle: true,\r\n showCompactTableToggle: true,\r\n showChangeLayoutToggle: true,\r\n viewMoreToggle: true,\r\n showSearch: true,\r\n showSortingToggle: false,\r\n showFilterToggle: true,\r\n tableStates,\r\n\r\n // Add other conditions above topbarOptions\r\n ...topbarOptions,\r\n };\r\n\r\n const craftFeatureOptions: CraftTableFeatureProps = {\r\n enableTopbar: true,\r\n enableSorting: true,\r\n enableServerSidePagination: false,\r\n enableServerSideSorting: false,\r\n enableRowSelection: false,\r\n enableColumnResizing: true,\r\n enableColumnReordering: true,\r\n enableColumnPinning: true,\r\n enableMultiColumnSorting: true,\r\n compactTable: false,\r\n stickyHeader: true,\r\n enableWordBreakAll: false,\r\n striped: false,\r\n\r\n // Add other conditions above featureOptions\r\n ...featureOptions,\r\n };\r\n\r\n const {\r\n enableTopbar,\r\n enableRowSelection,\r\n enableServerSidePagination,\r\n enableServerSideSorting,\r\n enableSorting,\r\n enableColumnResizing,\r\n enableColumnReordering,\r\n enableColumnPinning,\r\n // enableMultiColumnSorting,\r\n } = craftFeatureOptions;\r\n\r\n const {\r\n sorting,\r\n setSorting,\r\n pagination,\r\n setPagination,\r\n rowSelection,\r\n setRowSelection,\r\n expanded,\r\n setExpanded,\r\n } = tableStates;\r\n\r\n const table = useReactTable({\r\n data,\r\n columns: metaColumns,\r\n state: {\r\n sorting,\r\n pagination,\r\n rowSelection,\r\n columnOrder,\r\n expanded,\r\n },\r\n\r\n getCoreRowModel: getCoreRowModel(),\r\n\r\n /** Sorting options start here */\r\n enableSorting: enableSorting,\r\n onSortingChange: setSorting,\r\n getSortedRowModel: getSortedRowModel(),\r\n manualSorting: enableServerSideSorting,\r\n // isMultiSortEvent: () => enableMultiColumnSorting || false,\r\n /** Sorting options end here */\r\n\r\n /** Pagination options start here */\r\n getPaginationRowModel: getPaginationRowModel(),\r\n onPaginationChange: setPagination,\r\n rowCount: totalRows,\r\n manualPagination: enableServerSidePagination,\r\n /** Pagination options end here */\r\n\r\n /** Row selection options start here */\r\n enableRowSelection: enableRowSelection,\r\n onRowSelectionChange: setRowSelection,\r\n /** Row selection options end here */\r\n\r\n /** Column Sizing options start here */\r\n enableColumnResizing: enableColumnResizing,\r\n columnResizeDirection: \"ltr\",\r\n columnResizeMode: \"onChange\",\r\n /** Column Sizing options end here */\r\n\r\n /** Column Ordering options start here */\r\n onColumnOrderChange: setColumnOrder,\r\n /** Column Ordering options end here */\r\n\r\n /** Column Pinning options end here */\r\n enableColumnPinning: enableColumnPinning,\r\n /** Column Pinning options end here */\r\n\r\n /** Row expanding options start here */\r\n getExpandedRowModel: getExpandedRowModel(),\r\n onExpandedChange: setExpanded,\r\n getSubRows: (row) => (row as { subRows?: T[] }).subRows ?? [],\r\n /** Row expanding options end here */\r\n });\r\n\r\n const { isLoading, loadingComponent, loaderText } = loadingOptions;\r\n const { isFullscreen } = useFullscreenPopoverContainer();\r\n\r\n const handleFullscreenToggle = () => {\r\n if (!document.fullscreenElement) {\r\n tableRef.current?.requestFullscreen().catch((err) => {\r\n console.error(\"Error attempting to enable fullscreen mode:\", err);\r\n });\r\n } else {\r\n document.exitFullscreen();\r\n }\r\n };\r\n\r\n // const tableWrapperProps = {\r\n // ...(styleOptions?.wrapperStyle && { style: styleOptions.wrapperStyle }),\r\n // className: \"ts__table__wrapper\",\r\n // };\r\n // const emptyListComponentCondition = () => {\r\n // if(isLoading) {}\r\n // }\r\n\r\n const showFilterCondition = filterOptions?.show;\r\n\r\n return (\r\n <div className=\"ts__table__container\">\r\n <div\r\n className={`ts__table__layout ${\r\n showFilterCondition ? \"has-filter\" : \"\"\r\n }`}\r\n >\r\n {/* Main Table Area */}\r\n <div\r\n className={`ts__table__main ${isFullscreen ? \"is-fullscreen\" : \"\"}`}\r\n ref={tableRef}\r\n >\r\n {enableTopbar && (\r\n <Topbar\r\n table={table}\r\n topbarOptions={craftTopbarOptions}\r\n isCompactTable={isCompactTable}\r\n setIsCompactTable={setIsCompactTable}\r\n isFullscreen={isFullscreen}\r\n fullscreenToggle={handleFullscreenToggle}\r\n paginationComponent={\r\n craftPaginationOptions?.showPagination === true &&\r\n craftPaginationOptions?.paginationPosition === \"top\" ? (\r\n <DefaultPagination\r\n table={table}\r\n rowsPerPageArray={rowsPerPageArray}\r\n paginationOptions={craftPaginationOptions}\r\n />\r\n ) : null\r\n }\r\n searchValue={craftTopbarOptions.searchValue}\r\n onSearchChange={craftTopbarOptions.onSearchChange}\r\n tableStates={tableStates}\r\n onFilterButtonClick={topbarOptions?.onFilterButtonClick}\r\n />\r\n )}\r\n\r\n {isLoading ? (\r\n loadingComponent ?? (\r\n <div className=\"ts__loader\">\r\n <LoaderAnimation />\r\n {loaderText && <p>{loaderText}</p>}\r\n </div>\r\n )\r\n ) : !isLoading && data.length === 0 && emptyListComponent ? (\r\n emptyListComponent\r\n ) : (\r\n <div\r\n // {...tableWrapperProps}\r\n className={`ts__table__wrapper ${\r\n isFullscreen ? \"is-fullscreen\" : \"\"\r\n }`}\r\n >\r\n {enableColumnReordering ? (\r\n <TableDND\r\n table={table}\r\n activeTab={activeTab}\r\n columnOrder={columnOrder}\r\n featureOptions={craftFeatureOptions}\r\n NestedComponent={nestedComponent}\r\n setColumnOrder={setColumnOrder}\r\n isCompactTable={isCompactTable}\r\n tableStates={tableStates}\r\n filterSettingStates={filterSettingStates}\r\n onSaveSettings={onSaveSettings}\r\n />\r\n ) : (\r\n <Table\r\n table={table}\r\n activeTab={activeTab}\r\n featureOptions={craftFeatureOptions}\r\n NestedComponent={nestedComponent}\r\n columnOrder={columnOrder}\r\n setColumnOrder={setColumnOrder}\r\n isCompactTable={isCompactTable}\r\n tableStates={tableStates}\r\n filterSettingStates={filterSettingStates}\r\n onSaveSettings={onSaveSettings}\r\n />\r\n )}\r\n </div>\r\n )}\r\n\r\n {craftPaginationOptions?.showPagination === true &&\r\n craftPaginationOptions?.paginationPosition === \"bottom\" ? (\r\n <DefaultPagination\r\n table={table}\r\n rowsPerPageArray={rowsPerPageArray}\r\n paginationOptions={craftPaginationOptions}\r\n />\r\n ) : null}\r\n </div>\r\n\r\n <div\r\n className={`ts__table__filter ${\r\n showFilterCondition ? \"show\" : \"\"\r\n }`.trim()}\r\n >\r\n {filterOptions?.component && filterOptions?.component}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default TableWrapper;\r\n","import {\r\n ColumnPinningState,\r\n ExpandedState,\r\n PaginationState,\r\n RowSelectionState,\r\n SortingState,\r\n} from \"@tanstack/react-table\";\r\nimport { useState } from \"react\";\r\nimport { CraftTableOptionsProps } from \"../../types/table-options\";\r\nimport {\r\n FilterDataMainFilterEntityListProps,\r\n FilterDataProps,\r\n FilterMasterStateProps,\r\n FilterOperationListProps,\r\n FilterStateProps,\r\n} from \"../../types/filter\";\r\n\r\nexport function useCraftTable(paginationPageSize: number = 25) {\r\n const [pagination, setPagination] = useState<PaginationState>({\r\n pageIndex: 0,\r\n pageSize: paginationPageSize,\r\n });\r\n const [sorting, setSorting] = useState<SortingState>([]);\r\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({});\r\n const [expanded, setExpanded] = useState<ExpandedState>({});\r\n const [wrapColumns, setWrapColumns] = useState<Record<string, boolean>>({\r\n all_wrap: true,\r\n });\r\n\r\n // Filters to be rendered in form\r\n const [filters, setFilters] = useState<FilterStateProps[]>([]);\r\n // Saved filter Component - savedFilterEditValue is set on list click\r\n const [savedFilterEditValue, setSavedFilterEditValue] = useState<\r\n string | number\r\n >(\"\");\r\n const [filterToDelete, setFilterToDelete] =\r\n useState<FilterOperationListProps | null>(null);\r\n const [filterSelectedAttributeValue, setFilterSelectedAttributeValue] =\r\n useState<string>(\"\");\r\n\r\n const [filterMaster, setFilterMaster] =\r\n useState<FilterMasterStateProps | null>(null);\r\n\r\n const [showTableFilter, setShowTableFilter] = useState<boolean>(false);\r\n\r\n //For filter criteria paper\r\n const [showFilterOptions, setShowFilterOption] = useState<boolean>(false);\r\n const [filterData, setFilterData] = useState<FilterDataProps | null>(null);\r\n const [selectedFilterEntity, setSelectedFilterEntity] =\r\n useState<FilterDataMainFilterEntityListProps>();\r\n\r\n if (pagination.pageIndex < 0 || pagination.pageSize <= 0) {\r\n throw new Error(\r\n \"Invalid pagination values: pageIndex and pageSize must be positive.\"\r\n );\r\n }\r\n\r\n // For Default Column Pinning\r\n const [columnPinning, setColumnPinning] = useState<ColumnPinningState>({\r\n left: [],\r\n right: [],\r\n });\r\n\r\n const craftTableOptions: CraftTableOptionsProps = {\r\n sorting: sorting,\r\n setSorting: setSorting,\r\n pagination: pagination,\r\n setPagination: setPagination,\r\n rowSelection: rowSelection,\r\n setRowSelection: setRowSelection,\r\n expanded: expanded,\r\n setExpanded: setExpanded,\r\n wrapColumns: wrapColumns,\r\n setWrapColumns: setWrapColumns,\r\n filters: filters,\r\n setFilters: setFilters,\r\n savedFilterEditValue: savedFilterEditValue,\r\n setSavedFilterEditValue: setSavedFilterEditValue,\r\n filterToDelete: filterToDelete,\r\n setFilterToDelete: setFilterToDelete,\r\n filterSelectedAttributeValue: filterSelectedAttributeValue,\r\n setFilterSelectedAttributeValue: setFilterSelectedAttributeValue,\r\n filterMaster: filterMaster,\r\n setFilterMaster: setFilterMaster,\r\n showTableFilter: showTableFilter,\r\n setShowTableFilter: setShowTableFilter,\r\n showFilterOptions: showFilterOptions,\r\n setShowFilterOption: setShowFilterOption,\r\n columnPinning: columnPinning,\r\n setColumnPinning: setColumnPinning,\r\n filterData: filterData,\r\n setFilterData: setFilterData,\r\n selectedFilterEntity: selectedFilterEntity,\r\n setSelectedFilterEntity: setSelectedFilterEntity,\r\n };\r\n\r\n return craftTableOptions;\r\n}\r\n","import { useEffect, useState } from \"react\";\r\nimport { craftTableFilterSettingsOptionsProps } from \"../../types/table-options\";\r\nimport {\r\n ColumnTabConfigProps,\r\n KanbanSettingsDataProps,\r\n QuickTabConfigProps,\r\n SavedButtonErrorProps,\r\n SettingsDataProps,\r\n SortingConfigProps,\r\n} from \"../../types/filter-settings\";\r\n\r\nexport function useCraftTableFilterSettings() {\r\n //states for the quick filter layout\r\n const [showListViewSettings, setShowListViewSettings] =\r\n useState<boolean>(false);\r\n\r\n const [settingsData, setSettingsData] = useState<SettingsDataProps>({});\r\n const [kanbanSettingsData, setKanbanSettingsData] =\r\n useState<KanbanSettingsDataProps>({});\r\n\r\n // Quick FIlter settings local states\r\n\r\n const [quickTabStates, setQuickTabStates] = useState<QuickTabConfigProps>({});\r\n const [columnTabState, setColumnTabState] = useState<ColumnTabConfigProps>(\r\n {}\r\n );\r\n const [sortingTabState, setSortingTabState] = useState<SortingConfigProps>(\r\n {}\r\n );\r\n\r\n // This state will be used for settings validation\r\n const [saveButtonError, setSaveButtonError] = useState<SavedButtonErrorProps>(\r\n { hasError: false, messages: [] }\r\n );\r\n\r\n useEffect(() => {\r\n if (settingsData?.quick_tab) {\r\n setQuickTabStates(settingsData?.quick_tab);\r\n }\r\n if (settingsData?.column) {\r\n setColumnTabState(settingsData?.column);\r\n }\r\n if (settingsData?.sorting) {\r\n setSortingTabState(settingsData?.sorting);\r\n }\r\n }, [settingsData]);\r\n\r\n const craftTableFilterSettingsOptions: craftTableFilterSettingsOptionsProps =\r\n {\r\n settingsData: settingsData,\r\n setSettingsData: setSettingsData,\r\n kanbanSettingsData: kanbanSettingsData,\r\n setKanbanSettingsData: setKanbanSettingsData,\r\n showListViewSettings: showListViewSettings,\r\n setShowListViewSettings: setShowListViewSettings,\r\n quickTabStates: quickTabStates,\r\n setQuickTabStates: setQuickTabStates,\r\n columnTabState: columnTabState,\r\n setColumnTabState: setColumnTabState,\r\n sortingTabState: sortingTabState,\r\n setSortingTabState: setSortingTabState,\r\n saveButtonError: saveButtonError,\r\n setSaveButtonError: setSaveButtonError,\r\n };\r\n\r\n return craftTableFilterSettingsOptions;\r\n}\r\n"],"names":["styleInject","css","ref","insertAt","document","head","getElementsByTagName","style","createElement","type","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","UpArrow","_jsxs","jsxs","xmlns","viewBox","width","height","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","children","_jsx","jsx","x1","y1","x2","y2","points","DownArrow","TableFirstPageIcon","role","d","TableLastPageIcon","EditIcon","fillOpacity","DeleteIcon","HideColumnIcon","DragHandleIcon","className","transform","IconPinOutline","props","IconPinOffOutline","LoaderAnimation","cx","cy","r","attributeName","dur","values","repeatCount","begin","ChangeLayoutIcon","id","maskType","maskUnits","x","y","mask","CloseIcon","SearchIcon","SortingIcon","FilterationIcon","color","HideIcon","VisibilityIcon","VisibilityOffIcon","DragandDrogIcon","AddIcon","CheckBox","CrossBox","EyeIcon","ClosedEyeIcon","layoutIcons","Board","Table","Timeline","List","Calendar","Gallery","Charts","LayoutSelector","onSelect","selectedLayout","Box","sx","maxWidth","display","justifyContent","alignItems","px","py","backgroundColor","Typography","variant","fontWeight","fontSize","IconButton","onClick","Grid","container","spacing","p","Object","keys","map","layout","isSelected","size","ButtonBase","border","borderRadius","flexDirection","transition","boxShadow","mb","opacity","useFullscreenPopoverContainer","isFullscreen","setIsFullscreen","useState","fullscreenElement","setContainer","undefined","useEffect","handleFullscreenChange","el","addEventListener","removeEventListener","ViewMore","compactMode","onCompactToggle","onFullscreenToggle","tableStates","onClose","fullscreenContainer","wrapColumns","setWrapColumns","MUISwitch","Switch","checked","all_wrap","onChange","prev","Select","value","e","target","minWidth","MenuProps","disablePortal","PaperProps","zIndex","MenuItem","SortableItem","attributes","listeners","setNodeRef","useSortable","CSS","Transform","toString","gap","cursor","flexGrow","SortPopover","anchorEl","columns","sorts","setSorts","sensors","useSensors","useSensor","MouseSensor","TouchSensor","KeyboardSensor","handleChange","field","updated","item","triggerTableSortUpdate","sortItems","sortingPayload","desc","direction","Popover","open","Boolean","anchorOrigin","vertical","horizontal","margin","length","DndContext","collisionDetection","closestCenter","onDragEnd","event","active","over","oldIndex","findIndex","newIndex","arrayMove","SortableContext","items","s","strategy","verticalListSortingStrategy","sort","fullWidth","col","label","filter","handleRemove","Button","newSort","Date","now","startIcon","DraggableColumn","column","onToggle","isVisible","getIsVisible","columnDef","header","str","replace","char","toUpperCase","trim","ColumnToggle","table","columnOrder","setColumnOrder","allColumns","getAllLeafColumns","shownColumns","find","hiddenColumns","toggleVisibility","columnId","getColumn","activeCol","overCol","indexOf","forEach","fontStyle","customDebounce","func","delay","timerId","args","context","this","clearTimeout","setTimeout","apply","searchStyles","showSearchInput","marginRight","paddingRight","paddingLeft","TableSearch","setShowSearchInput","localValue","setLocalValue","searchContainerRef","useRef","debouncedOnChange","useCallback","newValue","handler","handleClickOutside","current","contains","useOutsideClick","position","TextField","placeholder","onKeyDown","key","InputProps","startAdornment","InputAdornment","querySelector","focus","edge","endAdornment","CloseRoundedIcon","Topbar","isCompactTable","fullscreenToggle","setIsCompactTable","paginationComponent","topbarOptions","onFilterButtonClick","sortAnchorEl","setSortAnchorEl","groupBy","setGroupBy","layoutAnchorEl","setLayoutAnchorEl","setSelectedLayout","columnAnchorEl","setColumnAnchorEl","setViewMoreAnchorEl","leftSideComponent","rightSideComponent","showColumnToggle","showChangeLayoutToggle","showSortingToggle","showFilterToggle","showSearch","searchValue","onSearchChange","handleExternalLayoutTrigger","detail","handleExternalFilterTrigger","handleExternalViewMoreTrigger","handleExternalSearchTrigger","window","viewMoreAnchorEl","isViewMoreOpen","overflowX","whiteSpace","title","customEvent","CustomEvent","dispatchEvent","_Fragment","currentTarget","mt","meta","sortingRules","setSorting","showTableFilter","filters","top","right","transformOrigin","onGroupByChange","PaginationContainer","styled","theme","padding","typography","pxToRem","palette","common","white","breakpoints","down","GoToPageContainer","RowsPerPageContainer","RecordsRangeContainer","PageRangeContainer","PaginationButtons","PaginationButton","grey","action","disabled","RowsPerPageSelect","shape","GoToPageInput","InputBase","textAlign","divider","DefaultPagination","rowsPerPageArray","paginationOptions","pageIndex","getState","pagination","pageCount","getPageCount","pageSize","rowCount","getRowCount","recordsRangeFirst","recordsRangeLast","Math","min","isFullView","paginationView","mr","defaultValue","inputProps","name","max","page","Number","setPageIndex","setPageSize","getCanPreviousPage","previousPage","NavigateBeforeRounded","getCanNextPage","nextPage","NavigateNextRounded","getColumnPinningStyles","isPinned","getIsPinned","isLastLeftPinnedColumn","getIsLastColumn","isFirstRightPinnedColumn","getIsFirstColumn","background","left","getStart","getAfter","getSize","getColumnPinningStylesBody","environments","adm_dev","crm_dev","uat","axios","create","baseURL","timeout","headers","interceptors","request","use","config","token","localStorage","getItem","Authorization","error","Promise","reject","TableBodyRow","shouldForwardProp","prop","hoverable","selected","striped","paper","mode","hover","TableBodyCell","compact","isDragging","wrap","borderBottom","wordBreak","DragAlongCell","cell","align","Translate","getIsPlaceholder","flexRender","getContext","Checkbox","indeterminate","uuidv4","check","setCheck","React","isChecked","TableBody","featureOptions","NestedComponent","enableColumnReordering","enableRowSelection","getRowModel","rows","row","renderedRow","getIsSelected","expanded","getIsExpanded","getIsSomeSelected","getToggleSelectedHandler","getVisibleCells","horizontalListSortingStrategy","Fragment","renderRow","ColumnResizeHandle","isResizing","userSelect","touchAction","TableHeadButton","TableHeadSort","sortable","marginLeft","TableDndButton","TableHeadContent","TableHeadRoot","sticky","TableHeadRow","TableHeadCell","TableHeadPin","stopPropagation","pin","TableHeadPopover","onSaveSettings","dense","ListItemButton","toggleSorting","ListItemIcon","ListItemText","primary","handleUpdateSettings","toggleWrapForColumn","TableColumnResizeHandle","getIsResizing","onDoubleClick","resetSize","onMouseDown","getResizeHandler","onTouchStart","DraggableTableHeader","activeTab","enableColumnPinning","setAnchorEl","handleClose","onMouseLeave","colSpan","compactTable","minSize","maxSize","isPlaceholder","getCanSort","asc","getIsSorted","getCanResize","TableHead","filterSettingStates","stickyHeader","getHeaderGroups","headerGroup","getIsAllRowsSelected","getIsSomeRowsSelected","toggleAllRowsSelected","handleMenuToggle","TableDND","modifiers","restrictToHorizontalAxis","TableTabsRoot","Tabs","minHeight","tabsClasses","flexContainer","indicator","TableTab","Tab","maxHeight","textTransform","tabClasses","text","TableTabCount","lineHeight","ConfirmModal","description","buttons","input","inputValue","setInputValue","setError","Dialog","reason","DialogTitle","marginX","paddingBottom","component","DialogContent","marginBottom","marginTop","labelClassName","required","multiline","DialogActions","button","index","handleButtonClick","CustomTabPanel","hidden","CustomTabs","tabItems","activeFilterIndex","handleCrossClick","tabsProps","hoveredTab","setHoveredTab","tab","idx","isActive","isHovered","onMouseEnter","FormDropdown","control","setValue","dropdownList","isLoading","onValueChange","Controller","filter_attribute_name","filter_operator","render","FormControl","disableUnderline","newOperator","oldOperator","filter_attribute_data_type","moment","format","shouldDirty","filterStyles","scrollbarCustom","overflowY","pr","filterContainer","filterMainHeader","bgcolor","mx","filterMainComponentWrapper","filterFormStyles","formEditModeStyle","formFlexContainer","formListItem","formListSectionHeader","formListItemHeader","formListItemHeaderName","formListItemHeaderDropdown","CustomSearch","search","setSearch","val","borderColor","EmptyList","FilterCriteriaEntityList","filterComponentOptions","searchTerm","setSearchTerm","filterData","setSelectedFilterEntity","isSingleEntity","tabOptions","allEntities","mainFilter","entityList","data","entitiesToShow","useMemo","filterEntityTypes","f","filter_entity_type","entity","includes","toLowerCase","my","ListItem","handleSelectEntity","Loader","loaderText","paddingBlock","CircularProgress","FilterCriteriaList","handleAddFilter","selectedFilterEntity","shouldShowCloseButton","some","entityWiseCriteria","isPending","filteredEntities","isAlreadySelected","filter_attribute","attribute_key","TextFieldStyles","FormTextfield","filter_value","FormDatePicker","views","isRange","isRelativeToToday","isEmptyOperator","LocalizationProvider","dateAdapter","AdapterDateFns","toDate","todayDate","fromDate","Array","isArray","DatePicker","date","formatted","slotProps","textField","FormMultiSelect","dropdownData","isFlatJson","options","getOptionValue","cleanedValue","multiple","filtered","renderValue","match","join","optionValue","dateAllowedOperators","FilterCriteria","columnsData","onChangeFunction","FilterButton","main","dark","setFilters","showFilterOptions","setShowFilterOption","filterMaster","filterButtonRef","filterButtonWidth","setWidth","resizeObserver","ResizeObserver","clientWidth","observe","disconnect","useElementWidth","isSingleFilter","disableButton","ClickAwayListener","onClickAway","Paper","saved_filters","selectedId","attribute","operation_list","element_type","operationKey","elementType","getOperationKeyByElementType","matchingDropdownList","defaultOperator","newSelectedFilter","datasource_list","dropdown_list","filter_entity_name","newFilterState","FilterForm","handleRemoveFilter","editMode","onSaveFilterButtonClick","setDeleteFilterModalOpen","setFilterMaster","setPagination","showSaveButton","showClearAllButton","customButtons","filterName","selectedName","isOwner","is_owner","defaultValues","filterValues","reduce","acc","curr","operator","dummyChange","watch","reset","unregister","useForm","resetOptions","keepDirtyValues","keepErrors","formValues","debouncedUpdateFilters","updatedFilters","updateFiltersFromForm","filterValue","groupedFilters","push","handleRemoveEntityType","entityType","remainingFilters","onSubmit","preventDefault","inputRef","entries","overflow","reverse","dummy","fieldValue","dataType","resolveFilterInput","activeFilterTabIndex","btn","MainFilter","mainBoxStyles","newFilters","SavedFilterEditComponent","setEditMode","showBackButton","savedFilter","selectedCode","shareWithTeam","allowTeamEdit","BackArrow","SavedFilter","tabValue","setFilterToDelete","myFilters","saved_filter","code","is_shared","created_by","is_editable","sharedFilters","shared_filter","prefs","sharedPreferences","preferences","shared_meta","editModeFromTab","applyFilterStates","newFilterMaster","radio","handleListItemClick","handleApplyFilter","openAccordion","setOpenAccordion","toggleAccodion","accordion","Accordion","disableGutters","elevation","AccordionSummary","expandIcon","ExpandMoreIcon","Divider","AccordionDetails","scrollbarWidth","source","visibility","renderSharedFilters","AttributesFilter","selectedAttribute","currentRadio","handleSingleRadioSelect","selectedAttr","matchingColumn","column_list","updatedRadio","newFilter","exists","updatedFilterMaster","selectedAttributeOptions","attributeKey","newFilterMasterState","displayEmpty","option","FormControlLabel","Radio","deepMergeObjects","output","SingleFilterRendering","showFilter","commonProps","editProps","attributesProps","SavedFilterModalView","onSave","disableShareFilter","forceShowSharingControls","setShareWithTeam","setAllowTeamEdit","filterNameValue","discriptionValue","isSaveDisabled","selectedFilterId","filterId","filterObj1","filterObj","initialShare","initialAllow","persistPreferences","sharedValue","editableValue","selectedFilter","selectedSavedFilter","String","showPrefields","showCheckboxes","isshow","getModalTitle","pt","minRows","_","nextAllow","gridTemplateColumns","created_date","toLocaleString","readOnly","CalendarTodayIcon","modified_date","modified_by","verticalTabStyles","mainTabsContainer","mainTabContainer","mainTabLabel","horizontalTabStyles","CustomVerticalTabs","orientation","DraggableListItem","containerId","DragIndicator","dialogStyles","dialogTitle","dialogContent","paddingTop","dialogActionsButton","listingValuesStyles","wrapper","heading","draggableContainer","draggableCover","headerContainer","TabsStyles","mainTabsHeader","mainTabDropdown","mainTabSelect","selectDropdownSeparator","checkboxStyle","ListingValuesContent","onItemToggle","flex","ListingValues","filteredValues","buttonText","headerText","tabsApiDataLoading","enableDragAndDrop","AlertComponenet","useDroppable","InfoAlert","message","Alert","severity","QuickTab","tabsApiData","columnTabAttributes","settingsData","setSettingsData","saveButtonError","setSaveButtonError","columnTabState","sortingTabState","currentQuickAttribute","setCurrentQuickAttribute","quick_tab","quickTabStates","mappedColumns","normalizeTabItem","sorting","normalizedTabs","hide_list","show_list","showList","isValidShowList","ERROR_CODE","messages","showListValues","hideListValues","i","constructHideList","filteredListValues","handleItemToggle","fromContainerId","toShowList","toHideList","updatedColumn","updatedSorting","splice","isDefault","tabs","t","tab_name","sortby","updatedTabs","updatedSortingTabs","enableDND","currentContainer","overContainer","newShowList","newHideList","removed","sortingExists","columnExists","a","b","sort_by","currentShowList","currentHideList","availableSlots","limitedHideList","slice","updatedQuickTab","isAllSelected","isCombineOther","selectedTabStyle","CustomToggleSwitchButton","ToggleButtonGroup","exclusive","ToggleButton","isDisabled","SETTINGS_TABS","KANBAN_SETTINGS_TABS","TOGGLE_BUTTON_TABS","ColumnTab","columnTabAttributesLoading","selectedTabIndex","setSelectedTabIndex","settingsColumnState","isColumnDefault","isStateEmpty","isDefaultEmpty","isTabWiseEmpty","mappedTabs","hasOtherMessages","hasError","hideList","currentTab","getCurrentLists","visible","moved","hasShowListQuickTabs","activeItem","list","Sorting","setActiveTab","isSortingDefault","emptySortBy","order","generatedTabs","PointerSensor","activeTabIndex","tabSortedList","updateSortList","handleDNDDropdownChange","showAddSortButton","stateLength","isAddSortDisabled","hasEmptyColumn","reordered","columnKey","CustomDialog","DialogTransition","forwardRef","Slide","CustomButton","customSx","Lane","selectAttributeData","laneHideListData","kanbanSettingsData","setKanbanSettingsData","currentLaneAttribute","setCurrentLaneAttribute","lane","console","log","swim_lane","isWorkflowAttribute","isSourceAttribute","displaySortingValue","isSubLane","SwimLane","selectSwinLandData","swimLaneHideListData","currentSwimLaneAttribute","setCurrentSwimLaneAttribute","isStatusAttribute","kanbanStyles","syncingStyle","topHeader","laneHeader","badge","swimlaneWrapperStyle","columnStyle","stageStyle","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","subSectionAccordion","subSectionCountContainer","cardsContainer","settingStyle","swimLaneAccordionStyle","subSectionHeaderContainer","COLOR_CONSTANTS","darkColor","onDeleteFilter","onSaveFilter","onUpdateFilter","setTabValue","saveFilterModalOpen","setSaveFilterModalOpen","savedFilterModalOpen","setSavedFilterModalOpen","deleteFilterModalOpen","filterToDelete","finalComponentOptions","showMainHeader","mainHeaderTitle","showTabs","showMainFilter","showSavedFilter","showAttributesFilter","editModeFromTabOptions","tabMapping","filterNameInput","hasSavedFilterRecords","handleSaveFilterButtonClick","savedFilterProps","tabType","clearAttributeRadio","patches","isRuleEngine","recordFilterComponentProps","edit","save","secondary","isSingleSavedFilterEditMode","delete","hasSavedFilters","view","show","columnsDataLoading","quickTabAttributes","quickTabAttributesLoading","sortingTabAttributes","sortingTabAttributesLoading","onSaveSettingsData","onSaveKanbanSettingsData","showListViewSettings","hasAPIData","slots","Column","GroupBy","copyColumnTabState","copySortingTabState","loading","tabsData","count","settingsOptions","defaultTab","selectedTab","showIcon","SettingsOutlined","scrollButtons","padStart","metaData","KanbanCardComponent","showSettings","onOpenSettings","expandedPanels","setExpandedPanels","Active","subLaneExpanded","setSubLaneExpanded","swim_lanes","initial","sub_lanes","sub_lane","lane_id","getLeadCount","laneId","seenLeadIds","Set","swimLane","subLane","lead","stage_id","has","add","SettingsOutlinedIcon","lanes","panel","isExpanded","ArrowDropDownIcon","ml","lead_status_id","pl","sub_section","subLaneKey","toggleSubLane","subLaneId","borderLeft","stage_group_id","card","cardData","nestedComponent","loadingOptions","customRenderFn","shouldHideColumn","emptyListComponent","filterOptions","Error","metaColumns","setMetaColumns","updatedColumns","accessorKey","ctx","propName","customFn","getValue","where","defaultPinned","columnPinning","c","tableRef","craftPaginationOptions","showPagination","paginationPosition","totalRows","craftTopbarOptions","showCompactTableToggle","viewMoreToggle","craftFeatureOptions","enableTopbar","enableSorting","enableServerSidePagination","enableServerSideSorting","enableColumnResizing","enableMultiColumnSorting","enableWordBreakAll","rowSelection","setRowSelection","setExpanded","useReactTable","state","getCoreRowModel","onSortingChange","getSortedRowModel","manualSorting","getPaginationRowModel","onPaginationChange","manualPagination","onRowSelectionChange","columnResizeDirection","columnResizeMode","onColumnOrderChange","getExpandedRowModel","onExpandedChange","getSubRows","subRows","loadingComponent","showFilterCondition","exitFullscreen","requestFullscreen","catch","err","paginationPageSize","savedFilterEditValue","setSavedFilterEditValue","filterSelectedAttributeValue","setFilterSelectedAttributeValue","setShowTableFilter","setFilterData","setColumnPinning","setShowListViewSettings","setQuickTabStates","setColumnTabState","setSortingTabState"],"mappings":"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","x_google_ignoreList":[0]}
|