rez-table-listing-mui 1.3.27 → 1.3.29

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","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/useOutsideClick.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/components/topbar/index.tsx","../src/listing/components/pagination/default/index.tsx","../src/listing/libs/utils/common.ts","../src/listing/components/table-body-dnd-cell.tsx","../src/listing/components/inputs/checkbox/index.tsx","../src/listing/components/table-body.tsx","../src/listing/components/table-head-pin.tsx","../src/listing/components/table-head-popover.tsx","../src/listing/components/table-head-dnd-cell.tsx","../src/listing/components/table-head.tsx","../src/listing/components/table.tsx","../src/listing/components/table-dnd.tsx","../src/listing/components/index-table.tsx","../src/listing/libs/hooks/useCraftTable.tsx","../src/listing/libs/hooks/useCraftTableFilterSettings.tsx","../src/listing/components/tabs/styles.ts","../src/listing/components/tabs/index.tsx","../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/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/Dropdown.tsx","../src/listing/components/filter/components/forms/components/Multi-Select.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/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/filter/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/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/constants.ts","../src/listing/components/table-settings/components/lane.tsx","../src/listing/components/table-settings/components/group-by.tsx","../src/listing/components/table-settings/index.tsx","../src/kanban/styles/styles.tsx","../src/kanban/constants/kanban-constants.ts","../src/kanban/index.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 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 { 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 };\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}\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_value: string | null;\r\n tab_value_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}\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={{\r\n display: \"flex\",\r\n position: \"relative\",\r\n top: \"10px\",\r\n }}\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: \"14px\" }}\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: \"14px\" }}\r\n edge=\"end\"\r\n >\r\n <CloseRoundedIcon\r\n fontSize=\"small\"\r\n sx={{ color: \"black\", fontSize: \"14px\" }}\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, { 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 { Popover } from \"@mui/material\";\r\nimport LayoutSelector from \"../table-change-layout.tsx\";\r\nimport useOutsideClick from \"../../libs/hooks/useOutsideClick.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 [showColumnHiding, setShowColumnHiding] = useState(false);\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 { setShowTableFilter } = tableStates;\r\n\r\n // search\r\n const [showSearchInput, setShowSearchInput] = useState(false);\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 setShowColumnHiding(false);\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 dropdownRef = useRef<HTMLDivElement>(null);\r\n useOutsideClick({\r\n ref: dropdownRef,\r\n handler: () => setShowColumnHiding(false),\r\n });\r\n\r\n const handleLayoutSelect = (layout: string) => {\r\n setSelectedLayout(layout);\r\n setLayoutAnchorEl(null);\r\n };\r\n\r\n useOutsideClick({\r\n ref: searchContainerRef,\r\n handler: () => setShowSearchInput(false),\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 setShowSearchInput(true);\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 {showSearch && (\r\n <div\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 </div>\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(\"triggerLayoutPopover\", {\r\n detail: { target: e.currentTarget },\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 && !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 </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default Topbar;\r\n","import { Table } from \"@tanstack/react-table\";\r\nimport {\r\n TableFirstPageIcon,\r\n TableLastPageIcon,\r\n // TableNextPageIcon,\r\n // TablePreviousPageIcon,\r\n} from \"../../../../assets/svg\";\r\nimport TablePreviousPageIcon from \"@mui/icons-material/NavigateBeforeRounded\";\r\nimport TableNextPageIcon from \"@mui/icons-material/NavigateNextRounded\";\r\nimport \"./index.scss\";\r\nimport { CraftTablePaginationProps } from \"../../../types/table\";\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 const recordsRangeFirst = pageIndex * pageSize - pageSize + 1;\r\n const recordsRangeLast = Math.min(pageIndex * pageSize, rowCount);\r\n\r\n return (\r\n <div className=\"pagination_container\">\r\n {paginationOptions?.paginationView === \"full\" ? (\r\n <>\r\n <span className=\"go_to_page_container\">\r\n &nbsp;&nbsp;Go to page&nbsp;:&nbsp;\r\n <input\r\n type=\"number\"\r\n defaultValue={pageIndex}\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 style={{ width: \"60px\", textAlign: \"center\" }}\r\n min={1}\r\n max={table?.getPageCount()}\r\n />\r\n &nbsp;\r\n </span>\r\n\r\n <div className=\"rows_per_page_container\">\r\n <span>Rows Per Page&nbsp;:&nbsp;</span>\r\n <select\r\n value={table.getState().pagination.pageSize}\r\n onChange={(e) => {\r\n table.setPageSize(Number(e.target.value));\r\n }}\r\n >\r\n {rowsPerPageArray.map((pageSize) => (\r\n <option key={pageSize} value={pageSize}>\r\n {pageSize}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div className=\"records_range_container\">\r\n <span>Showing&nbsp;</span>\r\n <strong>\r\n {recordsRangeFirst} - {recordsRangeLast} of {rowCount}\r\n </strong>\r\n </div>\r\n\r\n <span className=\"page_range_container\">\r\n <span>&nbsp;Page&nbsp;</span>\r\n <strong>\r\n {pageIndex} of {pageCount}\r\n &nbsp;\r\n </strong>\r\n </span>\r\n\r\n <div className=\"pagination_btn_container\">\r\n <button\r\n title=\"First Page\"\r\n className=\"pagination_btn\"\r\n disabled={!table.getCanPreviousPage()}\r\n onClick={() => table.setPageIndex(0)}\r\n >\r\n <TableFirstPageIcon />\r\n </button>\r\n <button\r\n title=\"Previous Page\"\r\n className=\"pagination_btn\"\r\n disabled={!table.getCanPreviousPage()}\r\n onClick={() => table.previousPage()}\r\n >\r\n <TablePreviousPageIcon fontSize=\"small\" />\r\n </button>\r\n <button\r\n title=\"Next Page\"\r\n className=\"pagination_btn\"\r\n disabled={!table.getCanNextPage()}\r\n onClick={() => table.nextPage()}\r\n >\r\n <TableNextPageIcon />\r\n </button>\r\n <button\r\n title=\"Last Page\"\r\n className=\"pagination_btn\"\r\n disabled={!table.getCanNextPage()}\r\n onClick={() => table.setPageIndex(pageCount - 1)}\r\n >\r\n <TableLastPageIcon />\r\n </button>\r\n </div>\r\n </>\r\n ) : (\r\n <>\r\n <div className=\"rows_per_page_container\">\r\n {/* <span>Rows Per Page&nbsp;:&nbsp;</span> */}\r\n <select\r\n value={table.getState().pagination.pageSize}\r\n onChange={(e) => {\r\n table.setPageSize(Number(e.target.value));\r\n }}\r\n >\r\n {rowsPerPageArray.map((pageSize) => (\r\n <option key={pageSize} value={pageSize}>\r\n {pageSize}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div className=\"records_range_container\">\r\n {/* <span>Showing&nbsp;</span> */}\r\n <strong>\r\n {recordsRangeFirst} - {recordsRangeLast} of {rowCount}\r\n </strong>\r\n </div>\r\n\r\n <div className=\"pagination_btn_container\">\r\n <button\r\n title=\"Previous Page\"\r\n className=\"pagination_btn\"\r\n disabled={!table.getCanPreviousPage()}\r\n onClick={() => table.previousPage()}\r\n >\r\n <TablePreviousPageIcon />\r\n </button>\r\n <button\r\n title=\"Next Page\"\r\n className=\"pagination_btn\"\r\n disabled={!table.getCanNextPage()}\r\n onClick={() => table.nextPage()}\r\n >\r\n <TableNextPageIcon />\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n </div>\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 = \"uat\";\r\nexport const ENTITY_TYPE = \"LEAD\";\r\nexport const MAPPED_ENTITY_TYPE = \"LYPR\"; // LAP OR LYPR\r\n\r\nconst environments = {\r\n adm_dev: \"http://localhost:4010/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","import { useSortable } from \"@dnd-kit/sortable\";\r\nimport { CSS } from \"@dnd-kit/utilities\";\r\nimport { Cell, flexRender } from \"@tanstack/react-table\";\r\nimport { CSSProperties } from \"react\";\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\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 const style: CSSProperties = {\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 };\r\n\r\n return (\r\n <td\r\n ref={setNodeRef}\r\n {...{\r\n style: {\r\n ...style,\r\n zIndex: isPinned ? 2 : isDragging ? 1 : 0,\r\n },\r\n align: (cell.column.columnDef.meta as align)?.align || \"left\",\r\n className: \"ts__body__td\",\r\n }}\r\n >\r\n {cell.getIsPlaceholder()\r\n ? null\r\n : flexRender(cell.column.columnDef.cell, cell.getContext())}\r\n </td>\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\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 <tr key={row.id} className=\"ts__body__tr\">\r\n {enableRowSelection && (\r\n <td\r\n className=\"ts__body__td ts__body__checkbox\"\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 </td>\r\n )}\r\n\r\n {row?.getVisibleCells()?.map((cell) => {\r\n const tdProps = {\r\n className: \"ts__body__td\",\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 } as React.CSSProperties,\r\n align: (cell.column.columnDef.meta as align)?.align || \"left\",\r\n };\r\n\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 <td key={cell?.id} {...tdProps}>\r\n {flexRender(cell?.column?.columnDef?.cell, cell?.getContext())}\r\n </td>\r\n );\r\n })}\r\n </tr>\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 <tr>\r\n {/* <td colSpan={table.getAllLeafColumns().length}>//commented out to remove extra line on opening of \r\n {NestedComponent && <NestedComponent {...{ row }} />}\r\n </td> */}\r\n {<NestedComponent {...{ row }} />}\r\n </tr>\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 className=\"ts__body\">\r\n {table?.getRowModel()?.rows?.map((row) => renderRow(row))}\r\n </tbody>\r\n );\r\n}\r\n\r\nexport default TableBody;\r\n","import { IconPinOffOutline } from \"../../assets/svg\";\r\nimport { TableHeaderProps } from \"../types/table\";\r\n\r\nfunction TableHeadPin<T>({ header }: TableHeaderProps<T>) {\r\n return header.column.getIsPinned() !== \"left\" ? (\r\n <div className=\"ts--head--button\" onClick={() => header.column.pin(\"left\")}>\r\n {/* <IconPinOutline /> */}\r\n </div>\r\n ) : (\r\n <div\r\n className=\"ts--head--button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n header.column.pin(false);\r\n }}\r\n >\r\n <IconPinOffOutline />\r\n </div>\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 { CraftTableOptionsProps } from \"../types/table-options\";\r\nimport { useFullscreenPopoverContainer } from \"../libs/hooks/useFullScreen\";\r\n\r\ntype Props<T> = {\r\n anchorEl: HTMLElement | null;\r\n onClose: () => void;\r\n header: Header<T, unknown>;\r\n tableStates: CraftTableOptionsProps;\r\n};\r\n\r\nfunction TableHeadPopover<T>({\r\n anchorEl,\r\n onClose,\r\n header,\r\n tableStates,\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\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\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={() => column.toggleVisibility()}>\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 { flexRender } from \"@tanstack/react-table\";\r\nimport { useSortable } from \"@dnd-kit/sortable\";\r\nimport { CSSProperties, useState } from \"react\";\r\nimport { CSS } from \"@dnd-kit/utilities\";\r\nimport { DownArrow, DragHandleIcon, UpArrow } from \"../../assets/svg\";\r\nimport {\r\n getColumnAlignment,\r\n getColumnPinningStyles,\r\n} from \"../libs/utils/common\";\r\nimport { align } from \"../types/common\";\r\nimport { TableHeaderProps } from \"../types/table\";\r\nimport TableHeadPin from \"./table-head-pin\";\r\nimport TableHeadPopover from \"./table-head-popover\";\r\n\r\nfunction DraggableTableHeader<T>({\r\n header,\r\n featureOptions,\r\n tableStates,\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 handleHover = (event: React.MouseEvent<HTMLElement>) => {\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 const styles: CSSProperties = {\r\n opacity: isDragging ? 0.8 : 1,\r\n position: \"relative\",\r\n transform: CSS.Translate.toString(transform),\r\n transition: \"width transform 0.2s ease-in-out\",\r\n width: header.column.getSize(),\r\n minWidth: `${header.column.columnDef.minSize ?? 180}px`,\r\n maxWidth: `${header.column.columnDef.maxSize}px`,\r\n };\r\n\r\n let sortProps: {\r\n className: string;\r\n title?: string;\r\n style?: CSSProperties;\r\n } = {\r\n className: \"ts__content\",\r\n // style: {\r\n // justifyContent: getColumnAlignment(\r\n // (header?.column?.columnDef?.meta as align)?.align\r\n // ),\r\n // },\r\n };\r\n\r\n // if (header.column.getCanSort()) {\r\n // sortProps = {\r\n // ...sortProps,\r\n // title:\r\n // header.column.getNextSortingOrder() === \"asc\"\r\n // ? \"Sort ascending\"\r\n // : header.column.getNextSortingOrder() === \"desc\"\r\n // ? \"Sort descending\"\r\n // : \"Clear sort\",\r\n // };\r\n // }\r\n\r\n return (\r\n <th\r\n onMouseLeave={handleClose}\r\n key={header?.id}\r\n className=\"ts__head__th\"\r\n colSpan={header.colSpan}\r\n onClick={handleHover}\r\n style={{\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 ...styles,\r\n ...getColumnPinningStyles(header.column),\r\n zIndex: isPinned ? 3 : isDragging ? 1 : 0,\r\n }}\r\n >\r\n {header.isPlaceholder ? null : (\r\n <div {...sortProps}>\r\n <div\r\n className={`${\r\n header.column.getCanSort() ? \"ts__content__sort\" : \"\"\r\n }`.trim()}\r\n // onClick={header.column.getToggleSortingHandler()}\r\n >\r\n {flexRender(header.column.columnDef.header, header.getContext())}\r\n\r\n {{\r\n asc: <UpArrow />,\r\n desc: <DownArrow />,\r\n }[header.column.getIsSorted() as \"asc\" | \"desc\"] ?? null}\r\n </div>\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 <div {...attributes} {...listeners} className=\"ts__dnd__button\">\r\n <DragHandleIcon />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* column resizing */}\r\n {header.column.getCanResize() ? (\r\n <div\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 ) : null}\r\n\r\n {/* Popover */}\r\n <TableHeadPopover\r\n anchorEl={anchorEl}\r\n onClose={handleClose}\r\n header={header}\r\n tableStates={tableStates}\r\n />\r\n </th>\r\n );\r\n}\r\n\r\nexport default DraggableTableHeader;\r\n","import { ColumnOrderState, flexRender, Table } from \"@tanstack/react-table\";\r\nimport {\r\n CraftTableFeatureProps,\r\n CraftTableOptionsProps,\r\n} from \"../types/table-options\";\r\nimport { DownArrow, UpArrow } from \"../../assets/svg\";\r\nimport { CSSProperties, 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\n\r\ninterface TableHeadProps<T> {\r\n table: Table<T>;\r\n featureOptions: CraftTableFeatureProps;\r\n columnOrder: ColumnOrderState;\r\n tableStates: CraftTableOptionsProps;\r\n}\r\n\r\nfunction TableHead<T>({\r\n table,\r\n featureOptions,\r\n columnOrder,\r\n tableStates,\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 handleHover = (event: React.MouseEvent<HTMLElement>) => {\r\n setAnchorEl((prev) => (prev ? null : event.currentTarget));\r\n };\r\n\r\n return (\r\n <thead className={`ts__head ${stickyHeader ? \"ts--sticky\" : \"\"}`.trim()}>\r\n {table.getHeaderGroups().map((headerGroup) => (\r\n <tr className=\"ts__head__tr\" key={headerGroup?.id}>\r\n {enableRowSelection && (\r\n <th\r\n className=\"ts__head__th ts__head__checkbox\"\r\n style={{\r\n position: \"sticky\",\r\n left: 0,\r\n width: \"50px\",\r\n }}\r\n >\r\n <div className=\"ts__content\">\r\n <Checkbox\r\n checked={table.getIsAllRowsSelected()}\r\n indeterminate={table.getIsSomeRowsSelected()}\r\n onChange={() => table.toggleAllRowsSelected()}\r\n />\r\n </div>\r\n </th>\r\n )}\r\n\r\n {headerGroup.headers.map((header) => {\r\n let sortProps: {\r\n className: string;\r\n title?: string;\r\n style?: CSSProperties;\r\n } = {\r\n className: \"ts__content\",\r\n // style: {\r\n // justifyContent: getColumnAlignment(\r\n // (header?.column?.columnDef?.meta as align)?.align\r\n // ),\r\n // },\r\n };\r\n\r\n // if (header.column.getCanSort()) {\r\n // sortProps = {\r\n // ...sortProps,\r\n // title:\r\n // header.column.getNextSortingOrder() === \"asc\"\r\n // ? \"Sort ascending\"\r\n // : header.column.getNextSortingOrder() === \"desc\"\r\n // ? \"Sort descending\"\r\n // : \"Clear sort\",\r\n // };\r\n // }\r\n\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 featureOptions={featureOptions}\r\n tableStates={tableStates}\r\n />\r\n </SortableContext>\r\n ) : (\r\n <th\r\n key={header?.id}\r\n className=\"ts__head__th\"\r\n colSpan={header.colSpan}\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 onClick={handleHover}\r\n >\r\n {header.isPlaceholder ? null : (\r\n <div {...sortProps}>\r\n <div\r\n className={`${\r\n header.column.getCanSort() ? \"ts__content__sort\" : \"\"\r\n }`.trim()}\r\n // onClick={header.column.getToggleSortingHandler()}\r\n >\r\n {flexRender(\r\n header.column.columnDef.header,\r\n header.getContext()\r\n )}\r\n\r\n {{\r\n asc: <UpArrow />,\r\n desc: <DownArrow />,\r\n }[header.column.getIsSorted() as \"asc\" | \"desc\"] ?? null}\r\n </div>\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 </div>\r\n )}\r\n\r\n {/* column resizing */}\r\n {header.column.getCanResize() ? (\r\n <div\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 ) : 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 </th>\r\n );\r\n })}\r\n </tr>\r\n ))}\r\n </thead>\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\";\r\nimport TableHead from \"./table-head\";\r\n\r\nfunction Table<T>({\r\n table,\r\n featureOptions,\r\n NestedComponent,\r\n columnOrder,\r\n isCompactTable,\r\n tableStates,\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 featureOptions={featureOptions}\r\n columnOrder={columnOrder}\r\n tableStates={tableStates}\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 featureOptions,\r\n NestedComponent,\r\n columnOrder,\r\n setColumnOrder,\r\n isCompactTable,\r\n tableStates,\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 featureOptions={featureOptions}\r\n NestedComponent={NestedComponent}\r\n columnOrder={columnOrder}\r\n setColumnOrder={setColumnOrder}\r\n isCompactTable={isCompactTable}\r\n tableStates={tableStates}\r\n />\r\n </DndContext>\r\n );\r\n}\r\n\r\nexport default TableDND;\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 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}: 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 columnOrder={columnOrder}\r\n featureOptions={craftFeatureOptions}\r\n NestedComponent={nestedComponent}\r\n setColumnOrder={setColumnOrder}\r\n isCompactTable={isCompactTable}\r\n tableStates={tableStates}\r\n />\r\n ) : (\r\n <Table\r\n table={table}\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 />\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","import { SxProps, Theme } from \"@mui/material\";\r\n\r\ninterface TabStylesProps {\r\n tabs: SxProps<Theme>;\r\n tab: SxProps<Theme>;\r\n tabCount: SxProps<Theme>;\r\n}\r\n\r\nexport const tableTabsStyles: TabStylesProps = {\r\n tabs: {\r\n minHeight: \"38px\",\r\n },\r\n\r\n tab: {\r\n color: \"#888888\",\r\n padding: \"8px 12px\",\r\n minHeight: \"38px\",\r\n textTransform: \"none\",\r\n minWidth: \"unset\",\r\n whiteSpace: \"nowrap\",\r\n\r\n \"&.Mui-selected\": {\r\n color: \"#0e0c0b\",\r\n fontWeight: 700,\r\n },\r\n },\r\n\r\n tabCount: {\r\n padding: \"2px 3px\",\r\n borderRadius: \"6px\",\r\n border: \"1px solid #0E0C0BE6\",\r\n color: \"#0E0C0B\",\r\n },\r\n};\r\n","import \"./index.scss\";\r\nimport { Box, CircularProgress, IconButton, Tab, Tabs } from \"@mui/material\";\r\nimport { CraftTableOptionsProps } from \"../../types/table-options\";\r\nimport SettingsOutlinedIcon from \"@mui/icons-material/SettingsOutlined\";\r\nimport { settingsOptionsProps } from \"../../types/table\";\r\nimport { tableTabsStyles } from \"./styles\";\r\nimport { useMemo } from \"react\";\r\nimport { SettingIcon } from \"../../../assets/svg\";\r\n\r\ninterface TabDataProps {\r\n tab_value: string | null;\r\n tab_value_count: string | number;\r\n}\r\n\r\ninterface TableTabsProps {\r\n loading?: boolean;\r\n tabsData?: TabDataProps[];\r\n activeTab?: string;\r\n tableStates: CraftTableOptionsProps;\r\n onClick: (state: string) => void;\r\n columns?: any[];\r\n settingsOptions?: settingsOptionsProps;\r\n}\r\n\r\nexport function TableTabs({\r\n loading = false,\r\n tabsData = [],\r\n activeTab = \"All\",\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) => ({ ...prev, pageIndex: 0 }));\r\n };\r\n\r\n // Normalize tab_value to uppercase for display + logic\r\n const normalizedTabs = useMemo(() => {\r\n return tabsData\r\n ?.filter((tab) => tab.tab_value !== null)\r\n ?.map((tab) => ({\r\n ...tab,\r\n tab_value: tab.tab_value,\r\n }));\r\n }, [tabsData]);\r\n\r\n const defaultTab = useMemo(() => {\r\n return (\r\n normalizedTabs.find((t) => t.tab_value === \"All\")?.tab_value ||\r\n normalizedTabs[0]?.tab_value ||\r\n \"\"\r\n );\r\n }, [normalizedTabs]);\r\n\r\n const selectedTab = activeTab || defaultTab;\r\n\r\n return (\r\n <Box display=\"flex\" alignItems=\"center\" justifyContent=\"flex-start\">\r\n {/* Layout settings icon */}\r\n {settingsOptions?.showIcon && (\r\n <IconButton\r\n onClick={settingsOptions?.onClick}\r\n sx={{ zIndex: 1000, mx: 0 }}\r\n >\r\n <SettingIcon />\r\n </IconButton>\r\n )}\r\n\r\n {/* Tabs */}\r\n <Tabs\r\n value={selectedTab}\r\n onChange={(_, newValue) => handleTabClick(newValue)}\r\n variant=\"scrollable\"\r\n scrollButtons=\"auto\"\r\n slotProps={{ indicator: { sx: { display: \"none\" } } }}\r\n sx={tableTabsStyles.tabs}\r\n >\r\n {normalizedTabs.map(({ tab_value, tab_value_count }) => {\r\n const isSelected = activeTab === tab_value;\r\n\r\n return (\r\n <Tab\r\n key={tab_value}\r\n value={tab_value}\r\n label={\r\n <Box display=\"flex\" alignItems=\"center\" gap={1}>\r\n <Box>{tab_value}</Box>\r\n <Box\r\n sx={{\r\n ...tableTabsStyles.tabCount,\r\n ...(isSelected && {\r\n // backgroundColor: \"#ced3da\",\r\n // borderColor: \"#ced3da\",\r\n backgroundColor: \"#000\",\r\n color: \"#fff\",\r\n fontWeight: \"500\",\r\n }),\r\n }}\r\n >\r\n {tab_value_count == 0\r\n ? \"0\"\r\n : String(tab_value_count).padStart(2, \"0\")}\r\n </Box>\r\n </Box>\r\n }\r\n sx={tableTabsStyles.tab}\r\n />\r\n );\r\n })}\r\n </Tabs>\r\n </Box>\r\n );\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","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 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 } 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\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 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 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 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 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","// !! 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 { 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}: {\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}) => {\r\n const options = dropdownData[filter.filter_attribute] || [];\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 return filtered\r\n .map(\r\n (val) =>\r\n options.find((item) => item.value === val)?.label || val\r\n )\r\n .join(\", \");\r\n }}\r\n >\r\n {options?.map((item, idx) => (\r\n <MenuItem key={idx} value={item.value}>\r\n <Checkbox\r\n checked={cleanedValue.includes(item.value)}\r\n sx={{ marginRight: 1 }}\r\n />\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\n\r\nexport default FormMultiSelect;\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 >\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 >\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 = columnsData?.operation_list[attribute?.data_type];\r\n\r\n const defaultValue = attribute.data_type === \"multiselect\" ? [] : \"\";\r\n\r\n const defaultOperator = dropdownOptions?.[0]?.value || \"\";\r\n\r\n const matchingDropdownList =\r\n columnsData?.operation_list[attribute.data_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?.data_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: `calc(100vh - 440px)`,\r\n overflowY: \"auto\",\r\n width: \"100%\",\r\n ...filterStyles.scrollbarCustom,\r\n }}\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\n// import { CloseIcon, DeleteIcon } from \"../../../../../assets/svg\";\r\n// import {\r\n// FilterColumnsDataProps,\r\n// FilterComponentOptions,\r\n// FilterDropdownDataProps,\r\n// FilterMasterStateProps,\r\n// FilterStateProps,\r\n// } from \"../../../../types/filter\";\r\n// import { Controller, useForm } from \"react-hook-form\";\r\n// import React, { useEffect, useMemo, useCallback } from \"react\";\r\n// import FormDropdown from \"./components/Dropdown\";\r\n// import { CraftTableOptionsProps } from \"../../../../types/table-options\";\r\n// import FilterCriteria from \"./components/Filter-criteria\";\r\n// import CustomSearch from \"../search\";\r\n// import { customDebounce } from \"../../../../libs/utils/debounce\";\r\n// import { filterFormStyles } from \"../../style\";\r\n// import { onFilterChangeFunctionProps } from \"../../../../types/common\";\r\n// import { resolveFilterInput } from \"./utils/filter-date-input-resolver\";\r\n\r\n// interface 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\n// const 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// setSavedFilterModalOpen,\r\n// setDeleteFilterModalOpen,\r\n// onChangeFunction,\r\n// filterComponentOptions,\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// setSavedFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;\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 { 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\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// <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// </Box>\r\n// )}\r\n\r\n// <Box\r\n// className=\"filter-criteria-form\"\r\n// sx={filterFormStyles.formFlexContainer}\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// });\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// setSavedFilterModalOpen && setSavedFilterModalOpen(true);\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\n// export default FilterForm;\r\n\r\n// !! PLEASE DO NOT DELETE THIS COMMENT BLOCK !!\r\nimport {\r\n Box,\r\n Button,\r\n FormControl,\r\n IconButton,\r\n TextField,\r\n Typography,\r\n} 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 FormTextfield from \"./components/Textfield\";\r\nimport React, { useEffect, useMemo, useCallback } from \"react\";\r\nimport FormDatePicker from \"./components/Date\";\r\nimport FormDropdown from \"./components/Dropdown\";\r\nimport FormMultiSelect from \"./components/Multi-Select\";\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\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 setSavedFilterModalOpen,\r\n setDeleteFilterModalOpen,\r\n onChangeFunction,\r\n filterComponentOptions,\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 setSavedFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;\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 { 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\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 <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 </Box>\r\n )}\r\n\r\n <Box\r\n className=\"filter-criteria-form\"\r\n sx={filterFormStyles.formFlexContainer}\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 string\r\n ] as\r\n | { value: string | string[]; operator: string }\r\n | undefined;\r\n\r\n console.log(\"fieldValue:\", fieldValue);\r\n\r\n const operator = fieldValue?.operator;\r\n console.log(\"Operator\", operator);\r\n\r\n // Operators that should show a Date Picker\r\n const 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\n // Should the date picker be shown?\r\n if (filter?.filter_attribute_data_type === \"date\") {\r\n const showDatePicker =\r\n operator &&\r\n dateAllowedOperators.includes(operator);\r\n\r\n const showTextInsteadOfDate =\r\n !operator ||\r\n !dateAllowedOperators.includes(operator);\r\n\r\n if (showTextInsteadOfDate) {\r\n console.log(\r\n \"Inside showtext\",\r\n showTextInsteadOfDate\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\r\n // const showDatePicker =\r\n // filter?.filter_attribute_data_type === \"date\" &&\r\n // operator &&\r\n // dateAllowedOperators.includes(operator);\r\n\r\n // // Should textfield shown instead for date?\r\n // const showTextInsteadOfDate =\r\n // !operator ||\r\n // !dateAllowedOperators.includes(operator);\r\n\r\n // console.log(\"Show Date Picker:\", showDatePicker);\r\n // console.log(\r\n // \"Show Text Instead:\",\r\n // showTextInsteadOfDate\r\n // );\r\n\r\n // Now render exactly same logic except date override\r\n if (\r\n filter?.filter_attribute_data_type === \"text\" ||\r\n filter?.filter_attribute_data_type === \"number\"\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 if (filter?.filter_attribute_data_type === \"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 LOGIC\r\n\r\n // if (showDatePicker) {\r\n // console.log(\"Inside Date\", showDatePicker);\r\n // return (\r\n // <FormDatePicker\r\n // filter={filter}\r\n // control={control}\r\n // onValueChange={updateFiltersFromForm}\r\n // />\r\n // );\r\n // } else {\r\n // console.log(\"Inside Text\", FormTextfield);\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 // if (showTextInsteadOfDate) {\r\n // console.log(\r\n // \"Inside Show text\",\r\n // showTextInsteadOfDate\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 if (\r\n filter?.filter_attribute_data_type === \"select\"\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 />\r\n );\r\n }\r\n\r\n if (\r\n filter?.filter_attribute_data_type ===\r\n \"multiselect\"\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 />\r\n );\r\n }\r\n\r\n // if (\r\n // filter?.filter_attribute_data_type === \"radio\"\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 // />\r\n // );\r\n // }\r\n\r\n // if (\r\n // filter?.filter_attribute_data_type === \"checkbox\"\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 // />\r\n // );\r\n // }\r\n\r\n return <FormControl fullWidth size=\"small\" />;\r\n })()}\r\n </Box>\r\n\r\n {/* <Box>\r\n {filter?.filter_attribute_data_type === \"text\" ||\r\n filter?.filter_attribute_data_type === \"number\" ? (\r\n <FormTextfield\r\n filter={filter}\r\n control={control}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n ) : filter?.filter_attribute_data_type === \"year\" ? (\r\n <FormDatePicker\r\n filter={filter}\r\n control={control}\r\n views={[\"year\"]}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n ) : filter?.filter_attribute_data_type === \"date\" ? (\r\n <FormDatePicker\r\n filter={filter}\r\n control={control}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n ) : filter?.filter_attribute_data_type ===\r\n \"select\" ? (\r\n <FormMultiSelect\r\n filter={filter}\r\n control={control}\r\n dropdownData={dropdownData}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n ) : filter?.filter_attribute_data_type ===\r\n \"multiselect\" ? (\r\n <FormMultiSelect\r\n filter={filter}\r\n control={control}\r\n dropdownData={dropdownData}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n ) : filter?.filter_attribute_data_type === \"radio\" ? (\r\n <FormMultiSelect\r\n filter={filter}\r\n control={control}\r\n dropdownData={dropdownData}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n ) : filter?.filter_attribute_data_type ===\r\n \"checkbox\" ? (\r\n <FormMultiSelect\r\n filter={filter}\r\n control={control}\r\n dropdownData={dropdownData}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n ) : (\r\n <FormControl fullWidth size=\"small\" />\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 setSavedFilterModalOpen && setSavedFilterModalOpen(true);\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 setSavedFilterModalOpen,\r\n onChangeFunction,\r\n filterComponentOptions,\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 setSavedFilterModalOpen={setSavedFilterModalOpen}\r\n dropdownData={dropdownData}\r\n onChangeFunction={onChangeFunction}\r\n filterComponentOptions={filterComponentOptions}\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 setSavedFilterModalOpen,\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 setSavedFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;\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 },\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 setSavedFilterModalOpen={setSavedFilterModalOpen}\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 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 { DeleteIcon, EditIcon } from \"../../../../assets/svg\";\r\nimport SavedFilterEditComponent from \"./saved-edit-filter\";\r\nimport { filterStyles } from \"../style\";\r\nimport { CheckBox } from \"../../../../assets/svg\";\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 setSavedFilterModalOpen,\r\n tabValue,\r\n onChangeFunction,\r\n filterComponentOptions,\r\n}: FilterFormComponentProps) => {\r\n const { filters, filterMaster, setFilterMaster, setFilterToDelete } =\r\n tableStates;\r\n const [searchTerm, setSearchTerm] = useState<string>(\"\");\r\n\r\n // reset savedFilterEditValue when component unmounts\r\n useEffect(() => {\r\n return () => {\r\n const editModeFromTabOptions =\r\n filterComponentOptions?.tabOptions?.savedFilter?.editMode;\r\n if (!editModeFromTabOptions) {\r\n setEditMode && setEditMode(false);\r\n setFilterMaster(\r\n (prev) =>\r\n ({\r\n ...prev,\r\n saved_filters: {\r\n ...prev?.attributes,\r\n selectedId: \"\",\r\n selectedName: \"\",\r\n selectedCode: \"\",\r\n },\r\n } as FilterMasterStateProps)\r\n );\r\n }\r\n };\r\n }, []);\r\n\r\n const handleListItemClick = (filter: FilterOperationListProps) => {\r\n const newFilterMasterState = {\r\n ...filterMaster,\r\n saved_filters: {\r\n ...filterMaster?.attributes,\r\n selectedId: filter?.value,\r\n selectedName: filter?.label,\r\n selectedCode: filter?.code,\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(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 // setEditfilter state on edit icon click\r\n setEditMode && setEditMode(true);\r\n setFilterToDelete(filter);\r\n };\r\n\r\n const handleAppyFilter = (filter: FilterOperationListProps) => {\r\n const newFilterMasterState = {\r\n ...filterMaster,\r\n saved_filters: {\r\n ...filterMaster?.attributes,\r\n selectedId: filter?.value,\r\n selectedName: filter?.label,\r\n selectedCode: filter?.code,\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(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\r\n const renderList = () => (\r\n <>\r\n <CustomSearch\r\n value={searchTerm}\r\n onChange={setSearchTerm}\r\n className=\"search-input\"\r\n />\r\n\r\n {columnsData?.saved_filter?.length === 0 ? (\r\n <Typography sx={{ mt: 2 }}>No saved filters yet.</Typography>\r\n ) : (\r\n <List\r\n sx={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 1,\r\n mt: 2,\r\n }}\r\n >\r\n {columnsData?.saved_filter\r\n ?.filter((filter) =>\r\n filter.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 border:\r\n filter?.value ===\r\n tableStates?.filterMaster?.saved_filters?.selectedId\r\n ? `3px solid #7a5af8`\r\n : \"1px solid #C5C5C5\",\r\n borderRadius: \"8px\",\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={() => handleAppyFilter(filter)}\r\n >\r\n {filter?.value ===\r\n tableStates?.filterMaster?.saved_filters?.selectedId && (\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n cursor: \"pointer\",\r\n color: \"green\",\r\n rounded: \"full\",\r\n }}\r\n >\r\n <CheckBox />\r\n </Box>\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\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=\"saved-filter-component-wrapper\">\r\n {/* Render search input and list */}\r\n {!editMode && renderList()}\r\n\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 setSavedFilterModalOpen={setSavedFilterModalOpen}\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}: 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.data_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.data_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 setSavedFilterModalOpen,\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 setSavedFilterModalOpen={setSavedFilterModalOpen}\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 setSavedFilterModalOpen={setSavedFilterModalOpen}\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 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\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}: 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 [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 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 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\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 selectedId: \"\",\r\n selectedName: \"\",\r\n selectedCode: \"\",\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 setSavedFilterModalOpen={setSaveFilterModalOpen}\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 setSavedFilterModalOpen={setSaveFilterModalOpen}\r\n filterComponentOptions={finalComponentOptions}\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 setSavedFilterModalOpen={setSaveFilterModalOpen}\r\n filterComponentOptions={finalComponentOptions}\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 />\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\r\n const newFilterMasterState = {\r\n ...filterMaster,\r\n saved_filters: {\r\n ...filterMaster?.attributes,\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 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?.attributes,\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 </Box>\r\n );\r\n}\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: 1,\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 \"&.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 \"&.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 sx={{ p: 2, zIndex: 10 }}>\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 = 0,\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 severity=\"info\">{message}</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\n\r\nconst QuickTab = ({\r\n filterSettingStates,\r\n columnsData,\r\n tabsApiData,\r\n tabsApiDataLoading,\r\n}: SettingsQuickTabProps) => {\r\n const { settingsData, setSettingsData, saveButtonError, setSaveButtonError } =\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\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: 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 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 } 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 }, [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 const showListValues = quickTabStates?.show_list || [];\r\n const hideListValues = quickTabStates?.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 // 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 oldIndex = newHideList.findIndex((i) => i.value === active.id);\r\n const newIndex = newHideList.findIndex((i) => i.value === over.id); //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.findIndex((i) => i.value === active.id); //newShowList.indexOf(String(active.id));\r\n const newIndex = newShowList.findIndex((i) => i.value === over.id); //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 === \"tabs\") {\r\n if (newShowList.length >= 5) return; // prevent overflow\r\n // Move from hide to show\r\n\r\n const idx = newHideList.findIndex((i) => i.value === String(active.id)); //newHideList.indexOf(String(active.id));\r\n if (idx !== -1) {\r\n newHideList.splice(idx, 1);\r\n newShowList.push({\r\n value: String(active.id),\r\n label:\r\n tabsApiData?.find((i) => i.value === String(active.id))?.label ??\r\n \"\",\r\n });\r\n }\r\n } else if (currentContainer === \"tabs\" && overContainer === \"list\") {\r\n // Move from show to hide\r\n const idx = newShowList.findIndex((i) => i.value === String(active.id)); //newShowList.indexOf(String(active.id));\r\n if (idx !== -1) {\r\n newShowList.splice(idx, 1);\r\n newHideList.push({\r\n value: String(active.id),\r\n label:\r\n tabsApiData?.find((i) => i.value === String(active.id))?.label ??\r\n \"\",\r\n });\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) =>\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 ...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 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 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.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 // Move from show_list to hide_list\r\n const index = toShowList.indexOf(item);\r\n if (index > -1) {\r\n toShowList.splice(index, 1);\r\n toHideList.push(item);\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 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 }))\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: 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 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%\"}\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 { 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}\r\n\r\nconst ColumnTab = ({ filterSettingStates, columnsData }: 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 columnsData?.column_list?.map((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 && isTabWiseEmpty) {\r\n const mappedTabs: TabData[] =\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\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column,\r\n tabs: mappedTabs,\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 getCurrentLists = () => {\r\n if (settingsColumnState?.isDefault) {\r\n return {\r\n showList: settingsColumnState.show_list || [],\r\n hideList: settingsColumnState.hide_list || [],\r\n };\r\n } else {\r\n const currentTab = settingsColumnState?.tabs?.[selectedTabIndex];\r\n return {\r\n showList: currentTab?.show_list || [],\r\n hideList: currentTab?.hide_list || [],\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 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 };\r\n\r\n const handleHideAll = () => {\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 };\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%\"}\r\n position=\"absolute\"\r\n color=\"#088AB2\"\r\n top={2}\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\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 // if sorting state is empty, initialize once\r\n if (!sortingTabState || Object.keys(sortingTabState).length === 0) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n sorting: { isDefault: true, sortby: emptySortBy },\r\n }));\r\n return; // ✅ prevent further execution\r\n }\r\n\r\n // if sortby is missing or empty\r\n if (!sortingTabState?.sortby || sortingTabState?.sortby.length === 0) {\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 }\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 = sortingTabState?.tabs?.findIndex(\r\n (tab) => tab?.tab_name === activeTab\r\n );\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 const tabSortedList = useMemo(() => {\r\n return isSortingDefault\r\n ? sortingTabState?.sortby\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 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: columnsData || [],\r\n hideList: columnTabState?.hide_list || [],\r\n };\r\n } else {\r\n const currentTab = columnTabState?.tabs?.[activeTabIndex || 0];\r\n return {\r\n showList: columnsData || [],\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 { 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 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 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 show,\r\n filterSettingStates,\r\n onClose,\r\n columnsData,\r\n columnsDataLoading,\r\n quickTabAttributes,\r\n quickTabAttributesLoading,\r\n sortingTabAttributes,\r\n sortingTabAttributesLoading,\r\n tabsApiData,\r\n tabsApiDataLoading,\r\n onSaveSettingsData,\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\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 : null;\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 />\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 />\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 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 { 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 {\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"],"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","SettingIcon","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","useOutsideClick","handler","useEffect","handleClickOutside","event","current","contains","target","addEventListener","removeEventListener","useFullscreenPopoverContainer","isFullscreen","setIsFullscreen","useState","fullscreenElement","setContainer","undefined","handleFullscreenChange","el","ViewMore","compactMode","onCompactToggle","onFullscreenToggle","tableStates","onClose","fullscreenContainer","wrapColumns","setWrapColumns","MUISwitch","checked","all_wrap","onChange","prev","Select","value","e","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","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","position","top","TextField","placeholder","onKeyDown","key","InputProps","startAdornment","InputAdornment","querySelector","focus","edge","endAdornment","CloseRoundedIcon","Topbar","isCompactTable","fullscreenToggle","setIsCompactTable","paginationComponent","topbarOptions","onFilterButtonClick","sortAnchorEl","setSortAnchorEl","groupBy","setGroupBy","showColumnHiding","setShowColumnHiding","layoutAnchorEl","setLayoutAnchorEl","setSelectedLayout","columnAnchorEl","setColumnAnchorEl","setShowTableFilter","setViewMoreAnchorEl","leftSideComponent","rightSideComponent","showColumnToggle","showChangeLayoutToggle","showSortingToggle","showFilterToggle","showSearch","searchValue","onSearchChange","dropdownRef","handleExternalLayoutTrigger","detail","handleExternalFilterTrigger","handleExternalViewMoreTrigger","handleExternalSearchTrigger","window","viewMoreAnchorEl","isViewMoreOpen","overflowX","whiteSpace","title","customEvent","CustomEvent","dispatchEvent","_Fragment","currentTarget","mt","meta","sortingRules","setSorting","showTableFilter","filters","right","transformOrigin","onGroupByChange","DefaultPagination","rowsPerPageArray","paginationOptions","pageIndex","getState","pagination","pageCount","getPageCount","pageSize","rowCount","getRowCount","recordsRangeFirst","recordsRangeLast","Math","min","paginationView","defaultValue","page","Number","setPageIndex","textAlign","max","setPageSize","disabled","getCanPreviousPage","previousPage","TablePreviousPageIcon","getCanNextPage","nextPage","TableNextPageIcon","getColumnPinningStyles","isPinned","getIsPinned","isLastLeftPinnedColumn","getIsLastColumn","isFirstRightPinnedColumn","getIsFirstColumn","background","left","getStart","getAfter","getSize","getColumnPinningStylesBody","environments","adm_dev","crm_dev","uat","DragAlongCell","cell","isDragging","Translate","wordBreak","align","getIsPlaceholder","flexRender","getContext","axios","create","baseURL","timeout","headers","interceptors","request","use","config","token","localStorage","getItem","Authorization","error","Promise","reject","Checkbox","indeterminate","uuidv4","check","setCheck","React","isChecked","TableBody","featureOptions","NestedComponent","enableColumnReordering","enableRowSelection","getRowModel","rows","row","renderedRow","getIsSelected","getIsSomeSelected","getToggleSelectedHandler","getVisibleCells","tdProps","horizontalListSortingStrategy","getIsExpanded","Fragment","renderRow","TableHeadPin","pin","stopPropagation","TableHeadPopover","dense","ListItemButton","toggleSorting","ListItemIcon","ListItemText","primary","Switch","toggleWrapForColumn","DraggableTableHeader","enableColumnPinning","setAnchorEl","handleClose","styles","minSize","maxSize","onMouseLeave","colSpan","isPlaceholder","getCanSort","asc","getIsSorted","getCanResize","onDoubleClick","resetSize","onMouseDown","getResizeHandler","onTouchStart","getIsResizing","TableHead","stickyHeader","handleHover","getHeaderGroups","headerGroup","getIsAllRowsSelected","getIsSomeRowsSelected","toggleAllRowsSelected","striped","TableDND","modifiers","restrictToHorizontalAxis","TableWrapper","data","nestedComponent","loadingOptions","isLoading","customRenderFn","shouldHideColumn","emptyListComponent","filterOptions","Array","isArray","Error","metaColumns","setMetaColumns","updatedColumns","accessorKey","index","ctx","propName","customFn","getValue","where","defaultPinned","columnPinning","c","compactTable","tableRef","craftPaginationOptions","showPagination","paginationPosition","totalRows","craftTopbarOptions","showCompactTableToggle","viewMoreToggle","craftFeatureOptions","enableTopbar","enableSorting","enableServerSidePagination","enableServerSideSorting","enableColumnResizing","enableMultiColumnSorting","enableWordBreakAll","sorting","setPagination","rowSelection","setRowSelection","expanded","setExpanded","useReactTable","state","getCoreRowModel","onSortingChange","getSortedRowModel","manualSorting","getPaginationRowModel","onPaginationChange","manualPagination","onRowSelectionChange","columnResizeDirection","columnResizeMode","onColumnOrderChange","getExpandedRowModel","onExpandedChange","getSubRows","subRows","loadingComponent","loaderText","showFilterCondition","show","exitFullscreen","requestFullscreen","catch","err","console","component","useCraftTable","paginationPageSize","setFilters","savedFilterEditValue","setSavedFilterEditValue","filterToDelete","setFilterToDelete","filterSelectedAttributeValue","setFilterSelectedAttributeValue","filterMaster","setFilterMaster","showFilterOptions","setShowFilterOption","filterData","setFilterData","selectedFilterEntity","setSelectedFilterEntity","setColumnPinning","useCraftTableFilterSettings","showListViewSettings","setShowListViewSettings","settingsData","setSettingsData","quickTabStates","setQuickTabStates","columnTabState","setColumnTabState","sortingTabState","setSortingTabState","saveButtonError","setSaveButtonError","hasError","messages","quick_tab","tableTabsStyles","tabs","minHeight","tab","padding","textTransform","tabCount","TableTabs","loading","tabsData","activeTab","settingsOptions","CircularProgress","normalizedTabs","useMemo","tab_value","defaultTab","t","selectedTab","showIcon","mx","Tabs","_","scrollButtons","slotProps","indicator","tab_value_count","Tab","String","padStart","ConfirmModal","description","buttons","input","inputValue","setInputValue","setError","Dialog","reason","DialogTitle","marginX","paddingBottom","borderBottom","DialogContent","marginBottom","marginTop","labelClassName","required","multiline","DialogActions","button","handleButtonClick","CustomTabPanel","hidden","CustomTabs","tabItems","activeFilterIndex","handleCrossClick","tabsProps","hoveredTab","setHoveredTab","idx","isActive","isHovered","onMouseEnter","TextFieldStyles","bgcolor","borderColor","FormTextfield","control","onValueChange","Controller","name","filter_attribute_name","filter_value","render","filter_attribute_data_type","FormDatePicker","views","isRange","filter_operator","isRelativeToToday","LocalizationProvider","dateAdapter","AdapterDateFns","moment","format","toDate","todayDate","fromDate","DatePicker","date","formatted","textField","FormDropdown","setValue","dropdownList","FormControl","disableUnderline","newOperator","oldOperator","shouldDirty","FormMultiSelect","dropdownData","options","filter_attribute","cleanedValue","multiple","filtered","renderValue","selected","val","join","includes","filterStyles","scrollbarCustom","overflowY","pr","filterContainer","filterMainHeader","filterMainComponentWrapper","filterFormStyles","formEditModeStyle","formFlexContainer","formListItem","formListSectionHeader","formListItemHeader","formListItemHeaderName","formListItemHeaderDropdown","CustomSearch","search","setSearch","EmptyList","FilterCriteriaEntityList","filterComponentOptions","searchTerm","setSearchTerm","isSingleEntity","tabOptions","allEntities","mainFilter","entityList","entitiesToShow","filterEntityTypes","f","filter_entity_type","entity","toLowerCase","my","ListItem","handleSelectEntity","Loader","paddingBlock","FilterCriteriaList","handleAddFilter","shouldShowCloseButton","some","entityWiseCriteria","isPending","filteredEntities","isAlreadySelected","attribute_key","FilterCriteria","columnsData","onChangeFunction","FilterButton","styled","theme","palette","main","dark","filterButtonRef","filterButtonWidth","setWidth","resizeObserver","ResizeObserver","clientWidth","observe","disconnect","useElementWidth","isSingleFilter","disableButton","ClickAwayListener","onClickAway","Paper","maxHeight","attribute","dropdownOptions","operation_list","data_type","defaultOperator","matchingDropdownList","newSelectedFilter","element_type","datasource_list","dropdown_list","filter_entity_name","newFilterState","FilterForm","handleRemoveFilter","editMode","setSavedFilterModalOpen","setDeleteFilterModalOpen","showSaveButton","showClearAllButton","customButtons","filterName","saved_filters","selectedName","defaultValues","filterValues","reduce","acc","curr","operator","dummyChange","watch","reset","unregister","useForm","mode","resetOptions","keepDirtyValues","keepErrors","formValues","debouncedUpdateFilters","updatedFilters","updateFiltersFromForm","filterValue","groupedFilters","push","handleRemoveEntityType","entityType","remainingFilters","onSubmit","preventDefault","inputRef","entries","overflow","reverse","marginLeft","dummy","fieldValue","log","dateAllowedOperators","showTextInsteadOfDate","activeFilterTabIndex","btn","MainFilter","mainBoxStyles","newFilters","SavedFilterEditComponent","setEditMode","showBackButton","savedFilter","selectedId","selectedCode","BackArrow","SavedFilter","tabValue","editModeFromTabOptions","saved_filter","visibility","newFilterMasterState","code","radio","handleAppyFilter","rounded","handleListItemClick","AttributesFilter","selectedAttribute","currentRadio","handleSingleRadioSelect","selectedAttr","matchingColumn","column_list","updatedRadio","newFilter","exists","updatedFilterMaster","selectedAttributeOptions","attributeKey","displayEmpty","option","FormControlLabel","Radio","deepMergeObjects","source","output","SingleFilterRendering","showFilter","commonProps","editProps","attributesProps","TableFilter","onDeleteFilter","onSaveFilter","onUpdateFilter","setTabValue","saveFilterModalOpen","setSaveFilterModalOpen","deleteFilterModalOpen","finalComponentOptions","showMainHeader","mainHeaderTitle","showTabs","showMainFilter","showSavedFilter","showAttributesFilter","tabMapping","filterNameInput","savedFilterProps","tabType","newFilterMaster","clearAttributeRadio","patches","isRuleEngine","recordFilterComponentProps","edit","save","secondary","isSingleSavedFilterEditMode","delete","verticalTabStyles","mainTabsContainer","mainTabContainer","mainTabLabel","horizontalTabStyles","CustomVerticalTabs","orientation","DraggableListItem","containerId","DragIndicator","mr","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","filterSettingStates","tabsApiData","currentQuickAttribute","setCurrentQuickAttribute","hide_list","show_list","showList","isValidShowList","ERROR_CODE","showListValues","hideListValues","filteredListValues","handleItemToggle","fromContainerId","toShowList","toHideList","i","splice","enableDND","currentContainer","overContainer","newShowList","newHideList","removed","currentShowList","currentHideList","availableSlots","limitedHideList","slice","isAllSelected","isCombineOther","ColumnTab","selectedTabIndex","setSelectedTabIndex","settingsColumnState","isColumnDefault","isDefault","isStateEmpty","isDefaultEmpty","isTabWiseEmpty","mappedColumns","mappedTabs","tab_name","hasOtherMessages","hideList","currentTab","getCurrentLists","visible","moved","updatedTabs","hasShowListQuickTabs","activeItem","list","Sorting","setActiveTab","isSortingDefault","sortby","emptySortBy","order","PointerSensor","activeTabIndex","tabSortedList","updateSortList","handleDNDDropdownChange","showAddSortButton","stateLength","isAddSortDisabled","hasEmptyColumn","reordered","columnKey","CustomDialog","DialogTransition","forwardRef","Slide","CustomButton","customSx","SETTINGS_TABS","KANBAN_SETTINGS_TABS","LANE_SELECTS","Lane","sortingOptions","charAt","itemId","lane","opt","showSubLane","showColorColumns","GroupBy","QuickFilterSettings","view","columnsDataLoading","quickTabAttributes","quickTabAttributesLoading","sortingTabAttributes","sortingTabAttributesLoading","onSaveSettingsData","hasAPIData","slots","Column","copyColumnTabState","copySortingTabState","kanbanStyles","syncingStyle","topHeader","pt","laneHeader","badge","swimlaneWrapperStyle","columnStyle","stageStyle","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","subSectionAccordion","subSectionCountContainer","cardsContainer","settingStyle","swimLaneAccordionStyle","subSectionHeaderContainer","COLOR_CONSTANTS","darkColor","Kanban","metaData","KanbanCardComponent","showSettings","onOpenSettings","expandedPanels","setExpandedPanels","Active","subLaneExpanded","setSubLaneExpanded","swim_lanes","initial","swim_lane","sub_lanes","sub_lane","lane_id","getLeadCount","laneId","seenLeadIds","Set","count","swimLane","subLane","lead","stage_id","has","add","SettingsOutlinedIcon","lanes","Accordion","panel","isExpanded","AccordionSummary","expandIcon","ArrowDropDownIcon","ml","lead_status_id","AccordionDetails","pl","sub_section","subLaneKey","toggleSubLane","subLaneId","borderLeft","ExpandMoreIcon","stage_group_id","card","cardData"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"index.mjs","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/useOutsideClick.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/components/topbar/index.tsx","../src/listing/components/pagination/default/index.tsx","../src/listing/libs/utils/common.ts","../src/listing/components/table-body-dnd-cell.tsx","../src/listing/components/inputs/checkbox/index.tsx","../src/listing/components/table-body.tsx","../src/listing/components/table-head-pin.tsx","../src/listing/components/table-head-popover.tsx","../src/listing/components/table-head-dnd-cell.tsx","../src/listing/components/table-head.tsx","../src/listing/components/table.tsx","../src/listing/components/table-dnd.tsx","../src/listing/components/index-table.tsx","../src/listing/libs/hooks/useCraftTable.tsx","../src/listing/libs/hooks/useCraftTableFilterSettings.tsx","../src/listing/components/tabs/styles.ts","../src/listing/components/tabs/index.tsx","../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/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/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/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/filter/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/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/constants.ts","../src/listing/components/table-settings/components/lane.tsx","../src/listing/components/table-settings/components/group-by.tsx","../src/listing/components/table-settings/index.tsx","../src/kanban/styles/styles.tsx","../src/kanban/constants/kanban-constants.ts","../src/kanban/index.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 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 { 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 };\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}\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_value: string | null;\r\n tab_value_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}\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={{\r\n display: \"flex\",\r\n position: \"relative\",\r\n top: \"10px\",\r\n }}\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: \"14px\" }}\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: \"14px\" }}\r\n edge=\"end\"\r\n >\r\n <CloseRoundedIcon\r\n fontSize=\"small\"\r\n sx={{ color: \"black\", fontSize: \"14px\" }}\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, { 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 { Popover } from \"@mui/material\";\r\nimport LayoutSelector from \"../table-change-layout.tsx\";\r\nimport useOutsideClick from \"../../libs/hooks/useOutsideClick.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 [showColumnHiding, setShowColumnHiding] = useState(false);\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 { setShowTableFilter } = tableStates;\r\n\r\n // search\r\n const [showSearchInput, setShowSearchInput] = useState(false);\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 setShowColumnHiding(false);\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 dropdownRef = useRef<HTMLDivElement>(null);\r\n useOutsideClick({\r\n ref: dropdownRef,\r\n handler: () => setShowColumnHiding(false),\r\n });\r\n\r\n const handleLayoutSelect = (layout: string) => {\r\n setSelectedLayout(layout);\r\n setLayoutAnchorEl(null);\r\n };\r\n\r\n useOutsideClick({\r\n ref: searchContainerRef,\r\n handler: () => setShowSearchInput(false),\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 setShowSearchInput(true);\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 {showSearch && (\r\n <div\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 </div>\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(\"triggerLayoutPopover\", {\r\n detail: { target: e.currentTarget },\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 && !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 </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default Topbar;\r\n","import { Table } from \"@tanstack/react-table\";\r\nimport {\r\n TableFirstPageIcon,\r\n TableLastPageIcon,\r\n // TableNextPageIcon,\r\n // TablePreviousPageIcon,\r\n} from \"../../../../assets/svg\";\r\nimport TablePreviousPageIcon from \"@mui/icons-material/NavigateBeforeRounded\";\r\nimport TableNextPageIcon from \"@mui/icons-material/NavigateNextRounded\";\r\nimport \"./index.scss\";\r\nimport { CraftTablePaginationProps } from \"../../../types/table\";\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 const recordsRangeFirst = pageIndex * pageSize - pageSize + 1;\r\n const recordsRangeLast = Math.min(pageIndex * pageSize, rowCount);\r\n\r\n return (\r\n <div className=\"pagination_container\">\r\n {paginationOptions?.paginationView === \"full\" ? (\r\n <>\r\n <span className=\"go_to_page_container\">\r\n &nbsp;&nbsp;Go to page&nbsp;:&nbsp;\r\n <input\r\n type=\"number\"\r\n defaultValue={pageIndex}\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 style={{ width: \"60px\", textAlign: \"center\" }}\r\n min={1}\r\n max={table?.getPageCount()}\r\n />\r\n &nbsp;\r\n </span>\r\n\r\n <div className=\"rows_per_page_container\">\r\n <span>Rows Per Page&nbsp;:&nbsp;</span>\r\n <select\r\n value={table.getState().pagination.pageSize}\r\n onChange={(e) => {\r\n table.setPageSize(Number(e.target.value));\r\n }}\r\n >\r\n {rowsPerPageArray.map((pageSize) => (\r\n <option key={pageSize} value={pageSize}>\r\n {pageSize}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div className=\"records_range_container\">\r\n <span>Showing&nbsp;</span>\r\n <strong>\r\n {recordsRangeFirst} - {recordsRangeLast} of {rowCount}\r\n </strong>\r\n </div>\r\n\r\n <span className=\"page_range_container\">\r\n <span>&nbsp;Page&nbsp;</span>\r\n <strong>\r\n {pageIndex} of {pageCount}\r\n &nbsp;\r\n </strong>\r\n </span>\r\n\r\n <div className=\"pagination_btn_container\">\r\n <button\r\n title=\"First Page\"\r\n className=\"pagination_btn\"\r\n disabled={!table.getCanPreviousPage()}\r\n onClick={() => table.setPageIndex(0)}\r\n >\r\n <TableFirstPageIcon />\r\n </button>\r\n <button\r\n title=\"Previous Page\"\r\n className=\"pagination_btn\"\r\n disabled={!table.getCanPreviousPage()}\r\n onClick={() => table.previousPage()}\r\n >\r\n <TablePreviousPageIcon fontSize=\"small\" />\r\n </button>\r\n <button\r\n title=\"Next Page\"\r\n className=\"pagination_btn\"\r\n disabled={!table.getCanNextPage()}\r\n onClick={() => table.nextPage()}\r\n >\r\n <TableNextPageIcon />\r\n </button>\r\n <button\r\n title=\"Last Page\"\r\n className=\"pagination_btn\"\r\n disabled={!table.getCanNextPage()}\r\n onClick={() => table.setPageIndex(pageCount - 1)}\r\n >\r\n <TableLastPageIcon />\r\n </button>\r\n </div>\r\n </>\r\n ) : (\r\n <>\r\n <div className=\"rows_per_page_container\">\r\n {/* <span>Rows Per Page&nbsp;:&nbsp;</span> */}\r\n <select\r\n value={table.getState().pagination.pageSize}\r\n onChange={(e) => {\r\n table.setPageSize(Number(e.target.value));\r\n }}\r\n >\r\n {rowsPerPageArray.map((pageSize) => (\r\n <option key={pageSize} value={pageSize}>\r\n {pageSize}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div className=\"records_range_container\">\r\n {/* <span>Showing&nbsp;</span> */}\r\n <strong>\r\n {recordsRangeFirst} - {recordsRangeLast} of {rowCount}\r\n </strong>\r\n </div>\r\n\r\n <div className=\"pagination_btn_container\">\r\n <button\r\n title=\"Previous Page\"\r\n className=\"pagination_btn\"\r\n disabled={!table.getCanPreviousPage()}\r\n onClick={() => table.previousPage()}\r\n >\r\n <TablePreviousPageIcon />\r\n </button>\r\n <button\r\n title=\"Next Page\"\r\n className=\"pagination_btn\"\r\n disabled={!table.getCanNextPage()}\r\n onClick={() => table.nextPage()}\r\n >\r\n <TableNextPageIcon />\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n </div>\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 = \"uat\";\r\nexport const ENTITY_TYPE = \"LEAD\";\r\nexport const MAPPED_ENTITY_TYPE = \"LYPR\"; // LAP OR LYPR\r\n\r\nconst environments = {\r\n adm_dev: \"http://localhost:4010/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","import { useSortable } from \"@dnd-kit/sortable\";\r\nimport { CSS } from \"@dnd-kit/utilities\";\r\nimport { Cell, flexRender } from \"@tanstack/react-table\";\r\nimport { CSSProperties } from \"react\";\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\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 const style: CSSProperties = {\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 };\r\n\r\n return (\r\n <td\r\n ref={setNodeRef}\r\n {...{\r\n style: {\r\n ...style,\r\n zIndex: isPinned ? 2 : isDragging ? 1 : 0,\r\n },\r\n align: (cell.column.columnDef.meta as align)?.align || \"left\",\r\n className: \"ts__body__td\",\r\n }}\r\n >\r\n {cell.getIsPlaceholder()\r\n ? null\r\n : flexRender(cell.column.columnDef.cell, cell.getContext())}\r\n </td>\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\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 <tr key={row.id} className=\"ts__body__tr\">\r\n {enableRowSelection && (\r\n <td\r\n className=\"ts__body__td ts__body__checkbox\"\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 </td>\r\n )}\r\n\r\n {row?.getVisibleCells()?.map((cell) => {\r\n const tdProps = {\r\n className: \"ts__body__td\",\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 } as React.CSSProperties,\r\n align: (cell.column.columnDef.meta as align)?.align || \"left\",\r\n };\r\n\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 <td key={cell?.id} {...tdProps}>\r\n {flexRender(cell?.column?.columnDef?.cell, cell?.getContext())}\r\n </td>\r\n );\r\n })}\r\n </tr>\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 <tr>\r\n {/* <td colSpan={table.getAllLeafColumns().length}>//commented out to remove extra line on opening of \r\n {NestedComponent && <NestedComponent {...{ row }} />}\r\n </td> */}\r\n {<NestedComponent {...{ row }} />}\r\n </tr>\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 className=\"ts__body\">\r\n {table?.getRowModel()?.rows?.map((row) => renderRow(row))}\r\n </tbody>\r\n );\r\n}\r\n\r\nexport default TableBody;\r\n","import { IconPinOffOutline } from \"../../assets/svg\";\r\nimport { TableHeaderProps } from \"../types/table\";\r\n\r\nfunction TableHeadPin<T>({ header }: TableHeaderProps<T>) {\r\n return header.column.getIsPinned() !== \"left\" ? (\r\n <div className=\"ts--head--button\" onClick={() => header.column.pin(\"left\")}>\r\n {/* <IconPinOutline /> */}\r\n </div>\r\n ) : (\r\n <div\r\n className=\"ts--head--button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n header.column.pin(false);\r\n }}\r\n >\r\n <IconPinOffOutline />\r\n </div>\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 { CraftTableOptionsProps } from \"../types/table-options\";\r\nimport { useFullscreenPopoverContainer } from \"../libs/hooks/useFullScreen\";\r\n\r\ntype Props<T> = {\r\n anchorEl: HTMLElement | null;\r\n onClose: () => void;\r\n header: Header<T, unknown>;\r\n tableStates: CraftTableOptionsProps;\r\n};\r\n\r\nfunction TableHeadPopover<T>({\r\n anchorEl,\r\n onClose,\r\n header,\r\n tableStates,\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\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\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={() => column.toggleVisibility()}>\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 { flexRender } from \"@tanstack/react-table\";\r\nimport { useSortable } from \"@dnd-kit/sortable\";\r\nimport { CSSProperties, useState } from \"react\";\r\nimport { CSS } from \"@dnd-kit/utilities\";\r\nimport { DownArrow, DragHandleIcon, UpArrow } from \"../../assets/svg\";\r\nimport {\r\n getColumnAlignment,\r\n getColumnPinningStyles,\r\n} from \"../libs/utils/common\";\r\nimport { align } from \"../types/common\";\r\nimport { TableHeaderProps } from \"../types/table\";\r\nimport TableHeadPin from \"./table-head-pin\";\r\nimport TableHeadPopover from \"./table-head-popover\";\r\n\r\nfunction DraggableTableHeader<T>({\r\n header,\r\n featureOptions,\r\n tableStates,\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 handleHover = (event: React.MouseEvent<HTMLElement>) => {\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 const styles: CSSProperties = {\r\n opacity: isDragging ? 0.8 : 1,\r\n position: \"relative\",\r\n transform: CSS.Translate.toString(transform),\r\n transition: \"width transform 0.2s ease-in-out\",\r\n width: header.column.getSize(),\r\n minWidth: `${header.column.columnDef.minSize ?? 180}px`,\r\n maxWidth: `${header.column.columnDef.maxSize}px`,\r\n };\r\n\r\n let sortProps: {\r\n className: string;\r\n title?: string;\r\n style?: CSSProperties;\r\n } = {\r\n className: \"ts__content\",\r\n // style: {\r\n // justifyContent: getColumnAlignment(\r\n // (header?.column?.columnDef?.meta as align)?.align\r\n // ),\r\n // },\r\n };\r\n\r\n // if (header.column.getCanSort()) {\r\n // sortProps = {\r\n // ...sortProps,\r\n // title:\r\n // header.column.getNextSortingOrder() === \"asc\"\r\n // ? \"Sort ascending\"\r\n // : header.column.getNextSortingOrder() === \"desc\"\r\n // ? \"Sort descending\"\r\n // : \"Clear sort\",\r\n // };\r\n // }\r\n\r\n return (\r\n <th\r\n onMouseLeave={handleClose}\r\n key={header?.id}\r\n className=\"ts__head__th\"\r\n colSpan={header.colSpan}\r\n onClick={handleHover}\r\n style={{\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 ...styles,\r\n ...getColumnPinningStyles(header.column),\r\n zIndex: isPinned ? 3 : isDragging ? 1 : 0,\r\n }}\r\n >\r\n {header.isPlaceholder ? null : (\r\n <div {...sortProps}>\r\n <div\r\n className={`${\r\n header.column.getCanSort() ? \"ts__content__sort\" : \"\"\r\n }`.trim()}\r\n // onClick={header.column.getToggleSortingHandler()}\r\n >\r\n {flexRender(header.column.columnDef.header, header.getContext())}\r\n\r\n {{\r\n asc: <UpArrow />,\r\n desc: <DownArrow />,\r\n }[header.column.getIsSorted() as \"asc\" | \"desc\"] ?? null}\r\n </div>\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 <div {...attributes} {...listeners} className=\"ts__dnd__button\">\r\n <DragHandleIcon />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* column resizing */}\r\n {header.column.getCanResize() ? (\r\n <div\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 ) : null}\r\n\r\n {/* Popover */}\r\n <TableHeadPopover\r\n anchorEl={anchorEl}\r\n onClose={handleClose}\r\n header={header}\r\n tableStates={tableStates}\r\n />\r\n </th>\r\n );\r\n}\r\n\r\nexport default DraggableTableHeader;\r\n","import { ColumnOrderState, flexRender, Table } from \"@tanstack/react-table\";\r\nimport {\r\n CraftTableFeatureProps,\r\n CraftTableOptionsProps,\r\n} from \"../types/table-options\";\r\nimport { DownArrow, UpArrow } from \"../../assets/svg\";\r\nimport { CSSProperties, 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\n\r\ninterface TableHeadProps<T> {\r\n table: Table<T>;\r\n featureOptions: CraftTableFeatureProps;\r\n columnOrder: ColumnOrderState;\r\n tableStates: CraftTableOptionsProps;\r\n}\r\n\r\nfunction TableHead<T>({\r\n table,\r\n featureOptions,\r\n columnOrder,\r\n tableStates,\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 handleHover = (event: React.MouseEvent<HTMLElement>) => {\r\n setAnchorEl((prev) => (prev ? null : event.currentTarget));\r\n };\r\n\r\n return (\r\n <thead className={`ts__head ${stickyHeader ? \"ts--sticky\" : \"\"}`.trim()}>\r\n {table.getHeaderGroups().map((headerGroup) => (\r\n <tr className=\"ts__head__tr\" key={headerGroup?.id}>\r\n {enableRowSelection && (\r\n <th\r\n className=\"ts__head__th ts__head__checkbox\"\r\n style={{\r\n position: \"sticky\",\r\n left: 0,\r\n width: \"50px\",\r\n }}\r\n >\r\n <div className=\"ts__content\">\r\n <Checkbox\r\n checked={table.getIsAllRowsSelected()}\r\n indeterminate={table.getIsSomeRowsSelected()}\r\n onChange={() => table.toggleAllRowsSelected()}\r\n />\r\n </div>\r\n </th>\r\n )}\r\n\r\n {headerGroup.headers.map((header) => {\r\n let sortProps: {\r\n className: string;\r\n title?: string;\r\n style?: CSSProperties;\r\n } = {\r\n className: \"ts__content\",\r\n // style: {\r\n // justifyContent: getColumnAlignment(\r\n // (header?.column?.columnDef?.meta as align)?.align\r\n // ),\r\n // },\r\n };\r\n\r\n // if (header.column.getCanSort()) {\r\n // sortProps = {\r\n // ...sortProps,\r\n // title:\r\n // header.column.getNextSortingOrder() === \"asc\"\r\n // ? \"Sort ascending\"\r\n // : header.column.getNextSortingOrder() === \"desc\"\r\n // ? \"Sort descending\"\r\n // : \"Clear sort\",\r\n // };\r\n // }\r\n\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 featureOptions={featureOptions}\r\n tableStates={tableStates}\r\n />\r\n </SortableContext>\r\n ) : (\r\n <th\r\n key={header?.id}\r\n className=\"ts__head__th\"\r\n colSpan={header.colSpan}\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 onClick={handleHover}\r\n >\r\n {header.isPlaceholder ? null : (\r\n <div {...sortProps}>\r\n <div\r\n className={`${\r\n header.column.getCanSort() ? \"ts__content__sort\" : \"\"\r\n }`.trim()}\r\n // onClick={header.column.getToggleSortingHandler()}\r\n >\r\n {flexRender(\r\n header.column.columnDef.header,\r\n header.getContext()\r\n )}\r\n\r\n {{\r\n asc: <UpArrow />,\r\n desc: <DownArrow />,\r\n }[header.column.getIsSorted() as \"asc\" | \"desc\"] ?? null}\r\n </div>\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 </div>\r\n )}\r\n\r\n {/* column resizing */}\r\n {header.column.getCanResize() ? (\r\n <div\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 ) : 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 </th>\r\n );\r\n })}\r\n </tr>\r\n ))}\r\n </thead>\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\";\r\nimport TableHead from \"./table-head\";\r\n\r\nfunction Table<T>({\r\n table,\r\n featureOptions,\r\n NestedComponent,\r\n columnOrder,\r\n isCompactTable,\r\n tableStates,\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 featureOptions={featureOptions}\r\n columnOrder={columnOrder}\r\n tableStates={tableStates}\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 featureOptions,\r\n NestedComponent,\r\n columnOrder,\r\n setColumnOrder,\r\n isCompactTable,\r\n tableStates,\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 featureOptions={featureOptions}\r\n NestedComponent={NestedComponent}\r\n columnOrder={columnOrder}\r\n setColumnOrder={setColumnOrder}\r\n isCompactTable={isCompactTable}\r\n tableStates={tableStates}\r\n />\r\n </DndContext>\r\n );\r\n}\r\n\r\nexport default TableDND;\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 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}: 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 columnOrder={columnOrder}\r\n featureOptions={craftFeatureOptions}\r\n NestedComponent={nestedComponent}\r\n setColumnOrder={setColumnOrder}\r\n isCompactTable={isCompactTable}\r\n tableStates={tableStates}\r\n />\r\n ) : (\r\n <Table\r\n table={table}\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 />\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","import { SxProps, Theme } from \"@mui/material\";\r\n\r\ninterface TabStylesProps {\r\n tabs: SxProps<Theme>;\r\n tab: SxProps<Theme>;\r\n tabCount: SxProps<Theme>;\r\n}\r\n\r\nexport const tableTabsStyles: TabStylesProps = {\r\n tabs: {\r\n minHeight: \"38px\",\r\n },\r\n\r\n tab: {\r\n color: \"#888888\",\r\n padding: \"8px 12px\",\r\n minHeight: \"38px\",\r\n textTransform: \"none\",\r\n minWidth: \"unset\",\r\n whiteSpace: \"nowrap\",\r\n\r\n \"&.Mui-selected\": {\r\n color: \"#0e0c0b\",\r\n fontWeight: 700,\r\n },\r\n },\r\n\r\n tabCount: {\r\n padding: \"2px 3px\",\r\n borderRadius: \"6px\",\r\n border: \"1px solid #0E0C0BE6\",\r\n color: \"#0E0C0B\",\r\n },\r\n};\r\n","import \"./index.scss\";\r\nimport { Box, CircularProgress, IconButton, Tab, Tabs } from \"@mui/material\";\r\nimport { CraftTableOptionsProps } from \"../../types/table-options\";\r\nimport SettingsOutlinedIcon from \"@mui/icons-material/SettingsOutlined\";\r\nimport { settingsOptionsProps } from \"../../types/table\";\r\nimport { tableTabsStyles } from \"./styles\";\r\nimport { useMemo } from \"react\";\r\nimport { SettingIcon } from \"../../../assets/svg\";\r\n\r\ninterface TabDataProps {\r\n tab_value: string | null;\r\n tab_value_count: string | number;\r\n}\r\n\r\ninterface TableTabsProps {\r\n loading?: boolean;\r\n tabsData?: TabDataProps[];\r\n activeTab?: string;\r\n tableStates: CraftTableOptionsProps;\r\n onClick: (state: string) => void;\r\n columns?: any[];\r\n settingsOptions?: settingsOptionsProps;\r\n}\r\n\r\nexport function TableTabs({\r\n loading = false,\r\n tabsData = [],\r\n activeTab = \"All\",\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) => ({ ...prev, pageIndex: 0 }));\r\n };\r\n\r\n // Normalize tab_value to uppercase for display + logic\r\n const normalizedTabs = useMemo(() => {\r\n return tabsData\r\n ?.filter((tab) => tab.tab_value !== null)\r\n ?.map((tab) => ({\r\n ...tab,\r\n tab_value: tab.tab_value,\r\n }));\r\n }, [tabsData]);\r\n\r\n const defaultTab = useMemo(() => {\r\n return (\r\n normalizedTabs.find((t) => t.tab_value === \"All\")?.tab_value ||\r\n normalizedTabs[0]?.tab_value ||\r\n \"\"\r\n );\r\n }, [normalizedTabs]);\r\n\r\n const selectedTab = activeTab || defaultTab;\r\n\r\n return (\r\n <Box display=\"flex\" alignItems=\"center\" justifyContent=\"flex-start\">\r\n {/* Layout settings icon */}\r\n {settingsOptions?.showIcon && (\r\n <IconButton\r\n onClick={settingsOptions?.onClick}\r\n sx={{ zIndex: 1000, mx: 0 }}\r\n >\r\n <SettingIcon />\r\n </IconButton>\r\n )}\r\n\r\n {/* Tabs */}\r\n <Tabs\r\n value={selectedTab}\r\n onChange={(_, newValue) => handleTabClick(newValue)}\r\n variant=\"scrollable\"\r\n scrollButtons=\"auto\"\r\n slotProps={{ indicator: { sx: { display: \"none\" } } }}\r\n sx={tableTabsStyles.tabs}\r\n >\r\n {normalizedTabs.map(({ tab_value, tab_value_count }) => {\r\n const isSelected = activeTab === tab_value;\r\n\r\n return (\r\n <Tab\r\n key={tab_value}\r\n value={tab_value}\r\n label={\r\n <Box display=\"flex\" alignItems=\"center\" gap={1}>\r\n <Box>{tab_value}</Box>\r\n <Box\r\n sx={{\r\n ...tableTabsStyles.tabCount,\r\n ...(isSelected && {\r\n // backgroundColor: \"#ced3da\",\r\n // borderColor: \"#ced3da\",\r\n backgroundColor: \"#000\",\r\n color: \"#fff\",\r\n fontWeight: \"500\",\r\n }),\r\n }}\r\n >\r\n {tab_value_count == 0\r\n ? \"0\"\r\n : String(tab_value_count).padStart(2, \"0\")}\r\n </Box>\r\n </Box>\r\n }\r\n sx={tableTabsStyles.tab}\r\n />\r\n );\r\n })}\r\n </Tabs>\r\n </Box>\r\n );\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","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 } 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\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 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 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 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 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","// !! 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 >\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 >\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 = columnsData?.operation_list[attribute?.data_type];\r\n\r\n const defaultValue = attribute.data_type === \"multiselect\" ? [] : \"\";\r\n\r\n const defaultOperator = dropdownOptions?.[0]?.value || \"\";\r\n\r\n const matchingDropdownList =\r\n columnsData?.operation_list[attribute.data_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?.data_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: `calc(100vh - 440px)`,\r\n overflowY: \"auto\",\r\n width: \"100%\",\r\n ...filterStyles.scrollbarCustom,\r\n }}\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\n// import { CloseIcon, DeleteIcon } from \"../../../../../assets/svg\";\r\n// import {\r\n// FilterColumnsDataProps,\r\n// FilterComponentOptions,\r\n// FilterDropdownDataProps,\r\n// FilterMasterStateProps,\r\n// FilterStateProps,\r\n// } from \"../../../../types/filter\";\r\n// import { Controller, useForm } from \"react-hook-form\";\r\n// import React, { useEffect, useMemo, useCallback } from \"react\";\r\n// import FormDropdown from \"./components/Dropdown\";\r\n// import { CraftTableOptionsProps } from \"../../../../types/table-options\";\r\n// import FilterCriteria from \"./components/Filter-criteria\";\r\n// import CustomSearch from \"../search\";\r\n// import { customDebounce } from \"../../../../libs/utils/debounce\";\r\n// import { filterFormStyles } from \"../../style\";\r\n// import { onFilterChangeFunctionProps } from \"../../../../types/common\";\r\n// import { resolveFilterInput } from \"./utils/filter-date-input-resolver\";\r\n\r\n// interface 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\n// const 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// setSavedFilterModalOpen,\r\n// setDeleteFilterModalOpen,\r\n// onChangeFunction,\r\n// filterComponentOptions,\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// setSavedFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;\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 { 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\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// <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// </Box>\r\n// )}\r\n\r\n// <Box\r\n// className=\"filter-criteria-form\"\r\n// sx={filterFormStyles.formFlexContainer}\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// });\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// setSavedFilterModalOpen && setSavedFilterModalOpen(true);\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\n// export default FilterForm;\r\n\r\n// !! PLEASE DO NOT DELETE THIS COMMENT BLOCK !!\r\nimport {\r\n Box,\r\n Button,\r\n FormControl,\r\n IconButton,\r\n TextField,\r\n Typography,\r\n} 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 FormTextfield from \"./components/Textfield\";\r\nimport React, { useEffect, useMemo, useCallback } from \"react\";\r\nimport FormDatePicker from \"./components/Date\";\r\nimport FormDropdown from \"./components/Dropdown\";\r\nimport FormMultiSelect from \"./components/Multi-Select\";\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\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 setSavedFilterModalOpen,\r\n setDeleteFilterModalOpen,\r\n onChangeFunction,\r\n filterComponentOptions,\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 setSavedFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;\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 { 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\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 <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 </Box>\r\n )}\r\n\r\n <Box\r\n className=\"filter-criteria-form\"\r\n sx={filterFormStyles.formFlexContainer}\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 string\r\n ] as\r\n | { value: string | string[]; operator: string }\r\n | undefined;\r\n\r\n console.log(\"fieldValue:\", fieldValue);\r\n\r\n const operator = fieldValue?.operator;\r\n console.log(\"Operator\", operator);\r\n\r\n // Operators that should show a Date Picker\r\n const 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\n const showDatePicker =\r\n filter?.filter_attribute_data_type === \"date\" &&\r\n operator &&\r\n dateAllowedOperators.includes(operator);\r\n\r\n // Should textfield shown instead for date?\r\n // const showTextInsteadOfDate =\r\n // !operator ||\r\n // !dateAllowedOperators.includes(operator);\r\n\r\n // Now render exactly same logic except date override\r\n if (\r\n filter?.filter_attribute_data_type === \"text\" ||\r\n filter?.filter_attribute_data_type === \"number\"\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 if (filter?.filter_attribute_data_type === \"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 LOGIC\r\n if (showDatePicker) {\r\n console.log(\"Inside Date\", showDatePicker);\r\n return (\r\n <FormDatePicker\r\n filter={filter}\r\n control={control}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n );\r\n } else {\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 // if (showTextInsteadOfDate) {\r\n // console.log(\r\n // \"Inside Show text\",\r\n // showTextInsteadOfDate\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 if (\r\n filter?.filter_attribute_data_type === \"select\"\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 />\r\n );\r\n }\r\n\r\n if (\r\n filter?.filter_attribute_data_type ===\r\n \"multiselect\"\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 />\r\n );\r\n }\r\n\r\n // if (\r\n // filter?.filter_attribute_data_type === \"radio\"\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 // />\r\n // );\r\n // }\r\n\r\n // if (\r\n // filter?.filter_attribute_data_type === \"checkbox\"\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 // />\r\n // );\r\n // }\r\n\r\n return <FormControl fullWidth size=\"small\" />;\r\n })()}\r\n </Box>\r\n\r\n {/* <Box>\r\n {filter?.filter_attribute_data_type === \"text\" ||\r\n filter?.filter_attribute_data_type === \"number\" ? (\r\n <FormTextfield\r\n filter={filter}\r\n control={control}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n ) : filter?.filter_attribute_data_type === \"year\" ? (\r\n <FormDatePicker\r\n filter={filter}\r\n control={control}\r\n views={[\"year\"]}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n ) : filter?.filter_attribute_data_type === \"date\" ? (\r\n <FormDatePicker\r\n filter={filter}\r\n control={control}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n ) : filter?.filter_attribute_data_type ===\r\n \"select\" ? (\r\n <FormMultiSelect\r\n filter={filter}\r\n control={control}\r\n dropdownData={dropdownData}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n ) : filter?.filter_attribute_data_type ===\r\n \"multiselect\" ? (\r\n <FormMultiSelect\r\n filter={filter}\r\n control={control}\r\n dropdownData={dropdownData}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n ) : filter?.filter_attribute_data_type === \"radio\" ? (\r\n <FormMultiSelect\r\n filter={filter}\r\n control={control}\r\n dropdownData={dropdownData}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n ) : filter?.filter_attribute_data_type ===\r\n \"checkbox\" ? (\r\n <FormMultiSelect\r\n filter={filter}\r\n control={control}\r\n dropdownData={dropdownData}\r\n onValueChange={updateFiltersFromForm}\r\n />\r\n ) : (\r\n <FormControl fullWidth size=\"small\" />\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 setSavedFilterModalOpen && setSavedFilterModalOpen(true);\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 setSavedFilterModalOpen,\r\n onChangeFunction,\r\n filterComponentOptions,\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 setSavedFilterModalOpen={setSavedFilterModalOpen}\r\n dropdownData={dropdownData}\r\n onChangeFunction={onChangeFunction}\r\n filterComponentOptions={filterComponentOptions}\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 setSavedFilterModalOpen,\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 setSavedFilterModalOpen?: React.Dispatch<React.SetStateAction<boolean>>;\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 },\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 setSavedFilterModalOpen={setSavedFilterModalOpen}\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 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 { DeleteIcon, EditIcon } from \"../../../../assets/svg\";\r\nimport SavedFilterEditComponent from \"./saved-edit-filter\";\r\nimport { filterStyles } from \"../style\";\r\nimport { CheckBox } from \"../../../../assets/svg\";\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 setSavedFilterModalOpen,\r\n tabValue,\r\n onChangeFunction,\r\n filterComponentOptions,\r\n}: FilterFormComponentProps) => {\r\n const { filters, filterMaster, setFilterMaster, setFilterToDelete } =\r\n tableStates;\r\n const [searchTerm, setSearchTerm] = useState<string>(\"\");\r\n\r\n // reset savedFilterEditValue when component unmounts\r\n useEffect(() => {\r\n return () => {\r\n const editModeFromTabOptions =\r\n filterComponentOptions?.tabOptions?.savedFilter?.editMode;\r\n if (!editModeFromTabOptions) {\r\n setEditMode && setEditMode(false);\r\n setFilterMaster(\r\n (prev) =>\r\n ({\r\n ...prev,\r\n saved_filters: {\r\n ...prev?.attributes,\r\n selectedId: \"\",\r\n selectedName: \"\",\r\n selectedCode: \"\",\r\n },\r\n } as FilterMasterStateProps)\r\n );\r\n }\r\n };\r\n }, []);\r\n\r\n const handleListItemClick = (filter: FilterOperationListProps) => {\r\n const newFilterMasterState = {\r\n ...filterMaster,\r\n saved_filters: {\r\n ...filterMaster?.attributes,\r\n selectedId: filter?.value,\r\n selectedName: filter?.label,\r\n selectedCode: filter?.code,\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(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 // setEditfilter state on edit icon click\r\n setEditMode && setEditMode(true);\r\n setFilterToDelete(filter);\r\n };\r\n\r\n const handleAppyFilter = (filter: FilterOperationListProps) => {\r\n const newFilterMasterState = {\r\n ...filterMaster,\r\n saved_filters: {\r\n ...filterMaster?.attributes,\r\n selectedId: filter?.value,\r\n selectedName: filter?.label,\r\n selectedCode: filter?.code,\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(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\r\n const renderList = () => (\r\n <>\r\n <CustomSearch\r\n value={searchTerm}\r\n onChange={setSearchTerm}\r\n className=\"search-input\"\r\n />\r\n\r\n {columnsData?.saved_filter?.length === 0 ? (\r\n <Typography sx={{ mt: 2 }}>No saved filters yet.</Typography>\r\n ) : (\r\n <List\r\n sx={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 1,\r\n mt: 2,\r\n }}\r\n >\r\n {columnsData?.saved_filter\r\n ?.filter((filter) =>\r\n filter.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 border:\r\n filter?.value ===\r\n tableStates?.filterMaster?.saved_filters?.selectedId\r\n ? `3px solid #7a5af8`\r\n : \"1px solid #C5C5C5\",\r\n borderRadius: \"8px\",\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={() => handleAppyFilter(filter)}\r\n >\r\n {filter?.value ===\r\n tableStates?.filterMaster?.saved_filters?.selectedId && (\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n cursor: \"pointer\",\r\n color: \"green\",\r\n rounded: \"full\",\r\n }}\r\n >\r\n <CheckBox />\r\n </Box>\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\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=\"saved-filter-component-wrapper\">\r\n {/* Render search input and list */}\r\n {!editMode && renderList()}\r\n\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 setSavedFilterModalOpen={setSavedFilterModalOpen}\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}: 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.data_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.data_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 setSavedFilterModalOpen,\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 setSavedFilterModalOpen={setSavedFilterModalOpen}\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 setSavedFilterModalOpen={setSavedFilterModalOpen}\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 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\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}: 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 [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 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 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\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 selectedId: \"\",\r\n selectedName: \"\",\r\n selectedCode: \"\",\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 setSavedFilterModalOpen={setSaveFilterModalOpen}\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 setSavedFilterModalOpen={setSaveFilterModalOpen}\r\n filterComponentOptions={finalComponentOptions}\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 setSavedFilterModalOpen={setSaveFilterModalOpen}\r\n filterComponentOptions={finalComponentOptions}\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 />\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\r\n const newFilterMasterState = {\r\n ...filterMaster,\r\n saved_filters: {\r\n ...filterMaster?.attributes,\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 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?.attributes,\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 </Box>\r\n );\r\n}\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: 1,\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 \"&.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 \"&.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 sx={{ p: 2, zIndex: 10 }}>\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 = 0,\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 severity=\"info\">{message}</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\n\r\nconst QuickTab = ({\r\n filterSettingStates,\r\n columnsData,\r\n tabsApiData,\r\n tabsApiDataLoading,\r\n}: SettingsQuickTabProps) => {\r\n const { settingsData, setSettingsData, saveButtonError, setSaveButtonError } =\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\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: 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 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 } 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 }, [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 const showListValues = quickTabStates?.show_list || [];\r\n const hideListValues = quickTabStates?.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 // 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 oldIndex = newHideList.findIndex((i) => i.value === active.id);\r\n const newIndex = newHideList.findIndex((i) => i.value === over.id); //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.findIndex((i) => i.value === active.id); //newShowList.indexOf(String(active.id));\r\n const newIndex = newShowList.findIndex((i) => i.value === over.id); //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 === \"tabs\") {\r\n if (newShowList.length >= 5) return; // prevent overflow\r\n // Move from hide to show\r\n\r\n const idx = newHideList.findIndex((i) => i.value === String(active.id)); //newHideList.indexOf(String(active.id));\r\n if (idx !== -1) {\r\n newHideList.splice(idx, 1);\r\n newShowList.push({\r\n value: String(active.id),\r\n label:\r\n tabsApiData?.find((i) => i.value === String(active.id))?.label ??\r\n \"\",\r\n });\r\n }\r\n } else if (currentContainer === \"tabs\" && overContainer === \"list\") {\r\n // Move from show to hide\r\n const idx = newShowList.findIndex((i) => i.value === String(active.id)); //newShowList.indexOf(String(active.id));\r\n if (idx !== -1) {\r\n newShowList.splice(idx, 1);\r\n newHideList.push({\r\n value: String(active.id),\r\n label:\r\n tabsApiData?.find((i) => i.value === String(active.id))?.label ??\r\n \"\",\r\n });\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) =>\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 ...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 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 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.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 // Move from show_list to hide_list\r\n const index = toShowList.indexOf(item);\r\n if (index > -1) {\r\n toShowList.splice(index, 1);\r\n toHideList.push(item);\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 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 }))\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: 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 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%\"}\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 { 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}\r\n\r\nconst ColumnTab = ({ filterSettingStates, columnsData }: 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 columnsData?.column_list?.map((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 && isTabWiseEmpty) {\r\n const mappedTabs: TabData[] =\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\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n column: {\r\n ...prev.column,\r\n tabs: mappedTabs,\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 getCurrentLists = () => {\r\n if (settingsColumnState?.isDefault) {\r\n return {\r\n showList: settingsColumnState.show_list || [],\r\n hideList: settingsColumnState.hide_list || [],\r\n };\r\n } else {\r\n const currentTab = settingsColumnState?.tabs?.[selectedTabIndex];\r\n return {\r\n showList: currentTab?.show_list || [],\r\n hideList: currentTab?.hide_list || [],\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 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 };\r\n\r\n const handleHideAll = () => {\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 };\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%\"}\r\n position=\"absolute\"\r\n color=\"#088AB2\"\r\n top={2}\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\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 // if sorting state is empty, initialize once\r\n if (!sortingTabState || Object.keys(sortingTabState).length === 0) {\r\n setSettingsData((prev) => ({\r\n ...prev,\r\n sorting: { isDefault: true, sortby: emptySortBy },\r\n }));\r\n return; // ✅ prevent further execution\r\n }\r\n\r\n // if sortby is missing or empty\r\n if (!sortingTabState?.sortby || sortingTabState?.sortby.length === 0) {\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 }\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 = sortingTabState?.tabs?.findIndex(\r\n (tab) => tab?.tab_name === activeTab\r\n );\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 const tabSortedList = useMemo(() => {\r\n return isSortingDefault\r\n ? sortingTabState?.sortby\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 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: columnsData || [],\r\n hideList: columnTabState?.hide_list || [],\r\n };\r\n } else {\r\n const currentTab = columnTabState?.tabs?.[activeTabIndex || 0];\r\n return {\r\n showList: columnsData || [],\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 { 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 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 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 show,\r\n filterSettingStates,\r\n onClose,\r\n columnsData,\r\n columnsDataLoading,\r\n quickTabAttributes,\r\n quickTabAttributesLoading,\r\n sortingTabAttributes,\r\n sortingTabAttributesLoading,\r\n tabsApiData,\r\n tabsApiDataLoading,\r\n onSaveSettingsData,\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\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 : null;\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 />\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 />\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 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 { 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 {\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"],"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","SettingIcon","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","useOutsideClick","handler","useEffect","handleClickOutside","event","current","contains","target","addEventListener","removeEventListener","useFullscreenPopoverContainer","isFullscreen","setIsFullscreen","useState","fullscreenElement","setContainer","undefined","handleFullscreenChange","el","ViewMore","compactMode","onCompactToggle","onFullscreenToggle","tableStates","onClose","fullscreenContainer","wrapColumns","setWrapColumns","MUISwitch","checked","all_wrap","onChange","prev","Select","value","e","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","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","position","top","TextField","placeholder","onKeyDown","key","InputProps","startAdornment","InputAdornment","querySelector","focus","edge","endAdornment","CloseRoundedIcon","Topbar","isCompactTable","fullscreenToggle","setIsCompactTable","paginationComponent","topbarOptions","onFilterButtonClick","sortAnchorEl","setSortAnchorEl","groupBy","setGroupBy","showColumnHiding","setShowColumnHiding","layoutAnchorEl","setLayoutAnchorEl","setSelectedLayout","columnAnchorEl","setColumnAnchorEl","setShowTableFilter","setViewMoreAnchorEl","leftSideComponent","rightSideComponent","showColumnToggle","showChangeLayoutToggle","showSortingToggle","showFilterToggle","showSearch","searchValue","onSearchChange","dropdownRef","handleExternalLayoutTrigger","detail","handleExternalFilterTrigger","handleExternalViewMoreTrigger","handleExternalSearchTrigger","window","viewMoreAnchorEl","isViewMoreOpen","overflowX","whiteSpace","title","customEvent","CustomEvent","dispatchEvent","_Fragment","currentTarget","mt","meta","sortingRules","setSorting","showTableFilter","filters","right","transformOrigin","onGroupByChange","DefaultPagination","rowsPerPageArray","paginationOptions","pageIndex","getState","pagination","pageCount","getPageCount","pageSize","rowCount","getRowCount","recordsRangeFirst","recordsRangeLast","Math","min","paginationView","defaultValue","page","Number","setPageIndex","textAlign","max","setPageSize","disabled","getCanPreviousPage","previousPage","TablePreviousPageIcon","getCanNextPage","nextPage","TableNextPageIcon","getColumnPinningStyles","isPinned","getIsPinned","isLastLeftPinnedColumn","getIsLastColumn","isFirstRightPinnedColumn","getIsFirstColumn","background","left","getStart","getAfter","getSize","getColumnPinningStylesBody","environments","adm_dev","crm_dev","uat","DragAlongCell","cell","isDragging","Translate","wordBreak","align","getIsPlaceholder","flexRender","getContext","axios","create","baseURL","timeout","headers","interceptors","request","use","config","token","localStorage","getItem","Authorization","error","Promise","reject","Checkbox","indeterminate","uuidv4","check","setCheck","React","isChecked","TableBody","featureOptions","NestedComponent","enableColumnReordering","enableRowSelection","getRowModel","rows","row","renderedRow","getIsSelected","getIsSomeSelected","getToggleSelectedHandler","getVisibleCells","tdProps","horizontalListSortingStrategy","getIsExpanded","Fragment","renderRow","TableHeadPin","pin","stopPropagation","TableHeadPopover","dense","ListItemButton","toggleSorting","ListItemIcon","ListItemText","primary","Switch","toggleWrapForColumn","DraggableTableHeader","enableColumnPinning","setAnchorEl","handleClose","styles","minSize","maxSize","onMouseLeave","colSpan","isPlaceholder","getCanSort","asc","getIsSorted","getCanResize","onDoubleClick","resetSize","onMouseDown","getResizeHandler","onTouchStart","getIsResizing","TableHead","stickyHeader","handleHover","getHeaderGroups","headerGroup","getIsAllRowsSelected","getIsSomeRowsSelected","toggleAllRowsSelected","striped","TableDND","modifiers","restrictToHorizontalAxis","TableWrapper","data","nestedComponent","loadingOptions","isLoading","customRenderFn","shouldHideColumn","emptyListComponent","filterOptions","Array","isArray","Error","metaColumns","setMetaColumns","updatedColumns","accessorKey","index","ctx","propName","customFn","getValue","where","defaultPinned","columnPinning","c","compactTable","tableRef","craftPaginationOptions","showPagination","paginationPosition","totalRows","craftTopbarOptions","showCompactTableToggle","viewMoreToggle","craftFeatureOptions","enableTopbar","enableSorting","enableServerSidePagination","enableServerSideSorting","enableColumnResizing","enableMultiColumnSorting","enableWordBreakAll","sorting","setPagination","rowSelection","setRowSelection","expanded","setExpanded","useReactTable","state","getCoreRowModel","onSortingChange","getSortedRowModel","manualSorting","getPaginationRowModel","onPaginationChange","manualPagination","onRowSelectionChange","columnResizeDirection","columnResizeMode","onColumnOrderChange","getExpandedRowModel","onExpandedChange","getSubRows","subRows","loadingComponent","loaderText","showFilterCondition","show","exitFullscreen","requestFullscreen","catch","err","console","component","useCraftTable","paginationPageSize","setFilters","savedFilterEditValue","setSavedFilterEditValue","filterToDelete","setFilterToDelete","filterSelectedAttributeValue","setFilterSelectedAttributeValue","filterMaster","setFilterMaster","showFilterOptions","setShowFilterOption","filterData","setFilterData","selectedFilterEntity","setSelectedFilterEntity","setColumnPinning","useCraftTableFilterSettings","showListViewSettings","setShowListViewSettings","settingsData","setSettingsData","quickTabStates","setQuickTabStates","columnTabState","setColumnTabState","sortingTabState","setSortingTabState","saveButtonError","setSaveButtonError","hasError","messages","quick_tab","tableTabsStyles","tabs","minHeight","tab","padding","textTransform","tabCount","TableTabs","loading","tabsData","activeTab","settingsOptions","CircularProgress","normalizedTabs","useMemo","tab_value","defaultTab","t","selectedTab","showIcon","mx","Tabs","_","scrollButtons","slotProps","indicator","tab_value_count","Tab","String","padStart","ConfirmModal","description","buttons","input","inputValue","setInputValue","setError","Dialog","reason","DialogTitle","marginX","paddingBottom","borderBottom","DialogContent","marginBottom","marginTop","labelClassName","required","multiline","DialogActions","button","handleButtonClick","CustomTabPanel","hidden","CustomTabs","tabItems","activeFilterIndex","handleCrossClick","tabsProps","hoveredTab","setHoveredTab","idx","isActive","isHovered","onMouseEnter","TextFieldStyles","bgcolor","borderColor","FormTextfield","control","onValueChange","Controller","name","filter_attribute_name","filter_value","render","filter_attribute_data_type","FormDatePicker","views","isRange","filter_operator","isRelativeToToday","LocalizationProvider","dateAdapter","AdapterDateFns","moment","format","toDate","todayDate","fromDate","DatePicker","date","formatted","textField","FormDropdown","setValue","dropdownList","FormControl","disableUnderline","newOperator","oldOperator","shouldDirty","filterStyles","scrollbarCustom","overflowY","pr","filterContainer","filterMainHeader","filterMainComponentWrapper","filterFormStyles","formEditModeStyle","formFlexContainer","formListItem","formListSectionHeader","formListItemHeader","formListItemHeaderName","formListItemHeaderDropdown","CustomSearch","search","setSearch","val","EmptyList","FilterCriteriaEntityList","filterComponentOptions","searchTerm","setSearchTerm","isSingleEntity","tabOptions","allEntities","mainFilter","entityList","entitiesToShow","filterEntityTypes","f","filter_entity_type","entity","includes","toLowerCase","my","ListItem","handleSelectEntity","Loader","paddingBlock","FilterCriteriaList","handleAddFilter","shouldShowCloseButton","some","entityWiseCriteria","isPending","filteredEntities","isAlreadySelected","filter_attribute","attribute_key","FilterCriteria","columnsData","onChangeFunction","FilterButton","styled","theme","palette","main","dark","filterButtonRef","filterButtonWidth","setWidth","resizeObserver","ResizeObserver","clientWidth","observe","disconnect","useElementWidth","isSingleFilter","disableButton","ClickAwayListener","onClickAway","Paper","maxHeight","attribute","dropdownOptions","operation_list","data_type","defaultOperator","matchingDropdownList","newSelectedFilter","element_type","datasource_list","dropdown_list","filter_entity_name","newFilterState","FilterForm","dropdownData","handleRemoveFilter","editMode","setSavedFilterModalOpen","setDeleteFilterModalOpen","showSaveButton","showClearAllButton","customButtons","filterName","saved_filters","selectedName","defaultValues","filterValues","reduce","acc","curr","operator","dummyChange","watch","reset","unregister","useForm","mode","resetOptions","keepDirtyValues","keepErrors","formValues","debouncedUpdateFilters","updatedFilters","updateFiltersFromForm","filterValue","groupedFilters","push","handleRemoveEntityType","entityType","remainingFilters","onSubmit","preventDefault","inputRef","entries","overflow","reverse","marginLeft","dummy","fieldValue","log","showDatePicker","activeFilterTabIndex","btn","MainFilter","mainBoxStyles","newFilters","SavedFilterEditComponent","setEditMode","showBackButton","savedFilter","selectedId","selectedCode","BackArrow","SavedFilter","tabValue","editModeFromTabOptions","saved_filter","visibility","newFilterMasterState","code","radio","handleAppyFilter","rounded","handleListItemClick","AttributesFilter","selectedAttribute","selected","currentRadio","handleSingleRadioSelect","selectedAttr","matchingColumn","column_list","updatedRadio","newFilter","exists","updatedFilterMaster","selectedAttributeOptions","attributeKey","displayEmpty","renderValue","option","FormControlLabel","Radio","deepMergeObjects","source","output","SingleFilterRendering","showFilter","commonProps","editProps","attributesProps","TableFilter","onDeleteFilter","onSaveFilter","onUpdateFilter","setTabValue","saveFilterModalOpen","setSaveFilterModalOpen","deleteFilterModalOpen","finalComponentOptions","showMainHeader","mainHeaderTitle","showTabs","showMainFilter","showSavedFilter","showAttributesFilter","tabMapping","filterNameInput","savedFilterProps","tabType","newFilterMaster","clearAttributeRadio","patches","isRuleEngine","recordFilterComponentProps","edit","save","secondary","isSingleSavedFilterEditMode","delete","verticalTabStyles","mainTabsContainer","mainTabContainer","mainTabLabel","horizontalTabStyles","CustomVerticalTabs","orientation","DraggableListItem","containerId","DragIndicator","mr","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","filterSettingStates","tabsApiData","currentQuickAttribute","setCurrentQuickAttribute","hide_list","show_list","showList","isValidShowList","ERROR_CODE","showListValues","hideListValues","filteredListValues","handleItemToggle","fromContainerId","toShowList","toHideList","i","splice","enableDND","currentContainer","overContainer","newShowList","newHideList","removed","currentShowList","currentHideList","availableSlots","limitedHideList","slice","isAllSelected","isCombineOther","ColumnTab","selectedTabIndex","setSelectedTabIndex","settingsColumnState","isColumnDefault","isDefault","isStateEmpty","isDefaultEmpty","isTabWiseEmpty","mappedColumns","mappedTabs","tab_name","hasOtherMessages","hideList","currentTab","getCurrentLists","visible","moved","updatedTabs","hasShowListQuickTabs","activeItem","list","Sorting","setActiveTab","isSortingDefault","sortby","emptySortBy","order","PointerSensor","activeTabIndex","tabSortedList","updateSortList","handleDNDDropdownChange","showAddSortButton","stateLength","isAddSortDisabled","hasEmptyColumn","reordered","columnKey","CustomDialog","DialogTransition","forwardRef","Slide","CustomButton","customSx","SETTINGS_TABS","KANBAN_SETTINGS_TABS","LANE_SELECTS","Lane","sortingOptions","charAt","itemId","lane","opt","showSubLane","showColorColumns","GroupBy","QuickFilterSettings","view","columnsDataLoading","quickTabAttributes","quickTabAttributesLoading","sortingTabAttributes","sortingTabAttributesLoading","onSaveSettingsData","hasAPIData","slots","Column","copyColumnTabState","copySortingTabState","kanbanStyles","syncingStyle","topHeader","pt","laneHeader","badge","swimlaneWrapperStyle","columnStyle","stageStyle","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","subSectionAccordion","subSectionCountContainer","cardsContainer","settingStyle","swimLaneAccordionStyle","subSectionHeaderContainer","COLOR_CONSTANTS","darkColor","Kanban","metaData","KanbanCardComponent","showSettings","onOpenSettings","expandedPanels","setExpandedPanels","Active","subLaneExpanded","setSubLaneExpanded","swim_lanes","initial","swim_lane","sub_lanes","sub_lane","lane_id","getLeadCount","laneId","seenLeadIds","Set","count","swimLane","subLane","lead","stage_id","has","add","SettingsOutlinedIcon","lanes","Accordion","panel","isExpanded","AccordionSummary","expandIcon","ArrowDropDownIcon","ml","lead_status_id","AccordionDetails","pl","sub_section","subLaneKey","toggleSubLane","subLaneId","borderLeft","ExpandMoreIcon","stage_group_id","card","cardData"],"mappings":"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","x_google_ignoreList":[0]}