dinocollab-core 2.2.10 → 2.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -22
- package/dist/data-surface/index.js +1 -1
- package/dist/filter-bar/index.js +1 -1
- package/dist/src/data-surface/index.create.js +1 -1
- package/dist/src/data-surface/index.create.js.map +1 -1
- package/dist/src/data-surface/index.dino.js +1 -1
- package/dist/src/data-surface/index.dino.js.map +1 -1
- package/dist/src/data-surface/types.js +1 -1
- package/dist/src/data-surface/types.js.map +1 -1
- package/dist/src/data-surface/ui.units.js +1 -1
- package/dist/src/data-surface/view-grid/hooks.js +1 -1
- package/dist/src/data-surface/view-grid/hooks.js.map +1 -1
- package/dist/src/data-surface/view-grid/index.js +1 -1
- package/dist/src/data-surface/view-grid/index.js.map +1 -1
- package/dist/src/data-surface/view-grid/styleds.js +1 -1
- package/dist/src/data-surface/view-grid/styleds.js.map +1 -1
- package/dist/src/data-surface/view-list/hooks.js +1 -1
- package/dist/src/data-surface/view-list/hooks.js.map +1 -1
- package/dist/src/data-surface/view-list/index.js +1 -1
- package/dist/src/data-surface/view-list/index.js.map +1 -1
- package/dist/src/data-surface/view-list/styled.js +1 -1
- package/dist/src/data-surface/view-list/styled.js.map +1 -1
- package/dist/src/data-surface/view-list/types.js.map +1 -1
- package/dist/src/data-surface/view-switch-transition.js.map +1 -1
- package/dist/src/filter-bar/components/chip-viewer.js +1 -1
- package/dist/src/filter-bar/components/chip-viewer.js.map +1 -1
- package/dist/src/filter-bar/components/filter-sort.js +1 -1
- package/dist/src/filter-bar/components/filter-sort.js.map +1 -1
- package/dist/src/filter-bar/components/filter-summary.js +1 -1
- package/dist/src/filter-bar/components/filter-summary.js.map +1 -1
- package/dist/src/filter-bar/components/{units.js → icons.js} +1 -1
- package/dist/src/filter-bar/components/{units.js.map → icons.js.map} +1 -1
- package/dist/src/filter-bar/components/popper-custom.js +1 -1
- package/dist/src/filter-bar/components/popper-custom.js.map +1 -1
- package/dist/src/filter-bar/components/ui.units.js +2 -0
- package/dist/src/filter-bar/components/ui.units.js.map +1 -0
- package/dist/src/filter-bar/convert-to-graphql.js +1 -1
- package/dist/src/filter-bar/convert-to-graphql.js.map +1 -1
- package/dist/src/filter-bar/index.create.js +1 -1
- package/dist/src/filter-bar/index.create.js.map +1 -1
- package/dist/src/filter-bar/index.dino.js +1 -1
- package/dist/src/filter-bar/index.dino.js.map +1 -1
- package/dist/src/filter-bar/local-filter-builder.js +2 -0
- package/dist/src/filter-bar/local-filter-builder.js.map +1 -0
- package/dist/src/filter-bar/menu/create-form-field-select-multiple.js +2 -0
- package/dist/src/filter-bar/menu/create-form-field-select-multiple.js.map +1 -0
- package/dist/src/filter-bar/menu/create-form-field-select.js +2 -0
- package/dist/src/filter-bar/menu/create-form-field-select.js.map +1 -0
- package/dist/src/filter-bar/menu/create-form-field-string.js +2 -0
- package/dist/src/filter-bar/menu/create-form-field-string.js.map +1 -0
- package/dist/src/filter-bar/menu/create.js +2 -0
- package/dist/src/filter-bar/menu/create.js.map +1 -0
- package/dist/src/form/create.form-base.js +1 -1
- package/dist/src/form/create.text-editor.js +1 -1
- package/dist/src/form/helpers.js +1 -1
- package/dist/src/table/create.table.js +1 -1
- package/dist/src/table/csv-export-helper.js +2 -0
- package/dist/src/table/csv-export-helper.js.map +1 -0
- package/dist/src/table/custom.export-button.js +2 -0
- package/dist/src/table/custom.export-button.js.map +1 -0
- package/dist/src/table/dino.js +1 -1
- package/dist/src/table/dino.js.map +1 -1
- package/dist/src/table/toolbar-pannel.js +1 -1
- package/dist/src/table/toolbar-pannel.js.map +1 -1
- package/dist/src/utils/helpers.js +1 -1
- package/dist/types/data-surface/index.create.d.ts +22 -6
- package/dist/types/data-surface/index.dino.d.ts +2 -0
- package/dist/types/data-surface/types.d.ts +5 -0
- package/dist/types/data-surface/view-grid/hooks.d.ts +6 -0
- package/dist/types/data-surface/view-grid/styleds.d.ts +2 -0
- package/dist/types/data-surface/view-grid/types.d.ts +17 -3
- package/dist/types/data-surface/view-list/hooks.d.ts +6 -0
- package/dist/types/data-surface/view-list/styled.d.ts +2 -0
- package/dist/types/data-surface/view-list/types.d.ts +17 -3
- package/dist/types/data-surface/view-switch-transition.d.ts +1 -1
- package/dist/types/filter-bar/components/chip-viewer.d.ts +1 -3
- package/dist/types/filter-bar/components/popper-custom.d.ts +2 -2
- package/dist/types/filter-bar/components/ui.units.d.ts +22 -0
- package/dist/types/filter-bar/convert-to-graphql.d.ts +8 -0
- package/dist/types/filter-bar/index.create.d.ts +1 -1
- package/dist/types/filter-bar/index.d.ts +1 -0
- package/dist/types/filter-bar/index.dino.d.ts +8 -1
- package/dist/types/filter-bar/local-filter-builder.d.ts +39 -0
- package/dist/types/filter-bar/menu/create-form-field-select-multiple.d.ts +13 -0
- package/dist/types/filter-bar/menu/create-form-field-select.d.ts +17 -0
- package/dist/types/filter-bar/menu/create-form-field-string.d.ts +10 -0
- package/dist/types/filter-bar/{components/filter-menu.d.ts → menu/create.d.ts} +2 -2
- package/dist/types/filter-bar/{components/filter-menu.types.d.ts → menu/types.d.ts} +6 -1
- package/dist/types/table/csv-export-helper.d.ts +20 -0
- package/dist/types/table/custom.export-button.d.ts +8 -0
- package/dist/types/table/dino.d.ts +1 -0
- package/dist/types/table/index.d.ts +1 -0
- package/dist/types/table/toolbar-pannel.d.ts +2 -0
- package/package.json +1 -1
- package/dist/src/filter-bar/components/filter-menu.js +0 -2
- package/dist/src/filter-bar/components/filter-menu.js.map +0 -1
- package/dist/src/filter-bar/components/filter-menu.units.js +0 -2
- package/dist/src/filter-bar/components/filter-menu.units.js.map +0 -1
- package/dist/types/filter-bar/components/filter-menu.units.d.ts +0 -18
- /package/dist/types/filter-bar/components/{units.d.ts → icons.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-summary.js","sources":["../../../../src/filter-bar/components/filter-summary.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useContext, useMemo } from 'react'\r\nimport { Box, Button, buttonClasses, Collapse, IconButton, iconButtonClasses, styled } from '@mui/material'\r\nimport ClearAllIcon from '@mui/icons-material/ClearAll'\r\nimport { KeySpecial } from '../types'\r\nimport { useFilterActions } from '../hooks'\r\nimport { mapSpecialLabel } from '../helpers'\r\nimport { createChipViewers } from './chip-viewer'\r\nimport { FilterBarContext } from '../index.context'\r\n// types\r\nimport type { FC } from 'react'\r\nimport type { TFieldStore, TFieldValid } from '../types'\r\nimport type { IFilterBarContext } from '../index.context'\r\nimport type { IChipViewerItem, TChipViewerGroup } from './chip-viewer'\r\nimport type { IFilterSummaryConfig, IFilterSummaryProps, TFieldSummaryConfigs } from './filter-summary.types'\r\n\r\nfunction mapFilterStateToFilterData<T>(config: IFilterSummaryConfig<T>, store?: TFieldStore<T>): TChipViewerGroup<T>[] {\r\n const { fields, enableQuickSearch = true } = config\r\n\r\n // Ensure 'quickSearch' is always included in the summary, even if it's not in the config or store\r\n // If enableQuickSearch is false, it will not be added to the summary or removed if it exists in the config\r\n const mergedConfig: TFieldSummaryConfigs<T> = { ...fields }\r\n const qsKey = KeySpecial.quickSearch\r\n if (enableQuickSearch) {\r\n if (!mergedConfig[qsKey]) {\r\n mergedConfig[qsKey] = { label: mapSpecialLabel[qsKey] }\r\n } else if (!mergedConfig[qsKey]?.label) {\r\n mergedConfig[qsKey] = { ...mergedConfig[qsKey], label: mapSpecialLabel[qsKey] }\r\n }\r\n } else {\r\n delete mergedConfig[qsKey]\r\n }\r\n\r\n const keys = Object.keys(store || {}) as (keyof TFieldStore<T>)[]\r\n const groups = keys.reduce<TChipViewerGroup<T>[]>((acc, key) => {\r\n const fieldConfig = mergedConfig?.[key]\r\n const label = fieldConfig?.label || key.toString()\r\n const values = store?.[key]?.values as TFieldValid[] | undefined\r\n const items = Array.isArray(values) ? values : []\r\n const summaryItems = items.filter(Boolean).map<IChipViewerItem<T>>((item) => ({ value: item.toString() }))\r\n if (summaryItems.length > 0) {\r\n acc.push({ field: key, label, items: summaryItems })\r\n }\r\n return acc\r\n }, [])\r\n const finalGroups = groups.sort((a, b) => {\r\n if (a.field === qsKey) return -1\r\n if (b.field === qsKey) return 1\r\n return 0\r\n })\r\n return finalGroups\r\n}\r\n\r\nexport function createFilterSummary<T>(config: IFilterSummaryConfig<T>) {\r\n const classes = filterSummaryClasses\r\n const ChipViewers = createChipViewers<T>()\r\n\r\n const FilterSummary: FC<IFilterSummaryProps<T>> = (props) => {\r\n const context = useContext(FilterBarContext) as IFilterBarContext<T>\r\n const { filterState } = context\r\n const filterActions = useFilterActions<T>(context)\r\n\r\n const filterData = useMemo(() => {\r\n return mapFilterStateToFilterData(config, filterState.storeFilter)\r\n }, [filterState, config])\r\n\r\n // Old logic to calculate filterData, now moved to useMemo above\r\n // if (filterData.length === 0) return null\r\n\r\n return (\r\n <Collapse in={filterData.length > 0} timeout='auto' unmountOnExit>\r\n <FilterSummaryStyled className={classes.root} sx={props.sx}>\r\n <div className={classes.scrollHorizontal}>\r\n <ChipViewers.Group label='Filters' value={filterData} placement='horizontal' onRemove={filterActions.removeFilterByFieldValue} />\r\n </div>\r\n <Box>\r\n <Button\r\n size='small'\r\n color='error'\r\n variant='text'\r\n onClick={filterActions.clearAllFilters}\r\n className={classes.buttonClearAll}\r\n startIcon={<ClearAllIcon />}\r\n aria-label='Clear all filters'\r\n >\r\n Clear All\r\n </Button>\r\n <IconButton\r\n size='small'\r\n color='error'\r\n onClick={filterActions.clearAllFilters}\r\n className={classes.buttonClearAll}\r\n aria-label='Clear all filters'\r\n >\r\n <ClearAllIcon />\r\n </IconButton>\r\n </Box>\r\n </FilterSummaryStyled>\r\n </Collapse>\r\n )\r\n }\r\n\r\n return FilterSummary\r\n}\r\n\r\nconst filterSummaryClasses = {\r\n root: 'DinoFilterSummary-root',\r\n scrollHorizontal: 'DinoFilterSummary-scrollHorizontal',\r\n fieldItem: 'DinoFilterSummary-fieldItem',\r\n fieldLabel: 'DinoFilterSummary-fieldLabel',\r\n fieldValue: 'DinoFilterSummary-fieldValue',\r\n buttonClearAll: 'DinoFilterSummary-buttonClearAll'\r\n}\r\n\r\nconst FilterSummaryStyled = styled('div')(({ theme }) => ({\r\n [`&.${filterSummaryClasses.root}`]: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n paddingLeft: theme.spacing(1),\r\n paddingRight: theme.spacing(0.5)\r\n },\r\n [`.${filterSummaryClasses.scrollHorizontal}`]: {\r\n overflowX: 'auto',\r\n overflowY: 'hidden',\r\n WebkitOverflowScrolling: 'touch',\r\n scrollbarHeight: 'thin',\r\n // The content doesn't wrap to the next line and is wider than the container, displaying a horizontal scroll bar.\r\n display: 'flex',\r\n flexWrap: 'nowrap',\r\n minWidth: 0,\r\n flex: 1,\r\n '& > *': { minWidth: 'max-content', flexShrink: 0 },\r\n // Custom scrollbar\r\n '&::-webkit-scrollbar': { height: '8px', background: 'transparent' },\r\n '&::-webkit-scrollbar-thumb': {\r\n background: theme.palette.grey[300],\r\n borderRadius: '8px',\r\n minHeight: '8px',\r\n transition: 'background 0.2s'\r\n },\r\n '&::-webkit-scrollbar-thumb:hover': { background: theme.palette.primary.light },\r\n '&::-webkit-scrollbar-track': { background: theme.palette.grey[100], borderRadius: '8px' },\r\n // Firefox\r\n scrollbarColor: `${theme.palette.grey[300]} ${theme.palette.grey[100]}`,\r\n scrollbarWidth: 'thin'\r\n },\r\n [`.${filterSummaryClasses.buttonClearAll}`]: {\r\n marginLeft: theme.spacing(1),\r\n [`&:not(.${iconButtonClasses.root})`]: {\r\n textTransform: 'none',\r\n fontWeight: 500,\r\n lineHeight: 2,\r\n padding: theme.spacing(0, 1)\r\n },\r\n [`&.${iconButtonClasses.root}`]: { display: 'none' },\r\n [theme.breakpoints.down('md')]: {\r\n [`&.${buttonClasses.root}`]: { display: 'none' },\r\n [`&.${iconButtonClasses.root}`]: { display: 'flex' }\r\n }\r\n }\r\n}))\r\n"],"names":["createFilterSummary","config","classes","filterSummaryClasses","ChipViewers","createChipViewers","props","context","useContext","FilterBarContext","filterState","filterActions","useFilterActions","filterData","useMemo","store","_mergedConfig$qsKey","fields","_config$enableQuickSe","enableQuickSearch","mergedConfig","_objectSpread","qsKey","KeySpecial","quickSearch","label","mapSpecialLabel","Object","keys","reduce","acc","key","_store$key","fieldConfig","toString","values","summaryItems","Array","isArray","filter","Boolean","map","item","value","length","push","field","items","sort","a","b","mapFilterStateToFilterData","storeFilter","_jsx","Collapse","in","timeout","unmountOnExit","children","_jsxs","FilterSummaryStyled","className","root","sx","scrollHorizontal","Group","placement","onRemove","removeFilterByFieldValue","Box","Button","size","color","variant","onClick","clearAllFilters","buttonClearAll","startIcon","ClearAllIcon","IconButton","styled","_ref","theme","_defineProperty","concat","display","alignItems","paddingLeft","spacing","paddingRight","overflowX","overflowY","WebkitOverflowScrolling","scrollbarHeight","flexWrap","minWidth","flex","flexShrink","height","background","palette","grey","borderRadius","minHeight","transition","primary","light","scrollbarColor","scrollbarWidth","marginLeft","iconButtonClasses","textTransform","fontWeight","lineHeight","padding","breakpoints","down","buttonClasses"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"filter-summary.js","sources":["../../../../src/filter-bar/components/filter-summary.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useContext, useMemo } from 'react'\r\nimport { Box, Button, buttonClasses, Collapse, IconButton, iconButtonClasses, styled } from '@mui/material'\r\nimport ClearAllIcon from '@mui/icons-material/ClearAll'\r\nimport { KeySpecial } from '../types'\r\nimport { useFilterActions } from '../hooks'\r\nimport { mapSpecialLabel } from '../helpers'\r\nimport { createChipViewers } from './chip-viewer'\r\nimport { FilterBarContext } from '../index.context'\r\n// types\r\nimport type { FC } from 'react'\r\nimport type { TFieldStore, TFieldValid } from '../types'\r\nimport type { IFilterBarContext } from '../index.context'\r\nimport type { IChipViewerItem, TChipViewerGroup } from './chip-viewer'\r\nimport type { IFilterSummaryConfig, IFilterSummaryProps, TFieldSummaryConfigs } from './filter-summary.types'\r\n\r\nfunction mapFilterStateToFilterData<T>(config: IFilterSummaryConfig<T>, store?: TFieldStore<T>): TChipViewerGroup<T>[] {\r\n const { fields, enableQuickSearch = true } = config\r\n\r\n // Ensure 'quickSearch' is always included in the summary, even if it's not in the config or store\r\n // If enableQuickSearch is false, it will not be added to the summary or removed if it exists in the config\r\n const mergedConfig: TFieldSummaryConfigs<T> = { ...fields }\r\n const qsKey = KeySpecial.quickSearch\r\n if (enableQuickSearch) {\r\n if (!mergedConfig[qsKey]) {\r\n mergedConfig[qsKey] = { label: mapSpecialLabel[qsKey] }\r\n } else if (!mergedConfig[qsKey]?.label) {\r\n mergedConfig[qsKey] = { ...mergedConfig[qsKey], label: mapSpecialLabel[qsKey] }\r\n }\r\n } else {\r\n delete mergedConfig[qsKey]\r\n }\r\n\r\n const keys = Object.keys(store || {}) as (keyof TFieldStore<T>)[]\r\n const groups = keys.reduce<TChipViewerGroup<T>[]>((acc, key) => {\r\n const fieldConfig = mergedConfig?.[key]\r\n const label = fieldConfig?.label || key.toString()\r\n const values = store?.[key]?.values as TFieldValid[] | undefined\r\n const items = Array.isArray(values) ? values : []\r\n const summaryItems = items.filter(Boolean).map<IChipViewerItem<T>>((item) => ({ value: item.toString() }))\r\n if (summaryItems.length > 0) {\r\n acc.push({ field: key, label, items: summaryItems })\r\n }\r\n return acc\r\n }, [])\r\n const finalGroups = groups.sort((a, b) => {\r\n if (a.field === qsKey) return -1\r\n if (b.field === qsKey) return 1\r\n return 0\r\n })\r\n return finalGroups\r\n}\r\n\r\nexport function createFilterSummary<T>(config: IFilterSummaryConfig<T>) {\r\n const classes = filterSummaryClasses\r\n const ChipViewers = createChipViewers<T>()\r\n\r\n const FilterSummary: FC<IFilterSummaryProps<T>> = (props) => {\r\n const context = useContext(FilterBarContext) as IFilterBarContext<T>\r\n const { filterState } = context\r\n const filterActions = useFilterActions<T>(context)\r\n\r\n const filterData = useMemo(() => {\r\n return mapFilterStateToFilterData(config, filterState.storeFilter)\r\n }, [filterState, config])\r\n\r\n // Old logic to calculate filterData, now moved to useMemo above\r\n // if (filterData.length === 0) return null\r\n\r\n return (\r\n <Collapse in={filterData.length > 0} timeout='auto' unmountOnExit>\r\n <FilterSummaryStyled className={classes.root} sx={props.sx}>\r\n <div className={classes.scrollHorizontal}>\r\n <ChipViewers label='Filters' value={filterData} placement='horizontal' onRemove={filterActions.removeFilterByFieldValue} />\r\n </div>\r\n <Box>\r\n <Button\r\n size='small'\r\n color='error'\r\n variant='text'\r\n onClick={filterActions.clearAllFilters}\r\n className={classes.buttonClearAll}\r\n startIcon={<ClearAllIcon />}\r\n aria-label='Clear all filters'\r\n >\r\n Clear All\r\n </Button>\r\n <IconButton\r\n size='small'\r\n color='error'\r\n onClick={filterActions.clearAllFilters}\r\n className={classes.buttonClearAll}\r\n aria-label='Clear all filters'\r\n >\r\n <ClearAllIcon />\r\n </IconButton>\r\n </Box>\r\n </FilterSummaryStyled>\r\n </Collapse>\r\n )\r\n }\r\n\r\n return FilterSummary\r\n}\r\n\r\nconst filterSummaryClasses = {\r\n root: 'DinoFilterSummary-root',\r\n scrollHorizontal: 'DinoFilterSummary-scrollHorizontal',\r\n fieldItem: 'DinoFilterSummary-fieldItem',\r\n fieldLabel: 'DinoFilterSummary-fieldLabel',\r\n fieldValue: 'DinoFilterSummary-fieldValue',\r\n buttonClearAll: 'DinoFilterSummary-buttonClearAll'\r\n}\r\n\r\nconst FilterSummaryStyled = styled('div')(({ theme }) => ({\r\n [`&.${filterSummaryClasses.root}`]: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n padding: theme.spacing(0, 1.5)\r\n },\r\n [`.${filterSummaryClasses.scrollHorizontal}`]: {\r\n overflowX: 'auto',\r\n overflowY: 'hidden',\r\n WebkitOverflowScrolling: 'touch',\r\n scrollbarHeight: 'thin',\r\n // The content doesn't wrap to the next line and is wider than the container, displaying a horizontal scroll bar.\r\n display: 'flex',\r\n flexWrap: 'nowrap',\r\n minWidth: 0,\r\n flex: 1,\r\n '& > *': { minWidth: 'max-content', flexShrink: 0 },\r\n // Custom scrollbar\r\n '&::-webkit-scrollbar': { height: '8px', background: 'transparent' },\r\n '&::-webkit-scrollbar-thumb': {\r\n background: theme.palette.grey[300],\r\n borderRadius: '8px',\r\n minHeight: '8px',\r\n transition: 'background 0.2s'\r\n },\r\n '&::-webkit-scrollbar-thumb:hover': { background: theme.palette.primary.light },\r\n '&::-webkit-scrollbar-track': { background: theme.palette.grey[100], borderRadius: '8px' },\r\n // Firefox\r\n scrollbarColor: `${theme.palette.grey[300]} ${theme.palette.grey[100]}`,\r\n scrollbarWidth: 'thin'\r\n },\r\n [`.${filterSummaryClasses.buttonClearAll}`]: {\r\n marginLeft: theme.spacing(1),\r\n [`&:not(.${iconButtonClasses.root})`]: {\r\n textTransform: 'none',\r\n fontWeight: 500,\r\n lineHeight: 2,\r\n padding: theme.spacing(0, 1)\r\n },\r\n [`&.${iconButtonClasses.root}`]: { display: 'none' },\r\n [theme.breakpoints.down('md')]: {\r\n [`&.${buttonClasses.root}`]: { display: 'none' },\r\n [`&.${iconButtonClasses.root}`]: { display: 'flex' }\r\n }\r\n }\r\n}))\r\n"],"names":["createFilterSummary","config","classes","filterSummaryClasses","ChipViewers","createChipViewers","props","context","useContext","FilterBarContext","filterState","filterActions","useFilterActions","filterData","useMemo","store","_mergedConfig$qsKey","fields","_config$enableQuickSe","enableQuickSearch","mergedConfig","_objectSpread","qsKey","KeySpecial","quickSearch","label","mapSpecialLabel","Object","keys","reduce","acc","key","_store$key","fieldConfig","toString","values","summaryItems","Array","isArray","filter","Boolean","map","item","value","length","push","field","items","sort","a","b","mapFilterStateToFilterData","storeFilter","_jsx","Collapse","in","timeout","unmountOnExit","children","_jsxs","FilterSummaryStyled","className","root","sx","scrollHorizontal","placement","onRemove","removeFilterByFieldValue","Box","Button","size","color","variant","onClick","clearAllFilters","buttonClearAll","startIcon","ClearAllIcon","IconButton","styled","_ref","theme","_defineProperty","concat","display","alignItems","padding","spacing","overflowX","overflowY","WebkitOverflowScrolling","scrollbarHeight","flexWrap","minWidth","flex","flexShrink","height","background","palette","grey","borderRadius","minHeight","transition","primary","light","scrollbarColor","scrollbarWidth","marginLeft","iconButtonClasses","textTransform","fontWeight","lineHeight","breakpoints","down","buttonClasses"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import{objectSpread2 as L}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as r}from"react/jsx-runtime";import{SvgIcon as e}from"@mui/material";var i=function(i){return r(e,L(L({viewBox:"0 0 24 24"},i),{},{children:r("path",{fillRule:"evenodd",d:"M17.5857864,18 L17,18 C15.0670171,17.9820312 13.8323189,17.4178969 12.7754822,16.1071521 C13.1678375,15.5430536 13.5361529,14.9169672 13.8909426,14.2284294 C14.7312903,15.5397262 15.5623613,15.9865721 17.0093097,16.0000433 L17.5858172,16.0000308 L16.2928932,14.7071068 L17.7071068,13.2928932 L21.4142136,17 L17.7071068,20.7071068 L16.2928932,19.2928932 L17.5857864,18 Z M17.5858172,7.99996921 L17.0093097,7.99995666 C14.98914,8.01876471 14.1694753,8.8823321 12.8489735,11.7638223 C12.7005893,12.0884485 12.6216698,12.260889 12.5477909,12.4205132 C10.7759025,16.2488903 8.96370516,17.9389258 5,18 L3,18 L3,16 L4.98456341,16.0001192 C7.99778944,15.9535997 9.24866011,14.7870513 10.7327652,11.5804646 C10.8045503,11.4253643 10.8813338,11.257591 11.0308005,10.9306074 C12.6437651,7.41092901 13.9561072,6.02829571 17,6 L17.5857864,6 L16.2928932,4.70710678 L17.7071068,3.29289322 L21.4142136,7 L17.7071068,10.7071068 L16.2928932,9.29289322 L17.5858172,7.99996921 Z M9.2967591,9.9151484 C8.25385189,8.57493725 7.02213357,8.03133773 4.98456341,7.99988085 L3,8 L3,6 L5,6 C7.39017643,6.03682871 8.99800451,6.66599321 10.2864139,7.99918708 C9.95038887,8.57240941 9.6245452,9.21039491 9.2967591,9.9151484 Z"})}))};export{i as ShufffleIcon};
|
|
2
|
-
//# sourceMappingURL=
|
|
2
|
+
//# sourceMappingURL=icons.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"icons.js","sources":["../../../../src/filter-bar/components/icons.tsx"],"sourcesContent":["import { FC } from 'react'\r\nimport { SvgIcon, SvgIconProps } from '@mui/material'\r\n\r\nexport const ShufffleIcon: FC<SvgIconProps> = (props) => (\r\n <SvgIcon viewBox='0 0 24 24' {...props}>\r\n <path\r\n fillRule='evenodd'\r\n d='M17.5857864,18 L17,18 C15.0670171,17.9820312 13.8323189,17.4178969 12.7754822,16.1071521 C13.1678375,15.5430536 13.5361529,14.9169672 13.8909426,14.2284294 C14.7312903,15.5397262 15.5623613,15.9865721 17.0093097,16.0000433 L17.5858172,16.0000308 L16.2928932,14.7071068 L17.7071068,13.2928932 L21.4142136,17 L17.7071068,20.7071068 L16.2928932,19.2928932 L17.5857864,18 Z M17.5858172,7.99996921 L17.0093097,7.99995666 C14.98914,8.01876471 14.1694753,8.8823321 12.8489735,11.7638223 C12.7005893,12.0884485 12.6216698,12.260889 12.5477909,12.4205132 C10.7759025,16.2488903 8.96370516,17.9389258 5,18 L3,18 L3,16 L4.98456341,16.0001192 C7.99778944,15.9535997 9.24866011,14.7870513 10.7327652,11.5804646 C10.8045503,11.4253643 10.8813338,11.257591 11.0308005,10.9306074 C12.6437651,7.41092901 13.9561072,6.02829571 17,6 L17.5857864,6 L16.2928932,4.70710678 L17.7071068,3.29289322 L21.4142136,7 L17.7071068,10.7071068 L16.2928932,9.29289322 L17.5858172,7.99996921 Z M9.2967591,9.9151484 C8.25385189,8.57493725 7.02213357,8.03133773 4.98456341,7.99988085 L3,8 L3,6 L5,6 C7.39017643,6.03682871 8.99800451,6.66599321 10.2864139,7.99918708 C9.95038887,8.57240941 9.6245452,9.21039491 9.2967591,9.9151484 Z'\r\n />\r\n </SvgIcon>\r\n)\r\n"],"names":["ShufffleIcon","props","_jsx","SvgIcon","_objectSpread","viewBox","children","fillRule","d"],"mappings":"mKAGaA,EAAiC,SAACC,GAAK,OAClDC,EAACC,EAAOC,EAAAA,EAAA,CAACC,QAAQ,aAAgBJ,GAAK,GAAA,CAAAK,SACpCJ,EACE,OAAA,CAAAK,SAAS,UACTC,EAAE,irCAEI"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{objectWithoutProperties as e,objectSpread2 as t,defineProperty as o}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as i,jsxs as n}from"react/jsx-runtime";import{useMemo as r}from"react";import{styled as a,Popper as l,Fade as d,Box as s,alpha as c,Typography as p,Tooltip as u,IconButton as m}from"@mui/material";import h from"@mui/icons-material/Close";var b=["children"],g=["title","children","onClose","disableGutter","disableMinMaxWidth","slots"],f=a(function(o){var r=o.children,a=e(o,b);return i(l,t(t({},a),{},{children:function(e){var o=e.TransitionProps;return i(d,t(t({},o),{},{timeout:350,children:n("div",{children:[" ",r]})}))}}))})(function(e){return{zIndex:e.theme.zIndex.modal+1,maxWidth:"100%"}}),
|
|
1
|
+
import{objectWithoutProperties as e,objectSpread2 as t,defineProperty as o}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as i,jsxs as n}from"react/jsx-runtime";import{useMemo as r}from"react";import{styled as a,Popper as l,Fade as d,Box as s,alpha as c,Typography as p,Tooltip as u,IconButton as m}from"@mui/material";import h from"@mui/icons-material/Close";var b=["children"],g=["title","children","onClose","disableGutter","disableMinMaxWidth","slots"],f=["children"],x=["children"],C=a(function(o){var r=o.children,a=e(o,b);return i(l,t(t({},a),{},{children:function(e){var o=e.TransitionProps;return i(d,t(t({},o),{},{timeout:350,children:n("div",{children:[" ",r]})}))}}))})(function(e){return{zIndex:e.theme.zIndex.modal+1,maxWidth:"100%"}}),v=function(o){var a=r(function(){return y},[]),l=o.title,d=o.children,s=o.onClose,c=o.disableGutter,b=o.disableMinMaxWidth,f=o.slots,x=e(o,g),C=[a.root];return c&&C.push(a.disableGutter),b&&C.push(a.disableMinMaxWidth),n(P,t(t({className:C.join(" ")},x),{},{children:[n("div",{className:a.header,children:[null==f?void 0:f.beforeTitle,i(p,{variant:"subtitle1",className:a.title,children:l||"Menu Title"}),null==f?void 0:f.afterTitle,i(u,{title:"Close",placement:"top",arrow:!0,children:i(m,{size:"small",className:a.buttonClose,onClick:s,children:i(h,{fontSize:"small"})})})]}),d]}))},M=function(o){var n=o.children,r=e(o,f);return i(s,t(t({className:y.footer},r),{},{children:n}))},W=function(o){var n=o.children,r=e(o,x);return i(s,t(t({className:y.body},r),{},{children:n}))},y={root:"DinoPopperCustom-root",body:"DinoPopperCustom-body",header:"DinoPopperCustom-header",footer:"DinoPopperCustom-footer",title:"DinoPopperCustom-title",buttonClose:"DinoPopperCustom-buttonClose",disableGutter:"DinoPopperCustom-disableGutter",disableMinMaxWidth:"DinoPopperCustom-disableMinMaxWidth"},P=a(s)(function(e){var t=e.theme;return o(o(o(o(o(o(o({},"&.".concat(y.root),o({borderRadius:t.shape.borderRadius,boxShadow:"rgba(0, 0, 0, 0.06) 0px 5px 22px, rgba(0, 0, 0, 0.04) 0px 0px 0px 0.5px",backgroundColor:t.palette.background.paper,overflow:"hidden"},"&:not(.".concat(y.disableMinMaxWidth,")"),o({minWidth:"350px",maxWidth:"550px"},t.breakpoints.down("sm"),{minWidth:"240px",maxWidth:"90vw"}))),".".concat(y.body),{padding:t.spacing(1),maxHeight:"70vh",overflow:"auto"}),".".concat(y.header),{display:"flex",alignItems:"center",justifyContent:"space-between",gap:t.spacing(.5),backgroundColor:t.palette.grey[900],padding:t.spacing(.5,1),color:t.palette.common.white}),".".concat(y.title),{fontSize:"0.875rem",fontWeight:600,lineHeight:1,flexGrow:1}),".".concat(y.buttonClose),{color:t.palette.common.white,transition:t.transitions.create("color"),".MuiSvgIcon-root":{transition:t.transitions.create("transform")},"&:hover":{color:t.palette.error.light,backgroundColor:c(t.palette.common.white,.1),".MuiSvgIcon-root":{transform:"rotate(90deg)"}}}),".".concat(y.footer),o({display:"flex",justifyContent:"flex-end",gap:t.spacing(1),borderTop:"1px solid ".concat(t.palette.grey[100]),padding:t.spacing(.5,1)},".MuiButtonBase-root",{textTransform:"none",fontWeight:500,lineHeight:1,padding:t.spacing(1,1.5)})),"&.".concat(y.disableGutter),o(o(o({},".".concat(y.body),{padding:0}),".".concat(y.header),{padding:t.spacing(.5,1)}),".".concat(y.footer),{padding:t.spacing(.5,1.5),margin:t.spacing(1,1,0)}))});export{W as PopperBody,v as PopperContent,C as PopperCustom,M as PopperFooter};
|
|
2
2
|
//# sourceMappingURL=popper-custom.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"popper-custom.js","sources":["../../../../src/filter-bar/components/popper-custom.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useMemo, useState } from 'react'\r\nimport { alpha, Box, Fade, IconButton, Popper, styled, Tooltip, Typography } from '@mui/material'\r\nimport CloseIcon from '@mui/icons-material/Close'\r\n// types\r\nimport type { FC, PropsWithChildren } from 'react'\r\nimport type { BoxProps, ButtonProps, PopperProps } from '@mui/material'\r\n\r\nexport const usePopperState = () => {\r\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)\r\n const isOpen = Boolean(anchorEl)\r\n\r\n const handleToggle: React.MouseEventHandler<HTMLElement> = (event) => {\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 return { anchorEl, isOpen, handleToggle, handleClose }\r\n}\r\n\r\ninterface IPopperProps extends Omit<PopperProps, 'children'>, PropsWithChildren {}\r\n\r\nexport const PopperCustom = styled(({ children, ...props }: IPopperProps) => (\r\n <Popper {...props}>\r\n {({ TransitionProps }) => (\r\n <Fade {...TransitionProps} timeout={350}>\r\n <div> {children}</div>\r\n </Fade>\r\n )}\r\n </Popper>\r\n))(({ theme }) => ({\r\n zIndex: theme.zIndex.modal + 1,\r\n maxWidth: '100%'\r\n}))\r\n\r\nexport interface PopperContentProps extends BoxProps {\r\n sx?: BoxProps['sx']\r\n title?: string\r\n children: React.ReactNode\r\n onClose?: ButtonProps['onClick']\r\n disableGutter?: boolean\r\n disableMinMaxWidth?: boolean\r\n slots?: {\r\n afterTitle?: React.ReactNode\r\n beforeTitle?: React.ReactNode\r\n }\r\n}\r\n\r\nexport const PopperContent: FC<PopperContentProps> = (props) => {\r\n const classes = useMemo(() => popperCustomClasses, [])\r\n const { title, children, onClose, disableGutter, disableMinMaxWidth, slots, ...rest } = props\r\n\r\n const rootClasses = [classes.root]\r\n if (disableGutter) rootClasses.push(classes.disableGutter)\r\n if (disableMinMaxWidth) rootClasses.push(classes.disableMinMaxWidth)\r\n\r\n return (\r\n <PopperContentStyled className={rootClasses.join(' ')} {...rest}>\r\n <div className={classes.header}>\r\n {slots?.beforeTitle}\r\n <Typography variant='subtitle1' className={classes.title}>\r\n {title || 'Menu Title'}\r\n </Typography>\r\n {slots?.afterTitle}\r\n <Tooltip title='Close' placement='top' arrow>\r\n <IconButton size='small' className={classes.buttonClose} onClick={onClose}>\r\n <CloseIcon fontSize='small' />\r\n </IconButton>\r\n </Tooltip>\r\n </div>\r\n {children}\r\n </PopperContentStyled>\r\n )\r\n}\r\n\r\nexport const PopperFooter: FC<Required<PropsWithChildren>> = ({ children }) => {\r\n return <div className={popperCustomClasses.footer}>{children}</div>\r\n}\r\n\r\nexport const PopperBody: FC<Required<PropsWithChildren>> = ({ children }) => {\r\n return <div className={popperCustomClasses.body}>{children}</div>\r\n}\r\n\r\nconst popperCustomClasses = {\r\n root: 'DinoPopperCustom-root',\r\n body: 'DinoPopperCustom-body',\r\n header: 'DinoPopperCustom-header',\r\n footer: 'DinoPopperCustom-footer',\r\n title: 'DinoPopperCustom-title',\r\n buttonClose: 'DinoPopperCustom-buttonClose',\r\n disableGutter: 'DinoPopperCustom-disableGutter',\r\n disableMinMaxWidth: 'DinoPopperCustom-disableMinMaxWidth'\r\n}\r\n\r\nconst PopperContentStyled = styled(Box)(({ theme }) => ({\r\n [`&.${popperCustomClasses.root}`]: {\r\n borderRadius: theme.shape.borderRadius,\r\n boxShadow: 'rgba(0, 0, 0, 0.06) 0px 5px 22px, rgba(0, 0, 0, 0.04) 0px 0px 0px 0.5px',\r\n backgroundColor: theme.palette.background.paper,\r\n overflow: 'hidden',\r\n [`&:not(.${popperCustomClasses.disableMinMaxWidth})`]: {\r\n minWidth: '350px',\r\n maxWidth: '550px',\r\n [theme.breakpoints.down('sm')]: {\r\n minWidth: '240px',\r\n maxWidth: '90vw'\r\n }\r\n }\r\n },\r\n [`.${popperCustomClasses.body}`]: {\r\n padding: theme.spacing(1),\r\n maxHeight: '70vh',\r\n overflow: 'auto'\r\n },\r\n [`.${popperCustomClasses.header}`]: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: theme.spacing(0.5),\r\n backgroundColor: theme.palette.grey[900],\r\n padding: theme.spacing(0.5, 1),\r\n color: theme.palette.common.white\r\n },\r\n [`.${popperCustomClasses.title}`]: {\r\n fontSize: '0.875rem',\r\n fontWeight: 600,\r\n lineHeight: 1,\r\n flexGrow: 1\r\n },\r\n [`.${popperCustomClasses.buttonClose}`]: {\r\n color: theme.palette.common.white,\r\n transition: theme.transitions.create('color'),\r\n '.MuiSvgIcon-root': { transition: theme.transitions.create('transform') },\r\n '&:hover': {\r\n color: theme.palette.error.light,\r\n backgroundColor: alpha(theme.palette.common.white, 0.1),\r\n '.MuiSvgIcon-root': { transform: 'rotate(90deg)' }\r\n }\r\n },\r\n [`.${popperCustomClasses.footer}`]: {\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n gap: theme.spacing(1),\r\n borderTop: `1px solid ${theme.palette.grey[100]}`,\r\n padding: theme.spacing(0.5, 1),\r\n [`.MuiButtonBase-root`]: {\r\n textTransform: 'none',\r\n fontWeight: 500,\r\n lineHeight: 1,\r\n padding: theme.spacing(1, 1.5)\r\n }\r\n },\r\n [`&.${popperCustomClasses.disableGutter}`]: {\r\n [`.${popperCustomClasses.body}`]: { padding: 0 },\r\n [`.${popperCustomClasses.header}`]: { padding: theme.spacing(0.5, 1) },\r\n [`.${popperCustomClasses.footer}`]: { padding: theme.spacing(0.5, 1.5), margin: theme.spacing(1, 1, 0) }\r\n }\r\n}))\r\n"],"names":["PopperCustom","styled","_ref","children","props","_objectWithoutProperties","_excluded","_jsx","Popper","_objectSpread","_ref2","TransitionProps","Fade","timeout","_jsxs","_ref3","zIndex","theme","modal","maxWidth","PopperContent","classes","useMemo","popperCustomClasses","title","onClose","disableGutter","disableMinMaxWidth","slots","rest","_excluded2","rootClasses","root","push","PopperContentStyled","className","join","header","beforeTitle","Typography","variant","afterTitle","Tooltip","placement","arrow","IconButton","size","buttonClose","onClick","CloseIcon","fontSize","PopperFooter","_ref4","footer","PopperBody","_ref5","body","Box","_ref6","_defineProperty","concat","borderRadius","shape","boxShadow","backgroundColor","palette","background","paper","overflow","minWidth","breakpoints","down","padding","spacing","maxHeight","display","alignItems","justifyContent","gap","grey","color","common","white","fontWeight","lineHeight","flexGrow","transition","transitions","create","error","light","alpha","transform","borderTop","textTransform","margin"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"popper-custom.js","sources":["../../../../src/filter-bar/components/popper-custom.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useMemo, useState } from 'react'\r\nimport { alpha, Box, Fade, IconButton, Popper, styled, Tooltip, Typography } from '@mui/material'\r\nimport CloseIcon from '@mui/icons-material/Close'\r\n// types\r\nimport type { FC, PropsWithChildren } from 'react'\r\nimport type { BoxProps, ButtonProps, PopperProps } from '@mui/material'\r\n\r\nexport const usePopperState = () => {\r\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)\r\n const isOpen = Boolean(anchorEl)\r\n\r\n const handleToggle: React.MouseEventHandler<HTMLElement> = (event) => {\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 return { anchorEl, isOpen, handleToggle, handleClose }\r\n}\r\n\r\ninterface IPopperProps extends Omit<PopperProps, 'children'>, PropsWithChildren {}\r\n\r\nexport const PopperCustom = styled(({ children, ...props }: IPopperProps) => (\r\n <Popper {...props}>\r\n {({ TransitionProps }) => (\r\n <Fade {...TransitionProps} timeout={350}>\r\n <div> {children}</div>\r\n </Fade>\r\n )}\r\n </Popper>\r\n))(({ theme }) => ({\r\n zIndex: theme.zIndex.modal + 1,\r\n maxWidth: '100%'\r\n}))\r\n\r\nexport interface PopperContentProps extends BoxProps {\r\n sx?: BoxProps['sx']\r\n title?: string\r\n children: React.ReactNode\r\n onClose?: ButtonProps['onClick']\r\n disableGutter?: boolean\r\n disableMinMaxWidth?: boolean\r\n slots?: {\r\n afterTitle?: React.ReactNode\r\n beforeTitle?: React.ReactNode\r\n }\r\n}\r\n\r\nexport const PopperContent: FC<PopperContentProps> = (props) => {\r\n const classes = useMemo(() => popperCustomClasses, [])\r\n const { title, children, onClose, disableGutter, disableMinMaxWidth, slots, ...rest } = props\r\n\r\n const rootClasses = [classes.root]\r\n if (disableGutter) rootClasses.push(classes.disableGutter)\r\n if (disableMinMaxWidth) rootClasses.push(classes.disableMinMaxWidth)\r\n\r\n return (\r\n <PopperContentStyled className={rootClasses.join(' ')} {...rest}>\r\n <div className={classes.header}>\r\n {slots?.beforeTitle}\r\n <Typography variant='subtitle1' className={classes.title}>\r\n {title || 'Menu Title'}\r\n </Typography>\r\n {slots?.afterTitle}\r\n <Tooltip title='Close' placement='top' arrow>\r\n <IconButton size='small' className={classes.buttonClose} onClick={onClose}>\r\n <CloseIcon fontSize='small' />\r\n </IconButton>\r\n </Tooltip>\r\n </div>\r\n {children}\r\n </PopperContentStyled>\r\n )\r\n}\r\n\r\nexport const PopperFooter: FC<BoxProps & Required<PropsWithChildren>> = ({ children, ...rest }) => (\r\n <Box className={popperCustomClasses.footer} {...rest}>\r\n {children}\r\n </Box>\r\n)\r\n\r\nexport const PopperBody: FC<BoxProps & Required<PropsWithChildren>> = ({ children, ...rest }) => (\r\n <Box className={popperCustomClasses.body} {...rest}>\r\n {children}\r\n </Box>\r\n)\r\n\r\nconst popperCustomClasses = {\r\n root: 'DinoPopperCustom-root',\r\n body: 'DinoPopperCustom-body',\r\n header: 'DinoPopperCustom-header',\r\n footer: 'DinoPopperCustom-footer',\r\n title: 'DinoPopperCustom-title',\r\n buttonClose: 'DinoPopperCustom-buttonClose',\r\n disableGutter: 'DinoPopperCustom-disableGutter',\r\n disableMinMaxWidth: 'DinoPopperCustom-disableMinMaxWidth'\r\n}\r\n\r\nconst PopperContentStyled = styled(Box)(({ theme }) => ({\r\n [`&.${popperCustomClasses.root}`]: {\r\n borderRadius: theme.shape.borderRadius,\r\n boxShadow: 'rgba(0, 0, 0, 0.06) 0px 5px 22px, rgba(0, 0, 0, 0.04) 0px 0px 0px 0.5px',\r\n backgroundColor: theme.palette.background.paper,\r\n overflow: 'hidden',\r\n [`&:not(.${popperCustomClasses.disableMinMaxWidth})`]: {\r\n minWidth: '350px',\r\n maxWidth: '550px',\r\n [theme.breakpoints.down('sm')]: {\r\n minWidth: '240px',\r\n maxWidth: '90vw'\r\n }\r\n }\r\n },\r\n [`.${popperCustomClasses.body}`]: {\r\n padding: theme.spacing(1),\r\n maxHeight: '70vh',\r\n overflow: 'auto'\r\n },\r\n [`.${popperCustomClasses.header}`]: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: theme.spacing(0.5),\r\n backgroundColor: theme.palette.grey[900],\r\n padding: theme.spacing(0.5, 1),\r\n color: theme.palette.common.white\r\n },\r\n [`.${popperCustomClasses.title}`]: {\r\n fontSize: '0.875rem',\r\n fontWeight: 600,\r\n lineHeight: 1,\r\n flexGrow: 1\r\n },\r\n [`.${popperCustomClasses.buttonClose}`]: {\r\n color: theme.palette.common.white,\r\n transition: theme.transitions.create('color'),\r\n '.MuiSvgIcon-root': { transition: theme.transitions.create('transform') },\r\n '&:hover': {\r\n color: theme.palette.error.light,\r\n backgroundColor: alpha(theme.palette.common.white, 0.1),\r\n '.MuiSvgIcon-root': { transform: 'rotate(90deg)' }\r\n }\r\n },\r\n [`.${popperCustomClasses.footer}`]: {\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n gap: theme.spacing(1),\r\n borderTop: `1px solid ${theme.palette.grey[100]}`,\r\n padding: theme.spacing(0.5, 1),\r\n [`.MuiButtonBase-root`]: {\r\n textTransform: 'none',\r\n fontWeight: 500,\r\n lineHeight: 1,\r\n padding: theme.spacing(1, 1.5)\r\n }\r\n },\r\n [`&.${popperCustomClasses.disableGutter}`]: {\r\n [`.${popperCustomClasses.body}`]: { padding: 0 },\r\n [`.${popperCustomClasses.header}`]: { padding: theme.spacing(0.5, 1) },\r\n [`.${popperCustomClasses.footer}`]: { padding: theme.spacing(0.5, 1.5), margin: theme.spacing(1, 1, 0) }\r\n }\r\n}))\r\n"],"names":["PopperCustom","styled","_ref","children","props","_objectWithoutProperties","_excluded","_jsx","Popper","_objectSpread","_ref2","TransitionProps","Fade","timeout","_jsxs","_ref3","zIndex","theme","modal","maxWidth","PopperContent","classes","useMemo","popperCustomClasses","title","onClose","disableGutter","disableMinMaxWidth","slots","rest","_excluded2","rootClasses","root","push","PopperContentStyled","className","join","header","beforeTitle","Typography","variant","afterTitle","Tooltip","placement","arrow","IconButton","size","buttonClose","onClick","CloseIcon","fontSize","PopperFooter","_ref4","_excluded3","Box","footer","PopperBody","_ref5","_excluded4","body","_ref6","_defineProperty","concat","borderRadius","shape","boxShadow","backgroundColor","palette","background","paper","overflow","minWidth","breakpoints","down","padding","spacing","maxHeight","display","alignItems","justifyContent","gap","grey","color","common","white","fontWeight","lineHeight","flexGrow","transition","transitions","create","error","light","alpha","transform","borderTop","textTransform","margin"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{objectWithoutProperties as e,objectSpread2 as o}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as r,jsxs as t}from"react/jsx-runtime";import{styled as l,Tooltip as i,IconButton as n,alpha as a,Chip as c,ToggleButtonGroup as m,ToggleButton as u,Typography as p}from"@mui/material";import h from"@mui/icons-material/ChevronLeft";import{PopperContent as d}from"./popper-custom.js";var s=["children"],f=function(e){var o=e.onClose;return r(d,{title:"Filter by",onClose:o,children:r(p,{variant:"body2",sx:{p:2,textAlign:"center"},children:"No field to filter"})})},g=l(function(t){var l=t.children,a=e(t,s);return r(i,{title:"Back",placement:"top",arrow:!0,children:r(n,o(o({},a),{},{children:l||r(h,{fontSize:"small"})}))})})(function(e){var o=e.theme;return{color:o.palette.common.white,transition:o.transitions.create("color"),"&:hover":{color:o.palette.primary.light,backgroundColor:a(o.palette.common.white,.1)}}}),b=l(c)(function(e){var o=e.theme;return{backgroundColor:"dark"===o.palette.mode?o.palette.grey[900]:o.palette.grey[800],color:o.palette.common.white,border:"1px solid ".concat(a(o.palette.common.white,.1)),height:20,fontSize:"0.75rem","& .MuiChip-label":{color:o.palette.common.white}}}),v=function(e){return t(C,{size:"small",value:e.value||"and",exclusive:!0,onChange:function(o,r){r&&e.onChange&&e.onChange(o,r)},sx:e.sx,children:[r(u,{size:"small",value:"and","aria-label":"and logic",children:"AND"}),r(u,{size:"small",value:"or","aria-label":"or logic",children:"OR"})]})},C=l(m)({"& .MuiToggleButton-root":{color:"#fff",borderColor:"rgba(255, 255, 255, 0.3)",fontSize:"0.65rem",fontWeight:600,lineHeight:1,minWidth:"40px",padding:"6px 8px","&.Mui-selected":{backgroundColor:"#1976d2",color:"#fff","&:hover":{backgroundColor:"#1565c0"}},"&:hover":{backgroundColor:"rgba(255, 255, 255, 0.08)"}}});export{g as ButtonBack,b as ChipDark,v as FilterLogicToggle,f as FilterMenuNoField};
|
|
2
|
+
//# sourceMappingURL=ui.units.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.units.js","sources":["../../../../src/filter-bar/components/ui.units.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { alpha, Box, Chip, IconButton, styled, ToggleButton, ToggleButtonGroup, Tooltip, Typography } from '@mui/material'\r\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft'\r\nimport { PopperContent } from './popper-custom'\r\n// types\r\nimport type { FC } from 'react'\r\nimport type { IconButtonProps, ToggleButtonGroupProps } from '@mui/material'\r\nimport type { TLogic } from '../types'\r\n\r\n//#region Other components\r\ninterface IFilterMenuNoFieldProps {\r\n onClose: () => void\r\n}\r\n\r\nexport const FilterMenuNoField: FC<IFilterMenuNoFieldProps> = ({ onClose }) => (\r\n <PopperContent title='Filter by' onClose={onClose}>\r\n <Typography variant='body2' sx={{ p: 2, textAlign: 'center' }}>\r\n No field to filter\r\n </Typography>\r\n </PopperContent>\r\n)\r\n\r\nexport const ButtonBack = styled(({ children, ...props }: IconButtonProps) => (\r\n <Tooltip title='Back' placement='top' arrow>\r\n <IconButton {...props}>{children || <ChevronLeftIcon fontSize='small' />}</IconButton>\r\n </Tooltip>\r\n))(({ theme }) => ({\r\n color: theme.palette.common.white,\r\n transition: theme.transitions.create('color'),\r\n '&:hover': {\r\n color: theme.palette.primary.light,\r\n backgroundColor: alpha(theme.palette.common.white, 0.1)\r\n }\r\n}))\r\n\r\nexport const ChipDark = styled(Chip)(({ theme }) => ({\r\n backgroundColor: theme.palette.mode === 'dark' ? theme.palette.grey[900] : theme.palette.grey[800],\r\n color: theme.palette.common.white,\r\n border: `1px solid ${alpha(theme.palette.common.white, 0.1)}`,\r\n height: 20,\r\n fontSize: '0.75rem',\r\n '& .MuiChip-label': {\r\n color: theme.palette.common.white\r\n }\r\n}))\r\n//#endregion\r\n//#region Toggle logic\r\nexport interface FilterLogicToggleProps {\r\n value?: TLogic\r\n onChange?: (event: React.MouseEvent<HTMLElement>, value: TLogic) => void\r\n sx?: ToggleButtonGroupProps['sx']\r\n}\r\n\r\nexport const FilterLogicToggle: FC<FilterLogicToggleProps> = (props) => {\r\n const handleChange = (event: React.MouseEvent<HTMLElement>, newValue: string | null) => {\r\n if (newValue && props.onChange) {\r\n props.onChange(event, newValue as TLogic)\r\n }\r\n }\r\n\r\n return (\r\n <ToggleButtonGroupCustom size='small' value={props.value || 'and'} exclusive onChange={handleChange} sx={props.sx}>\r\n <ToggleButton size='small' value='and' aria-label='and logic'>\r\n AND\r\n </ToggleButton>\r\n <ToggleButton size='small' value='or' aria-label='or logic'>\r\n OR\r\n </ToggleButton>\r\n </ToggleButtonGroupCustom>\r\n )\r\n}\r\n\r\nconst ToggleButtonGroupCustom = styled(ToggleButtonGroup)({\r\n '& .MuiToggleButton-root': {\r\n color: '#fff',\r\n borderColor: 'rgba(255, 255, 255, 0.3)',\r\n fontSize: '0.65rem',\r\n fontWeight: 600,\r\n lineHeight: 1,\r\n minWidth: '40px',\r\n padding: '6px 8px',\r\n '&.Mui-selected': {\r\n backgroundColor: '#1976d2',\r\n color: '#fff',\r\n '&:hover': { backgroundColor: '#1565c0' }\r\n },\r\n '&:hover': { backgroundColor: 'rgba(255, 255, 255, 0.08)' }\r\n }\r\n})\r\n//#endregion\r\n"],"names":["FilterMenuNoField","_ref","onClose","_jsx","PopperContent","title","Typography","variant","sx","p","textAlign","children","ButtonBack","styled","_ref2","props","_objectWithoutProperties","_excluded","Tooltip","placement","arrow","IconButton","_objectSpread","ChevronLeftIcon","fontSize","_ref3","theme","color","palette","common","white","transition","transitions","create","primary","light","backgroundColor","alpha","ChipDark","Chip","_ref4","mode","grey","border","concat","height","FilterLogicToggle","_jsxs","ToggleButtonGroupCustom","size","value","exclusive","onChange","event","newValue","ToggleButton","ToggleButtonGroup","borderColor","fontWeight","lineHeight","minWidth","padding"],"mappings":"qaAgBaA,EAAiD,SAAhCC,GAAA,IAAmCC,EAAOD,EAAPC,QAAO,OACtEC,EAACC,EAAc,CAAAC,MAAM,YAAYH,QAASA,WACxCC,EAACG,GAAWC,QAAQ,QAAQC,GAAI,CAAEC,EAAG,EAAGC,UAAW,UAEtCC,SAAA,wBACC,EAGLC,EAAaC,EAAO,SAAAC,GAAA,IAAGH,EAAQG,EAARH,SAAaI,EAAKC,EAAAF,EAAAG,GAAA,OACpDd,EAACe,EAAO,CAACb,MAAM,OAAOc,UAAU,MAAMC,OACpC,EAAAT,SAAAR,EAACkB,EAAUC,EAAAA,EAAA,GAAKP,GAAK,GAAA,CAAAJ,SAAGA,GAAYR,EAACoB,EAAgB,CAAAC,SAAS,cACtD,EAHcX,CAIvB,SAAAY,GAAA,IAAGC,EAAKD,EAALC,MAAK,MAAQ,CACjBC,MAAOD,EAAME,QAAQC,OAAOC,MAC5BC,WAAYL,EAAMM,YAAYC,OAAO,SACrC,UAAW,CACTN,MAAOD,EAAME,QAAQM,QAAQC,MAC7BC,gBAAiBC,EAAMX,EAAME,QAAQC,OAAOC,MAAO,KAEtD,GAEYQ,EAAWzB,EAAO0B,EAAP1B,CAAa,SAAA2B,GAAA,IAAGd,EAAKc,EAALd,MAAK,MAAQ,CACnDU,gBAAwC,SAAvBV,EAAME,QAAQa,KAAkBf,EAAME,QAAQc,KAAK,KAAOhB,EAAME,QAAQc,KAAK,KAC9Ff,MAAOD,EAAME,QAAQC,OAAOC,MAC5Ba,OAAMC,aAAAA,OAAeP,EAAMX,EAAME,QAAQC,OAAOC,MAAO,KACvDe,OAAQ,GACRrB,SAAU,UACV,mBAAoB,CAClBG,MAAOD,EAAME,QAAQC,OAAOC,OAE/B,GASYgB,EAAgD,SAAC/B,GAO5D,OACEgC,EAACC,EAAwB,CAAAC,KAAK,QAAQC,MAAOnC,EAAMmC,OAAS,MAAOC,WAAS,EAACC,SAP1D,SAACC,EAAsCC,GACtDA,GAAYvC,EAAMqC,UACpBrC,EAAMqC,SAASC,EAAOC,EAEzB,EAGsG9C,GAAIO,EAAMP,GAAEG,SAAA,CAC/GR,EAACoD,EAAY,CAACN,KAAK,QAAQC,MAAM,MAAK,aAAY,YAAWvC,SAAA,QAG7DR,EAACoD,EAAY,CAACN,KAAK,QAAQC,MAAM,KAAI,aAAY,WAAUvC,SAAA,SAKjE,EAEMqC,EAA0BnC,EAAO2C,EAAP3C,CAA0B,CACxD,0BAA2B,CACzBc,MAAO,OACP8B,YAAa,2BACbjC,SAAU,UACVkC,WAAY,IACZC,WAAY,EACZC,SAAU,OACVC,QAAS,UACT,iBAAkB,CAChBzB,gBAAiB,UACjBT,MAAO,OACP,UAAW,CAAES,gBAAiB,YAEhC,UAAW,CAAEA,gBAAiB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createClass as t,classCallCheck as e,defineProperty as r}from"../../_virtual/_rollupPluginBabelHelpers.js";import{KeySpecial as i}from"./types.js";import{createRequestBuilder as l}from"../http-service/graphql/request-param.js";import{getSeedFromURL as o,setSeedToURL as n,removeSeedFromURL as a}from"./helpers.js";var u=function(t){return"or"===t?"Or":"And"},s=function(t){return"asc"===t?"ASC":"DESC"},f=function(){return t(function t(i){var o=this;e(this,t),r(this,"graphqlBuilder",l({ignoreEmpty:!0})),r(this,"autoMap",function(t){(o.currentObjectMap=t,o.state.storeFilter)&&Object.keys(o.state.storeFilter).forEach(function(e){var r,i=t[e],l=null===(r=o.state.storeFilter)||void 0===r?void 0:r[e];if(i){var n=i.targetfield,a=i.operation;
|
|
1
|
+
import{createClass as t,classCallCheck as e,defineProperty as r}from"../../_virtual/_rollupPluginBabelHelpers.js";import{KeySpecial as i}from"./types.js";import{createRequestBuilder as l}from"../http-service/graphql/request-param.js";import{getSeedFromURL as o,setSeedToURL as n,removeSeedFromURL as a}from"./helpers.js";var u=function(t){return"or"===t?"Or":"And"},s=function(t){return"asc"===t?"ASC":"DESC"},f=function(){return t(function t(i){var o=this;e(this,t),r(this,"graphqlBuilder",l({ignoreEmpty:!0})),r(this,"autoMap",function(t){(o.currentObjectMap=t,o.state.storeFilter)&&Object.keys(o.state.storeFilter).forEach(function(e){var r,i=t[e],l=null===(r=o.state.storeFilter)||void 0===r?void 0:r[e];if(i){var n=i.targetfield,a=i.operation;return i.custom?void i.custom(o.graphqlBuilder,l,o.state.storeFilter):"equal"===a?void o.fillterEqual(e,n):void o.fillterContains(e,n)}});return o}),r(this,"prebuild",function(t){return o.prebuildFunc=t,o}),this.state=i},[{key:"filterScope",value:function(t,e){var r=this;if(this.state.storeFilter){var i=(null==e?void 0:e.logic)||this.state.filterLogic||"and",l=u(i);this.graphqlBuilder.scope(function(e){return t(e,r.state.storeFilter),e},{logic:l})}return this}},{key:"fillterEqual",value:function(t,e,r){var i,l,o=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},n=Array.isArray(o.values)?o.values:[o.values];if(!n||n.length<1||!e)return this;var a=u(o.logic);return this.filterScope(function(t,r){for(var i=0;i<n.length;i++){var l=n[i];"string"==typeof l?t.filter(e,l,{logic:a}):("number"==typeof l||"boolean"==typeof l)&&t.filter(e,l.toString(),{logic:a})}},r),this}},{key:"fillterContains",value:function(t,e,r){var i,l,o=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},n=Array.isArray(o.values)?o.values:[o.values];if(!n||n.length<1||!e)return this;var a=u(o.logic);return this.filterScope(function(t){for(var r=0;r<n.length;r++){var i=n[r];"string"==typeof i?t.filterContains(e,i,{logic:a}):("number"==typeof i||"boolean"==typeof i)&&t.filter(e,i.toString(),{logic:a})}},r),this}},{key:"sort",value:function(t){var e,r,l=this.state.storeSort,u=null!==(e=null==t?void 0:t.seed)&&void 0!==e?e:{},f=u.targetField,v=u.autoSave,c=void 0!==v&&v,d=f?null===(r=this.currentObjectMap)||void 0===r?void 0:r[f]:void 0,h=o();if((null==l?void 0:l.field)===i.sortShuffle){if(null==d||!d.targetfield)return this;var p=null!=h?h:(new Date).getTime().toString();this.graphqlBuilder.seed(d.targetfield,p),c&&n(p)}else{var g;h&&a();var y=null!=l&&l.field?null===(g=this.currentObjectMap)||void 0===g?void 0:g[null==l?void 0:l.field]:void 0;if(null==y||!y.targetfield)return this;this.graphqlBuilder.sort(y.targetfield,{direction:s(null==l?void 0:l.direction)})}return this}},{key:"quickSearch",value:function(t){var e,r,i=this;this.currentObjectMap||console.warn("No autoMap config found, quick search will not work properly without target field mapping.");var l=null!==(e=null===(r=this.state.storeFilter)||void 0===r?void 0:r.quickSearch)&&void 0!==e?e:{values:[],logic:"or"},o=Array.isArray(l.values)?l.values:[l.values];if(!o||o.length<1)return this;var n=u(l.logic),a=Array.isArray(t)?t:[t];return this.filterScope(function(t){a.forEach(function(e){var r,a=null===(r=i.currentObjectMap)||void 0===r?void 0:r[e];if(a&&o&&o.length>0)if(a.custom)a.custom(t,l,i.state.storeFilter);else if(a.targetfield)for(var u=0;u<o.length;u++){var s=o[u];"string"==typeof s?t.filterContains(a.targetfield,s,{logic:n}):("number"==typeof s||"boolean"==typeof s)&&t.filter(a.targetfield,s.toString(),{logic:n})}})}),this}},{key:"build",value:function(){return this.prebuildFunc&&this.prebuildFunc(this.graphqlBuilder),this.graphqlBuilder.build()}}])}(),v=function(t){return new f(t)};export{f as TableFileterConverter,v as createConvertToGraphQL,u as mapLogic,s as mapSortDirection};
|
|
2
2
|
//# sourceMappingURL=convert-to-graphql.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert-to-graphql.js","sources":["../../../src/filter-bar/convert-to-graphql.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { KeySpecial } from './types'\r\nimport { createRequestBuilder, RequestParam } from '../http-service/graphql/request-param'\r\n// types\r\nimport type { TFilterState, TFieldStore, TFieldValue, TLogic, TDirection, TFieldType } from './types'\r\nimport { getSeedFromURL, removeSeedFromURL, setSeedToURL } from './helpers'\r\n\r\ntype TFilterScopeFn<TSource, TTarget extends object> = (currentBuilder: RequestParam<TTarget>, store?: TFieldStore<TSource>) => void\r\n\r\n/**\r\n * @en\r\n * - Utility class to convert filter state from a filter bar into a GraphQL query builder.\r\n * - Supports mapping filter fields to different GraphQL fields, custom filter logic, and sorting.\r\n * @vi\r\n * - Lớp tiện ích để chuyển đổi trạng thái filter từ filter bar thành builder truy vấn GraphQL.\r\n * - Hỗ trợ ánh xạ các trường filter sang các trường GraphQL khác, logic filter tùy chỉnh và sắp xếp.\r\n */\r\ntype TAutoMapFieldCustomFn<TSource, TTarget extends object> = (\r\n currentBuilder: RequestParam<TTarget>,\r\n value?: NonNullable<TFieldStore<TSource>>[keyof TFieldStore<TSource>],\r\n store?: TFieldStore<TSource>\r\n) => void\r\n\r\ntype TAutoMapConfig<TSource, TTarget extends object> = {\r\n targetfield?: keyof TTarget\r\n operation?: 'equal' | 'contains'\r\n /**\r\n * @en\r\n * - Custom function to apply complex filter logic that doesn't fit standard 'equal' or 'contains' operations.\r\n * - Receives the current GraphQL builder, the value of the filter field, and the entire filter store for context.\r\n * @vi\r\n * - Hàm tùy chỉnh để áp dụng logic filter phức tạp không phù hợp với các thao tác 'equal' hoặc 'contains' tiêu chuẩn.\r\n * - Nhận builder GraphQL hiện tại, giá trị của trường filter và toàn bộ store filter để có ngữ cảnh.\r\n */\r\n custom?: TAutoMapFieldCustomFn<TSource, TTarget>\r\n}\r\n\r\ntype TAutoMapConfigs<TSource, TTarget extends object> = Partial<Record<keyof TSource, TAutoMapConfig<TSource, TTarget>>>\r\n\r\ntype TFilterOption = {\r\n logic?: TLogic\r\n}\r\n\r\nexport const mapLogic = (logic?: TLogic): 'And' | 'Or' => {\r\n return logic === 'or' ? 'Or' : 'And'\r\n}\r\n\r\nexport const mapSortDirection = (direction?: TDirection): 'ASC' | 'DESC' => {\r\n return direction === 'asc' ? 'ASC' : 'DESC'\r\n}\r\n\r\nexport class TableFileterConverter<TSource extends Record<string, any>, TTarget extends object> {\r\n private state: TFilterState<TSource>\r\n constructor(state: TFilterState<TSource>) {\r\n this.state = state\r\n }\r\n private graphqlBuilder = createRequestBuilder<TTarget>({ ignoreEmpty: true })\r\n filterScope(fn: TFilterScopeFn<TSource, TTarget>, options?: TFilterOption) {\r\n if (this.state.storeFilter) {\r\n const mergedLogic = options?.logic || this.state.filterLogic || 'and'\r\n const logic = mapLogic(mergedLogic)\r\n this.graphqlBuilder.scope(\r\n (b) => {\r\n fn(b, this.state.storeFilter)\r\n return b\r\n },\r\n { logic }\r\n )\r\n }\r\n return this\r\n }\r\n fillterEqual(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n const logic = mapLogic(fieldValue.logic)\r\n const fn: TFilterScopeFn<TSource, TTarget> = (builder, value) => {\r\n for (let index = 0; index < values.length; index++) {\r\n const element = values[index]\r\n if (typeof element === 'string') {\r\n builder.filter(targetField, element, { logic })\r\n } else if (typeof element === 'number') {\r\n //TODO: for number type, we can only do equal filter, so we treat it as equal filter\r\n builder.filter(targetField, element.toString(), { logic })\r\n } else if (typeof element === 'boolean') {\r\n //TODO: for boolean type, we also treat it as equal filter\r\n builder.filter(targetField, element.toString(), { logic })\r\n }\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n fillterContains(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n const finalLogic = mapLogic(fieldValue.logic)\r\n const fn: TFilterScopeFn<TSource, TTarget> = (builder) => {\r\n for (let index = 0; index < values.length; index++) {\r\n const val = values[index]\r\n if (typeof val === 'string') {\r\n builder.filterContains(targetField, val, { logic: finalLogic })\r\n } else if (typeof val === 'number') {\r\n //TODO: for number type, we can only do equal filter, so we treat it as equal filter\r\n builder.filter(targetField, val.toString(), { logic: finalLogic })\r\n } else if (typeof val === 'boolean') {\r\n //TODO: for boolean type, we also treat it as equal filter\r\n builder.filter(targetField, val.toString(), { logic: finalLogic })\r\n }\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n sort(param?: { seed: { targetField?: TFieldType<TSource>; autoSave?: boolean } }) {\r\n const store = this.state.storeSort\r\n const { targetField: seedTargetField, autoSave = false } = param?.seed ?? {}\r\n const seedField = seedTargetField ? this.currentObjectMap?.[seedTargetField] : undefined\r\n const seedFromURL = getSeedFromURL()\r\n if (store?.field === KeySpecial.sortShuffle) {\r\n if (!seedField?.targetfield) return this\r\n const seedValue = seedFromURL ?? new Date().getTime().toString()\r\n this.graphqlBuilder.seed(seedField.targetfield, seedValue)\r\n if (autoSave) setSeedToURL(seedValue)\r\n } else {\r\n if (seedFromURL) removeSeedFromURL()\r\n const field = store?.field ? this.currentObjectMap?.[store?.field] : undefined\r\n if (!field?.targetfield) return this\r\n this.graphqlBuilder.sort(field.targetfield, { direction: mapSortDirection(store?.direction) })\r\n }\r\n return this\r\n }\r\n quickSearch(fields: TFieldType<TSource> | TFieldType<TSource>[]) {\r\n if (!this.currentObjectMap) {\r\n console.warn('No autoMap config found, quick search will not work properly without target field mapping.')\r\n }\r\n const fieldValue: TFieldValue = this.state.storeFilter?.quickSearch ?? { values: [], logic: 'or' }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty) return this\r\n\r\n const logic = mapLogic(fieldValue.logic)\r\n const targetFields = Array.isArray(fields) ? fields : [fields]\r\n const fn: TFilterScopeFn<TSource, TTarget> = (builder) => {\r\n targetFields.forEach((field) => {\r\n const fieldMap = this.currentObjectMap?.[field]\r\n if (fieldMap && values && values.length > 0) {\r\n if (fieldMap.custom) {\r\n fieldMap.custom(builder, fieldValue, this.state.storeFilter)\r\n } else if (fieldMap.targetfield) {\r\n for (let index = 0; index < values.length; index++) {\r\n const element = values[index]\r\n if (typeof element === 'string') {\r\n builder.filterContains(fieldMap.targetfield, element, { logic })\r\n } else if (typeof element === 'number') {\r\n builder.filter(fieldMap.targetfield, element.toString(), { logic })\r\n } else if (typeof element === 'boolean') {\r\n builder.filter(fieldMap.targetfield, element.toString(), { logic })\r\n }\r\n }\r\n }\r\n }\r\n })\r\n }\r\n this.filterScope(fn)\r\n return this\r\n }\r\n private currentObjectMap?: TAutoMapConfigs<TSource, TTarget>\r\n autoMap = (objMap: TAutoMapConfigs<TSource, TTarget>) => {\r\n this.currentObjectMap = objMap\r\n\r\n if (this.state.storeFilter) {\r\n const keys = Object.keys(this.state.storeFilter) as (keyof TFieldStore<TSource>)[]\r\n // filter the keys that exist in objMap\r\n keys.forEach((key) => {\r\n const mapConfig = objMap[key]\r\n const fieldValue: TFieldValue | undefined = this.state.storeFilter?.[key]\r\n if (mapConfig) {\r\n const { targetfield, operation } = mapConfig\r\n if (mapConfig.custom) {\r\n mapConfig.custom(this.graphqlBuilder, fieldValue, this.state.storeFilter)\r\n return // skip the rest logic if custom function is provided\r\n }\r\n if (operation === 'equal') {\r\n this.fillterEqual(key, targetfield)\r\n } else if (operation === 'contains') {\r\n this.fillterContains(key, targetfield)\r\n }\r\n }\r\n })\r\n }\r\n return this\r\n }\r\n private prebuildFunc?: (rp: RequestParam<TTarget>) => RequestParam<TTarget>\r\n prebuild = (func: (requestParam: RequestParam<TTarget>) => RequestParam<TTarget>) => {\r\n this.prebuildFunc = func\r\n return this\r\n }\r\n\r\n build() {\r\n if (this.prebuildFunc) this.prebuildFunc(this.graphqlBuilder)\r\n return this.graphqlBuilder.build()\r\n }\r\n}\r\n\r\nexport const createConvertToGraphQL = <TSource extends Record<string, any>, TTarget extends object>(state: TFilterState<TSource>) => {\r\n return new TableFileterConverter<TSource, TTarget>(state)\r\n}\r\n"],"names":["mapLogic","logic","mapSortDirection","direction","TableFileterConverter","_createClass","state","_this","this","_classCallCheck","_defineProperty","createRequestBuilder","ignoreEmpty","objMap","currentObjectMap","storeFilter","Object","keys","forEach","key","_this$state$storeFilt","mapConfig","fieldValue","targetfield","operation","custom","graphqlBuilder","fillterEqual","fillterContains","func","prebuildFunc","value","fn","options","_this2","mergedLogic","filterLogic","scope","b","field","targetField","_this$state$storeFilt2","_this$state$storeFilt3","values","Array","isArray","length","filterScope","builder","index","element","filter","toString","_this$state$storeFilt4","_this$state$storeFilt5","finalLogic","val","filterContains","param","_param$seed","_this$currentObjectMa","store","storeSort","_ref","seed","seedTargetField","_ref$autoSave","autoSave","seedField","undefined","seedFromURL","getSeedFromURL","KeySpecial","sortShuffle","seedValue","Date","getTime","setSeedToURL","_this$currentObjectMa2","removeSeedFromURL","sort","fields","_this$state$storeFilt6","_this$state$storeFilt7","_this3","console","warn","quickSearch","targetFields","_this3$currentObjectM","fieldMap","build","createConvertToGraphQL"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"convert-to-graphql.js","sources":["../../../src/filter-bar/convert-to-graphql.ts"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { KeySpecial } from './types'\r\nimport { createRequestBuilder, RequestParam } from '../http-service/graphql/request-param'\r\n// types\r\nimport type { TFilterState, TFieldStore, TFieldValue, TLogic, TDirection, TFieldType } from './types'\r\nimport { getSeedFromURL, removeSeedFromURL, setSeedToURL } from './helpers'\r\n\r\ntype TFilterScopeFn<TSource, TTarget extends object> = (currentBuilder: RequestParam<TTarget>, store?: TFieldStore<TSource>) => void\r\n\r\n/**\r\n * @en\r\n * - Utility class to convert filter state from a filter bar into a GraphQL query builder.\r\n * - Supports mapping filter fields to different GraphQL fields, custom filter logic, and sorting.\r\n * @vi\r\n * - Lớp tiện ích để chuyển đổi trạng thái filter từ filter bar thành builder truy vấn GraphQL.\r\n * - Hỗ trợ ánh xạ các trường filter sang các trường GraphQL khác, logic filter tùy chỉnh và sắp xếp.\r\n */\r\ntype TAutoMapFieldCustomFn<TSource, TTarget extends object> = (\r\n currentBuilder: RequestParam<TTarget>,\r\n value?: NonNullable<TFieldStore<TSource>>[keyof TFieldStore<TSource>],\r\n store?: TFieldStore<TSource>\r\n) => void\r\n\r\ntype TAutoMapConfig<TSource, TTarget extends object> = {\r\n /**\r\n * @en The target field in the GraphQL schema that this filter field maps to. If not provided, the source field name will be used as the target field.\r\n * @vi Trường đích trong schema GraphQL mà trường filter này ánh xạ tới. Nếu không cung cấp, tên trường nguồn sẽ được sử dụng làm trường đích.\r\n */\r\n targetfield?: keyof TTarget\r\n /**\r\n * @en The operation to apply for the filter field. Can be 'equal' or 'contains'. @default 'contains'\r\n * @vi Thao tác áp dụng cho trường filter. Có thể là 'equal' hoặc 'contains'. @default 'contains'\r\n */\r\n operation?: 'equal' | 'contains'\r\n /**\r\n * @en\r\n * - Custom function to apply complex filter logic that doesn't fit standard 'equal' or 'contains' operations.\r\n * - Receives the current GraphQL builder, the value of the filter field, and the entire filter store for context.\r\n * @vi\r\n * - Hàm tùy chỉnh để áp dụng logic filter phức tạp không phù hợp với các thao tác 'equal' hoặc 'contains' tiêu chuẩn.\r\n * - Nhận builder GraphQL hiện tại, giá trị của trường filter và toàn bộ store filter để có ngữ cảnh.\r\n */\r\n custom?: TAutoMapFieldCustomFn<TSource, TTarget>\r\n}\r\n\r\ntype TAutoMapConfigs<TSource, TTarget extends object> = Partial<Record<keyof TSource, TAutoMapConfig<TSource, TTarget>>>\r\n\r\ntype TFilterOption = {\r\n logic?: TLogic\r\n}\r\n\r\nexport const mapLogic = (logic?: TLogic): 'And' | 'Or' => {\r\n return logic === 'or' ? 'Or' : 'And'\r\n}\r\n\r\nexport const mapSortDirection = (direction?: TDirection): 'ASC' | 'DESC' => {\r\n return direction === 'asc' ? 'ASC' : 'DESC'\r\n}\r\n\r\nexport class TableFileterConverter<TSource extends Record<string, any>, TTarget extends object> {\r\n private state: TFilterState<TSource>\r\n constructor(state: TFilterState<TSource>) {\r\n this.state = state\r\n }\r\n private graphqlBuilder = createRequestBuilder<TTarget>({ ignoreEmpty: true })\r\n filterScope(fn: TFilterScopeFn<TSource, TTarget>, options?: TFilterOption) {\r\n if (this.state.storeFilter) {\r\n const mergedLogic = options?.logic || this.state.filterLogic || 'and'\r\n const logic = mapLogic(mergedLogic)\r\n this.graphqlBuilder.scope(\r\n (b) => {\r\n fn(b, this.state.storeFilter)\r\n return b\r\n },\r\n { logic }\r\n )\r\n }\r\n return this\r\n }\r\n fillterEqual(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n const logic = mapLogic(fieldValue.logic)\r\n const fn: TFilterScopeFn<TSource, TTarget> = (builder, value) => {\r\n for (let index = 0; index < values.length; index++) {\r\n const element = values[index]\r\n if (typeof element === 'string') {\r\n builder.filter(targetField, element, { logic })\r\n } else if (typeof element === 'number') {\r\n //TODO: for number type, we can only do equal filter, so we treat it as equal filter\r\n builder.filter(targetField, element.toString(), { logic })\r\n } else if (typeof element === 'boolean') {\r\n //TODO: for boolean type, we also treat it as equal filter\r\n builder.filter(targetField, element.toString(), { logic })\r\n }\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n fillterContains(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n const finalLogic = mapLogic(fieldValue.logic)\r\n const fn: TFilterScopeFn<TSource, TTarget> = (builder) => {\r\n for (let index = 0; index < values.length; index++) {\r\n const val = values[index]\r\n if (typeof val === 'string') {\r\n builder.filterContains(targetField, val, { logic: finalLogic })\r\n } else if (typeof val === 'number') {\r\n //TODO: for number type, we can only do equal filter, so we treat it as equal filter\r\n builder.filter(targetField, val.toString(), { logic: finalLogic })\r\n } else if (typeof val === 'boolean') {\r\n //TODO: for boolean type, we also treat it as equal filter\r\n builder.filter(targetField, val.toString(), { logic: finalLogic })\r\n }\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n sort(param?: { seed: { targetField?: TFieldType<TSource>; autoSave?: boolean } }) {\r\n const store = this.state.storeSort\r\n const { targetField: seedTargetField, autoSave = false } = param?.seed ?? {}\r\n const seedField = seedTargetField ? this.currentObjectMap?.[seedTargetField] : undefined\r\n const seedFromURL = getSeedFromURL()\r\n if (store?.field === KeySpecial.sortShuffle) {\r\n if (!seedField?.targetfield) return this\r\n const seedValue = seedFromURL ?? new Date().getTime().toString()\r\n this.graphqlBuilder.seed(seedField.targetfield, seedValue)\r\n if (autoSave) setSeedToURL(seedValue)\r\n } else {\r\n if (seedFromURL) removeSeedFromURL()\r\n const field = store?.field ? this.currentObjectMap?.[store?.field] : undefined\r\n if (!field?.targetfield) return this\r\n this.graphqlBuilder.sort(field.targetfield, { direction: mapSortDirection(store?.direction) })\r\n }\r\n return this\r\n }\r\n quickSearch(fields: TFieldType<TSource> | TFieldType<TSource>[]) {\r\n if (!this.currentObjectMap) {\r\n console.warn('No autoMap config found, quick search will not work properly without target field mapping.')\r\n }\r\n const fieldValue: TFieldValue = this.state.storeFilter?.quickSearch ?? { values: [], logic: 'or' }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty) return this\r\n\r\n const logic = mapLogic(fieldValue.logic)\r\n const targetFields = Array.isArray(fields) ? fields : [fields]\r\n const fn: TFilterScopeFn<TSource, TTarget> = (builder) => {\r\n targetFields.forEach((field) => {\r\n const fieldMap = this.currentObjectMap?.[field]\r\n if (fieldMap && values && values.length > 0) {\r\n if (fieldMap.custom) {\r\n fieldMap.custom(builder, fieldValue, this.state.storeFilter)\r\n } else if (fieldMap.targetfield) {\r\n for (let index = 0; index < values.length; index++) {\r\n const element = values[index]\r\n if (typeof element === 'string') {\r\n builder.filterContains(fieldMap.targetfield, element, { logic })\r\n } else if (typeof element === 'number') {\r\n builder.filter(fieldMap.targetfield, element.toString(), { logic })\r\n } else if (typeof element === 'boolean') {\r\n builder.filter(fieldMap.targetfield, element.toString(), { logic })\r\n }\r\n }\r\n }\r\n }\r\n })\r\n }\r\n this.filterScope(fn)\r\n return this\r\n }\r\n private currentObjectMap?: TAutoMapConfigs<TSource, TTarget>\r\n autoMap = (objMap: TAutoMapConfigs<TSource, TTarget>) => {\r\n this.currentObjectMap = objMap\r\n\r\n if (this.state.storeFilter) {\r\n const keys = Object.keys(this.state.storeFilter) as (keyof TFieldStore<TSource>)[]\r\n // filter the keys that exist in objMap\r\n keys.forEach((key) => {\r\n const mapConfig = objMap[key]\r\n const fieldValue: TFieldValue | undefined = this.state.storeFilter?.[key]\r\n if (mapConfig) {\r\n const { targetfield, operation } = mapConfig\r\n if (mapConfig.custom) {\r\n mapConfig.custom(this.graphqlBuilder, fieldValue, this.state.storeFilter)\r\n return // skip the rest logic if custom function is provided\r\n }\r\n switch (operation) {\r\n case 'equal':\r\n this.fillterEqual(key, targetfield)\r\n return // break is not needed here because of the return statement\r\n case 'contains':\r\n default:\r\n this.fillterContains(key, targetfield)\r\n return // break is not needed here because of the return statement\r\n }\r\n }\r\n })\r\n }\r\n return this\r\n }\r\n private prebuildFunc?: (rp: RequestParam<TTarget>) => RequestParam<TTarget>\r\n prebuild = (func: (requestParam: RequestParam<TTarget>) => RequestParam<TTarget>) => {\r\n this.prebuildFunc = func\r\n return this\r\n }\r\n\r\n build() {\r\n if (this.prebuildFunc) this.prebuildFunc(this.graphqlBuilder)\r\n return this.graphqlBuilder.build()\r\n }\r\n}\r\n\r\nexport const createConvertToGraphQL = <TSource extends Record<string, any>, TTarget extends object>(state: TFilterState<TSource>) => {\r\n return new TableFileterConverter<TSource, TTarget>(state)\r\n}\r\n"],"names":["mapLogic","logic","mapSortDirection","direction","TableFileterConverter","_createClass","state","_this","this","_classCallCheck","_defineProperty","createRequestBuilder","ignoreEmpty","objMap","currentObjectMap","storeFilter","Object","keys","forEach","key","_this$state$storeFilt","mapConfig","fieldValue","targetfield","operation","custom","graphqlBuilder","fillterEqual","fillterContains","func","prebuildFunc","value","fn","options","_this2","mergedLogic","filterLogic","scope","b","field","targetField","_this$state$storeFilt2","_this$state$storeFilt3","values","Array","isArray","length","filterScope","builder","index","element","filter","toString","_this$state$storeFilt4","_this$state$storeFilt5","finalLogic","val","filterContains","param","_param$seed","_this$currentObjectMa","store","storeSort","_ref","seed","seedTargetField","_ref$autoSave","autoSave","seedField","undefined","seedFromURL","getSeedFromURL","KeySpecial","sortShuffle","seedValue","Date","getTime","setSeedToURL","_this$currentObjectMa2","removeSeedFromURL","sort","fields","_this$state$storeFilt6","_this$state$storeFilt7","_this3","console","warn","quickSearch","targetFields","_this3$currentObjectM","fieldMap","build","createConvertToGraphQL"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{defineProperty as t,slicedToArray as r,objectSpread2 as e,asyncToGenerator as n,regenerator as o}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as i,jsxs as
|
|
1
|
+
import{defineProperty as t,slicedToArray as r,objectSpread2 as e,asyncToGenerator as n,regenerator as o}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as i,jsxs as a}from"react/jsx-runtime";import{useState as l,useRef as u,useEffect as m}from"react";import{styled as s,Box as c,useMediaQuery as f}from"@mui/material";import{useTheme as p}from"@mui/material/styles";import{fetchDelay as d}from"../utils/helpers.js";import"../utils/dayjs-config.js";import"../utils/query-param.js";import{createFilterBarContext as v}from"./index.context.js";import{createFilterSort as g}from"./components/filter-sort.js";import{createFilterMenu as y}from"./menu/create.js";import{createFilterInput as S}from"./components/filter-input.js";import{createFilterSummary as C}from"./components/filter-summary.js";function b(t){var s,b=null!==(s=t.debounceDelay)&&void 0!==s?s:300;if(!t.InputComponent){var j=t.inputConfig||{fields:{}};t.inputConfig=j,t.InputComponent=S(j)}if(!t.MenuComponent){var P=t.menuConfig||{fields:{}};t.menuConfig=P,t.MenuComponent=y(P)}if(!t.SummaryComponent&&!1!==t.enableSummary){var w=t.summaryConfig||{fields:{}};t.summaryConfig=w,t.SummaryComponent=C(w)}if(!t.SortComponent){var F=t.sortConfig||{fields:{}};t.sortConfig=F,t.SortComponent=g(F)}var I=t.defaultFilterLogic||"and",B=v();return function(s){var v,g=s.slots,y=t.InputComponent,S=t.MenuComponent,C=t.SummaryComponent,j=t.SortComponent,P=function(){return Object.assign({filterLogic:I},t.defaultFilterState,s.defaultValue)},w=l(function(){return s.value?{filterState:s.value}:{filterState:P()}}),F=r(w,2),T=F[0],k=F[1],D=l(!1),L=r(D,2),M=L[0],N=L[1],W=u(null),A=u(null);m(function(){return function(){W.current&&(clearTimeout(W.current),W.current=null)}},[]),m(function(){s.value&&k({filterState:s.value})},[s.value]);var _=function(){var t=n(o().m(function t(r,e){var i;return o().w(function(t){for(;;)switch(t.p=t.n){case 0:return t.p=0,k(function(t){var r;return{filterState:null!==(r=null==e?void 0:e.filterState)&&void 0!==r?r:t.filterState}}),N(!0),t.n=1,d(n(o().m(function t(){var e;return o().w(function(t){for(;;)if(0===t.n)return t.a(2,null===(e=s.onChange)||void 0===e?void 0:e.call(s,r))},t)})),b);case 1:N(!1),t.n=3;break;case 2:throw t.p=2,i=t.v,N(!1),i;case 3:return t.a(2)}},t,null,[[0,2]])}));return function(r,e){return t.apply(this,arguments)}}(),q={filterState:s.value||T.filterState,defaultFilterState:P(),isLoading:M,setFilterState:function(t){A.current=t,s.value||k({filterState:t}),W.current&&clearTimeout(W.current),W.current=window.setTimeout(function(){var t=A.current;s.value?_(t):_(t,{filterState:t}),W.current=null,A.current=null},b)}},z=p(),G=f(z.breakpoints.down("md"));return i(B.Provider,{value:q,children:a(h,{className:x.root,sx:s.sx,children:[a(c,{className:x.inner,children:[(null==g?void 0:g.before)||null,a("div",{className:x.action,children:[i(S,{slots:{popperProps:{placement:"bottom-start"}}}),i(j,{slots:{popperProps:{placement:"bottom-start"}}})]}),i(y,{slots:{minimalInput:G,popperProps:{placement:"bottom-start"}}}),(null==g?void 0:g.after)||null]}),a(c,e(e({},null==g?void 0:g.summaryWrapProps),{},{sx:e({display:"flex",alignItems:"center"},null==g||null===(v=g.summaryWrapProps)||void 0===v?void 0:v.sx),children:[(null==g?void 0:g.summaryBefore)||null,i(c,{sx:{flex:1,minWidth:0},children:!1!==t.enableSummary&&i(C,{})}),(null==g?void 0:g.summaryAfter)||null]}))]})})}}var x={root:"DinoFilterBar-root",inner:"DinoFilterBar-inner",action:"DinoFilterBar-action"},h=s(c)(function(r){var e=r.theme;return t(t(t({},"&.".concat(x.root),{backgroundColor:e.palette.background.paper,boxSizing:"border-box"}),".".concat(x.inner),{display:"flex",alignItems:"center",gap:e.spacing(1)}),".".concat(x.action),{display:"flex",alignItems:"center"})});export{b as createFilterBar};
|
|
2
2
|
//# sourceMappingURL=index.create.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.create.js","sources":["../../../src/filter-bar/index.create.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useState, useEffect, useRef } from 'react'\r\nimport { Box, BoxProps, styled, useMediaQuery } from '@mui/material'\r\nimport { useTheme } from '@mui/material/styles'\r\nimport { fetchDelay } from '../utils'\r\nimport { createFilterBarContext } from './index.context'\r\nimport { createFilterSort } from './components/filter-sort'\r\nimport { createFilterMenu } from './components/filter-menu'\r\nimport { createFilterInput } from './components/filter-input'\r\nimport { createFilterSummary } from './components/filter-summary'\r\n// types\r\nimport type { ComponentType, FC } from 'react'\r\nimport type { TFilterState } from './types'\r\nimport type { IFilterBarContext, IFilterBarContextState } from './index.context'\r\nimport type { IFilterMenuConfig, IFilterMenuProps } from './components/filter-menu.types'\r\nimport type { IFilterSortConfig, IFilterSortProps } from './components/filter-sort.types'\r\nimport type { IFilterInputConfig, IFilterInputProps } from './components/filter-input.types'\r\nimport type { IFilterSummaryConfig, IFilterSummaryProps } from './components/filter-summary.types'\r\n\r\nexport interface IFilterBarConfigs<T> {\r\n /** Debounce delay for filter input changes in milliseconds @default 300 */\r\n debounceDelay?: number\r\n defaultFilterState?: TFilterState<T>\r\n /** Default filter logic, can be overridden by individual filters @default \"and\" */\r\n defaultFilterLogic?: 'and' | 'or'\r\n InputComponent?: ComponentType<IFilterInputProps<T>>\r\n inputConfig?: IFilterInputConfig<T>\r\n MenuComponent?: ComponentType<IFilterMenuProps<T>>\r\n menuConfig?: IFilterMenuConfig<T>\r\n sortConfig?: IFilterSortConfig<T>\r\n SortComponent?: ComponentType<IFilterSortProps<T>>\r\n /** Enable or disable the summary component. Default is true. */\r\n enableSummary?: boolean\r\n SummaryComponent?: ComponentType<IFilterSummaryProps<T>>\r\n summaryConfig?: IFilterSummaryConfig<T>\r\n}\r\n\r\nexport interface IFilterBarSlots {\r\n summaryWrapProps?: BoxProps\r\n summaryBefore?: React.ReactNode\r\n summaryAfter?: React.ReactNode\r\n before?: React.ReactNode\r\n after?: React.ReactNode\r\n}\r\n\r\nexport interface IFilterBarProps<T> {\r\n sx?: BoxProps['sx']\r\n value?: TFilterState<T>\r\n defaultValue?: TFilterState<T>\r\n onChange?: (state: TFilterState<T>) => Promise<void> | void\r\n slots?: IFilterBarSlots\r\n}\r\n\r\ninterface IFilterBarState<T> extends IFilterBarContextState<T> {}\r\n\r\nexport function createFilterBar<T>(configs: IFilterBarConfigs<T>) {\r\n const debounceDelay = configs.debounceDelay ?? 300\r\n\r\n if (!configs.InputComponent) {\r\n const configInput = configs.inputConfig || { fields: {} }\r\n configs.inputConfig = configInput\r\n configs.InputComponent = createFilterInput<T>(configInput)\r\n }\r\n if (!configs.MenuComponent) {\r\n const configMenu = configs.menuConfig || { fields: {} }\r\n configs.menuConfig = configMenu\r\n configs.MenuComponent = createFilterMenu<T>(configMenu)\r\n }\r\n if (!configs.SummaryComponent && configs.enableSummary !== false) {\r\n const configSummary: IFilterSummaryConfig<T> = configs.summaryConfig || { fields: {} }\r\n configs.summaryConfig = configSummary\r\n configs.SummaryComponent = createFilterSummary<T>(configSummary)\r\n }\r\n if (!configs.SortComponent) {\r\n const configSort: IFilterSortConfig<T> = configs.sortConfig || { fields: {} }\r\n configs.sortConfig = configSort\r\n configs.SortComponent = createFilterSort<T>(configSort)\r\n }\r\n\r\n const defaultFilterLogic = configs.defaultFilterLogic || 'and'\r\n const Context = createFilterBarContext<T>()\r\n\r\n const FilterBar: FC<IFilterBarProps<T>> = (props) => {\r\n const { slots } = props\r\n const InputComponent = configs.InputComponent as ComponentType<IFilterInputProps<T>>\r\n const MenuComponent = configs.MenuComponent as ComponentType<IFilterMenuProps<T>>\r\n const SummaryComponent = configs.SummaryComponent as ComponentType<IFilterSummaryProps<T>>\r\n const SortComponent = configs.SortComponent as ComponentType<IFilterSortProps<T>>\r\n\r\n const getDefaultFilterState = (): TFilterState<T> => {\r\n return Object.assign({ filterLogic: defaultFilterLogic }, configs.defaultFilterState, props.defaultValue)\r\n }\r\n\r\n const computeInitial = (): IFilterBarState<T> => {\r\n if (props.value) return { filterState: props.value }\r\n return { filterState: getDefaultFilterState() }\r\n }\r\n\r\n const [localState, setLocalState] = useState<IFilterBarState<T>>(computeInitial)\r\n const [isLoading, setIsLoading] = useState<boolean>(false)\r\n const debounceTimer = useRef<number | null>(null)\r\n const pendingStateRef = useRef<TFilterState<T> | null>(null)\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (debounceTimer.current) {\r\n clearTimeout(debounceTimer.current)\r\n debounceTimer.current = null\r\n }\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n // keep local state in sync if controlled\r\n if (props.value) setLocalState({ filterState: props.value })\r\n }, [props.value])\r\n\r\n const handleChange = async (filterState: TFilterState<T>, state?: Partial<IFilterBarState<T>>) => {\r\n try {\r\n setLocalState((prev) => ({ filterState: state?.filterState ?? prev.filterState }))\r\n setIsLoading(true)\r\n await fetchDelay(async () => props.onChange?.(filterState), debounceDelay)\r\n setIsLoading(false)\r\n } catch (error) {\r\n setIsLoading(false)\r\n throw error\r\n }\r\n }\r\n\r\n // Action handlers to manipulate filter state\r\n // Debounce or throttle can be added to these handlers if needed to optimize performance for rapid changes\r\n const setFilterState = (state: TFilterState<T>) => {\r\n // store latest requested state\r\n pendingStateRef.current = state\r\n\r\n // If uncontrolled, update UI immediately for responsiveness\r\n if (!props.value) {\r\n setLocalState({ filterState: state })\r\n }\r\n\r\n // debounce actual handler calls so only the last one within delay fires\r\n if (debounceTimer.current) clearTimeout(debounceTimer.current)\r\n debounceTimer.current = window.setTimeout(() => {\r\n const s = pendingStateRef.current as TFilterState<T>\r\n if (props.value) {\r\n handleChange(s)\r\n } else {\r\n handleChange(s, { filterState: s })\r\n }\r\n debounceTimer.current = null\r\n pendingStateRef.current = null\r\n }, debounceDelay)\r\n }\r\n\r\n const contextValue: IFilterBarContext<T> = {\r\n filterState: props.value || localState.filterState,\r\n defaultFilterState: getDefaultFilterState(),\r\n isLoading: isLoading,\r\n setFilterState\r\n }\r\n\r\n const theme = useTheme()\r\n const isSmall = useMediaQuery(theme.breakpoints.down('md'))\r\n\r\n //TODO - add panel: định vị trí, ẩn hiện, trạng thái,...\r\n return (\r\n <Context.Provider value={contextValue}>\r\n <FilterBarStyled className={filterbarClasses.root} sx={props.sx}>\r\n <Box className={filterbarClasses.inner}>\r\n {slots?.before || null}\r\n <div className={filterbarClasses.action}>\r\n <MenuComponent slots={{ popperProps: { placement: 'bottom-start' } }} />\r\n <SortComponent slots={{ popperProps: { placement: 'bottom-start' } }} />\r\n </div>\r\n <InputComponent slots={{ minimalInput: isSmall, popperProps: { placement: 'bottom-start' } }} />\r\n {slots?.after || null}\r\n </Box>\r\n <Box {...slots?.summaryWrapProps} sx={{ display: 'flex', alignItems: 'center', ...slots?.summaryWrapProps?.sx }}>\r\n {slots?.summaryBefore || null}\r\n <Box sx={{ flex: 1, minWidth: 0 }}>{configs.enableSummary !== false && <SummaryComponent />}</Box>\r\n {slots?.summaryAfter || null}\r\n </Box>\r\n </FilterBarStyled>\r\n </Context.Provider>\r\n )\r\n }\r\n\r\n return FilterBar\r\n}\r\n\r\nconst filterbarClasses = {\r\n root: 'DinoFilterBar-root',\r\n inner: 'DinoFilterBar-inner',\r\n action: 'DinoFilterBar-action'\r\n}\r\n\r\nconst FilterBarStyled = styled(Box)(({ theme }) => ({\r\n [`&.${filterbarClasses.root}`]: {\r\n backgroundColor: theme.palette.background.paper,\r\n boxSizing: 'border-box'\r\n },\r\n [`.${filterbarClasses.inner}`]: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: theme.spacing(1)\r\n },\r\n [`.${filterbarClasses.action}`]: {\r\n display: 'flex',\r\n alignItems: 'center'\r\n }\r\n}))\r\n"],"names":["createFilterBar","configs","_configs$debounceDela","debounceDelay","InputComponent","configInput","inputConfig","fields","createFilterInput","MenuComponent","configMenu","menuConfig","createFilterMenu","SummaryComponent","enableSummary","configSummary","summaryConfig","createFilterSummary","SortComponent","configSort","sortConfig","createFilterSort","defaultFilterLogic","Context","createFilterBarContext","props","_slots$summaryWrapPro","slots","getDefaultFilterState","Object","assign","filterLogic","defaultFilterState","defaultValue","_useState","useState","value","filterState","_useState2","_slicedToArray","localState","setLocalState","_useState3","_useState4","isLoading","setIsLoading","debounceTimer","useRef","pendingStateRef","useEffect","current","clearTimeout","handleChange","_ref","_asyncToGenerator","_regenerator","m","_callee2","state","_t","w","_context2","p","n","prev","_state$filterState","fetchDelay","_callee","_props$onChange","_context","a","onChange","call","v","_x","_x2","apply","this","arguments","contextValue","setFilterState","window","setTimeout","s","theme","useTheme","isSmall","useMediaQuery","breakpoints","down","_jsx","Provider","children","_jsxs","FilterBarStyled","className","filterbarClasses","root","sx","Box","inner","before","action","popperProps","placement","minimalInput","after","_objectSpread","summaryWrapProps","display","alignItems","summaryBefore","flex","minWidth","summaryAfter","styled","_ref3","_defineProperty","concat","backgroundColor","palette","background","paper","boxSizing","gap","spacing"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.create.js","sources":["../../../src/filter-bar/index.create.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useState, useEffect, useRef } from 'react'\r\nimport { Box, BoxProps, styled, useMediaQuery } from '@mui/material'\r\nimport { useTheme } from '@mui/material/styles'\r\nimport { fetchDelay } from '../utils'\r\nimport { createFilterBarContext } from './index.context'\r\nimport { createFilterSort } from './components/filter-sort'\r\nimport { createFilterMenu } from './menu/create'\r\nimport { createFilterInput } from './components/filter-input'\r\nimport { createFilterSummary } from './components/filter-summary'\r\n// types\r\nimport type { ComponentType, FC } from 'react'\r\nimport type { TFilterState } from './types'\r\nimport type { IFilterBarContext, IFilterBarContextState } from './index.context'\r\nimport type { IFilterMenuConfig, IFilterMenuProps } from './menu/types'\r\nimport type { IFilterSortConfig, IFilterSortProps } from './components/filter-sort.types'\r\nimport type { IFilterInputConfig, IFilterInputProps } from './components/filter-input.types'\r\nimport type { IFilterSummaryConfig, IFilterSummaryProps } from './components/filter-summary.types'\r\n\r\nexport interface IFilterBarConfigs<T> {\r\n /** Debounce delay for filter input changes in milliseconds @default 300 */\r\n debounceDelay?: number\r\n defaultFilterState?: TFilterState<T>\r\n /** Default filter logic, can be overridden by individual filters @default \"and\" */\r\n defaultFilterLogic?: 'and' | 'or'\r\n InputComponent?: ComponentType<IFilterInputProps<T>>\r\n inputConfig?: IFilterInputConfig<T>\r\n MenuComponent?: ComponentType<IFilterMenuProps<T>>\r\n menuConfig?: IFilterMenuConfig<T>\r\n sortConfig?: IFilterSortConfig<T>\r\n SortComponent?: ComponentType<IFilterSortProps<T>>\r\n /** Enable or disable the summary component. Default is true. */\r\n enableSummary?: boolean\r\n SummaryComponent?: ComponentType<IFilterSummaryProps<T>>\r\n summaryConfig?: IFilterSummaryConfig<T>\r\n}\r\n\r\nexport interface IFilterBarSlots {\r\n summaryWrapProps?: BoxProps\r\n summaryBefore?: React.ReactNode\r\n summaryAfter?: React.ReactNode\r\n before?: React.ReactNode\r\n after?: React.ReactNode\r\n}\r\n\r\nexport interface IFilterBarProps<T> {\r\n sx?: BoxProps['sx']\r\n value?: TFilterState<T>\r\n defaultValue?: TFilterState<T>\r\n onChange?: (state: TFilterState<T>) => Promise<void> | void\r\n slots?: IFilterBarSlots\r\n}\r\n\r\ninterface IFilterBarState<T> extends IFilterBarContextState<T> {}\r\n\r\nexport function createFilterBar<T>(configs: IFilterBarConfigs<T>) {\r\n const debounceDelay = configs.debounceDelay ?? 300\r\n\r\n if (!configs.InputComponent) {\r\n const configInput = configs.inputConfig || { fields: {} }\r\n configs.inputConfig = configInput\r\n configs.InputComponent = createFilterInput<T>(configInput)\r\n }\r\n if (!configs.MenuComponent) {\r\n const configMenu = configs.menuConfig || { fields: {} }\r\n configs.menuConfig = configMenu\r\n configs.MenuComponent = createFilterMenu<T>(configMenu)\r\n }\r\n if (!configs.SummaryComponent && configs.enableSummary !== false) {\r\n const configSummary: IFilterSummaryConfig<T> = configs.summaryConfig || { fields: {} }\r\n configs.summaryConfig = configSummary\r\n configs.SummaryComponent = createFilterSummary<T>(configSummary)\r\n }\r\n if (!configs.SortComponent) {\r\n const configSort: IFilterSortConfig<T> = configs.sortConfig || { fields: {} }\r\n configs.sortConfig = configSort\r\n configs.SortComponent = createFilterSort<T>(configSort)\r\n }\r\n\r\n const defaultFilterLogic = configs.defaultFilterLogic || 'and'\r\n const Context = createFilterBarContext<T>()\r\n\r\n const FilterBar: FC<IFilterBarProps<T>> = (props) => {\r\n const { slots } = props\r\n const InputComponent = configs.InputComponent as ComponentType<IFilterInputProps<T>>\r\n const MenuComponent = configs.MenuComponent as ComponentType<IFilterMenuProps<T>>\r\n const SummaryComponent = configs.SummaryComponent as ComponentType<IFilterSummaryProps<T>>\r\n const SortComponent = configs.SortComponent as ComponentType<IFilterSortProps<T>>\r\n\r\n const getDefaultFilterState = (): TFilterState<T> => {\r\n return Object.assign({ filterLogic: defaultFilterLogic }, configs.defaultFilterState, props.defaultValue)\r\n }\r\n\r\n const computeInitial = (): IFilterBarState<T> => {\r\n if (props.value) return { filterState: props.value }\r\n return { filterState: getDefaultFilterState() }\r\n }\r\n\r\n const [localState, setLocalState] = useState<IFilterBarState<T>>(computeInitial)\r\n const [isLoading, setIsLoading] = useState<boolean>(false)\r\n const debounceTimer = useRef<number | null>(null)\r\n const pendingStateRef = useRef<TFilterState<T> | null>(null)\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (debounceTimer.current) {\r\n clearTimeout(debounceTimer.current)\r\n debounceTimer.current = null\r\n }\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n // keep local state in sync if controlled\r\n if (props.value) setLocalState({ filterState: props.value })\r\n }, [props.value])\r\n\r\n const handleChange = async (filterState: TFilterState<T>, state?: Partial<IFilterBarState<T>>) => {\r\n try {\r\n setLocalState((prev) => ({ filterState: state?.filterState ?? prev.filterState }))\r\n setIsLoading(true)\r\n await fetchDelay(async () => props.onChange?.(filterState), debounceDelay)\r\n setIsLoading(false)\r\n } catch (error) {\r\n setIsLoading(false)\r\n throw error\r\n }\r\n }\r\n\r\n // Action handlers to manipulate filter state\r\n // Debounce or throttle can be added to these handlers if needed to optimize performance for rapid changes\r\n const setFilterState = (state: TFilterState<T>) => {\r\n // store latest requested state\r\n pendingStateRef.current = state\r\n\r\n // If uncontrolled, update UI immediately for responsiveness\r\n if (!props.value) {\r\n setLocalState({ filterState: state })\r\n }\r\n\r\n // debounce actual handler calls so only the last one within delay fires\r\n if (debounceTimer.current) clearTimeout(debounceTimer.current)\r\n debounceTimer.current = window.setTimeout(() => {\r\n const s = pendingStateRef.current as TFilterState<T>\r\n if (props.value) {\r\n handleChange(s)\r\n } else {\r\n handleChange(s, { filterState: s })\r\n }\r\n debounceTimer.current = null\r\n pendingStateRef.current = null\r\n }, debounceDelay)\r\n }\r\n\r\n const contextValue: IFilterBarContext<T> = {\r\n filterState: props.value || localState.filterState,\r\n defaultFilterState: getDefaultFilterState(),\r\n isLoading: isLoading,\r\n setFilterState\r\n }\r\n\r\n const theme = useTheme()\r\n const isSmall = useMediaQuery(theme.breakpoints.down('md'))\r\n\r\n //TODO - add panel: định vị trí, ẩn hiện, trạng thái,...\r\n return (\r\n <Context.Provider value={contextValue}>\r\n <FilterBarStyled className={filterbarClasses.root} sx={props.sx}>\r\n <Box className={filterbarClasses.inner}>\r\n {slots?.before || null}\r\n <div className={filterbarClasses.action}>\r\n <MenuComponent slots={{ popperProps: { placement: 'bottom-start' } }} />\r\n <SortComponent slots={{ popperProps: { placement: 'bottom-start' } }} />\r\n </div>\r\n <InputComponent slots={{ minimalInput: isSmall, popperProps: { placement: 'bottom-start' } }} />\r\n {slots?.after || null}\r\n </Box>\r\n <Box {...slots?.summaryWrapProps} sx={{ display: 'flex', alignItems: 'center', ...slots?.summaryWrapProps?.sx }}>\r\n {slots?.summaryBefore || null}\r\n <Box sx={{ flex: 1, minWidth: 0 }}>{configs.enableSummary !== false && <SummaryComponent />}</Box>\r\n {slots?.summaryAfter || null}\r\n </Box>\r\n </FilterBarStyled>\r\n </Context.Provider>\r\n )\r\n }\r\n\r\n return FilterBar\r\n}\r\n\r\nconst filterbarClasses = {\r\n root: 'DinoFilterBar-root',\r\n inner: 'DinoFilterBar-inner',\r\n action: 'DinoFilterBar-action'\r\n}\r\n\r\nconst FilterBarStyled = styled(Box)(({ theme }) => ({\r\n [`&.${filterbarClasses.root}`]: {\r\n backgroundColor: theme.palette.background.paper,\r\n boxSizing: 'border-box'\r\n },\r\n [`.${filterbarClasses.inner}`]: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: theme.spacing(1)\r\n },\r\n [`.${filterbarClasses.action}`]: {\r\n display: 'flex',\r\n alignItems: 'center'\r\n }\r\n}))\r\n"],"names":["createFilterBar","configs","_configs$debounceDela","debounceDelay","InputComponent","configInput","inputConfig","fields","createFilterInput","MenuComponent","configMenu","menuConfig","createFilterMenu","SummaryComponent","enableSummary","configSummary","summaryConfig","createFilterSummary","SortComponent","configSort","sortConfig","createFilterSort","defaultFilterLogic","Context","createFilterBarContext","props","_slots$summaryWrapPro","slots","getDefaultFilterState","Object","assign","filterLogic","defaultFilterState","defaultValue","_useState","useState","value","filterState","_useState2","_slicedToArray","localState","setLocalState","_useState3","_useState4","isLoading","setIsLoading","debounceTimer","useRef","pendingStateRef","useEffect","current","clearTimeout","handleChange","_ref","_asyncToGenerator","_regenerator","m","_callee2","state","_t","w","_context2","p","n","prev","_state$filterState","fetchDelay","_callee","_props$onChange","_context","a","onChange","call","v","_x","_x2","apply","this","arguments","contextValue","setFilterState","window","setTimeout","s","theme","useTheme","isSmall","useMediaQuery","breakpoints","down","_jsx","Provider","children","_jsxs","FilterBarStyled","className","filterbarClasses","root","sx","Box","inner","before","action","popperProps","placement","minimalInput","after","_objectSpread","summaryWrapProps","display","alignItems","summaryBefore","flex","minWidth","summaryAfter","styled","_ref3","_defineProperty","concat","backgroundColor","palette","background","paper","boxSizing","gap","spacing"],"mappings":"kyBAyDM,SAAUA,EAAmBC,GAA6B,IAAAC,EACxDC,EAAqC,QAAxBD,EAAGD,EAAQE,qBAAa,IAAAD,EAAAA,EAAI,IAE/C,IAAKD,EAAQG,eAAgB,CAC3B,IAAMC,EAAcJ,EAAQK,aAAe,CAAEC,OAAQ,CAAA,GACrDN,EAAQK,YAAcD,EACtBJ,EAAQG,eAAiBI,EAAqBH,EAC/C,CACD,IAAKJ,EAAQQ,cAAe,CAC1B,IAAMC,EAAaT,EAAQU,YAAc,CAAEJ,OAAQ,CAAA,GACnDN,EAAQU,WAAaD,EACrBT,EAAQQ,cAAgBG,EAAoBF,EAC7C,CACD,IAAKT,EAAQY,mBAA8C,IAA1BZ,EAAQa,cAAyB,CAChE,IAAMC,EAAyCd,EAAQe,eAAiB,CAAET,OAAQ,CAAA,GAClFN,EAAQe,cAAgBD,EACxBd,EAAQY,iBAAmBI,EAAuBF,EACnD,CACD,IAAKd,EAAQiB,cAAe,CAC1B,IAAMC,EAAmClB,EAAQmB,YAAc,CAAEb,OAAQ,CAAA,GACzEN,EAAQmB,WAAaD,EACrBlB,EAAQiB,cAAgBG,EAAoBF,EAC7C,CAED,IAAMG,EAAqBrB,EAAQqB,oBAAsB,MACnDC,EAAUC,IA2GhB,OAzG0C,SAACC,GAAS,IAAAC,EAC1CC,EAAUF,EAAVE,MACFvB,EAAiBH,EAAQG,eACzBK,EAAgBR,EAAQQ,cACxBI,EAAmBZ,EAAQY,iBAC3BK,EAAgBjB,EAAQiB,cAExBU,EAAwB,WAC5B,OAAOC,OAAOC,OAAO,CAAEC,YAAaT,GAAsBrB,EAAQ+B,mBAAoBP,EAAMQ,aAC7F,EAODC,EAAoCC,EALb,WACrB,OAAIV,EAAMW,MAAc,CAAEC,YAAaZ,EAAMW,OACtC,CAAEC,YAAaT,IACvB,GAE+EU,EAAAC,EAAAL,EAAA,GAAzEM,EAAUF,EAAA,GAAEG,EAAaH,EAAA,GAChCI,EAAkCP,GAAkB,GAAMQ,EAAAJ,EAAAG,EAAA,GAAnDE,EAASD,EAAA,GAAEE,EAAYF,EAAA,GACxBG,EAAgBC,EAAsB,MACtCC,EAAkBD,EAA+B,MAEvDE,EAAU,WACR,OAAO,WACDH,EAAcI,UAChBC,aAAaL,EAAcI,SAC3BJ,EAAcI,QAAU,KAE3B,CACF,EAAE,IAEHD,EAAU,WAEJxB,EAAMW,OAAOK,EAAc,CAAEJ,YAAaZ,EAAMW,OACtD,EAAG,CAACX,EAAMW,QAEV,IAAMgB,EAAY,WAAA,IAAAC,EAAAC,EAAAC,IAAAC,EAAG,SAAAC,EAAOpB,EAA8BqB,GAAmC,IAAAC,EAAA,OAAAJ,IAAAK,EAAA,SAAAC,GAAA,cAAAA,EAAAC,EAAAD,EAAAE,GAAA,KAAA,EAGvE,OAHuEF,EAAAC,EAAA,EAEzFrB,EAAc,SAACuB,GAAI,IAAAC,EAAA,MAAM,CAAE5B,oBAAW4B,EAAEP,aAAAA,EAAAA,EAAOrB,mBAAW,IAAA4B,EAAAA,EAAID,EAAK3B,YAAa,GAChFQ,GAAa,GAAKgB,EAAAE,EAAA,EACZG,EAAUZ,EAAAC,IAAAC,EAAC,SAAAW,IAAA,IAAAC,EAAA,OAAAb,IAAAK,EAAA,SAAAS,GAAA,UAAA,IAAAA,EAAAN,EAAA,OAAAM,EAAAC,YAAAF,EAAY3C,EAAM8C,gBAAQ,IAAAH,OAAA,EAAdA,EAAAI,KAAA/C,EAAiBY,GAAY,EAAA8B,EAAA,IAAEhE,GAAc,KAAA,EAC1E0C,GAAa,GAAMgB,EAAAE,EAAA,EAAA,MAAA,KAAA,EAEA,MAFAF,EAAAC,EAAA,EAAAH,EAAAE,EAAAY,EAEnB5B,GAAa,GAAMc,EAAA,KAAA,EAAA,OAAAE,EAAAS,EAAA,GAAA,EAAAb,EAAA,KAAA,CAAA,CAAA,EAAA,QAGtB,OAAA,SAViBiB,EAAAC,GAAA,OAAAtB,EAAAuB,MAAAC,KAAAC,UAAA,EAAA,GAqCZC,EAAqC,CACzC1C,YAAaZ,EAAMW,OAASI,EAAWH,YACvCL,mBAAoBJ,IACpBgB,UAAWA,EACXoC,eA3BqB,SAACtB,GAEtBV,EAAgBE,QAAUQ,EAGrBjC,EAAMW,OACTK,EAAc,CAAEJ,YAAaqB,IAI3BZ,EAAcI,SAASC,aAAaL,EAAcI,SACtDJ,EAAcI,QAAU+B,OAAOC,WAAW,WACxC,IAAMC,EAAInC,EAAgBE,QACtBzB,EAAMW,MACRgB,EAAa+B,GAEb/B,EAAa+B,EAAG,CAAE9C,YAAa8C,IAEjCrC,EAAcI,QAAU,KACxBF,EAAgBE,QAAU,IAC3B,EAAE/C,EACJ,GASKiF,EAAQC,IACRC,EAAUC,EAAcH,EAAMI,YAAYC,KAAK,OAGrD,OACEC,EAACnE,EAAQoE,SAAQ,CAACvD,MAAO2C,EACvBa,SAAAC,EAACC,EAAgB,CAAAC,UAAWC,EAAiBC,KAAMC,GAAIzE,EAAMyE,GAAEN,SAAA,CAC7DC,EAACM,EAAG,CAACJ,UAAWC,EAAiBI,iBAC9BzE,aAAAA,EAAAA,EAAO0E,SAAU,KAClBR,EAAK,MAAA,CAAAE,UAAWC,EAAiBM,OAAMV,SAAA,CACrCF,EAACjF,EAAa,CAACkB,MAAO,CAAE4E,YAAa,CAAEC,UAAW,mBAClDd,EAACxE,EAAa,CAACS,MAAO,CAAE4E,YAAa,CAAEC,UAAW,sBAEpDd,EAACtF,EAAe,CAAAuB,MAAO,CAAE8E,aAAcnB,EAASiB,YAAa,CAAEC,UAAW,oBACzE7E,aAAK,EAALA,EAAO+E,QAAS,QAEnBb,EAACM,EAAGQ,EAAAA,EAAA,CAAA,EAAKhF,aAAAA,EAAAA,EAAOiF,kBAAgB,CAAA,EAAA,CAAEV,GAAES,EAAA,CAAIE,QAAS,OAAQC,WAAY,UAAanF,iBAAKD,EAALC,EAAOiF,wBAAgB,IAAAlF,OAAA,EAAvBA,EAAyBwE,IAAIN,SAAA,EAC5GjE,aAAAA,EAAAA,EAAOoF,gBAAiB,KACzBrB,EAACS,EAAG,CAACD,GAAI,CAAEc,KAAM,EAAGC,SAAU,GAAMrB,UAA0B,IAA1B3F,EAAQa,eAA2B4E,EAAC7E,EAAmB,CAAA,MAC1Fc,aAAK,EAALA,EAAOuF,eAAgB,aAKjC,CAGH,CAEA,IAAMlB,EAAmB,CACvBC,KAAM,qBACNG,MAAO,sBACPE,OAAQ,wBAGJR,EAAkBqB,EAAOhB,EAAPgB,CAAY,SAAAC,GAAA,IAAGhC,EAAKgC,EAALhC,MAAK,OAAAiC,EAAAA,EAAAA,EAAAC,CAAAA,EAAAA,KAAAA,OACpCtB,EAAiBC,MAAS,CAC9BsB,gBAAiBnC,EAAMoC,QAAQC,WAAWC,MAC1CC,UAAW,mBACZL,OACItB,EAAiBI,OAAU,CAC9BS,QAAS,OACTC,WAAY,SACZc,IAAKxC,EAAMyC,QAAQ,SACpBP,OACItB,EAAiBM,QAAW,CAC/BO,QAAS,OACTC,WAAY,UACb"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createClass as
|
|
1
|
+
import{createClass as e,classCallCheck as t,defineProperty as r}from"../../_virtual/_rollupPluginBabelHelpers.js";import{createFilterBar as i}from"./index.create.js";import{createLocalFilterBuilder as l}from"./local-filter-builder.js";import{createConvertToGraphQL as s,mapLogic as o,mapSortDirection as a}from"./convert-to-graphql.js";import{isEmptyFilterState as m,removeNullValues as c,isFilterStateEqual as p,setFilterToURL as h,getFilterFromURL as f}from"./helpers.js";import n from"./menu/create-form-field-string.js";import u from"./menu/create-form-field-select.js";import F from"./menu/create-form-field-select-multiple.js";var d=e(function e(){t(this,e),r(this,"createFilterBar",i),r(this,"createConvertToGraphQL",s),r(this,"createLocalFilterBuilder",l),r(this,"createFormFieldString",n),r(this,"createFormFieldSelect",u),r(this,"createFormFieldSelectMultiple",F),r(this,"mapLogic",o),r(this,"mapDirection",a),r(this,"isEmptyFilterState",m),r(this,"removeNullValues",c),r(this,"isFilterStateEqual",p),r(this,"setFilterToURL",h),r(this,"getFilterFromURL",f)}),j=new d;export{d as DinoFilterBar,j as dinoFilterBar};
|
|
2
2
|
//# sourceMappingURL=index.dino.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.dino.js","sources":["../../../src/filter-bar/index.dino.tsx"],"sourcesContent":["import { createConvertToGraphQL, mapLogic, mapSortDirection } from './convert-to-graphql'\r\nimport { getFilterFromURL, isEmptyFilterState, isFilterStateEqual, removeNullValues, setFilterToURL } from './helpers'\r\nimport
|
|
1
|
+
{"version":3,"file":"index.dino.js","sources":["../../../src/filter-bar/index.dino.tsx"],"sourcesContent":["import { createFilterBar } from './index.create'\r\nimport { createLocalFilterBuilder } from './local-filter-builder'\r\nimport { createConvertToGraphQL, mapLogic, mapSortDirection } from './convert-to-graphql'\r\nimport { getFilterFromURL, isEmptyFilterState, isFilterStateEqual, removeNullValues, setFilterToURL } from './helpers'\r\nimport createFormFieldString from './menu/create-form-field-string'\r\nimport createFormFieldSelect from './menu/create-form-field-select'\r\nimport createFormFieldSelectMultiple from './menu/create-form-field-select-multiple'\r\n\r\nexport class DinoFilterBar {\r\n createFilterBar = createFilterBar\r\n createConvertToGraphQL = createConvertToGraphQL\r\n createLocalFilterBuilder = createLocalFilterBuilder\r\n\r\n // Form fields\r\n createFormFieldString = createFormFieldString\r\n createFormFieldSelect = createFormFieldSelect\r\n createFormFieldSelectMultiple = createFormFieldSelectMultiple\r\n\r\n // support\r\n mapLogic = mapLogic\r\n mapDirection = mapSortDirection\r\n\r\n // helpers\r\n isEmptyFilterState = isEmptyFilterState\r\n removeNullValues = removeNullValues\r\n isFilterStateEqual = isFilterStateEqual\r\n setFilterToURL = setFilterToURL\r\n getFilterFromURL = getFilterFromURL\r\n}\r\n\r\nexport const dinoFilterBar = new DinoFilterBar()\r\n"],"names":["DinoFilterBar","_createClass","_classCallCheck","_defineProperty","createFilterBar","createConvertToGraphQL","createLocalFilterBuilder","createFormFieldString","createFormFieldSelect","createFormFieldSelectMultiple","mapLogic","mapSortDirection","isEmptyFilterState","removeNullValues","isFilterStateEqual","setFilterToURL","getFilterFromURL","dinoFilterBar"],"mappings":"ynBAQA,IAAaA,EAAaC,EAAA,SAAAD,IAAAE,OAAAF,GAAAG,yBACNC,GAAeD,gCACRE,GAAsBF,kCACpBG,GAE3BH,+BACwBI,GAAqBJ,+BACrBK,GAAqBL,uCACbM,GAEhCN,kBACWO,GAAQP,sBACJQ,GAEfR,4BACqBS,GAAkBT,0BACpBU,GAAgBV,4BACdW,GAAkBX,wBACtBY,GAAcZ,0BACZa,EAAgB,GAGxBC,EAAgB,IAAIjB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createClass as t,objectSpread2 as e,toConsumableArray as i,typeof as r,classCallCheck as a,defineProperty as n}from"../../_virtual/_rollupPluginBabelHelpers.js";var l=function(){return t(function t(e,i){a(this,t),n(this,"operation","contains"),n(this,"dataFiltered",[]),n(this,"filterState",{}),n(this,"autoMapConfigs",{}),this.data=e,this.filterState=i,this.dataFiltered=e.slice()},[{key:"autoMap",value:function(t){return t&&(this.autoMapConfigs=t),this}},{key:"filter",value:function(t){return null!=t&&t.fields&&(this.autoMapConfigs.fields=e(e({},this.autoMapConfigs.fields),t.fields)),this}},{key:"handleFilter",value:function(){var t,i=this,r=e({},this.autoMapConfigs.fields),a=this.filterState.storeFilter||{},n=null!==(t=this.filterState.filterLogic)&&void 0!==t?t:"and",l=Object.keys(a).filter(function(t){return"quickSearch"!==t&&r[t]});this.dataFiltered=this.dataFiltered.filter(function(t){var e=l.map(function(e){var n,l,o=r[e],s=a[e];if(!o||!s||!s.values||0===s.values.length)return null;var u=null!==(n=o.operation)&&void 0!==n?n:i.operation,f=Array.isArray(s.values)?s.values:[s.values],d=null!==(l=s.logic)&&void 0!==l?l:"and",c=t[e],h=f.map(function(t){return"contains"===u&&"string"==typeof c&&"string"==typeof t?c.toLowerCase().includes(t.toString().toLowerCase()):c===t});return"and"===d?h.every(Boolean):h.some(Boolean)}).filter(function(t){return null!==t});return 0===e.length||("and"===n?e.every(Boolean):e.some(Boolean))})}},{key:"quickSearch",value:function(t){if(null!=t&&t.fields){var e,r=new Set([].concat(i(null!==(e=this.autoMapConfigs.quickSearchFields)&&void 0!==e?e:[]),i(t.fields)));this.autoMapConfigs.quickSearchFields=Array.from(r)}return this}},{key:"handleQuickSearch",value:function(){var t,e,i=null!==(t=this.autoMapConfigs.quickSearchFields)&&void 0!==t?t:[],r=(this.filterState.storeFilter||{}).quickSearch;if(r&&0!==i.length){var a=Array.isArray(r.values)?r.values:[r.values];if(a&&0!==a.length){var n=null!==(e=r.logic)&&void 0!==e?e:"or";this.dataFiltered=this.dataFiltered.filter(function(t){var e=a.map(function(e){return i.some(function(i){var r=t[i];return"string"==typeof r&&"string"==typeof e?r.toLowerCase().includes(e.toString().toLowerCase()):r===e})});return"and"===n?e.every(Boolean):e.some(Boolean)})}}}},{key:"sort",value:function(t){var e;return null!=t&&t.sortFields&&(this.autoMapConfigs.sortFields=[].concat(i(null!==(e=this.autoMapConfigs.sortFields)&&void 0!==e?e:[]),i(t.sortFields))),this}},{key:"handleSort",value:function(){var t,e,i=this.filterState.storeSort,a=(null!==(t=this.autoMapConfigs.sortFields)&&void 0!==t?t:[]).map(String);if(i&&i.field){var n=String(i.field);if(a.includes(n)){var l="asc"===(null!==(e=i.direction)&&void 0!==e?e:"desc")?1:-1;this.dataFiltered.sort(function(t,e){var i=t[n],a=e[n];if(null==i&&null==a)return 0;if(null==i)return-1*l;if(null==a)return 1*l;var o=r(i);return"string"===o&&"string"==typeof a?i.localeCompare(a)*l:"number"===o&&"number"==typeof a?(i-a)*l:"boolean"===o&&"boolean"==typeof a?((i?1:0)-(a?1:0))*l:String(i).localeCompare(String(a))*l})}}}},{key:"build",value:function(){return this.dataFiltered=this.data.slice(),this.handleFilter(),this.handleQuickSearch(),this.handleSort(),this.dataFiltered}}])}(),o=function(t,e){return new l(t,e)};export{l as LocalFilterBuilder,o as createLocalFilterBuilder};
|
|
2
|
+
//# sourceMappingURL=local-filter-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-filter-builder.js","sources":["../../../src/filter-bar/local-filter-builder.ts"],"sourcesContent":["import { TFieldValue, TFilterState } from './types'\r\n\r\ntype TOperation = 'equal' | 'contains'\r\n\r\ntype TAutoMapField = {\r\n /** The operation to use for filtering. 'equal' for exact match, 'contains' for partial match. @default 'contains' */\r\n operation?: TOperation\r\n}\r\n\r\ntype TAutoMapFields<T> = Partial<Record<keyof T, TAutoMapField>>\r\n\r\ntype TAutoMapConfigs<T> = {\r\n fields?: TAutoMapFields<T>\r\n sortFields?: (keyof T)[]\r\n quickSearchFields?: (keyof T)[]\r\n}\r\n\r\nexport class LocalFilterBuilder<T> {\r\n private operation: TOperation = 'contains'\r\n private data: T[]\r\n private dataFiltered: T[] = []\r\n private filterState: TFilterState<T> = {}\r\n constructor(data: T[], filterState: TFilterState<T>) {\r\n this.data = data\r\n this.filterState = filterState\r\n this.dataFiltered = data.slice()\r\n }\r\n\r\n private autoMapConfigs: TAutoMapConfigs<T> = {}\r\n autoMap(configs?: TAutoMapConfigs<T>) {\r\n if (configs) this.autoMapConfigs = configs\r\n return this\r\n }\r\n\r\n //#region filter\r\n /** Register field filter config. Merged with autoMap.fields. */\r\n filter(config?: { fields?: TAutoMapFields<T> }) {\r\n if (config?.fields) this.autoMapConfigs.fields = { ...this.autoMapConfigs.fields, ...config.fields }\r\n return this\r\n }\r\n\r\n private handleFilter() {\r\n const fieldsMap = { ...this.autoMapConfigs.fields } as Record<string, TAutoMapField>\r\n const storeFilter = this.filterState.storeFilter || {}\r\n const globalLogic = this.filterState.filterLogic ?? 'and'\r\n // exclude 'quickSearch' — handled by handleQuickSearch\r\n const activeKeys = Object.keys(storeFilter).filter((k) => k !== 'quickSearch' && fieldsMap[k])\r\n\r\n this.dataFiltered = this.dataFiltered.filter((item) => {\r\n const perFieldResults = activeKeys.map((key) => {\r\n const fieldDef = fieldsMap[key]\r\n const fieldStore: TFieldValue = storeFilter[key as keyof typeof storeFilter]\r\n if (!fieldDef || !fieldStore || !fieldStore.values || fieldStore.values.length === 0) return null\r\n\r\n const op = fieldDef.operation ?? this.operation\r\n const values = Array.isArray(fieldStore.values) ? fieldStore.values : [fieldStore.values]\r\n const fieldLogic = fieldStore.logic ?? 'and'\r\n const itemValue = (item as any)[key]\r\n\r\n const matches = values.map((v) => {\r\n if (op === 'contains' && typeof itemValue === 'string' && typeof v === 'string') {\r\n return itemValue.toLowerCase().includes(v.toString().toLowerCase())\r\n }\r\n return itemValue === v\r\n })\r\n\r\n if (fieldLogic === 'and') return matches.every(Boolean)\r\n return matches.some(Boolean)\r\n })\r\n\r\n const validResults = perFieldResults.filter((r) => r !== null) as boolean[]\r\n if (validResults.length === 0) return true\r\n if (globalLogic === 'and') return validResults.every(Boolean)\r\n return validResults.some(Boolean)\r\n })\r\n }\r\n //#endregion\r\n\r\n //#region quick search\r\n /** Register quickSearch config. Merged with autoMap.quickSearchFields. */\r\n quickSearch(config?: { fields?: (keyof T)[] }) {\r\n if (config?.fields) {\r\n const fieldSet = new Set([...(this.autoMapConfigs.quickSearchFields ?? []), ...config.fields])\r\n this.autoMapConfigs.quickSearchFields = Array.from(fieldSet)\r\n }\r\n return this\r\n }\r\n\r\n private handleQuickSearch() {\r\n const quickFields = (this.autoMapConfigs.quickSearchFields ?? []) as string[]\r\n const storeFilter = this.filterState.storeFilter || {}\r\n const quickStore: TFieldValue = storeFilter['quickSearch' as keyof typeof storeFilter]\r\n\r\n if (!quickStore || quickFields.length === 0) return\r\n const qValues = Array.isArray(quickStore.values) ? quickStore.values : [quickStore.values]\r\n if (!qValues || qValues.length === 0) return\r\n\r\n const qLogic = quickStore.logic ?? 'or'\r\n\r\n this.dataFiltered = this.dataFiltered.filter((item) => {\r\n const matchesForAllQuick = qValues.map((qv) =>\r\n quickFields.some((kf) => {\r\n const val = (item as any)[kf]\r\n if (typeof val === 'string' && typeof qv === 'string') {\r\n return val.toLowerCase().includes(qv.toString().toLowerCase())\r\n }\r\n return val === qv\r\n })\r\n )\r\n return qLogic === 'and' ? matchesForAllQuick.every(Boolean) : matchesForAllQuick.some(Boolean)\r\n })\r\n }\r\n //#endregion\r\n\r\n //#region sort\r\n /** Register sort config. Merged with autoMap.sortFields. */\r\n sort(config?: { sortFields?: (keyof T)[] }) {\r\n if (config?.sortFields) this.autoMapConfigs.sortFields = [...(this.autoMapConfigs.sortFields ?? []), ...config.sortFields]\r\n return this\r\n }\r\n\r\n private handleSort() {\r\n const sortDef = this.filterState.storeSort\r\n const allowedSort = (this.autoMapConfigs.sortFields ?? []).map(String)\r\n\r\n if (!sortDef || !sortDef.field) return\r\n const sortField = String(sortDef.field)\r\n if (!allowedSort.includes(sortField)) return\r\n\r\n const dir = sortDef.direction ?? 'desc'\r\n const multiplier = dir === 'asc' ? 1 : -1\r\n\r\n this.dataFiltered.sort((a, b) => {\r\n const va = (a as any)[sortField]\r\n const vb = (b as any)[sortField]\r\n\r\n if (va == null && vb == null) return 0\r\n if (va == null) return -1 * multiplier\r\n if (vb == null) return 1 * multiplier\r\n\r\n const ta = typeof va\r\n if (ta === 'string' && typeof vb === 'string') return va.localeCompare(vb) * multiplier\r\n if (ta === 'number' && typeof vb === 'number') return (va - vb) * multiplier\r\n if (ta === 'boolean' && typeof vb === 'boolean') return ((va ? 1 : 0) - (vb ? 1 : 0)) * multiplier\r\n return String(va).localeCompare(String(vb)) * multiplier\r\n })\r\n }\r\n //#endregion\r\n\r\n build(): T[] {\r\n this.dataFiltered = this.data.slice()\r\n this.handleFilter()\r\n this.handleQuickSearch()\r\n this.handleSort()\r\n return this.dataFiltered\r\n }\r\n}\r\n\r\nexport const createLocalFilterBuilder = <T>(data: T[], filterState: TFilterState<T>) => {\r\n return new LocalFilterBuilder(data, filterState)\r\n}\r\n"],"names":["LocalFilterBuilder","_createClass","data","filterState","_classCallCheck","_defineProperty","this","dataFiltered","slice","key","value","configs","autoMapConfigs","config","fields","_objectSpread","_this$filterState$fil","_this","fieldsMap","storeFilter","globalLogic","filterLogic","activeKeys","Object","keys","filter","k","item","validResults","map","_fieldDef$operation","_fieldStore$logic","fieldDef","fieldStore","values","length","op","operation","Array","isArray","fieldLogic","logic","itemValue","matches","v","toLowerCase","includes","toString","every","Boolean","some","r","_this$autoMapConfigs$","fieldSet","Set","concat","_toConsumableArray","quickSearchFields","from","_this$autoMapConfigs$2","_quickStore$logic","quickFields","quickStore","qValues","qLogic","matchesForAllQuick","qv","kf","val","_this$autoMapConfigs$3","sortFields","_this$autoMapConfigs$4","_sortDef$direction","sortDef","storeSort","allowedSort","String","field","sortField","multiplier","direction","sort","a","b","va","vb","ta","_typeof","localeCompare","handleFilter","handleQuickSearch","handleSort","createLocalFilterBuilder"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{defineProperty as e,slicedToArray as l,toConsumableArray as i}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as n,jsxs as o}from"react/jsx-runtime";import{useMemo as r,useState as t}from"react";import{styled as a,formGroupClasses as u,FormGroup as s,FormControlLabel as c,Checkbox as v,Button as d,Box as m}from"@mui/material";import{createChipViewers as f}from"../components/chip-viewer.js";import{PopperContent as p,PopperBody as b,PopperFooter as g}from"../components/popper-custom.js";import{ButtonBack as h,ChipDark as y,FilterLogicToggle as C}from"../components/ui.units.js";import{getErrorMessage as x}from"../../form/helpers.js";function j(a){var u=f(),j=(a||{}).options,A=void 0===j?[]:j;return function(f){var j,z=r(function(){return Object.assign({},f.currentConfig,null==a?void 0:a.config)},[null==a?void 0:a.config,f.currentConfig]),S=f.value,B=void 0===S?{values:[],logic:"or"}:S,R=t(B.logic),T=l(R,2),V=T[0],w=T[1],F=null!==(j=null==z?void 0:z.label)&&void 0!==j?j:z.field.toString(),I=r(function(){var e=Array.isArray(B.values)?B.values:[B.values];return A.filter(function(l){return e.includes(l.value)}).map(function(e){return e.value})},[]),L=t(I),N=l(L,2),O=N[0],P=N[1],_=t({}),D=l(_,2),E=D[0],H=D[1],M=function(e){f.onSubmit(z.field,e,z)},q=x(E,z.field),G=r(function(){var e=Array.isArray(B.values)?B.values:[B.values];return{field:z.field,items:e.map(function(e){return{value:e}})}},[z.field,B]),J=[];return f.isLoading&&J.push("disabled"),n(k,{className:J.join(" "),noValidate:!0,onSubmit:function(l){var i;l.preventDefault();var n=e({},z.field,O),o=null===(i=f.validator)||void 0===i?void 0:i.run(n);(H(o||{}),o&&0!==Object.keys(o).length)||M({values:O,logic:V})},children:o(p,{title:"Filter by ".concat(F),onClose:f.onClose,slots:{beforeTitle:n(h,{size:"small",onClick:f.onBack}),afterTitle:z.singleValue?n(y,{sx:{ml:1.5},size:"small",label:"Last value only"}):!B.values||B.values.length<2?null:n(C,{sx:{ml:1},value:V,onChange:function(e,l){return function(e){w(e);var l={values:B.values,logic:e};M(l)}(l)}})},children:[o(b,{children:[n(u,{sx:{mb:1,borderBottom:"none!important"},label:"Applied",placement:"horizontal",enableMinimalesticView:!0,value:G,onRemove:f.onRemove}),n(s,{className:q.error?"error":"",children:A.map(function(e,l){var o,r=O.includes(e.value);return n(c,{value:e.value,label:null!==(o=e.label)&&void 0!==o?o:e.value,control:n(v,{name:z.field.toString(),checked:r,onChange:function(l){return n=e.value,o=l.target.checked,void P(function(e){return o?[].concat(i(e),[n]):e.filter(function(e){return e!==n})});var n,o}})},e.value.toString()+l)})})]}),o(g,{children:[n(d,{size:"small",color:"error",variant:"text",disabled:!B.values||0===B.values.length,onClick:function(){var e;null===(e=f.onRemoveField)||void 0===e||e.call(f,z.field)},children:"Clear All"}),n(m,{sx:{flex:1}}),n(d,{size:"small",color:"inherit",variant:"text",onClick:f.onClose,children:"Cancel"}),n(d,{size:"small",type:"submit",color:"primary",variant:"contained",children:"Apply"})]})]})})}}var k=a("form")(e({position:"relative","&::after":{content:'""',display:"block",position:"absolute",inset:0,backgroundColor:"rgba(0, 0, 0, 0.2)",filter:"blur(2px)",zIndex:-1,opacity:0,transition:"opacity 0.3s",visibility:"hidden"},"&.disabled":{pointerEvents:"none","&::after":{zIndex:1,opacity:1,visibility:"visible"}}},".".concat(u.root),{}));export{j as default};
|
|
2
|
+
//# sourceMappingURL=create-form-field-select-multiple.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-form-field-select-multiple.js","sources":["../../../../src/filter-bar/menu/create-form-field-select-multiple.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useMemo, useState } from 'react'\r\nimport { Box, Button, Checkbox, FormControlLabel, FormGroup, formGroupClasses, styled } from '@mui/material'\r\nimport { createChipViewers, TChipViewerGroup } from '../components/chip-viewer'\r\nimport { PopperBody, PopperContent, PopperFooter } from '../components/popper-custom'\r\nimport { ButtonBack, ChipDark, FilterLogicToggle } from '../components/ui.units'\r\n// types\r\nimport type { FC } from 'react'\r\nimport type { IPartialError } from '../../form/validator'\r\nimport type { IFieldSelectOption } from './create-form-field-select'\r\nimport type { TFieldModelValid, TFieldValid, TFieldValue, TLogic } from '../types'\r\nimport type { IFieldMenuConfig, IFilterMenuFormProps } from './types'\r\nimport { getErrorMessage } from '../../form'\r\n\r\nexport interface IFormFieldSelectMultipleProps<T> extends IFilterMenuFormProps<T> {}\r\n\r\nexport interface IFormFieldSelectMultipleParam<T> {\r\n /** Optional configuration for the form field */\r\n config?: IFieldMenuConfig<T>\r\n /** List of options for the select field */\r\n options: IFieldSelectOption[]\r\n}\r\n\r\nfunction createFormFieldSelectMultiple<T>(params?: IFormFieldSelectMultipleParam<T>) {\r\n const ChipViewers = createChipViewers<T>()\r\n const { options = [] } = params || {}\r\n\r\n const FormFieldSelectMultiple: FC<IFormFieldSelectMultipleProps<T>> = (props) => {\r\n /** Merge `props.currentConfig` with `params.config` (if provided).\r\n * Fields from `params.config` override the corresponding keys in `props.currentConfig`.\r\n * Any keys not present in `params.config` are preserved from `props.currentConfig`.\r\n */\r\n const mergedConfig = useMemo(() => Object.assign({}, props.currentConfig, params?.config), [params?.config, props.currentConfig])\r\n\r\n const { value = { values: [], logic: 'or' } } = props\r\n const [filterLogic, setFilterLogic] = useState<TLogic>(value.logic!)\r\n\r\n const label = mergedConfig?.label ?? mergedConfig.field.toString()\r\n\r\n // Track checked values as controlled state to avoid the uncontrolled→controlled MUI warning\r\n const initialChecked = useMemo<TFieldValid[]>(() => {\r\n const values = Array.isArray(value.values) ? value.values : [value.values]\r\n return options.filter((opt) => values.includes(opt.value)).map((opt) => opt.value)\r\n }, [])\r\n const [checkedValues, setCheckedValues] = useState<TFieldValid[]>(initialChecked)\r\n\r\n const [errorData, setErrorData] = useState<IPartialError<TFieldModelValid<T>>>({})\r\n\r\n const handleCheckboxChange = (optionValue: TFieldValid, checked: boolean) => {\r\n setCheckedValues((prev) => (checked ? [...prev, optionValue] : prev.filter((v) => v !== optionValue)))\r\n }\r\n\r\n const handleSubmit = (newValue: TFieldValue) => {\r\n props.onSubmit(mergedConfig.field, newValue, mergedConfig)\r\n }\r\n\r\n const handleSubmitForm = (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault()\r\n const obj = { [mergedConfig.field]: checkedValues } as Partial<TFieldModelValid<T>>\r\n let errorData = props.validator?.run(obj) as IPartialError<TFieldModelValid<T>>\r\n\r\n setErrorData(errorData || {})\r\n\r\n if (!errorData || Object.keys(errorData).length === 0) {\r\n const newValue: TFieldValue = { values: checkedValues, logic: filterLogic }\r\n handleSubmit(newValue)\r\n }\r\n }\r\n\r\n const errorResult = getErrorMessage(errorData, mergedConfig.field)\r\n const filterViewerValue = useMemo<TChipViewerGroup<T>>(() => {\r\n const items = Array.isArray(value.values) ? value.values : [value.values]\r\n return { field: mergedConfig.field, items: items.map((v) => ({ value: v })) }\r\n }, [mergedConfig.field, value])\r\n\r\n const handleChangeLogic = (newLogic: TLogic) => {\r\n setFilterLogic(newLogic)\r\n const newValue: TFieldValue = { values: value.values, logic: newLogic }\r\n handleSubmit(newValue)\r\n }\r\n\r\n const handleClearAll = () => {\r\n props.onRemoveField?.(mergedConfig.field)\r\n }\r\n\r\n const renderAfterTitle = () => {\r\n if (mergedConfig.singleValue) return <ChipDark sx={{ ml: 1.5 }} size='small' label='Last value only' />\r\n if (!value.values || value.values.length < 2) return null\r\n return <FilterLogicToggle sx={{ ml: 1 }} value={filterLogic} onChange={(_, nVal) => handleChangeLogic(nVal)} />\r\n }\r\n\r\n const rootClasses: string[] = []\r\n if (props.isLoading) rootClasses.push('disabled')\r\n\r\n return (\r\n <RootStyled className={rootClasses.join(' ')} noValidate onSubmit={handleSubmitForm}>\r\n <PopperContent\r\n title={`Filter by ${label}`}\r\n onClose={props.onClose}\r\n slots={{\r\n beforeTitle: <ButtonBack size='small' onClick={props.onBack} />,\r\n afterTitle: renderAfterTitle()\r\n }}\r\n >\r\n <PopperBody>\r\n <ChipViewers\r\n sx={{ mb: 1, borderBottom: 'none!important' }}\r\n label='Applied'\r\n placement='horizontal'\r\n enableMinimalesticView\r\n value={filterViewerValue}\r\n onRemove={props.onRemove}\r\n />\r\n <FormGroup className={errorResult.error ? 'error' : ''}>\r\n {options.map((x, i) => {\r\n const isChecked = checkedValues.includes(x.value as TFieldValid)\r\n return (\r\n <FormControlLabel\r\n key={x.value.toString() + i}\r\n value={x.value}\r\n label={x.label ?? x.value}\r\n control={\r\n <Checkbox\r\n name={mergedConfig.field.toString()}\r\n checked={isChecked}\r\n onChange={(e) => handleCheckboxChange(x.value as TFieldValid, e.target.checked)}\r\n />\r\n }\r\n />\r\n )\r\n })}\r\n </FormGroup>\r\n </PopperBody>\r\n <PopperFooter>\r\n <Button size='small' color='error' variant='text' disabled={!value.values || value.values.length === 0} onClick={handleClearAll}>\r\n Clear All\r\n </Button>\r\n <Box sx={{ flex: 1 }} />\r\n <Button size='small' color='inherit' variant='text' onClick={props.onClose}>\r\n Cancel\r\n </Button>\r\n <Button size='small' type='submit' color='primary' variant='contained'>\r\n Apply\r\n </Button>\r\n </PopperFooter>\r\n </PopperContent>\r\n </RootStyled>\r\n )\r\n }\r\n\r\n return FormFieldSelectMultiple\r\n}\r\n\r\nexport default createFormFieldSelectMultiple\r\n\r\nconst RootStyled = styled('form')({\r\n position: 'relative',\r\n '&::after': {\r\n content: '\"\"',\r\n display: 'block',\r\n position: 'absolute',\r\n inset: 0, // top: 0, left: 0, right: 0, bottom: 0\r\n backgroundColor: 'rgba(0, 0, 0, 0.2)',\r\n filter: 'blur(2px)',\r\n zIndex: -1,\r\n opacity: 0,\r\n transition: 'opacity 0.3s',\r\n visibility: 'hidden'\r\n },\r\n '&.disabled': {\r\n pointerEvents: 'none',\r\n '&::after': {\r\n zIndex: 1,\r\n opacity: 1,\r\n visibility: 'visible'\r\n }\r\n },\r\n [`.${formGroupClasses.root}`]: {}\r\n})\r\n"],"names":["createFormFieldSelectMultiple","params","ChipViewers","createChipViewers","_ref$options","options","props","_mergedConfig$label","mergedConfig","useMemo","Object","assign","currentConfig","config","_props$value","value","values","logic","_useState","useState","_useState2","_slicedToArray","filterLogic","setFilterLogic","label","field","toString","initialChecked","Array","isArray","filter","opt","includes","map","_useState3","_useState4","checkedValues","setCheckedValues","_useState5","_useState6","errorData","setErrorData","handleSubmit","newValue","onSubmit","errorResult","getErrorMessage","filterViewerValue","items","v","rootClasses","isLoading","push","_jsx","RootStyled","className","join","noValidate","event","_props$validator","preventDefault","obj","_defineProperty","validator","run","keys","length","children","_jsxs","PopperContent","title","concat","onClose","slots","beforeTitle","ButtonBack","size","onClick","onBack","afterTitle","singleValue","ChipDark","sx","ml","FilterLogicToggle","onChange","_","nVal","newLogic","handleChangeLogic","PopperBody","mb","borderBottom","placement","enableMinimalesticView","onRemove","FormGroup","error","x","i","_x$label","isChecked","FormControlLabel","control","Checkbox","name","checked","e","optionValue","target","prev","_toConsumableArray","PopperFooter","Button","color","variant","disabled","_props$onRemoveField","onRemoveField","call","Box","flex","type","styled","position","content","display","inset","backgroundColor","zIndex","opacity","transition","visibility","pointerEvents","formGroupClasses","root"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{defineProperty as e,slicedToArray as o}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as l,jsxs as r}from"react/jsx-runtime";import{useMemo as i,useState as n}from"react";import{styled as a,radioGroupClasses as t,RadioGroup as s,FormControlLabel as u,Typography as c,Radio as m,Button as v,Box as d}from"@mui/material";import{PopperContent as f,PopperBody as p,PopperFooter as b}from"../components/popper-custom.js";import{getErrorMessage as g,convertFormDataToJson as h}from"../../form/helpers.js";import{createChipViewers as y}from"../components/chip-viewer.js";import{ButtonBack as x,ChipDark as C,FilterLogicToggle as j}from"../components/ui.units.js";function z(e){var a=y(),t=e.options;return function(y){var z,A=i(function(){return Object.assign({},y.currentConfig,null==e?void 0:e.config)},[null==e?void 0:e.config,y.currentConfig]),F=y.value,S=void 0===F?{values:[],logic:"or"}:F,L=n(S.logic),M=o(L,2),R=M[0],T=M[1],w=null!==(z=null==A?void 0:A.label)&&void 0!==z?z:A.field.toString(),B=n({}),V=o(B,2),D=V[0],I=V[1],N=function(e){y.onSubmit(A.field,e,A)},O=g(D,A.field),P=i(function(){var e=Array.isArray(S.values)?S.values:[S.values];return{field:A.field,items:e.map(function(e){return{value:e}})}},[A.field,S]),_=[];return y.isLoading&&_.push("disabled"),l(k,{className:_.join(" "),noValidate:!0,onSubmit:function(e){var o;e.preventDefault();var l=new FormData(e.currentTarget),r=h(l),i=null===(o=y.validator)||void 0===o?void 0:o.run(r);if(I(i||{}),!i||0===Object.keys(i).length){var n=A.field,a=Array.isArray(r[n])?r[n]:[r[n]];N({values:a,logic:R})}},children:r(f,{title:"Filter by ".concat(w),onClose:y.onClose,slots:{beforeTitle:l(x,{size:"small",onClick:y.onBack}),afterTitle:A.singleValue?l(C,{sx:{ml:1.5},size:"small",label:"Last value only"}):!S.values||S.values.length<2?null:l(j,{sx:{ml:1},value:R,onChange:function(e,o){return function(e){T(e);var o={values:S.values,logic:e};N(o)}(o)}})},children:[r(p,{children:[l(a,{sx:{mb:1,borderBottom:"none!important"},label:"Applied",placement:"horizontal",enableMinimalesticView:!0,value:P,onRemove:y.onRemove}),l(s,{sx:{mx:-1},name:A.field.toString(),className:O.error?"error":"",children:t.map(function(e,o){var r;return l(u,{value:e.value,control:l(m,{size:"small"}),label:l(c,{variant:"body2",children:null!==(r=e.label)&&void 0!==r?r:e.value})},e.value.toString()+o)})}),O.error&&l(c,{variant:"caption",color:"error",sx:{mt:.5},children:O.message})]}),r(b,{children:[l(v,{size:"small",color:"error",variant:"text",disabled:!S.values||0===S.values.length,onClick:function(){var e;null===(e=y.onRemoveField)||void 0===e||e.call(y,A.field)},children:"Clear All"}),l(d,{sx:{flex:1}}),l(v,{size:"small",color:"inherit",variant:"text",onClick:y.onClose,children:"Cancel"}),l(v,{size:"small",type:"submit",color:"primary",variant:"contained",children:"Apply"})]})]})})}}var k=a("form")(e({position:"relative","&::after":{content:'""',display:"block",position:"absolute",inset:0,backgroundColor:"rgba(0, 0, 0, 0.2)",filter:"blur(2px)",zIndex:-1,opacity:0,transition:"opacity 0.3s",visibility:"hidden"},"&.disabled":{pointerEvents:"none","&::after":{zIndex:1,opacity:1,visibility:"visible"}}},".".concat(t.root),{"&.error .MuiRadio-root":{color:"#d32f2f"},".MuiFormControlLabel-root":{margin:0},".MuiFormControlLabel-root:hover":{backgroundColor:"rgba(25, 118, 210, 0.04)"}}));export{z as default};
|
|
2
|
+
//# sourceMappingURL=create-form-field-select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-form-field-select.js","sources":["../../../../src/filter-bar/menu/create-form-field-select.tsx"],"sourcesContent":["import { createRef, FC, useMemo, useState } from 'react'\r\nimport { Box, Button, FormControlLabel, Radio, RadioGroup, radioGroupClasses, styled, Typography } from '@mui/material'\r\nimport { PopperBody, PopperContent, PopperFooter } from '../components/popper-custom'\r\nimport { convertFormDataToJson, getErrorMessage } from '../../form/helpers'\r\nimport { createChipViewers, TChipViewerGroup } from '../components/chip-viewer'\r\nimport { ButtonBack, ChipDark, FilterLogicToggle } from '../components/ui.units'\r\nimport type { IPartialError } from '../../form/validator'\r\nimport type { IFieldMenuConfig, IFilterMenuFormProps } from './types'\r\nimport type { TFieldModelValid, TFieldValid, TFieldValue, TLogic } from '../types'\r\n\r\nexport interface IFormFieldSelectProps<T> extends IFilterMenuFormProps<T> {}\r\n\r\nexport interface IFieldSelectOption {\r\n value: TFieldValid\r\n label?: string\r\n}\r\n\r\nexport interface IFormFieldSelectParams<T> {\r\n /** Optional configuration for the form field */\r\n config?: IFieldMenuConfig<T>\r\n /** List of options for the select field */\r\n options: IFieldSelectOption[]\r\n}\r\n\r\nfunction createFormFieldSelect<T>(params: IFormFieldSelectParams<T>) {\r\n const ChipViewers = createChipViewers<T>()\r\n const { options } = params\r\n\r\n const FormFieldSelect: FC<IFormFieldSelectProps<T>> = (props) => {\r\n /** Merge `props.currentConfig` with `params.config` (if provided).\r\n * Fields from `params.config` override the corresponding keys in `props.currentConfig`.\r\n * Any keys not present in `params.config` are preserved from `props.currentConfig`.\r\n */\r\n const mergedConfig = useMemo(() => Object.assign({}, props.currentConfig, params?.config), [params?.config, props.currentConfig])\r\n\r\n const { value = { values: [], logic: 'or' } } = props\r\n const [filterLogic, setFilterLogic] = useState<TLogic>(value.logic!)\r\n\r\n const label = mergedConfig?.label ?? mergedConfig.field.toString()\r\n\r\n const [errorData, setErrorData] = useState<IPartialError<TFieldModelValid<T>>>({})\r\n const handleSubmit = (newValue: TFieldValue) => {\r\n props.onSubmit(mergedConfig.field, newValue, mergedConfig)\r\n }\r\n\r\n const handleSubmitForm = (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault()\r\n const formData = new FormData(event.currentTarget)\r\n const obj = convertFormDataToJson<TFieldModelValid<T>>(formData)\r\n let errorData = props.validator?.run(obj) as IPartialError<TFieldModelValid<T>>\r\n\r\n setErrorData(errorData || {})\r\n\r\n if (!errorData || Object.keys(errorData).length === 0) {\r\n const { field } = mergedConfig\r\n const newValues = (Array.isArray(obj[field]) ? obj[field] : [obj[field]]) as TFieldValid[]\r\n const newValue: TFieldValue = { values: newValues, logic: filterLogic }\r\n handleSubmit(newValue)\r\n }\r\n }\r\n\r\n const errorResult = getErrorMessage(errorData, mergedConfig.field)\r\n const filterViewerValue = useMemo<TChipViewerGroup<T>>(() => {\r\n const items = Array.isArray(value.values) ? value.values : [value.values]\r\n return { field: mergedConfig.field, items: items.map((v) => ({ value: v })) }\r\n }, [mergedConfig.field, value])\r\n\r\n const handleChangeLogic = (newLogic: TLogic) => {\r\n setFilterLogic(newLogic)\r\n const newValue: TFieldValue = { values: value.values, logic: newLogic }\r\n handleSubmit(newValue)\r\n }\r\n\r\n const handleClearAll = () => {\r\n props.onRemoveField?.(mergedConfig.field)\r\n }\r\n\r\n const renderAfterTitle = () => {\r\n if (mergedConfig.singleValue) return <ChipDark sx={{ ml: 1.5 }} size='small' label='Last value only' />\r\n if (!value.values || value.values.length < 2) return null\r\n return <FilterLogicToggle sx={{ ml: 1 }} value={filterLogic} onChange={(_, nVal) => handleChangeLogic(nVal)} />\r\n }\r\n\r\n const rootClasses: string[] = []\r\n if (props.isLoading) rootClasses.push('disabled')\r\n\r\n return (\r\n <RootStyled className={rootClasses.join(' ')} noValidate onSubmit={handleSubmitForm}>\r\n <PopperContent\r\n title={`Filter by ${label}`}\r\n onClose={props.onClose}\r\n slots={{\r\n beforeTitle: <ButtonBack size='small' onClick={props.onBack} />,\r\n afterTitle: renderAfterTitle()\r\n }}\r\n >\r\n <PopperBody>\r\n <ChipViewers\r\n sx={{ mb: 1, borderBottom: 'none!important' }}\r\n label='Applied'\r\n placement='horizontal'\r\n enableMinimalesticView\r\n value={filterViewerValue}\r\n onRemove={props.onRemove}\r\n />\r\n <RadioGroup sx={{ mx: -1 }} name={mergedConfig.field.toString()} className={errorResult.error ? 'error' : ''}>\r\n {options.map((x, i) => (\r\n <FormControlLabel\r\n key={x.value.toString() + i}\r\n value={x.value}\r\n control={<Radio size='small' />}\r\n label={<Typography variant='body2'>{x.label ?? x.value}</Typography>}\r\n />\r\n ))}\r\n </RadioGroup>\r\n {errorResult.error && (\r\n <Typography variant='caption' color='error' sx={{ mt: 0.5 }}>\r\n {errorResult.message}\r\n </Typography>\r\n )}\r\n </PopperBody>\r\n <PopperFooter>\r\n <Button size='small' color='error' variant='text' disabled={!value.values || value.values.length === 0} onClick={handleClearAll}>\r\n Clear All\r\n </Button>\r\n <Box sx={{ flex: 1 }} />\r\n <Button size='small' color='inherit' variant='text' onClick={props.onClose}>\r\n Cancel\r\n </Button>\r\n <Button size='small' type='submit' color='primary' variant='contained'>\r\n Apply\r\n </Button>\r\n </PopperFooter>\r\n </PopperContent>\r\n </RootStyled>\r\n )\r\n }\r\n\r\n return FormFieldSelect\r\n}\r\n\r\nexport default createFormFieldSelect\r\n\r\nconst RootStyled = styled('form')({\r\n position: 'relative',\r\n '&::after': {\r\n content: '\"\"',\r\n display: 'block',\r\n position: 'absolute',\r\n inset: 0, // top: 0, left: 0, right: 0, bottom: 0\r\n backgroundColor: 'rgba(0, 0, 0, 0.2)',\r\n filter: 'blur(2px)',\r\n zIndex: -1,\r\n opacity: 0,\r\n transition: 'opacity 0.3s',\r\n visibility: 'hidden'\r\n },\r\n '&.disabled': {\r\n pointerEvents: 'none',\r\n '&::after': {\r\n zIndex: 1,\r\n opacity: 1,\r\n visibility: 'visible'\r\n }\r\n },\r\n [`.${radioGroupClasses.root}`]: {\r\n '&.error .MuiRadio-root': { color: '#d32f2f' },\r\n '.MuiFormControlLabel-root': { margin: 0 },\r\n '.MuiFormControlLabel-root:hover': { backgroundColor: 'rgba(25, 118, 210, 0.04)' }\r\n }\r\n})\r\n"],"names":["createFormFieldSelect","params","ChipViewers","createChipViewers","options","props","_mergedConfig$label","mergedConfig","useMemo","Object","assign","currentConfig","config","_props$value","value","values","logic","_useState","useState","_useState2","_slicedToArray","filterLogic","setFilterLogic","label","field","toString","_useState3","_useState4","errorData","setErrorData","handleSubmit","newValue","onSubmit","errorResult","getErrorMessage","filterViewerValue","items","Array","isArray","map","v","rootClasses","isLoading","push","_jsx","RootStyled","className","join","noValidate","event","_props$validator","preventDefault","formData","FormData","currentTarget","obj","convertFormDataToJson","validator","run","keys","length","newValues","children","_jsxs","PopperContent","title","concat","onClose","slots","beforeTitle","ButtonBack","size","onClick","onBack","afterTitle","singleValue","ChipDark","sx","ml","FilterLogicToggle","onChange","_","nVal","newLogic","handleChangeLogic","PopperBody","mb","borderBottom","placement","enableMinimalesticView","onRemove","RadioGroup","mx","name","error","x","i","_x$label","FormControlLabel","control","Radio","Typography","variant","color","mt","message","PopperFooter","Button","disabled","_props$onRemoveField","onRemoveField","call","Box","flex","type","styled","_defineProperty","position","content","display","inset","backgroundColor","filter","zIndex","opacity","transition","visibility","pointerEvents","radioGroupClasses","root","margin"],"mappings":"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"}
|