dinocollab-core 1.1.8 → 1.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/data-view/create.active-filters-panel.js +1 -1
- package/dist/data-view/create.active-filters-panel.js.map +1 -1
- package/dist/data-view/create.data-view.js +1 -1
- package/dist/data-view/create.data-view.js.map +1 -1
- package/dist/data-view/create.filter-menu.js +1 -1
- package/dist/data-view/create.filter-menu.js.map +1 -1
- package/dist/data-view/create.pagination-bar.js +1 -1
- package/dist/data-view/create.pagination-bar.js.map +1 -1
- package/dist/data-view/filter-store.js +1 -1
- package/dist/data-view/filter-store.js.map +1 -1
- package/dist/data-view/types.js.map +1 -1
- package/dist/types/data-view/create.data-view.d.ts +0 -1
- package/dist/types/data-view/create.pagination-bar.d.ts +1 -0
- package/dist/types/data-view/types.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{defineProperty as e,inherits as t,createClass as i,classCallCheck as r,callSuper as a}from"../_virtual/_rollupPluginBabelHelpers.js";import{jsx as n,Fragment as l,jsxs as o}from"react/jsx-runtime";import{Component as c,Fragment as s}from"react";import{styled as d,Box as u,Collapse as m,Typography as v,Chip as f}from"@mui/material";import{createFilterStore as p}from"./filter-store.js";import{ClearAllButton as h,mapSortConfigs as
|
|
1
|
+
import{defineProperty as e,inherits as t,createClass as i,classCallCheck as r,callSuper as a}from"../_virtual/_rollupPluginBabelHelpers.js";import{jsx as n,Fragment as l,jsxs as o}from"react/jsx-runtime";import{Component as c,Fragment as s}from"react";import{styled as d,Box as u,Collapse as m,Typography as v,Chip as f}from"@mui/material";import{createFilterStore as p}from"./filter-store.js";import{ClearAllButton as h,mapSortConfigs as x}from"./ui.units.js";import{mapDataViewContext as C}from"./context.js";import{formatDatetime as g}from"../utils/helpers.js";import"../utils/dayjs-config.js";import"react-router-dom";import"../utils/query-param.js";import{mapDateLogicText as S}from"./helpers.js";var b={root:"ActiveFiltersPanel-root",content:"ActiveFiltersPanel-content",item:"ActiveFiltersPanel-item",itemContent:"ActiveFiltersPanel-itemContent",itemChip:"ActiveFiltersPanel-itemChip",removeButton:"ActiveFiltersPanel-removeButton",overlay:"ActiveFiltersPanel-overlay"};function w(){return function(){function d(t){var i;return r(this,d),i=a(this,d,[t]),e(i,"handleAnimationExited",(function(){i.setState({isClosing:!0})})),e(i,"renderItems",(function(e){var t;return o(u,{className:b.item,children:[o(v,{variant:"caption",sx:{fontWeight:700},children:[e.label||(null===(t=e.field)||void 0===t?void 0:t.toString()),":"]}),e.items.map((function(t){return n(f,{clickable:!0,size:"small",label:t.label||t.value,className:b.itemChip,onDelete:function(){e.isQuickSearch?i.removeQuickSearch(t):e.field&&i.removeFilter(e.field,t)}},t.value)}))]})})),e(i,"renderFilters",(function(){var e,t=(null===(e=i.dataViewContext.filterState)||void 0===e?void 0:e.filter)||{},r=Object.keys(t);return 0===r.length?n(l,{}):r.map((function(e){var r,a=(null!==(r=t[e])&&void 0!==r?r:[]).reduce((function(e,t){var i,r,a,n,l=t.label||(null===(i=t.value)||void 0===i?void 0:i.toString());"date"===t.type&&t.dateLogic&&(l="".concat(S[t.dateLogic]," ").concat(g(null!==(a=null===(n=t.value)||void 0===n?void 0:n.toString())&&void 0!==a?a:"","style2")));return t.value&&e.push({value:null===(r=t.value)||void 0===r?void 0:r.toString(),label:l}),e}),[]);return n(s,{children:i.renderItems({field:e,label:e.toString(),items:a})},e.toString())}))})),e(i,"renderSort",(function(){var e,t,r=null===(e=i.dataViewContext.filterState)||void 0===e?void 0:e.sort;if(!r)return n(l,{});var a=null===(t=i.dataViewContext.filterBarConfigs.fields)||void 0===t?void 0:t[r.field],c=(null==a?void 0:a.label)||r.field.toString(),s=x[r.direction];return o(u,{className:b.item,children:[n(v,{variant:"caption",sx:{fontWeight:700},children:"Sort:"}),n(f,{clickable:!0,size:"small",label:o(u,{sx:{display:"flex",alignItems:"center",gap:.5},children:[n("span",{children:c}),s.icon]}),className:b.itemChip,onClick:i.toggleSortDirection,onDelete:function(){return i.removeSort()},title:"".concat(c," - ").concat(s.title)})]})})),e(i,"removeFilter",(function(e,t){var r=p(i.dataViewContext.filterState).removeFilterItem(e,t.value,{reason:"filter"});i.dataViewContext.onFilterStateChange(r.build())})),e(i,"removeQuickSearch",(function(e){var t=p(i.dataViewContext.filterState).removeQuickSearchItem(e.value,{reason:"quickSearch"});i.dataViewContext.onFilterStateChange(t.build())})),e(i,"removeSort",(function(){var e=p(i.dataViewContext.filterState).removeSort({reason:"sort"});i.dataViewContext.onFilterStateChange(e.build())})),e(i,"toggleSortDirection",(function(){var e=p(i.dataViewContext.filterState).toggleSortDirection({reason:"sort"});i.dataViewContext.onFilterStateChange(e.build())})),e(i,"handleClearAll",(function(){var e=i.dataViewContext.filterBarConfigs.defaultValue||{},t=p(i.dataViewContext.filterState,e).reset();i.dataViewContext.onFilterStateChange(t.build())})),i.state={data:null,isClosing:!1},i}return t(d,c),i(d,[{key:"render",value:function(){var e=this;return C((function(t){if(e.dataViewContext=t,!e.dataViewContext)return n(l,{});var i=e.dataViewContext.filterBarConfigs.defaultValue,r=p(e.dataViewContext.filterState,i).isEmpty();return n(m,{in:!r,timeout:300,unmountOnExit:!0,orientation:"vertical",onExited:e.handleAnimationExited,children:o(V,{className:b.root,children:[o(u,{className:b.content,children:[e.renderSort(),e.renderQuickSearch(),e.renderFilters(),!r&&n(h,{className:b.removeButton,onClick:e.handleClearAll})]}),e.props.loading&&n(u,{className:b.overlay})]})})}))}},{key:"renderQuickSearch",value:function(){var e,t=(null===(e=this.dataViewContext.filterState)||void 0===e?void 0:e.quickSearch)||[],i=(Array.isArray(t)?t:[t]).map((function(e){return{value:e}}));return i&&0!==i.length?this.renderItems({label:"Quick search",items:i,isQuickSearch:!0}):n(l,{})}}])}()}var V=d(u)(e(e(e(e(e({position:"relative"},".".concat(b.content),{display:"flex",alignItems:"center",flexWrap:"wrap",gap:"8px"}),".".concat(b.item),{display:"flex",flexWrap:"wrap",border:"dashed 1px var(--color-divider, rgba(145 160 170 / 20%))",borderRadius:"4px",alignItems:"center",padding:"6px 8px",gap:"8px"}),".".concat(b.itemContent),{display:"flex",flexWrap:"wrap",gap:"4px"}),".".concat(b.itemChip),{borderRadius:"4px"}),".".concat(b.overlay),{position:"absolute",top:0,left:0,width:"100%",height:"100%",backdropFilter:"blur(1px)"}));export{b as activeFiltersPanelClasses,w as default};
|
|
2
2
|
//# sourceMappingURL=create.active-filters-panel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.active-filters-panel.js","sources":["../../src/data-view/create.active-filters-panel.tsx"],"sourcesContent":["import React, { Component, ComponentType, Fragment } from 'react'\r\nimport { Box, Chip, Collapse, styled, Typography } from '@mui/material'\r\nimport { createFilterStore } from './filter-store'\r\nimport { ClearAllButton, mapSortConfigs } from './ui.units'\r\nimport { IDataViewContext, mapDataViewContext } from './context'\r\nimport { IFilterItem, IFilterMap, IFilterState, IItemBase } from './types'\r\nimport { formatDatetime } from '../utils'\r\nimport { mapDateLogicText } from './helpers'\r\n\r\nexport const activeFiltersPanelClasses = {\r\n root: 'ActiveFiltersPanel-root',\r\n content: 'ActiveFiltersPanel-content',\r\n item: 'ActiveFiltersPanel-item',\r\n itemContent: 'ActiveFiltersPanel-itemContent',\r\n itemChip: 'ActiveFiltersPanel-itemChip',\r\n removeButton: 'ActiveFiltersPanel-removeButton',\r\n overlay: 'ActiveFiltersPanel-overlay'\r\n}\r\n\r\ninterface IRenderItemsParams<T> {\r\n field?: keyof T\r\n label?: string\r\n items: IItemBase[]\r\n isQuickSearch?: boolean\r\n}\r\n\r\nexport interface IActiveFiltersPanelProps {\r\n loading?: boolean\r\n}\r\n\r\nexport interface IActiveFiltersPanelState<T> {\r\n data: IFilterState<T> | null\r\n isClosing: boolean\r\n}\r\n\r\nfunction createActiveFiltersPanel<T>(): ComponentType<IActiveFiltersPanelProps> {\r\n class ActiveFiltersPanel extends Component<IActiveFiltersPanelProps, IActiveFiltersPanelState<T>> {\r\n declare dataViewContext: IDataViewContext<T>\r\n\r\n constructor(props: IActiveFiltersPanelProps) {\r\n super(props)\r\n this.state = {\r\n data: null,\r\n isClosing: false\r\n }\r\n }\r\n\r\n // Handle animation completion\r\n private handleAnimationExited = () => {\r\n this.setState({ isClosing: true })\r\n }\r\n\r\n render() {\r\n return mapDataViewContext((context) => {\r\n this.dataViewContext = context\r\n if (!this.dataViewContext) return <></>\r\n const { defaultValue } = this.dataViewContext.filterBarConfigs\r\n const isEmpty = createFilterStore(this.dataViewContext.filterState, defaultValue).isEmpty()\r\n return (\r\n <Collapse in={!isEmpty} timeout={300} unmountOnExit orientation='vertical' onExited={this.handleAnimationExited}>\r\n <Wrap className={activeFiltersPanelClasses.root}>\r\n <Box className={activeFiltersPanelClasses.content}>\r\n {this.renderSort()}\r\n {this.renderQuickSearch()}\r\n {this.renderFilters()}\r\n {!isEmpty && <ClearAllButton className={activeFiltersPanelClasses.removeButton} onClick={this.handleClearAll} />}\r\n </Box>\r\n {this.props.loading && <Box className={activeFiltersPanelClasses.overlay} />}\r\n </Wrap>\r\n </Collapse>\r\n )\r\n })\r\n }\r\n\r\n renderItems = (p: IRenderItemsParams<T>) => (\r\n <Box className={activeFiltersPanelClasses.item}>\r\n <Typography variant='caption' sx={{ fontWeight: 700 }}>\r\n {p.label || p.field?.toString()}:\r\n </Typography>\r\n <Box className={activeFiltersPanelClasses.itemContent}>\r\n {p.items.map((item) => (\r\n <Chip\r\n key={item.value}\r\n clickable\r\n size='small'\r\n label={item.label || item.value}\r\n className={activeFiltersPanelClasses.itemChip}\r\n onDelete={() => {\r\n if (p.isQuickSearch) {\r\n this.removeQuickSearch(item)\r\n return\r\n }\r\n if (!p.field) return\r\n this.removeFilter(p.field, item)\r\n }}\r\n />\r\n ))}\r\n </Box>\r\n </Box>\r\n )\r\n\r\n renderQuickSearch() {\r\n const val = this.dataViewContext.filterState?.quickSearch || []\r\n const list = (Array.isArray(val) ? val : [val]).map((value) => ({ value }))\r\n if (!list || list.length === 0) return <></>\r\n return this.renderItems({ label: 'Quick search', items: list, isQuickSearch: true })\r\n }\r\n\r\n renderFilters = () => {\r\n const filter: IFilterMap<T> = this.dataViewContext.filterState?.filter || {}\r\n const keys = Object.keys(filter) as Array<keyof T>\r\n if (keys.length === 0) return <></>\r\n return keys.map((key) => {\r\n const filterItems = (filter[key] ?? []) as IFilterItem[]\r\n const items = filterItems.reduce<IItemBase[]>((acc, item) => {\r\n let label = item.label || item.value?.toString()\r\n if (item.type === 'date' && item.dateLogic) {\r\n label = `${mapDateLogicText[item.dateLogic]} ${formatDatetime(item.value?.toString() ?? '', 'style2')}`\r\n }\r\n if (!!item.value) acc.push({ value: item.value?.toString(), label })\r\n return acc\r\n }, [])\r\n return <Fragment key={key.toString()}>{this.renderItems({ field: key, label: key.toString(), items })}</Fragment>\r\n })\r\n }\r\n\r\n renderSort = () => {\r\n const sort = this.dataViewContext.filterState?.sort\r\n if (!sort) return <></>\r\n\r\n const fieldConfig = this.dataViewContext.filterBarConfigs.fields?.[sort.field]\r\n const fieldLabel = fieldConfig?.label || sort.field.toString()\r\n const sortConfig = mapSortConfigs[sort.direction]\r\n\r\n return (\r\n <Box className={activeFiltersPanelClasses.item}>\r\n <Typography variant='caption' sx={{ fontWeight: 700 }}>\r\n Sort:\r\n </Typography>\r\n <Box className={activeFiltersPanelClasses.itemContent}>\r\n <Chip\r\n clickable\r\n size='small'\r\n label={\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\r\n <span>{fieldLabel}</span>\r\n {sortConfig.icon}\r\n </Box>\r\n }\r\n className={activeFiltersPanelClasses.itemChip}\r\n onClick={this.toggleSortDirection}\r\n onDelete={() => this.removeSort()}\r\n title={`${fieldLabel} - ${sortConfig.title}`}\r\n />\r\n </Box>\r\n </Box>\r\n )\r\n }\r\n\r\n removeFilter = (field: keyof T, item: IItemBase) => {\r\n const store = createFilterStore(this.dataViewContext.filterState).removeFilterItem(field, item.value, { reason: 'field' })\r\n this.dataViewContext.onFilterStateChange(store.build())\r\n }\r\n\r\n removeQuickSearch = (item: IItemBase) => {\r\n const store = createFilterStore(this.dataViewContext.filterState).removeQuickSearchItem(item.value, { reason: 'quickSearch' })\r\n this.dataViewContext.onFilterStateChange(store.build())\r\n }\r\n\r\n removeSort = () => {\r\n const store = createFilterStore(this.dataViewContext.filterState).removeSort({ reason: 'sort' })\r\n this.dataViewContext.onFilterStateChange(store.build())\r\n }\r\n\r\n toggleSortDirection = () => {\r\n const store = createFilterStore(this.dataViewContext.filterState).toggleSortDirection({ reason: 'sort' })\r\n this.dataViewContext.onFilterStateChange(store.build())\r\n }\r\n\r\n handleClearAll = () => {\r\n const fValue = this.dataViewContext.filterBarConfigs.defaultValue || {}\r\n // Trực tiếp clear data, logic đóng sẽ được xử lý tự động\r\n const store = createFilterStore(this.dataViewContext.filterState, fValue).reset()\r\n this.dataViewContext.onFilterStateChange(store.build())\r\n }\r\n }\r\n\r\n return ActiveFiltersPanel\r\n}\r\n\r\nexport default createActiveFiltersPanel\r\n\r\nconst Wrap = styled(Box)({\r\n position: 'relative',\r\n [`.${activeFiltersPanelClasses.content}`]: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n flexWrap: 'wrap',\r\n gap: '8px'\r\n },\r\n [`.${activeFiltersPanelClasses.item}`]: {\r\n display: 'flex',\r\n border: 'dashed 1px var(--color-divider, rgba(145 160 170 / 20%))',\r\n borderRadius: '4px',\r\n alignItems: 'center',\r\n padding: '6px 8px',\r\n gap: '8px'\r\n },\r\n [`.${activeFiltersPanelClasses.itemContent}`]: {\r\n display: 'flex',\r\n gap: '4px'\r\n },\r\n [`.${activeFiltersPanelClasses.itemChip}`]: {\r\n borderRadius: '4px'\r\n },\r\n [`.${activeFiltersPanelClasses.overlay}`]: {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n width: '100%',\r\n height: '100%',\r\n backdropFilter: 'blur(1px)'\r\n }\r\n})\r\n"],"names":["activeFiltersPanelClasses","root","content","item","itemContent","itemChip","removeButton","overlay","createActiveFiltersPanel","ActiveFiltersPanel","props","_this","_classCallCheck","_callSuper","_defineProperty","setState","isClosing","p","_p$field","_jsxs","Box","className","children","Typography","variant","sx","fontWeight","label","field","toString","_jsx","items","map","Chip","clickable","size","value","onDelete","isQuickSearch","removeQuickSearch","removeFilter","_this$dataViewContext","filter","dataViewContext","filterState","keys","Object","length","key","_filter$key","reduce","acc","_item$value","_item$value3","_item$value$toString","_item$value2","type","dateLogic","concat","mapDateLogicText","formatDatetime","push","Fragment","renderItems","_this$dataViewContext2","_this$dataViewContext3","sort","fieldConfig","filterBarConfigs","fields","fieldLabel","sortConfig","mapSortConfigs","direction","display","alignItems","gap","icon","onClick","toggleSortDirection","removeSort","title","store","createFilterStore","removeFilterItem","reason","onFilterStateChange","build","removeQuickSearchItem","fValue","defaultValue","reset","state","data","_inherits","Component","_createClass","_this2","this","mapDataViewContext","context","isEmpty","Collapse","in","timeout","unmountOnExit","orientation","onExited","handleAnimationExited","Wrap","renderSort","renderQuickSearch","renderFilters","ClearAllButton","handleClearAll","loading","_this$dataViewContext4","val","quickSearch","list","Array","isArray","styled","position","flexWrap","border","borderRadius","padding","top","left","width","height","backdropFilter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"create.active-filters-panel.js","sources":["../../src/data-view/create.active-filters-panel.tsx"],"sourcesContent":["import React, { Component, ComponentType, Fragment } from 'react'\r\nimport { Box, Chip, Collapse, styled, Typography } from '@mui/material'\r\nimport { createFilterStore } from './filter-store'\r\nimport { ClearAllButton, mapSortConfigs } from './ui.units'\r\nimport { IDataViewContext, mapDataViewContext } from './context'\r\nimport { IFilterItem, IFilterMap, IFilterState, IItemBase } from './types'\r\nimport { formatDatetime } from '../utils'\r\nimport { mapDateLogicText } from './helpers'\r\n\r\nexport const activeFiltersPanelClasses = {\r\n root: 'ActiveFiltersPanel-root',\r\n content: 'ActiveFiltersPanel-content',\r\n item: 'ActiveFiltersPanel-item',\r\n itemContent: 'ActiveFiltersPanel-itemContent',\r\n itemChip: 'ActiveFiltersPanel-itemChip',\r\n removeButton: 'ActiveFiltersPanel-removeButton',\r\n overlay: 'ActiveFiltersPanel-overlay'\r\n}\r\n\r\ninterface IRenderItemsParams<T> {\r\n field?: keyof T\r\n label?: string\r\n items: IItemBase[]\r\n isQuickSearch?: boolean\r\n}\r\n\r\nexport interface IActiveFiltersPanelProps {\r\n loading?: boolean\r\n}\r\n\r\nexport interface IActiveFiltersPanelState<T> {\r\n data: IFilterState<T> | null\r\n isClosing: boolean\r\n}\r\n\r\nfunction createActiveFiltersPanel<T>(): ComponentType<IActiveFiltersPanelProps> {\r\n class ActiveFiltersPanel extends Component<IActiveFiltersPanelProps, IActiveFiltersPanelState<T>> {\r\n declare dataViewContext: IDataViewContext<T>\r\n\r\n constructor(props: IActiveFiltersPanelProps) {\r\n super(props)\r\n this.state = {\r\n data: null,\r\n isClosing: false\r\n }\r\n }\r\n\r\n // Handle animation completion\r\n private handleAnimationExited = () => {\r\n this.setState({ isClosing: true })\r\n }\r\n\r\n render() {\r\n return mapDataViewContext((context) => {\r\n this.dataViewContext = context\r\n if (!this.dataViewContext) return <></>\r\n const { defaultValue } = this.dataViewContext.filterBarConfigs\r\n const isEmpty = createFilterStore(this.dataViewContext.filterState, defaultValue).isEmpty()\r\n return (\r\n <Collapse in={!isEmpty} timeout={300} unmountOnExit orientation='vertical' onExited={this.handleAnimationExited}>\r\n <Wrap className={activeFiltersPanelClasses.root}>\r\n <Box className={activeFiltersPanelClasses.content}>\r\n {this.renderSort()}\r\n {this.renderQuickSearch()}\r\n {this.renderFilters()}\r\n {!isEmpty && <ClearAllButton className={activeFiltersPanelClasses.removeButton} onClick={this.handleClearAll} />}\r\n </Box>\r\n {this.props.loading && <Box className={activeFiltersPanelClasses.overlay} />}\r\n </Wrap>\r\n </Collapse>\r\n )\r\n })\r\n }\r\n\r\n renderItems = (p: IRenderItemsParams<T>) => (\r\n <Box className={activeFiltersPanelClasses.item}>\r\n <Typography variant='caption' sx={{ fontWeight: 700 }}>\r\n {p.label || p.field?.toString()}:\r\n </Typography>\r\n {/* <Box className={activeFiltersPanelClasses.itemContent}> */}\r\n {p.items.map((item) => (\r\n <Chip\r\n key={item.value}\r\n clickable\r\n size='small'\r\n label={item.label || item.value}\r\n className={activeFiltersPanelClasses.itemChip}\r\n onDelete={() => {\r\n if (p.isQuickSearch) {\r\n this.removeQuickSearch(item)\r\n return\r\n }\r\n if (!p.field) return\r\n this.removeFilter(p.field, item)\r\n }}\r\n />\r\n ))}\r\n {/* </Box> */}\r\n </Box>\r\n )\r\n\r\n renderQuickSearch() {\r\n const val = this.dataViewContext.filterState?.quickSearch || []\r\n const list = (Array.isArray(val) ? val : [val]).map((value) => ({ value }))\r\n if (!list || list.length === 0) return <></>\r\n return this.renderItems({ label: 'Quick search', items: list, isQuickSearch: true })\r\n }\r\n\r\n renderFilters = () => {\r\n const filter: IFilterMap<T> = this.dataViewContext.filterState?.filter || {}\r\n const keys = Object.keys(filter) as Array<keyof T>\r\n if (keys.length === 0) return <></>\r\n return keys.map((key) => {\r\n const filterItems = (filter[key] ?? []) as IFilterItem[]\r\n const items = filterItems.reduce<IItemBase[]>((acc, item) => {\r\n let label = item.label || item.value?.toString()\r\n if (item.type === 'date' && item.dateLogic) {\r\n label = `${mapDateLogicText[item.dateLogic]} ${formatDatetime(item.value?.toString() ?? '', 'style2')}`\r\n }\r\n if (!!item.value) acc.push({ value: item.value?.toString(), label })\r\n return acc\r\n }, [])\r\n return <Fragment key={key.toString()}>{this.renderItems({ field: key, label: key.toString(), items })}</Fragment>\r\n })\r\n }\r\n\r\n renderSort = () => {\r\n const sort = this.dataViewContext.filterState?.sort\r\n if (!sort) return <></>\r\n\r\n const fieldConfig = this.dataViewContext.filterBarConfigs.fields?.[sort.field]\r\n const fieldLabel = fieldConfig?.label || sort.field.toString()\r\n const sortConfig = mapSortConfigs[sort.direction]\r\n\r\n return (\r\n <Box className={activeFiltersPanelClasses.item}>\r\n <Typography variant='caption' sx={{ fontWeight: 700 }}>\r\n Sort:\r\n </Typography>\r\n {/* <Box className={activeFiltersPanelClasses.itemContent}> */}\r\n <Chip\r\n clickable\r\n size='small'\r\n label={\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\r\n <span>{fieldLabel}</span>\r\n {sortConfig.icon}\r\n </Box>\r\n }\r\n className={activeFiltersPanelClasses.itemChip}\r\n onClick={this.toggleSortDirection}\r\n onDelete={() => this.removeSort()}\r\n title={`${fieldLabel} - ${sortConfig.title}`}\r\n />\r\n {/* </Box> */}\r\n </Box>\r\n )\r\n }\r\n\r\n removeFilter = (field: keyof T, item: IItemBase) => {\r\n const store = createFilterStore(this.dataViewContext.filterState).removeFilterItem(field, item.value, { reason: 'filter' })\r\n this.dataViewContext.onFilterStateChange(store.build())\r\n }\r\n\r\n removeQuickSearch = (item: IItemBase) => {\r\n const store = createFilterStore(this.dataViewContext.filterState).removeQuickSearchItem(item.value, { reason: 'quickSearch' })\r\n this.dataViewContext.onFilterStateChange(store.build())\r\n }\r\n\r\n removeSort = () => {\r\n const store = createFilterStore(this.dataViewContext.filterState).removeSort({ reason: 'sort' })\r\n this.dataViewContext.onFilterStateChange(store.build())\r\n }\r\n\r\n toggleSortDirection = () => {\r\n const store = createFilterStore(this.dataViewContext.filterState).toggleSortDirection({ reason: 'sort' })\r\n this.dataViewContext.onFilterStateChange(store.build())\r\n }\r\n\r\n handleClearAll = () => {\r\n const fValue = this.dataViewContext.filterBarConfigs.defaultValue || {}\r\n // Trực tiếp clear data, logic đóng sẽ được xử lý tự động\r\n const store = createFilterStore(this.dataViewContext.filterState, fValue).reset()\r\n this.dataViewContext.onFilterStateChange(store.build())\r\n }\r\n }\r\n\r\n return ActiveFiltersPanel\r\n}\r\n\r\nexport default createActiveFiltersPanel\r\n\r\nconst Wrap = styled(Box)({\r\n position: 'relative',\r\n [`.${activeFiltersPanelClasses.content}`]: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n flexWrap: 'wrap',\r\n gap: '8px'\r\n },\r\n [`.${activeFiltersPanelClasses.item}`]: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n border: 'dashed 1px var(--color-divider, rgba(145 160 170 / 20%))',\r\n borderRadius: '4px',\r\n alignItems: 'center',\r\n padding: '6px 8px',\r\n gap: '8px'\r\n },\r\n [`.${activeFiltersPanelClasses.itemContent}`]: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n gap: '4px'\r\n },\r\n [`.${activeFiltersPanelClasses.itemChip}`]: {\r\n borderRadius: '4px'\r\n },\r\n [`.${activeFiltersPanelClasses.overlay}`]: {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n width: '100%',\r\n height: '100%',\r\n backdropFilter: 'blur(1px)'\r\n }\r\n})\r\n"],"names":["activeFiltersPanelClasses","root","content","item","itemContent","itemChip","removeButton","overlay","createActiveFiltersPanel","ActiveFiltersPanel","props","_this","_classCallCheck","_callSuper","_defineProperty","setState","isClosing","p","_p$field","_jsxs","Box","className","children","Typography","variant","sx","fontWeight","label","field","toString","items","map","_jsx","Chip","clickable","size","value","onDelete","isQuickSearch","removeQuickSearch","removeFilter","_this$dataViewContext","filter","dataViewContext","filterState","keys","Object","length","key","_filter$key","reduce","acc","_item$value","_item$value3","_item$value$toString","_item$value2","type","dateLogic","concat","mapDateLogicText","formatDatetime","push","Fragment","renderItems","_this$dataViewContext2","_this$dataViewContext3","sort","fieldConfig","filterBarConfigs","fields","fieldLabel","sortConfig","mapSortConfigs","direction","display","alignItems","gap","icon","onClick","toggleSortDirection","removeSort","title","store","createFilterStore","removeFilterItem","reason","onFilterStateChange","build","removeQuickSearchItem","fValue","defaultValue","reset","state","data","_inherits","Component","_createClass","_this2","this","mapDataViewContext","context","isEmpty","Collapse","in","timeout","unmountOnExit","orientation","onExited","handleAnimationExited","Wrap","renderSort","renderQuickSearch","renderFilters","ClearAllButton","handleClearAll","loading","_this$dataViewContext4","val","quickSearch","list","Array","isArray","styled","position","flexWrap","border","borderRadius","padding","top","left","width","height","backdropFilter"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{inherits as e,createClass as
|
|
1
|
+
import{inherits as e,createClass as i,objectSpread2 as t,classCallCheck as o,callSuper as n,defineProperty as l}from"../_virtual/_rollupPluginBabelHelpers.js";import{jsxs as r,jsx as a,Fragment as s}from"react/jsx-runtime";import{Component as d}from"react";import{styled as u,Box as v,Stack as f}from"@mui/material";import{SortButton as p}from"./ui.units.js";import{createViewMode as g}from"./create.view-mode.js";import{defaultViewMode as h,ViewModeButtons as c}from"./view-mode.units.js";import{getViewModeFromURL as C,syncViewModeToURL as m}from"./query-param-url.js";import{defaultFilterBarState as w,DataViewContext as S}from"./context.js";import{createFilterBar as y}from"./create.filter-bar.js";import M from"./scroll-tracking.js";import{createPaginationBar as B}from"./create.pagination-bar.js";import{createPopperPanel as P}from"./create.popper-panel.js";import b from"./create.active-filters-panel.js";function H(u){var H=y(),F=P(),V=b(),k=g(u.viewMode),I=B();return function(){function g(e){var i;return o(this,g),i=n(this,g,[e]),l(i,"mergeConfig",(function(e){var t,o,n,l,r=e.slots;i.configCache={filterBar:Object.assign({},u.filterBar,null==r?void 0:r.filterBarConfigs),viewMode:null==r?void 0:r.viewModeConfigs,paginationBar:Object.assign({},u.paginationBar,null==r?void 0:r.paginationBarConfigs),enablePaginationTop:null!==(t=null!==(o=null==r||null===(n=r.paginationBarConfigs)||void 0===n?void 0:n.enablePaginationTop)&&void 0!==o?o:null===(l=u.paginationBar)||void 0===l?void 0:l.enablePaginationTop)&&void 0!==t&&t}})),l(i,"configCache",{}),l(i,"refFilterButton",null),l(i,"refSortButton",null),l(i,"renderFooter",(function(){var e,o,n,l,r=(null===(e=i.props.slots)||void 0===e?void 0:e.footerProps)||{};return a(x,t(t({},r.wrapProps),{},{children:!1!==r.enablePagination&&a(I,t({count:null!==(o=null===(n=i.props.data)||void 0===n?void 0:n.totalItems)&&void 0!==o?o:0,defaultFilter:null===(l=i.internalConfig.filterBar)||void 0===l?void 0:l.defaultValue,filter:i.filterState,onChange:i.onFilterStateChangeHandler},i.internalConfig.paginationBar))}))})),l(i,"onViewModeChangeHandler",(function(e){i.setState({viewMode:e},(function(){var t,o;if(i.props.syncViewModeToURL){var n,l,r,a,s=null!==(n=null!==(l=null===(r=i.internalConfig.viewMode)||void 0===r?void 0:r.defaultValue)&&void 0!==l?l:null===(a=u.viewMode)||void 0===a?void 0:a.defaultValue)&&void 0!==n?n:h;m({viewMode:e,defaultViewMode:s})}null===(t=(o=i.props).onViewModeChange)||void 0===t||t.call(o,e)}))})),l(i,"onKeywordChangeHandler",(function(e){return i.setState({keyword:e})})),l(i,"onScrollChangeHandler",(function(e){return i.setState({scrolled:e.isScrolled})})),l(i,"onPopperPanelChangeHandler",(function(e,t){return i.setState({anchorEl:e,area:t})})),l(i,"onClearHandler",(function(){return i.setState(w)})),l(i,"onPanelCloseHandler",(function(){i.setState({anchorEl:null,area:void 0,keyword:""})})),l(i,"onFilterStateChangeHandler",(function(e){i.props.filter||i.setState(t(t({},w),{},{filterState:e})),i.props.onFilterChange&&i.props.onFilterChange(e),i.props.filter&&i.setState(w)})),i.mergeConfig(e),i.state=i.getDefaultState(e),i}return e(g,d),i(g,[{key:"getDefaultState",value:function(e){var i,o,n,l,r,a,s=null!==(i=null!==(o=null===(n=e.slots)||void 0===n||null===(n=n.viewModeConfigs)||void 0===n?void 0:n.defaultValue)&&void 0!==o?o:null===(l=u.viewMode)||void 0===l?void 0:l.defaultValue)&&void 0!==i?i:h,d=e.syncViewModeToURL?C({defaultViewMode:s}):s;return t(t({},w),{},{filterState:null!==(r=null===(a=this.internalConfig.filterBar)||void 0===a?void 0:a.defaultValue)&&void 0!==r?r:{},viewMode:d})}},{key:"filterState",get:function(){var e;return null!==(e=this.props.filter)&&void 0!==e?e:this.state.filterState}},{key:"viewMode",get:function(){var e;return null!==(e=this.props.viewMode)&&void 0!==e?e:this.state.viewMode}},{key:"internalConfig",get:function(){return this.configCache}},{key:"shouldComponentUpdate",value:function(e){var i,t,o,n,l=JSON.stringify(null===(i=e.slots)||void 0===i?void 0:i.filterBarConfigs)!==JSON.stringify(null===(t=this.props.slots)||void 0===t?void 0:t.filterBarConfigs),r=JSON.stringify(null===(o=e.slots)||void 0===o?void 0:o.viewModeConfigs)!==JSON.stringify(null===(n=this.props.slots)||void 0===n?void 0:n.viewModeConfigs);return(l||r)&&this.mergeConfig(e),!0}},{key:"render",value:function(){var e,i,o,n,l,d,u,g,h,C,m,w,y,B,P,b,x={keyword:this.state.keyword.trim(),filterBarConfigs:null!==(e=this.internalConfig.filterBar)&&void 0!==e?e:{},filterState:this.filterState,anchorEl:this.state.anchorEl,area:this.state.area,viewMode:this.state.viewMode,scrolled:this.state.scrolled,onFilterStateChange:this.onFilterStateChangeHandler,onKeywordChange:this.onKeywordChangeHandler,onPopperPanelChange:this.onPopperPanelChangeHandler,onPanelClose:this.onPanelCloseHandler,onClear:this.onClearHandler};return r(S.Provider,{value:x,children:[(null===(i=this.internalConfig.filterBar)||void 0===i?void 0:i.enableSticky)&&a(M,{onChange:this.onScrollChangeHandler}),null===(o=this.props.slots)||void 0===o||null===(o=o.filterSlots)||void 0===o?void 0:o.above,a(H,{slots:t(t({},null===(n=this.props.slots)||void 0===n?void 0:n.primaryInputSlots),{},{right:r(s,{children:[(null===(l=this.internalConfig.filterBar)||void 0===l?void 0:l.enableSort)&&a(p,{}),null===(d=this.props.slots)||void 0===d||null===(d=d.primaryInputSlots)||void 0===d?void 0:d.right]})}),children:a(F,{})}),null===(u=this.props.slots)||void 0===u||null===(u=u.filterSlots)||void 0===u?void 0:u.below,null===(g=this.props.slots)||void 0===g||null===(g=g.activeFiltersPanelSlots)||void 0===g?void 0:g.above,r(j,{children:[a(c,{value:this.state.viewMode,onChange:this.onViewModeChangeHandler}),null===(h=this.props.slots)||void 0===h||null===(h=h.activeFiltersPanelSlots)||void 0===h?void 0:h.left,r(f,{flexDirection:"row",sx:{flexWrap:"wrap",alignItems:"center",gap:1,flexGrow:1},children:[a(V,{loading:this.props.loading}),a(v,{sx:{display:"flex",alignItems:"center",gap:1,flexGrow:1,justifyContent:"end"},children:this.internalConfig.enablePaginationTop&&a(I,t({count:null!==(C=null===(m=this.props.data)||void 0===m?void 0:m.totalItems)&&void 0!==C?C:0,defaultFilter:null===(w=this.internalConfig.filterBar)||void 0===w?void 0:w.defaultValue,filter:this.filterState,onChange:this.onFilterStateChangeHandler},this.internalConfig.paginationBar))})]}),null===(y=this.props.slots)||void 0===y||null===(y=y.activeFiltersPanelSlots)||void 0===y?void 0:y.right]}),null===(B=this.props.slots)||void 0===B||null===(B=B.activeFiltersPanelSlots)||void 0===B?void 0:B.below,a(k,{data:null!==(P=null===(b=this.props.data)||void 0===b?void 0:b.items)&&void 0!==P?P:[],viewMode:this.viewMode,loading:this.props.loading,error:this.props.error,slots:this.internalConfig.viewMode}),this.renderFooter()]})}}])}()}var j=u(v)({display:"flex",alignItems:"center",flexWrap:"wrap",gap:"8px",marginBottom:"8px",minHeight:"var(--filter-bar-height, 40px)"}),x=u(v)({display:"flex",justifyContent:"flex-end",width:"100%"});export{H as default};
|
|
2
2
|
//# sourceMappingURL=create.data-view.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.data-view.js","sources":["../../src/data-view/create.data-view.tsx"],"sourcesContent":["import React, { Component, ComponentType } from 'react'\r\nimport { Box, BoxProps, styled } from '@mui/material'\r\nimport { SortButton } from './ui.units'\r\nimport { createViewMode } from './create.view-mode'\r\nimport { defaultViewMode, ViewModeButtons } from './view-mode.units'\r\nimport { getViewModeFromURL, syncViewModeToURL } from './query-param-url'\r\nimport { EViewMode, IViewModeConfigs, IViewModeValidModel } from './view-mode.types'\r\nimport { IFilterBarConfigs, IFilterState, IFilterStateChangeHandler, IPositionElement, IViewData } from './types'\r\nimport { defaultFilterBarState, DataViewContext, IDataViewState, IDataViewContext, OnPanelValueChange } from './context'\r\nimport createFilterBar, { IFilterBarSlots } from './create.filter-bar'\r\nimport ScrollTracking, { IScrollTrackingData } from './scroll-tracking'\r\nimport createPaginationBar, { IPaginationBarConfigs } from './create.pagination-bar'\r\nimport createPopperPanel from './create.popper-panel'\r\nimport createActiveFiltersPanel from './create.active-filters-panel'\r\n\r\nexport const filterBarClasses = {\r\n root: 'FilterBar-root',\r\n content: 'FilterBar-content',\r\n input: 'FilterBar-input',\r\n inputWrap: 'FilterBar-inputWrap',\r\n label: 'FilterBar-label',\r\n button: 'FilterBar-button',\r\n spacing: 'FilterBar-spacing',\r\n panel: 'FilterBar-panel',\r\n sticky: 'FilterBar-sticky',\r\n shadow: 'FilterBar-shadow'\r\n}\r\n\r\nexport interface IDataViewSlots<T extends IViewModeValidModel> {\r\n filterWrapProps?: BoxProps\r\n filterSlots?: IPositionElement\r\n activeFiltersPanelSlots?: IPositionElement\r\n primaryInputSlots?: IFilterBarSlots\r\n filterBarConfigs?: IFilterBarConfigs<T>\r\n viewModeConfigs?: IViewModeConfigs<T>\r\n paginationBarConfigs?: IPaginationBarConfigs\r\n footerProps?: {\r\n wrapProps?: BoxProps\r\n enablePagination?: boolean\r\n }\r\n}\r\n\r\nexport interface IDataViewProps<T extends IViewModeValidModel> {\r\n loading?: boolean\r\n error?: string\r\n data?: IViewData<T>\r\n filter?: IFilterState<T>\r\n onFilterChange?: (value: IFilterState<T>) => void\r\n viewMode?: EViewMode\r\n onViewModeChange?: (value: EViewMode) => void\r\n syncViewModeToURL?: boolean\r\n enablePaginationTop?: boolean\r\n slots?: IDataViewSlots<T>\r\n}\r\n\r\nexport interface IDataViewConfigs<T extends IViewModeValidModel> {\r\n filterBar?: IFilterBarConfigs<T>\r\n viewMode?: IViewModeConfigs<T>\r\n paginationBar?: IPaginationBarConfigs\r\n}\r\n\r\nfunction createDataView<T extends IViewModeValidModel>(configs: IDataViewConfigs<T>): ComponentType<IDataViewProps<T>> {\r\n const InputInstance = createFilterBar<T>()\r\n const PopperPanelInstance = createPopperPanel<T>()\r\n const ActiveFiltersPanelInstance = createActiveFiltersPanel<T>()\r\n const ViewModeInstance = createViewMode<T>(configs.viewMode)\r\n const PaginationBarInstance = createPaginationBar<T>()\r\n\r\n class DataView extends Component<IDataViewProps<T>, IDataViewState<T>> {\r\n constructor(props: IDataViewProps<T>) {\r\n super(props)\r\n this.mergeConfig(props)\r\n this.state = this.getDefaultState(props)\r\n }\r\n\r\n private getDefaultState(currentProps: IDataViewProps<T>): IDataViewState<T> {\r\n const defaultValue = currentProps.slots?.viewModeConfigs?.defaultValue ?? configs.viewMode?.defaultValue ?? defaultViewMode\r\n const viewMode = currentProps.syncViewModeToURL ? getViewModeFromURL<T>({ defaultViewMode: defaultValue }) : defaultValue\r\n return {\r\n ...defaultFilterBarState,\r\n filterState: this.internalConfig.filterBar?.defaultValue ?? {},\r\n viewMode\r\n }\r\n }\r\n\r\n get filterState(): IFilterState<T> {\r\n return this.props.filter ?? this.state.filterState\r\n }\r\n\r\n get viewMode(): EViewMode | undefined {\r\n return this.props.viewMode ?? this.state.viewMode\r\n }\r\n\r\n private mergeConfig = (currentProps: IDataViewProps<T>) => {\r\n this.configCache = {\r\n filterBar: Object.assign({}, configs.filterBar, currentProps.slots?.filterBarConfigs),\r\n viewMode: currentProps.slots?.viewModeConfigs,\r\n paginationBar: Object.assign({}, configs.paginationBar, currentProps.slots?.paginationBarConfigs)\r\n }\r\n }\r\n\r\n private configCache: IDataViewConfigs<T> = {}\r\n get internalConfig() {\r\n return this.configCache\r\n }\r\n\r\n shouldComponentUpdate(nextProps: Readonly<IDataViewProps<T>>): boolean {\r\n const filterDiff = JSON.stringify(nextProps.slots?.filterBarConfigs) !== JSON.stringify(this.props.slots?.filterBarConfigs)\r\n const viewModeDiff = JSON.stringify(nextProps.slots?.viewModeConfigs) !== JSON.stringify(this.props.slots?.viewModeConfigs)\r\n if (filterDiff || viewModeDiff) this.mergeConfig(nextProps)\r\n return true\r\n }\r\n\r\n refFilterButton: HTMLButtonElement | null = null\r\n refSortButton: HTMLButtonElement | null = null\r\n render() {\r\n const mapContext: IDataViewContext<T> = {\r\n keyword: this.state.keyword.trim(),\r\n filterBarConfigs: this.internalConfig.filterBar ?? {},\r\n filterState: this.filterState,\r\n anchorEl: this.state.anchorEl,\r\n area: this.state.area,\r\n viewMode: this.state.viewMode,\r\n scrolled: this.state.scrolled,\r\n onFilterStateChange: this.onFilterStateChangeHandler,\r\n onKeywordChange: this.onKeywordChangeHandler,\r\n onPopperPanelChange: this.onPopperPanelChangeHandler,\r\n onPanelClose: this.onPanelCloseHandler,\r\n onClear: this.onClearHandler\r\n }\r\n return (\r\n <DataViewContext.Provider value={mapContext}>\r\n {this.internalConfig.filterBar?.enableSticky && <ScrollTracking onChange={this.onScrollChangeHandler} />}\r\n {this.props.slots?.filterSlots?.above}\r\n <InputInstance\r\n slots={{\r\n ...this.props.slots?.primaryInputSlots,\r\n right: (\r\n <>\r\n {this.internalConfig.filterBar?.enableSort && <SortButton />}\r\n {this.props.slots?.primaryInputSlots?.right}\r\n </>\r\n )\r\n }}\r\n >\r\n <PopperPanelInstance />\r\n </InputInstance>\r\n {this.props.slots?.filterSlots?.below}\r\n {this.props.slots?.activeFiltersPanelSlots?.above}\r\n <FilterBarPanel>\r\n <ViewModeButtons value={this.state.viewMode} onChange={this.onViewModeChangeHandler} />\r\n {this.props.slots?.activeFiltersPanelSlots?.left}\r\n <ActiveFiltersPanelInstance loading={this.props.loading} />\r\n <Box sx={{ flex: 1 }} />\r\n {this.props.enablePaginationTop && (\r\n <PaginationBarInstance\r\n count={this.props.data?.totalItems ?? 0}\r\n defaultFilter={this.internalConfig.filterBar?.defaultValue}\r\n filter={this.filterState}\r\n onChange={this.onFilterStateChangeHandler}\r\n {...this.internalConfig.paginationBar}\r\n />\r\n )}\r\n {this.props.slots?.activeFiltersPanelSlots?.right}\r\n </FilterBarPanel>\r\n {this.props.slots?.activeFiltersPanelSlots?.below}\r\n <ViewModeInstance\r\n data={this.props.data?.items ?? []}\r\n viewMode={this.viewMode}\r\n loading={this.props.loading}\r\n error={this.props.error}\r\n slots={this.internalConfig.viewMode}\r\n />\r\n {this.renderFooter()}\r\n </DataViewContext.Provider>\r\n )\r\n }\r\n\r\n renderFooter = () => {\r\n const temp = this.props.slots?.footerProps || {}\r\n return (\r\n <FooterWrap {...temp.wrapProps}>\r\n {temp.enablePagination !== false && (\r\n <PaginationBarInstance\r\n count={this.props.data?.totalItems ?? 0}\r\n defaultFilter={this.internalConfig.filterBar?.defaultValue}\r\n filter={this.filterState}\r\n onChange={this.onFilterStateChangeHandler}\r\n {...this.internalConfig.paginationBar}\r\n />\r\n )}\r\n </FooterWrap>\r\n )\r\n }\r\n\r\n onViewModeChangeHandler = (value: EViewMode) => {\r\n this.setState({ viewMode: value }, () => {\r\n if (this.props.syncViewModeToURL) {\r\n const dViewMode = this.internalConfig.viewMode?.defaultValue ?? configs.viewMode?.defaultValue ?? defaultViewMode\r\n syncViewModeToURL({ viewMode: value, defaultViewMode: dViewMode })\r\n }\r\n this.props.onViewModeChange?.(value)\r\n })\r\n }\r\n\r\n onKeywordChangeHandler = (keyword: string) => this.setState({ keyword })\r\n\r\n onScrollChangeHandler = (data: IScrollTrackingData) => this.setState({ scrolled: data.isScrolled })\r\n\r\n onPopperPanelChangeHandler: OnPanelValueChange = (anchorEl, area) => this.setState({ anchorEl, area })\r\n\r\n onClearHandler = () => this.setState(defaultFilterBarState)\r\n\r\n onPanelCloseHandler = () => {\r\n this.setState({ anchorEl: null, area: undefined, keyword: '' })\r\n }\r\n\r\n onFilterStateChangeHandler: IFilterStateChangeHandler<T> = (filterState: IFilterState<T>) => {\r\n if (!this.props.filter) this.setState({ ...defaultFilterBarState, filterState })\r\n this.props.onFilterChange && this.props.onFilterChange(filterState)\r\n if (!!this.props.filter) this.setState(defaultFilterBarState)\r\n }\r\n }\r\n\r\n return DataView\r\n}\r\n\r\nexport default createDataView\r\n\r\nconst FilterBarPanel = styled(Box)({\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n marginBottom: '8px',\r\n minHeight: 'var(--filter-bar-height, 40px)'\r\n})\r\n\r\nconst FooterWrap = styled(Box)({\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n width: '100%'\r\n})\r\n"],"names":["createDataView","configs","InputInstance","createFilterBar","PopperPanelInstance","createPopperPanel","ActiveFiltersPanelInstance","createActiveFiltersPanel","ViewModeInstance","createViewMode","viewMode","PaginationBarInstance","createPaginationBar","DataView","props","_this","_classCallCheck","_callSuper","_defineProperty","currentProps","_currentProps$slots","_currentProps$slots2","_currentProps$slots3","configCache","filterBar","Object","assign","slots","filterBarConfigs","viewModeConfigs","paginationBar","paginationBarConfigs","_this$props$slots","_this$props$data$tota","_this$props$data","_this$internalConfig$","temp","footerProps","_jsx","FooterWrap","_objectSpread","wrapProps","children","enablePagination","count","data","totalItems","defaultFilter","internalConfig","defaultValue","filter","filterState","onChange","onFilterStateChangeHandler","value","setState","_this$props$onViewMod","_this$props","syncViewModeToURL","_ref","_this$internalConfig$2","_this$internalConfig$3","_configs$viewMode","dViewMode","defaultViewMode","onViewModeChange","call","keyword","scrolled","isScrolled","anchorEl","area","defaultFilterBarState","undefined","onFilterChange","mergeConfig","state","getDefaultState","_inherits","Component","_createClass","key","_ref2","_currentProps$slots$v","_currentProps$slots4","_configs$viewMode2","_this$internalConfig$4","_this$internalConfig$5","getViewModeFromURL","this","get","_this$props$filter","_this$props$viewMode","nextProps","_nextProps$slots","_this$props$slots2","_nextProps$slots2","_this$props$slots3","filterDiff","JSON","stringify","viewModeDiff","_this$internalConfig$6","_this$internalConfig$7","_this$props$slots4","_this$props$slots5","_this$internalConfig$8","_this$props$slots6","_this$props$slots7","_this$props$slots8","_this$props$slots9","_this$props$data$tota2","_this$props$data2","_this$internalConfig$9","_this$props$slots0","_this$props$slots1","_this$props$data$item","_this$props$data3","mapContext","trim","onFilterStateChange","onKeywordChange","onKeywordChangeHandler","onPopperPanelChange","onPopperPanelChangeHandler","onPanelClose","onPanelCloseHandler","onClear","onClearHandler","_jsxs","DataViewContext","Provider","enableSticky","ScrollTracking","onScrollChangeHandler","filterSlots","above","primaryInputSlots","right","_Fragment","enableSort","SortButton","below","activeFiltersPanelSlots","FilterBarPanel","ViewModeButtons","onViewModeChangeHandler","left","loading","Box","sx","flex","enablePaginationTop","items","error","renderFooter","styled","display","alignItems","gap","marginBottom","minHeight","justifyContent","width"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"create.data-view.js","sources":["../../src/data-view/create.data-view.tsx"],"sourcesContent":["import React, { Component, ComponentType } from 'react'\r\nimport { Box, BoxProps, Stack, styled } from '@mui/material'\r\nimport { SortButton } from './ui.units'\r\nimport { createViewMode } from './create.view-mode'\r\nimport { defaultViewMode, ViewModeButtons } from './view-mode.units'\r\nimport { getViewModeFromURL, syncViewModeToURL } from './query-param-url'\r\nimport { EViewMode, IViewModeConfigs, IViewModeValidModel } from './view-mode.types'\r\nimport { IFilterBarConfigs, IFilterState, IFilterStateChangeHandler, IPositionElement, IViewData } from './types'\r\nimport { defaultFilterBarState, DataViewContext, IDataViewState, IDataViewContext, OnPanelValueChange } from './context'\r\nimport createFilterBar, { IFilterBarSlots } from './create.filter-bar'\r\nimport ScrollTracking, { IScrollTrackingData } from './scroll-tracking'\r\nimport createPaginationBar, { IPaginationBarConfigs } from './create.pagination-bar'\r\nimport createPopperPanel from './create.popper-panel'\r\nimport createActiveFiltersPanel from './create.active-filters-panel'\r\n\r\nexport const filterBarClasses = {\r\n root: 'FilterBar-root',\r\n content: 'FilterBar-content',\r\n input: 'FilterBar-input',\r\n inputWrap: 'FilterBar-inputWrap',\r\n label: 'FilterBar-label',\r\n button: 'FilterBar-button',\r\n spacing: 'FilterBar-spacing',\r\n panel: 'FilterBar-panel',\r\n sticky: 'FilterBar-sticky',\r\n shadow: 'FilterBar-shadow'\r\n}\r\n\r\nexport interface IDataViewSlots<T extends IViewModeValidModel> {\r\n filterWrapProps?: BoxProps\r\n filterSlots?: IPositionElement\r\n activeFiltersPanelSlots?: IPositionElement\r\n primaryInputSlots?: IFilterBarSlots\r\n filterBarConfigs?: IFilterBarConfigs<T>\r\n viewModeConfigs?: IViewModeConfigs<T>\r\n paginationBarConfigs?: IPaginationBarConfigs\r\n footerProps?: {\r\n wrapProps?: BoxProps\r\n enablePagination?: boolean\r\n }\r\n}\r\n\r\nexport interface IDataViewProps<T extends IViewModeValidModel> {\r\n loading?: boolean\r\n error?: string\r\n data?: IViewData<T>\r\n filter?: IFilterState<T>\r\n onFilterChange?: (value: IFilterState<T>) => void\r\n viewMode?: EViewMode\r\n onViewModeChange?: (value: EViewMode) => void\r\n syncViewModeToURL?: boolean\r\n slots?: IDataViewSlots<T>\r\n}\r\n\r\nexport interface IDataViewConfigs<T extends IViewModeValidModel> {\r\n filterBar?: IFilterBarConfigs<T>\r\n viewMode?: IViewModeConfigs<T>\r\n paginationBar?: IPaginationBarConfigs\r\n}\r\n\r\ninterface IInternalConfigs<T extends IViewModeValidModel> extends IDataViewConfigs<T> {\r\n enablePaginationTop?: boolean\r\n}\r\n\r\nfunction createDataView<T extends IViewModeValidModel>(configs: IDataViewConfigs<T>): ComponentType<IDataViewProps<T>> {\r\n const InputInstance = createFilterBar<T>()\r\n const PopperPanelInstance = createPopperPanel<T>()\r\n const ActiveFiltersPanelInstance = createActiveFiltersPanel<T>()\r\n const ViewModeInstance = createViewMode<T>(configs.viewMode)\r\n const PaginationBarInstance = createPaginationBar<T>()\r\n\r\n class DataView extends Component<IDataViewProps<T>, IDataViewState<T>> {\r\n constructor(props: IDataViewProps<T>) {\r\n super(props)\r\n this.mergeConfig(props)\r\n this.state = this.getDefaultState(props)\r\n }\r\n\r\n private getDefaultState(currentProps: IDataViewProps<T>): IDataViewState<T> {\r\n const defaultValue = currentProps.slots?.viewModeConfigs?.defaultValue ?? configs.viewMode?.defaultValue ?? defaultViewMode\r\n const viewMode = currentProps.syncViewModeToURL ? getViewModeFromURL<T>({ defaultViewMode: defaultValue }) : defaultValue\r\n return {\r\n ...defaultFilterBarState,\r\n filterState: this.internalConfig.filterBar?.defaultValue ?? {},\r\n viewMode\r\n }\r\n }\r\n\r\n get filterState(): IFilterState<T> {\r\n return this.props.filter ?? this.state.filterState\r\n }\r\n\r\n get viewMode(): EViewMode | undefined {\r\n return this.props.viewMode ?? this.state.viewMode\r\n }\r\n\r\n private mergeConfig = (currentProps: IDataViewProps<T>) => {\r\n const { slots } = currentProps\r\n this.configCache = {\r\n filterBar: Object.assign({}, configs.filterBar, slots?.filterBarConfigs),\r\n viewMode: slots?.viewModeConfigs,\r\n paginationBar: Object.assign({}, configs.paginationBar, slots?.paginationBarConfigs),\r\n enablePaginationTop: slots?.paginationBarConfigs?.enablePaginationTop ?? configs.paginationBar?.enablePaginationTop ?? false\r\n }\r\n }\r\n\r\n private configCache: IInternalConfigs<T> = {}\r\n get internalConfig() {\r\n return this.configCache\r\n }\r\n\r\n shouldComponentUpdate(nextProps: Readonly<IDataViewProps<T>>): boolean {\r\n const filterDiff = JSON.stringify(nextProps.slots?.filterBarConfigs) !== JSON.stringify(this.props.slots?.filterBarConfigs)\r\n const viewModeDiff = JSON.stringify(nextProps.slots?.viewModeConfigs) !== JSON.stringify(this.props.slots?.viewModeConfigs)\r\n if (filterDiff || viewModeDiff) this.mergeConfig(nextProps)\r\n return true\r\n }\r\n\r\n refFilterButton: HTMLButtonElement | null = null\r\n refSortButton: HTMLButtonElement | null = null\r\n render() {\r\n const mapContext: IDataViewContext<T> = {\r\n keyword: this.state.keyword.trim(),\r\n filterBarConfigs: this.internalConfig.filterBar ?? {},\r\n filterState: this.filterState,\r\n anchorEl: this.state.anchorEl,\r\n area: this.state.area,\r\n viewMode: this.state.viewMode,\r\n scrolled: this.state.scrolled,\r\n onFilterStateChange: this.onFilterStateChangeHandler,\r\n onKeywordChange: this.onKeywordChangeHandler,\r\n onPopperPanelChange: this.onPopperPanelChangeHandler,\r\n onPanelClose: this.onPanelCloseHandler,\r\n onClear: this.onClearHandler\r\n }\r\n return (\r\n <DataViewContext.Provider value={mapContext}>\r\n {this.internalConfig.filterBar?.enableSticky && <ScrollTracking onChange={this.onScrollChangeHandler} />}\r\n {this.props.slots?.filterSlots?.above}\r\n <InputInstance\r\n slots={{\r\n ...this.props.slots?.primaryInputSlots,\r\n right: (\r\n <>\r\n {this.internalConfig.filterBar?.enableSort && <SortButton />}\r\n {this.props.slots?.primaryInputSlots?.right}\r\n </>\r\n )\r\n }}\r\n >\r\n <PopperPanelInstance />\r\n </InputInstance>\r\n {this.props.slots?.filterSlots?.below}\r\n {this.props.slots?.activeFiltersPanelSlots?.above}\r\n <FilterBarPanel>\r\n <ViewModeButtons value={this.state.viewMode} onChange={this.onViewModeChangeHandler} />\r\n {this.props.slots?.activeFiltersPanelSlots?.left}\r\n <Stack flexDirection={'row'} sx={{ flexWrap: 'wrap', alignItems: 'center', gap: 1, flexGrow: 1 }}>\r\n <ActiveFiltersPanelInstance loading={this.props.loading} />\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, flexGrow: 1, justifyContent: 'end' }}>\r\n {this.internalConfig.enablePaginationTop && (\r\n <PaginationBarInstance\r\n count={this.props.data?.totalItems ?? 0}\r\n defaultFilter={this.internalConfig.filterBar?.defaultValue}\r\n filter={this.filterState}\r\n onChange={this.onFilterStateChangeHandler}\r\n {...this.internalConfig.paginationBar}\r\n />\r\n )}\r\n </Box>\r\n </Stack>\r\n {this.props.slots?.activeFiltersPanelSlots?.right}\r\n </FilterBarPanel>\r\n {this.props.slots?.activeFiltersPanelSlots?.below}\r\n <ViewModeInstance\r\n data={this.props.data?.items ?? []}\r\n viewMode={this.viewMode}\r\n loading={this.props.loading}\r\n error={this.props.error}\r\n slots={this.internalConfig.viewMode}\r\n />\r\n {this.renderFooter()}\r\n </DataViewContext.Provider>\r\n )\r\n }\r\n\r\n renderFooter = () => {\r\n const temp = this.props.slots?.footerProps || {}\r\n return (\r\n <FooterWrap {...temp.wrapProps}>\r\n {temp.enablePagination !== false && (\r\n <PaginationBarInstance\r\n count={this.props.data?.totalItems ?? 0}\r\n defaultFilter={this.internalConfig.filterBar?.defaultValue}\r\n filter={this.filterState}\r\n onChange={this.onFilterStateChangeHandler}\r\n {...this.internalConfig.paginationBar}\r\n />\r\n )}\r\n </FooterWrap>\r\n )\r\n }\r\n\r\n onViewModeChangeHandler = (value: EViewMode) => {\r\n this.setState({ viewMode: value }, () => {\r\n if (this.props.syncViewModeToURL) {\r\n const dViewMode = this.internalConfig.viewMode?.defaultValue ?? configs.viewMode?.defaultValue ?? defaultViewMode\r\n syncViewModeToURL({ viewMode: value, defaultViewMode: dViewMode })\r\n }\r\n this.props.onViewModeChange?.(value)\r\n })\r\n }\r\n\r\n onKeywordChangeHandler = (keyword: string) => this.setState({ keyword })\r\n\r\n onScrollChangeHandler = (data: IScrollTrackingData) => this.setState({ scrolled: data.isScrolled })\r\n\r\n onPopperPanelChangeHandler: OnPanelValueChange = (anchorEl, area) => this.setState({ anchorEl, area })\r\n\r\n onClearHandler = () => this.setState(defaultFilterBarState)\r\n\r\n onPanelCloseHandler = () => {\r\n this.setState({ anchorEl: null, area: undefined, keyword: '' })\r\n }\r\n\r\n onFilterStateChangeHandler: IFilterStateChangeHandler<T> = (filterState: IFilterState<T>) => {\r\n if (!this.props.filter) this.setState({ ...defaultFilterBarState, filterState })\r\n this.props.onFilterChange && this.props.onFilterChange(filterState)\r\n if (!!this.props.filter) this.setState(defaultFilterBarState)\r\n }\r\n }\r\n\r\n return DataView\r\n}\r\n\r\nexport default createDataView\r\n\r\nconst FilterBarPanel = styled(Box)({\r\n display: 'flex',\r\n alignItems: 'center',\r\n flexWrap: 'wrap',\r\n gap: '8px',\r\n marginBottom: '8px',\r\n minHeight: 'var(--filter-bar-height, 40px)'\r\n})\r\n\r\nconst FooterWrap = styled(Box)({\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n width: '100%'\r\n})\r\n"],"names":["createDataView","configs","InputInstance","createFilterBar","PopperPanelInstance","createPopperPanel","ActiveFiltersPanelInstance","createActiveFiltersPanel","ViewModeInstance","createViewMode","viewMode","PaginationBarInstance","createPaginationBar","DataView","props","_this","_classCallCheck","_callSuper","_defineProperty","currentProps","_ref","_slots$paginationBarC","_slots$paginationBarC2","_configs$paginationBa","slots","configCache","filterBar","Object","assign","filterBarConfigs","viewModeConfigs","paginationBar","paginationBarConfigs","enablePaginationTop","_this$props$slots","_this$props$data$tota","_this$props$data","_this$internalConfig$","temp","footerProps","_jsx","FooterWrap","_objectSpread","wrapProps","children","enablePagination","count","data","totalItems","defaultFilter","internalConfig","defaultValue","filter","filterState","onChange","onFilterStateChangeHandler","value","setState","_this$props$onViewMod","_this$props","syncViewModeToURL","_ref2","_this$internalConfig$2","_this$internalConfig$3","_configs$viewMode","dViewMode","defaultViewMode","onViewModeChange","call","keyword","scrolled","isScrolled","anchorEl","area","defaultFilterBarState","undefined","onFilterChange","mergeConfig","state","getDefaultState","_inherits","Component","_createClass","key","_ref3","_currentProps$slots$v","_currentProps$slots","_configs$viewMode2","_this$internalConfig$4","_this$internalConfig$5","getViewModeFromURL","this","get","_this$props$filter","_this$props$viewMode","nextProps","_nextProps$slots","_this$props$slots2","_nextProps$slots2","_this$props$slots3","filterDiff","JSON","stringify","viewModeDiff","_this$internalConfig$6","_this$internalConfig$7","_this$props$slots4","_this$props$slots5","_this$internalConfig$8","_this$props$slots6","_this$props$slots7","_this$props$slots8","_this$props$slots9","_this$props$data$tota2","_this$props$data2","_this$internalConfig$9","_this$props$slots0","_this$props$slots1","_this$props$data$item","_this$props$data3","mapContext","trim","onFilterStateChange","onKeywordChange","onKeywordChangeHandler","onPopperPanelChange","onPopperPanelChangeHandler","onPanelClose","onPanelCloseHandler","onClear","onClearHandler","_jsxs","DataViewContext","Provider","enableSticky","ScrollTracking","onScrollChangeHandler","filterSlots","above","primaryInputSlots","right","_Fragment","enableSort","SortButton","below","activeFiltersPanelSlots","FilterBarPanel","ViewModeButtons","onViewModeChangeHandler","left","Stack","flexDirection","sx","flexWrap","alignItems","gap","flexGrow","loading","Box","display","justifyContent","items","error","renderFooter","styled","marginBottom","minHeight","width"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{defineProperty as t,inherits as e,createClass as i,classCallCheck as r,callSuper as n}from"../_virtual/_rollupPluginBabelHelpers.js";import{jsx as l,jsxs as a}from"react/jsx-runtime";import{Fragment as o,Component as d}from"react";import{styled as s,MenuList as u,Box as f,MenuItem as v,Button as c}from"@mui/material";import{createFilterStore as g}from"./filter-store.js";import{mapDataViewContext as m}from"./context.js";import{filterMenuClasses as p,getFieldsValidation as S,convertFormDataToJson as h,filterFieldValidated as y}from"./helpers.js";import{MenuWithTypeString as C,MenuWithTypeDateRange as b,MenuWithTypeDate as R,MenuWithTypeSelectMulti as x,MenuWithTypeSelect as F}from"./ui.units.js";function B(){return function(){function s(e){var i;return r(this,s),i=n(this,s,[e]),t(i,"renderForm",(function(t,e){return a("form",{onSubmit:function(r){return i.handleSubmit(r,t,e)},children:[i.renderWithMode(t,e),a(E,{children:[l(c,{size:"small",color:"inherit",onClick:t.onPanelClose,children:"Cancel"}),l(c,{size:"small",color:"primary",type:"submit",sx:{fontWeight:700},children:"Apply"})]})]})})),t(i,"renderWithMode",(function(t,e){var r,n=null===(r=t.filterBarConfigs.fields)||void 0===r?void 0:r[e];switch(null==n?void 0:n.type){case"select":return l(F,{name:e.toString(),fieldConfig:n,validationResult:i.state.validationResult,onChange:function(){return i.setState({validationResult:void 0})}});case"select-multi":return l(x,{name:e.toString(),fieldConfig:n,validationResult:i.state.validationResult,onChange:function(){return i.setState({validationResult:void 0})}});case"date":return l(R,{name:e.toString(),fieldConfig:n,validationResult:i.state.validationResult});case"date-range":return l(b,{name:e.toString(),fieldConfig:n,validationResult:i.state.validationResult});default:return l(C,{name:e.toString(),fieldConfig:n,validationResult:i.state.validationResult})}})),t(i,"handleSubmit",(function(t,e,r){null==t||t.preventDefault(),null==t||t.stopPropagation();var n=new FormData(null==t?void 0:t.currentTarget),l=i.formValidate(n,r,e);l.hasError?i.setState({validationResult:l}):i.addFilter(n,e,r)})),t(i,"formValidate",(function(t,e,i){var r=h(t),n=S(i.filterBarConfigs.fields||{})[e];if("select-multi"===(null==n?void 0:n.type)){if(0===t.getAll(e.toString()).length)return{hasError:!0,message:"Please select at least one option"}}else if("date-range"===(null==n?void 0:n.type)){var l,a,o=null===(l=t.get("".concat(e.toString(),"_start")))||void 0===l?void 0:l.toString(),d=null===(a=t.get("".concat(e.toString(),"_end")))||void 0===a?void 0:a.toString();if(!o||!d)return{hasError:!0,message:"Please select both start and end dates"};if(new Date(o)>new Date(d))return{hasError:!0,message:"Start date must be before end date"}}else{var s,u=null===(s=r[e])||void 0===s?void 0:s.toString(),f=y(null!=u?u:"",e,n);if(f.error)return{hasError:!0,message:f.message}}return{hasError:!1}})),t(i,"addFilter",(function(t,e,i){var r,n,l=S(e.filterBarConfigs.fields||{})[i],a=g((null==e?void 0:e.filterState)||{}),o=h(t),d=(null===(r=t.get("filterLogic"))||void 0===r?void 0:r.toString())||"and",s=(null===(n=t.get("dateRangeLogic"))||void 0===n?void 0:n.toString())||"between";if("date-range"===(null==l?void 0:l.type)){var u,f,v=null===(u=t.get("".concat(i.toString(),"_start")))||void 0===u?void 0:u.toString(),c=null===(f=t.get("".concat(i.toString(),"_end")))||void 0===f?void 0:f.toString();if(v&&c){var m={type:"date-range",startDate:v,endDate:c,dateRangeLogic:s,label:"".concat(v," to ").concat(c)};a.addFilterItem(i,m,{reason:"
|
|
1
|
+
import{defineProperty as t,inherits as e,createClass as i,classCallCheck as r,callSuper as n}from"../_virtual/_rollupPluginBabelHelpers.js";import{jsx as l,jsxs as a}from"react/jsx-runtime";import{Fragment as o,Component as d}from"react";import{styled as s,MenuList as u,Box as f,MenuItem as v,Button as c}from"@mui/material";import{createFilterStore as g}from"./filter-store.js";import{mapDataViewContext as m}from"./context.js";import{filterMenuClasses as p,getFieldsValidation as S,convertFormDataToJson as h,filterFieldValidated as y}from"./helpers.js";import{MenuWithTypeString as C,MenuWithTypeDateRange as b,MenuWithTypeDate as R,MenuWithTypeSelectMulti as x,MenuWithTypeSelect as F}from"./ui.units.js";function B(){return function(){function s(e){var i;return r(this,s),i=n(this,s,[e]),t(i,"renderForm",(function(t,e){return a("form",{onSubmit:function(r){return i.handleSubmit(r,t,e)},children:[i.renderWithMode(t,e),a(E,{children:[l(c,{size:"small",color:"inherit",onClick:t.onPanelClose,children:"Cancel"}),l(c,{size:"small",color:"primary",type:"submit",sx:{fontWeight:700},children:"Apply"})]})]})})),t(i,"renderWithMode",(function(t,e){var r,n=null===(r=t.filterBarConfigs.fields)||void 0===r?void 0:r[e];switch(null==n?void 0:n.type){case"select":return l(F,{name:e.toString(),fieldConfig:n,validationResult:i.state.validationResult,onChange:function(){return i.setState({validationResult:void 0})}});case"select-multi":return l(x,{name:e.toString(),fieldConfig:n,validationResult:i.state.validationResult,onChange:function(){return i.setState({validationResult:void 0})}});case"date":return l(R,{name:e.toString(),fieldConfig:n,validationResult:i.state.validationResult});case"date-range":return l(b,{name:e.toString(),fieldConfig:n,validationResult:i.state.validationResult});default:return l(C,{name:e.toString(),fieldConfig:n,validationResult:i.state.validationResult})}})),t(i,"handleSubmit",(function(t,e,r){null==t||t.preventDefault(),null==t||t.stopPropagation();var n=new FormData(null==t?void 0:t.currentTarget),l=i.formValidate(n,r,e);l.hasError?i.setState({validationResult:l}):i.addFilter(n,e,r)})),t(i,"formValidate",(function(t,e,i){var r=h(t),n=S(i.filterBarConfigs.fields||{})[e];if("select-multi"===(null==n?void 0:n.type)){if(0===t.getAll(e.toString()).length)return{hasError:!0,message:"Please select at least one option"}}else if("date-range"===(null==n?void 0:n.type)){var l,a,o=null===(l=t.get("".concat(e.toString(),"_start")))||void 0===l?void 0:l.toString(),d=null===(a=t.get("".concat(e.toString(),"_end")))||void 0===a?void 0:a.toString();if(!o||!d)return{hasError:!0,message:"Please select both start and end dates"};if(new Date(o)>new Date(d))return{hasError:!0,message:"Start date must be before end date"}}else{var s,u=null===(s=r[e])||void 0===s?void 0:s.toString(),f=y(null!=u?u:"",e,n);if(f.error)return{hasError:!0,message:f.message}}return{hasError:!1}})),t(i,"addFilter",(function(t,e,i){var r,n,l=S(e.filterBarConfigs.fields||{})[i],a=g((null==e?void 0:e.filterState)||{}),o=h(t),d=(null===(r=t.get("filterLogic"))||void 0===r?void 0:r.toString())||"and",s=(null===(n=t.get("dateRangeLogic"))||void 0===n?void 0:n.toString())||"between";if("date-range"===(null==l?void 0:l.type)){var u,f,v=null===(u=t.get("".concat(i.toString(),"_start")))||void 0===u?void 0:u.toString(),c=null===(f=t.get("".concat(i.toString(),"_end")))||void 0===f?void 0:f.toString();if(v&&c){var m={type:"date-range",startDate:v,endDate:c,dateRangeLogic:s,label:"".concat(v," to ").concat(c)};a.addFilterItem(i,m,{reason:"filter",area:"filterButton"})}}else if("date"===(null==l?void 0:l.type)){var p,y=null===(p=o[i])||void 0===p?void 0:p.toString();if(y){var C,b={type:"date",value:y,dateLogic:(null===(C=t.get("dateLogic"))||void 0===C?void 0:C.toString())||"before"};a.removeFilterField(i,{reason:"filter"}),a.addFilterItem(i,b,{reason:"filter",area:"filterButton"})}}else{var R=[];if("select-multi"===(null==l?void 0:l.type)){var x=o[i];Array.isArray(x)?R=x.map((function(t){return t.toString()})):x&&(R=[x.toString()])}else{var F,B=null===(F=o[i])||void 0===F?void 0:F.toString();B&&(R=[B])}R.forEach((function(t){var e,r=void 0;"select"!==(null==l?void 0:l.type)&&"select-multi"!==(null==l?void 0:l.type)||(r=null===(e=l.options.find((function(e){return e.value===t})))||void 0===e?void 0:e.label);var n={type:(null==l?void 0:l.type)||"string",value:t,label:r};"string"!==(null==l?void 0:l.type)&&(n.type=null==l?void 0:l.type),"select-multi"===(null==l?void 0:l.type)&&(n.logic=d),a.addFilterItem(i,n,{reason:"filter",area:"filterButton"})}))}e.onFilterStateChange(a.build())})),i.state={fieldSelected:null},i}return e(s,d),i(s,[{key:"render",value:function(){var t=this;return m((function(e){var i=t.state.fieldSelected;if(i)return t.renderForm(e,i);var r=S(e.filterBarConfigs.fields||{}),n=Object.keys(r);return l(j,{className:p.list,sx:{minWidth:"200px"},children:n.map((function(i,r){var n,a,d=null===(n=e.filterBarConfigs.fields)||void 0===n?void 0:n[i];return d?l(v,{className:p.item,onClick:function(){return t.setState({fieldSelected:i,validationResult:void 0})},children:null!==(a=null==d?void 0:d.label)&&void 0!==a?a:i.toString()},i.toString()+r):l(o,{},i.toString()+r)}))})}))}}])}()}var j=s(u)(t({padding:0},".".concat(p.item),{height:"var(--filter-item-height, 40px)",padding:"0 16px","&:not(:last-child)":{borderBottom:"1px solid var(--color-divider, rgba(145 160 170 / 10%))"}})),E=s(f)({display:"flex",alignItems:"center",justifyContent:"flex-end",padding:"8px"});export{B as default};
|
|
2
2
|
//# sourceMappingURL=create.filter-menu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.filter-menu.js","sources":["../../src/data-view/create.filter-menu.tsx"],"sourcesContent":["import React, { Component, ComponentType, Fragment } from 'react'\r\nimport { Box, Button, MenuItem, MenuList, styled } from '@mui/material'\r\nimport { createFilterStore } from './filter-store'\r\nimport { IDataViewContext, mapDataViewContext } from './context'\r\nimport { convertFormDataToJson, filterFieldValidated, filterMenuClasses, getFieldsValidation } from './helpers'\r\nimport { IFilterConfigs, IValidationResult, IFilterLogic, IFilterItem, IFilterDateLogic, IFilterDateRangeLogic } from './types'\r\nimport { MenuWithTypeSelect, MenuWithTypeSelectMulti, MenuWithTypeString, MenuWithTypeDate, MenuWithTypeDateRange } from './ui.units'\r\n\r\nexport interface IFilterMenuProps {}\r\n\r\nexport interface IFilterMenuState<T> {\r\n fieldSelected: keyof IFilterConfigs<T> | null\r\n validationResult?: IValidationResult\r\n}\r\n\r\nfunction createFilterMenu<T>(): ComponentType<IFilterMenuProps> {\r\n class FilterMenu extends Component<IFilterMenuProps, IFilterMenuState<T>> {\r\n constructor(props: IFilterMenuProps) {\r\n super(props)\r\n this.state = {\r\n fieldSelected: null\r\n }\r\n }\r\n\r\n render() {\r\n return mapDataViewContext<T>((context) => {\r\n const { fieldSelected } = this.state\r\n if (!!fieldSelected) return this.renderForm(context, fieldSelected)\r\n const fieldsValidation = getFieldsValidation<T>(context.filterBarConfigs.fields || {})\r\n const keys = Object.keys(fieldsValidation) as (keyof T)[]\r\n return (\r\n <MenuListCustom className={filterMenuClasses.list} sx={{ minWidth: '200px' }}>\r\n {keys.map((x, i) => {\r\n const item = context.filterBarConfigs.fields?.[x]\r\n if (!item) return <Fragment key={x.toString() + i} />\r\n return (\r\n <MenuItem\r\n key={x.toString() + i}\r\n className={filterMenuClasses.item}\r\n onClick={() =>\r\n this.setState({\r\n fieldSelected: x,\r\n validationResult: undefined\r\n })\r\n }\r\n >\r\n {item?.label ?? x.toString()}\r\n </MenuItem>\r\n )\r\n })}\r\n </MenuListCustom>\r\n )\r\n })\r\n }\r\n\r\n renderForm = (context: IDataViewContext<T>, fieldSelected: keyof T) => (\r\n <form onSubmit={(e) => this.handleSubmit(e, context, fieldSelected)}>\r\n {this.renderWithMode(context, fieldSelected)}\r\n <ActionWrapper>\r\n <Button size='small' color='inherit' onClick={context.onPanelClose}>\r\n Cancel\r\n </Button>\r\n <Button size='small' color='primary' type='submit' sx={{ fontWeight: 700 }}>\r\n Apply\r\n </Button>\r\n </ActionWrapper>\r\n </form>\r\n )\r\n\r\n renderWithMode = (context: IDataViewContext<T>, fieldSelected: keyof T) => {\r\n const fieldConfig = context.filterBarConfigs.fields?.[fieldSelected]\r\n switch (fieldConfig?.type) {\r\n case 'select':\r\n return (\r\n <MenuWithTypeSelect\r\n name={fieldSelected.toString()}\r\n fieldConfig={fieldConfig}\r\n validationResult={this.state.validationResult}\r\n onChange={() => this.setState({ validationResult: undefined })}\r\n />\r\n )\r\n case 'select-multi':\r\n return (\r\n <MenuWithTypeSelectMulti\r\n name={fieldSelected.toString()}\r\n fieldConfig={fieldConfig}\r\n validationResult={this.state.validationResult}\r\n onChange={() => this.setState({ validationResult: undefined })}\r\n />\r\n )\r\n case 'date':\r\n return <MenuWithTypeDate name={fieldSelected.toString()} fieldConfig={fieldConfig} validationResult={this.state.validationResult} />\r\n case 'date-range':\r\n return <MenuWithTypeDateRange name={fieldSelected.toString()} fieldConfig={fieldConfig} validationResult={this.state.validationResult} />\r\n case 'string':\r\n default:\r\n return <MenuWithTypeString name={fieldSelected.toString()} fieldConfig={fieldConfig} validationResult={this.state.validationResult} />\r\n }\r\n }\r\n\r\n /**\r\n * Handle form submission\r\n * @param event - The form submit event\r\n * @param context - The filter bar context\r\n * @param fieldSelected - The selected field to filter\r\n */\r\n handleSubmit = (event: React.FormEvent<HTMLFormElement>, context: IDataViewContext<T>, fieldSelected: keyof IFilterConfigs<T>) => {\r\n event?.preventDefault()\r\n event?.stopPropagation()\r\n\r\n const formData = new FormData(event?.currentTarget as HTMLFormElement)\r\n\r\n // Validate form data\r\n const validation = this.formValidate(formData, fieldSelected, context)\r\n if (validation.hasError) {\r\n this.setState({ validationResult: validation })\r\n return\r\n }\r\n\r\n // If validation passes, add filter\r\n this.addFilter(formData, context, fieldSelected)\r\n }\r\n\r\n /**\r\n * Validate form data based on field type and configuration\r\n * @param formData - The form data to validate\r\n * @param fieldSelected - The selected field to validate\r\n * @param context - The filter bar context\r\n * @returns Validation result with error status and message\r\n */\r\n formValidate = (formData: FormData, fieldSelected: keyof IFilterConfigs<T>, context: IDataViewContext<T>): IValidationResult => {\r\n const obj = convertFormDataToJson<T>(formData)\r\n const fieldsValidation = getFieldsValidation<T>(context.filterBarConfigs.fields || {})\r\n const fieldConfig = fieldsValidation[fieldSelected]\r\n\r\n if (fieldConfig?.type === 'select-multi') {\r\n const values = formData.getAll(fieldSelected.toString())\r\n if (values.length === 0) {\r\n return { hasError: true, message: 'Please select at least one option' }\r\n }\r\n } else if (fieldConfig?.type === 'date-range') {\r\n const startDate = formData.get(`${fieldSelected.toString()}_start`)?.toString()\r\n const endDate = formData.get(`${fieldSelected.toString()}_end`)?.toString()\r\n\r\n if (!startDate || !endDate) {\r\n return { hasError: true, message: 'Please select both start and end dates' }\r\n }\r\n\r\n if (new Date(startDate) > new Date(endDate)) {\r\n return { hasError: true, message: 'Start date must be before end date' }\r\n }\r\n } else {\r\n const value = obj[fieldSelected as keyof T]?.toString()\r\n const validate = filterFieldValidated(value ?? '', fieldSelected, fieldConfig)\r\n if (validate.error) {\r\n return { hasError: true, message: validate.message }\r\n }\r\n }\r\n\r\n return { hasError: false }\r\n }\r\n\r\n /**\r\n * Add filter based on field type and form data\r\n * @param formData - The form data containing field values\r\n * @param context - The filter bar context\r\n * @param fieldSelected - The selected field to filter\r\n */\r\n addFilter = (formData: FormData, context: IDataViewContext<T>, fieldSelected: keyof IFilterConfigs<T>) => {\r\n const fieldsValidation = getFieldsValidation<T>(context.filterBarConfigs.fields || {})\r\n const fieldConfig = fieldsValidation[fieldSelected]\r\n const store = createFilterStore<T>(context?.filterState || {})\r\n const formDataJson = convertFormDataToJson<T>(formData)\r\n\r\n // Get logic values from form data\r\n const filterLogic = (formData.get('filterLogic')?.toString() as IFilterLogic) || 'and'\r\n const dateRangeLogic = (formData.get('dateRangeLogic')?.toString() as IFilterDateRangeLogic) || 'between'\r\n\r\n // Handle date-range separately\r\n if (fieldConfig?.type === 'date-range') {\r\n const startDate = formData.get(`${fieldSelected.toString()}_start`)?.toString()\r\n const endDate = formData.get(`${fieldSelected.toString()}_end`)?.toString()\r\n\r\n if (startDate && endDate) {\r\n const filterItem: IFilterItem = {\r\n type: 'date-range',\r\n startDate,\r\n endDate,\r\n dateRangeLogic: dateRangeLogic,\r\n label: `${startDate} to ${endDate}`\r\n }\r\n\r\n store.addFilterItem(fieldSelected as keyof T, filterItem, { reason: 'field', area: 'filterButton' })\r\n }\r\n } else if (fieldConfig?.type === 'date') {\r\n const value = formDataJson[fieldSelected as keyof T]?.toString()\r\n if (value) {\r\n const dateLogic: IFilterDateLogic = (formData.get('dateLogic')?.toString() as IFilterDateLogic) || 'before'\r\n const filterItem: IFilterItem = { type: 'date', value, dateLogic }\r\n store.removeFilterField(fieldSelected as keyof T, { reason: 'field' }) // Remove existing filter for this field\r\n store.addFilterItem(fieldSelected as keyof T, filterItem, { reason: 'field', area: 'filterButton' })\r\n }\r\n } else {\r\n // Get all values based on field type\r\n let values: string[] = []\r\n\r\n if (fieldConfig?.type === 'select-multi') {\r\n // For multi-select, obj[fieldSelected] should be an array\r\n const fieldValue = formDataJson[fieldSelected]\r\n if (Array.isArray(fieldValue)) {\r\n values = fieldValue.map((v) => v.toString())\r\n } else if (fieldValue) {\r\n values = [fieldValue.toString()]\r\n }\r\n } else {\r\n // For single select and string\r\n const value = formDataJson[fieldSelected as keyof T]?.toString()\r\n if (value) {\r\n values = [value]\r\n }\r\n }\r\n\r\n // Add all values to store\r\n values.forEach((value) => {\r\n let label: string | undefined = undefined\r\n\r\n if (fieldConfig?.type === 'select' || fieldConfig?.type === 'select-multi') {\r\n label = fieldConfig.options.find((x) => x.value === value)?.label\r\n }\r\n\r\n // Create filter item with type and logic\r\n const filterItem: IFilterItem = { type: fieldConfig?.type || 'string', value, label }\r\n if (fieldConfig?.type !== 'string') filterItem.type = fieldConfig?.type\r\n if (fieldConfig?.type === 'select-multi') filterItem.logic = filterLogic\r\n store.addFilterItem(fieldSelected as keyof T, filterItem, { reason: 'field', area: 'filterButton' })\r\n })\r\n }\r\n\r\n context.onFilterStateChange(store.build())\r\n }\r\n }\r\n\r\n return FilterMenu\r\n}\r\n\r\nexport default createFilterMenu\r\n\r\nconst MenuListCustom = styled(MenuList)({\r\n padding: 0,\r\n [`.${filterMenuClasses.item}`]: {\r\n height: 'var(--filter-item-height, 40px)',\r\n padding: '0 16px',\r\n '&:not(:last-child)': {\r\n borderBottom: '1px solid var(--color-divider, rgba(145 160 170 / 10%))'\r\n }\r\n }\r\n})\r\n\r\nconst ActionWrapper = styled(Box)({\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n padding: '8px'\r\n})\r\n"],"names":["createFilterMenu","FilterMenu","props","_this","_classCallCheck","_callSuper","_defineProperty","context","fieldSelected","_jsxs","onSubmit","e","handleSubmit","children","renderWithMode","ActionWrapper","_jsx","Button","size","color","onClick","onPanelClose","type","sx","fontWeight","_context$filterBarCon","fieldConfig","filterBarConfigs","fields","MenuWithTypeSelect","name","toString","validationResult","state","onChange","setState","undefined","MenuWithTypeSelectMulti","MenuWithTypeDate","MenuWithTypeDateRange","MenuWithTypeString","event","preventDefault","stopPropagation","formData","FormData","currentTarget","validation","formValidate","hasError","addFilter","obj","convertFormDataToJson","getFieldsValidation","getAll","length","message","_formData$get","_formData$get2","startDate","get","concat","endDate","Date","_obj$fieldSelected","value","validate","filterFieldValidated","error","_formData$get3","_formData$get4","store","createFilterStore","filterState","formDataJson","filterLogic","dateRangeLogic","_formData$get5","_formData$get6","filterItem","label","addFilterItem","reason","area","_formDataJson$fieldSe","_formData$get7","dateLogic","removeFilterField","values","fieldValue","Array","isArray","map","v","_formDataJson$fieldSe2","forEach","_fieldConfig$options$","options","find","x","logic","onFilterStateChange","build","_inherits","Component","_createClass","key","_this2","this","mapDataViewContext","renderForm","fieldsValidation","keys","Object","MenuListCustom","className","filterMenuClasses","list","minWidth","i","_context$filterBarCon2","_item$label","item","MenuItem","Fragment","styled","MenuList","padding","height","borderBottom","Box","display","alignItems","justifyContent"],"mappings":"ssBAeA,SAASA,IAmOP,kBAjOE,SAAAC,EAAYC,GAAuB,IAAAC,EAIhC,OAJgCC,OAAAH,GACjCE,EAAAE,EAAAJ,KAAAA,GAAMC,IAAMI,EAAAH,EAAA,cAqCD,SAACI,EAA8BC,GAAsB,OAChEC,EAAM,OAAA,CAAAC,SAAU,SAACC,GAAC,OAAKR,EAAKS,aAAaD,EAAGJ,EAASC,EAAc,EAAAK,SAAA,CAChEV,EAAKW,eAAeP,EAASC,GAC9BC,EAACM,aACCC,EAACC,EAAO,CAAAC,KAAK,QAAQC,MAAM,UAAUC,QAASb,EAAQc,aAE7CR,SAAA,WACTG,EAACC,EAAM,CAACC,KAAK,QAAQC,MAAM,UAAUG,KAAK,SAASC,GAAI,CAAEC,WAAY,iCAK1ElB,EAAAH,EAAA,kBAEgB,SAACI,EAA8BC,GAA0B,IAAAiB,EAClEC,UAAWD,EAAGlB,EAAQoB,iBAAiBC,cAAM,IAAAH,OAAA,EAA/BA,EAAkCjB,GACtD,OAAQkB,aAAAA,EAAAA,EAAaJ,MACnB,IAAK,SACH,OACEN,EAACa,GACCC,KAAMtB,EAAcuB,WACpBL,YAAaA,EACbM,iBAAkB7B,EAAK8B,MAAMD,iBAC7BE,SAAU,WAAF,OAAQ/B,EAAKgC,SAAS,CAAEH,sBAAkBI,GAAY,IAGpE,IAAK,eACH,OACEpB,EAACqB,GACCP,KAAMtB,EAAcuB,WACpBL,YAAaA,EACbM,iBAAkB7B,EAAK8B,MAAMD,iBAC7BE,SAAU,WAAF,OAAQ/B,EAAKgC,SAAS,CAAEH,sBAAkBI,GAAY,IAGpE,IAAK,OACH,OAAOpB,EAACsB,EAAiB,CAAAR,KAAMtB,EAAcuB,WAAYL,YAAaA,EAAaM,iBAAkB7B,EAAK8B,MAAMD,mBAClH,IAAK,aACH,OAAOhB,EAACuB,EAAsB,CAAAT,KAAMtB,EAAcuB,WAAYL,YAAaA,EAAaM,iBAAkB7B,EAAK8B,MAAMD,mBAEvH,QACE,OAAOhB,EAACwB,EAAmB,CAAAV,KAAMtB,EAAcuB,WAAYL,YAAaA,EAAaM,iBAAkB7B,EAAK8B,MAAMD,uBAIxH1B,EAAAH,EAMe,gBAAA,SAACsC,EAAyClC,EAA8BC,GACrFiC,SAAAA,EAAOC,iBACPD,SAAAA,EAAOE,kBAEP,IAAMC,EAAW,IAAIC,SAASJ,aAAAA,EAAAA,EAAOK,eAG/BC,EAAa5C,EAAK6C,aAAaJ,EAAUpC,EAAeD,GAC1DwC,EAAWE,SACb9C,EAAKgC,SAAS,CAAEH,iBAAkBe,IAKpC5C,EAAK+C,UAAUN,EAAUrC,EAASC,MAGpCF,EAAAH,EAOe,gBAAA,SAACyC,EAAoBpC,EAAwCD,GAC1E,IAAM4C,EAAMC,EAAyBR,GAE/BlB,EADmB2B,EAAuB9C,EAAQoB,iBAAiBC,QAAU,CAAA,GAC9CpB,GAErC,GAA0B,kBAAtBkB,aAAW,EAAXA,EAAaJ,OAEf,GAAsB,IADPsB,EAASU,OAAO9C,EAAcuB,YAClCwB,OACT,MAAO,CAAEN,UAAU,EAAMO,QAAS,0CAE/B,GAA0B,gBAAtB9B,aAAAA,EAAAA,EAAaJ,MAAuB,CAAA,IAAAmC,EAAAC,EACvCC,EAA6DF,QAApDA,EAAGb,EAASgB,IAAG,GAAAC,OAAIrD,EAAcuB,WAAkB,sBAAC0B,SAAjDA,EAAmD1B,WAC/D+B,EAAyDJ,QAAlDA,EAAGd,EAASgB,IAAG,GAAAC,OAAIrD,EAAcuB,WAAgB,oBAAC2B,SAA/CA,EAAiD3B,WAEjE,IAAK4B,IAAcG,EACjB,MAAO,CAAEb,UAAU,EAAMO,QAAS,0CAGpC,GAAI,IAAIO,KAAKJ,GAAa,IAAII,KAAKD,GACjC,MAAO,CAAEb,UAAU,EAAMO,QAAS,qCAErC,KAAM,CAAA,IAAAQ,EACCC,EAAqC,QAAhCD,EAAGb,EAAI3C,UAAJwD,IAA6BA,OAA7BA,EAAAA,EAA+BjC,WACvCmC,EAAWC,EAAqBF,QAAAA,EAAS,GAAIzD,EAAekB,GAClE,GAAIwC,EAASE,MACX,MAAO,CAAEnB,UAAU,EAAMO,QAASU,EAASV,QAE9C,CAED,MAAO,CAAEP,UAAU,MAGrB3C,EAAAH,EAMY,aAAA,SAACyC,EAAoBrC,EAA8BC,GAA0C,IAAA6D,EAAAC,EAEjG5C,EADmB2B,EAAuB9C,EAAQoB,iBAAiBC,QAAU,CAAA,GAC9CpB,GAC/B+D,EAAQC,GAAqBjE,aAAO,EAAPA,EAASkE,cAAe,CAAA,GACrDC,EAAetB,EAAyBR,GAGxC+B,GAA0CN,QAA3BA,EAAAzB,EAASgB,IAAI,0BAAcS,SAA3BA,EAA6BtC,aAA+B,MAC3E6C,GAAgDN,QAA9BA,EAAA1B,EAASgB,IAAI,6BAAiBU,SAA9BA,EAAgCvC,aAAwC,UAGhG,GAA0B,gBAAtBL,aAAW,EAAXA,EAAaJ,MAAuB,CAAA,IAAAuD,EAAAC,EAChCnB,EAA6DkB,QAApDA,EAAGjC,EAASgB,IAAG,GAAAC,OAAIrD,EAAcuB,WAAkB,sBAAC8C,SAAjDA,EAAmD9C,WAC/D+B,EAAyDgB,QAAlDA,EAAGlC,EAASgB,IAAG,GAAAC,OAAIrD,EAAcuB,WAAgB,oBAAC+C,SAA/CA,EAAiD/C,WAEjE,GAAI4B,GAAaG,EAAS,CACxB,IAAMiB,EAA0B,CAC9BzD,KAAM,aACNqC,UAAAA,EACAG,QAAAA,EACAc,eAAgBA,EAChBI,SAAKnB,OAAKF,EAASE,QAAAA,OAAOC,IAG5BS,EAAMU,cAAczE,EAA0BuE,EAAY,CAAEG,OAAQ,QAASC,KAAM,gBACpF,CACF,MAAM,GAA0B,UAAtBzD,aAAAA,EAAAA,EAAaJ,MAAiB,CAAA,IAAA8D,EACjCnB,EAA8C,QAAzCmB,EAAGV,EAAalE,UAAb4E,IAAsCA,OAAtCA,EAAAA,EAAwCrD,WACtD,GAAIkC,EAAO,CAAA,IAAAoB,EAEHN,EAA0B,CAAEzD,KAAM,OAAQ2C,MAAAA,EAAOqB,WADOD,QAAzBA,EAAAzC,EAASgB,IAAI,wBAAYyB,SAAzBA,EAA2BtD,aAAmC,UAEnGwC,EAAMgB,kBAAkB/E,EAA0B,CAAE0E,OAAQ,UAC5DX,EAAMU,cAAczE,EAA0BuE,EAAY,CAAEG,OAAQ,QAASC,KAAM,gBACpF,CACF,KAAM,CAEL,IAAIK,EAAmB,GAEvB,GAA0B,kBAAtB9D,aAAW,EAAXA,EAAaJ,MAAyB,CAExC,IAAMmE,EAAaf,EAAalE,GAC5BkF,MAAMC,QAAQF,GAChBD,EAASC,EAAWG,KAAI,SAACC,GAAC,OAAKA,EAAE9D,cACxB0D,IACTD,EAAS,CAACC,EAAW1D,YAExB,KAAM,CAAA,IAAA+D,EAEC7B,EAA8C,QAAzC6B,EAAGpB,EAAalE,UAAbsF,IAAsCA,OAAtCA,EAAAA,EAAwC/D,WAClDkC,IACFuB,EAAS,CAACvB,GAEb,CAGDuB,EAAOO,SAAQ,SAAC9B,GACd,IAE4E+B,EAFxEhB,OAA4B5C,EAEN,YAAtBV,eAAAA,EAAaJ,OAA2C,kBAAtBI,aAAW,EAAXA,EAAaJ,QACjD0D,EAA0DgB,QAArDA,EAAGtE,EAAYuE,QAAQC,MAAK,SAACC,GAAC,OAAKA,EAAElC,QAAUA,CAAK,WAAjD+B,IAAkDA,OAAlDA,EAAAA,EAAoDhB,OAI9D,IAAMD,EAA0B,CAAEzD,MAAMI,eAAAA,EAAaJ,OAAQ,SAAU2C,MAAAA,EAAOe,MAAAA,GACpD,YAAtBtD,eAAAA,EAAaJ,QAAmByD,EAAWzD,KAAOI,aAAW,EAAXA,EAAaJ,MACzC,kBAAtBI,eAAAA,EAAaJ,QAAyByD,EAAWqB,MAAQzB,GAC7DJ,EAAMU,cAAczE,EAA0BuE,EAAY,CAAEG,OAAQ,QAASC,KAAM,gBACrF,GACD,CAED5E,EAAQ8F,oBAAoB9B,EAAM+B,YA3NlCnG,EAAK8B,MAAQ,CACXzB,cAAe,MAChBL,CACH,CAAC,OAAAoG,EAAAtG,EANsBuG,GAMtBC,EAAAxG,EAAA,CAAA,CAAAyG,IAAA,SAAAzC,MAED,WAAM,IAAA0C,EAAAC,KACJ,OAAOC,GAAsB,SAACtG,GAC5B,IAAQC,EAAkBmG,EAAK1E,MAAvBzB,cACR,GAAMA,EAAe,OAAOmG,EAAKG,WAAWvG,EAASC,GACrD,IAAMuG,EAAmB1D,EAAuB9C,EAAQoB,iBAAiBC,QAAU,CAAA,GAC7EoF,EAAOC,OAAOD,KAAKD,GACzB,OACE/F,EAACkG,EAAe,CAAAC,UAAWC,EAAkBC,KAAM9F,GAAI,CAAE+F,SAAU,SAChEzG,SAAAmG,EAAKpB,KAAI,SAACO,EAAGoB,GAAK,IAAAC,EAAAC,EACXC,UAAIF,EAAGjH,EAAQoB,iBAAiBC,cAAM,IAAA4F,OAAA,EAA/BA,EAAkCrB,GAC/C,OAAKuB,EAEH1G,EAAC2G,GAECR,UAAWC,EAAkBM,KAC7BtG,QAAS,WAAF,OACLuF,EAAKxE,SAAS,CACZ3B,cAAe2F,EACfnE,sBAAkBI,GAClB,WAGQ,UAAXsF,eAAAA,EAAM1C,aAAKyC,IAAAA,EAAAA,EAAItB,EAAEpE,YATboE,EAAEpE,WAAawF,GAHNvG,EAAC4G,EAAQ,CAAA,EAAMzB,EAAEpE,WAAawF,EAejD,KAGP,GACF,IAAC,GA8LL,CAIA,IAAML,EAAiBW,EAAOC,EAAPD,CAAgBvH,EAAA,CACrCyH,QAAS,GAAC,IAAAlE,OACLuD,EAAkBM,MAAS,CAC9BM,OAAQ,kCACRD,QAAS,SACT,qBAAsB,CACpBE,aAAc,8DAKdlH,EAAgB8G,EAAOK,EAAPL,CAAY,CAChCM,QAAS,OACTC,WAAY,SACZC,eAAgB,WAChBN,QAAS"}
|
|
1
|
+
{"version":3,"file":"create.filter-menu.js","sources":["../../src/data-view/create.filter-menu.tsx"],"sourcesContent":["import React, { Component, ComponentType, Fragment } from 'react'\r\nimport { Box, Button, MenuItem, MenuList, styled } from '@mui/material'\r\nimport { createFilterStore } from './filter-store'\r\nimport { IDataViewContext, mapDataViewContext } from './context'\r\nimport { convertFormDataToJson, filterFieldValidated, filterMenuClasses, getFieldsValidation } from './helpers'\r\nimport { IFilterConfigs, IValidationResult, IFilterLogic, IFilterItem, IFilterDateLogic, IFilterDateRangeLogic } from './types'\r\nimport { MenuWithTypeSelect, MenuWithTypeSelectMulti, MenuWithTypeString, MenuWithTypeDate, MenuWithTypeDateRange } from './ui.units'\r\n\r\nexport interface IFilterMenuProps {}\r\n\r\nexport interface IFilterMenuState<T> {\r\n fieldSelected: keyof IFilterConfigs<T> | null\r\n validationResult?: IValidationResult\r\n}\r\n\r\nfunction createFilterMenu<T>(): ComponentType<IFilterMenuProps> {\r\n class FilterMenu extends Component<IFilterMenuProps, IFilterMenuState<T>> {\r\n constructor(props: IFilterMenuProps) {\r\n super(props)\r\n this.state = {\r\n fieldSelected: null\r\n }\r\n }\r\n\r\n render() {\r\n return mapDataViewContext<T>((context) => {\r\n const { fieldSelected } = this.state\r\n if (!!fieldSelected) return this.renderForm(context, fieldSelected)\r\n const fieldsValidation = getFieldsValidation<T>(context.filterBarConfigs.fields || {})\r\n const keys = Object.keys(fieldsValidation) as (keyof T)[]\r\n return (\r\n <MenuListCustom className={filterMenuClasses.list} sx={{ minWidth: '200px' }}>\r\n {keys.map((x, i) => {\r\n const item = context.filterBarConfigs.fields?.[x]\r\n if (!item) return <Fragment key={x.toString() + i} />\r\n return (\r\n <MenuItem\r\n key={x.toString() + i}\r\n className={filterMenuClasses.item}\r\n onClick={() =>\r\n this.setState({\r\n fieldSelected: x,\r\n validationResult: undefined\r\n })\r\n }\r\n >\r\n {item?.label ?? x.toString()}\r\n </MenuItem>\r\n )\r\n })}\r\n </MenuListCustom>\r\n )\r\n })\r\n }\r\n\r\n renderForm = (context: IDataViewContext<T>, fieldSelected: keyof T) => (\r\n <form onSubmit={(e) => this.handleSubmit(e, context, fieldSelected)}>\r\n {this.renderWithMode(context, fieldSelected)}\r\n <ActionWrapper>\r\n <Button size='small' color='inherit' onClick={context.onPanelClose}>\r\n Cancel\r\n </Button>\r\n <Button size='small' color='primary' type='submit' sx={{ fontWeight: 700 }}>\r\n Apply\r\n </Button>\r\n </ActionWrapper>\r\n </form>\r\n )\r\n\r\n renderWithMode = (context: IDataViewContext<T>, fieldSelected: keyof T) => {\r\n const fieldConfig = context.filterBarConfigs.fields?.[fieldSelected]\r\n switch (fieldConfig?.type) {\r\n case 'select':\r\n return (\r\n <MenuWithTypeSelect\r\n name={fieldSelected.toString()}\r\n fieldConfig={fieldConfig}\r\n validationResult={this.state.validationResult}\r\n onChange={() => this.setState({ validationResult: undefined })}\r\n />\r\n )\r\n case 'select-multi':\r\n return (\r\n <MenuWithTypeSelectMulti\r\n name={fieldSelected.toString()}\r\n fieldConfig={fieldConfig}\r\n validationResult={this.state.validationResult}\r\n onChange={() => this.setState({ validationResult: undefined })}\r\n />\r\n )\r\n case 'date':\r\n return <MenuWithTypeDate name={fieldSelected.toString()} fieldConfig={fieldConfig} validationResult={this.state.validationResult} />\r\n case 'date-range':\r\n return <MenuWithTypeDateRange name={fieldSelected.toString()} fieldConfig={fieldConfig} validationResult={this.state.validationResult} />\r\n case 'string':\r\n default:\r\n return <MenuWithTypeString name={fieldSelected.toString()} fieldConfig={fieldConfig} validationResult={this.state.validationResult} />\r\n }\r\n }\r\n\r\n /**\r\n * Handle form submission\r\n * @param event - The form submit event\r\n * @param context - The filter bar context\r\n * @param fieldSelected - The selected field to filter\r\n */\r\n handleSubmit = (event: React.FormEvent<HTMLFormElement>, context: IDataViewContext<T>, fieldSelected: keyof IFilterConfigs<T>) => {\r\n event?.preventDefault()\r\n event?.stopPropagation()\r\n\r\n const formData = new FormData(event?.currentTarget as HTMLFormElement)\r\n\r\n // Validate form data\r\n const validation = this.formValidate(formData, fieldSelected, context)\r\n if (validation.hasError) {\r\n this.setState({ validationResult: validation })\r\n return\r\n }\r\n\r\n // If validation passes, add filter\r\n this.addFilter(formData, context, fieldSelected)\r\n }\r\n\r\n /**\r\n * Validate form data based on field type and configuration\r\n * @param formData - The form data to validate\r\n * @param fieldSelected - The selected field to validate\r\n * @param context - The filter bar context\r\n * @returns Validation result with error status and message\r\n */\r\n formValidate = (formData: FormData, fieldSelected: keyof IFilterConfigs<T>, context: IDataViewContext<T>): IValidationResult => {\r\n const obj = convertFormDataToJson<T>(formData)\r\n const fieldsValidation = getFieldsValidation<T>(context.filterBarConfigs.fields || {})\r\n const fieldConfig = fieldsValidation[fieldSelected]\r\n\r\n if (fieldConfig?.type === 'select-multi') {\r\n const values = formData.getAll(fieldSelected.toString())\r\n if (values.length === 0) {\r\n return { hasError: true, message: 'Please select at least one option' }\r\n }\r\n } else if (fieldConfig?.type === 'date-range') {\r\n const startDate = formData.get(`${fieldSelected.toString()}_start`)?.toString()\r\n const endDate = formData.get(`${fieldSelected.toString()}_end`)?.toString()\r\n\r\n if (!startDate || !endDate) {\r\n return { hasError: true, message: 'Please select both start and end dates' }\r\n }\r\n\r\n if (new Date(startDate) > new Date(endDate)) {\r\n return { hasError: true, message: 'Start date must be before end date' }\r\n }\r\n } else {\r\n const value = obj[fieldSelected as keyof T]?.toString()\r\n const validate = filterFieldValidated(value ?? '', fieldSelected, fieldConfig)\r\n if (validate.error) {\r\n return { hasError: true, message: validate.message }\r\n }\r\n }\r\n\r\n return { hasError: false }\r\n }\r\n\r\n /**\r\n * Add filter based on field type and form data\r\n * @param formData - The form data containing field values\r\n * @param context - The filter bar context\r\n * @param fieldSelected - The selected field to filter\r\n */\r\n addFilter = (formData: FormData, context: IDataViewContext<T>, fieldSelected: keyof IFilterConfigs<T>) => {\r\n const fieldsValidation = getFieldsValidation<T>(context.filterBarConfigs.fields || {})\r\n const fieldConfig = fieldsValidation[fieldSelected]\r\n const store = createFilterStore<T>(context?.filterState || {})\r\n const formDataJson = convertFormDataToJson<T>(formData)\r\n\r\n // Get logic values from form data\r\n const filterLogic = (formData.get('filterLogic')?.toString() as IFilterLogic) || 'and'\r\n const dateRangeLogic = (formData.get('dateRangeLogic')?.toString() as IFilterDateRangeLogic) || 'between'\r\n\r\n // Handle date-range separately\r\n if (fieldConfig?.type === 'date-range') {\r\n const startDate = formData.get(`${fieldSelected.toString()}_start`)?.toString()\r\n const endDate = formData.get(`${fieldSelected.toString()}_end`)?.toString()\r\n\r\n if (startDate && endDate) {\r\n const filterItem: IFilterItem = {\r\n type: 'date-range',\r\n startDate,\r\n endDate,\r\n dateRangeLogic: dateRangeLogic,\r\n label: `${startDate} to ${endDate}`\r\n }\r\n\r\n store.addFilterItem(fieldSelected as keyof T, filterItem, { reason: 'filter', area: 'filterButton' })\r\n }\r\n } else if (fieldConfig?.type === 'date') {\r\n const value = formDataJson[fieldSelected as keyof T]?.toString()\r\n if (value) {\r\n const dateLogic: IFilterDateLogic = (formData.get('dateLogic')?.toString() as IFilterDateLogic) || 'before'\r\n const filterItem: IFilterItem = { type: 'date', value, dateLogic }\r\n store.removeFilterField(fieldSelected as keyof T, { reason: 'filter' }) // Remove existing filter for this field\r\n store.addFilterItem(fieldSelected as keyof T, filterItem, { reason: 'filter', area: 'filterButton' })\r\n }\r\n } else {\r\n // Get all values based on field type\r\n let values: string[] = []\r\n\r\n if (fieldConfig?.type === 'select-multi') {\r\n // For multi-select, obj[fieldSelected] should be an array\r\n const fieldValue = formDataJson[fieldSelected]\r\n if (Array.isArray(fieldValue)) {\r\n values = fieldValue.map((v) => v.toString())\r\n } else if (fieldValue) {\r\n values = [fieldValue.toString()]\r\n }\r\n } else {\r\n // For single select and string\r\n const value = formDataJson[fieldSelected as keyof T]?.toString()\r\n if (value) {\r\n values = [value]\r\n }\r\n }\r\n\r\n // Add all values to store\r\n values.forEach((value) => {\r\n let label: string | undefined = undefined\r\n\r\n if (fieldConfig?.type === 'select' || fieldConfig?.type === 'select-multi') {\r\n label = fieldConfig.options.find((x) => x.value === value)?.label\r\n }\r\n\r\n // Create filter item with type and logic\r\n const filterItem: IFilterItem = { type: fieldConfig?.type || 'string', value, label }\r\n if (fieldConfig?.type !== 'string') filterItem.type = fieldConfig?.type\r\n if (fieldConfig?.type === 'select-multi') filterItem.logic = filterLogic\r\n store.addFilterItem(fieldSelected as keyof T, filterItem, { reason: 'filter', area: 'filterButton' })\r\n })\r\n }\r\n\r\n context.onFilterStateChange(store.build())\r\n }\r\n }\r\n\r\n return FilterMenu\r\n}\r\n\r\nexport default createFilterMenu\r\n\r\nconst MenuListCustom = styled(MenuList)({\r\n padding: 0,\r\n [`.${filterMenuClasses.item}`]: {\r\n height: 'var(--filter-item-height, 40px)',\r\n padding: '0 16px',\r\n '&:not(:last-child)': {\r\n borderBottom: '1px solid var(--color-divider, rgba(145 160 170 / 10%))'\r\n }\r\n }\r\n})\r\n\r\nconst ActionWrapper = styled(Box)({\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n padding: '8px'\r\n})\r\n"],"names":["createFilterMenu","FilterMenu","props","_this","_classCallCheck","_callSuper","_defineProperty","context","fieldSelected","_jsxs","onSubmit","e","handleSubmit","children","renderWithMode","ActionWrapper","_jsx","Button","size","color","onClick","onPanelClose","type","sx","fontWeight","_context$filterBarCon","fieldConfig","filterBarConfigs","fields","MenuWithTypeSelect","name","toString","validationResult","state","onChange","setState","undefined","MenuWithTypeSelectMulti","MenuWithTypeDate","MenuWithTypeDateRange","MenuWithTypeString","event","preventDefault","stopPropagation","formData","FormData","currentTarget","validation","formValidate","hasError","addFilter","obj","convertFormDataToJson","getFieldsValidation","getAll","length","message","_formData$get","_formData$get2","startDate","get","concat","endDate","Date","_obj$fieldSelected","value","validate","filterFieldValidated","error","_formData$get3","_formData$get4","store","createFilterStore","filterState","formDataJson","filterLogic","dateRangeLogic","_formData$get5","_formData$get6","filterItem","label","addFilterItem","reason","area","_formDataJson$fieldSe","_formData$get7","dateLogic","removeFilterField","values","fieldValue","Array","isArray","map","v","_formDataJson$fieldSe2","forEach","_fieldConfig$options$","options","find","x","logic","onFilterStateChange","build","_inherits","Component","_createClass","key","_this2","this","mapDataViewContext","renderForm","fieldsValidation","keys","Object","MenuListCustom","className","filterMenuClasses","list","minWidth","i","_context$filterBarCon2","_item$label","item","MenuItem","Fragment","styled","MenuList","padding","height","borderBottom","Box","display","alignItems","justifyContent"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{objectSpread2 as e,
|
|
1
|
+
import{objectSpread2 as e,defineProperty as a,inherits as n,createClass as t,classCallCheck as i,callSuper as r}from"../_virtual/_rollupPluginBabelHelpers.js";import{jsx as o}from"react/jsx-runtime";import{Component as l}from"react";import{styled as s,TablePagination as p}from"@mui/material";import{createFilterStore as u}from"./filter-store.js";function g(){var e=function(){function e(){var n;i(this,e);for(var t=arguments.length,o=new Array(t),l=0;l<t;l++)o[l]=arguments[l];return n=r(this,e,[].concat(o)),a(n,"handleChangePage",(function(e,a){var t,i,r,o=u(null!==(t=n.props.filter)&&void 0!==t?t:{},n.defaultFilter),l={page:a,pageSize:n.pagination.pageSize};o.changePagination(l,{reason:"pagination"}),null===(i=(r=n.props).onChange)||void 0===i||i.call(r,o.build())})),a(n,"handleChangeRowsPerPage",(function(e){var a,t,i,r=parseInt(e.target.value,10),o=u(null!==(a=n.props.filter)&&void 0!==a?a:{},n.defaultFilter);o.changePagination({page:0,pageSize:r},{reason:"pagination"}),null===(t=(i=n.props).onChange)||void 0===t||t.call(i,o.build())})),n}return n(e,l),t(e,[{key:"defaultFilter",get:function(){return this.props.defaultFilter||{}}},{key:"defaultPagination",get:function(){var e;return(null===(e=this.defaultFilter)||void 0===e?void 0:e.pagination)||{page:0,pageSize:10}}},{key:"pagination",get:function(){var e;return(null===(e=this.props.filter)||void 0===e?void 0:e.pagination)||this.defaultPagination}},{key:"rowsPerPageOptions",get:function(){return this.props.rowsPerPageOptions||[10,25,50,100]}},{key:"render",value:function(){var e=this.pagination,a=e.page,n=e.pageSize;return o(c,{size:"small",page:a,count:this.props.count||0,onPageChange:this.handleChangePage,rowsPerPage:n,onRowsPerPageChange:this.handleChangeRowsPerPage,rowsPerPageOptions:this.rowsPerPageOptions,labelRowsPerPage:"Items per page",slotProps:{actions:{nextButton:{size:"small"},previousButton:{size:"small"}},select:{MenuProps:{disableScrollLock:this.props.disableScrollLock}}}})}}])}();return e}var c=s((function(a){return o(p,e({component:"div"},a))}))((function(e){var n=e.theme;return{"@media (min-width: 600px)":{".MuiToolbar-root":{minHeight:"48px"}},".MuiTablePagination-selectLabel":a({},n.breakpoints.down("sm"),{display:"none"})}}));export{g as createPaginationBar,g as default};
|
|
2
2
|
//# sourceMappingURL=create.pagination-bar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.pagination-bar.js","sources":["../../src/data-view/create.pagination-bar.tsx"],"sourcesContent":["import React, { Component, ComponentType } from 'react'\r\nimport { styled, TablePagination, TablePaginationProps } from '@mui/material'\r\nimport { createFilterStore } from './filter-store'\r\nimport { IFilterState, IPagination } from './types'\r\n\r\nexport interface IPaginationBarConfigs {\r\n rowsPerPageOptions?: number[]\r\n disableScrollLock?: boolean\r\n}\r\n\r\nexport interface IPaginationBarProps<T> extends IPaginationBarConfigs {\r\n count?: number\r\n filter?: IFilterState<T>\r\n defaultFilter?: IFilterState<T>\r\n onChange?: (value: IFilterState<T>) => void\r\n}\r\n\r\nexport type IPaginationBarParams<T> = Pick<IPaginationBarProps<T>, 'defaultFilter' | 'rowsPerPageOptions'>\r\n\r\nexport function createPaginationBar<T>(): ComponentType<IPaginationBarProps<T>> {\r\n class PaginationBar extends Component<IPaginationBarProps<T>> {\r\n get defaultFilter(): IFilterState<T> {\r\n return this.props.defaultFilter || {}\r\n }\r\n\r\n get defaultPagination(): Required<IPagination> {\r\n return (this.defaultFilter?.pagination as any) || { page: 0, pageSize: 10 }\r\n }\r\n\r\n get pagination(): Required<IPagination> {\r\n return (this.props.filter?.pagination as any) || this.defaultPagination\r\n }\r\n\r\n get rowsPerPageOptions(): number[] {\r\n return this.props.rowsPerPageOptions || [10, 25, 50, 100]\r\n }\r\n\r\n handleChangePage = (_: React.MouseEvent<HTMLButtonElement> | null, newPage: number) => {\r\n const store = createFilterStore<T>(this.props.filter ?? {}, this.defaultFilter)\r\n const { pageSize } = this.pagination\r\n const obj: IPagination = { page: newPage, pageSize }\r\n store.changePagination(obj)\r\n this.props.onChange?.(store.build())\r\n }\r\n\r\n handleChangeRowsPerPage = (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\r\n const newPageSize = parseInt(event.target.value, 10)\r\n const store = createFilterStore<T>(this.props.filter ?? {}, this.defaultFilter)\r\n store.changePagination({ page: 0, pageSize: newPageSize })\r\n this.props.onChange?.(store.build())\r\n }\r\n\r\n render() {\r\n const { page, pageSize } = this.pagination\r\n return (\r\n <TablePaginationCustom\r\n size='small'\r\n page={page}\r\n count={this.props.count || 0}\r\n onPageChange={this.handleChangePage}\r\n rowsPerPage={pageSize}\r\n onRowsPerPageChange={this.handleChangeRowsPerPage}\r\n rowsPerPageOptions={this.rowsPerPageOptions}\r\n labelRowsPerPage='Items per page'\r\n slotProps={{\r\n actions: { nextButton: { size: 'small' }, previousButton: { size: 'small' } },\r\n select: { MenuProps: { disableScrollLock: this.props.disableScrollLock } }\r\n }}\r\n />\r\n )\r\n }\r\n }\r\n return PaginationBar\r\n}\r\nexport default createPaginationBar\r\n\r\nconst TablePaginationCustom = styled((p: TablePaginationProps) => <TablePagination component='div' {...p} />)({\r\n '@media (min-width: 600px)': {\r\n '.MuiToolbar-root': {\r\n minHeight: '48px'\r\n }\r\n }\r\n})\r\n"],"names":["createPaginationBar","PaginationBar","_this","_classCallCheck","_len","arguments","length","args","Array","_key","_callSuper","this","concat","_defineProperty","_","newPage","_this$props$filter","_this$props$onChange","_this$props","store","createFilterStore","props","filter","defaultFilter","obj","page","pageSize","pagination","changePagination","onChange","call","build","event","_this$props$filter2","_this$props$onChange2","_this$props2","newPageSize","parseInt","target","value","_inherits","Component","_createClass","key","get","_this$defaultFilter","_this$props$filter3","defaultPagination","rowsPerPageOptions","_this$pagination","_jsx","TablePaginationCustom","size","count","onPageChange","handleChangePage","rowsPerPage","onRowsPerPageChange","handleChangeRowsPerPage","labelRowsPerPage","slotProps","actions","nextButton","previousButton","select","MenuProps","disableScrollLock","styled","p","TablePagination","_objectSpread","component","minHeight"],"mappings":"
|
|
1
|
+
{"version":3,"file":"create.pagination-bar.js","sources":["../../src/data-view/create.pagination-bar.tsx"],"sourcesContent":["import React, { Component, ComponentType } from 'react'\r\nimport { styled, TablePagination, TablePaginationProps } from '@mui/material'\r\nimport { createFilterStore } from './filter-store'\r\nimport { IFilterState, IPagination } from './types'\r\n\r\nexport interface IPaginationBarConfigs {\r\n rowsPerPageOptions?: number[]\r\n disableScrollLock?: boolean\r\n enablePaginationTop?: boolean\r\n}\r\n\r\nexport interface IPaginationBarProps<T> extends IPaginationBarConfigs {\r\n count?: number\r\n filter?: IFilterState<T>\r\n defaultFilter?: IFilterState<T>\r\n onChange?: (value: IFilterState<T>) => void\r\n}\r\n\r\nexport type IPaginationBarParams<T> = Pick<IPaginationBarProps<T>, 'defaultFilter' | 'rowsPerPageOptions'>\r\n\r\nexport function createPaginationBar<T>(): ComponentType<IPaginationBarProps<T>> {\r\n class PaginationBar extends Component<IPaginationBarProps<T>> {\r\n get defaultFilter(): IFilterState<T> {\r\n return this.props.defaultFilter || {}\r\n }\r\n\r\n get defaultPagination(): Required<IPagination> {\r\n return (this.defaultFilter?.pagination as any) || { page: 0, pageSize: 10 }\r\n }\r\n\r\n get pagination(): Required<IPagination> {\r\n return (this.props.filter?.pagination as any) || this.defaultPagination\r\n }\r\n\r\n get rowsPerPageOptions(): number[] {\r\n return this.props.rowsPerPageOptions || [10, 25, 50, 100]\r\n }\r\n\r\n handleChangePage = (_: React.MouseEvent<HTMLButtonElement> | null, newPage: number) => {\r\n const store = createFilterStore<T>(this.props.filter ?? {}, this.defaultFilter)\r\n const { pageSize } = this.pagination\r\n const obj: IPagination = { page: newPage, pageSize }\r\n store.changePagination(obj, { reason: 'pagination' })\r\n this.props.onChange?.(store.build())\r\n }\r\n\r\n handleChangeRowsPerPage = (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\r\n const newPageSize = parseInt(event.target.value, 10)\r\n const store = createFilterStore<T>(this.props.filter ?? {}, this.defaultFilter)\r\n store.changePagination({ page: 0, pageSize: newPageSize }, { reason: 'pagination' })\r\n this.props.onChange?.(store.build())\r\n }\r\n\r\n render() {\r\n const { page, pageSize } = this.pagination\r\n return (\r\n <TablePaginationCustom\r\n size='small'\r\n page={page}\r\n count={this.props.count || 0}\r\n onPageChange={this.handleChangePage}\r\n rowsPerPage={pageSize}\r\n onRowsPerPageChange={this.handleChangeRowsPerPage}\r\n rowsPerPageOptions={this.rowsPerPageOptions}\r\n labelRowsPerPage='Items per page'\r\n slotProps={{\r\n actions: { nextButton: { size: 'small' }, previousButton: { size: 'small' } },\r\n select: { MenuProps: { disableScrollLock: this.props.disableScrollLock } }\r\n }}\r\n />\r\n )\r\n }\r\n }\r\n return PaginationBar\r\n}\r\nexport default createPaginationBar\r\n\r\nconst TablePaginationCustom = styled((p: TablePaginationProps) => <TablePagination component='div' {...p} />)(({ theme }) => ({\r\n '@media (min-width: 600px)': {\r\n '.MuiToolbar-root': {\r\n minHeight: '48px'\r\n },\r\n },\r\n '.MuiTablePagination-selectLabel': {\r\n [theme.breakpoints.down('sm')]: {\r\n display: 'none'\r\n }\r\n }\r\n}))\r\n"],"names":["createPaginationBar","PaginationBar","_this","_classCallCheck","_len","arguments","length","args","Array","_key","_callSuper","this","concat","_defineProperty","_","newPage","_this$props$filter","_this$props$onChange","_this$props","store","createFilterStore","props","filter","defaultFilter","obj","page","pageSize","pagination","changePagination","reason","onChange","call","build","event","_this$props$filter2","_this$props$onChange2","_this$props2","newPageSize","parseInt","target","value","_inherits","Component","_createClass","key","get","_this$defaultFilter","_this$props$filter3","defaultPagination","rowsPerPageOptions","_this$pagination","_jsx","TablePaginationCustom","size","count","onPageChange","handleChangePage","rowsPerPage","onRowsPerPageChange","handleChangeRowsPerPage","labelRowsPerPage","slotProps","actions","nextButton","previousButton","select","MenuProps","disableScrollLock","styled","p","TablePagination","_objectSpread","component","_ref","theme","minHeight","breakpoints","down","display"],"mappings":"oWAoBgBA,IAAmB,IAC3BC,aAAc,SAAAA,IAAA,IAAAC,EAAAC,OAAAF,GAAA,IAAA,IAAAG,EAAAC,UAAAC,OAAAC,EAAAC,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAAF,EAAAE,GAAAJ,UAAAI,GA8BjB,OA9BiBP,EAAAQ,EAAAC,KAAAV,EAAAW,GAAAA,OAAAL,IAAAM,EAAAX,EAAA,oBAiBC,SAACY,EAA+CC,GAAmB,IAAAC,EAAAC,EAAAC,EAC9EC,EAAQC,UAAiBJ,EAAId,EAAKmB,MAAMC,cAAM,IAAAN,EAAAA,EAAI,CAAA,EAAId,EAAKqB,eAE3DC,EAAmB,CAAEC,KAAMV,EAASW,SADrBxB,EAAKyB,WAAlBD,UAERP,EAAMS,iBAAiBJ,EAAK,CAAEK,OAAQ,eACnBZ,QAAnBA,GAAAC,EAAAhB,EAAKmB,OAAMS,oBAAQb,GAAnBA,EAAAc,KAAAb,EAAsBC,EAAMa,YAC7BnB,EAAAX,EAEyB,2BAAA,SAAC+B,GAAoE,IAAAC,EAAAC,EAAAC,EACvFC,EAAcC,SAASL,EAAMM,OAAOC,MAAO,IAC3CrB,EAAQC,UAAiBc,EAAIhC,EAAKmB,MAAMC,cAAM,IAAAY,EAAAA,EAAI,CAAA,EAAIhC,EAAKqB,eACjEJ,EAAMS,iBAAiB,CAAEH,KAAM,EAAGC,SAAUW,GAAe,CAAER,OAAQ,eAClDM,QAAnBA,GAAAC,EAAAlC,EAAKmB,OAAMS,oBAAQK,GAAnBA,EAAAJ,KAAAK,EAAsBjB,EAAMa,YAC7B9B,CAAA,CAAA,OAAAuC,EAAAxC,EA9ByByC,GA8BzBC,EAAA1C,EAAA,CAAA,CAAA2C,IAAA,gBAAAC,IA7BD,WACE,OAAOlC,KAAKU,MAAME,eAAiB,CAAE,CACvC,GAAC,CAAAqB,IAAA,oBAAAC,IAED,WAAqB,IAAAC,EACnB,OAA0BA,QAAlBA,EAAAnC,KAAKY,qBAALuB,IAAkBA,OAAlBA,EAAAA,EAAoBnB,aAAsB,CAAEF,KAAM,EAAGC,SAAU,GACzE,GAAC,CAAAkB,IAAA,aAAAC,IAED,WAAc,IAAAE,EACZ,OAAyB,QAAjBA,EAAApC,KAAKU,MAAMC,cAAM,IAAAyB,OAAA,EAAjBA,EAAmBpB,aAAsBhB,KAAKqC,iBACxD,GAAC,CAAAJ,IAAA,qBAAAC,IAED,WACE,OAAOlC,KAAKU,MAAM4B,oBAAsB,CAAC,GAAI,GAAI,GAAI,IACvD,GAAC,CAAAL,IAAA,SAAAJ,MAiBD,WACE,IAAAU,EAA2BvC,KAAKgB,WAAxBF,EAAIyB,EAAJzB,KAAMC,EAAQwB,EAARxB,SACd,OACEyB,EAACC,EAAqB,CACpBC,KAAK,QACL5B,KAAMA,EACN6B,MAAO3C,KAAKU,MAAMiC,OAAS,EAC3BC,aAAc5C,KAAK6C,iBACnBC,YAAa/B,EACbgC,oBAAqB/C,KAAKgD,wBAC1BV,mBAAoBtC,KAAKsC,mBACzBW,iBAAiB,iBACjBC,UAAW,CACTC,QAAS,CAAEC,WAAY,CAAEV,KAAM,SAAWW,eAAgB,CAAEX,KAAM,UAClEY,OAAQ,CAAEC,UAAW,CAAEC,kBAAmBxD,KAAKU,MAAM8C,sBAI7D,IAAC,IAEH,OAAOlE,CACT,CAGA,IAAMmD,EAAwBgB,GAAO,SAACC,GAAuB,OAAKlB,EAACmB,EAAeC,EAAA,CAACC,UAAU,OAAUH,GAAK,GAA9ED,EAAgF,SAAAK,GAAA,IAAGC,EAAKD,EAALC,MAAK,MAAQ,CAC5H,4BAA6B,CAC3B,mBAAoB,CAClBC,UAAW,SAGf,kCAAiC9D,EAAA,GAC9B6D,EAAME,YAAYC,KAAK,MAAQ,CAC9BC,QAAS,SAGd"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createClass as t,objectSpread2 as e,toConsumableArray as i,defineProperty as a,objectWithoutProperties as s,toPropertyKey as r,classCallCheck as n}from"../_virtual/_rollupPluginBabelHelpers.js";import"dayjs";import"../utils/dayjs-config.js";import"react/jsx-runtime";import"react";import"react-router-dom";import{QueryParam as o}from"../utils/query-param.js";var h=function(){return t((function t(){var i=this,s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;n(this,t),a(this,"converToQueryParam",(function(t){var e=i.extractFilter();return t+o.stringify({filter:JSON.stringify(e)})}));var h=e({},s);null!=h&&h.details&&delete h.details,this._state=h,this._defaultFilter=r}),[{key:"state",get:function(){return e({},this._state)}},{key:"addFilterItem",value:function(t,s,r){var n,o,h=null!==(n=null===(o=this._state.filter)||void 0===o?void 0:o[t])&&void 0!==n?n:[];if(h.some((function(t){return t.value===s.value})))this._state=e(e({},this._state),{},{details:e(e({},r),{},{action:"add",isChanged:!1})});else{var u=[].concat(i(h),[s]),l=e(e({},this._state.filter),{},a({},t,u));this._state=e(e({},this._state),{},{filter:l,details:e(e({},r),{},{action:"add",isChanged:!0})})}return this}},{key:"removeFilterField",value:function(t,i){var a=this._state.filter;if(a&&a[t]&&a[t].length>0){a[t];var n=s(a,[t].map(r)),o=Object.keys(n).length>0;this._state=e(e({},this._state),{},{filter:o?n:void 0,details:e(e({},i),{},{action:"remove",isChanged:!0})})}return this}},{key:"removeFilterItem",value:function(t,i,n){var o=this._state.filter;if(!o||!o[t]||0===o[t].length)return this._state=e(e({},this._state),{},{details:e(e({},
|
|
1
|
+
import{createClass as t,objectSpread2 as e,toConsumableArray as i,defineProperty as a,objectWithoutProperties as s,toPropertyKey as r,classCallCheck as n}from"../_virtual/_rollupPluginBabelHelpers.js";import"dayjs";import"../utils/dayjs-config.js";import"react/jsx-runtime";import"react";import"react-router-dom";import{QueryParam as o}from"../utils/query-param.js";var h=function(){return t((function t(){var i=this,s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;n(this,t),a(this,"converToQueryParam",(function(t){var e=i.extractFilter();return t+o.stringify({filter:JSON.stringify(e)})}));var h=e({},s);null!=h&&h.details&&delete h.details,this._state=h,this._defaultFilter=r}),[{key:"state",get:function(){return e({},this._state)}},{key:"addFilterItem",value:function(t,s,r){var n,o,h=null!==(n=null===(o=this._state.filter)||void 0===o?void 0:o[t])&&void 0!==n?n:[];if(h.some((function(t){return t.value===s.value})))this._state=e(e({},this._state),{},{details:e(e({},r),{},{action:"add",reason:"filter",isChanged:!1})});else{var u=[].concat(i(h),[s]),l=e(e({},this._state.filter),{},a({},t,u));this._state=e(e({},this._state),{},{filter:l,details:e(e({},r),{},{action:"add",isChanged:!0})})}return this}},{key:"removeFilterField",value:function(t,i){var a=this._state.filter;if(a&&a[t]&&a[t].length>0){a[t];var n=s(a,[t].map(r)),o=Object.keys(n).length>0;this._state=e(e({},this._state),{},{filter:o?n:void 0,details:e(e({},i),{},{action:"remove",reason:"filter",isChanged:!0})})}return this}},{key:"removeFilterItem",value:function(t,i,n){var o=this._state.filter,h=e({action:"remove",reason:"filter"},n);if(!o||!o[t]||0===o[t].length)return this._state=e(e({},this._state),{},{details:e(e({},h),{},{isChanged:!1})}),this;var u=o[t],l=u.findIndex((function(t){return t.value===i}));if(-1===l)return this._state=e(e({},this._state),{},{details:e(e({},h),{},{isChanged:!1})}),this;var c=u.filter((function(t,e){return e!==l}));if(0===c.length){o[t];var d=s(o,[t].map(r)),v=Object.keys(d).length>0;this._state=e(e({},this._state),{},{filter:v?d:void 0,details:e(e({},h),{},{isChanged:!0})})}else{var f=e(e({},o),{},a({},t,c));this._state=e(e({},this._state),{},{filter:f,details:e(e({},h),{},{isChanged:!0})})}return this}},{key:"updateFilter",value:function(t,i){return this._state=e(e({},this._state),{},{filter:t,details:e(e({},i),{},{action:"change",reason:"filter",isChanged:!0})}),this}},{key:"addQuickSearch",value:function(t,a){var s,r=null!==(s=this._state.quickSearch)&&void 0!==s?s:[],n=null!=t?t:[],o=[].concat(i(Array.isArray(r)?r:[r]),i(Array.isArray(n)?n:[n])),h=Array.from(new Set(o)),u=new Set(Array.isArray(r)?r:[r]),l=h.length!==u.size||h.some((function(t){return!u.has(t)}));return l&&(this._state=e(e({},this._state),{},{quickSearch:h,details:e(e({},a),{},{action:"add",reason:"quickSearch",isChanged:l})})),this}},{key:"removeQuickSearch",value:function(t){return this._state=e(e({},this._state),{},{quickSearch:void 0,details:e(e({},t),{},{action:"remove",reason:"quickSearch",isChanged:!0})}),this}},{key:"removeQuickSearchItem",value:function(t,i){var a=this._state.quickSearch,s=e({action:"remove",reason:"quickSearch"},i);if(!a)return this._state=e(e({},this._state),{},{details:e(e({},s),{},{isChanged:!1})}),this;var r=Array.isArray(a)?a:[a];if(-1===r.indexOf(t))return this._state=e(e({},this._state),{},{details:e(e({},s),{},{isChanged:!1})}),this;var n=r.filter((function(e){return e!==t}));return 0===n.length?this._state=e(e({},this._state),{},{quickSearch:void 0,details:e(e({},s),{},{isChanged:!0})}):this._state=e(e({},this._state),{},{quickSearch:1===n.length?n[0]:n,details:e(e({},s),{},{isChanged:!0})}),this}},{key:"updateSearchInput",value:function(t){return this._state=e(e({},this._state),{},{quickSearch:t,details:{reason:"quickSearch",area:"input",action:"change",isChanged:!0}}),this}},{key:"changePagination",value:function(t){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{area:"filterButton"};return this._state=e(e({},this._state),{},{pagination:t,details:e(e({},i),{},{action:"change",reason:"pagination",isChanged:!0})}),this}},{key:"removePagination",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{area:"filterButton"};return this._state=e(e({},this._state),{},{pagination:void 0,details:e(e({},t),{},{action:"remove",reason:"pagination",isChanged:!0})}),this}},{key:"changeSort",value:function(t){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{area:"sortButton"};return this._state=e(e({},this._state),{},{sort:t,details:e(e({},i),{},{action:"change",reason:"sort"})}),this}},{key:"removeSort",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{area:"sortButton"};return this._state=e(e({},this._state),{},{sort:void 0,details:e(e({},t),{},{action:"remove",reason:"sort"})}),this}},{key:"toggleSortDirection",value:function(t){var i=this._state.sort;if(!i)return this;var a=e(e({},i),{},{direction:"asc"===i.direction?"desc":"asc"});return this._state=e(e({},this._state),{},{sort:a,details:e(e({},t),{},{action:"change",reason:"sort"})}),this}},{key:"updateState",value:function(t){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{area:"filterButton"};return this._state=e(e(e({},this._state),t),{},{details:e(e({},i),{},{action:"change"})}),this}},{key:"reset",value:function(){return this._state=e(e({},this._defaultFilter),{},{details:{action:"reset",isChanged:!0}}),this}},{key:"resetFilter",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{area:"filterButton"};return this._state=e(e({},this._state),{},{filter:void 0,details:e({action:"reset",reason:"filter"},t)}),this}},{key:"resetQuickSearch",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{area:"input"};return this._state=e(e({},this._state),{},{quickSearch:void 0,details:e({action:"reset",reason:"quickSearch"},t)}),this}},{key:"resetPagination",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{reason:"pagination"};return this._state=e(e({},this._state),{},{pagination:void 0,details:e({action:"reset",reason:"pagination"},t)}),this}},{key:"resetSort",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{reason:"sort"};return this._state=e(e({},this._state),{},{sort:void 0,details:e({action:"reset",reason:"sort"},t)}),this}},{key:"isPaginationEqualToDefault",value:function(){var t,e=this._state.pagination,i=null===(t=this._defaultFilter)||void 0===t?void 0:t.pagination;return!e&&!i||!(!e||!i)&&(e.page===i.page&&e.pageSize===i.pageSize)}},{key:"isSortEqualToDefault",value:function(){var t,e=this._state.sort,i=null===(t=this._defaultFilter)||void 0===t?void 0:t.sort;return!e&&!i||!(!e||!i)&&(e.field===i.field&&e.direction===i.direction)}},{key:"extractFilter",value:function(){var t={};return this._state.filter&&(t.filter=this._state.filter),this._state.quickSearch&&(t.quickSearch=this._state.quickSearch),this._state.pagination&&!this.isPaginationEqualToDefault()&&(t.pagination=this._state.pagination),this._state.sort&&!this.isSortEqualToDefault()&&(t.sort=this._state.sort),t}},{key:"countFilterItems",value:function(){var t=this._state.filter;return t?Object.values(t).reduce((function(t,e){return t+(Array.isArray(e)?e.length:0)}),0):0}},{key:"hasFilter",value:function(){return!!this._state.filter&&Object.keys(this._state.filter).length>0}},{key:"hasQuickSearch",value:function(){return!!this._state.quickSearch}},{key:"hasPagination",value:function(){return!this.isPaginationEqualToDefault()&&!!this._state.pagination}},{key:"hasSort",value:function(){return!this.isSortEqualToDefault()&&!!this._state.sort}},{key:"isEmpty",value:function(){return!(this.hasFilter()||this.hasQuickSearch()||this.hasPagination()||this.hasSort())}},{key:"build",value:function(){return e({},this._state)}}])}();function u(t,e){return new h(t,e)}export{h as FilterStore,u as createFilterStore,h as default};
|
|
2
2
|
//# sourceMappingURL=filter-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-store.js","sources":["../../src/data-view/filter-store.ts"],"sourcesContent":["import { QueryParam } from '../utils'\r\nimport { IFilterState, IFilterMap, IPagination, ISort, IFilterChangeDetails, IFilterItem, SingleOrArray } from './types'\r\n\r\nexport class FilterStore<T> {\r\n private _state: IFilterState<T>\r\n private _defaultFilter: IFilterState<T> | undefined\r\n\r\n constructor(initialState: IFilterState<T> = {}, defaultFilter?: IFilterState<T>) {\r\n const obj = { ...initialState }\r\n if (obj?.details) delete obj.details // Ensure details are not included in the initial state\r\n this._state = obj\r\n this._defaultFilter = defaultFilter\r\n }\r\n\r\n // Static factory method\r\n // static initialize<T>(filterState: IFilterState<T>, defaultFilter?: IFilterState<T>): FilterStore<T> {\r\n // if (filterState?.details) delete filterState.details // Ensure details are not included in the initial state\r\n // return new FilterStore(filterState, defaultFilter)\r\n // }\r\n\r\n // Getter for current state\r\n get state(): IFilterState<T> {\r\n return { ...this._state }\r\n }\r\n\r\n // Filter operations\r\n addFilterItem(field: keyof T, filterItem: IFilterItem, details?: IFilterChangeDetails): FilterStore<T> {\r\n const existingFieldItems = this._state.filter?.[field] ?? []\r\n\r\n // Check if item already exists to avoid duplicates\r\n const itemExists = existingFieldItems.some((item) => item.value === filterItem.value)\r\n\r\n if (!itemExists) {\r\n const newFieldItems = [...existingFieldItems, filterItem]\r\n const updatedFilter = { ...this._state.filter, [field]: newFieldItems } as IFilterMap<T>\r\n\r\n this._state = { ...this._state, filter: updatedFilter, details: { ...details, action: 'add', isChanged: true } }\r\n } else {\r\n // If item already exists, mark as not changed\r\n this._state = { ...this._state, details: { ...details, action: 'add', isChanged: false } }\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeFilterField(field: keyof T, details?: IFilterChangeDetails): FilterStore<T> {\r\n const existingFilter = this._state.filter\r\n\r\n // Check if field exists and has items\r\n const fieldExists = existingFilter && existingFilter[field] && existingFilter[field]!.length > 0\r\n\r\n if (fieldExists) {\r\n // Create new filter without the specified field\r\n const { [field]: removedField, ...remainingFilter } = existingFilter!\r\n\r\n // Check if there are any remaining fields\r\n const hasRemainingFields = Object.keys(remainingFilter).length > 0\r\n\r\n this._state = {\r\n ...this._state,\r\n filter: hasRemainingFields ? (remainingFilter as IFilterMap<T>) : undefined,\r\n details: { ...details, action: 'remove', isChanged: true }\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeFilterItem(field: keyof T, value: string, details?: IFilterChangeDetails): FilterStore<T> {\r\n const existingFilter = this._state.filter\r\n\r\n // Check if field exists and has items\r\n if (!existingFilter || !existingFilter[field] || existingFilter[field]!.length === 0) {\r\n // Field doesn't exist or is empty, mark as not changed\r\n this._state = { ...this._state, details: { ...details, action: 'remove', isChanged: false } }\r\n return this\r\n }\r\n\r\n const fieldItems = existingFilter[field]!\r\n\r\n // Find the item to remove\r\n const itemIndex = fieldItems.findIndex((item) => item.value === value)\r\n\r\n if (itemIndex === -1) {\r\n // Item not found, mark as not changed\r\n this._state = { ...this._state, details: { ...details, action: 'remove', isChanged: false } }\r\n return this\r\n }\r\n\r\n // Remove the specific item\r\n const updatedFieldItems = fieldItems.filter((_, index) => index !== itemIndex)\r\n\r\n // If no items left in the field, remove the field entirely\r\n if (updatedFieldItems.length === 0) {\r\n const { [field]: removedField, ...remainingFilter } = existingFilter\r\n const hasRemainingFields = Object.keys(remainingFilter).length > 0\r\n\r\n this._state = {\r\n ...this._state,\r\n filter: hasRemainingFields ? (remainingFilter as IFilterMap<T>) : undefined,\r\n details: { ...details, action: 'remove', isChanged: true }\r\n }\r\n } else {\r\n // Update the field with remaining items\r\n const updatedFilter = { ...existingFilter, [field]: updatedFieldItems } as IFilterMap<T>\r\n\r\n this._state = {\r\n ...this._state,\r\n filter: updatedFilter,\r\n details: { ...details, action: 'remove', isChanged: true }\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n updateFilter(filter?: IFilterMap<T>, details?: IFilterChangeDetails) {\r\n this._state = { ...this._state, filter, details: { ...details, action: 'change' } }\r\n return this\r\n }\r\n\r\n // Quick search operations\r\n addQuickSearch(value?: SingleOrArray<string>, details?: IFilterChangeDetails): FilterStore<T> {\r\n const currentValues = this._state.quickSearch ?? []\r\n const newValues = value ?? []\r\n\r\n // Merge current and new values\r\n const allValues = [...(Array.isArray(currentValues) ? currentValues : [currentValues]), ...(Array.isArray(newValues) ? newValues : [newValues])]\r\n\r\n // Remove duplicates\r\n const uniqueValues = Array.from(new Set(allValues))\r\n\r\n // Check if changed\r\n const currentSet = new Set(Array.isArray(currentValues) ? currentValues : [currentValues])\r\n const isChanged = uniqueValues.length !== currentSet.size || uniqueValues.some((val) => !currentSet.has(val))\r\n\r\n if (isChanged) {\r\n this._state = { ...this._state, quickSearch: uniqueValues, details: { ...details, action: 'add', isChanged } }\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeQuickSearch(details?: IFilterChangeDetails): FilterStore<T> {\r\n this._state = { ...this._state, quickSearch: undefined, details: { ...details, action: 'remove', isChanged: true } }\r\n return this\r\n }\r\n\r\n removeQuickSearchItem(value: string, details?: IFilterChangeDetails): FilterStore<T> {\r\n const currentValues = this._state.quickSearch\r\n\r\n // Check if quickSearch exists and has values\r\n if (!currentValues) {\r\n // No quickSearch to remove from, mark as not changed\r\n this._state = { ...this._state, details: { ...details, action: 'remove', isChanged: false } }\r\n return this\r\n }\r\n\r\n // Convert to array for consistent handling\r\n const valuesArray = Array.isArray(currentValues) ? currentValues : [currentValues]\r\n\r\n // Check if the value exists\r\n const valueIndex = valuesArray.indexOf(value)\r\n\r\n if (valueIndex === -1) {\r\n // Value not found, mark as not changed\r\n this._state = { ...this._state, details: { ...details, action: 'remove', isChanged: false } }\r\n return this\r\n }\r\n\r\n // Remove the specific value\r\n const updatedValues = valuesArray.filter((val) => val !== value)\r\n\r\n // If no values left, remove quickSearch entirely\r\n if (updatedValues.length === 0) {\r\n this._state = {\r\n ...this._state,\r\n quickSearch: undefined,\r\n details: { ...details, action: 'remove', isChanged: true }\r\n }\r\n } else {\r\n // Update with remaining values\r\n this._state = {\r\n ...this._state,\r\n quickSearch: updatedValues.length === 1 ? updatedValues[0] : updatedValues,\r\n details: { ...details, action: 'remove', isChanged: true }\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n updateSearchInput(quickSearch: SingleOrArray<string>): FilterStore<T> {\r\n this._state = { ...this._state, quickSearch, details: { reason: 'quickSearch', area: 'input', action: 'change', isChanged: true } }\r\n return this\r\n }\r\n\r\n // Pagination operations\r\n changePagination(pagination: IPagination, details: IFilterChangeDetails = { area: 'filterButton' }): FilterStore<T> {\r\n this._state = { ...this._state, pagination, details: { ...details, action: 'change', isChanged: true } }\r\n return this\r\n }\r\n\r\n removePagination(details: IFilterChangeDetails = { area: 'filterButton' }): FilterStore<T> {\r\n this._state = { ...this._state, pagination: undefined, details: { ...details, action: 'remove', isChanged: true } }\r\n return this\r\n }\r\n\r\n // Sort operations\r\n changeSort(sort: ISort<T>, details: IFilterChangeDetails = { area: 'sortButton' }): FilterStore<T> {\r\n this._state = { ...this._state, sort, details: { ...details, action: 'change' } }\r\n return this\r\n }\r\n\r\n removeSort(details: IFilterChangeDetails = { area: 'sortButton' }): FilterStore<T> {\r\n this._state = { ...this._state, sort: undefined, details: { ...details, action: 'remove' } }\r\n return this\r\n }\r\n\r\n toggleSortDirection(details: IFilterChangeDetails): FilterStore<T> {\r\n const currentSort = this._state.sort\r\n if (!currentSort) return this\r\n const finalSort: ISort<T> = { ...currentSort, direction: currentSort.direction === 'asc' ? 'desc' : 'asc' }\r\n this._state = { ...this._state, sort: finalSort, details: { ...details, action: 'change' } }\r\n return this\r\n }\r\n\r\n // Batch operations\r\n updateState(updates: Partial<IFilterState<T>>, details: IFilterChangeDetails = { area: 'filterButton' }): FilterStore<T> {\r\n this._state = { ...this._state, ...updates, details: { ...details, action: 'change' } }\r\n return this\r\n }\r\n\r\n // Reset operations\r\n reset(): FilterStore<T> {\r\n this._state = { ...this._defaultFilter, details: { action: 'reset', isChanged: true } }\r\n return this\r\n }\r\n\r\n resetFilter(details: IFilterChangeDetails = { area: 'filterButton' }): FilterStore<T> {\r\n this._state = { ...this._state, filter: undefined, details: { action: 'reset', reason: 'field', ...details } }\r\n return this\r\n }\r\n\r\n resetQuickSearch(details: IFilterChangeDetails = { area: 'input' }): FilterStore<T> {\r\n this._state = { ...this._state, quickSearch: undefined, details: { action: 'reset', reason: 'quickSearch', ...details } }\r\n return this\r\n }\r\n\r\n resetPagination(details: IFilterChangeDetails = { reason: 'pagination' }): FilterStore<T> {\r\n this._state = { ...this._state, pagination: undefined, details: { action: 'reset', reason: 'pagination', ...details } }\r\n return this\r\n }\r\n\r\n resetSort(details: IFilterChangeDetails = { reason: 'sort' }): FilterStore<T> {\r\n this._state = { ...this._state, sort: undefined, details: { action: 'reset', reason: 'sort', ...details } }\r\n return this\r\n }\r\n\r\n // Utility methods\r\n private isPaginationEqualToDefault(): boolean {\r\n const curentVal = this._state.pagination\r\n const defaultVal = this._defaultFilter?.pagination\r\n\r\n if (!curentVal && !defaultVal) return true\r\n if (!curentVal || !defaultVal) return false\r\n\r\n return curentVal.page === defaultVal.page && curentVal.pageSize === defaultVal.pageSize\r\n }\r\n\r\n private isSortEqualToDefault(): boolean {\r\n const currentVal = this._state.sort\r\n const defaultVal = this._defaultFilter?.sort\r\n\r\n if (!currentVal && !defaultVal) return true\r\n if (!currentVal || !defaultVal) return false\r\n\r\n return currentVal.field === defaultVal.field && currentVal.direction === defaultVal.direction\r\n }\r\n\r\n extractFilter(): IFilterState<T> {\r\n const result: IFilterState<T> = {}\r\n\r\n // Include filter if it exists\r\n if (this._state.filter) {\r\n result.filter = this._state.filter\r\n }\r\n\r\n // Include quickSearch if it exists\r\n if (this._state.quickSearch) {\r\n result.quickSearch = this._state.quickSearch\r\n }\r\n\r\n // Include pagination only if it's different from default\r\n if (this._state.pagination && !this.isPaginationEqualToDefault()) {\r\n result.pagination = this._state.pagination\r\n }\r\n\r\n // Include sort only if it's different from default\r\n if (this._state.sort && !this.isSortEqualToDefault()) {\r\n result.sort = this._state.sort\r\n }\r\n\r\n return result\r\n }\r\n\r\n countFilterItems(): number {\r\n const filter = this._state.filter\r\n if (!filter) return 0\r\n\r\n return Object.values(filter).reduce<number>((count, items) => {\r\n // If items is an array and return its length, otherwise return 0\r\n return count + (Array.isArray(items) ? items.length : 0)\r\n }, 0)\r\n }\r\n\r\n hasFilter(): boolean {\r\n return !!this._state.filter && Object.keys(this._state.filter).length > 0\r\n }\r\n\r\n hasQuickSearch(): boolean {\r\n return !!this._state.quickSearch\r\n }\r\n\r\n hasPagination(): boolean {\r\n if (this.isPaginationEqualToDefault()) return false\r\n return !!this._state.pagination\r\n }\r\n\r\n hasSort(): boolean {\r\n if (this.isSortEqualToDefault()) return false\r\n return !!this._state.sort\r\n }\r\n\r\n isEmpty(): boolean {\r\n return !this.hasFilter() && !this.hasQuickSearch() && !this.hasPagination() && !this.hasSort()\r\n }\r\n\r\n converToQueryParam = (base: string) => {\r\n const extractFilter = this.extractFilter()\r\n const queryString = QueryParam.stringify({ filter: JSON.stringify(extractFilter) })\r\n return base + queryString\r\n }\r\n\r\n // Build the final state\r\n build(): IFilterState<T> {\r\n return { ...this._state }\r\n }\r\n}\r\nexport default FilterStore\r\n\r\nexport function createFilterStore<T>(filterState: IFilterState<T>, defaultFilter?: IFilterState<T>): FilterStore<T> {\r\n return new FilterStore(filterState, defaultFilter)\r\n}\r\n"],"names":["FilterStore","_createClass","_this","this","initialState","arguments","length","undefined","defaultFilter","_classCallCheck","_defineProperty","base","extractFilter","QueryParam","stringify","filter","JSON","obj","_objectSpread","details","_state","_defaultFilter","key","get","value","field","filterItem","_this$_state$filter$f","_this$_state$filter","existingFieldItems","some","item","action","isChanged","newFieldItems","concat","_toConsumableArray","updatedFilter","existingFilter","remainingFilter","_objectWithoutProperties","map","_toPropertyKey","hasRemainingFields","Object","keys","fieldItems","itemIndex","findIndex","updatedFieldItems","_","index","_this$_state$quickSea","currentValues","quickSearch","newValues","allValues","Array","isArray","uniqueValues","from","Set","currentSet","size","val","has","valuesArray","indexOf","updatedValues","reason","area","pagination","sort","currentSort","finalSort","direction","updates","_this$_defaultFilter","curentVal","defaultVal","page","pageSize","_this$_defaultFilter2","currentVal","result","isPaginationEqualToDefault","isSortEqualToDefault","values","reduce","count","items","hasFilter","hasQuickSearch","hasPagination","hasSort","createFilterStore","filterState"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"filter-store.js","sources":["../../src/data-view/filter-store.ts"],"sourcesContent":["import { QueryParam } from '../utils'\r\nimport { IFilterState, IFilterMap, IPagination, ISort, IFilterChangeDetails, IFilterItem, SingleOrArray } from './types'\r\n\r\nexport class FilterStore<T> {\r\n private _state: IFilterState<T>\r\n private _defaultFilter: IFilterState<T> | undefined\r\n\r\n constructor(initialState: IFilterState<T> = {}, defaultFilter?: IFilterState<T>) {\r\n const obj = { ...initialState }\r\n if (obj?.details) delete obj.details // Ensure details are not included in the initial state\r\n this._state = obj\r\n this._defaultFilter = defaultFilter\r\n }\r\n\r\n // Static factory method\r\n // static initialize<T>(filterState: IFilterState<T>, defaultFilter?: IFilterState<T>): FilterStore<T> {\r\n // if (filterState?.details) delete filterState.details // Ensure details are not included in the initial state\r\n // return new FilterStore(filterState, defaultFilter)\r\n // }\r\n\r\n // Getter for current state\r\n get state(): IFilterState<T> {\r\n return { ...this._state }\r\n }\r\n\r\n // Filter operations\r\n addFilterItem(field: keyof T, filterItem: IFilterItem, details?: IFilterChangeDetails): FilterStore<T> {\r\n const existingFieldItems = this._state.filter?.[field] ?? []\r\n\r\n // Check if item already exists to avoid duplicates\r\n const itemExists = existingFieldItems.some((item) => item.value === filterItem.value)\r\n\r\n if (!itemExists) {\r\n const newFieldItems = [...existingFieldItems, filterItem]\r\n const updatedFilter = { ...this._state.filter, [field]: newFieldItems } as IFilterMap<T>\r\n\r\n this._state = { ...this._state, filter: updatedFilter, details: { ...details, action: 'add', isChanged: true } }\r\n } else {\r\n // If item already exists, mark as not changed\r\n this._state = { ...this._state, details: { ...details, action: 'add', reason: 'filter', isChanged: false } }\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeFilterField(field: keyof T, details?: IFilterChangeDetails): FilterStore<T> {\r\n const existingFilter = this._state.filter\r\n\r\n // Check if field exists and has items\r\n const fieldExists = existingFilter && existingFilter[field] && existingFilter[field]!.length > 0\r\n\r\n if (fieldExists) {\r\n // Create new filter without the specified field\r\n const { [field]: removedField, ...remainingFilter } = existingFilter!\r\n\r\n // Check if there are any remaining fields\r\n const hasRemainingFields = Object.keys(remainingFilter).length > 0\r\n\r\n this._state = {\r\n ...this._state,\r\n filter: hasRemainingFields ? (remainingFilter as IFilterMap<T>) : undefined,\r\n details: { ...details, action: 'remove', reason: 'filter', isChanged: true }\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeFilterItem(field: keyof T, value: string, details?: IFilterChangeDetails): FilterStore<T> {\r\n const existingFilter = this._state.filter\r\n const defaultDetails: IFilterChangeDetails = { action: 'remove', reason: 'filter', ...details }\r\n\r\n // Check if field exists and has items\r\n if (!existingFilter || !existingFilter[field] || existingFilter[field]!.length === 0) {\r\n // Field doesn't exist or is empty, mark as not changed\r\n this._state = { ...this._state, details: { ...defaultDetails, isChanged: false } }\r\n return this\r\n }\r\n\r\n const fieldItems = existingFilter[field]!\r\n\r\n // Find the item to remove\r\n const itemIndex = fieldItems.findIndex((item) => item.value === value)\r\n\r\n if (itemIndex === -1) {\r\n // Item not found, mark as not changed\r\n this._state = { ...this._state, details: { ...defaultDetails, isChanged: false } }\r\n return this\r\n }\r\n\r\n // Remove the specific item\r\n const updatedFieldItems = fieldItems.filter((_, index) => index !== itemIndex)\r\n\r\n // If no items left in the field, remove the field entirely\r\n if (updatedFieldItems.length === 0) {\r\n const { [field]: removedField, ...remainingFilter } = existingFilter\r\n const hasRemainingFields = Object.keys(remainingFilter).length > 0\r\n\r\n this._state = {\r\n ...this._state,\r\n filter: hasRemainingFields ? (remainingFilter as IFilterMap<T>) : undefined,\r\n details: { ...defaultDetails, isChanged: true }\r\n }\r\n } else {\r\n // Update the field with remaining items\r\n const updatedFilter = { ...existingFilter, [field]: updatedFieldItems } as IFilterMap<T>\r\n\r\n this._state = {\r\n ...this._state,\r\n filter: updatedFilter,\r\n details: { ...defaultDetails, isChanged: true }\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n updateFilter(filter?: IFilterMap<T>, details?: IFilterChangeDetails) {\r\n this._state = { ...this._state, filter, details: { ...details, action: 'change', reason: 'filter', isChanged: true } }\r\n return this\r\n }\r\n\r\n // Quick search operations\r\n addQuickSearch(value?: SingleOrArray<string>, details?: IFilterChangeDetails): FilterStore<T> {\r\n const currentValues = this._state.quickSearch ?? []\r\n const newValues = value ?? []\r\n\r\n // Merge current and new values\r\n const allValues = [...(Array.isArray(currentValues) ? currentValues : [currentValues]), ...(Array.isArray(newValues) ? newValues : [newValues])]\r\n\r\n // Remove duplicates\r\n const uniqueValues = Array.from(new Set(allValues))\r\n\r\n // Check if changed\r\n const currentSet = new Set(Array.isArray(currentValues) ? currentValues : [currentValues])\r\n const isChanged = uniqueValues.length !== currentSet.size || uniqueValues.some((val) => !currentSet.has(val))\r\n\r\n if (isChanged) {\r\n this._state = { ...this._state, quickSearch: uniqueValues, details: { ...details, action: 'add', reason: 'quickSearch', isChanged } }\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeQuickSearch(details?: IFilterChangeDetails): FilterStore<T> {\r\n this._state = { ...this._state, quickSearch: undefined, details: { ...details, action: 'remove', reason: 'quickSearch', isChanged: true } }\r\n return this\r\n }\r\n\r\n removeQuickSearchItem(value: string, details?: IFilterChangeDetails): FilterStore<T> {\r\n const currentValues = this._state.quickSearch\r\n const defaultDetails: IFilterChangeDetails = { action: 'remove', reason: 'quickSearch', ...details }\r\n\r\n // Check if quickSearch exists and has values\r\n if (!currentValues) {\r\n // No quickSearch to remove from, mark as not changed\r\n this._state = { ...this._state, details: { ...defaultDetails, isChanged: false } }\r\n return this\r\n }\r\n\r\n // Convert to array for consistent handling\r\n const valuesArray = Array.isArray(currentValues) ? currentValues : [currentValues]\r\n\r\n // Check if the value exists\r\n const valueIndex = valuesArray.indexOf(value)\r\n\r\n if (valueIndex === -1) {\r\n // Value not found, mark as not changed\r\n this._state = { ...this._state, details: { ...defaultDetails, isChanged: false } }\r\n return this\r\n }\r\n\r\n // Remove the specific value\r\n const updatedValues = valuesArray.filter((val) => val !== value)\r\n\r\n // If no values left, remove quickSearch entirely\r\n if (updatedValues.length === 0) {\r\n this._state = {\r\n ...this._state,\r\n quickSearch: undefined,\r\n details: { ...defaultDetails, isChanged: true }\r\n }\r\n } else {\r\n // Update with remaining values\r\n this._state = {\r\n ...this._state,\r\n quickSearch: updatedValues.length === 1 ? updatedValues[0] : updatedValues,\r\n details: { ...defaultDetails, isChanged: true }\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n updateSearchInput(quickSearch: SingleOrArray<string>): FilterStore<T> {\r\n this._state = { ...this._state, quickSearch, details: { reason: 'quickSearch', area: 'input', action: 'change', isChanged: true } }\r\n return this\r\n }\r\n\r\n // Pagination operations\r\n changePagination(pagination: IPagination, details: IFilterChangeDetails = { area: 'filterButton' }): FilterStore<T> {\r\n this._state = { ...this._state, pagination, details: { ...details, action: 'change', reason: 'pagination', isChanged: true } }\r\n return this\r\n }\r\n\r\n removePagination(details: IFilterChangeDetails = { area: 'filterButton' }): FilterStore<T> {\r\n this._state = { ...this._state, pagination: undefined, details: { ...details, action: 'remove', reason: 'pagination', isChanged: true } }\r\n return this\r\n }\r\n\r\n // Sort operations\r\n changeSort(sort: ISort<T>, details: IFilterChangeDetails = { area: 'sortButton' }): FilterStore<T> {\r\n this._state = { ...this._state, sort, details: { ...details, action: 'change', reason: 'sort' } }\r\n return this\r\n }\r\n\r\n removeSort(details: IFilterChangeDetails = { area: 'sortButton' }): FilterStore<T> {\r\n this._state = { ...this._state, sort: undefined, details: { ...details, action: 'remove', reason: 'sort' } }\r\n return this\r\n }\r\n\r\n toggleSortDirection(details: IFilterChangeDetails): FilterStore<T> {\r\n const currentSort = this._state.sort\r\n if (!currentSort) return this\r\n const finalSort: ISort<T> = { ...currentSort, direction: currentSort.direction === 'asc' ? 'desc' : 'asc' }\r\n this._state = { ...this._state, sort: finalSort, details: { ...details, action: 'change', reason: 'sort' } }\r\n return this\r\n }\r\n\r\n // Batch operations\r\n updateState(updates: Partial<IFilterState<T>>, details: IFilterChangeDetails = { area: 'filterButton' }): FilterStore<T> {\r\n this._state = { ...this._state, ...updates, details: { ...details, action: 'change' } }\r\n return this\r\n }\r\n\r\n // Reset operations\r\n reset(): FilterStore<T> {\r\n this._state = { ...this._defaultFilter, details: { action: 'reset', isChanged: true } }\r\n return this\r\n }\r\n\r\n resetFilter(details: IFilterChangeDetails = { area: 'filterButton' }): FilterStore<T> {\r\n this._state = { ...this._state, filter: undefined, details: { action: 'reset', reason: 'filter', ...details } }\r\n return this\r\n }\r\n\r\n resetQuickSearch(details: IFilterChangeDetails = { area: 'input' }): FilterStore<T> {\r\n this._state = { ...this._state, quickSearch: undefined, details: { action: 'reset', reason: 'quickSearch', ...details } }\r\n return this\r\n }\r\n\r\n resetPagination(details: IFilterChangeDetails = { reason: 'pagination' }): FilterStore<T> {\r\n this._state = { ...this._state, pagination: undefined, details: { action: 'reset', reason: 'pagination', ...details } }\r\n return this\r\n }\r\n\r\n resetSort(details: IFilterChangeDetails = { reason: 'sort' }): FilterStore<T> {\r\n this._state = { ...this._state, sort: undefined, details: { action: 'reset', reason: 'sort', ...details } }\r\n return this\r\n }\r\n\r\n // Utility methods\r\n private isPaginationEqualToDefault(): boolean {\r\n const curentVal = this._state.pagination\r\n const defaultVal = this._defaultFilter?.pagination\r\n\r\n if (!curentVal && !defaultVal) return true\r\n if (!curentVal || !defaultVal) return false\r\n\r\n return curentVal.page === defaultVal.page && curentVal.pageSize === defaultVal.pageSize\r\n }\r\n\r\n private isSortEqualToDefault(): boolean {\r\n const currentVal = this._state.sort\r\n const defaultVal = this._defaultFilter?.sort\r\n\r\n if (!currentVal && !defaultVal) return true\r\n if (!currentVal || !defaultVal) return false\r\n\r\n return currentVal.field === defaultVal.field && currentVal.direction === defaultVal.direction\r\n }\r\n\r\n extractFilter(): IFilterState<T> {\r\n const result: IFilterState<T> = {}\r\n\r\n // Include filter if it exists\r\n if (this._state.filter) {\r\n result.filter = this._state.filter\r\n }\r\n\r\n // Include quickSearch if it exists\r\n if (this._state.quickSearch) {\r\n result.quickSearch = this._state.quickSearch\r\n }\r\n\r\n // Include pagination only if it's different from default\r\n if (this._state.pagination && !this.isPaginationEqualToDefault()) {\r\n result.pagination = this._state.pagination\r\n }\r\n\r\n // Include sort only if it's different from default\r\n if (this._state.sort && !this.isSortEqualToDefault()) {\r\n result.sort = this._state.sort\r\n }\r\n\r\n return result\r\n }\r\n\r\n countFilterItems(): number {\r\n const filter = this._state.filter\r\n if (!filter) return 0\r\n\r\n return Object.values(filter).reduce<number>((count, items) => {\r\n // If items is an array and return its length, otherwise return 0\r\n return count + (Array.isArray(items) ? items.length : 0)\r\n }, 0)\r\n }\r\n\r\n hasFilter(): boolean {\r\n return !!this._state.filter && Object.keys(this._state.filter).length > 0\r\n }\r\n\r\n hasQuickSearch(): boolean {\r\n return !!this._state.quickSearch\r\n }\r\n\r\n hasPagination(): boolean {\r\n if (this.isPaginationEqualToDefault()) return false\r\n return !!this._state.pagination\r\n }\r\n\r\n hasSort(): boolean {\r\n if (this.isSortEqualToDefault()) return false\r\n return !!this._state.sort\r\n }\r\n\r\n isEmpty(): boolean {\r\n return !this.hasFilter() && !this.hasQuickSearch() && !this.hasPagination() && !this.hasSort()\r\n }\r\n\r\n converToQueryParam = (base: string) => {\r\n const extractFilter = this.extractFilter()\r\n const queryString = QueryParam.stringify({ filter: JSON.stringify(extractFilter) })\r\n return base + queryString\r\n }\r\n\r\n // Build the final state\r\n build(): IFilterState<T> {\r\n return { ...this._state }\r\n }\r\n}\r\nexport default FilterStore\r\n\r\nexport function createFilterStore<T>(filterState: IFilterState<T>, defaultFilter?: IFilterState<T>): FilterStore<T> {\r\n return new FilterStore(filterState, defaultFilter)\r\n}\r\n"],"names":["FilterStore","_createClass","_this","this","initialState","arguments","length","undefined","defaultFilter","_classCallCheck","_defineProperty","base","extractFilter","QueryParam","stringify","filter","JSON","obj","_objectSpread","details","_state","_defaultFilter","key","get","value","field","filterItem","_this$_state$filter$f","_this$_state$filter","existingFieldItems","some","item","action","reason","isChanged","newFieldItems","concat","_toConsumableArray","updatedFilter","existingFilter","remainingFilter","_objectWithoutProperties","map","_toPropertyKey","hasRemainingFields","Object","keys","defaultDetails","fieldItems","itemIndex","findIndex","updatedFieldItems","_","index","_this$_state$quickSea","currentValues","quickSearch","newValues","allValues","Array","isArray","uniqueValues","from","Set","currentSet","size","val","has","valuesArray","indexOf","updatedValues","area","pagination","sort","currentSort","finalSort","direction","updates","_this$_defaultFilter","curentVal","defaultVal","page","pageSize","_this$_defaultFilter2","currentVal","result","isPaginationEqualToDefault","isSortEqualToDefault","values","reduce","count","items","hasFilter","hasQuickSearch","hasPagination","hasSort","createFilterStore","filterState"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sources":["../../src/data-view/types.ts"],"sourcesContent":["import type { ReactNode } from 'react'\r\nimport type { ButtonProps } from '@mui/material'\r\nimport type { IFilterNotesProps } from './ui.units'\r\n\r\nexport type SingleOrArray<T> = T | T[]\r\n\r\nexport type IRelativePosition = 'above' | 'below' | 'left' | 'right'\r\n\r\nexport type IPositionElementDef = { [key in IRelativePosition]?: ReactNode }\r\n\r\nexport type IPositionElement<K extends IRelativePosition = IRelativePosition> = Pick<IPositionElementDef, K>\r\n\r\nexport enum EViewStatus {\r\n Loading = 'Loading',\r\n Loaded = 'Loaded',\r\n Error = 'Error'\r\n}\r\n\r\nexport type IFilterArea = 'input' | 'filterButton' | 'sortButton'\r\nexport type IFilterReason = '
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../../src/data-view/types.ts"],"sourcesContent":["import type { ReactNode } from 'react'\r\nimport type { ButtonProps } from '@mui/material'\r\nimport type { IFilterNotesProps } from './ui.units'\r\n\r\nexport type SingleOrArray<T> = T | T[]\r\n\r\nexport type IRelativePosition = 'above' | 'below' | 'left' | 'right'\r\n\r\nexport type IPositionElementDef = { [key in IRelativePosition]?: ReactNode }\r\n\r\nexport type IPositionElement<K extends IRelativePosition = IRelativePosition> = Pick<IPositionElementDef, K>\r\n\r\nexport enum EViewStatus {\r\n Loading = 'Loading',\r\n Loaded = 'Loaded',\r\n Error = 'Error'\r\n}\r\n\r\nexport type IFilterArea = 'input' | 'filterButton' | 'sortButton'\r\nexport type IFilterReason = 'filter' | 'quickSearch' | 'pagination' | 'sort'\r\nexport type IFilterAction = 'add' | 'remove' | 'change' | 'reset'\r\nexport type IFilterType = 'string' | 'select' | 'select-multi' | 'date' | 'date-range'\r\n\r\nexport type IFilterLogic = 'and' | 'or'\r\nexport type IFilterDateLogic = 'before' | 'after'\r\nexport type IFilterDateRangeLogic = 'between' | 'not-between'\r\n\r\nexport interface IItemBase {\r\n value: string\r\n label?: string\r\n}\r\n\r\n//#region Validation Result\r\nexport interface IValidationResult {\r\n hasError: boolean\r\n message?: string\r\n}\r\n//#endregion\r\n\r\n//#region Field Match Config\r\nexport enum EFieldMatch {\r\n AlwaysVisible = 'AlwaysVisible',\r\n MatchOnly = 'MatchOnly',\r\n LinkYoutube = 'LinkYoutube',\r\n Link = 'Link',\r\n Guid = 'Guid'\r\n}\r\n\r\nexport interface IFieldMatchDef {\r\n rule: EFieldMatch\r\n}\r\n\r\nexport interface IFieldMatchMatchOnly extends IFieldMatchDef {\r\n rule: EFieldMatch.MatchOnly\r\n match: (value: string) => boolean\r\n}\r\n\r\nexport interface IFieldMatchBasic extends IFieldMatchDef {\r\n rule: EFieldMatch.AlwaysVisible | EFieldMatch.LinkYoutube | EFieldMatch.Link | EFieldMatch.Guid\r\n}\r\n\r\nexport type IFieldMatchConfig = IFieldMatchMatchOnly | IFieldMatchBasic\r\n\r\nexport type IFieldMatchConfigs = {\r\n rules: SingleOrArray<IFieldMatchConfig>\r\n notes?: IFilterNotesProps\r\n}\r\n//#endregion\r\n\r\n//#region Field Validate Config\r\nexport enum EFieldValidate {\r\n Required = 'Required',\r\n LinkYoutube = 'LinkYoutube',\r\n Link = 'Link',\r\n Custom = 'Custom'\r\n}\r\n\r\nexport interface IFieldValidateDef {\r\n rule: EFieldValidate\r\n}\r\n\r\nexport interface IFieldValidateCustom extends IFieldValidateDef {\r\n rule: EFieldValidate.Custom\r\n validator: (value: string) => boolean\r\n}\r\n\r\nexport interface IFieldValidateBasic extends IFieldValidateDef {\r\n rule: EFieldValidate.Required | EFieldValidate.Link | EFieldValidate.LinkYoutube\r\n}\r\n\r\nexport type IFieldValidateConfig = IFieldValidateCustom | IFieldValidateBasic\r\n\r\nexport type IFieldValidateConfigs = {\r\n rules: SingleOrArray<IFieldValidateConfig>\r\n notes?: IFilterNotesProps\r\n}\r\n//#endregion\r\n\r\n//#region Pagination\r\nexport interface IPagination {\r\n page?: number\r\n pageSize?: number\r\n}\r\n//#endregion\r\n\r\n//#region Sort\r\nexport interface ISort<T> {\r\n field: keyof T\r\n direction: 'asc' | 'desc'\r\n}\r\n//#endregion\r\n\r\n//#region Quick Search Config\r\nexport interface IQuickSearchConfig<T> {\r\n fields: SingleOrArray<keyof T>\r\n label?: string\r\n notes?: IFilterNotesProps\r\n logic?: IFilterLogic\r\n}\r\n//#endregion\r\n\r\n//#region Filter Config\r\ninterface IFilterDef {\r\n /** Display label for the filter field */\r\n label?: string\r\n /**\r\n * Filter input type\r\n * @default 'string'\r\n */\r\n type?: IFilterType\r\n /**\r\n * Configuration for quick search matching behavior.\r\n * Determines how the quick search should match against field values.\r\n */\r\n quickSearchMatch?: IFieldMatchConfigs\r\n /**\r\n * Notes for the filter field.\r\n */\r\n notes?: IFilterNotesProps\r\n /**\r\n * Validation rules for the filter menu input.\r\n * @default\r\n * { rules: [{ rule: EFieldValidate.Required }] }\r\n */\r\n validation?: IFieldValidateConfigs\r\n /**\r\n * Notes to display in the filter menu.\r\n * Useful for providing additional context or instructions.\r\n */\r\n filterable?: boolean\r\n /**\r\n * Whether the filter field is sortable.\r\n * If true, the field can be used for sorting in the filter menu.\r\n * @default true\r\n */\r\n sortable?: boolean\r\n}\r\n\r\nexport interface IFilterBasicDef extends IFilterDef {\r\n type?: 'string'\r\n}\r\n\r\nexport interface IFilterSelectDef extends IFilterDef {\r\n type: 'select' | 'select-multi'\r\n options: { value: string; label?: string }[]\r\n}\r\n\r\nexport interface IFilterDateDef extends IFilterDef {\r\n type: 'date' | 'date-range'\r\n /**\r\n * Date format for display and validation\r\n * @default 'YYYY-MM-DD'\r\n */\r\n format?: string\r\n /**\r\n * Minimum date allowed\r\n */\r\n minDate?: string | Date\r\n /**\r\n * Maximum date allowed\r\n */\r\n maxDate?: string | Date\r\n}\r\n\r\nexport type IFilterConfig = IFilterBasicDef | IFilterSelectDef | IFilterDateDef\r\n\r\nexport type IFilterConfigs<T> = { [key in keyof T]?: IFilterConfig }\r\n//#endregion\r\n\r\n//#region Filter State\r\nexport interface IFilterItem {\r\n type?: IFilterType\r\n value?: string | number | boolean\r\n label?: string\r\n logic?: IFilterLogic\r\n dateLogic?: IFilterDateLogic\r\n dateRangeLogic?: IFilterDateRangeLogic\r\n // For date-range, we store start and end dates\r\n startDate?: string\r\n endDate?: string\r\n}\r\n\r\nexport type IFilterMap<T> = { [key in keyof T]?: IFilterItem[] }\r\n\r\nexport interface IFilterChangeDetails {\r\n reason?: IFilterReason\r\n area?: IFilterArea\r\n action?: IFilterAction\r\n isChanged?: boolean\r\n}\r\n\r\nexport interface IFilterState<T> {\r\n filter?: IFilterMap<T>\r\n quickSearch?: SingleOrArray<string>\r\n quickSearchLogic?: IFilterLogic\r\n pagination?: IPagination\r\n sort?: ISort<T>\r\n details?: IFilterChangeDetails\r\n}\r\n\r\nexport type IFilterStateChangeHandler<T> = (filterState: IFilterState<T>) => void\r\n//#endregion\r\n\r\n//#region Filter Bar\r\n\r\nexport interface ISortButtonConfigs {\r\n text?: string\r\n icon?: ReactNode\r\n wrapProps?: ButtonProps\r\n}\r\n\r\nexport interface IFilterBarConfigBase {\r\n /** @default false */\r\n enableSticky?: boolean\r\n /** @default false */\r\n enableSort?: boolean\r\n}\r\n\r\nexport interface IFilterBarConfigs<T> extends IFilterBarConfigBase {\r\n id?: string\r\n placeholder?: string\r\n notes?: IFilterNotesProps\r\n fields?: IFilterConfigs<T>\r\n quickSearch?: IQuickSearchConfig<T>\r\n defaultValue?: IFilterState<T>\r\n sortButton?: ISortButtonConfigs\r\n}\r\n//#endregion\r\n\r\n// #region View Data\r\nexport interface IViewData<T> {\r\n items: T[]\r\n totalItems?: number\r\n hasPreviousPage?: boolean\r\n hasNextPage?: boolean\r\n}\r\n//#endregion\r\n"],"names":["EViewStatus","EFieldMatch","EFieldValidate"],"mappings":"IAYYA,EA4BAC,EA8BAC,GA1DZ,SAAYF,GACVA,EAAA,QAAA,UACAA,EAAA,OAAA,SACAA,EAAA,MAAA,OACD,CAJD,CAAYA,IAAAA,EAIX,CAAA,IAwBD,SAAYC,GACVA,EAAA,cAAA,gBACAA,EAAA,UAAA,YACAA,EAAA,YAAA,cACAA,EAAA,KAAA,OACAA,EAAA,KAAA,MACD,CAND,CAAYA,IAAAA,EAMX,CAAA,IAwBD,SAAYC,GACVA,EAAA,SAAA,WACAA,EAAA,YAAA,cACAA,EAAA,KAAA,OACAA,EAAA,OAAA,QACD,CALD,CAAYA,IAAAA,EAKX,CAAA"}
|
|
@@ -38,7 +38,6 @@ export interface IDataViewProps<T extends IViewModeValidModel> {
|
|
|
38
38
|
viewMode?: EViewMode;
|
|
39
39
|
onViewModeChange?: (value: EViewMode) => void;
|
|
40
40
|
syncViewModeToURL?: boolean;
|
|
41
|
-
enablePaginationTop?: boolean;
|
|
42
41
|
slots?: IDataViewSlots<T>;
|
|
43
42
|
}
|
|
44
43
|
export interface IDataViewConfigs<T extends IViewModeValidModel> {
|
|
@@ -3,6 +3,7 @@ import { IFilterState } from './types';
|
|
|
3
3
|
export interface IPaginationBarConfigs {
|
|
4
4
|
rowsPerPageOptions?: number[];
|
|
5
5
|
disableScrollLock?: boolean;
|
|
6
|
+
enablePaginationTop?: boolean;
|
|
6
7
|
}
|
|
7
8
|
export interface IPaginationBarProps<T> extends IPaginationBarConfigs {
|
|
8
9
|
count?: number;
|
|
@@ -13,7 +13,7 @@ export declare enum EViewStatus {
|
|
|
13
13
|
Error = "Error"
|
|
14
14
|
}
|
|
15
15
|
export type IFilterArea = 'input' | 'filterButton' | 'sortButton';
|
|
16
|
-
export type IFilterReason = '
|
|
16
|
+
export type IFilterReason = 'filter' | 'quickSearch' | 'pagination' | 'sort';
|
|
17
17
|
export type IFilterAction = 'add' | 'remove' | 'change' | 'reset';
|
|
18
18
|
export type IFilterType = 'string' | 'select' | 'select-multi' | 'date' | 'date-range';
|
|
19
19
|
export type IFilterLogic = 'and' | 'or';
|