dinocollab-core 2.2.22 → 2.2.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- export{KeySpecial}from"../src/filter-bar/types.js";export{createFilterBar}from"../src/filter-bar/index.create.js";export{HintIcon,HintList,createHintIcon}from"../src/filter-bar/components/hint-icon.js";export{TableFileterConverter,createConvertToGraphQL,mapLogic,mapSortDirection}from"../src/filter-bar/convert-to-graphql.js";export{LocalFilterBuilder,createLocalFilterBuilder}from"../src/filter-bar/local-filter-builder.js";export{DinoFilterBar,dinoFilterBar}from"../src/filter-bar/index.dino.js";export{createFormFieldDateTime,formatterDateTime}from"../src/filter-bar/menu/create-form-field-datetime.js";
1
+ export{KeySpecial}from"../src/filter-bar/types.js";export{createFilterBar}from"../src/filter-bar/index.create.js";export{HintIcon,HintList,createHintIcon}from"../src/filter-bar/components/hint-icon.js";export{TableFileterConverter,createConvertToGraphQL,mapLogic,mapSortDirection}from"../src/filter-bar/convert-to-graphql.js";export{LocalFilterBuilder,createLocalFilterBuilder}from"../src/filter-bar/local-filter-builder.js";export{DinoFilterBar,dinoFilterBar}from"../src/filter-bar/index.dino.js";export{createFormFieldDateTime,formatterDateTime}from"../src/filter-bar/menu/create-form-field-datetime.js";export{mergeSingleValueToStoreFilter,mergeValueToStoreFilter}from"../src/filter-bar/hooks.js";
2
2
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- import{defineProperty as e,slicedToArray as i}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsxs as t,jsx as n,Fragment as o}from"react/jsx-runtime";import{useMemo as a,useState as r}from"react";import{styled as l,Box as c,Typography as m,Tooltip as p,Chip as s}from"@mui/material";import u from"@mui/icons-material/MoreHoriz";function h(){var e=function(e){var i=e.item,t=e.group,o=e.onRemove,a=t.field,r=t.label,l=t.chipMinWidth,c=i.label||i.value.toString();return n(s,{size:"small",title:c,label:c,className:d.itemChip,sx:l?{minWidth:l}:void 0,onDelete:o?function(){return o(a,i.value)}:void 0},"".concat(r,"-").concat(i.value))},l=function(a){var l=r(!1),c=i(l,2),m=c[0],h=c[1],f=a.group,g=a.onRemove,v=a.enableMinimalesticView,w=a.forceShowAll,b=f.items;if(v&&b.length>1&&!m&&!w)return t(o,{children:[n(p,{title:"".concat(b.length-1," more, click to expand"),placement:"top",arrow:!0,children:n(s,{icon:n(u,{fontSize:"small"}),label:"".concat(b.length-1,"+"),size:"small",className:d.itemChip,style:{opacity:.7},onClick:function(){return h(!0)}})}),n(e,{item:b[b.length-1],group:f,onRemove:g})]});var C=m&&b.length>1;return t(o,{children:[C&&n(p,{title:"Show less",placement:"top",arrow:!0,children:n(s,{icon:n(u,{fontSize:"small"}),size:"small",className:d.itemChip,sx:{opacity:.7,".MuiChip-label":{pl:0}},onClick:function(){return h(!1)}})}),b.map(function(i){return n(e,{item:i,group:f,onRemove:g},i.value.toString())})]})};return function(e){var i=e.value,o=void 0===i?[]:i,r=e.onRemove,c=e.placement,p=e.label,s=e.enableMinimalesticView,u=e.forceShowAll,h=[d.item];"vertical"===c?h.push(d.itemVertical):"horizontal"===c&&h.push(d.itemHorizontal);var g=a(function(){return o?(Array.isArray(o)?o:[o]).filter(function(e){return e.items&&e.items.length>0}):[]},[o]);return 0===g.length?null:t(f,{sx:e.sx,className:h.filter(Boolean).join(" "),children:[Boolean(p)&&t(m,{variant:"caption",className:d.itemLabel,children:[p||"ChipViewer",":"]}),n("div",{className:d.itemContent,children:g.map(function(e){var i=e.field,o=e.label;return t("div",{className:d.itemGroup,children:[o&&t(m,{variant:"caption",className:d.itemLabel,children:[o,":"]}),n(l,{group:e,onRemove:r,enableMinimalesticView:s,forceShowAll:u})]},i.toString())})})]})}}var d={item:"DinoChipViewer-item",itemLabel:"DinoChipViewer-itemLabel",itemChip:"DinoChipViewer-itemChip",itemGroup:"DinoChipViewer-itemGroup",itemContent:"DinoChipViewer-itemContent",sort:"DinoChipViewer-sort",itemVertical:"DinoChipViewer-itemVertical",itemHorizontal:"DinoChipViewer-itemHorizontal"},f=l(c)(function(i){var t=i.theme;return e(e(e(e(e({},".".concat(d.itemLabel),{fontWeight:700,marginLeft:t.spacing(.5),lineHeight:1}),".".concat(d.itemChip),{borderRadius:"4px",maxWidth:"100px","& .MuiChip-label":{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}}),".".concat(d.itemGroup),{display:"flex",flexWrap:"wrap",border:"dashed 1px ".concat(t.palette.divider),borderRadius:t.shape.borderRadius,alignItems:"center",padding:t.spacing(.25),gap:t.spacing(.5)}),".".concat(d.itemContent),e({display:"flex",flexWrap:"wrap",gap:t.spacing(.5)},".".concat(d.itemLabel),{fontWeight:500,color:t.palette.text.secondary})),"&.".concat(d.item),e(e({display:"flex",flexDirection:"row",alignItems:"center",gap:t.spacing(1),padding:t.spacing(.25,.5),"&:last-child":{marginBottom:0,borderBottom:"none",paddingBottom:0}},"&.".concat(d.sort),{".MuiChip-label > div":{display:"flex",alignItems:"center",gap:4},".MuiSvgIcon-root":{fontSize:12}}),"&.".concat(d.itemVertical),{flexDirection:"column",alignItems:"flex-start"}))});export{h as createChipViewers};
1
+ import{defineProperty as e,slicedToArray as i}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsxs as t,jsx as a,Fragment as n}from"react/jsx-runtime";import{useMemo as l,useState as o}from"react";import{styled as r,Box as c,Typography as m,Tooltip as s,Chip as p}from"@mui/material";import d from"@mui/icons-material/MoreHoriz";function u(){var e=function(e){var i=e.item,t=e.group,n=e.onRemove,l=e.disabled,o=t.field,r=t.label,c=t.chipMinWidth,m=i.label||i.value.toString();return a(p,{size:"small",title:m,label:m,disabled:l,className:h.itemChip,sx:c?{minWidth:c}:void 0,onDelete:n?function(){return n(o,i.value)}:void 0},"".concat(r,"-").concat(i.value))},r=function(l){var r=o(!1),c=i(r,2),m=c[0],u=c[1],f=l.group,g=l.onRemove,b=l.enableMinimalesticView,v=l.forceShowAll,w=f.items;if(b&&w.length>1&&!m&&!v)return t(n,{children:[a(s,{title:"".concat(w.length-1," more, click to expand"),placement:"top",arrow:!0,children:a(p,{icon:a(d,{fontSize:"small"}),label:"".concat(w.length-1,"+"),size:"small",disabled:l.disabled,className:h.itemChip,style:{opacity:.7},onClick:function(){return u(!0)}})}),a(e,{item:w[w.length-1],group:f,onRemove:g,disabled:l.disabled})]});var C=m&&w.length>1;return t(n,{children:[C&&a(s,{title:"Show less",placement:"top",arrow:!0,children:a(p,{icon:a(d,{fontSize:"small"}),size:"small",className:h.itemChip,sx:{opacity:.7,".MuiChip-label":{pl:0}},onClick:function(){return u(!1)},disabled:l.disabled})}),w.map(function(i){return a(e,{item:i,group:f,onRemove:g,disabled:l.disabled},i.value.toString())})]})};return function(e){var i=e.value,n=void 0===i?[]:i,o=e.onRemove,c=e.placement,s=e.label,p=e.enableMinimalesticView,d=e.forceShowAll,u=e.disabled,g=[h.item];"vertical"===c?g.push(h.itemVertical):"horizontal"===c&&g.push(h.itemHorizontal);var b=l(function(){return n?(Array.isArray(n)?n:[n]).filter(function(e){return e.items&&e.items.length>0}):[]},[n]);return 0===b.length?null:t(f,{sx:e.sx,className:g.filter(Boolean).join(" "),children:[Boolean(s)&&t(m,{variant:"caption",className:h.itemLabel,children:[s||"ChipViewer",":"]}),a("div",{className:h.itemContent,children:b.map(function(e){var i=e.field,n=e.label;return t("div",{className:h.itemGroup,children:[n&&t(m,{variant:"caption",className:h.itemLabel,children:[n,":"]}),a(r,{group:e,onRemove:o,enableMinimalesticView:p,forceShowAll:d,disabled:u})]},i.toString())})})]})}}var h={item:"DinoChipViewer-item",itemLabel:"DinoChipViewer-itemLabel",itemChip:"DinoChipViewer-itemChip",itemGroup:"DinoChipViewer-itemGroup",itemContent:"DinoChipViewer-itemContent",sort:"DinoChipViewer-sort",itemVertical:"DinoChipViewer-itemVertical",itemHorizontal:"DinoChipViewer-itemHorizontal"},f=r(c)(function(i){var t=i.theme;return e(e(e(e(e({},".".concat(h.itemLabel),{fontWeight:700,marginLeft:t.spacing(.5),lineHeight:1}),".".concat(h.itemChip),{borderRadius:"4px",maxWidth:"100px","& .MuiChip-label":{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}}),".".concat(h.itemGroup),{display:"flex",flexWrap:"wrap",border:"dashed 1px ".concat(t.palette.divider),borderRadius:t.shape.borderRadius,alignItems:"center",padding:t.spacing(.25),gap:t.spacing(.5)}),".".concat(h.itemContent),e({display:"flex",flexWrap:"wrap",gap:t.spacing(.5)},".".concat(h.itemLabel),{fontWeight:500,color:t.palette.text.secondary})),"&.".concat(h.item),e(e({display:"flex",flexDirection:"row",alignItems:"center",gap:t.spacing(1),padding:t.spacing(.25,.5),"&:last-child":{marginBottom:0,borderBottom:"none",paddingBottom:0}},"&.".concat(h.sort),{".MuiChip-label > div":{display:"flex",alignItems:"center",gap:4},".MuiSvgIcon-root":{fontSize:12}}),"&.".concat(h.itemVertical),{flexDirection:"column",alignItems:"flex-start"}))});export{u as createChipViewers};
2
2
  //# sourceMappingURL=chip-viewer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chip-viewer.js","sources":["../../../../src/filter-bar/components/chip-viewer.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, Chip, styled, Tooltip, Typography } from '@mui/material'\r\nimport MoreHorizIcon from '@mui/icons-material/MoreHoriz'\r\n// types\r\nimport type { FC } from 'react'\r\nimport type { SxProps, Theme } from '@mui/material'\r\nimport type { TFieldType, TFieldValid } from '../types'\r\n\r\nexport interface IChipViewerItem<O = any> {\r\n value: TFieldValid\r\n label?: string\r\n other?: O\r\n}\r\n\r\nexport interface TChipViewerGroup<T, O = any> {\r\n field: TFieldType<T>\r\n label?: string\r\n items: IChipViewerItem<O>[]\r\n chipMinWidth?: number | string\r\n}\r\n\r\nexport type TOnRemoveFilterFunc<T> = (field: TFieldType<T>, value: TFieldValid) => void\r\n\r\ninterface IChipViewerProps<T> {\r\n value?: TChipViewerGroup<T> | TChipViewerGroup<T>[]\r\n onRemove?: TOnRemoveFilterFunc<T>\r\n placement?: 'vertical' | 'horizontal'\r\n /** Option to set a custom label for the group. */\r\n label?: string | boolean\r\n /** Enable minimalistic view: only show the last item, hide the rest as an icon at the start */\r\n enableMinimalesticView?: boolean\r\n sx?: SxProps<Theme>\r\n forceShowAll?: boolean\r\n}\r\n\r\ninterface IChipItemProps<T> extends Pick<IChipViewerProps<T>, 'onRemove'> {\r\n item: IChipViewerItem\r\n group: TChipViewerGroup<T>\r\n}\r\n\r\ninterface IChipListProps<T> extends Pick<IChipViewerProps<T>, 'onRemove' | 'enableMinimalesticView' | 'forceShowAll'> {\r\n group: TChipViewerGroup<T>\r\n}\r\n\r\nexport function createChipViewers<T>() {\r\n const ChipItem: FC<IChipItemProps<T>> = (props) => {\r\n const { item, group, onRemove } = props\r\n const { field, label, chipMinWidth } = group\r\n const itemLabel = item.label || item.value.toString()\r\n return (\r\n <Chip\r\n key={`${label}-${item.value}`}\r\n size='small'\r\n title={itemLabel}\r\n label={itemLabel}\r\n className={classes.itemChip}\r\n sx={chipMinWidth ? { minWidth: chipMinWidth } : undefined}\r\n onDelete={onRemove ? () => onRemove(field, item.value) : undefined}\r\n />\r\n )\r\n }\r\n\r\n const ChipList: FC<IChipListProps<T>> = (props) => {\r\n const [expanded, setExpanded] = useState<boolean>(false)\r\n const { group, onRemove, enableMinimalesticView, forceShowAll } = props\r\n const { items } = group\r\n const isMinimalistic = enableMinimalesticView && items.length > 1 && !expanded && !forceShowAll\r\n if (isMinimalistic) {\r\n return (\r\n <>\r\n <Tooltip title={`${items.length - 1} more, click to expand`} placement='top' arrow>\r\n <Chip\r\n icon={<MoreHorizIcon fontSize='small' />}\r\n label={`${items.length - 1}+`}\r\n size='small'\r\n className={classes.itemChip}\r\n style={{ opacity: 0.7 }}\r\n onClick={() => setExpanded(true)}\r\n />\r\n </Tooltip>\r\n <ChipItem item={items[items.length - 1]} group={group} onRemove={onRemove} />\r\n </>\r\n )\r\n }\r\n const isBtnShowLess = expanded && items.length > 1\r\n return (\r\n <>\r\n {isBtnShowLess && (\r\n <Tooltip title='Show less' placement='top' arrow>\r\n <Chip\r\n icon={<MoreHorizIcon fontSize='small' />}\r\n // label={false}\r\n size='small'\r\n className={classes.itemChip}\r\n sx={{ opacity: 0.7, '.MuiChip-label': { pl: 0 } }}\r\n onClick={() => setExpanded(false)}\r\n />\r\n </Tooltip>\r\n )}\r\n {items.map((item) => (\r\n <ChipItem key={item.value.toString()} item={item} group={group} onRemove={onRemove} />\r\n ))}\r\n </>\r\n )\r\n }\r\n\r\n const ChipViewer: FC<IChipViewerProps<T>> = (props) => {\r\n const { value = [], onRemove, placement, label, enableMinimalesticView, forceShowAll } = props\r\n\r\n const rootClasses = [classes.item]\r\n if (placement === 'vertical') rootClasses.push(classes.itemVertical)\r\n else if (placement === 'horizontal') rootClasses.push(classes.itemHorizontal)\r\n\r\n const data = useMemo(() => {\r\n if (!value) return []\r\n const valueArray = Array.isArray(value) ? value : [value]\r\n return valueArray.filter((group) => group.items && group.items.length > 0)\r\n }, [value])\r\n\r\n if (data.length === 0) return null\r\n\r\n return (\r\n <ItemStyled sx={props.sx} className={rootClasses.filter(Boolean).join(' ')}>\r\n {Boolean(label) && (\r\n <Typography variant='caption' className={classes.itemLabel}>\r\n {label || 'ChipViewer'}:\r\n </Typography>\r\n )}\r\n <div className={classes.itemContent}>\r\n {data.map((group) => {\r\n const { field, label } = group\r\n return (\r\n <div key={field.toString()} className={classes.itemGroup}>\r\n {label && (\r\n <Typography variant='caption' className={classes.itemLabel}>\r\n {label}:\r\n </Typography>\r\n )}\r\n <ChipList group={group} onRemove={onRemove} enableMinimalesticView={enableMinimalesticView} forceShowAll={forceShowAll} />\r\n </div>\r\n )\r\n })}\r\n </div>\r\n </ItemStyled>\r\n )\r\n }\r\n\r\n return ChipViewer\r\n}\r\n\r\n//#region styles\r\nconst chipViewerClasses = {\r\n root: 'DinoChipViewer-root',\r\n item: 'DinoChipViewer-item',\r\n itemLabel: 'DinoChipViewer-itemLabel',\r\n itemChip: 'DinoChipViewer-itemChip',\r\n itemGroup: 'DinoChipViewer-itemGroup',\r\n itemContent: 'DinoChipViewer-itemContent',\r\n sort: 'DinoChipViewer-sort',\r\n itemVertical: 'DinoChipViewer-itemVertical',\r\n itemHorizontal: 'DinoChipViewer-itemHorizontal'\r\n}\r\n\r\nconst classes = chipViewerClasses\r\n\r\nconst ItemStyled = styled(Box)(({ theme }) => ({\r\n [`.${classes.itemLabel}`]: {\r\n fontWeight: 700,\r\n marginLeft: theme.spacing(0.5),\r\n lineHeight: 1\r\n },\r\n [`.${classes.itemChip}`]: {\r\n borderRadius: '4px',\r\n maxWidth: '100px',\r\n '& .MuiChip-label': { whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }\r\n },\r\n [`.${classes.itemGroup}`]: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n border: `dashed 1px ${theme.palette.divider}`,\r\n borderRadius: theme.shape.borderRadius,\r\n alignItems: 'center',\r\n padding: theme.spacing(0.25),\r\n gap: theme.spacing(0.5)\r\n },\r\n [`.${classes.itemContent}`]: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n gap: theme.spacing(0.5),\r\n [`.${classes.itemLabel}`]: {\r\n fontWeight: 500,\r\n color: theme.palette.text.secondary\r\n }\r\n },\r\n [`&.${classes.item}`]: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n gap: theme.spacing(1),\r\n padding: theme.spacing(0.25, 0.5),\r\n // borderBottom: `1px solid ${theme.palette.grey[100]}`,\r\n '&:last-child': { marginBottom: 0, borderBottom: 'none', paddingBottom: 0 },\r\n [`&.${classes.sort}`]: {\r\n '.MuiChip-label > div': { display: 'flex', alignItems: 'center', gap: 4 },\r\n '.MuiSvgIcon-root': { fontSize: 12 }\r\n },\r\n [`&.${classes.itemVertical}`]: { flexDirection: 'column', alignItems: 'flex-start' }\r\n // [`&.${classes.itemHorizontal}`]: { flexDirection: 'row', alignItems: 'center' }\r\n }\r\n}))\r\n//#endregion\r\n"],"names":["createChipViewers","ChipItem","props","item","group","onRemove","field","label","chipMinWidth","itemLabel","value","toString","_jsx","Chip","size","title","className","classes","itemChip","sx","minWidth","undefined","onDelete","concat","ChipList","_useState","useState","_useState2","_slicedToArray","expanded","setExpanded","enableMinimalesticView","forceShowAll","items","length","_jsxs","Tooltip","placement","arrow","children","icon","MoreHorizIcon","fontSize","style","opacity","onClick","isBtnShowLess","_Fragment","pl","map","_props$value","rootClasses","push","itemVertical","itemHorizontal","data","useMemo","Array","isArray","filter","ItemStyled","Boolean","join","Typography","variant","itemContent","itemGroup","sort","styled","Box","_ref","theme","_defineProperty","fontWeight","marginLeft","spacing","lineHeight","borderRadius","maxWidth","whiteSpace","overflow","textOverflow","display","flexWrap","border","palette","divider","shape","alignItems","padding","gap","color","text","secondary","flexDirection","marginBottom","borderBottom","paddingBottom"],"mappings":"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"}
1
+ {"version":3,"file":"chip-viewer.js","sources":["../../../../src/filter-bar/components/chip-viewer.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, Chip, styled, Tooltip, Typography } from '@mui/material'\r\nimport MoreHorizIcon from '@mui/icons-material/MoreHoriz'\r\n// types\r\nimport type { FC } from 'react'\r\nimport type { SxProps, Theme } from '@mui/material'\r\nimport type { TFieldType, TFieldValid } from '../types'\r\n\r\nexport interface IChipViewerItem<O = any> {\r\n value: TFieldValid\r\n label?: string\r\n other?: O\r\n}\r\n\r\nexport interface TChipViewerGroup<T, O = any> {\r\n field: TFieldType<T>\r\n label?: string\r\n items: IChipViewerItem<O>[]\r\n chipMinWidth?: number | string\r\n}\r\n\r\nexport type TOnRemoveFilterFunc<T> = (field: TFieldType<T>, value: TFieldValid) => void\r\n\r\ninterface IChipViewerProps<T> {\r\n value?: TChipViewerGroup<T> | TChipViewerGroup<T>[]\r\n onRemove?: TOnRemoveFilterFunc<T>\r\n placement?: 'vertical' | 'horizontal'\r\n /** Option to set a custom label for the group. */\r\n label?: string | boolean\r\n /** Enable minimalistic view: only show the last item, hide the rest as an icon at the start */\r\n enableMinimalesticView?: boolean\r\n sx?: SxProps<Theme>\r\n forceShowAll?: boolean\r\n disabled?: boolean\r\n}\r\n\r\ninterface IChipItemProps<T> extends Pick<IChipViewerProps<T>, 'onRemove' | 'disabled'> {\r\n item: IChipViewerItem\r\n group: TChipViewerGroup<T>\r\n}\r\n\r\ninterface IChipListProps<T> extends Pick<IChipViewerProps<T>, 'onRemove' | 'enableMinimalesticView' | 'forceShowAll' | 'disabled'> {\r\n group: TChipViewerGroup<T>\r\n}\r\n\r\nexport function createChipViewers<T>() {\r\n const ChipItem: FC<IChipItemProps<T>> = (props) => {\r\n const { item, group, onRemove, disabled } = props\r\n const { field, label, chipMinWidth } = group\r\n const itemLabel = item.label || item.value.toString()\r\n return (\r\n <Chip\r\n key={`${label}-${item.value}`}\r\n size='small'\r\n title={itemLabel}\r\n label={itemLabel}\r\n disabled={disabled}\r\n className={classes.itemChip}\r\n sx={chipMinWidth ? { minWidth: chipMinWidth } : undefined}\r\n onDelete={onRemove ? () => onRemove(field, item.value) : undefined}\r\n />\r\n )\r\n }\r\n\r\n const ChipList: FC<IChipListProps<T>> = (props) => {\r\n const [expanded, setExpanded] = useState<boolean>(false)\r\n const { group, onRemove, enableMinimalesticView, forceShowAll } = props\r\n const { items } = group\r\n const isMinimalistic = enableMinimalesticView && items.length > 1 && !expanded && !forceShowAll\r\n if (isMinimalistic) {\r\n return (\r\n <>\r\n <Tooltip title={`${items.length - 1} more, click to expand`} placement='top' arrow>\r\n <Chip\r\n icon={<MoreHorizIcon fontSize='small' />}\r\n label={`${items.length - 1}+`}\r\n size='small'\r\n disabled={props.disabled}\r\n className={classes.itemChip}\r\n style={{ opacity: 0.7 }}\r\n onClick={() => setExpanded(true)}\r\n />\r\n </Tooltip>\r\n <ChipItem item={items[items.length - 1]} group={group} onRemove={onRemove} disabled={props.disabled} />\r\n </>\r\n )\r\n }\r\n const isBtnShowLess = expanded && items.length > 1\r\n return (\r\n <>\r\n {isBtnShowLess && (\r\n <Tooltip title='Show less' placement='top' arrow>\r\n <Chip\r\n icon={<MoreHorizIcon fontSize='small' />}\r\n size='small'\r\n className={classes.itemChip}\r\n sx={{ opacity: 0.7, '.MuiChip-label': { pl: 0 } }}\r\n onClick={() => setExpanded(false)}\r\n disabled={props.disabled}\r\n />\r\n </Tooltip>\r\n )}\r\n {items.map((item) => (\r\n <ChipItem key={item.value.toString()} item={item} group={group} onRemove={onRemove} disabled={props.disabled} />\r\n ))}\r\n </>\r\n )\r\n }\r\n\r\n const ChipViewer: FC<IChipViewerProps<T>> = (props) => {\r\n const { value = [], onRemove, placement, label, enableMinimalesticView, forceShowAll, disabled } = props\r\n\r\n const rootClasses = [classes.item]\r\n if (placement === 'vertical') rootClasses.push(classes.itemVertical)\r\n else if (placement === 'horizontal') rootClasses.push(classes.itemHorizontal)\r\n\r\n const data = useMemo(() => {\r\n if (!value) return []\r\n const valueArray = Array.isArray(value) ? value : [value]\r\n return valueArray.filter((group) => group.items && group.items.length > 0)\r\n }, [value])\r\n\r\n if (data.length === 0) return null\r\n\r\n return (\r\n <ItemStyled sx={props.sx} className={rootClasses.filter(Boolean).join(' ')}>\r\n {Boolean(label) && (\r\n <Typography variant='caption' className={classes.itemLabel}>\r\n {label || 'ChipViewer'}:\r\n </Typography>\r\n )}\r\n <div className={classes.itemContent}>\r\n {data.map((group) => {\r\n const { field, label } = group\r\n return (\r\n <div key={field.toString()} className={classes.itemGroup}>\r\n {label && (\r\n <Typography variant='caption' className={classes.itemLabel}>\r\n {label}:\r\n </Typography>\r\n )}\r\n <ChipList\r\n group={group}\r\n onRemove={onRemove}\r\n enableMinimalesticView={enableMinimalesticView}\r\n forceShowAll={forceShowAll}\r\n disabled={disabled}\r\n />\r\n </div>\r\n )\r\n })}\r\n </div>\r\n </ItemStyled>\r\n )\r\n }\r\n\r\n return ChipViewer\r\n}\r\n\r\n//#region styles\r\nconst chipViewerClasses = {\r\n root: 'DinoChipViewer-root',\r\n item: 'DinoChipViewer-item',\r\n itemLabel: 'DinoChipViewer-itemLabel',\r\n itemChip: 'DinoChipViewer-itemChip',\r\n itemGroup: 'DinoChipViewer-itemGroup',\r\n itemContent: 'DinoChipViewer-itemContent',\r\n sort: 'DinoChipViewer-sort',\r\n itemVertical: 'DinoChipViewer-itemVertical',\r\n itemHorizontal: 'DinoChipViewer-itemHorizontal'\r\n}\r\n\r\nconst classes = chipViewerClasses\r\n\r\nconst ItemStyled = styled(Box)(({ theme }) => ({\r\n [`.${classes.itemLabel}`]: {\r\n fontWeight: 700,\r\n marginLeft: theme.spacing(0.5),\r\n lineHeight: 1\r\n },\r\n [`.${classes.itemChip}`]: {\r\n borderRadius: '4px',\r\n maxWidth: '100px',\r\n '& .MuiChip-label': { whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }\r\n },\r\n [`.${classes.itemGroup}`]: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n border: `dashed 1px ${theme.palette.divider}`,\r\n borderRadius: theme.shape.borderRadius,\r\n alignItems: 'center',\r\n padding: theme.spacing(0.25),\r\n gap: theme.spacing(0.5)\r\n },\r\n [`.${classes.itemContent}`]: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n gap: theme.spacing(0.5),\r\n [`.${classes.itemLabel}`]: {\r\n fontWeight: 500,\r\n color: theme.palette.text.secondary\r\n }\r\n },\r\n [`&.${classes.item}`]: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n gap: theme.spacing(1),\r\n padding: theme.spacing(0.25, 0.5),\r\n // borderBottom: `1px solid ${theme.palette.grey[100]}`,\r\n '&:last-child': { marginBottom: 0, borderBottom: 'none', paddingBottom: 0 },\r\n [`&.${classes.sort}`]: {\r\n '.MuiChip-label > div': { display: 'flex', alignItems: 'center', gap: 4 },\r\n '.MuiSvgIcon-root': { fontSize: 12 }\r\n },\r\n [`&.${classes.itemVertical}`]: { flexDirection: 'column', alignItems: 'flex-start' }\r\n // [`&.${classes.itemHorizontal}`]: { flexDirection: 'row', alignItems: 'center' }\r\n }\r\n}))\r\n//#endregion\r\n"],"names":["createChipViewers","ChipItem","props","item","group","onRemove","disabled","field","label","chipMinWidth","itemLabel","value","toString","_jsx","Chip","size","title","className","classes","itemChip","sx","minWidth","undefined","onDelete","concat","ChipList","_useState","useState","_useState2","_slicedToArray","expanded","setExpanded","enableMinimalesticView","forceShowAll","items","length","_jsxs","_Fragment","children","Tooltip","placement","arrow","icon","MoreHorizIcon","fontSize","style","opacity","onClick","isBtnShowLess","pl","map","_props$value","rootClasses","push","itemVertical","itemHorizontal","data","useMemo","Array","isArray","filter","ItemStyled","Boolean","join","Typography","variant","itemContent","itemGroup","sort","styled","Box","_ref","theme","_defineProperty","fontWeight","marginLeft","spacing","lineHeight","borderRadius","maxWidth","whiteSpace","overflow","textOverflow","display","flexWrap","border","palette","divider","shape","alignItems","padding","gap","color","text","secondary","flexDirection","marginBottom","borderBottom","paddingBottom"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{defineProperty as l,objectSpread2 as r}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as e,jsxs as t}from"react/jsx-runtime";import{useContext as o,useMemo as i}from"react";import{styled as a,iconButtonClasses as n,buttonClasses as c,Collapse as s,Box as u,Button as d,IconButton as m}from"@mui/material";import p from"@mui/icons-material/ClearAll";import{KeySpecial as f}from"../types.js";import{useFilterActions as h}from"../hooks.js";import{mapSpecialLabel as b}from"../helpers.js";import{createChipViewers as v}from"./chip-viewer.js";import{FilterBarContext as g}from"../index.context.js";var x="__field__";function k(l){var a=y,n=v();return function(c){var v=o(g),k=v.filterState,y=h(v),S=i(function(){return function(l,e){var t,o=l.fields,i=l.enableQuickSearch,a=void 0===i||i,n=r({},o),c=f.quickSearch;return a?n[c]?null!==(t=n[c])&&void 0!==t&&t.label||(n[c]=r(r({},n[c]),{},{label:b[c]})):n[c]={label:b[c]}:delete n[c],Object.keys(e||{}).reduce(function(l,r){var t,o=null==n?void 0:n[r],i=(null==o?void 0:o.label)||r.toString(),a=null==e||null===(t=e[r])||void 0===t?void 0:t.values,c=(Array.isArray(a)?a:[]).filter(Boolean).map(function(l,t){var i;return{value:l.toString(),label:null==o||null===(i=o.labelFormatter)||void 0===i?void 0:i.call(o,l,t,null==e?void 0:e[r])}});if(c.length>0)if(null!=o&&o.singleChip){var s,u=null!==(s=o.singleChipSeparator)&&void 0!==s?s:", ",d=c.map(function(l){var r;return null!==(r=l.label)&&void 0!==r?r:l.value.toString()}).join(u);l.push({field:r,label:i,items:[{value:x,label:d}],chipMinWidth:o.chipMinWidth})}else l.push({field:r,label:i,items:c,chipMinWidth:null==o?void 0:o.chipMinWidth});return l},[]).sort(function(l,r){return l.field===c?-1:r.field===c?1:0})}(l,k.storeFilter)},[k,l]);return e(s,{in:S.length>0,timeout:"auto",unmountOnExit:!0,children:t(C,{className:a.root,sx:c.sx,children:[e("div",{className:a.scrollHorizontal,children:e(n,{label:"Filters",value:S,placement:"horizontal",onRemove:function(l,r){return r===x?y.removeFilter(l):y.removeFilterByFieldValue(l,r)}})}),t(u,{children:[e(d,{size:"small",color:"error",variant:"text",onClick:y.clearAllFilters,className:a.buttonClearAll,startIcon:e(p,{}),"aria-label":"Clear all filters",children:"Clear All"}),e(m,{size:"small",color:"error",onClick:y.clearAllFilters,className:a.buttonClearAll,"aria-label":"Clear all filters",children:e(p,{})})]})]})})}}var y={root:"DinoFilterSummary-root",scrollHorizontal:"DinoFilterSummary-scrollHorizontal",buttonClearAll:"DinoFilterSummary-buttonClearAll"},C=a("div")(function(r){var e=r.theme;return l(l(l({},"&.".concat(y.root),{display:"flex",alignItems:"center",padding:e.spacing(0,1.5)}),".".concat(y.scrollHorizontal),{overflowX:"auto",overflowY:"hidden",WebkitOverflowScrolling:"touch",scrollbarHeight:"thin",display:"flex",flexWrap:"nowrap",minWidth:0,flex:1,"& > *":{minWidth:"max-content",flexShrink:0},"&::-webkit-scrollbar":{height:"8px",background:"transparent"},"&::-webkit-scrollbar-thumb":{background:e.palette.grey[300],borderRadius:"8px",minHeight:"8px",transition:"background 0.2s"},"&::-webkit-scrollbar-thumb:hover":{background:e.palette.primary.light},"&::-webkit-scrollbar-track":{background:e.palette.grey[100],borderRadius:"8px"},scrollbarColor:"".concat(e.palette.grey[300]," ").concat(e.palette.grey[100]),scrollbarWidth:"thin"}),".".concat(y.buttonClearAll),l(l(l({marginLeft:e.spacing(1)},"&:not(.".concat(n.root,")"),{textTransform:"none",fontWeight:500,lineHeight:2,padding:e.spacing(0,1)}),"&.".concat(n.root),{display:"none"}),e.breakpoints.down("md"),l(l({},"&.".concat(c.root),{display:"none"}),"&.".concat(n.root),{display:"flex"})))});export{k as createFilterSummary};
1
+ import{defineProperty as l,objectSpread2 as r}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as e,jsxs as i}from"react/jsx-runtime";import{useContext as t,useMemo as o}from"react";import{styled as a,iconButtonClasses as n,buttonClasses as c,Collapse as s,Box as u,Button as d,IconButton as m}from"@mui/material";import p from"@mui/icons-material/ClearAll";import{KeySpecial as b}from"../types.js";import{useFilterActions as f}from"../hooks.js";import{mapSpecialLabel as h}from"../helpers.js";import{createChipViewers as v}from"./chip-viewer.js";import{FilterBarContext as g}from"../index.context.js";var x="__field__";function k(l){var a=y,n=v();return function(c){var v=t(g),k=v.filterState,y=f(v),S=o(function(){return function(l,e){var i,t=l.fields,o=l.enableQuickSearch,a=void 0===o||o,n=r({},t),c=b.quickSearch;return a?n[c]?null!==(i=n[c])&&void 0!==i&&i.label||(n[c]=r(r({},n[c]),{},{label:h[c]})):n[c]={label:h[c]}:delete n[c],Object.keys(e||{}).reduce(function(l,r){var i,t=null==n?void 0:n[r],o=(null==t?void 0:t.label)||r.toString(),a=null==e||null===(i=e[r])||void 0===i?void 0:i.values,c=(Array.isArray(a)?a:[]).filter(Boolean).map(function(l,i){var o;return{value:l.toString(),label:null==t||null===(o=t.labelFormatter)||void 0===o?void 0:o.call(t,l,i,null==e?void 0:e[r])}});if(c.length>0)if(null!=t&&t.singleChip){var s,u=null!==(s=t.singleChipSeparator)&&void 0!==s?s:", ",d=c.map(function(l){var r;return null!==(r=l.label)&&void 0!==r?r:l.value.toString()}).join(u);l.push({field:r,label:o,items:[{value:x,label:d}],chipMinWidth:t.chipMinWidth})}else l.push({field:r,label:o,items:c,chipMinWidth:null==t?void 0:t.chipMinWidth});return l},[]).sort(function(l,r){return l.field===c?-1:r.field===c?1:0})}(l,k.storeFilter)},[k,l]);return e(s,{in:S.length>0,timeout:"auto",unmountOnExit:!0,children:i(C,{className:a.root,sx:c.sx,children:[e("div",{className:a.scrollHorizontal,children:e(n,{label:"Filters",value:S,disabled:v.isLoading,placement:"horizontal",onRemove:function(l,r){return r===x?y.removeFilter(l):y.removeFilterByFieldValue(l,r)}})}),i(u,{children:[e(d,{size:"small",color:"error",variant:"text",onClick:y.clearAllFilters,className:a.buttonClearAll,startIcon:e(p,{}),"aria-label":"Clear all filters",disabled:v.isLoading,children:"Clear All"}),e(m,{size:"small",color:"error",onClick:y.clearAllFilters,className:a.buttonClearAll,"aria-label":"Clear all filters",disabled:v.isLoading,children:e(p,{})})]})]})})}}var y={root:"DinoFilterSummary-root",scrollHorizontal:"DinoFilterSummary-scrollHorizontal",buttonClearAll:"DinoFilterSummary-buttonClearAll"},C=a("div")(function(r){var e=r.theme;return l(l(l({},"&.".concat(y.root),{display:"flex",alignItems:"center",padding:e.spacing(0,1.5)}),".".concat(y.scrollHorizontal),{overflowX:"auto",overflowY:"hidden",WebkitOverflowScrolling:"touch",scrollbarHeight:"thin",display:"flex",flexWrap:"nowrap",minWidth:0,flex:1,"& > *":{minWidth:"max-content",flexShrink:0},"&::-webkit-scrollbar":{height:"8px",background:"transparent"},"&::-webkit-scrollbar-thumb":{background:e.palette.grey[300],borderRadius:"8px",minHeight:"8px",transition:"background 0.2s"},"&::-webkit-scrollbar-thumb:hover":{background:e.palette.primary.light},"&::-webkit-scrollbar-track":{background:e.palette.grey[100],borderRadius:"8px"},scrollbarColor:"".concat(e.palette.grey[300]," ").concat(e.palette.grey[100]),scrollbarWidth:"thin"}),".".concat(y.buttonClearAll),l(l(l({marginLeft:e.spacing(1)},"&:not(.".concat(n.root,")"),{textTransform:"none",fontWeight:500,lineHeight:2,padding:e.spacing(0,1)}),"&.".concat(n.root),{display:"none"}),e.breakpoints.down("md"),l(l({},"&.".concat(c.root),{display:"none"}),"&.".concat(n.root),{display:"flex"})))});export{k as createFilterSummary};
2
2
  //# sourceMappingURL=filter-summary.js.map
@@ -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\n/** Sentinel value used when singleChip mode collapses all values into one chip. */\r\nconst SINGLE_CHIP_SENTINEL = '__field__'\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, index) => {\r\n return { value: item.toString(), label: fieldConfig?.labelFormatter?.(item, index, store?.[key]!) }\r\n })\r\n if (summaryItems.length > 0) {\r\n if (fieldConfig?.singleChip) {\r\n const separator = fieldConfig.singleChipSeparator ?? ', '\r\n const combinedLabel = summaryItems.map((item) => item.label ?? item.value.toString()).join(separator)\r\n acc.push({ field: key, label, items: [{ value: SINGLE_CHIP_SENTINEL, label: combinedLabel }], chipMinWidth: fieldConfig.chipMinWidth })\r\n } else {\r\n acc.push({ field: key, label, items: summaryItems, chipMinWidth: fieldConfig?.chipMinWidth })\r\n }\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\r\n label='Filters'\r\n value={filterData}\r\n placement='horizontal'\r\n onRemove={(field, value) =>\r\n value === SINGLE_CHIP_SENTINEL ? filterActions.removeFilter(field) : filterActions.removeFilterByFieldValue(field, value)\r\n }\r\n />\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":["SINGLE_CHIP_SENTINEL","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","index","_fieldConfig$labelFor","value","labelFormatter","call","length","singleChip","_fieldConfig$singleCh","separator","singleChipSeparator","combinedLabel","_item$label","join","push","field","items","chipMinWidth","sort","a","b","mapFilterStateToFilterData","storeFilter","_jsx","Collapse","in","timeout","unmountOnExit","children","_jsxs","FilterSummaryStyled","className","root","sx","scrollHorizontal","placement","onRemove","removeFilter","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
+ {"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\n/** Sentinel value used when singleChip mode collapses all values into one chip. */\r\nconst SINGLE_CHIP_SENTINEL = '__field__'\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, index) => {\r\n return { value: item.toString(), label: fieldConfig?.labelFormatter?.(item, index, store?.[key]!) }\r\n })\r\n if (summaryItems.length > 0) {\r\n if (fieldConfig?.singleChip) {\r\n const separator = fieldConfig.singleChipSeparator ?? ', '\r\n const combinedLabel = summaryItems.map((item) => item.label ?? item.value.toString()).join(separator)\r\n acc.push({ field: key, label, items: [{ value: SINGLE_CHIP_SENTINEL, label: combinedLabel }], chipMinWidth: fieldConfig.chipMinWidth })\r\n } else {\r\n acc.push({ field: key, label, items: summaryItems, chipMinWidth: fieldConfig?.chipMinWidth })\r\n }\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\r\n label='Filters'\r\n value={filterData}\r\n disabled={context.isLoading}\r\n placement='horizontal'\r\n onRemove={(field, value) =>\r\n value === SINGLE_CHIP_SENTINEL ? filterActions.removeFilter(field) : filterActions.removeFilterByFieldValue(field, value)\r\n }\r\n />\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 disabled={context.isLoading}\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 disabled={context.isLoading}\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":["SINGLE_CHIP_SENTINEL","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","index","_fieldConfig$labelFor","value","labelFormatter","call","length","singleChip","_fieldConfig$singleCh","separator","singleChipSeparator","combinedLabel","_item$label","join","push","field","items","chipMinWidth","sort","a","b","mapFilterStateToFilterData","storeFilter","_jsx","Collapse","in","timeout","unmountOnExit","children","_jsxs","FilterSummaryStyled","className","root","sx","scrollHorizontal","disabled","isLoading","placement","onRemove","removeFilter","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
- import{createClass as t,classCallCheck as e,defineProperty as r}from"../../_virtual/_rollupPluginBabelHelpers.js";import{KeySpecial as i}from"./types.js";import{getSeedFromURL as l,setSeedToURL as o,removeSeedFromURL as n}from"./helpers.js";import{createRequestBuilder as a}from"../http-service/graphql/request-param.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 l=this;e(this,t),r(this,"graphqlBuilder",a({ignoreEmpty:!0})),r(this,"autoMap",function(t){(l.currentObjectMap=t,l.state.storeFilter)&&Object.keys(l.state.storeFilter).forEach(function(e){var r,i=t[e],o=null===(r=l.state.storeFilter)||void 0===r?void 0:r[e];if(i){var n=i.targetfield,a=i.operation;return i.custom?void i.custom(l.graphqlBuilder,o,l.state.storeFilter):"equal"===a?void l.fillterEqual(e,n):void l.fillterContains(e,n)}});return l}),r(this,"prebuild",function(t){return l.prebuildFunc=t,l}),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,a=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=l();if((null==a?void 0:a.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&&o(p)}else{var g;h&&n();var y=null!=a&&a.field?null===(g=this.currentObjectMap)||void 0===g?void 0:g[null==a?void 0:a.field]:void 0;if(null==y||!y.targetfield)return this;this.graphqlBuilder.sort(y.targetfield,{direction:s(null==a?void 0:a.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};
1
+ import{createClass as t,objectWithoutProperties as e,typeof as r,classCallCheck as i,defineProperty as l}from"../../_virtual/_rollupPluginBabelHelpers.js";import{KeySpecial as a}from"./types.js";import{getSeedFromURL as o,setSeedToURL as n,removeSeedFromURL as u}from"./helpers.js";import{createRequestBuilder as s}from"../http-service/graphql/request-param.js";var c=["mode"],f=function(t){return"or"===t?"Or":"And"},v=function(t){return"asc"===t?"ASC":"DESC"};function d(t,i,l,a){var o=a||{},n=o.mode,u=e(o,c),s=r(l);switch(s){case"string":"equal"===n?i.filter(t,l.toString(),u):i.filterContains(t,l.toString(),u);break;case"number":i.filterNumber(t,"==",l.toString(),u);break;default:console.warn("Unsupported value type for filtering: ".concat(s,". Value:"),l)}}var h=function(){return t(function t(e){var r=this;i(this,t),l(this,"graphqlBuilder",s({ignoreEmpty:!0})),l(this,"autoMap",function(t){(r.currentObjectMap=t,r.state.storeFilter)&&Object.keys(r.state.storeFilter).forEach(function(e){var i,l=t[e],a=null===(i=r.state.storeFilter)||void 0===i?void 0:i[e];if(l){var o=l.targetfield,n=l.operation;if(l.custom)return void l.custom(r.graphqlBuilder,a,r.state.storeFilter);switch(n){case"equal":return void r.filterEqual(e,o);case"datetime":return void r.filterDatetime(e,o);default:return void r.filterContains(e,o)}}});return r}),l(this,"prebuild",function(t){return r.prebuildFunc=t,r}),this.state=e},[{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=f(i);this.graphqlBuilder.scope(function(e){return t(e,r.state.storeFilter),e},{logic:l})}return this}},{key:"filterEqual",value:function(t,e,r){var i,l,a=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},o=Array.isArray(a.values)?a.values:[a.values];if(!o||o.length<1||!e)return this;var n=f(a.logic);return this.filterScope(function(t){for(var r=0;r<o.length;r++)d(e,t,o[r],{logic:n,mode:"equal"})},r),this}},{key:"filterContains",value:function(t,e,r){var i,l,a=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},o=Array.isArray(a.values)?a.values:[a.values];if(!o||o.length<1||!e)return this;var n=f(a.logic);return this.filterScope(function(t){for(var r=0;r<o.length;r++)d(e,t,o[r],{logic:n,mode:"contains"})},r),this}},{key:"filterDatetime",value:function(t,e,r){var i,l,a=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},o=Array.isArray(a.values)?a.values:[a.values];if(!o||o.length<1||!e)return this;if("range"===a.dateLogic&&o.length>=2){this.filterScope(function(t){t.filterGreaterEqual(e,o[0].toString(),{}),t.filterLessEqual(e,o[1].toString(),{logic:"And"})},r)}else if(1==o.length){this.filterScope(function(t){switch(a.dateLogic){case"before":t.filterLess(e,o[0].toString());break;case"after":t.filterGreater(e,o[0].toString());break;default:t.filterEqual(e,o[0].toString())}},r)}return this}},{key:"sort",value:function(t){var e,r,i=this.state.storeSort,l=null!==(e=null==t?void 0:t.seed)&&void 0!==e?e:{},s=l.targetField,c=l.autoSave,f=void 0!==c&&c,d=s?null===(r=this.currentObjectMap)||void 0===r?void 0:r[s]:void 0,h=o();if((null==i?void 0:i.field)===a.sortShuffle){if(null==d||!d.targetfield)return this;var g=null!=h?h:(new Date).getTime().toString();this.graphqlBuilder.seed(d.targetfield,g),f&&n(g)}else{var p;h&&u();var m=null!=i&&i.field?null===(p=this.currentObjectMap)||void 0===p?void 0:p[null==i?void 0:i.field]:void 0;if(null==m||!m.targetfield)return this;this.graphqlBuilder.sort(m.targetfield,{direction:v(null==i?void 0:i.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"},a=Array.isArray(l.values)?l.values:[l.values];if(!a||a.length<1)return this;var o=f(l.logic),n=Array.isArray(t)?t:[t];return this.filterScope(function(t){n.forEach(function(e){var r,n=null===(r=i.currentObjectMap)||void 0===r?void 0:r[e];if(n&&a&&a.length>0)if(n.custom)n.custom(t,l,i.state.storeFilter);else if(n.targetfield)for(var u=0;u<a.length;u++)d(n.targetfield,t,a[u],{logic:o})})}),this}},{key:"build",value:function(){return this.prebuildFunc&&this.prebuildFunc(this.graphqlBuilder),this.graphqlBuilder.build()}}])}(),g=function(t){return new h(t)};export{h as TableFileterConverter,g as createConvertToGraphQL,f as mapLogic,v 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.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 { getSeedFromURL, removeSeedFromURL, setSeedToURL } from './helpers'\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\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
+ {"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 { getSeedFromURL, removeSeedFromURL, setSeedToURL } from './helpers'\r\nimport { createRequestBuilder, IFilterOption, RequestParam } from '../http-service/graphql/request-param'\r\n// types\r\nimport type { TFilterState, TFieldStore, TFieldValue, TLogic, TDirection, TFieldType, TFieldValid, TDateLogic } from './types'\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', 'contains', or 'datetime'. @default 'contains'\r\n * @vi Thao tác áp dụng cho trường filter. Có thể là 'equal', 'contains', hoặc 'datetime'. @default 'contains'\r\n */\r\n operation?: 'equal' | 'contains' | 'datetime'\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\ntype TFilterByTypeOptions = Partial<IFilterOption> & {\r\n mode?: 'equal' | 'contains'\r\n}\r\n\r\nfunction filterByType<TTarget extends object>(\r\n field: keyof TTarget,\r\n builder: RequestParam<TTarget>,\r\n value: TFieldValid,\r\n option?: TFilterByTypeOptions\r\n) {\r\n const { mode, ...restOption } = option || {}\r\n const valueType = typeof value\r\n switch (valueType) {\r\n case 'string':\r\n if (mode === 'equal') {\r\n builder.filter(field, value.toString(), restOption)\r\n } else {\r\n builder.filterContains(field, value.toString(), restOption)\r\n }\r\n break\r\n case 'number':\r\n builder.filterNumber(field, '==', value.toString(), restOption)\r\n break\r\n default:\r\n console.warn(`Unsupported value type for filtering: ${valueType}. Value:`, value)\r\n }\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\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\r\n filterEqual(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) => {\r\n for (let index = 0; index < values.length; index++) {\r\n filterByType(targetField, builder, values[index], { logic, mode: 'equal' })\r\n }\r\n }\r\n\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n\r\n filterContains(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 filterByType(targetField, builder, values[index], { logic: finalLogic, mode: 'contains' })\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n\r\n filterDatetime(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 if (fieldValue.dateLogic === 'range' && values.length >= 2) {\r\n const fn: TFilterScopeFn<TSource, TTarget> = (builder) => {\r\n builder.filterGreaterEqual(targetField, values[0].toString(), {})\r\n builder.filterLessEqual(targetField, values[1].toString(), { logic: 'And' })\r\n }\r\n this.filterScope(fn, options)\r\n } else if (values.length == 1) {\r\n const fn: TFilterScopeFn<TSource, TTarget> = (builder) => {\r\n switch (fieldValue.dateLogic) {\r\n case 'before':\r\n builder.filterLess(targetField, values[0].toString())\r\n break\r\n case 'after':\r\n builder.filterGreater(targetField, values[0].toString())\r\n break\r\n case 'on':\r\n default:\r\n builder.filterEqual(targetField, values[0].toString())\r\n break\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n }\r\n return this\r\n }\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\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 filterByType(fieldMap.targetfield, builder, values[index], { logic })\r\n }\r\n }\r\n }\r\n })\r\n }\r\n this.filterScope(fn)\r\n return this\r\n }\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.filterEqual(key, targetfield)\r\n return // break is not needed here because of the return statement\r\n case 'datetime':\r\n this.filterDatetime(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.filterContains(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\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","filterByType","field","builder","value","option","_ref","mode","restOption","_objectWithoutProperties","_excluded","valueType","_typeof","filter","toString","filterContains","filterNumber","console","warn","concat","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","filterEqual","filterDatetime","func","prebuildFunc","fn","options","_this2","mergedLogic","filterLogic","scope","b","targetField","_this$state$storeFilt2","_this$state$storeFilt3","values","Array","isArray","length","filterScope","index","_this$state$storeFilt4","_this$state$storeFilt5","finalLogic","_this$state$storeFilt6","_this$state$storeFilt7","dateLogic","filterGreaterEqual","filterLessEqual","filterLess","filterGreater","param","_param$seed","_this$currentObjectMa","store","storeSort","_ref2","seed","seedTargetField","_ref2$autoSave","autoSave","seedField","undefined","seedFromURL","getSeedFromURL","KeySpecial","sortShuffle","seedValue","Date","getTime","setSeedToURL","_this$currentObjectMa2","removeSeedFromURL","sort","fields","_this$state$storeFilt8","_this$state$storeFilt9","_this3","quickSearch","targetFields","_this3$currentObjectM","fieldMap","build","createConvertToGraphQL"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{objectSpread2 as t,defineProperty as e,toConsumableArray as r}from"../../_virtual/_rollupPluginBabelHelpers.js";import{KeySpecial as i}from"./types.js";var l=function(t,e,r){if(!t)return!1;var i=t[e];if(!i)return!1;var l=r.logic!==i.logic,o=new Set(i.values.map(function(t){return JSON.stringify(t)}).filter(Boolean));return r.values.some(function(t){return o.has(JSON.stringify(t))})&&!l},o=function(t,i,l){var o=null==t?void 0:t[i],a={values:Array.from(new Set([].concat(r((null==o?void 0:o.values)||[]),r(l.values)).filter(Boolean))),logic:l.logic||(null==o?void 0:o.logic)};return Object.assign({},t,e({},i,a))},a=function(r){return{addFilter:function(e,i,a){var n=r.filterState.storeFilter,s=t(t({},i),{},{logic:(null==a?void 0:a.logic)||i.logic});if(!l(n,e,s)){var u=o(n,e,s),f=Object.assign({},n,u);r.setFilterState(t(t({},r.filterState),{},{storeFilter:f}))}},replaceFilter:function(i,l,o){var a=t(t({},l),{},{logic:(null==o?void 0:o.logic)||l.logic}),n=Object.assign({},r.filterState.storeFilter,e({},i,a));r.setFilterState(t(t({},r.filterState),{},{storeFilter:n}))},upsertManyFilter:function(e,i,a){if(0!==i.values.length){var n=Object.assign({},r.filterState.storeFilter);i.values.forEach(function(t){var r={values:[t],logic:(null==a?void 0:a.logic)||i.logic};l(n,e,r)||(n=o(n,e,r))}),r.setFilterState(t(t({},r.filterState),{},{storeFilter:n}))}},removeFilter:function(e){var i=Object.assign({},r.filterState.storeFilter);i[e]&&delete i[e],r.setFilterState(t(t({},r.filterState),{},{storeFilter:i}))},removeFilterByFieldValue:function(e,i){var l=Object.assign({},r.filterState.storeFilter),o=l[e];o&&(l[e]=t(t({},o),{},{values:o.values.filter(function(t){return t.toString()!==i.toString()})}),l[e]&&0===l[e].values.length&&delete l[e],r.setFilterState(t(t({},r.filterState),{},{storeFilter:l})))},clearAllFilters:function(){r.setFilterState(t(t({},r.filterState),{},{storeFilter:{}}))},getFieldInfo:function(t){var e;return null===(e=r.filterState.storeFilter)||void 0===e?void 0:e[t]},getTotalCount:function(){var t=r.filterState.storeFilter;return t?Object.keys(t).reduce(function(e,r){var i=t[r];return e+(i?i.values.length:0)},0):0},hasSortByField:function(t){var e=r.filterState.storeSort;return(null==e?void 0:e.field)===t},getSort:function(){return r.filterState.storeSort},changeSort:function(e){var l,o=r.filterState.storeSort,a=null===(l=r.defaultFilterState)||void 0===l?void 0:l.storeSort,n=e===i.sortShuffle,s=(null==o?void 0:o.field)===e;if(n){var u=void 0;return s||(u={field:e}),void r.setFilterState(t(t({},r.filterState),{},{storeSort:u}))}var f="desc";s?f="desc"===o.direction?"asc":"desc":o||(null==a?void 0:a.field)!==e||(f="desc"===a.direction?"asc":"desc"),r.setFilterState(t(t({},r.filterState),{},{storeSort:{field:e,direction:f}}))},removeSort:function(){var e,i=null===(e=r.defaultFilterState)||void 0===e?void 0:e.storeSort;r.setFilterState(t(t({},r.filterState),{},{storeSort:i}))}}};export{a as useFilterActions};
1
+ import{objectSpread2 as t,defineProperty as e,toConsumableArray as r}from"../../_virtual/_rollupPluginBabelHelpers.js";import{KeySpecial as i}from"./types.js";var l=function(t,e,r){if(!t)return!1;var i=t[e];if(!i)return!1;var l=r.logic!==i.logic,o=new Set(i.values.map(function(t){return JSON.stringify(t)}).filter(Boolean));return r.values.some(function(t){return o.has(JSON.stringify(t))})&&!l},o=function(t,i,l){var o=null==t?void 0:t[i],n={values:Array.from(new Set([].concat(r((null==o?void 0:o.values)||[]),r(l.values)).filter(Boolean))),logic:l.logic||(null==o?void 0:o.logic)};return Object.assign({},t,e({},i,n))},n=function(i,l,o){var n=null==i?void 0:i[l],a=(null==n?void 0:n.values)||[];if(a.some(function(t){return JSON.stringify(t)===JSON.stringify(o)}))return null!=i?i:{};var s=t(t({},n),{},{values:[].concat(r(a),[o]).filter(Boolean)});return Object.assign({},i,e({},l,s))},a=function(r){return{addFilter:function(e,i,n){var a=r.filterState.storeFilter,s=t(t({},i),{},{logic:(null==n?void 0:n.logic)||i.logic});if(!l(a,e,s)){var u=o(a,e,s),f=Object.assign({},a,u);r.setFilterState(t(t({},r.filterState),{},{storeFilter:f}))}},replaceFilter:function(i,l,o){var n=t(t({},l),{},{logic:(null==o?void 0:o.logic)||l.logic}),a=Object.assign({},r.filterState.storeFilter,e({},i,n));r.setFilterState(t(t({},r.filterState),{},{storeFilter:a}))},upsertManyFilter:function(e,i,n){if(0!==i.values.length){var a=Object.assign({},r.filterState.storeFilter);i.values.forEach(function(t){var r={values:[t],logic:(null==n?void 0:n.logic)||i.logic};l(a,e,r)||(a=o(a,e,r))}),r.setFilterState(t(t({},r.filterState),{},{storeFilter:a}))}},removeFilter:function(e){var i=Object.assign({},r.filterState.storeFilter);i[e]&&delete i[e],r.setFilterState(t(t({},r.filterState),{},{storeFilter:i}))},removeFilterByFieldValue:function(e,i){var l=Object.assign({},r.filterState.storeFilter),o=l[e];o&&(l[e]=t(t({},o),{},{values:o.values.filter(function(t){return t.toString()!==i.toString()})}),l[e]&&0===l[e].values.length&&delete l[e],r.setFilterState(t(t({},r.filterState),{},{storeFilter:l})))},clearAllFilters:function(){r.setFilterState(t(t({},r.filterState),{},{storeFilter:{}}))},getFieldInfo:function(t){var e;return null===(e=r.filterState.storeFilter)||void 0===e?void 0:e[t]},getTotalCount:function(){var t=r.filterState.storeFilter;return t?Object.keys(t).reduce(function(e,r){var i=t[r];return e+(i?i.values.length:0)},0):0},hasSortByField:function(t){var e=r.filterState.storeSort;return(null==e?void 0:e.field)===t},getSort:function(){return r.filterState.storeSort},changeSort:function(e){var l,o=r.filterState.storeSort,n=null===(l=r.defaultFilterState)||void 0===l?void 0:l.storeSort,a=e===i.sortShuffle,s=(null==o?void 0:o.field)===e;if(a){var u=void 0;return s||(u={field:e}),void r.setFilterState(t(t({},r.filterState),{},{storeSort:u}))}var f="desc";s?f="desc"===o.direction?"asc":"desc":o||(null==n?void 0:n.field)!==e||(f="desc"===n.direction?"asc":"desc"),r.setFilterState(t(t({},r.filterState),{},{storeSort:{field:e,direction:f}}))},removeSort:function(){var e,i=null===(e=r.defaultFilterState)||void 0===e?void 0:e.storeSort;r.setFilterState(t(t({},r.filterState),{},{storeSort:i}))}}};export{n as mergeSingleValueToStoreFilter,o as mergeValueToStoreFilter,a as useFilterActions};
2
2
  //# sourceMappingURL=hooks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sources":["../../../src/filter-bar/hooks.ts"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// types\r\nimport { KeySpecial } from './types'\r\nimport type { IFilterBarContext } from './index.context'\r\nimport type { TFieldSort, TFieldStore, TFieldType, TFieldValid, TFieldValue, TLogic } from './types'\r\n\r\ntype TOptions = {\r\n logic?: TLogic\r\n}\r\n\r\n/**\r\n * Check if a given filter value already exists in the store for a specific field.\r\n * @param storeFilter - The current filter store.\r\n * @param field - The field to check for duplicate values.\r\n * @param value - The filter value to check for duplicates.\r\n * @returns True if a duplicate value exists, false otherwise.\r\n */\r\nconst checkDuplicateValue = <T>(storeFilter: TFieldStore<T> | undefined, field: keyof TFieldStore<T>, value: TFieldValue): boolean => {\r\n // If there is no filter store or no filter values for the field, there can be no duplicates\r\n if (!storeFilter) return false\r\n const fieldValue = storeFilter[field]\r\n // If there are no filter values for the field, there can be no duplicates\r\n if (!fieldValue) return false\r\n const isLogicChange = value.logic !== fieldValue.logic\r\n // Create a set of existing values for the field to efficiently check for duplicates\r\n const fieldSet = new Set(fieldValue.values.map((v) => JSON.stringify(v)).filter(Boolean))\r\n return value.values.some((v) => fieldSet.has(JSON.stringify(v))) && !isLogicChange\r\n}\r\n/**\r\n * Merge a filter value into the store for a specific field.\r\n * @param storeFilter - The current filter store.\r\n * @param field - The field to merge the value into.\r\n * @param value - The filter value to merge.\r\n * @returns The updated filter store.\r\n */\r\nconst mergeValueToStoreFilter = <T>(storeFilter: TFieldStore<T> | undefined, field: keyof TFieldStore<T>, value: TFieldValue): TFieldStore<T> => {\r\n const fieldValue: TFieldValue | undefined = storeFilter?.[field]\r\n const values = Array.from(new Set([...(fieldValue?.values || []), ...value.values].filter(Boolean)))\r\n const newData: TFieldValue = { values, logic: value.logic || fieldValue?.logic }\r\n return Object.assign({}, storeFilter, { [field]: newData }) as TFieldStore<T>\r\n}\r\n\r\nexport const useFilterActions = <T>(context: IFilterBarContext<T>) => {\r\n /**\r\n * Add a filter value to the store for a specific field.\r\n * @param field - The field to add the filter value to.\r\n * @param value - The filter value to add.\r\n * @returns void\r\n */\r\n const addFilter = (field: keyof TFieldStore<T>, value: TFieldValue, options?: TOptions) => {\r\n // Check for duplicate value before adding\r\n const { storeFilter } = context.filterState\r\n const valueObj: TFieldValue = { ...value, logic: options?.logic || value.logic }\r\n // If the value already exists in the store for the field, do not add it again\r\n if (checkDuplicateValue(storeFilter, field, valueObj)) return\r\n // Merge the new value into the store filter for the field\r\n const newData = mergeValueToStoreFilter(storeFilter, field, valueObj)\r\n const newStoreFilter = Object.assign({}, storeFilter, newData)\r\n context.setFilterState({ ...context.filterState, storeFilter: newStoreFilter })\r\n }\r\n /**\r\n * Replace all filter values for a specific field in the store with a new value.\r\n * Value will be replaced instead of merged, which is useful for single-value filters or when you want to reset the filter values for a field.\r\n * @param field - The field to update the filter value for.\r\n * @param value - The new filter value to set.\r\n */\r\n const replaceFilter = (field: keyof TFieldStore<T>, value: TFieldValue, options?: TOptions) => {\r\n const valueObj: TFieldValue = { ...value, logic: options?.logic || value.logic }\r\n const newStoreFilter = Object.assign({}, context.filterState.storeFilter, { [field]: valueObj })\r\n context.setFilterState({ ...context.filterState, storeFilter: newStoreFilter as TFieldStore<T> })\r\n }\r\n /**\r\n * Add multiple filter values to the store for a specific field, ensuring no duplicates are added.\r\n * @param field - The field to add the filter values to.\r\n * @param values - The filter values to add.\r\n * @returns void\r\n */\r\n const upsertManyFilter = (field: keyof TFieldStore<T>, value: TFieldValue, options?: TOptions) => {\r\n // If there are no values to add, return early\r\n if (value.values.length === 0) return\r\n let newStoreFilter = Object.assign({}, context.filterState.storeFilter)\r\n // Iterate through each value and add it to the store filter for the field, checking for duplicates\r\n value.values.forEach((val) => {\r\n const valueObj: TFieldValue = { values: [val], logic: options?.logic || value.logic }\r\n if (checkDuplicateValue(newStoreFilter, field, valueObj)) return\r\n newStoreFilter = mergeValueToStoreFilter(newStoreFilter, field, valueObj)\r\n })\r\n // Update the filter state with the new store filter after adding all values\r\n context.setFilterState({ ...context.filterState, storeFilter: newStoreFilter })\r\n }\r\n /**\r\n * Remove all filter values for a specific field from the store.\r\n * @param field - The field to remove filters from.\r\n * @returns void\r\n */\r\n const removeFilter = (field: TFieldType<T>) => {\r\n const newStoreFilter = Object.assign({}, context.filterState.storeFilter)\r\n if (newStoreFilter[field]) delete newStoreFilter[field]\r\n context.setFilterState({ ...context.filterState, storeFilter: newStoreFilter })\r\n }\r\n\r\n const removeFilterByFieldValue = (field: TFieldType<T>, value: TFieldValid) => {\r\n const newStoreFilter = Object.assign({}, context.filterState.storeFilter)\r\n const fieldVal: TFieldValue | undefined = newStoreFilter[field]\r\n if (!fieldVal) return\r\n newStoreFilter[field] = { ...fieldVal, values: fieldVal.values.filter((v) => v.toString() !== value.toString()) }\r\n if (newStoreFilter[field] && newStoreFilter[field]!.values.length === 0) {\r\n delete newStoreFilter[field]\r\n }\r\n context.setFilterState({ ...context.filterState, storeFilter: newStoreFilter })\r\n }\r\n\r\n const clearAllFilters = () => {\r\n context.setFilterState({ ...context.filterState, storeFilter: {} as TFieldStore<T> })\r\n }\r\n\r\n const getFieldInfo = (field: TFieldType<T>): TFieldValue | undefined => {\r\n const fieldVal = context.filterState.storeFilter?.[field]\r\n return fieldVal\r\n }\r\n\r\n const getTotalCount = (): number => {\r\n const storeFilter = context.filterState.storeFilter\r\n if (!storeFilter) return 0\r\n const keys = Object.keys(storeFilter) as (keyof TFieldStore<T>)[]\r\n return keys.reduce((acc, key) => {\r\n const fieldVal = storeFilter[key]\r\n return acc + (fieldVal ? fieldVal.values.length : 0)\r\n }, 0)\r\n }\r\n\r\n const hasSortByField = (field: TFieldType<T>): boolean => {\r\n const sort = context.filterState.storeSort\r\n return sort?.field === field\r\n }\r\n\r\n const getSort = (): TFieldSort<T> | undefined => {\r\n return context.filterState.storeSort\r\n }\r\n\r\n const changeSort = (field: TFieldType<T>) => {\r\n const currentSort = context.filterState.storeSort\r\n const defaultSort = context.defaultFilterState?.storeSort\r\n const isShuffle = field === KeySpecial.sortShuffle\r\n const isEqualField = currentSort?.field === field\r\n if (isShuffle) {\r\n // if current sort is shuffle and user click shuffle again, we remove the sort completely\r\n let newValue: TFieldSort<T> | undefined = undefined\r\n if (!isEqualField) newValue = { field }\r\n context.setFilterState({ ...context.filterState, storeSort: newValue })\r\n return\r\n }\r\n let newDirection: 'asc' | 'desc' = 'desc'\r\n // If current field equals the clicked field, toggle direction\r\n if (isEqualField) {\r\n newDirection = currentSort.direction === 'desc' ? 'asc' : 'desc'\r\n }\r\n // If no current sort but field equals default sort field, toggle from default direction\r\n else if (!currentSort && defaultSort?.field === field) {\r\n newDirection = defaultSort.direction === 'desc' ? 'asc' : 'desc'\r\n }\r\n context.setFilterState({ ...context.filterState, storeSort: { field, direction: newDirection } })\r\n }\r\n\r\n const removeSort = () => {\r\n const defaultSort = context.defaultFilterState?.storeSort\r\n context.setFilterState({ ...context.filterState, storeSort: defaultSort })\r\n }\r\n\r\n return {\r\n addFilter,\r\n replaceFilter,\r\n upsertManyFilter,\r\n removeFilter,\r\n removeFilterByFieldValue,\r\n clearAllFilters,\r\n getFieldInfo,\r\n getTotalCount,\r\n hasSortByField,\r\n getSort,\r\n changeSort,\r\n removeSort\r\n }\r\n}\r\n"],"names":["checkDuplicateValue","storeFilter","field","value","fieldValue","isLogicChange","logic","fieldSet","Set","values","map","v","JSON","stringify","filter","Boolean","some","has","mergeValueToStoreFilter","newData","Array","from","concat","_toConsumableArray","Object","assign","_defineProperty","useFilterActions","context","addFilter","options","filterState","valueObj","_objectSpread","newStoreFilter","setFilterState","replaceFilter","upsertManyFilter","length","forEach","val","removeFilter","removeFilterByFieldValue","fieldVal","toString","clearAllFilters","getFieldInfo","_context$filterState$","getTotalCount","keys","reduce","acc","key","hasSortByField","sort","storeSort","getSort","changeSort","_context$defaultFilte","currentSort","defaultSort","defaultFilterState","isShuffle","KeySpecial","sortShuffle","isEqualField","newValue","undefined","newDirection","direction","removeSort","_context$defaultFilte2"],"mappings":"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"}
1
+ {"version":3,"file":"hooks.js","sources":["../../../src/filter-bar/hooks.ts"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// types\r\nimport { KeySpecial } from './types'\r\nimport type { IFilterBarContext } from './index.context'\r\nimport type { TFieldSort, TFieldStore, TFieldType, TFieldValid, TFieldValue, TLogic } from './types'\r\n\r\ntype TOptions = {\r\n logic?: TLogic\r\n}\r\n\r\n/**\r\n * Check if a given filter value already exists in the store for a specific field.\r\n * @param storeFilter - The current filter store.\r\n * @param field - The field to check for duplicate values.\r\n * @param value - The filter value to check for duplicates.\r\n * @returns True if a duplicate value exists, false otherwise.\r\n */\r\nconst checkDuplicateValue = <T>(storeFilter: TFieldStore<T> | undefined, field: keyof TFieldStore<T>, value: TFieldValue): boolean => {\r\n // If there is no filter store or no filter values for the field, there can be no duplicates\r\n if (!storeFilter) return false\r\n const fieldValue = storeFilter[field]\r\n // If there are no filter values for the field, there can be no duplicates\r\n if (!fieldValue) return false\r\n const isLogicChange = value.logic !== fieldValue.logic\r\n // Create a set of existing values for the field to efficiently check for duplicates\r\n const fieldSet = new Set(fieldValue.values.map((v) => JSON.stringify(v)).filter(Boolean))\r\n return value.values.some((v) => fieldSet.has(JSON.stringify(v))) && !isLogicChange\r\n}\r\n/**\r\n * Merge a filter value into the store for a specific field.\r\n * @param storeFilter - The current filter store.\r\n * @param field - The field to merge the value into.\r\n * @param value - The filter value to merge.\r\n * @returns The updated filter store.\r\n */\r\nexport const mergeValueToStoreFilter = <T>(storeFilter: TFieldStore<T> | undefined, field: keyof TFieldStore<T>, value: TFieldValue): TFieldStore<T> => {\r\n const fieldValue: TFieldValue | undefined = storeFilter?.[field]\r\n const values = Array.from(new Set([...(fieldValue?.values || []), ...value.values].filter(Boolean)))\r\n const newData: TFieldValue = { values, logic: value.logic || fieldValue?.logic }\r\n return Object.assign({}, storeFilter, { [field]: newData }) as TFieldStore<T>\r\n}\r\n\r\n/**\r\n * Merge a single filter value into the store for a specific field, ensuring no duplicates are added.\r\n * @param storeFilter - The current filter store.\r\n * @param field - The field to merge the value into.\r\n * @param value - The single filter value to merge.\r\n * @returns The updated filter store with the new value merged in, or the original store if the value is a duplicate.\r\n */\r\nexport const mergeSingleValueToStoreFilter = <T>(storeFilter: TFieldStore<T> | undefined, field: keyof TFieldStore<T>, value: TFieldValid): TFieldStore<T> => {\r\n const fieldValue: TFieldValue | undefined = storeFilter?.[field]\r\n const existingValues = fieldValue?.values || []\r\n const isDuplicate = existingValues.some((v) => JSON.stringify(v) === JSON.stringify(value))\r\n if (isDuplicate) return storeFilter ?? ({} as TFieldStore<T>)\r\n const newData: TFieldValue = { ...fieldValue, values: [...existingValues, value].filter(Boolean) }\r\n return Object.assign({}, storeFilter, { [field]: newData }) as TFieldStore<T>\r\n}\r\n\r\nexport const useFilterActions = <T>(context: IFilterBarContext<T>) => {\r\n /**\r\n * Add a filter value to the store for a specific field.\r\n * @param field - The field to add the filter value to.\r\n * @param value - The filter value to add.\r\n * @returns void\r\n */\r\n const addFilter = (field: keyof TFieldStore<T>, value: TFieldValue, options?: TOptions) => {\r\n // Check for duplicate value before adding\r\n const { storeFilter } = context.filterState\r\n const valueObj: TFieldValue = { ...value, logic: options?.logic || value.logic }\r\n // If the value already exists in the store for the field, do not add it again\r\n if (checkDuplicateValue(storeFilter, field, valueObj)) return\r\n // Merge the new value into the store filter for the field\r\n const newData = mergeValueToStoreFilter(storeFilter, field, valueObj)\r\n const newStoreFilter = Object.assign({}, storeFilter, newData)\r\n context.setFilterState({ ...context.filterState, storeFilter: newStoreFilter })\r\n }\r\n /**\r\n * Replace all filter values for a specific field in the store with a new value.\r\n * Value will be replaced instead of merged, which is useful for single-value filters or when you want to reset the filter values for a field.\r\n * @param field - The field to update the filter value for.\r\n * @param value - The new filter value to set.\r\n */\r\n const replaceFilter = (field: keyof TFieldStore<T>, value: TFieldValue, options?: TOptions) => {\r\n const valueObj: TFieldValue = { ...value, logic: options?.logic || value.logic }\r\n const newStoreFilter = Object.assign({}, context.filterState.storeFilter, { [field]: valueObj })\r\n context.setFilterState({ ...context.filterState, storeFilter: newStoreFilter as TFieldStore<T> })\r\n }\r\n /**\r\n * Add multiple filter values to the store for a specific field, ensuring no duplicates are added.\r\n * @param field - The field to add the filter values to.\r\n * @param values - The filter values to add.\r\n * @returns void\r\n */\r\n const upsertManyFilter = (field: keyof TFieldStore<T>, value: TFieldValue, options?: TOptions) => {\r\n // If there are no values to add, return early\r\n if (value.values.length === 0) return\r\n let newStoreFilter = Object.assign({}, context.filterState.storeFilter)\r\n // Iterate through each value and add it to the store filter for the field, checking for duplicates\r\n value.values.forEach((val) => {\r\n const valueObj: TFieldValue = { values: [val], logic: options?.logic || value.logic }\r\n if (checkDuplicateValue(newStoreFilter, field, valueObj)) return\r\n newStoreFilter = mergeValueToStoreFilter(newStoreFilter, field, valueObj)\r\n })\r\n // Update the filter state with the new store filter after adding all values\r\n context.setFilterState({ ...context.filterState, storeFilter: newStoreFilter })\r\n }\r\n /**\r\n * Remove all filter values for a specific field from the store.\r\n * @param field - The field to remove filters from.\r\n * @returns void\r\n */\r\n const removeFilter = (field: TFieldType<T>) => {\r\n const newStoreFilter = Object.assign({}, context.filterState.storeFilter)\r\n if (newStoreFilter[field]) delete newStoreFilter[field]\r\n context.setFilterState({ ...context.filterState, storeFilter: newStoreFilter })\r\n }\r\n\r\n const removeFilterByFieldValue = (field: TFieldType<T>, value: TFieldValid) => {\r\n const newStoreFilter = Object.assign({}, context.filterState.storeFilter)\r\n const fieldVal: TFieldValue | undefined = newStoreFilter[field]\r\n if (!fieldVal) return\r\n newStoreFilter[field] = { ...fieldVal, values: fieldVal.values.filter((v) => v.toString() !== value.toString()) }\r\n if (newStoreFilter[field] && newStoreFilter[field]!.values.length === 0) {\r\n delete newStoreFilter[field]\r\n }\r\n context.setFilterState({ ...context.filterState, storeFilter: newStoreFilter })\r\n }\r\n\r\n const clearAllFilters = () => {\r\n context.setFilterState({ ...context.filterState, storeFilter: {} as TFieldStore<T> })\r\n }\r\n\r\n const getFieldInfo = (field: TFieldType<T>): TFieldValue | undefined => {\r\n const fieldVal = context.filterState.storeFilter?.[field]\r\n return fieldVal\r\n }\r\n\r\n const getTotalCount = (): number => {\r\n const storeFilter = context.filterState.storeFilter\r\n if (!storeFilter) return 0\r\n const keys = Object.keys(storeFilter) as (keyof TFieldStore<T>)[]\r\n return keys.reduce((acc, key) => {\r\n const fieldVal = storeFilter[key]\r\n return acc + (fieldVal ? fieldVal.values.length : 0)\r\n }, 0)\r\n }\r\n\r\n const hasSortByField = (field: TFieldType<T>): boolean => {\r\n const sort = context.filterState.storeSort\r\n return sort?.field === field\r\n }\r\n\r\n const getSort = (): TFieldSort<T> | undefined => {\r\n return context.filterState.storeSort\r\n }\r\n\r\n const changeSort = (field: TFieldType<T>) => {\r\n const currentSort = context.filterState.storeSort\r\n const defaultSort = context.defaultFilterState?.storeSort\r\n const isShuffle = field === KeySpecial.sortShuffle\r\n const isEqualField = currentSort?.field === field\r\n if (isShuffle) {\r\n // if current sort is shuffle and user click shuffle again, we remove the sort completely\r\n let newValue: TFieldSort<T> | undefined = undefined\r\n if (!isEqualField) newValue = { field }\r\n context.setFilterState({ ...context.filterState, storeSort: newValue })\r\n return\r\n }\r\n let newDirection: 'asc' | 'desc' = 'desc'\r\n // If current field equals the clicked field, toggle direction\r\n if (isEqualField) {\r\n newDirection = currentSort.direction === 'desc' ? 'asc' : 'desc'\r\n }\r\n // If no current sort but field equals default sort field, toggle from default direction\r\n else if (!currentSort && defaultSort?.field === field) {\r\n newDirection = defaultSort.direction === 'desc' ? 'asc' : 'desc'\r\n }\r\n context.setFilterState({ ...context.filterState, storeSort: { field, direction: newDirection } })\r\n }\r\n\r\n const removeSort = () => {\r\n const defaultSort = context.defaultFilterState?.storeSort\r\n context.setFilterState({ ...context.filterState, storeSort: defaultSort })\r\n }\r\n\r\n return {\r\n addFilter,\r\n replaceFilter,\r\n upsertManyFilter,\r\n removeFilter,\r\n removeFilterByFieldValue,\r\n clearAllFilters,\r\n getFieldInfo,\r\n getTotalCount,\r\n hasSortByField,\r\n getSort,\r\n changeSort,\r\n removeSort\r\n }\r\n}\r\n"],"names":["checkDuplicateValue","storeFilter","field","value","fieldValue","isLogicChange","logic","fieldSet","Set","values","map","v","JSON","stringify","filter","Boolean","some","has","mergeValueToStoreFilter","newData","Array","from","concat","_toConsumableArray","Object","assign","_defineProperty","mergeSingleValueToStoreFilter","existingValues","_objectSpread","useFilterActions","context","addFilter","options","filterState","valueObj","newStoreFilter","setFilterState","replaceFilter","upsertManyFilter","length","forEach","val","removeFilter","removeFilterByFieldValue","fieldVal","toString","clearAllFilters","getFieldInfo","_context$filterState$","getTotalCount","keys","reduce","acc","key","hasSortByField","sort","storeSort","getSort","changeSort","_context$defaultFilte","currentSort","defaultSort","defaultFilterState","isShuffle","KeySpecial","sortShuffle","isEqualField","newValue","undefined","newDirection","direction","removeSort","_context$defaultFilte2"],"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 a}from"react/jsx-runtime";import{useState as l,useRef as u,useEffect as m}from"react";import{styled as s,Box as c,useTheme as f,useMediaQuery as p}from"@mui/material";import{fetchDelay as d}from"../utils/helpers.js";import"../utils/dayjs-config.js";import"../utils/query-param.js";import{createFilterMenu as v}from"./menu/create.js";import{createFilterBarContext as g}from"./index.context.js";import{createFilterSort as S}from"./components/filter-sort.js";import{createFilterInput as y}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=y(j)}if(!t.MenuComponent){var P=t.menuConfig||{fields:{}};t.menuConfig=P,t.MenuComponent=v(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=S(F)}var I=t.defaultFilterLogic||"and",B=g();return function(s){var v,g=s.slots,S=t.InputComponent,y=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=f(),G=p(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(y,{slots:{popperProps:{placement:"bottom-start"}}}),i(j,{slots:{popperProps:{placement:"bottom-start"}}})]}),i(S,{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};
1
+ import{defineProperty as r,slicedToArray as e,objectSpread2 as n,asyncToGenerator as t,regenerator as o}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as a,jsxs as l}from"react/jsx-runtime";import{useState as i,useRef as u,useEffect as m}from"react";import{styled as s,Box as c,useTheme as f,useMediaQuery as p}from"@mui/material";import{createFilterMenu as d}from"./menu/create.js";import{createFilterBarContext as v}from"./index.context.js";import{createFilterSort as g}from"./components/filter-sort.js";import{createFilterInput as b}from"./components/filter-input.js";import{createFilterSummary as C}from"./components/filter-summary.js";function S(r){var s,S=null!==(s=r.debounceDelay)&&void 0!==s?s:300;if(!r.InputComponent){var h=r.inputConfig||{fields:{}};r.inputConfig=h,r.InputComponent=b(h)}if(!r.MenuComponent){var j=r.menuConfig||{fields:{}};r.menuConfig=j,r.MenuComponent=d(j)}if(!r.SummaryComponent&&!1!==r.enableSummary){var P=r.summaryConfig||{fields:{}};r.summaryConfig=P,r.SummaryComponent=C(P)}if(!r.SortComponent){var w=r.sortConfig||{fields:{}};r.sortConfig=w,r.SortComponent=g(w)}var F=r.defaultFilterLogic||"and",I=v();return function(s){var d,v=s.slots,g=r.InputComponent,b=r.MenuComponent,C=r.SummaryComponent,h=r.SortComponent,j=function(){return Object.assign({filterLogic:F},r.defaultFilterState,s.defaultValue)},P=i(function(){return s.value?{filterState:s.value}:{filterState:j()}}),w=e(P,2),k=w[0],B=w[1],T=i(!1),D=e(T,2),A=D[0],L=D[1],M=u(null),N=u(null),W=u(null);m(function(){return function(){var r;M.current&&(clearTimeout(M.current),M.current=null),null===(r=W.current)||void 0===r||r.abort(),W.current=null}},[]),m(function(){s.value&&B({filterState:s.value})},[s.value]);var _=function(){var r=t(o().m(function r(e,n,t){var a,l;return o().w(function(r){for(;;)switch(r.p=r.n){case 0:return r.p=0,B(function(r){var e;return{filterState:null!==(e=null==t?void 0:t.filterState)&&void 0!==e?e:r.filterState}}),L(!0),r.n=1,null===(a=s.onChange)||void 0===a?void 0:a.call(s,e,n);case 1:if(!n.aborted){r.n=2;break}return r.a(2);case 2:L(!1),r.n=5;break;case 3:if(r.p=3,l=r.v,!n.aborted){r.n=4;break}return r.a(2);case 4:throw L(!1),l;case 5:return r.a(2)}},r,null,[[0,3]])}));return function(e,n,t){return r.apply(this,arguments)}}(),z={filterState:s.value||k.filterState,defaultFilterState:j(),isLoading:s.loading||A,setFilterState:function(r){N.current=r,s.value||B({filterState:r}),M.current&&clearTimeout(M.current),M.current=window.setTimeout(function(){var r;null===(r=W.current)||void 0===r||r.abort();var e=new AbortController;W.current=e;var n=N.current;s.value?_(n,e.signal):_(n,e.signal,{filterState:n}),M.current=null,N.current=null},S)}},G=f(),H=p(G.breakpoints.down("md"));return a(I.Provider,{value:z,children:l(x,{className:y.root,sx:s.sx,children:[l(c,{className:y.inner,children:[(null==v?void 0:v.before)||null,l("div",{className:y.action,children:[a(b,{slots:{popperProps:{placement:"bottom-start"}}}),a(h,{slots:{popperProps:{placement:"bottom-start"}}})]}),a(g,{slots:{minimalInput:H,popperProps:{placement:"bottom-start"}}}),(null==v?void 0:v.after)||null]}),l(c,n(n({},null==v?void 0:v.summaryWrapProps),{},{sx:n({display:"flex",alignItems:"center"},null==v||null===(d=v.summaryWrapProps)||void 0===d?void 0:d.sx),children:[(null==v?void 0:v.summaryBefore)||null,a(c,{sx:{flex:1,minWidth:0},children:!1!==r.enableSummary&&a(C,{})}),(null==v?void 0:v.summaryAfter)||null]}))]})})}}var y={root:"DinoFilterBar-root",inner:"DinoFilterBar-inner",action:"DinoFilterBar-action"},x=s(c)(function(e){var n=e.theme;return r(r(r({},"&.".concat(y.root),{backgroundColor:n.palette.background.paper,boxSizing:"border-box"}),".".concat(y.inner),{display:"flex",alignItems:"center",gap:n.spacing(1)}),".".concat(y.action),{display:"flex",alignItems:"center"})});export{S 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, useTheme } from '@mui/material'\r\nimport { fetchDelay } from '../utils'\r\nimport { createFilterMenu } from './menu/create'\r\nimport { createFilterBarContext } from './index.context'\r\nimport { createFilterSort } from './components/filter-sort'\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 { IFilterMenuConfig, IFilterMenuProps } from './menu/types'\r\nimport type { IFilterBarContext, IFilterBarContextState } from './index.context'\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 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, useTheme } from '@mui/material'\r\nimport { createFilterMenu } from './menu/create'\r\nimport { createFilterBarContext } from './index.context'\r\nimport { createFilterSort } from './components/filter-sort'\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 { IFilterMenuConfig, IFilterMenuProps } from './menu/types'\r\nimport type { IFilterBarContext, IFilterBarContextState } from './index.context'\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>, signal?: AbortSignal) => Promise<void> | void\r\n slots?: IFilterBarSlots\r\n loading?: boolean\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 const abortControllerRef = useRef<AbortController | 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 abortControllerRef.current?.abort()\r\n abortControllerRef.current = null\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>, signal: AbortSignal, state?: Partial<IFilterBarState<T>>) => {\r\n try {\r\n setLocalState((prev) => ({ filterState: state?.filterState ?? prev.filterState }))\r\n setIsLoading(true)\r\n await props.onChange?.(filterState, signal)\r\n if (signal.aborted) return\r\n setIsLoading(false)\r\n } catch (error) {\r\n if (signal.aborted) return\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 // abort previous in-flight request before starting a new one\r\n abortControllerRef.current?.abort()\r\n const controller = new AbortController()\r\n abortControllerRef.current = controller\r\n\r\n const s = pendingStateRef.current as TFilterState<T>\r\n if (props.value) {\r\n handleChange(s, controller.signal)\r\n } else {\r\n handleChange(s, controller.signal, { 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: props.loading || 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 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","abortControllerRef","useEffect","_abortControllerRef$c","current","clearTimeout","abort","handleChange","_ref","_asyncToGenerator","_regenerator","m","_callee","signal","state","_props$onChange","_t","w","_context","p","n","prev","_state$filterState","onChange","call","aborted","a","v","_x","_x2","_x3","apply","this","arguments","contextValue","loading","setFilterState","window","setTimeout","_abortControllerRef$c2","controller","AbortController","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","_ref2","_defineProperty","concat","backgroundColor","palette","background","paper","boxSizing","gap","spacing"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{createClass as t,classCallCheck as e,defineProperty as i,objectSpread2 as n}from"../../../_virtual/_rollupPluginBabelHelpers.js";var r=t(function t(r){var o=this;e(this,t),i(this,"mergeOptions",function(){for(var t=arguments.length,e=new Array(t),i=0;i<t;i++)e[i]=arguments[i];return e.reduce(function(t,e){return Object.assign(t,null!=e?e:{})},{})}),i(this,"ignoreEmpty",function(t,e){var i=o.mergeOptions(o._option,e);return!t&&!0===(null==i?void 0:i.ignoreEmpty)}),i(this,"_filter",[]),i(this,"_filterBase",function(t,e,i,n){var r=o._filter.length?" "+("And"===(null==n?void 0:n.logic)?"&&":"||")+" ":"";return o._filter.push("".concat(r).concat(t).concat(e).concat(i)),o}),i(this,"filter",function(t,e,i){return"string"==typeof e&&o.ignoreEmpty(e,i)?o:o._filterBase(t,"==","string"==typeof e?'"'.concat(e,'"'):e.toString(),i)}),i(this,"filterNotEquals",function(t,e,i){return"string"==typeof e&&o.ignoreEmpty(e,i)?o:o._filterBase(t,"!=","string"==typeof e?'"'.concat(e,'"'):e.toString(),i)}),i(this,"filterEnum",function(t,e,i){return"string"==typeof e&&o.ignoreEmpty(e,i)?o:o._filterBase(t,"==","string"==typeof e?e:e.toString(),i)}),i(this,"filterStartsWith",function(t,e,i){return o.ignoreEmpty(e,i)?o:o._filterBase(t,'.startsWith("'+e+'")',"",i)}),i(this,"filterContains",function(t,e,i){return o.ignoreEmpty(e,i)?o:o._filterBase(t,'.Contains("'+e+'")',"",i)}),i(this,"filterLast",function(t,e,i){return o.ignoreEmpty(e,i)?o:o._filterBase(t,'.endsWith("'+e+'")',"",i)}),i(this,"filterNumber",function(t,e,i,n){return o.ignoreEmpty(i,n)?o:o._filterBase(t," ".concat(e," ")+i,"",n)}),i(this,"filterGreater",function(t,e,i){return o.ignoreEmpty(e,i)?o:o._filterBase(t," > '"+e+"'","",i)}),i(this,"filterLess",function(t,e,i){return o.ignoreEmpty(e,i)?o:o._filterBase(t," < '"+e+"'","",i)}),i(this,"filterCustom",function(t,e){var i=o._filter.length?" "+("And"===(null==e?void 0:e.logic)?"&&":"||")+" ":"";return o._filter.push("".concat(i).concat(t)),o}),i(this,"scope",function(e,i){var n=e(new t(o._option));if(n.buildFilter()){var r=o._filter.length?" "+("And"===(null==i?void 0:i.logic)?"&&":"||")+" ":"";o._filter.push("".concat(r,"(").concat(n.buildFilter(),")"))}return o}),i(this,"seed",function(t,e){return o.seedStore={field:t,key:e},o}),i(this,"skip",function(t){return o._skip=t,o}),i(this,"take",function(t){return o._take=t,o}),i(this,"sortStore",[]),i(this,"sortBase",function(t,e,i){var n={};return n[t]=e,o.sortStore.some(function(t){return Object.keys(t)[0]===Object.keys(n)[0]})||o.sortStore.push(n),o}),i(this,"sort",function(t,e){return o.sortBase(t,null!=e&&e.direction?e.direction:"ASC"),o}),i(this,"noTotal",function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return o._noTotal=t,o}),i(this,"buildFilter",function(){return o._filter.join("")}),i(this,"buildPage",function(){var t={};return o._skip&&(t.skip=o._skip),o._take&&(t.take=o._take),t}),i(this,"buildRandomWithSeedKey",function(){var t,e,i,n,r,s;return null===(t=o.seedStore)||void 0===t||!t.field||null!==(e=o.seedStore)&&void 0!==e&&e.key||console.warn("RandomWithSeedKey missing seedKey."),null===(i=o.seedStore)||void 0===i||!i.key||null!==(n=o.seedStore)&&void 0!==n&&n.field||console.warn("RandomWithSeedKey missing seedField."),null!==(r=o.seedStore)&&void 0!==r&&r.key||null!==(s=o.seedStore)&&void 0!==s&&s.field?o.seedStore:{}}),i(this,"build",function(){var t=n({},o.buildPage());o.sortStore.length>0&&(t.sort=o.sortStore);var e=o.buildFilter();e&&(t.filter=e),o._noTotal&&(t.noTotal=o._noTotal);var i=o.buildRandomWithSeedKey();return i.key&&i.field&&(t.seedField=i.field.toString(),t.seedKey=i.key),t}),this._option=r}),o=function(t){return new r(t)};export{r as RequestParam,o as createRequestBuilder};
1
+ import{createClass as t,classCallCheck as e,defineProperty as i,objectSpread2 as r}from"../../../_virtual/_rollupPluginBabelHelpers.js";var n=t(function t(n){var o=this;e(this,t),i(this,"mergeOptions",function(){for(var t=arguments.length,e=new Array(t),i=0;i<t;i++)e[i]=arguments[i];return e.reduce(function(t,e){return Object.assign(t,null!=e?e:{})},{})}),i(this,"ignoreEmpty",function(t,e){var i=o.mergeOptions(o._option,e);return!t&&!0===(null==i?void 0:i.ignoreEmpty)}),i(this,"_filter",[]),i(this,"_filterBase",function(t,e,i,r){var n=o._filter.length?" "+("And"===(null==r?void 0:r.logic)?"&&":"||")+" ":"";return o._filter.push("".concat(n).concat(t).concat(e).concat(i)),o}),i(this,"filter",function(t,e,i){return"string"==typeof e&&o.ignoreEmpty(e,i)?o:o._filterBase(t,"==","string"==typeof e?'"'.concat(e,'"'):e.toString(),i)}),i(this,"filterEqual",function(t,e,i){return o.ignoreEmpty(e,i)?o:o._filterBase(t,"==",'"'.concat(e,'"'),i)}),i(this,"filterNotEquals",function(t,e,i){return"string"==typeof e&&o.ignoreEmpty(e,i)?o:o._filterBase(t,"!=","string"==typeof e?'"'.concat(e,'"'):e.toString(),i)}),i(this,"filterEnum",function(t,e,i){return"string"==typeof e&&o.ignoreEmpty(e,i)?o:o._filterBase(t,"==","string"==typeof e?e:e.toString(),i)}),i(this,"filterStartsWith",function(t,e,i){return o.ignoreEmpty(e,i)?o:o._filterBase(t,'.startsWith("'+e+'")',"",i)}),i(this,"filterContains",function(t,e,i){return o.ignoreEmpty(e,i)?o:o._filterBase(t,'.Contains("'+e+'")',"",i)}),i(this,"filterLast",function(t,e,i){return o.ignoreEmpty(e,i)?o:o._filterBase(t,'.endsWith("'+e+'")',"",i)}),i(this,"filterNumber",function(t,e,i,r){return o.ignoreEmpty(i,r)?o:o._filterBase(t," ".concat(e," ")+i,"",r)}),i(this,"filterGreater",function(t,e,i){return o.ignoreEmpty(e,i)?o:o._filterBase(t," > '"+e+"'","",i)}),i(this,"filterGreaterEqual",function(t,e,i){return o.ignoreEmpty(e,i)?o:o._filterBase(t," >= '"+e+"'","",i)}),i(this,"filterLess",function(t,e,i){return o.ignoreEmpty(e,i)?o:o._filterBase(t," < '"+e+"'","",i)}),i(this,"filterLessEqual",function(t,e,i){return o.ignoreEmpty(e,i)?o:o._filterBase(t," <= '"+e+"'","",i)}),i(this,"filterCustom",function(t,e){var i=o._filter.length?" "+("And"===(null==e?void 0:e.logic)?"&&":"||")+" ":"";return o._filter.push("".concat(i).concat(t)),o}),i(this,"scope",function(e,i){var r=e(new t(o._option));if(r.buildFilter()){var n=o._filter.length?" "+("And"===(null==i?void 0:i.logic)?"&&":"||")+" ":"";o._filter.push("".concat(n,"(").concat(r.buildFilter(),")"))}return o}),i(this,"seed",function(t,e){return o.seedStore={field:t,key:e},o}),i(this,"skip",function(t){return o._skip=t,o}),i(this,"take",function(t){return o._take=t,o}),i(this,"sortStore",[]),i(this,"sortBase",function(t,e,i){var r={};return r[t]=e,o.sortStore.some(function(t){return Object.keys(t)[0]===Object.keys(r)[0]})||o.sortStore.push(r),o}),i(this,"sort",function(t,e){return o.sortBase(t,null!=e&&e.direction?e.direction:"ASC"),o}),i(this,"noTotal",function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return o._noTotal=t,o}),i(this,"buildFilter",function(){return o._filter.join("")}),i(this,"buildPage",function(){var t={};return o._skip&&(t.skip=o._skip),o._take&&(t.take=o._take),t}),i(this,"buildRandomWithSeedKey",function(){var t,e,i,r,n,s;return null===(t=o.seedStore)||void 0===t||!t.field||null!==(e=o.seedStore)&&void 0!==e&&e.key||console.warn("RandomWithSeedKey missing seedKey."),null===(i=o.seedStore)||void 0===i||!i.key||null!==(r=o.seedStore)&&void 0!==r&&r.field||console.warn("RandomWithSeedKey missing seedField."),null!==(n=o.seedStore)&&void 0!==n&&n.key||null!==(s=o.seedStore)&&void 0!==s&&s.field?o.seedStore:{}}),i(this,"build",function(){var t=r({},o.buildPage());o.sortStore.length>0&&(t.sort=o.sortStore);var e=o.buildFilter();e&&(t.filter=e),o._noTotal&&(t.noTotal=o._noTotal);var i=o.buildRandomWithSeedKey();return i.key&&i.field&&(t.seedField=i.field.toString(),t.seedKey=i.key),t}),this._option=n}),o=function(t){return new n(t)};export{n as RequestParam,o as createRequestBuilder};
2
2
  //# sourceMappingURL=request-param.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"request-param.js","sources":["../../../../src/http-service/graphql/request-param.ts"],"sourcesContent":["export type IVariable<T extends object> = keyof T\r\n\r\nexport type ILogic = 'Or' | 'And'\r\n\r\nexport type ISortDirection = 'ASC' | 'DESC'\r\n\r\nexport interface ISeedModel<T> {\r\n key: string\r\n field: keyof T\r\n}\r\n\r\nexport interface IFilterOption {\r\n logic: ILogic\r\n ignoreEmpty: boolean\r\n}\r\n\r\nexport interface IRequestParamOption {\r\n ignoreEmpty: boolean\r\n}\r\n\r\nexport interface ISortOption {\r\n direction: ISortDirection\r\n}\r\n\r\nexport type ISortStore<T extends object> = { [key in keyof T]?: ISortDirection }\r\n\r\nexport type IAllOptions = IFilterOption & IRequestParamOption & ISortOption\r\n\r\nexport type IRequestParamResult<T extends object> = {\r\n sort?: ISortStore<T>[]\r\n skip?: number\r\n take?: number\r\n filter?: string\r\n noTotal?: boolean\r\n seedKey?: string\r\n seedField?: string\r\n}\r\n\r\nexport class RequestParam<T extends object = any> {\r\n private readonly _option?: Partial<IRequestParamOption>\r\n constructor(option?: Partial<IRequestParamOption>) {\r\n this._option = option\r\n }\r\n\r\n private mergeOptions = (...p: any[]): Partial<IAllOptions> => {\r\n return p.reduce((a, b) => {\r\n return Object.assign(a, b ?? {})\r\n }, {})\r\n }\r\n\r\n private ignoreEmpty = (field2: string, option?: Partial<IFilterOption>) => {\r\n const mOption = this.mergeOptions(this._option, option)\r\n return !field2 && mOption?.ignoreEmpty === true\r\n }\r\n\r\n private _filter: string[] = []\r\n private _filterBase = (field1: IVariable<T>, operation: string, field2: string, option?: Partial<IFilterOption>) => {\r\n const logicStr = this._filter.length ? ' ' + (option?.logic === 'And' ? '&&' : '||') + ' ' : ''\r\n this._filter.push(`${logicStr}${field1 as string}${operation}${field2 as string}`)\r\n return this\r\n }\r\n filter = (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption>) => {\r\n if (typeof field2 === 'string' && this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '==', typeof field2 === 'string' ? `\"${field2}\"` : field2.toString(), option)\r\n }\r\n filterNotEquals = (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption>) => {\r\n if (typeof field2 === 'string' && this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '!=', typeof field2 === 'string' ? `\"${field2}\"` : field2.toString(), option)\r\n }\r\n filterEnum = (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption>) => {\r\n if (typeof field2 === 'string' && this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '==', typeof field2 === 'string' ? field2 : field2.toString(), option)\r\n }\r\n filterStartsWith = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '.startsWith(\"' + (field2 as string) + '\")', '', option)\r\n }\r\n filterContains = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '.Contains(\"' + (field2 as string) + '\")', '', option)\r\n }\r\n filterLast = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '.endsWith(\"' + (field2 as string) + '\")', '', option)\r\n }\r\n filterNumber = (field1: IVariable<T>, operator: string, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, ` ${operator} ` + (field2 as string), '', option)\r\n }\r\n filterGreater = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, \" > '\" + (field2 as string) + \"'\", '', option)\r\n }\r\n filterLess = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, \" < '\" + (field2 as string) + \"'\", '', option)\r\n }\r\n filterCustom = (field1: string, option?: Partial<IFilterOption>) => {\r\n const logicStr = this._filter.length ? ' ' + (option?.logic === 'And' ? '&&' : '||') + ' ' : ''\r\n this._filter.push(`${logicStr}${field1 as string}`)\r\n return this\r\n }\r\n\r\n scope = (action: (crd: RequestParam<T>) => RequestParam<T>, option?: Partial<IFilterOption>) => {\r\n const crd = action(new RequestParam(this._option))\r\n const temp = crd.buildFilter()\r\n if (temp) {\r\n const logicStr = this._filter.length ? ' ' + (option?.logic === 'And' ? '&&' : '||') + ' ' : ''\r\n this._filter.push(`${logicStr}(${crd.buildFilter()})`)\r\n }\r\n return this\r\n }\r\n\r\n private seedStore?: ISeedModel<T>\r\n seed = (field: keyof T, key: string) => {\r\n this.seedStore = { field, key }\r\n return this\r\n }\r\n\r\n private _skip?: number\r\n skip = (skip: number) => {\r\n this._skip = skip\r\n return this\r\n }\r\n\r\n private _take?: number\r\n take = (take: number) => {\r\n this._take = take\r\n return this\r\n }\r\n\r\n private sortStore: ISortStore<T>[] = []\r\n private sortBase = (field1: IVariable<T>, direction: ISortDirection, option?: Partial<ISortOption>) => {\r\n const temp = {} as ISortStore<T>\r\n temp[field1] = direction\r\n if (!this.sortStore.some((item) => Object.keys(item)[0] === Object.keys(temp)[0])) {\r\n this.sortStore.push(temp)\r\n }\r\n return this\r\n }\r\n sort = (field1: IVariable<T>, option?: Partial<ISortOption>) => {\r\n this.sortBase(field1, option?.direction ? option.direction : 'ASC')\r\n return this\r\n }\r\n\r\n private _noTotal?: boolean\r\n noTotal = (value: boolean = true) => {\r\n this._noTotal = value\r\n return this\r\n }\r\n\r\n private buildFilter = () => {\r\n return this._filter.join('')\r\n }\r\n\r\n private buildPage = () => {\r\n const temp = {} as any\r\n if (this._skip) {\r\n temp.skip = this._skip\r\n }\r\n if (this._take) {\r\n temp.take = this._take\r\n }\r\n return temp as { skip: number; take: number }\r\n }\r\n\r\n private buildRandomWithSeedKey = (): Partial<ISeedModel<T>> => {\r\n if (this.seedStore?.field && !this.seedStore?.key) {\r\n console.warn('RandomWithSeedKey missing seedKey.')\r\n }\r\n if (this.seedStore?.key && !this.seedStore?.field) {\r\n console.warn('RandomWithSeedKey missing seedField.')\r\n }\r\n if (!this.seedStore?.key && !this.seedStore?.field) {\r\n return {}\r\n }\r\n return this.seedStore\r\n }\r\n\r\n build = (): IRequestParamResult<T> => {\r\n const obj: IRequestParamResult<T> = { ...this.buildPage() }\r\n if (this.sortStore.length > 0) obj.sort = this.sortStore\r\n const filter = this.buildFilter()\r\n if (filter) obj.filter = filter\r\n if (this._noTotal) obj.noTotal = this._noTotal\r\n const seedInfo = this.buildRandomWithSeedKey()\r\n if (!!seedInfo.key && !!seedInfo.field) {\r\n obj.seedField = seedInfo.field.toString()\r\n obj.seedKey = seedInfo.key\r\n }\r\n return obj\r\n }\r\n}\r\n\r\nexport const createRequestBuilder = <T extends object>(option?: Partial<IRequestParamOption>) => {\r\n return new RequestParam<T>(option)\r\n}\r\n"],"names":["RequestParam","_createClass","option","_this","this","_classCallCheck","_defineProperty","_len","arguments","length","p","Array","_key","reduce","a","b","Object","assign","field2","mOption","mergeOptions","_option","ignoreEmpty","field1","operation","logicStr","_filter","logic","push","concat","_filterBase","toString","operator","action","crd","buildFilter","field","key","seedStore","skip","_skip","take","_take","direction","temp","sortStore","some","item","keys","sortBase","value","undefined","_noTotal","join","_this$seedStore","_this$seedStore2","_this$seedStore3","_this$seedStore4","_this$seedStore5","_this$seedStore6","console","warn","obj","_objectSpread","buildPage","sort","filter","noTotal","seedInfo","buildRandomWithSeedKey","seedField","seedKey","createRequestBuilder"],"mappings":"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"}
1
+ {"version":3,"file":"request-param.js","sources":["../../../../src/http-service/graphql/request-param.ts"],"sourcesContent":["export type IVariable<T extends object> = keyof T\r\n\r\nexport type ILogic = 'Or' | 'And'\r\n\r\nexport type ISortDirection = 'ASC' | 'DESC'\r\n\r\nexport interface ISeedModel<T> {\r\n key: string\r\n field: keyof T\r\n}\r\n\r\nexport interface IFilterOption {\r\n logic: ILogic\r\n ignoreEmpty: boolean\r\n}\r\n\r\nexport interface IRequestParamOption {\r\n ignoreEmpty: boolean\r\n}\r\n\r\nexport interface ISortOption {\r\n direction: ISortDirection\r\n}\r\n\r\nexport type ISortStore<T extends object> = { [key in keyof T]?: ISortDirection }\r\n\r\nexport type IAllOptions = IFilterOption & IRequestParamOption & ISortOption\r\n\r\nexport type IRequestParamResult<T extends object> = {\r\n sort?: ISortStore<T>[]\r\n skip?: number\r\n take?: number\r\n filter?: string\r\n noTotal?: boolean\r\n seedKey?: string\r\n seedField?: string\r\n}\r\n\r\nexport class RequestParam<T extends object = any> {\r\n private readonly _option?: Partial<IRequestParamOption>\r\n constructor(option?: Partial<IRequestParamOption>) {\r\n this._option = option\r\n }\r\n\r\n private mergeOptions = (...p: any[]): Partial<IAllOptions> => {\r\n return p.reduce((a, b) => {\r\n return Object.assign(a, b ?? {})\r\n }, {})\r\n }\r\n\r\n private ignoreEmpty = (field2: string, option?: Partial<IFilterOption>) => {\r\n const mOption = this.mergeOptions(this._option, option)\r\n return !field2 && mOption?.ignoreEmpty === true\r\n }\r\n\r\n private _filter: string[] = []\r\n private _filterBase = (field1: IVariable<T>, operation: string, field2: string, option?: Partial<IFilterOption>) => {\r\n const logicStr = this._filter.length ? ' ' + (option?.logic === 'And' ? '&&' : '||') + ' ' : ''\r\n this._filter.push(`${logicStr}${field1 as string}${operation}${field2 as string}`)\r\n return this\r\n }\r\n filter = (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption>) => {\r\n if (typeof field2 === 'string' && this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '==', typeof field2 === 'string' ? `\"${field2}\"` : field2.toString(), option)\r\n }\r\n filterEqual = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '==', `\"${field2}\"`, option)\r\n }\r\n filterNotEquals = (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption>) => {\r\n if (typeof field2 === 'string' && this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '!=', typeof field2 === 'string' ? `\"${field2}\"` : field2.toString(), option)\r\n }\r\n filterEnum = (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption>) => {\r\n if (typeof field2 === 'string' && this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '==', typeof field2 === 'string' ? field2 : field2.toString(), option)\r\n }\r\n filterStartsWith = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '.startsWith(\"' + (field2 as string) + '\")', '', option)\r\n }\r\n filterContains = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '.Contains(\"' + (field2 as string) + '\")', '', option)\r\n }\r\n filterLast = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '.endsWith(\"' + (field2 as string) + '\")', '', option)\r\n }\r\n filterNumber = (field1: IVariable<T>, operator: string, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, ` ${operator} ` + (field2 as string), '', option)\r\n }\r\n\r\n filterGreater = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, \" > '\" + (field2 as string) + \"'\", '', option)\r\n }\r\n filterGreaterEqual = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, \" >= '\" + (field2 as string) + \"'\", '', option)\r\n }\r\n filterLess = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, \" < '\" + (field2 as string) + \"'\", '', option)\r\n }\r\n filterLessEqual = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, \" <= '\" + (field2 as string) + \"'\", '', option)\r\n }\r\n filterCustom = (field1: string, option?: Partial<IFilterOption>) => {\r\n const logicStr = this._filter.length ? ' ' + (option?.logic === 'And' ? '&&' : '||') + ' ' : ''\r\n this._filter.push(`${logicStr}${field1 as string}`)\r\n return this\r\n }\r\n\r\n scope = (action: (crd: RequestParam<T>) => RequestParam<T>, option?: Partial<IFilterOption>) => {\r\n const crd = action(new RequestParam(this._option))\r\n const temp = crd.buildFilter()\r\n if (temp) {\r\n const logicStr = this._filter.length ? ' ' + (option?.logic === 'And' ? '&&' : '||') + ' ' : ''\r\n this._filter.push(`${logicStr}(${crd.buildFilter()})`)\r\n }\r\n return this\r\n }\r\n\r\n private seedStore?: ISeedModel<T>\r\n seed = (field: keyof T, key: string) => {\r\n this.seedStore = { field, key }\r\n return this\r\n }\r\n\r\n private _skip?: number\r\n skip = (skip: number) => {\r\n this._skip = skip\r\n return this\r\n }\r\n\r\n private _take?: number\r\n take = (take: number) => {\r\n this._take = take\r\n return this\r\n }\r\n\r\n private sortStore: ISortStore<T>[] = []\r\n private sortBase = (field1: IVariable<T>, direction: ISortDirection, option?: Partial<ISortOption>) => {\r\n const temp = {} as ISortStore<T>\r\n temp[field1] = direction\r\n if (!this.sortStore.some((item) => Object.keys(item)[0] === Object.keys(temp)[0])) {\r\n this.sortStore.push(temp)\r\n }\r\n return this\r\n }\r\n sort = (field1: IVariable<T>, option?: Partial<ISortOption>) => {\r\n this.sortBase(field1, option?.direction ? option.direction : 'ASC')\r\n return this\r\n }\r\n\r\n private _noTotal?: boolean\r\n noTotal = (value: boolean = true) => {\r\n this._noTotal = value\r\n return this\r\n }\r\n\r\n private buildFilter = () => {\r\n return this._filter.join('')\r\n }\r\n\r\n private buildPage = () => {\r\n const temp = {} as any\r\n if (this._skip) {\r\n temp.skip = this._skip\r\n }\r\n if (this._take) {\r\n temp.take = this._take\r\n }\r\n return temp as { skip: number; take: number }\r\n }\r\n\r\n private buildRandomWithSeedKey = (): Partial<ISeedModel<T>> => {\r\n if (this.seedStore?.field && !this.seedStore?.key) {\r\n console.warn('RandomWithSeedKey missing seedKey.')\r\n }\r\n if (this.seedStore?.key && !this.seedStore?.field) {\r\n console.warn('RandomWithSeedKey missing seedField.')\r\n }\r\n if (!this.seedStore?.key && !this.seedStore?.field) {\r\n return {}\r\n }\r\n return this.seedStore\r\n }\r\n\r\n build = (): IRequestParamResult<T> => {\r\n const obj: IRequestParamResult<T> = { ...this.buildPage() }\r\n if (this.sortStore.length > 0) obj.sort = this.sortStore\r\n const filter = this.buildFilter()\r\n if (filter) obj.filter = filter\r\n if (this._noTotal) obj.noTotal = this._noTotal\r\n const seedInfo = this.buildRandomWithSeedKey()\r\n if (!!seedInfo.key && !!seedInfo.field) {\r\n obj.seedField = seedInfo.field.toString()\r\n obj.seedKey = seedInfo.key\r\n }\r\n return obj\r\n }\r\n}\r\n\r\nexport const createRequestBuilder = <T extends object>(option?: Partial<IRequestParamOption>) => {\r\n return new RequestParam<T>(option)\r\n}\r\n"],"names":["RequestParam","_createClass","option","_this","this","_classCallCheck","_defineProperty","_len","arguments","length","p","Array","_key","reduce","a","b","Object","assign","field2","mOption","mergeOptions","_option","ignoreEmpty","field1","operation","logicStr","_filter","logic","push","concat","_filterBase","toString","operator","action","crd","buildFilter","field","key","seedStore","skip","_skip","take","_take","direction","temp","sortStore","some","item","keys","sortBase","value","undefined","_noTotal","join","_this$seedStore","_this$seedStore2","_this$seedStore3","_this$seedStore4","_this$seedStore5","_this$seedStore6","console","warn","obj","_objectSpread","buildPage","sort","filter","noTotal","seedInfo","buildRandomWithSeedKey","seedField","seedKey","createRequestBuilder"],"mappings":"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"}
@@ -23,6 +23,7 @@ interface IChipViewerProps<T> {
23
23
  enableMinimalesticView?: boolean;
24
24
  sx?: SxProps<Theme>;
25
25
  forceShowAll?: boolean;
26
+ disabled?: boolean;
26
27
  }
27
28
  export declare function createChipViewers<T>(): FC<IChipViewerProps<T>>;
28
29
  export {};
@@ -17,10 +17,10 @@ type TAutoMapConfig<TSource, TTarget extends object> = {
17
17
  */
18
18
  targetfield?: keyof TTarget;
19
19
  /**
20
- * @en The operation to apply for the filter field. Can be 'equal' or 'contains'. @default 'contains'
21
- * @vi Thao tác áp dụng cho trường filter. Có thể là 'equal' hoặc 'contains'. @default 'contains'
20
+ * @en The operation to apply for the filter field. Can be 'equal', 'contains', or 'datetime'. @default 'contains'
21
+ * @vi Thao tác áp dụng cho trường filter. Có thể là 'equal', 'contains', hoặc 'datetime'. @default 'contains'
22
22
  */
23
- operation?: 'equal' | 'contains';
23
+ operation?: 'equal' | 'contains' | 'datetime';
24
24
  /**
25
25
  * @en
26
26
  * - Custom function to apply complex filter logic that doesn't fit standard 'equal' or 'contains' operations.
@@ -42,8 +42,9 @@ export declare class TableFileterConverter<TSource extends Record<string, any>,
42
42
  constructor(state: TFilterState<TSource>);
43
43
  private graphqlBuilder;
44
44
  filterScope(fn: TFilterScopeFn<TSource, TTarget>, options?: TFilterOption): this;
45
- fillterEqual(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption): this;
46
- fillterContains(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption): this;
45
+ filterEqual(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption): this;
46
+ filterContains(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption): this;
47
+ filterDatetime(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption): this;
47
48
  sort(param?: {
48
49
  seed: {
49
50
  targetField?: TFieldType<TSource>;
@@ -3,6 +3,22 @@ import type { TFieldSort, TFieldStore, TFieldType, TFieldValid, TFieldValue, TLo
3
3
  type TOptions = {
4
4
  logic?: TLogic;
5
5
  };
6
+ /**
7
+ * Merge a filter value into the store for a specific field.
8
+ * @param storeFilter - The current filter store.
9
+ * @param field - The field to merge the value into.
10
+ * @param value - The filter value to merge.
11
+ * @returns The updated filter store.
12
+ */
13
+ export declare const mergeValueToStoreFilter: <T>(storeFilter: Partial<Record<TFieldType<T>, TFieldValue>> | undefined, field: TFieldType<T>, value: TFieldValue) => Partial<Record<TFieldType<T>, TFieldValue>>;
14
+ /**
15
+ * Merge a single filter value into the store for a specific field, ensuring no duplicates are added.
16
+ * @param storeFilter - The current filter store.
17
+ * @param field - The field to merge the value into.
18
+ * @param value - The single filter value to merge.
19
+ * @returns The updated filter store with the new value merged in, or the original store if the value is a duplicate.
20
+ */
21
+ export declare const mergeSingleValueToStoreFilter: <T>(storeFilter: Partial<Record<TFieldType<T>, TFieldValue>> | undefined, field: TFieldType<T>, value: TFieldValid) => Partial<Record<TFieldType<T>, TFieldValue>>;
6
22
  export declare const useFilterActions: <T>(context: IFilterBarContext<T>) => {
7
23
  addFilter: (field: TFieldType<T>, value: TFieldValue, options?: TOptions) => void;
8
24
  replaceFilter: (field: TFieldType<T>, value: TFieldValue, options?: TOptions) => void;
@@ -33,7 +33,8 @@ export interface IFilterBarProps<T> {
33
33
  sx?: BoxProps['sx'];
34
34
  value?: TFilterState<T>;
35
35
  defaultValue?: TFilterState<T>;
36
- onChange?: (state: TFilterState<T>) => Promise<void> | void;
36
+ onChange?: (state: TFilterState<T>, signal?: AbortSignal) => Promise<void> | void;
37
37
  slots?: IFilterBarSlots;
38
+ loading?: boolean;
38
39
  }
39
40
  export declare function createFilterBar<T>(configs: IFilterBarConfigs<T>): FC<IFilterBarProps<T>>;
@@ -7,3 +7,4 @@ export * from './index.dino';
7
7
  export type { IFieldSelectOption } from './menu/create-form-field-select';
8
8
  export type { IFormFieldDateTimeParam, TDateTimePickerType, TDateTimeMode } from './menu/create-form-field-datetime';
9
9
  export * from './menu/create-form-field-datetime';
10
+ export { mergeValueToStoreFilter, mergeSingleValueToStoreFilter } from './hooks';
@@ -36,6 +36,7 @@ export declare class RequestParam<T extends object = any> {
36
36
  private _filter;
37
37
  private _filterBase;
38
38
  filter: (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption>) => this;
39
+ filterEqual: (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => this;
39
40
  filterNotEquals: (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption>) => this;
40
41
  filterEnum: (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption>) => this;
41
42
  filterStartsWith: (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => this;
@@ -43,7 +44,9 @@ export declare class RequestParam<T extends object = any> {
43
44
  filterLast: (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => this;
44
45
  filterNumber: (field1: IVariable<T>, operator: string, field2: string, option?: Partial<IFilterOption>) => this;
45
46
  filterGreater: (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => this;
47
+ filterGreaterEqual: (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => this;
46
48
  filterLess: (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => this;
49
+ filterLessEqual: (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => this;
47
50
  filterCustom: (field1: string, option?: Partial<IFilterOption>) => this;
48
51
  scope: (action: (crd: RequestParam<T>) => RequestParam<T>, option?: Partial<IFilterOption>) => this;
49
52
  private seedStore?;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dinocollab-core",
3
- "version": "2.2.22",
3
+ "version": "2.2.23",
4
4
  "description": "Dinocollab core - libraries for building collaborative applications with React 18",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",