dinocollab-core 2.2.25 → 2.2.27
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/src/data-surface/view-list/index.js +1 -1
- package/dist/src/data-surface/view-list/index.js.map +1 -1
- package/dist/src/filter-bar/convert-to-graphql.js +1 -1
- package/dist/src/filter-bar/convert-to-graphql.js.map +1 -1
- package/dist/src/filter-bar/menu/create-form-field-select-multiple.js +1 -1
- package/dist/src/filter-bar/menu/create-form-field-select-multiple.js.map +1 -1
- package/dist/src/http-service/graphql/request-param.js +1 -1
- package/dist/src/http-service/graphql/request-param.js.map +1 -1
- package/dist/types/data-view/convert-filter-to-graphql.d.ts +9 -1
- package/dist/types/filter-bar/convert-to-graphql.d.ts +18 -16
- package/dist/types/filter-bar/index.dino.d.ts +1 -1
- package/dist/types/http-service/graphql/request-param.d.ts +9 -5
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{objectSpread2 as e,asyncToGenerator as n,regenerator as l,slicedToArray as t}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as r,jsxs as a}from"react/jsx-runtime";import{useCallback as i,useRef as o,useState as c,useEffect as d,useLayoutEffect as s,useMemo as u}from"react";import{TableContainer as h,Table as g,TableHead as m,TableRow as v,TableCell as f,Checkbox as p,TableBody as b,Box as S,Typography as x}from"@mui/material";import{useMergedConfig as C,useListSelection as H}from"./hooks.js";import{ViewListStyled as N,viewListClasses as y}from"./styled.js";import{CHECKBOX_COL_WIDTH as T,LIST_HEADER_HEIGHT as w,resolveListSpacerHeight as k,mapSxTableCell as M,getColumnWidth as R}from"./helpers.js";function z(e,n,l){var t=n[e.field],a=e.valueGetter?e.valueGetter(t,n,l):t,i={value:a,row:n,index:l,field:e.field};if(e.renderCell)return e.renderCell(i);var o=String(null!=a?a:"");return r(x,{variant:"body2",noWrap:!0,title:o,children:o})}function I(e,n,l,t){return a("colgroup",{children:[t&&r("col",{style:{width:T}}),e.map(function(e,t){var a=R(e,l,n);return r("col",{style:void 0!==a?{width:a}:void 0},t)})]})}function j(n){var l=function(e){return function(n){var l=C(e,n),t=l.columns.reduce(function(e,n){return e+(n.flex&&n.flex>0?n.flex:0)},0),i=l.columns.reduce(function(e,n){return"number"==typeof n.width?e+n.width:void 0===n.width&&void 0===n.flex&&"number"==typeof n.minWidth?e+n.minWidth:e},0),c=(l.selectable?T:0)+i,s=1==l.normalOptions.autoHeight,x=n.onSelectionChange,w=o(null);d(function(){s||void 0===n.scrollResetToken||w.current&&(w.current.scrollTop=0)},[n.scrollResetToken]);var k=H(n.value,e.getterId,l.selectable,n.selectedIds,x),R=k.selectedIds,j=k.isAllSelected,O=k.isSomeSelected,B=k.handleToggleAll,A=k.handleToggleRow,E=u(function(){var e=[y.root,y.normal];return s&&e.push(y.autoHeight),e.join(" ")},[s]);return r(N,{className:E,style:l.rootStyle,children:r(h,{ref:w,className:y.scrollContainer,onScroll:function(e){if(!s){var t,r=e.currentTarget;r.scrollHeight-r.scrollTop-r.clientHeight<=l.nearEndThreshold&&(null===(t=n.onNearEnd)||void 0===t||t.call(n))}},children:a(g,{size:"small",className:y.table,children:[I(l.columns,t,c,l.selectable),r(m,{className:y.tableHeader,children:a(v,{children:[l.selectable&&r(f,{padding:"checkbox",className:y.tableHeaderCell,children:r(p,{checked:j,indeterminate:O,onChange:B})}),l.columns.map(function(e){var n;return r(f,{className:y.tableHeaderCell,align:e.align,sx:M(e,t,c),children:null!==(n=e.label)&&void 0!==n?n:String(e.field)},String(e.field))})]})}),r(b,{children:n.value.map(function(n,i){var o,d=null!==(o=e.getterId(n,i))&&void 0!==o?o:i,s=R.includes(d),u=l.rowHeight,h=l.cellPadding;return a(v,{hover:!0,sx:{height:u},selected:s,children:[l.selectable&&r(f,{padding:"checkbox",className:y.tableBodyCell,sx:{height:u,padding:h},children:r(p,{checked:s,onChange:function(){return A(d)}})}),l.columns.map(function(e){return r(f,{className:y.tableBodyCell,align:e.align,sx:M(e,t,c,{height:u,padding:h}),children:r(S,{className:y.tableCellContent,children:z(e,n,i)})},"".concat(String(d),"-").concat(String(e.field)))})]},d)})})]})})})}}(n),i=function(e){return function(n){var l=C(e,n),i=l.columns.reduce(function(e,n){return e+(n.flex&&n.flex>0?n.flex:0)},0),x=l.columns.reduce(function(e,n){return"number"==typeof n.width?e+n.width:void 0===n.width&&void 0===n.flex&&"number"==typeof n.minWidth?e+n.minWidth:e},0),R=(l.selectable?T:0)+x,j=n.onSelectionChange,O=H(n.value,e.getterId,l.selectable,n.selectedIds,j),B=O.selectedIds,A=O.isAllSelected,E=O.isSomeSelected,P=O.handleToggleAll,W=O.handleToggleRow,G=o(null),_=o(null),q=o(!1),D=c(0),F=t(D,2),J=F[0],K=F[1],L=c(0),Q=t(L,2),U=Q[0],V=Q[1],X=c(w),Y=t(X,2),Z=Y[0],$=Y[1],ee=Math.max(1,l.virtualizedOptions.overscan);d(function(){void 0!==n.scrollResetToken&&(G.current&&(G.current.scrollTop=0),V(0))},[n.scrollResetToken]),s(function(){if(G.current){var e=G.current.scrollTop;e>0&&V(Math.round(e));var n=function(){var e,n,l=null!==(e=null===(n=G.current)||void 0===n?void 0:n.clientHeight)&&void 0!==e?e:0;K(function(e){return e===l?e:l})};n();var l=new ResizeObserver(function(){return n()});return l.observe(G.current),function(){return l.disconnect()}}},[]),s(function(){q.current=!1},[l.columns.length]),s(function(){var e,n;if(!q.current){var l=null!==(e=null===(n=_.current)||void 0===n?void 0:n.offsetHeight)&&void 0!==e?e:0;l>0&&(q.current=!0,$(l))}},[l.columns.length]);var ne=u(function(){var e=n.value.length;if(0===e)return{start:0,end:-1,topSpacerHeight:0,bottomSpacerHeight:0};if(0===J){var t=2*ee+1;return{start:0,end:Math.min(e-1,t),topSpacerHeight:0,bottomSpacerHeight:0}}var r=l.rowHeight,a=l.rowSpacing,i=Math.round(r),o=Math.round(a),c=i+o,d=U,s=Math.max(1,J-Z),u=Math.max(0,d-Z),h=Math.ceil(s/c),g=Math.max(0,Math.floor(u/c)-ee),m=Math.min(e-1,g+h+2*ee);return m===e-1&&(g=Math.max(0,e-h-2*ee)),{start:g,end:m,topSpacerHeight:k(g,i,o),bottomSpacerHeight:k(e-m-1,i,o)}},[n.value.length,Z,ee,l,U,J]),le=ne.end>=ne.start?n.value.slice(ne.start,ne.end+1):[],te=[y.root,y.virtualized].filter(Boolean).join(" ");return r(N,{className:te,style:l.rootStyle,children:r(h,{ref:G,className:y.scrollContainer,onScroll:function(e){var t,r=e.currentTarget;V(Math.round(r.scrollTop)),r.scrollHeight-r.scrollTop-r.clientHeight<=l.nearEndThreshold&&(null===(t=n.onNearEnd)||void 0===t||t.call(n))},children:a(g,{size:"small",className:y.table,children:[I(l.columns,i,R,l.selectable),r(m,{className:y.tableHeader,children:a(v,{ref:_,children:[l.selectable&&r(f,{padding:"checkbox",className:y.tableHeaderCell,children:r(p,{checked:A,indeterminate:E,onChange:P})}),l.columns.map(function(e){var n;return r(f,{className:y.tableHeaderCell,align:e.align,sx:M(e,i,R),children:null!==(n=e.label)&&void 0!==n?n:String(e.field)},String(e.field))})]})}),a(b,{children:[ne.topSpacerHeight>0?r(v,{className:y.tableSpacerRow,children:r(f,{colSpan:l.columns.length+(l.selectable?1:0),className:y.tableSpacerCell,sx:{height:ne.topSpacerHeight,padding:0,border:0}})}):null,le.map(function(n,t){var o,c=ne.start+t,d=null!==(o=e.getterId(n,c))&&void 0!==o?o:c,s=B.includes(d),u=l.rowHeight,h=l.cellPadding;return a(v,{hover:!0,sx:{height:u},selected:s,children:[l.selectable&&r(f,{padding:"checkbox",className:y.tableBodyCell,sx:{height:u,padding:h},children:r(p,{checked:s,onChange:function(){return W(d)}})}),l.columns.map(function(e){return r(f,{className:y.tableBodyCell,align:e.align,sx:M(e,i,R,{height:u,padding:h}),children:r(S,{className:y.tableCellContent,children:z(e,n,c)})},"".concat(String(d),"-").concat(String(e.field)))})]},d)}),ne.bottomSpacerHeight>0?r(v,{className:y.tableSpacerRow,children:r(f,{colSpan:l.columns.length+(l.selectable?1:0),className:y.tableSpacerCell,sx:{height:ne.bottomSpacerHeight,padding:0,border:0}})}):null]})]})})})}}(n);return function(t){var a,o,c=null!==(a=null!==(o=t.renderStrategy)&&void 0!==o?o:n.renderStrategy)&&void 0!==a?a:"normal";return r("virtualized"===c?i:l,e({},t))}}function O(e){return function(t){var a,o,c,d=i(n(l().m(function e(){var n,r,a,i,o,c,d,s,u;return l().w(function(e){for(;;)switch(e.n){case 0:if("infiniteScroll"===t.loadMode){e.n=1;break}return e.a(2);case 1:if(null!==(n=t.pagination)&&void 0!==n&&n.hasNext){e.n=2;break}return e.a(2);case 2:if(!t.loading){e.n=3;break}return e.a(2);case 3:return d=null!==(r=null===(a=t.pagination)||void 0===a?void 0:a.page)&&void 0!==r?r:0,s=null!==(i=null===(o=t.pagination)||void 0===o?void 0:o.pageSize)&&void 0!==i?i:20,u=d+1,e.n=4,null===(c=t.onPageChange)||void 0===c?void 0:c.call(t,u,s);case 4:return e.a(2)}},e)})),[t.loadMode,null===(a=t.pagination)||void 0===a?void 0:a.hasNext,null===(o=t.pagination)||void 0===o?void 0:o.page,null===(c=t.pagination)||void 0===c?void 0:c.pageSize,t.loading,t.onPageChange]);return r(e,{value:t.value,columns:t.columns,density:t.density,spacing:t.spacing,renderStrategy:t.renderStrategy,normalOptions:t.normalOptions,virtualizedOptions:t.virtualizedOptions,onNearEnd:"infiniteScroll"===t.loadMode?d:void 0,selectable:t.selectable,selectedIds:t.selectedIds,onSelectionChange:t.onSelectionChange,scrollResetToken:t.scrollResetToken})}}export{j as createViewList,O as createViewListLoading,j as default};
|
|
1
|
+
import{objectSpread2 as e,asyncToGenerator as n,regenerator as l,slicedToArray as t}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as r,jsxs as a}from"react/jsx-runtime";import{useCallback as i,useRef as o,useState as c,useEffect as d,useLayoutEffect as s,useMemo as u}from"react";import{TableContainer as h,Table as g,TableHead as m,TableRow as v,TableCell as f,Checkbox as p,TableBody as b,Box as S,Typography as x}from"@mui/material";import{useMergedConfig as C,useListSelection as H}from"./hooks.js";import{ViewListStyled as N,viewListClasses as y}from"./styled.js";import{CHECKBOX_COL_WIDTH as T,LIST_HEADER_HEIGHT as w,resolveListSpacerHeight as k,mapSxTableCell as M,getColumnWidth as R}from"./helpers.js";function z(e,n,l){var t=n[e.field],a=e.valueGetter?e.valueGetter(t,n,l):t,i={value:a,row:n,index:l,field:e.field};if(e.renderCell)return e.renderCell(i);var o=String(null!=a?a:"");return r(x,{variant:"body2",noWrap:!0,title:o,children:o})}function I(e,n,l,t){return a("colgroup",{children:[t&&r("col",{style:{width:T}}),e.map(function(e,t){var a=R(e,l,n);return r("col",{style:void 0!==a?{width:a}:void 0},t)})]})}function j(n){var l=function(e){return function(n){var l=C(e,n),t=l.columns.reduce(function(e,n){return e+(n.flex&&n.flex>0?n.flex:0)},0),i=l.columns.reduce(function(e,n){return"number"==typeof n.width?e+n.width:void 0===n.width&&void 0===n.flex&&"number"==typeof n.minWidth?e+n.minWidth:e},0),c=(l.selectable?T:0)+i,s=1==l.normalOptions.autoHeight,x=n.onSelectionChange,w=o(null);d(function(){s||void 0===n.scrollResetToken||w.current&&(w.current.scrollTop=0)},[n.scrollResetToken]);var k=H(n.value,e.getterId,l.selectable,n.selectedIds,x),R=k.selectedIds,j=k.isAllSelected,O=k.isSomeSelected,B=k.handleToggleAll,A=k.handleToggleRow,E=u(function(){var e=[y.root,y.normal];return s&&e.push(y.autoHeight),e.join(" ")},[s]);return r(N,{className:E,style:l.rootStyle,children:r(h,{ref:w,className:y.scrollContainer,onScroll:function(e){if(!s){var t,r=e.currentTarget;r.scrollHeight-r.scrollTop-r.clientHeight<=l.nearEndThreshold&&(null===(t=n.onNearEnd)||void 0===t||t.call(n))}},children:a(g,{size:"small",className:y.table,children:[I(l.columns,t,c,l.selectable),r(m,{className:y.tableHeader,children:a(v,{children:[l.selectable&&r(f,{padding:"checkbox",className:y.tableHeaderCell,children:r(p,{checked:j,indeterminate:O,onChange:B})}),l.columns.map(function(e){var n;return r(f,{className:y.tableHeaderCell,align:e.align,sx:M(e,t,c),children:null!==(n=e.label)&&void 0!==n?n:String(e.field)},String(e.field))})]})}),r(b,{children:n.value.map(function(n,i){var o,d=null!==(o=e.getterId(n,i))&&void 0!==o?o:i,s=R.includes(d),u=l.rowHeight,h=l.cellPadding;return a(v,{hover:!0,sx:{height:u},selected:s,children:[l.selectable&&r(f,{padding:"checkbox",className:y.tableBodyCell,sx:{height:u,padding:h},children:r(p,{checked:s,onChange:function(){return A(d)}})}),l.columns.map(function(e){return r(f,{className:y.tableBodyCell,align:e.align,sx:M(e,t,c,{height:u,padding:h}),children:r(S,{className:y.tableCellContent,children:z(e,n,i)})},"".concat(String(d),"-").concat(String(e.field)))})]},d)})})]})})})}}(n),i=function(e){return function(n){var l=C(e,n),i=l.columns.reduce(function(e,n){return e+(n.flex&&n.flex>0?n.flex:0)},0),x=l.columns.reduce(function(e,n){return"number"==typeof n.width?e+n.width:void 0===n.width&&void 0===n.flex&&"number"==typeof n.minWidth?e+n.minWidth:e},0),R=(l.selectable?T:0)+x,j=n.onSelectionChange,O=H(n.value,e.getterId,l.selectable,n.selectedIds,j),B=O.selectedIds,A=O.isAllSelected,E=O.isSomeSelected,P=O.handleToggleAll,W=O.handleToggleRow,G=o(null),_=o(null),q=o(!1),D=c(0),F=t(D,2),J=F[0],K=F[1],L=c(0),Q=t(L,2),U=Q[0],V=Q[1],X=c(w),Y=t(X,2),Z=Y[0],$=Y[1],ee=Math.max(1,l.virtualizedOptions.overscan);d(function(){void 0!==n.scrollResetToken&&(G.current&&(G.current.scrollTop=0),V(0))},[n.scrollResetToken]),s(function(){if(G.current){var e=G.current.scrollTop;e>0&&V(Math.round(e));var n=function(){var e,n,l=null!==(e=null===(n=G.current)||void 0===n?void 0:n.clientHeight)&&void 0!==e?e:0;K(function(e){return e===l?e:l})};n();var l=new ResizeObserver(function(){return n()});return l.observe(G.current),function(){return l.disconnect()}}},[]),s(function(){q.current=!1},[l.columns.length]),s(function(){var e,n;if(!q.current){var l=null!==(e=null===(n=_.current)||void 0===n?void 0:n.offsetHeight)&&void 0!==e?e:0;l>0&&(q.current=!0,$(l))}},[l.columns.length]);var ne=u(function(){var e=n.value.length;if(0===e)return{start:0,end:-1,topSpacerHeight:0,bottomSpacerHeight:0};if(0===J){var t=2*ee+1;return{start:0,end:Math.min(e-1,t),topSpacerHeight:0,bottomSpacerHeight:0}}var r=l.rowHeight,a=l.rowSpacing,i=Math.round(r),o=Math.round(a),c=i+o,d=U,s=Math.max(1,J-Z),u=Math.max(0,d-Z),h=Math.ceil(s/c),g=Math.max(0,Math.floor(u/c)-ee),m=Math.min(e-1,g+h+2*ee);return m===e-1&&u>0&&(g=Math.max(0,e-h-2*ee)),{start:g,end:m,topSpacerHeight:k(g,i,o),bottomSpacerHeight:k(e-m-1,i,o)}},[n.value.length,Z,ee,l,U,J]),le=ne.end>=ne.start?n.value.slice(ne.start,ne.end+1):[],te=[y.root,y.virtualized].filter(Boolean).join(" ");return r(N,{className:te,style:l.rootStyle,children:r(h,{ref:G,className:y.scrollContainer,onScroll:function(e){var t,r=e.currentTarget;V(Math.round(r.scrollTop)),r.scrollHeight-r.scrollTop-r.clientHeight<=l.nearEndThreshold&&(null===(t=n.onNearEnd)||void 0===t||t.call(n))},children:a(g,{size:"small",className:y.table,children:[I(l.columns,i,R,l.selectable),r(m,{className:y.tableHeader,children:a(v,{ref:_,children:[l.selectable&&r(f,{padding:"checkbox",className:y.tableHeaderCell,children:r(p,{checked:A,indeterminate:E,onChange:P})}),l.columns.map(function(e){var n;return r(f,{className:y.tableHeaderCell,align:e.align,sx:M(e,i,R),children:null!==(n=e.label)&&void 0!==n?n:String(e.field)},String(e.field))})]})}),a(b,{children:[ne.topSpacerHeight>0?r(v,{className:y.tableSpacerRow,children:r(f,{colSpan:l.columns.length+(l.selectable?1:0),className:y.tableSpacerCell,sx:{height:ne.topSpacerHeight,padding:0,border:0}})}):null,le.map(function(n,t){var o,c=ne.start+t,d=null!==(o=e.getterId(n,c))&&void 0!==o?o:c,s=B.includes(d),u=l.rowHeight,h=l.cellPadding;return a(v,{hover:!0,sx:{height:u},selected:s,children:[l.selectable&&r(f,{padding:"checkbox",className:y.tableBodyCell,sx:{height:u,padding:h},children:r(p,{checked:s,onChange:function(){return W(d)}})}),l.columns.map(function(e){return r(f,{className:y.tableBodyCell,align:e.align,sx:M(e,i,R,{height:u,padding:h}),children:r(S,{className:y.tableCellContent,children:z(e,n,c)})},"".concat(String(d),"-").concat(String(e.field)))})]},d)}),ne.bottomSpacerHeight>0?r(v,{className:y.tableSpacerRow,children:r(f,{colSpan:l.columns.length+(l.selectable?1:0),className:y.tableSpacerCell,sx:{height:ne.bottomSpacerHeight,padding:0,border:0}})}):null]})]})})})}}(n);return function(t){var a,o,c=null!==(a=null!==(o=t.renderStrategy)&&void 0!==o?o:n.renderStrategy)&&void 0!==a?a:"normal";return r("virtualized"===c?i:l,e({},t))}}function O(e){return function(t){var a,o,c,d=i(n(l().m(function e(){var n,r,a,i,o,c,d,s,u;return l().w(function(e){for(;;)switch(e.n){case 0:if("infiniteScroll"===t.loadMode){e.n=1;break}return e.a(2);case 1:if(null!==(n=t.pagination)&&void 0!==n&&n.hasNext){e.n=2;break}return e.a(2);case 2:if(!t.loading){e.n=3;break}return e.a(2);case 3:return d=null!==(r=null===(a=t.pagination)||void 0===a?void 0:a.page)&&void 0!==r?r:0,s=null!==(i=null===(o=t.pagination)||void 0===o?void 0:o.pageSize)&&void 0!==i?i:20,u=d+1,e.n=4,null===(c=t.onPageChange)||void 0===c?void 0:c.call(t,u,s);case 4:return e.a(2)}},e)})),[t.loadMode,null===(a=t.pagination)||void 0===a?void 0:a.hasNext,null===(o=t.pagination)||void 0===o?void 0:o.page,null===(c=t.pagination)||void 0===c?void 0:c.pageSize,t.loading,t.onPageChange]);return r(e,{value:t.value,columns:t.columns,density:t.density,spacing:t.spacing,renderStrategy:t.renderStrategy,normalOptions:t.normalOptions,virtualizedOptions:t.virtualizedOptions,onNearEnd:"infiniteScroll"===t.loadMode?d:void 0,selectable:t.selectable,selectedIds:t.selectedIds,onSelectionChange:t.onSelectionChange,scrollResetToken:t.scrollResetToken})}}export{j as createViewList,O as createViewListLoading,j as default};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/data-surface/view-list/index.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\r\nimport { Box, Checkbox, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Typography } from '@mui/material'\r\nimport { useListSelection, useMergedConfig } from './hooks'\r\nimport { ViewListStyled, viewListClasses as classes } from './styled'\r\nimport { LIST_HEADER_HEIGHT, CHECKBOX_COL_WIDTH, getColumnWidth, mapSxTableCell, resolveListSpacerHeight } from './helpers'\r\n// types\r\nimport type { TableContainerProps } from '@mui/material'\r\nimport type { ComponentType, FC, ReactNode } from 'react'\r\nimport type { LoadingModeRule, TPagination } from '../types'\r\nimport type { IListCellParams, IViewListConfig, IViewListProps, TListColumn } from './types'\r\n\r\nexport * from './types'\r\n\r\n//#region Helpers\r\nfunction renderCellValue<T>(column: TListColumn<T>, row: T, index: number): ReactNode {\r\n const currentValue = (row as any)[column.field]\r\n const value = column.valueGetter ? column.valueGetter(currentValue, row, index) : currentValue\r\n const params: IListCellParams<T> = { value, row, index, field: column.field }\r\n if (column.renderCell) return column.renderCell(params)\r\n const valueLabel = String(value ?? '')\r\n return (\r\n <Typography variant='body2' noWrap title={valueLabel}>\r\n {valueLabel}\r\n </Typography>\r\n )\r\n}\r\n\r\nfunction renderColGroup<T>(cols: TListColumn<T>[], totalFlex: number, totalFixedPx: number, selectable: boolean) {\r\n return (\r\n <colgroup>\r\n {selectable && <col style={{ width: CHECKBOX_COL_WIDTH }} />}\r\n {cols.map((col, i) => {\r\n const w = getColumnWidth(col, totalFixedPx, totalFlex)\r\n return <col key={i} style={w !== undefined ? { width: w as any } : undefined} />\r\n })}\r\n </colgroup>\r\n )\r\n}\r\n\r\n//#endregion\r\n//#region Normal List\r\nfunction createViewListNormal<T>(config: IViewListConfig<T>) {\r\n const ViewListNormal: FC<IViewListProps<T>> = (props) => {\r\n const mergedConfig = useMergedConfig(config, props)\r\n const totalFlex = mergedConfig.columns.reduce((sum, col) => sum + (col.flex && col.flex > 0 ? col.flex : 0), 0)\r\n const totalFixedPxRaw = mergedConfig.columns.reduce((sum, col) => {\r\n if (typeof col.width === 'number') return sum + col.width\r\n if (col.width === undefined && col.flex === undefined && typeof col.minWidth === 'number') return sum + col.minWidth\r\n return sum\r\n }, 0)\r\n const totalFixedPx = (mergedConfig.selectable ? CHECKBOX_COL_WIDTH : 0) + totalFixedPxRaw\r\n\r\n const { normalOptions } = mergedConfig\r\n const isAutoHeight = normalOptions.autoHeight == true\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n const scrollContainerRef = useRef<HTMLDivElement | null>(null)\r\n\r\n // Reset scroll to top when token changes\r\n useEffect(() => {\r\n if (isAutoHeight || props.scrollResetToken === undefined) return\r\n if (scrollContainerRef.current) scrollContainerRef.current.scrollTop = 0\r\n }, [props.scrollResetToken])\r\n\r\n const handleScroll: TableContainerProps['onScroll'] = (e) => {\r\n if (isAutoHeight) return\r\n const t = e.currentTarget\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n // Use selection hook to manage checkbox state and handlers\r\n const selection = useListSelection(props.value, config.getterId, mergedConfig.selectable, props.selectedIds, onSelectionChange)\r\n const { selectedIds, isAllSelected, isSomeSelected, handleToggleAll, handleToggleRow } = selection\r\n\r\n const rootClasses = useMemo(() => {\r\n const l = [classes.root, classes.normal]\r\n if (isAutoHeight) l.push(classes.autoHeight)\r\n return l.join(' ')\r\n }, [isAutoHeight])\r\n\r\n return (\r\n <ViewListStyled className={rootClasses} style={mergedConfig.rootStyle}>\r\n <TableContainer ref={scrollContainerRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n <Table size='small' className={classes.table}>\r\n {renderColGroup(mergedConfig.columns, totalFlex, totalFixedPx, mergedConfig.selectable)}\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell\r\n key={String(col.field)}\r\n className={classes.tableHeaderCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, totalFixedPx)}\r\n >\r\n {col.label ?? String(col.field)}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {props.value.map((row, index) => {\r\n const rowKey = config.getterId(row, index) ?? index\r\n const isSelected = selectedIds.includes(rowKey)\r\n const { rowHeight, cellPadding } = mergedConfig\r\n return (\r\n <TableRow key={rowKey} hover sx={{ height: rowHeight }} selected={isSelected}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableBodyCell} sx={{ height: rowHeight, padding: cellPadding }}>\r\n <Checkbox checked={isSelected} onChange={() => handleToggleRow(rowKey)} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, totalFixedPx, { height: rowHeight, padding: cellPadding })}\r\n >\r\n <Box className={classes.tableCellContent}>{renderCellValue(col, row, index)}</Box>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )\r\n })}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </ViewListStyled>\r\n )\r\n }\r\n return ViewListNormal\r\n}\r\n//#endregion\r\n//#region Virtualized List\r\nfunction createViewListVirtualized<T>(config: IViewListConfig<T>) {\r\n const ViewListVirtualized: FC<IViewListProps<T>> = (props) => {\r\n const mergedConfig = useMergedConfig(config, props)\r\n const totalFlex = mergedConfig.columns.reduce((sum, col) => sum + (col.flex && col.flex > 0 ? col.flex : 0), 0)\r\n const totalFixedPxRaw = mergedConfig.columns.reduce((sum, col) => {\r\n if (typeof col.width === 'number') return sum + col.width\r\n if (col.width === undefined && col.flex === undefined && typeof col.minWidth === 'number') return sum + col.minWidth\r\n return sum\r\n }, 0)\r\n const totalFixedPx = (mergedConfig.selectable ? CHECKBOX_COL_WIDTH : 0) + totalFixedPxRaw\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n\r\n // Use selection hook to manage checkbox state and handlers\r\n const selection = useListSelection(props.value, config.getterId, mergedConfig.selectable, props.selectedIds, onSelectionChange)\r\n const { selectedIds, isAllSelected, isSomeSelected, handleToggleAll, handleToggleRow } = selection\r\n\r\n const wrapRef = useRef<HTMLDivElement | null>(null)\r\n const headerRowRef = useRef<HTMLTableRowElement | null>(null)\r\n const hasHeaderMeasuredRef = useRef(false)\r\n const [containerHeight, setContainerHeight] = useState(0)\r\n const [scrollTopState, setScrollTopState] = useState(0)\r\n const [headerHeight, setHeaderHeight] = useState(LIST_HEADER_HEIGHT)\r\n\r\n const overscan = Math.max(1, mergedConfig.virtualizedOptions.overscan)\r\n\r\n // Reset scroll to top when token changes\r\n useEffect(() => {\r\n if (props.scrollResetToken === undefined) return\r\n if (wrapRef.current) wrapRef.current.scrollTop = 0\r\n setScrollTopState(0)\r\n }, [props.scrollResetToken])\r\n\r\n const handleScroll: TableContainerProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n setScrollTopState(Math.round(t.scrollTop))\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n useLayoutEffect(() => {\r\n if (!wrapRef.current) return\r\n\r\n // Sync scrollTopState from actual DOM scroll position on mount.\r\n // Guards against stale state when the component is reused across navigations\r\n // (browser may have preserved a non-zero scrollTop while React state reset to 0).\r\n const domScrollTop = wrapRef.current.scrollTop\r\n if (domScrollTop > 0) setScrollTopState(Math.round(domScrollTop))\r\n\r\n const updateSize = () => {\r\n const nextHeight = wrapRef.current?.clientHeight ?? 0\r\n setContainerHeight((prev) => (prev === nextHeight ? prev : nextHeight))\r\n }\r\n\r\n updateSize()\r\n\r\n const observer = new ResizeObserver(() => updateSize())\r\n observer.observe(wrapRef.current)\r\n return () => observer.disconnect()\r\n }, [])\r\n\r\n useLayoutEffect(() => {\r\n hasHeaderMeasuredRef.current = false\r\n }, [mergedConfig.columns.length])\r\n\r\n useLayoutEffect(() => {\r\n if (hasHeaderMeasuredRef.current) return\r\n const measured = headerRowRef.current?.offsetHeight ?? 0\r\n if (measured > 0) {\r\n hasHeaderMeasuredRef.current = true\r\n setHeaderHeight(measured)\r\n }\r\n }, [mergedConfig.columns.length])\r\n\r\n const windowed = useMemo(() => {\r\n const totalItems = props.value.length\r\n if (totalItems === 0) {\r\n return { start: 0, end: -1, topSpacerHeight: 0, bottomSpacerHeight: 0 }\r\n }\r\n // Container not yet measured — render from start with no spacers to avoid\r\n // the bottom-clamp formula producing start > 0 with a stale visibleCount of 1.\r\n if (containerHeight === 0) {\r\n const defaultVisible = overscan * 2 + 1\r\n return { start: 0, end: Math.min(totalItems - 1, defaultVisible), topSpacerHeight: 0, bottomSpacerHeight: 0 }\r\n }\r\n const { rowHeight, rowSpacing } = mergedConfig\r\n const intRowHeight = Math.round(rowHeight)\r\n const intRowSpacing = Math.round(rowSpacing)\r\n const rowStride = intRowHeight + intRowSpacing\r\n const effectiveScrollTop = scrollTopState\r\n const safeViewportHeight = Math.max(1, containerHeight - headerHeight)\r\n const adjustedScrollTop = Math.max(0, effectiveScrollTop - headerHeight)\r\n const visibleCount = Math.ceil(safeViewportHeight / rowStride)\r\n let start = Math.max(0, Math.floor(adjustedScrollTop / rowStride) - overscan)\r\n let end = Math.min(totalItems - 1, start + visibleCount + overscan * 2)\r\n\r\n // When clamped at the bottom, pin start to a fixed value so that topSpacerHeight\r\n // does not change with small scrollTop fluctuations (sub-pixel zoom oscillation fix).\r\n if (end === totalItems - 1) {\r\n start = Math.max(0, totalItems - visibleCount - overscan * 2)\r\n }\r\n\r\n const topSpacerHeight = resolveListSpacerHeight(start, intRowHeight, intRowSpacing)\r\n const bottomSpacerHeight = resolveListSpacerHeight(totalItems - end - 1, intRowHeight, intRowSpacing)\r\n\r\n return { start, end, topSpacerHeight, bottomSpacerHeight }\r\n }, [props.value.length, headerHeight, overscan, mergedConfig, scrollTopState, containerHeight])\r\n\r\n const rowsToRender = windowed.end >= windowed.start ? props.value.slice(windowed.start, windowed.end + 1) : []\r\n const rootClasses = [classes.root, classes.virtualized].filter(Boolean).join(' ')\r\n return (\r\n <ViewListStyled className={rootClasses} style={mergedConfig.rootStyle}>\r\n <TableContainer ref={wrapRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n <Table size='small' className={classes.table}>\r\n {renderColGroup(mergedConfig.columns, totalFlex, totalFixedPx, mergedConfig.selectable)}\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow ref={headerRowRef}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell\r\n key={String(col.field)}\r\n className={classes.tableHeaderCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, totalFixedPx)}\r\n >\r\n {col.label ?? String(col.field)}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {windowed.topSpacerHeight > 0 ? (\r\n <TableRow className={classes.tableSpacerRow}>\r\n <TableCell\r\n colSpan={mergedConfig.columns.length + (mergedConfig.selectable ? 1 : 0)}\r\n className={classes.tableSpacerCell}\r\n sx={{ height: windowed.topSpacerHeight, padding: 0, border: 0 }}\r\n />\r\n </TableRow>\r\n ) : null}\r\n\r\n {rowsToRender.map((row, offset) => {\r\n const index = windowed.start + offset\r\n const rowKey = config.getterId(row, index) ?? index\r\n const isSelected = selectedIds.includes(rowKey)\r\n const { rowHeight, cellPadding } = mergedConfig\r\n return (\r\n <TableRow key={rowKey} hover sx={{ height: rowHeight }} selected={isSelected}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableBodyCell} sx={{ height: rowHeight, padding: cellPadding }}>\r\n <Checkbox checked={isSelected} onChange={() => handleToggleRow(rowKey)} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, totalFixedPx, { height: rowHeight, padding: cellPadding })}\r\n >\r\n <Box className={classes.tableCellContent}>{renderCellValue(col, row, index)}</Box>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )\r\n })}\r\n\r\n {windowed.bottomSpacerHeight > 0 ? (\r\n <TableRow className={classes.tableSpacerRow}>\r\n <TableCell\r\n colSpan={mergedConfig.columns.length + (mergedConfig.selectable ? 1 : 0)}\r\n className={classes.tableSpacerCell}\r\n sx={{ height: windowed.bottomSpacerHeight, padding: 0, border: 0 }}\r\n />\r\n </TableRow>\r\n ) : null}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </ViewListStyled>\r\n )\r\n }\r\n return ViewListVirtualized\r\n}\r\n//#endregion\r\n//#region Main\r\nexport function createViewList<T>(config: IViewListConfig<T>) {\r\n const ViewListNormal = createViewListNormal<T>(config)\r\n const ViewListVirtualized = createViewListVirtualized<T>(config)\r\n\r\n const ViewList: FC<IViewListProps<T>> = (props) => {\r\n const renderStrategy = props.renderStrategy ?? config.renderStrategy ?? 'normal'\r\n if (renderStrategy === 'virtualized') {\r\n return <ViewListVirtualized {...props} />\r\n }\r\n return <ViewListNormal {...props} />\r\n }\r\n return ViewList\r\n}\r\n\r\nexport interface IViewListLoadingProps<T> extends IViewListProps<T> {\r\n loadMode: LoadingModeRule\r\n loading?: boolean\r\n pagination?: TPagination\r\n onPageChange?: (page: number, pageSize: number) => void | Promise<void>\r\n}\r\n\r\nexport function createViewListLoading<T>(ListComponent: ComponentType<IViewListProps<T>>) {\r\n const ViewListLoading: FC<IViewListLoadingProps<T>> = (props) => {\r\n const handleNearEnd = useCallback(async () => {\r\n if (props.loadMode !== 'infiniteScroll') return\r\n if (!props.pagination?.hasNext) return\r\n if (props.loading) return\r\n\r\n const currentPage = props.pagination?.page ?? 0\r\n const currentPageSize = props.pagination?.pageSize ?? 20\r\n const nextPage = currentPage + 1\r\n await props.onPageChange?.(nextPage, currentPageSize)\r\n }, [props.loadMode, props.pagination?.hasNext, props.pagination?.page, props.pagination?.pageSize, props.loading, props.onPageChange])\r\n\r\n return (\r\n <ListComponent\r\n value={props.value}\r\n columns={props.columns}\r\n density={props.density}\r\n spacing={props.spacing}\r\n renderStrategy={props.renderStrategy}\r\n normalOptions={props.normalOptions}\r\n virtualizedOptions={props.virtualizedOptions}\r\n onNearEnd={props.loadMode === 'infiniteScroll' ? handleNearEnd : undefined}\r\n selectable={props.selectable}\r\n selectedIds={props.selectedIds}\r\n onSelectionChange={props.onSelectionChange}\r\n scrollResetToken={props.scrollResetToken}\r\n />\r\n )\r\n }\r\n\r\n return ViewListLoading\r\n}\r\n\r\nexport default createViewList\r\n//#endregion\r\n"],"names":["renderCellValue","column","row","index","currentValue","field","value","valueGetter","params","renderCell","valueLabel","String","_jsx","Typography","variant","noWrap","title","renderColGroup","cols","totalFlex","totalFixedPx","selectable","_jsxs","style","width","CHECKBOX_COL_WIDTH","map","col","i","w","getColumnWidth","undefined","createViewList","config","ViewListNormal","props","mergedConfig","useMergedConfig","columns","reduce","sum","flex","totalFixedPxRaw","minWidth","isAutoHeight","normalOptions","autoHeight","onSelectionChange","scrollContainerRef","useRef","useEffect","scrollResetToken","current","scrollTop","selection","useListSelection","getterId","selectedIds","isAllSelected","isSomeSelected","handleToggleAll","handleToggleRow","rootClasses","useMemo","l","classes","root","normal","push","join","ViewListStyled","className","rootStyle","children","TableContainer","ref","scrollContainer","onScroll","e","_props$onNearEnd","t","currentTarget","scrollHeight","clientHeight","nearEndThreshold","onNearEnd","call","Table","size","table","TableHead","tableHeader","TableRow","TableCell","padding","tableHeaderCell","Checkbox","checked","indeterminate","onChange","_col$label","align","sx","mapSxTableCell","label","TableBody","_config$getterId","rowKey","isSelected","includes","rowHeight","cellPadding","hover","height","selected","tableBodyCell","Box","tableCellContent","concat","createViewListNormal","ViewListVirtualized","wrapRef","headerRowRef","hasHeaderMeasuredRef","_useState","useState","_useState2","_slicedToArray","containerHeight","setContainerHeight","_useState3","_useState4","scrollTopState","setScrollTopState","_useState5","LIST_HEADER_HEIGHT","_useState6","headerHeight","setHeaderHeight","overscan","Math","max","virtualizedOptions","useLayoutEffect","domScrollTop","round","updateSize","_wrapRef$current$clie","_wrapRef$current","nextHeight","prev","observer","ResizeObserver","observe","disconnect","length","_headerRowRef$current","_headerRowRef$current2","measured","offsetHeight","windowed","totalItems","start","end","topSpacerHeight","bottomSpacerHeight","defaultVisible","min","rowSpacing","intRowHeight","intRowSpacing","rowStride","effectiveScrollTop","safeViewportHeight","adjustedScrollTop","visibleCount","ceil","floor","resolveListSpacerHeight","rowsToRender","slice","virtualized","filter","Boolean","_props$onNearEnd2","_col$label2","tableSpacerRow","colSpan","tableSpacerCell","border","offset","_config$getterId2","createViewListVirtualized","_ref","_props$renderStrategy","renderStrategy","_objectSpread","createViewListLoading","ListComponent","_props$pagination4","_props$pagination5","_props$pagination6","handleNearEnd","useCallback","_asyncToGenerator","_regenerator","m","_callee","_props$pagination","_props$pagination$pag","_props$pagination2","_props$pagination$pag2","_props$pagination3","_props$onPageChange","currentPage","currentPageSize","nextPage","_context","n","loadMode","a","pagination","hasNext","loading","page","pageSize","onPageChange","density","spacing"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/data-surface/view-list/index.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\r\nimport { Box, Checkbox, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Typography } from '@mui/material'\r\nimport { useListSelection, useMergedConfig } from './hooks'\r\nimport { ViewListStyled, viewListClasses as classes } from './styled'\r\nimport { LIST_HEADER_HEIGHT, CHECKBOX_COL_WIDTH, getColumnWidth, mapSxTableCell, resolveListSpacerHeight } from './helpers'\r\n// types\r\nimport type { TableContainerProps } from '@mui/material'\r\nimport type { ComponentType, FC, ReactNode } from 'react'\r\nimport type { LoadingModeRule, TPagination } from '../types'\r\nimport type { IListCellParams, IViewListConfig, IViewListProps, TListColumn } from './types'\r\n\r\nexport * from './types'\r\n\r\n//#region Helpers\r\nfunction renderCellValue<T>(column: TListColumn<T>, row: T, index: number): ReactNode {\r\n const currentValue = (row as any)[column.field]\r\n const value = column.valueGetter ? column.valueGetter(currentValue, row, index) : currentValue\r\n const params: IListCellParams<T> = { value, row, index, field: column.field }\r\n if (column.renderCell) return column.renderCell(params)\r\n const valueLabel = String(value ?? '')\r\n return (\r\n <Typography variant='body2' noWrap title={valueLabel}>\r\n {valueLabel}\r\n </Typography>\r\n )\r\n}\r\n\r\nfunction renderColGroup<T>(cols: TListColumn<T>[], totalFlex: number, totalFixedPx: number, selectable: boolean) {\r\n return (\r\n <colgroup>\r\n {selectable && <col style={{ width: CHECKBOX_COL_WIDTH }} />}\r\n {cols.map((col, i) => {\r\n const w = getColumnWidth(col, totalFixedPx, totalFlex)\r\n return <col key={i} style={w !== undefined ? { width: w as any } : undefined} />\r\n })}\r\n </colgroup>\r\n )\r\n}\r\n\r\n//#endregion\r\n//#region Normal List\r\nfunction createViewListNormal<T>(config: IViewListConfig<T>) {\r\n const ViewListNormal: FC<IViewListProps<T>> = (props) => {\r\n const mergedConfig = useMergedConfig(config, props)\r\n const totalFlex = mergedConfig.columns.reduce((sum, col) => sum + (col.flex && col.flex > 0 ? col.flex : 0), 0)\r\n const totalFixedPxRaw = mergedConfig.columns.reduce((sum, col) => {\r\n if (typeof col.width === 'number') return sum + col.width\r\n if (col.width === undefined && col.flex === undefined && typeof col.minWidth === 'number') return sum + col.minWidth\r\n return sum\r\n }, 0)\r\n const totalFixedPx = (mergedConfig.selectable ? CHECKBOX_COL_WIDTH : 0) + totalFixedPxRaw\r\n\r\n const { normalOptions } = mergedConfig\r\n const isAutoHeight = normalOptions.autoHeight == true\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n const scrollContainerRef = useRef<HTMLDivElement | null>(null)\r\n\r\n // Reset scroll to top when token changes\r\n useEffect(() => {\r\n if (isAutoHeight || props.scrollResetToken === undefined) return\r\n if (scrollContainerRef.current) scrollContainerRef.current.scrollTop = 0\r\n }, [props.scrollResetToken])\r\n\r\n const handleScroll: TableContainerProps['onScroll'] = (e) => {\r\n if (isAutoHeight) return\r\n const t = e.currentTarget\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n // Use selection hook to manage checkbox state and handlers\r\n const selection = useListSelection(props.value, config.getterId, mergedConfig.selectable, props.selectedIds, onSelectionChange)\r\n const { selectedIds, isAllSelected, isSomeSelected, handleToggleAll, handleToggleRow } = selection\r\n\r\n const rootClasses = useMemo(() => {\r\n const l = [classes.root, classes.normal]\r\n if (isAutoHeight) l.push(classes.autoHeight)\r\n return l.join(' ')\r\n }, [isAutoHeight])\r\n\r\n return (\r\n <ViewListStyled className={rootClasses} style={mergedConfig.rootStyle}>\r\n <TableContainer ref={scrollContainerRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n <Table size='small' className={classes.table}>\r\n {renderColGroup(mergedConfig.columns, totalFlex, totalFixedPx, mergedConfig.selectable)}\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell\r\n key={String(col.field)}\r\n className={classes.tableHeaderCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, totalFixedPx)}\r\n >\r\n {col.label ?? String(col.field)}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {props.value.map((row, index) => {\r\n const rowKey = config.getterId(row, index) ?? index\r\n const isSelected = selectedIds.includes(rowKey)\r\n const { rowHeight, cellPadding } = mergedConfig\r\n return (\r\n <TableRow key={rowKey} hover sx={{ height: rowHeight }} selected={isSelected}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableBodyCell} sx={{ height: rowHeight, padding: cellPadding }}>\r\n <Checkbox checked={isSelected} onChange={() => handleToggleRow(rowKey)} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, totalFixedPx, { height: rowHeight, padding: cellPadding })}\r\n >\r\n <Box className={classes.tableCellContent}>{renderCellValue(col, row, index)}</Box>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )\r\n })}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </ViewListStyled>\r\n )\r\n }\r\n return ViewListNormal\r\n}\r\n//#endregion\r\n//#region Virtualized List\r\nfunction createViewListVirtualized<T>(config: IViewListConfig<T>) {\r\n const ViewListVirtualized: FC<IViewListProps<T>> = (props) => {\r\n const mergedConfig = useMergedConfig(config, props)\r\n const totalFlex = mergedConfig.columns.reduce((sum, col) => sum + (col.flex && col.flex > 0 ? col.flex : 0), 0)\r\n const totalFixedPxRaw = mergedConfig.columns.reduce((sum, col) => {\r\n if (typeof col.width === 'number') return sum + col.width\r\n if (col.width === undefined && col.flex === undefined && typeof col.minWidth === 'number') return sum + col.minWidth\r\n return sum\r\n }, 0)\r\n const totalFixedPx = (mergedConfig.selectable ? CHECKBOX_COL_WIDTH : 0) + totalFixedPxRaw\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n\r\n // Use selection hook to manage checkbox state and handlers\r\n const selection = useListSelection(props.value, config.getterId, mergedConfig.selectable, props.selectedIds, onSelectionChange)\r\n const { selectedIds, isAllSelected, isSomeSelected, handleToggleAll, handleToggleRow } = selection\r\n\r\n const wrapRef = useRef<HTMLDivElement | null>(null)\r\n const headerRowRef = useRef<HTMLTableRowElement | null>(null)\r\n const hasHeaderMeasuredRef = useRef(false)\r\n const [containerHeight, setContainerHeight] = useState(0)\r\n const [scrollTopState, setScrollTopState] = useState(0)\r\n const [headerHeight, setHeaderHeight] = useState(LIST_HEADER_HEIGHT)\r\n\r\n const overscan = Math.max(1, mergedConfig.virtualizedOptions.overscan)\r\n\r\n // Reset scroll to top when token changes\r\n useEffect(() => {\r\n if (props.scrollResetToken === undefined) return\r\n if (wrapRef.current) wrapRef.current.scrollTop = 0\r\n setScrollTopState(0)\r\n }, [props.scrollResetToken])\r\n\r\n const handleScroll: TableContainerProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n setScrollTopState(Math.round(t.scrollTop))\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n useLayoutEffect(() => {\r\n if (!wrapRef.current) return\r\n\r\n // Sync scrollTopState from actual DOM scroll position on mount.\r\n // Guards against stale state when the component is reused across navigations\r\n // (browser may have preserved a non-zero scrollTop while React state reset to 0).\r\n const domScrollTop = wrapRef.current.scrollTop\r\n if (domScrollTop > 0) setScrollTopState(Math.round(domScrollTop))\r\n\r\n const updateSize = () => {\r\n const nextHeight = wrapRef.current?.clientHeight ?? 0\r\n setContainerHeight((prev) => (prev === nextHeight ? prev : nextHeight))\r\n }\r\n\r\n updateSize()\r\n\r\n const observer = new ResizeObserver(() => updateSize())\r\n observer.observe(wrapRef.current)\r\n return () => observer.disconnect()\r\n }, [])\r\n\r\n useLayoutEffect(() => {\r\n hasHeaderMeasuredRef.current = false\r\n }, [mergedConfig.columns.length])\r\n\r\n useLayoutEffect(() => {\r\n if (hasHeaderMeasuredRef.current) return\r\n const measured = headerRowRef.current?.offsetHeight ?? 0\r\n if (measured > 0) {\r\n hasHeaderMeasuredRef.current = true\r\n setHeaderHeight(measured)\r\n }\r\n }, [mergedConfig.columns.length])\r\n\r\n const windowed = useMemo(() => {\r\n const totalItems = props.value.length\r\n if (totalItems === 0) {\r\n return { start: 0, end: -1, topSpacerHeight: 0, bottomSpacerHeight: 0 }\r\n }\r\n // Container not yet measured — render from start with no spacers to avoid\r\n // the bottom-clamp formula producing start > 0 with a stale visibleCount of 1.\r\n if (containerHeight === 0) {\r\n const defaultVisible = overscan * 2 + 1\r\n return { start: 0, end: Math.min(totalItems - 1, defaultVisible), topSpacerHeight: 0, bottomSpacerHeight: 0 }\r\n }\r\n const { rowHeight, rowSpacing } = mergedConfig\r\n const intRowHeight = Math.round(rowHeight)\r\n const intRowSpacing = Math.round(rowSpacing)\r\n const rowStride = intRowHeight + intRowSpacing\r\n const effectiveScrollTop = scrollTopState\r\n const safeViewportHeight = Math.max(1, containerHeight - headerHeight)\r\n const adjustedScrollTop = Math.max(0, effectiveScrollTop - headerHeight)\r\n const visibleCount = Math.ceil(safeViewportHeight / rowStride)\r\n let start = Math.max(0, Math.floor(adjustedScrollTop / rowStride) - overscan)\r\n let end = Math.min(totalItems - 1, start + visibleCount + overscan * 2)\r\n\r\n // When clamped at the bottom, pin start to a fixed value so that topSpacerHeight\r\n // does not change with small scrollTop fluctuations (sub-pixel zoom oscillation fix).\r\n // Guard: only apply when user has actually scrolled (adjustedScrollTop > 0).\r\n // Without this guard the clamp incorrectly sets start > 0 when scrollTop = 0\r\n // and totalItems is just enough to trigger end === totalItems-1 (e.g. 24 items, 11 visible).\r\n if (end === totalItems - 1 && adjustedScrollTop > 0) {\r\n start = Math.max(0, totalItems - visibleCount - overscan * 2)\r\n }\r\n\r\n const topSpacerHeight = resolveListSpacerHeight(start, intRowHeight, intRowSpacing)\r\n const bottomSpacerHeight = resolveListSpacerHeight(totalItems - end - 1, intRowHeight, intRowSpacing)\r\n\r\n return { start, end, topSpacerHeight, bottomSpacerHeight }\r\n }, [props.value.length, headerHeight, overscan, mergedConfig, scrollTopState, containerHeight])\r\n\r\n const rowsToRender = windowed.end >= windowed.start ? props.value.slice(windowed.start, windowed.end + 1) : []\r\n const rootClasses = [classes.root, classes.virtualized].filter(Boolean).join(' ')\r\n return (\r\n <ViewListStyled className={rootClasses} style={mergedConfig.rootStyle}>\r\n <TableContainer ref={wrapRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n <Table size='small' className={classes.table}>\r\n {renderColGroup(mergedConfig.columns, totalFlex, totalFixedPx, mergedConfig.selectable)}\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow ref={headerRowRef}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell\r\n key={String(col.field)}\r\n className={classes.tableHeaderCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, totalFixedPx)}\r\n >\r\n {col.label ?? String(col.field)}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {windowed.topSpacerHeight > 0 ? (\r\n <TableRow className={classes.tableSpacerRow}>\r\n <TableCell\r\n colSpan={mergedConfig.columns.length + (mergedConfig.selectable ? 1 : 0)}\r\n className={classes.tableSpacerCell}\r\n sx={{ height: windowed.topSpacerHeight, padding: 0, border: 0 }}\r\n />\r\n </TableRow>\r\n ) : null}\r\n\r\n {rowsToRender.map((row, offset) => {\r\n const index = windowed.start + offset\r\n const rowKey = config.getterId(row, index) ?? index\r\n const isSelected = selectedIds.includes(rowKey)\r\n const { rowHeight, cellPadding } = mergedConfig\r\n return (\r\n <TableRow key={rowKey} hover sx={{ height: rowHeight }} selected={isSelected}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableBodyCell} sx={{ height: rowHeight, padding: cellPadding }}>\r\n <Checkbox checked={isSelected} onChange={() => handleToggleRow(rowKey)} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, totalFixedPx, { height: rowHeight, padding: cellPadding })}\r\n >\r\n <Box className={classes.tableCellContent}>{renderCellValue(col, row, index)}</Box>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )\r\n })}\r\n\r\n {windowed.bottomSpacerHeight > 0 ? (\r\n <TableRow className={classes.tableSpacerRow}>\r\n <TableCell\r\n colSpan={mergedConfig.columns.length + (mergedConfig.selectable ? 1 : 0)}\r\n className={classes.tableSpacerCell}\r\n sx={{ height: windowed.bottomSpacerHeight, padding: 0, border: 0 }}\r\n />\r\n </TableRow>\r\n ) : null}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </ViewListStyled>\r\n )\r\n }\r\n return ViewListVirtualized\r\n}\r\n//#endregion\r\n//#region Main\r\nexport function createViewList<T>(config: IViewListConfig<T>) {\r\n const ViewListNormal = createViewListNormal<T>(config)\r\n const ViewListVirtualized = createViewListVirtualized<T>(config)\r\n\r\n const ViewList: FC<IViewListProps<T>> = (props) => {\r\n const renderStrategy = props.renderStrategy ?? config.renderStrategy ?? 'normal'\r\n if (renderStrategy === 'virtualized') {\r\n return <ViewListVirtualized {...props} />\r\n }\r\n return <ViewListNormal {...props} />\r\n }\r\n return ViewList\r\n}\r\n\r\nexport interface IViewListLoadingProps<T> extends IViewListProps<T> {\r\n loadMode: LoadingModeRule\r\n loading?: boolean\r\n pagination?: TPagination\r\n onPageChange?: (page: number, pageSize: number) => void | Promise<void>\r\n}\r\n\r\nexport function createViewListLoading<T>(ListComponent: ComponentType<IViewListProps<T>>) {\r\n const ViewListLoading: FC<IViewListLoadingProps<T>> = (props) => {\r\n const handleNearEnd = useCallback(async () => {\r\n if (props.loadMode !== 'infiniteScroll') return\r\n if (!props.pagination?.hasNext) return\r\n if (props.loading) return\r\n\r\n const currentPage = props.pagination?.page ?? 0\r\n const currentPageSize = props.pagination?.pageSize ?? 20\r\n const nextPage = currentPage + 1\r\n await props.onPageChange?.(nextPage, currentPageSize)\r\n }, [props.loadMode, props.pagination?.hasNext, props.pagination?.page, props.pagination?.pageSize, props.loading, props.onPageChange])\r\n\r\n return (\r\n <ListComponent\r\n value={props.value}\r\n columns={props.columns}\r\n density={props.density}\r\n spacing={props.spacing}\r\n renderStrategy={props.renderStrategy}\r\n normalOptions={props.normalOptions}\r\n virtualizedOptions={props.virtualizedOptions}\r\n onNearEnd={props.loadMode === 'infiniteScroll' ? handleNearEnd : undefined}\r\n selectable={props.selectable}\r\n selectedIds={props.selectedIds}\r\n onSelectionChange={props.onSelectionChange}\r\n scrollResetToken={props.scrollResetToken}\r\n />\r\n )\r\n }\r\n\r\n return ViewListLoading\r\n}\r\n\r\nexport default createViewList\r\n//#endregion\r\n"],"names":["renderCellValue","column","row","index","currentValue","field","value","valueGetter","params","renderCell","valueLabel","String","_jsx","Typography","variant","noWrap","title","renderColGroup","cols","totalFlex","totalFixedPx","selectable","_jsxs","style","width","CHECKBOX_COL_WIDTH","map","col","i","w","getColumnWidth","undefined","createViewList","config","ViewListNormal","props","mergedConfig","useMergedConfig","columns","reduce","sum","flex","totalFixedPxRaw","minWidth","isAutoHeight","normalOptions","autoHeight","onSelectionChange","scrollContainerRef","useRef","useEffect","scrollResetToken","current","scrollTop","selection","useListSelection","getterId","selectedIds","isAllSelected","isSomeSelected","handleToggleAll","handleToggleRow","rootClasses","useMemo","l","classes","root","normal","push","join","ViewListStyled","className","rootStyle","children","TableContainer","ref","scrollContainer","onScroll","e","_props$onNearEnd","t","currentTarget","scrollHeight","clientHeight","nearEndThreshold","onNearEnd","call","Table","size","table","TableHead","tableHeader","TableRow","TableCell","padding","tableHeaderCell","Checkbox","checked","indeterminate","onChange","_col$label","align","sx","mapSxTableCell","label","TableBody","_config$getterId","rowKey","isSelected","includes","rowHeight","cellPadding","hover","height","selected","tableBodyCell","Box","tableCellContent","concat","createViewListNormal","ViewListVirtualized","wrapRef","headerRowRef","hasHeaderMeasuredRef","_useState","useState","_useState2","_slicedToArray","containerHeight","setContainerHeight","_useState3","_useState4","scrollTopState","setScrollTopState","_useState5","LIST_HEADER_HEIGHT","_useState6","headerHeight","setHeaderHeight","overscan","Math","max","virtualizedOptions","useLayoutEffect","domScrollTop","round","updateSize","_wrapRef$current$clie","_wrapRef$current","nextHeight","prev","observer","ResizeObserver","observe","disconnect","length","_headerRowRef$current","_headerRowRef$current2","measured","offsetHeight","windowed","totalItems","start","end","topSpacerHeight","bottomSpacerHeight","defaultVisible","min","rowSpacing","intRowHeight","intRowSpacing","rowStride","effectiveScrollTop","safeViewportHeight","adjustedScrollTop","visibleCount","ceil","floor","resolveListSpacerHeight","rowsToRender","slice","virtualized","filter","Boolean","_props$onNearEnd2","_col$label2","tableSpacerRow","colSpan","tableSpacerCell","border","offset","_config$getterId2","createViewListVirtualized","_ref","_props$renderStrategy","renderStrategy","_objectSpread","createViewListLoading","ListComponent","_props$pagination4","_props$pagination5","_props$pagination6","handleNearEnd","useCallback","_asyncToGenerator","_regenerator","m","_callee","_props$pagination","_props$pagination$pag","_props$pagination2","_props$pagination$pag2","_props$pagination3","_props$onPageChange","currentPage","currentPageSize","nextPage","_context","n","loadMode","a","pagination","hasNext","loading","page","pageSize","onPageChange","density","spacing"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createClass as t,objectWithoutProperties as e,typeof as r,classCallCheck as i,defineProperty as l}from"../../_virtual/_rollupPluginBabelHelpers.js";import{KeySpecial as a}from"./types.js";import{getSeedFromURL as o,setSeedToURL as n,removeSeedFromURL as u}from"./helpers.js";import{createRequestBuilder as s}from"../http-service/graphql/request-param.js";var c=["mode"],f=function(t){return"or"===t?"Or":"And"},v=function(t){return"asc"===t?"ASC":"DESC"};function d(t,i,l,a){var o=a||{},n=o.mode,u=e(o,c),s=r(l);switch(s){case"string":"equal"===n?i.filter(t,l.toString(),u):i.filterContains(t,l.toString(),u);break;case"number":i.filterNumber(t,"==",l.toString(),u);break;default:console.warn("Unsupported value type for filtering: ".concat(s,". Value:"),l)}}var h=function(){return t(function t(e){var r=this;i(this,t),l(this,"
|
|
1
|
+
import{createClass as t,objectWithoutProperties as e,typeof as r,classCallCheck as i,defineProperty as l}from"../../_virtual/_rollupPluginBabelHelpers.js";import{KeySpecial as a}from"./types.js";import{getSeedFromURL as o,setSeedToURL as n,removeSeedFromURL as u}from"./helpers.js";import{createRequestBuilder as s}from"../http-service/graphql/request-param.js";var c=["mode"],f=function(t){return"or"===t?"Or":"And"},v=function(t){return"asc"===t?"ASC":"DESC"};function d(t,i,l,a){var o=a||{},n=o.mode,u=e(o,c),s=r(l);switch(s){case"string":"equal"===n?i.filter(t,l.toString(),u):i.filterContains(t,l.toString(),u);break;case"number":i.filterNumber(t,"==",l.toString(),u);break;default:console.warn("Unsupported value type for filtering: ".concat(s,". Value:"),l)}}var h=function(){return t(function t(e){var r=this;i(this,t),l(this,"autoMap",function(t){(r.currentObjectMap=t,r.state.storeFilter)&&Object.keys(r.state.storeFilter).forEach(function(e){var i,l=t[e],a=null===(i=r.state.storeFilter)||void 0===i?void 0:i[e];if(l){var o=l.targetfield,n=l.operation;if(l.custom)return void l.custom(r.graphqlBuilder,a,r.state.storeFilter);switch(n){case"equal":return void r.filterEqual(e,o);case"equalAndAny":return void r.filterEqual(e,o,{isAny:!0});case"datetime":return void r.filterDatetime(e,o);default:return void r.filterContains(e,o)}}});return r}),l(this,"prebuild",function(t){return r.prebuildFunc=t,r}),this.state=e,this.graphqlBuilder=s({ignoreEmpty:!0})},[{key:"filterScope",value:function(t,e){var r=this;if(this.state.storeFilter){var i=(null==e?void 0:e.logic)||this.state.filterLogic||"and",l=f(i);this.graphqlBuilder.scope(function(e){return t(e,r.state.storeFilter),e},{logic:l})}return this}},{key:"filterEqual",value:function(t,e,r){var i,l,a=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},o=Array.isArray(a.values)?a.values:[a.values];if(!o||o.length<1||!e)return this;var n=f(a.logic);return this.filterScope(function(t){if(null!=r&&r.isAny)t.filterCustom("".concat(null==e?void 0:e.toString(),".isAny(").concat(JSON.stringify(o),")"),{logic:n});else for(var i=0;i<o.length;i++)d(e,t,o[i],{logic:n,mode:"equal"})},r),this}},{key:"filterContains",value:function(t,e,r){var i,l,a=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},o=Array.isArray(a.values)?a.values:[a.values];if(!o||o.length<1||!e)return this;var n=f(a.logic);return this.filterScope(function(t){for(var r=0;r<o.length;r++)d(e,t,o[r],{logic:n,mode:"contains"})},r),this}},{key:"filterDatetime",value:function(t,e,r){var i,l,a=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},o=Array.isArray(a.values)?a.values:[a.values];if(!o||o.length<1||!e)return this;if("range"===a.dateLogic&&o.length>=2){this.filterScope(function(t){t.filterGreaterEqual(e,o[0].toString(),{}),t.filterLessEqual(e,o[1].toString(),{logic:"And"})},r)}else if(1==o.length){this.filterScope(function(t){switch(a.dateLogic){case"before":t.filterLessEqual(e,o[0].toString());break;case"after":t.filterGreaterEqual(e,o[0].toString());break;default:t.filterEqual(e,o[0].toString())}},r)}return this}},{key:"sort",value:function(t){var e,r,i=this.state.storeSort,l=null!==(e=null==t?void 0:t.seed)&&void 0!==e?e:{},s=l.targetField,c=l.autoSave,f=void 0!==c&&c,d=s?null===(r=this.currentObjectMap)||void 0===r?void 0:r[s]:void 0,h=o();if((null==i?void 0:i.field)===a.sortShuffle){if(null==d||!d.targetfield)return this;var g=null!=h?h:(new Date).getTime().toString();this.graphqlBuilder.seed(d.targetfield,g),f&&n(g)}else{var p;h&&u();var y=null!=i&&i.field?null===(p=this.currentObjectMap)||void 0===p?void 0:p[null==i?void 0:i.field]:void 0;if(null==y||!y.targetfield)return this;this.graphqlBuilder.sort(y.targetfield,{direction:v(null==i?void 0:i.direction)})}return this}},{key:"quickSearch",value:function(t){var e,r,i=this;this.currentObjectMap||console.warn("No autoMap config found, quick search will not work properly without target field mapping.");var l=null!==(e=null===(r=this.state.storeFilter)||void 0===r?void 0:r.quickSearch)&&void 0!==e?e:{values:[],logic:"or"},a=Array.isArray(l.values)?l.values:[l.values];if(!a||a.length<1)return this;var o=f(l.logic),n=Array.isArray(t)?t:[t];return this.filterScope(function(t){n.forEach(function(e){var r,n=null===(r=i.currentObjectMap)||void 0===r?void 0:r[e];if(n&&a.length>0)if(n.custom)n.custom(t,l,i.state.storeFilter);else if(n.targetfield)for(var u=0;u<a.length;u++)d(n.targetfield,t,a[u],{logic:o})})}),this}},{key:"build",value:function(){return this.prebuildFunc&&this.prebuildFunc(this.graphqlBuilder),this.graphqlBuilder.build()}}])}(),g=function(t){return new h(t)};export{h as TableFileterConverter,g as createConvertToGraphQL,f as mapLogic,v as mapSortDirection};
|
|
2
2
|
//# sourceMappingURL=convert-to-graphql.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert-to-graphql.js","sources":["../../../src/filter-bar/convert-to-graphql.ts"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { KeySpecial } from './types'\r\nimport { getSeedFromURL, removeSeedFromURL, setSeedToURL } from './helpers'\r\nimport { createRequestBuilder, IFilterOption, RequestParam } from '../http-service/graphql/request-param'\r\n// types\r\nimport type { TFilterState, TFieldStore, TFieldValue, TLogic, TDirection, TFieldType, TFieldValid, TDateLogic } from './types'\r\n\r\ntype TFilterScopeFn<TSource, TTarget extends object> = (currentBuilder: RequestParam<TTarget>, store?: TFieldStore<TSource>) => void\r\n\r\n/**\r\n * @en\r\n * - Utility class to convert filter state from a filter bar into a GraphQL query builder.\r\n * - Supports mapping filter fields to different GraphQL fields, custom filter logic, and sorting.\r\n * @vi\r\n * - Lớp tiện ích để chuyển đổi trạng thái filter từ filter bar thành builder truy vấn GraphQL.\r\n * - Hỗ trợ ánh xạ các trường filter sang các trường GraphQL khác, logic filter tùy chỉnh và sắp xếp.\r\n */\r\ntype TAutoMapFieldCustomFn<TSource, TTarget extends object> = (\r\n currentBuilder: RequestParam<TTarget>,\r\n value?: NonNullable<TFieldStore<TSource>>[keyof TFieldStore<TSource>],\r\n store?: TFieldStore<TSource>\r\n) => void\r\n\r\ntype TAutoMapConfig<TSource, TTarget extends object> = {\r\n /**\r\n * @en The target field in the GraphQL schema that this filter field maps to. If not provided, the source field name will be used as the target field.\r\n * @vi Trường đích trong schema GraphQL mà trường filter này ánh xạ tới. Nếu không cung cấp, tên trường nguồn sẽ được sử dụng làm trường đích.\r\n */\r\n targetfield?: keyof TTarget\r\n /**\r\n * @en The operation to apply for the filter field. Can be 'equal', 'contains', or 'datetime'. @default 'contains'\r\n * @vi Thao tác áp dụng cho trường filter. Có thể là 'equal', 'contains', hoặc 'datetime'. @default 'contains'\r\n */\r\n operation?: 'equal' | 'contains' | 'datetime'\r\n /**\r\n * @en\r\n * - Custom function to apply complex filter logic that doesn't fit standard 'equal' or 'contains' operations.\r\n * - Receives the current GraphQL builder, the value of the filter field, and the entire filter store for context.\r\n * @vi\r\n * - Hàm tùy chỉnh để áp dụng logic filter phức tạp không phù hợp với các thao tác 'equal' hoặc 'contains' tiêu chuẩn.\r\n * - Nhận builder GraphQL hiện tại, giá trị của trường filter và toàn bộ store filter để có ngữ cảnh.\r\n */\r\n custom?: TAutoMapFieldCustomFn<TSource, TTarget>\r\n}\r\n\r\ntype TAutoMapConfigs<TSource, TTarget extends object> = Partial<Record<keyof TSource, TAutoMapConfig<TSource, TTarget>>>\r\n\r\ntype TFilterOption = {\r\n logic?: TLogic\r\n}\r\n\r\nexport const mapLogic = (logic?: TLogic): 'And' | 'Or' => {\r\n return logic === 'or' ? 'Or' : 'And'\r\n}\r\n\r\nexport const mapSortDirection = (direction?: TDirection): 'ASC' | 'DESC' => {\r\n return direction === 'asc' ? 'ASC' : 'DESC'\r\n}\r\n\r\ntype TFilterByTypeOptions = Partial<IFilterOption> & {\r\n mode?: 'equal' | 'contains'\r\n}\r\n\r\nfunction filterByType<TTarget extends object>(\r\n field: keyof TTarget,\r\n builder: RequestParam<TTarget>,\r\n value: TFieldValid,\r\n option?: TFilterByTypeOptions\r\n) {\r\n const { mode, ...restOption } = option || {}\r\n const valueType = typeof value\r\n switch (valueType) {\r\n case 'string':\r\n if (mode === 'equal') {\r\n builder.filter(field, value.toString(), restOption)\r\n } else {\r\n builder.filterContains(field, value.toString(), restOption)\r\n }\r\n break\r\n case 'number':\r\n builder.filterNumber(field, '==', value.toString(), restOption)\r\n break\r\n default:\r\n console.warn(`Unsupported value type for filtering: ${valueType}. Value:`, value)\r\n }\r\n}\r\n\r\nexport class TableFileterConverter<TSource extends Record<string, any>, TTarget extends object> {\r\n private state: TFilterState<TSource>\r\n constructor(state: TFilterState<TSource>) {\r\n this.state = state\r\n }\r\n\r\n private graphqlBuilder = createRequestBuilder<TTarget>({ ignoreEmpty: true })\r\n filterScope(fn: TFilterScopeFn<TSource, TTarget>, options?: TFilterOption) {\r\n if (this.state.storeFilter) {\r\n const mergedLogic = options?.logic || this.state.filterLogic || 'and'\r\n const logic = mapLogic(mergedLogic)\r\n this.graphqlBuilder.scope(\r\n (b) => {\r\n fn(b, this.state.storeFilter)\r\n return b\r\n },\r\n { logic }\r\n )\r\n }\r\n return this\r\n }\r\n\r\n filterEqual(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n const logic = mapLogic(fieldValue.logic)\r\n const fn: TFilterScopeFn<TSource, TTarget> = (builder) => {\r\n for (let index = 0; index < values.length; index++) {\r\n filterByType(targetField, builder, values[index], { logic, mode: 'equal' })\r\n }\r\n }\r\n\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n\r\n filterContains(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n const finalLogic = mapLogic(fieldValue.logic)\r\n const fn: TFilterScopeFn<TSource, TTarget> = (builder) => {\r\n for (let index = 0; index < values.length; index++) {\r\n filterByType(targetField, builder, values[index], { logic: finalLogic, mode: 'contains' })\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n\r\n filterDatetime(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n if (fieldValue.dateLogic === 'range' && values.length >= 2) {\r\n const fn: TFilterScopeFn<TSource, TTarget> = (builder) => {\r\n builder.filterGreaterEqual(targetField, values[0].toString(), {})\r\n builder.filterLessEqual(targetField, values[1].toString(), { logic: 'And' })\r\n }\r\n this.filterScope(fn, options)\r\n } else if (values.length == 1) {\r\n const fn: TFilterScopeFn<TSource, TTarget> = (builder) => {\r\n switch (fieldValue.dateLogic) {\r\n case 'before':\r\n builder.filterLess(targetField, values[0].toString())\r\n break\r\n case 'after':\r\n builder.filterGreater(targetField, values[0].toString())\r\n break\r\n case 'on':\r\n default:\r\n builder.filterEqual(targetField, values[0].toString())\r\n break\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n }\r\n return this\r\n }\r\n\r\n sort(param?: { seed: { targetField?: TFieldType<TSource>; autoSave?: boolean } }) {\r\n const store = this.state.storeSort\r\n const { targetField: seedTargetField, autoSave = false } = param?.seed ?? {}\r\n const seedField = seedTargetField ? this.currentObjectMap?.[seedTargetField] : undefined\r\n const seedFromURL = getSeedFromURL()\r\n if (store?.field === KeySpecial.sortShuffle) {\r\n if (!seedField?.targetfield) return this\r\n const seedValue = seedFromURL ?? new Date().getTime().toString()\r\n this.graphqlBuilder.seed(seedField.targetfield, seedValue)\r\n if (autoSave) setSeedToURL(seedValue)\r\n } else {\r\n if (seedFromURL) removeSeedFromURL()\r\n const field = store?.field ? this.currentObjectMap?.[store?.field] : undefined\r\n if (!field?.targetfield) return this\r\n this.graphqlBuilder.sort(field.targetfield, { direction: mapSortDirection(store?.direction) })\r\n }\r\n return this\r\n }\r\n\r\n quickSearch(fields: TFieldType<TSource> | TFieldType<TSource>[]) {\r\n if (!this.currentObjectMap) {\r\n console.warn('No autoMap config found, quick search will not work properly without target field mapping.')\r\n }\r\n const fieldValue: TFieldValue = this.state.storeFilter?.quickSearch ?? { values: [], logic: 'or' }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty) return this\r\n\r\n const logic = mapLogic(fieldValue.logic)\r\n const targetFields = Array.isArray(fields) ? fields : [fields]\r\n const fn: TFilterScopeFn<TSource, TTarget> = (builder) => {\r\n targetFields.forEach((field) => {\r\n const fieldMap = this.currentObjectMap?.[field]\r\n if (fieldMap && values && values.length > 0) {\r\n if (fieldMap.custom) {\r\n fieldMap.custom(builder, fieldValue, this.state.storeFilter)\r\n } else if (fieldMap.targetfield) {\r\n for (let index = 0; index < values.length; index++) {\r\n filterByType(fieldMap.targetfield, builder, values[index], { logic })\r\n }\r\n }\r\n }\r\n })\r\n }\r\n this.filterScope(fn)\r\n return this\r\n }\r\n\r\n private currentObjectMap?: TAutoMapConfigs<TSource, TTarget>\r\n autoMap = (objMap: TAutoMapConfigs<TSource, TTarget>) => {\r\n this.currentObjectMap = objMap\r\n\r\n if (this.state.storeFilter) {\r\n const keys = Object.keys(this.state.storeFilter) as (keyof TFieldStore<TSource>)[]\r\n // filter the keys that exist in objMap\r\n keys.forEach((key) => {\r\n const mapConfig = objMap[key]\r\n const fieldValue: TFieldValue | undefined = this.state.storeFilter?.[key]\r\n if (mapConfig) {\r\n const { targetfield, operation } = mapConfig\r\n if (mapConfig.custom) {\r\n mapConfig.custom(this.graphqlBuilder, fieldValue, this.state.storeFilter)\r\n return // skip the rest logic if custom function is provided\r\n }\r\n switch (operation) {\r\n case 'equal':\r\n this.filterEqual(key, targetfield)\r\n return // break is not needed here because of the return statement\r\n case 'datetime':\r\n this.filterDatetime(key, targetfield)\r\n return // break is not needed here because of the return statement\r\n case 'contains':\r\n default:\r\n this.filterContains(key, targetfield)\r\n return // break is not needed here because of the return statement\r\n }\r\n }\r\n })\r\n }\r\n return this\r\n }\r\n\r\n private prebuildFunc?: (rp: RequestParam<TTarget>) => RequestParam<TTarget>\r\n prebuild = (func: (requestParam: RequestParam<TTarget>) => RequestParam<TTarget>) => {\r\n this.prebuildFunc = func\r\n return this\r\n }\r\n\r\n build() {\r\n if (this.prebuildFunc) this.prebuildFunc(this.graphqlBuilder)\r\n return this.graphqlBuilder.build()\r\n }\r\n}\r\n\r\nexport const createConvertToGraphQL = <TSource extends Record<string, any>, TTarget extends object>(state: TFilterState<TSource>) => {\r\n return new TableFileterConverter<TSource, TTarget>(state)\r\n}\r\n"],"names":["mapLogic","logic","mapSortDirection","direction","filterByType","field","builder","value","option","_ref","mode","restOption","_objectWithoutProperties","_excluded","valueType","_typeof","filter","toString","filterContains","filterNumber","console","warn","concat","TableFileterConverter","_createClass","state","_this","this","_classCallCheck","_defineProperty","createRequestBuilder","ignoreEmpty","objMap","currentObjectMap","storeFilter","Object","keys","forEach","key","_this$state$storeFilt","mapConfig","fieldValue","targetfield","operation","custom","graphqlBuilder","filterEqual","filterDatetime","func","prebuildFunc","fn","options","_this2","mergedLogic","filterLogic","scope","b","targetField","_this$state$storeFilt2","_this$state$storeFilt3","values","Array","isArray","length","filterScope","index","_this$state$storeFilt4","_this$state$storeFilt5","finalLogic","_this$state$storeFilt6","_this$state$storeFilt7","dateLogic","filterGreaterEqual","filterLessEqual","filterLess","filterGreater","param","_param$seed","_this$currentObjectMa","store","storeSort","_ref2","seed","seedTargetField","_ref2$autoSave","autoSave","seedField","undefined","seedFromURL","getSeedFromURL","KeySpecial","sortShuffle","seedValue","Date","getTime","setSeedToURL","_this$currentObjectMa2","removeSeedFromURL","sort","fields","_this$state$storeFilt8","_this$state$storeFilt9","_this3","quickSearch","targetFields","_this3$currentObjectM","fieldMap","build","createConvertToGraphQL"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"convert-to-graphql.js","sources":["../../../src/filter-bar/convert-to-graphql.ts"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { KeySpecial } from './types'\r\nimport { getSeedFromURL, removeSeedFromURL, setSeedToURL } from './helpers'\r\nimport { createRequestBuilder, IFilterOption, RequestParam } from '../http-service/graphql/request-param'\r\n// types\r\nimport type { TFilterState, TFieldStore, TFieldValue, TLogic, TDirection, TFieldType, TFieldValid, TDateLogic } from './types'\r\n\r\ntype TFilterScopeFn<TSource, TTarget extends object, U extends object = {}> = (\r\n currentBuilder: RequestParam<TTarget, U>,\r\n store?: TFieldStore<TSource>\r\n) => void\r\n\r\n/**\r\n * @en\r\n * - Utility class to convert filter state from a filter bar into a GraphQL query builder.\r\n * - Supports mapping filter fields to different GraphQL fields, custom filter logic, and sorting.\r\n * @vi\r\n * - Lớp tiện ích để chuyển đổi trạng thái filter từ filter bar thành builder truy vấn GraphQL.\r\n * - Hỗ trợ ánh xạ các trường filter sang các trường GraphQL khác, logic filter tùy chỉnh và sắp xếp.\r\n */\r\ntype TAutoMapFieldCustomFn<TSource, TTarget extends object, U extends object = {}> = (\r\n currentBuilder: RequestParam<TTarget, U>,\r\n value?: NonNullable<TFieldStore<TSource>>[keyof TFieldStore<TSource>],\r\n store?: TFieldStore<TSource>\r\n) => void\r\n\r\ntype TAutoMapConfig<TSource, TTarget extends object, U extends object = {}> = {\r\n /**\r\n * @en The target field in the GraphQL schema that this filter field maps to. If not provided, the source field name will be used as the target field.\r\n * @vi Trường đích trong schema GraphQL mà trường filter này ánh xạ tới. Nếu không cung cấp, tên trường nguồn sẽ được sử dụng làm trường đích.\r\n */\r\n targetfield?: keyof TTarget\r\n /**\r\n * @en The operation to apply for the filter field. @default 'contains'\r\n * @vi Thao tác áp dụng cho trường filter. @default 'contains'\r\n */\r\n operation?: 'equal' | 'contains' | 'datetime' | 'equalAndAny'\r\n /**\r\n * @en\r\n * - Custom function to apply complex filter logic that doesn't fit standard 'equal' or 'contains' operations.\r\n * - Receives the current GraphQL builder, the value of the filter field, and the entire filter store for context.\r\n * @vi\r\n * - Hàm tùy chỉnh để áp dụng logic filter phức tạp không phù hợp với các thao tác 'equal' hoặc 'contains' tiêu chuẩn.\r\n * - Nhận builder GraphQL hiện tại, giá trị của trường filter và toàn bộ store filter để có ngữ cảnh.\r\n */\r\n custom?: TAutoMapFieldCustomFn<TSource, TTarget, U>\r\n}\r\n\r\ntype TAutoMapConfigs<TSource, TTarget extends object, U extends object = {}> = Partial<Record<keyof TSource, TAutoMapConfig<TSource, TTarget, U>>>\r\n\r\ntype TFilterOption = {\r\n logic?: TLogic\r\n}\r\n\r\nexport const mapLogic = (logic?: TLogic): 'And' | 'Or' => {\r\n return logic === 'or' ? 'Or' : 'And'\r\n}\r\n\r\nexport const mapSortDirection = (direction?: TDirection): 'ASC' | 'DESC' => {\r\n return direction === 'asc' ? 'ASC' : 'DESC'\r\n}\r\n\r\ntype TFilterByTypeOptions = Partial<IFilterOption> & {\r\n mode?: 'equal' | 'contains'\r\n}\r\n\r\nfunction filterByType<TTarget extends object, U extends object = {}>(\r\n field: keyof TTarget,\r\n builder: RequestParam<TTarget, U>,\r\n value: TFieldValid,\r\n option?: TFilterByTypeOptions\r\n) {\r\n const { mode, ...restOption } = option || {}\r\n const valueType = typeof value\r\n switch (valueType) {\r\n case 'string':\r\n if (mode === 'equal') {\r\n builder.filter(field, value.toString(), restOption)\r\n } else {\r\n builder.filterContains(field, value.toString(), restOption)\r\n }\r\n break\r\n case 'number':\r\n builder.filterNumber(field, '==', value.toString(), restOption)\r\n break\r\n default:\r\n console.warn(`Unsupported value type for filtering: ${valueType}. Value:`, value)\r\n }\r\n}\r\n\r\nexport class TableFileterConverter<TSource extends Record<string, any>, TTarget extends object, U extends object = {}> {\r\n private state: TFilterState<TSource>\r\n private graphqlBuilder: RequestParam<TTarget, U>\r\n constructor(state: TFilterState<TSource>) {\r\n this.state = state\r\n this.graphqlBuilder = createRequestBuilder<TTarget, U>({ ignoreEmpty: true })\r\n }\r\n\r\n filterScope(fn: TFilterScopeFn<TSource, TTarget, U>, options?: TFilterOption) {\r\n if (this.state.storeFilter) {\r\n const mergedLogic = options?.logic || this.state.filterLogic || 'and'\r\n const logic = mapLogic(mergedLogic)\r\n this.graphqlBuilder.scope(\r\n (b) => {\r\n fn(b as unknown as RequestParam<TTarget, U>, this.state.storeFilter)\r\n return b\r\n },\r\n { logic }\r\n )\r\n }\r\n return this\r\n }\r\n\r\n filterEqual(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption & { isAny?: boolean }) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n const logic = mapLogic(fieldValue.logic)\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n if (options?.isAny) {\r\n builder.filterCustom(`${targetField?.toString()}.isAny(${JSON.stringify(values)})`, { logic })\r\n } else {\r\n for (let index = 0; index < values.length; index++) {\r\n filterByType(targetField, builder, values[index], { logic, mode: 'equal' })\r\n }\r\n }\r\n }\r\n\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n\r\n filterContains(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n const finalLogic = mapLogic(fieldValue.logic)\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n for (let index = 0; index < values.length; index++) {\r\n filterByType(targetField, builder, values[index], { logic: finalLogic, mode: 'contains' })\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n\r\n filterDatetime(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n if (fieldValue.dateLogic === 'range' && values.length >= 2) {\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n builder.filterGreaterEqual(targetField, values[0].toString(), {})\r\n builder.filterLessEqual(targetField, values[1].toString(), { logic: 'And' })\r\n }\r\n this.filterScope(fn, options)\r\n } else if (values.length == 1) {\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n switch (fieldValue.dateLogic) {\r\n case 'before':\r\n builder.filterLessEqual(targetField, values[0].toString())\r\n break\r\n case 'after':\r\n builder.filterGreaterEqual(targetField, values[0].toString())\r\n break\r\n case 'on':\r\n default:\r\n builder.filterEqual(targetField, values[0].toString())\r\n break\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n }\r\n return this\r\n }\r\n\r\n sort(param?: { seed: { targetField?: TFieldType<TSource>; autoSave?: boolean } }) {\r\n const store = this.state.storeSort\r\n const { targetField: seedTargetField, autoSave = false } = param?.seed ?? {}\r\n const seedField = seedTargetField ? this.currentObjectMap?.[seedTargetField] : undefined\r\n const seedFromURL = getSeedFromURL()\r\n if (store?.field === KeySpecial.sortShuffle) {\r\n if (!seedField?.targetfield) return this\r\n const seedValue = seedFromURL ?? new Date().getTime().toString()\r\n this.graphqlBuilder.seed(seedField.targetfield, seedValue)\r\n if (autoSave) setSeedToURL(seedValue)\r\n } else {\r\n if (seedFromURL) removeSeedFromURL()\r\n const field = store?.field ? this.currentObjectMap?.[store?.field] : undefined\r\n if (!field?.targetfield) return this\r\n this.graphqlBuilder.sort(field.targetfield, { direction: mapSortDirection(store?.direction) })\r\n }\r\n return this\r\n }\r\n\r\n quickSearch(fields: TFieldType<TSource> | TFieldType<TSource>[]) {\r\n if (!this.currentObjectMap) {\r\n console.warn('No autoMap config found, quick search will not work properly without target field mapping.')\r\n }\r\n const fieldValue: TFieldValue = this.state.storeFilter?.quickSearch ?? { values: [], logic: 'or' }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty) return this\r\n\r\n const logic = mapLogic(fieldValue.logic)\r\n const targetFields = Array.isArray(fields) ? fields : [fields]\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n targetFields.forEach((field) => {\r\n const fieldMap = this.currentObjectMap?.[field]\r\n if (fieldMap && values.length > 0) {\r\n if (fieldMap.custom) {\r\n fieldMap.custom(builder, fieldValue, this.state.storeFilter)\r\n } else if (fieldMap.targetfield) {\r\n for (let index = 0; index < values.length; index++) {\r\n filterByType(fieldMap.targetfield, builder, values[index], { logic })\r\n }\r\n }\r\n }\r\n })\r\n }\r\n this.filterScope(fn)\r\n return this\r\n }\r\n\r\n private currentObjectMap?: TAutoMapConfigs<TSource, TTarget, U>\r\n autoMap = (objMap: TAutoMapConfigs<TSource, TTarget, U>) => {\r\n this.currentObjectMap = objMap\r\n\r\n if (this.state.storeFilter) {\r\n const keys = Object.keys(this.state.storeFilter) as (keyof TFieldStore<TSource>)[]\r\n // filter the keys that exist in objMap\r\n keys.forEach((key) => {\r\n const mapConfig = objMap[key]\r\n const fieldValue: TFieldValue | undefined = this.state.storeFilter?.[key]\r\n if (mapConfig) {\r\n const { targetfield, operation } = mapConfig\r\n if (mapConfig.custom) {\r\n mapConfig.custom(this.graphqlBuilder, fieldValue, this.state.storeFilter)\r\n return // skip the rest logic if custom function is provided\r\n }\r\n switch (operation) {\r\n case 'equal':\r\n this.filterEqual(key, targetfield)\r\n return // break is not needed here because of the return statement\r\n case 'equalAndAny':\r\n this.filterEqual(key, targetfield, { isAny: true })\r\n return // break is not needed here because of the return statement\r\n case 'datetime':\r\n this.filterDatetime(key, targetfield)\r\n return // break is not needed here because of the return statement\r\n case 'contains':\r\n default:\r\n this.filterContains(key, targetfield)\r\n return // break is not needed here because of the return statement\r\n }\r\n }\r\n })\r\n }\r\n return this\r\n }\r\n\r\n private prebuildFunc?: (rp: RequestParam<TTarget, U>) => RequestParam<TTarget, U>\r\n prebuild = (func: (requestParam: RequestParam<TTarget, U>) => RequestParam<TTarget, U>) => {\r\n this.prebuildFunc = func\r\n return this\r\n }\r\n\r\n build() {\r\n if (this.prebuildFunc) this.prebuildFunc(this.graphqlBuilder)\r\n return this.graphqlBuilder.build()\r\n }\r\n}\r\n\r\nexport const createConvertToGraphQL = <TSource extends Record<string, any>, TTarget extends object, U extends object = {}>(\r\n state: TFilterState<TSource>\r\n) => {\r\n return new TableFileterConverter<TSource, TTarget, U>(state)\r\n}\r\n"],"names":["mapLogic","logic","mapSortDirection","direction","filterByType","field","builder","value","option","_ref","mode","restOption","_objectWithoutProperties","_excluded","valueType","_typeof","filter","toString","filterContains","filterNumber","console","warn","concat","TableFileterConverter","_createClass","state","_this","this","_classCallCheck","_defineProperty","objMap","currentObjectMap","storeFilter","Object","keys","forEach","key","_this$state$storeFilt","mapConfig","fieldValue","targetfield","operation","custom","graphqlBuilder","filterEqual","isAny","filterDatetime","func","prebuildFunc","createRequestBuilder","ignoreEmpty","fn","options","_this2","mergedLogic","filterLogic","scope","b","targetField","_this$state$storeFilt2","_this$state$storeFilt3","values","Array","isArray","length","filterScope","filterCustom","JSON","stringify","index","_this$state$storeFilt4","_this$state$storeFilt5","finalLogic","_this$state$storeFilt6","_this$state$storeFilt7","dateLogic","filterGreaterEqual","filterLessEqual","param","_param$seed","_this$currentObjectMa","store","storeSort","_ref2","seed","seedTargetField","_ref2$autoSave","autoSave","seedField","undefined","seedFromURL","getSeedFromURL","KeySpecial","sortShuffle","seedValue","Date","getTime","setSeedToURL","_this$currentObjectMa2","removeSeedFromURL","sort","fields","_this$state$storeFilt8","_this$state$storeFilt9","_this3","quickSearch","targetFields","_this3$currentObjectM","fieldMap","build","createConvertToGraphQL"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{slicedToArray as e,defineProperty as l,toConsumableArray as i}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as
|
|
1
|
+
import{slicedToArray as e,defineProperty as l,toConsumableArray as i}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as n,jsxs as o}from"react/jsx-runtime";import{useMemo as r,useState as t}from"react";import{styled as a,FormGroup as u,FormControlLabel as s,Checkbox as c,Button as v,Box as d}from"@mui/material";import{createChipViewers as f}from"../components/chip-viewer.js";import{PopperContent as m,PopperBody as p,PopperFooter as b}from"../components/popper-custom.js";import{ButtonBack as g,ChipDark as h,FilterLogicToggle as y}from"../components/ui.units.js";import{getErrorMessage as C}from"../../form/helpers.js";function x(a){var x=f(),j=(a||{}).options,k=void 0===j?[]:j;return function(f){var j,z,S=r(function(){return Object.assign({},f.currentConfig,null==a?void 0:a.config)},[null==a?void 0:a.config,f.currentConfig]),B=f.value,L=void 0===B?{values:[],logic:null!==(j=null==S?void 0:S.defaultLogic)&&void 0!==j?j:"and"}:B,R=t(L.logic),T=e(R,2),V=T[0],w=T[1],F=null!==(z=null==S?void 0:S.label)&&void 0!==z?z:S.field.toString(),I=r(function(){var e=Array.isArray(L.values)?L.values:[L.values];return k.filter(function(l){return e.includes(l.value)}).map(function(e){return e.value})},[]),N=t(I),O=e(N,2),P=O[0],_=O[1],D=t({}),E=e(D,2),H=E[0],M=E[1],q=function(e){f.onSubmit(S.field,e,S)},G=C(H,S.field),J=r(function(){var e=Array.isArray(L.values)?L.values:[L.values];return{field:S.field,items:e.map(function(e){var l;return{value:e,label:null===(l=k.find(function(l){return l.value===e}))||void 0===l?void 0:l.label}})}},[S.field,L]),K=[];return f.isLoading&&K.push("disabled"),n(A,{className:K.join(" "),noValidate:!0,onSubmit:function(e){var i;e.preventDefault();var n=l({},S.field,P),o=null===(i=f.validator)||void 0===i?void 0:i.run(n);(M(o||{}),o&&0!==Object.keys(o).length)||q({values:P,logic:V})},children:o(m,{title:"Filter by ".concat(F),onClose:f.onClose,slots:{beforeTitle:n(g,{size:"small",onClick:f.onBack}),afterTitle:S.singleValue?n(h,{sx:{ml:1.5},size:"small",label:"Last value only"}):!L.values||L.values.length<2?null:n(y,{sx:{ml:1},value:V,onChange:function(e,l){return function(e){w(e);var l={values:L.values,logic:e};q(l)}(l)}})},children:[o(p,{children:[n(x,{sx:{mb:1,borderBottom:"none!important"},label:"Applied",placement:"horizontal",enableMinimalesticView:!0,value:J,onRemove:f.onRemove}),n(u,{className:G.error?"error":"",children:k.map(function(e,l){var o,r=P.includes(e.value),t=J.items.length>0&&J.items.some(function(l){return l.value===e.value});return n(s,{value:e.value,disabled:t&&!0===(null==a?void 0:a.disabledAfterSubmit),label:null!==(o=e.label)&&void 0!==o?o:e.value,control:n(c,{name:S.field.toString(),checked:r,onChange:function(l){return n=e.value,o=l.target.checked,void _(function(e){return o?[].concat(i(e),[n]):e.filter(function(e){return e!==n})});var n,o}})},e.value.toString()+l)})})]}),o(b,{children:[n(v,{size:"small",color:"error",variant:"text",disabled:!L.values||0===L.values.length,onClick:function(){var e,l;null===(e=f.onRemoveField)||void 0===e||e.call(f,S.field),!1!==(null==a||null===(l=a.config)||void 0===l?void 0:l.closeAfterClear)&&f.onClose()},children:"Clear All"}),n(d,{sx:{flex:1}}),n(v,{size:"small",color:"inherit",variant:"text",onClick:f.onClose,children:"Cancel"}),n(v,{size:"small",type:"submit",color:"primary",variant:"contained",children:"Apply"})]})]})})}}var A=a("form")({position:"relative","&::after":{content:'""',display:"block",position:"absolute",inset:0,backgroundColor:"rgba(0, 0, 0, 0.2)",filter:"blur(2px)",zIndex:-1,opacity:0,transition:"opacity 0.3s",visibility:"hidden"},"&.disabled":{pointerEvents:"none","&::after":{zIndex:1,opacity:1,visibility:"visible"}}});export{x as default};
|
|
2
2
|
//# sourceMappingURL=create-form-field-select-multiple.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-form-field-select-multiple.js","sources":["../../../../src/filter-bar/menu/create-form-field-select-multiple.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useMemo, useState } from 'react'\r\nimport { Box, Button, Checkbox, FormControlLabel, FormGroup, formGroupClasses, styled } from '@mui/material'\r\nimport { getErrorMessage } from '../../form'\r\nimport { createChipViewers, TChipViewerGroup } from '../components/chip-viewer'\r\nimport { PopperBody, PopperContent, PopperFooter } from '../components/popper-custom'\r\nimport { ButtonBack, ChipDark, FilterLogicToggle } from '../components/ui.units'\r\n// types\r\nimport type { FC } from 'react'\r\nimport type { IPartialError } from '../../form/validator'\r\nimport type { IFieldSelectOption } from './create-form-field-select'\r\nimport type { TFieldModelValid, TFieldValid, TFieldValue, TLogic } from '../types'\r\nimport type { IFieldMenuConfig, IFilterMenuFormProps } from './types'\r\n\r\n/** Props for the `FormFieldSelectMultiple` component returned by `createFormFieldSelectMultiple`. Extends the base filter-menu form props. */\r\nexport interface IFormFieldSelectMultipleProps<T> extends IFilterMenuFormProps<T> {}\r\n\r\n/** Parameters passed to `createFormFieldSelectMultiple` to configure the generated component. */\r\nexport interface IFormFieldSelectMultipleParam<T> {\r\n /** Optional configuration for the form field */\r\n config?: IFieldMenuConfig<T>\r\n /** List of options for the select field */\r\n options: IFieldSelectOption[]\r\n /** If true, disables the field after submission. @default false */\r\n disabledAfterSubmit?: boolean\r\n}\r\n\r\n/**\r\n * Factory function that creates a `FormFieldSelectMultiple` filter-menu component.\r\n *\r\n * The generated component renders a checkbox list of options inside a\r\n * popper/menu panel, allowing the user to select **multiple values** at once.\r\n * It supports:\r\n * - Controlled checkbox state to prevent uncontrolled→controlled React warnings\r\n * - OR / AND logic toggle when more than one value is applied\r\n * - Chip viewers showing the currently applied values\r\n * - Built-in validation via an optional `validator` prop\r\n * - A loading overlay that disables interaction while `isLoading` is true\r\n *\r\n * @param params - Static configuration (option list, optional field config override)\r\n * @returns A React FC ready to be used as a multi-select filter-menu field component\r\n */\r\nfunction createFormFieldSelectMultiple<T>(params?: IFormFieldSelectMultipleParam<T>) {\r\n const ChipViewers = createChipViewers<T>()\r\n const { options = [] } = params || {}\r\n\r\n const FormFieldSelectMultiple: FC<IFormFieldSelectMultipleProps<T>> = (props) => {\r\n /** Merge `props.currentConfig` with `params.config` (if provided).\r\n * Fields from `params.config` override the corresponding keys in `props.currentConfig`.\r\n * Any keys not present in `params.config` are preserved from `props.currentConfig`.\r\n */\r\n const mergedConfig = useMemo(() => Object.assign({}, props.currentConfig, params?.config), [params?.config, props.currentConfig])\r\n\r\n const { value = { values: [], logic: mergedConfig?.defaultLogic ?? 'and' } } = props\r\n const [filterLogic, setFilterLogic] = useState<TLogic>(value.logic!)\r\n\r\n const label = mergedConfig?.label ?? mergedConfig.field.toString()\r\n\r\n // Track checked values as controlled state to avoid the uncontrolled→controlled MUI warning\r\n const initialChecked = useMemo<TFieldValid[]>(() => {\r\n const values = Array.isArray(value.values) ? value.values : [value.values]\r\n return options.filter((opt) => values.includes(opt.value)).map((opt) => opt.value)\r\n }, [])\r\n const [checkedValues, setCheckedValues] = useState<TFieldValid[]>(initialChecked)\r\n\r\n const [errorData, setErrorData] = useState<IPartialError<TFieldModelValid<T>>>({})\r\n\r\n const handleCheckboxChange = (optionValue: TFieldValid, checked: boolean) => {\r\n setCheckedValues((prev) => (checked ? [...prev, optionValue] : prev.filter((v) => v !== optionValue)))\r\n }\r\n\r\n const handleSubmit = (newValue: TFieldValue) => {\r\n props.onSubmit(mergedConfig.field, newValue, mergedConfig)\r\n }\r\n\r\n const handleSubmitForm = (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault()\r\n const obj = { [mergedConfig.field]: checkedValues } as Partial<TFieldModelValid<T>>\r\n let errorData = props.validator?.run(obj) as IPartialError<TFieldModelValid<T>>\r\n\r\n setErrorData(errorData || {})\r\n\r\n if (!errorData || Object.keys(errorData).length === 0) {\r\n const newValue: TFieldValue = { values: checkedValues, logic: filterLogic }\r\n handleSubmit(newValue)\r\n }\r\n }\r\n\r\n const errorResult = getErrorMessage(errorData, mergedConfig.field)\r\n const filterViewerValue = useMemo<TChipViewerGroup<T>>(() => {\r\n const items = Array.isArray(value.values) ? value.values : [value.values]\r\n return {\r\n field: mergedConfig.field,\r\n items: items.map((v) => ({ value: v, label: options.find((o) => o.value === v)?.label }))\r\n }\r\n }, [mergedConfig.field, value])\r\n\r\n const handleChangeLogic = (newLogic: TLogic) => {\r\n setFilterLogic(newLogic)\r\n const newValue: TFieldValue = { values: value.values, logic: newLogic }\r\n handleSubmit(newValue)\r\n }\r\n\r\n const handleClearAll = () => {\r\n props.onRemoveField?.(mergedConfig.field)\r\n if (params?.config?.closeAfterClear !== false) props.onClose()\r\n }\r\n\r\n const renderAfterTitle = () => {\r\n if (mergedConfig.singleValue) return <ChipDark sx={{ ml: 1.5 }} size='small' label='Last value only' />\r\n if (!value.values || value.values.length < 2) return null\r\n return <FilterLogicToggle sx={{ ml: 1 }} value={filterLogic} onChange={(_, nVal) => handleChangeLogic(nVal)} />\r\n }\r\n\r\n const rootClasses: string[] = []\r\n if (props.isLoading) rootClasses.push('disabled')\r\n\r\n return (\r\n <RootStyled className={rootClasses.join(' ')} noValidate onSubmit={handleSubmitForm}>\r\n <PopperContent\r\n title={`Filter by ${label}`}\r\n onClose={props.onClose}\r\n slots={{\r\n beforeTitle: <ButtonBack size='small' onClick={props.onBack} />,\r\n afterTitle: renderAfterTitle()\r\n }}\r\n >\r\n <PopperBody>\r\n <ChipViewers\r\n sx={{ mb: 1, borderBottom: 'none!important' }}\r\n label='Applied'\r\n placement='horizontal'\r\n enableMinimalesticView\r\n value={filterViewerValue}\r\n onRemove={props.onRemove}\r\n />\r\n <FormGroup className={errorResult.error ? 'error' : ''}>\r\n {options.map((x, i) => {\r\n const isChecked = checkedValues.includes(x.value as TFieldValid)\r\n const disabled = filterViewerValue.items.length > 0 && filterViewerValue.items.some((item) => item.value === x.value)\r\n return (\r\n <FormControlLabel\r\n key={x.value.toString() + i}\r\n value={x.value}\r\n disabled={disabled && params?.disabledAfterSubmit === true}\r\n label={x.label ?? x.value}\r\n control={\r\n <Checkbox\r\n name={mergedConfig.field.toString()}\r\n checked={isChecked}\r\n onChange={(e) => handleCheckboxChange(x.value as TFieldValid, e.target.checked)}\r\n />\r\n }\r\n />\r\n )\r\n })}\r\n </FormGroup>\r\n </PopperBody>\r\n <PopperFooter>\r\n <Button size='small' color='error' variant='text' disabled={!value.values || value.values.length === 0} onClick={handleClearAll}>\r\n Clear All\r\n </Button>\r\n <Box sx={{ flex: 1 }} />\r\n <Button size='small' color='inherit' variant='text' onClick={props.onClose}>\r\n Cancel\r\n </Button>\r\n <Button size='small' type='submit' color='primary' variant='contained'>\r\n Apply\r\n </Button>\r\n </PopperFooter>\r\n </PopperContent>\r\n </RootStyled>\r\n )\r\n }\r\n\r\n return FormFieldSelectMultiple\r\n}\r\n\r\nexport default createFormFieldSelectMultiple\r\n\r\nconst RootStyled = styled('form')({\r\n position: 'relative',\r\n '&::after': {\r\n content: '\"\"',\r\n display: 'block',\r\n position: 'absolute',\r\n inset: 0, // top: 0, left: 0, right: 0, bottom: 0\r\n backgroundColor: 'rgba(0, 0, 0, 0.2)',\r\n filter: 'blur(2px)',\r\n zIndex: -1,\r\n opacity: 0,\r\n transition: 'opacity 0.3s',\r\n visibility: 'hidden'\r\n },\r\n '&.disabled': {\r\n pointerEvents: 'none',\r\n '&::after': {\r\n zIndex: 1,\r\n opacity: 1,\r\n visibility: 'visible'\r\n }\r\n }\r\n // [`.${formGroupClasses.root}`]: {}\r\n})\r\n"],"names":["createFormFieldSelectMultiple","params","ChipViewers","createChipViewers","_ref$options","options","props","_mergedConfig$default","_mergedConfig$label","mergedConfig","useMemo","Object","assign","currentConfig","config","_props$value","value","values","logic","defaultLogic","_useState","useState","_useState2","_slicedToArray","filterLogic","setFilterLogic","label","field","toString","initialChecked","Array","isArray","filter","opt","includes","map","_useState3","_useState4","checkedValues","setCheckedValues","_useState5","_useState6","errorData","setErrorData","handleSubmit","newValue","onSubmit","errorResult","getErrorMessage","filterViewerValue","items","v","_options$find","find","o","rootClasses","isLoading","push","_jsx","RootStyled","className","join","noValidate","event","_props$validator","preventDefault","obj","_defineProperty","validator","run","keys","length","children","_jsxs","PopperContent","title","concat","onClose","slots","beforeTitle","ButtonBack","size","onClick","onBack","afterTitle","singleValue","ChipDark","sx","ml","FilterLogicToggle","onChange","_","nVal","newLogic","handleChangeLogic","PopperBody","mb","borderBottom","placement","enableMinimalesticView","onRemove","FormGroup","error","x","i","_x$label","isChecked","disabled","some","item","FormControlLabel","disabledAfterSubmit","control","Checkbox","name","checked","e","optionValue","target","prev","_toConsumableArray","PopperFooter","Button","color","variant","_props$onRemoveField","_params$config","onRemoveField","call","closeAfterClear","Box","flex","type","styled","position","content","display","inset","backgroundColor","zIndex","opacity","transition","visibility","pointerEvents"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"create-form-field-select-multiple.js","sources":["../../../../src/filter-bar/menu/create-form-field-select-multiple.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useMemo, useState } from 'react'\r\nimport { Box, Button, Checkbox, FormControlLabel, FormGroup, formGroupClasses, styled } from '@mui/material'\r\nimport { getErrorMessage } from '../../form'\r\nimport { createChipViewers, TChipViewerGroup } from '../components/chip-viewer'\r\nimport { PopperBody, PopperContent, PopperFooter } from '../components/popper-custom'\r\nimport { ButtonBack, ChipDark, FilterLogicToggle } from '../components/ui.units'\r\n// types\r\nimport type { FC } from 'react'\r\nimport type { IPartialError } from '../../form/validator'\r\nimport type { IFieldSelectOption } from './create-form-field-select'\r\nimport type { TFieldModelValid, TFieldValid, TFieldValue, TLogic } from '../types'\r\nimport type { IFieldMenuConfig, IFilterMenuFormProps } from './types'\r\n\r\n/** Props for the `FormFieldSelectMultiple` component returned by `createFormFieldSelectMultiple`. Extends the base filter-menu form props. */\r\nexport interface IFormFieldSelectMultipleProps<T> extends IFilterMenuFormProps<T> {}\r\n\r\n/** Parameters passed to `createFormFieldSelectMultiple` to configure the generated component. */\r\nexport interface IFormFieldSelectMultipleParam<T> {\r\n /** Optional configuration for the form field */\r\n config?: IFieldMenuConfig<T>\r\n /** List of options for the select field */\r\n options: IFieldSelectOption[]\r\n /** If true, disables the field after submission. @default false */\r\n disabledAfterSubmit?: boolean\r\n}\r\n\r\n/**\r\n * Factory function that creates a `FormFieldSelectMultiple` filter-menu component.\r\n *\r\n * The generated component renders a checkbox list of options inside a\r\n * popper/menu panel, allowing the user to select **multiple values** at once.\r\n * It supports:\r\n * - Controlled checkbox state to prevent uncontrolled→controlled React warnings\r\n * - OR / AND logic toggle when more than one value is applied\r\n * - Chip viewers showing the currently applied values\r\n * - Built-in validation via an optional `validator` prop\r\n * - A loading overlay that disables interaction while `isLoading` is true\r\n *\r\n * @param params - Static configuration (option list, optional field config override)\r\n * @returns A React FC ready to be used as a multi-select filter-menu field component\r\n */\r\nfunction createFormFieldSelectMultiple<T>(params?: IFormFieldSelectMultipleParam<T>) {\r\n const ChipViewers = createChipViewers<T>()\r\n const { options = [] } = params || {}\r\n\r\n const FormFieldSelectMultiple: FC<IFormFieldSelectMultipleProps<T>> = (props) => {\r\n /** Merge `props.currentConfig` with `params.config` (if provided).\r\n * Fields from `params.config` override the corresponding keys in `props.currentConfig`.\r\n * Any keys not present in `params.config` are preserved from `props.currentConfig`.\r\n */\r\n const mergedConfig = useMemo(() => Object.assign({}, props.currentConfig, params?.config), [params?.config, props.currentConfig])\r\n\r\n const { value = { values: [], logic: mergedConfig?.defaultLogic ?? 'and' } } = props\r\n const [filterLogic, setFilterLogic] = useState<TLogic>(value.logic!)\r\n\r\n const label = mergedConfig?.label ?? mergedConfig.field.toString()\r\n\r\n // Track checked values as controlled state to avoid the uncontrolled→controlled MUI warning\r\n const initialChecked = useMemo<TFieldValid[]>(() => {\r\n const values = Array.isArray(value.values) ? value.values : [value.values]\r\n return options.filter((opt) => values.includes(opt.value)).map((opt) => opt.value)\r\n }, [])\r\n const [checkedValues, setCheckedValues] = useState<TFieldValid[]>(initialChecked)\r\n\r\n const [errorData, setErrorData] = useState<IPartialError<TFieldModelValid<T>>>({})\r\n\r\n const handleCheckboxChange = (optionValue: TFieldValid, checked: boolean) => {\r\n setCheckedValues((prev) => (checked ? [...prev, optionValue] : prev.filter((v) => v !== optionValue)))\r\n }\r\n\r\n const handleSubmit = (newValue: TFieldValue) => {\r\n props.onSubmit(mergedConfig.field, newValue, mergedConfig)\r\n }\r\n\r\n const handleSubmitForm = (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault()\r\n const obj = { [mergedConfig.field]: checkedValues } as Partial<TFieldModelValid<T>>\r\n let errorData = props.validator?.run(obj) as IPartialError<TFieldModelValid<T>>\r\n\r\n setErrorData(errorData || {})\r\n\r\n if (!errorData || Object.keys(errorData).length === 0) {\r\n const newValue: TFieldValue = { values: checkedValues, logic: filterLogic }\r\n handleSubmit(newValue)\r\n }\r\n }\r\n\r\n const errorResult = getErrorMessage(errorData, mergedConfig.field)\r\n const filterViewerValue = useMemo<TChipViewerGroup<T>>(() => {\r\n const items = Array.isArray(value.values) ? value.values : [value.values]\r\n return {\r\n field: mergedConfig.field,\r\n items: items.map((v) => ({ value: v, label: options.find((o) => o.value === v)?.label }))\r\n }\r\n }, [mergedConfig.field, value])\r\n\r\n const handleChangeLogic = (newLogic: TLogic) => {\r\n setFilterLogic(newLogic)\r\n const newValue: TFieldValue = { values: value.values, logic: newLogic }\r\n handleSubmit(newValue)\r\n }\r\n\r\n const handleClearAll = () => {\r\n props.onRemoveField?.(mergedConfig.field)\r\n if (params?.config?.closeAfterClear !== false) props.onClose()\r\n }\r\n\r\n const renderAfterTitle = () => {\r\n if (mergedConfig.singleValue) return <ChipDark sx={{ ml: 1.5 }} size='small' label='Last value only' />\r\n if (!value.values || value.values.length < 2) return null\r\n return <FilterLogicToggle sx={{ ml: 1 }} value={filterLogic} onChange={(_, nVal) => handleChangeLogic(nVal)} />\r\n }\r\n\r\n const rootClasses: string[] = []\r\n if (props.isLoading) rootClasses.push('disabled')\r\n\r\n return (\r\n <RootStyled className={rootClasses.join(' ')} noValidate onSubmit={handleSubmitForm}>\r\n <PopperContent\r\n title={`Filter by ${label}`}\r\n onClose={props.onClose}\r\n slots={{\r\n beforeTitle: <ButtonBack size='small' onClick={props.onBack} />,\r\n afterTitle: renderAfterTitle()\r\n }}\r\n >\r\n <PopperBody>\r\n <ChipViewers\r\n sx={{ mb: 1, borderBottom: 'none!important' }}\r\n label='Applied'\r\n placement='horizontal'\r\n enableMinimalesticView\r\n value={filterViewerValue}\r\n onRemove={props.onRemove}\r\n />\r\n <FormGroup className={errorResult.error ? 'error' : ''}>\r\n {options.map((x, i) => {\r\n const isChecked = checkedValues.includes(x.value as TFieldValid)\r\n const disabled = filterViewerValue.items.length > 0 && filterViewerValue.items.some((item) => item.value === x.value)\r\n return (\r\n <FormControlLabel\r\n key={x.value.toString() + i}\r\n value={x.value}\r\n disabled={disabled && params?.disabledAfterSubmit === true}\r\n label={x.label ?? x.value}\r\n control={\r\n <Checkbox\r\n name={mergedConfig.field.toString()}\r\n checked={isChecked}\r\n onChange={(e) => handleCheckboxChange(x.value as TFieldValid, e.target.checked)}\r\n />\r\n }\r\n />\r\n )\r\n })}\r\n </FormGroup>\r\n </PopperBody>\r\n <PopperFooter>\r\n <Button size='small' color='error' variant='text' disabled={!value.values || value.values.length === 0} onClick={handleClearAll}>\r\n Clear All\r\n </Button>\r\n <Box sx={{ flex: 1 }} />\r\n <Button size='small' color='inherit' variant='text' onClick={props.onClose}>\r\n Cancel\r\n </Button>\r\n <Button size='small' type='submit' color='primary' variant='contained'>\r\n Apply\r\n </Button>\r\n </PopperFooter>\r\n </PopperContent>\r\n </RootStyled>\r\n )\r\n }\r\n\r\n return FormFieldSelectMultiple\r\n}\r\n\r\nexport default createFormFieldSelectMultiple\r\n\r\nconst RootStyled = styled('form')({\r\n position: 'relative',\r\n '&::after': {\r\n content: '\"\"',\r\n display: 'block',\r\n position: 'absolute',\r\n inset: 0, // top: 0, left: 0, right: 0, bottom: 0\r\n backgroundColor: 'rgba(0, 0, 0, 0.2)',\r\n filter: 'blur(2px)',\r\n zIndex: -1,\r\n opacity: 0,\r\n transition: 'opacity 0.3s',\r\n visibility: 'hidden'\r\n },\r\n '&.disabled': {\r\n pointerEvents: 'none',\r\n '&::after': {\r\n zIndex: 1,\r\n opacity: 1,\r\n visibility: 'visible'\r\n }\r\n }\r\n // [`.${formGroupClasses.root}`]: {}\r\n})\r\n"],"names":["createFormFieldSelectMultiple","params","ChipViewers","createChipViewers","_ref$options","options","props","_mergedConfig$default","_mergedConfig$label","mergedConfig","useMemo","Object","assign","currentConfig","config","_props$value","value","values","logic","defaultLogic","_useState","useState","_useState2","_slicedToArray","filterLogic","setFilterLogic","label","field","toString","initialChecked","Array","isArray","filter","opt","includes","map","_useState3","_useState4","checkedValues","setCheckedValues","_useState5","_useState6","errorData","setErrorData","handleSubmit","newValue","onSubmit","errorResult","getErrorMessage","filterViewerValue","items","v","_options$find","find","o","rootClasses","isLoading","push","_jsx","RootStyled","className","join","noValidate","event","_props$validator","preventDefault","obj","_defineProperty","validator","run","keys","length","children","_jsxs","PopperContent","title","concat","onClose","slots","beforeTitle","ButtonBack","size","onClick","onBack","afterTitle","singleValue","ChipDark","sx","ml","FilterLogicToggle","onChange","_","nVal","newLogic","handleChangeLogic","PopperBody","mb","borderBottom","placement","enableMinimalesticView","onRemove","FormGroup","error","x","i","_x$label","isChecked","disabled","some","item","FormControlLabel","disabledAfterSubmit","control","Checkbox","name","checked","e","optionValue","target","prev","_toConsumableArray","PopperFooter","Button","color","variant","_props$onRemoveField","_params$config","onRemoveField","call","closeAfterClear","Box","flex","type","styled","position","content","display","inset","backgroundColor","zIndex","opacity","transition","visibility","pointerEvents"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createClass as t,classCallCheck as e,defineProperty as
|
|
1
|
+
import{createClass as t,classCallCheck as e,defineProperty as n,objectSpread2 as i}from"../../../_virtual/_rollupPluginBabelHelpers.js";var r=function(){return t(function t(r){var o=this;e(this,t),n(this,"mergeOptions",function(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];return e.reduce(function(t,e){return Object.assign(t,null!=e?e:{})},{})}),n(this,"ignoreEmpty",function(t,e){var n=o.mergeOptions(o._option,e);return!t&&!0===(null==n?void 0:n.ignoreEmpty)}),n(this,"_filter",[]),n(this,"_filterBase",function(t,e,n,i){var r=o._filter.length?" "+("And"===(null==i?void 0:i.logic)?"&&":"||")+" ":"";return o._filter.push("".concat(r).concat(t).concat(e).concat(n)),o}),n(this,"filter",function(t,e,n){return"string"==typeof e&&o.ignoreEmpty(e,n)?o:o._filterBase(t,"==","string"==typeof e?'"'.concat(e,'"'):e.toString(),n)}),n(this,"filterEqual",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t,"==",'"'.concat(e,'"'),n)}),n(this,"filterNotEquals",function(t,e,n){return"string"==typeof e&&o.ignoreEmpty(e,n)?o:o._filterBase(t,"!=","string"==typeof e?'"'.concat(e,'"'):e.toString(),n)}),n(this,"filterEnum",function(t,e,n){return"string"==typeof e&&o.ignoreEmpty(e,n)?o:o._filterBase(t,"==","string"==typeof e?e:e.toString(),n)}),n(this,"filterStartsWith",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t,'.startsWith("'+e+'")',"",n)}),n(this,"filterContains",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t,'.Contains("'+e+'")',"",n)}),n(this,"filterLast",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t,'.endsWith("'+e+'")',"",n)}),n(this,"filterNumber",function(t,e,n,i){return o.ignoreEmpty(n,i)?o:o._filterBase(t," ".concat(e," ")+n,"",i)}),n(this,"filterGreater",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t," > '"+e+"'","",n)}),n(this,"filterGreaterEqual",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t," >= '"+e+"'","",n)}),n(this,"filterLess",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t," < '"+e+"'","",n)}),n(this,"filterLessEqual",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t," <= '"+e+"'","",n)}),n(this,"filterCustom",function(t,e){var n=o._filter.length?" "+("And"===(null==e?void 0:e.logic)?"&&":"||")+" ":"";return o._filter.push("".concat(n).concat(t)),o}),n(this,"scope",function(e,n){var i=e(new t(o._option));if(i.buildFilter()){var r=o._filter.length?" "+("And"===(null==n?void 0:n.logic)?"&&":"||")+" ":"";o._filter.push("".concat(r,"(").concat(i.buildFilter(),")"))}return o.mergeExtendData(i.extendData),o}),n(this,"seed",function(t,e){return o.seedStore={field:t,key:e},o}),n(this,"skip",function(t){return o._skip=t,o}),n(this,"take",function(t){return o._take=t,o}),n(this,"sortStore",[]),n(this,"sortBase",function(t,e,n){var i={};return i[t]=e,o.sortStore.some(function(t){return Object.keys(t)[0]===Object.keys(i)[0]})||o.sortStore.push(i),o}),n(this,"sort",function(t,e){return o.sortBase(t,null!=e&&e.direction?e.direction:"ASC"),o}),n(this,"noTotal",function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return o._noTotal=t,o}),n(this,"buildFilter",function(){return o._filter.join("")}),n(this,"buildPage",function(){var t={};return o._skip&&(t.skip=o._skip),o._take&&(t.take=o._take),t}),n(this,"buildRandomWithSeedKey",function(){var t,e,n,i,r,s;return null===(t=o.seedStore)||void 0===t||!t.field||null!==(e=o.seedStore)&&void 0!==e&&e.key||console.warn("RandomWithSeedKey missing seedKey."),null===(n=o.seedStore)||void 0===n||!n.key||null!==(i=o.seedStore)&&void 0!==i&&i.field||console.warn("RandomWithSeedKey missing seedField."),null!==(r=o.seedStore)&&void 0!==r&&r.key||null!==(s=o.seedStore)&&void 0!==s&&s.field?o.seedStore:{}}),n(this,"_extendData",{}),n(this,"mergeExtendData",function(t){for(var e in t)o._extendData[e]=t[e]}),n(this,"extendResult",function(t,e){return o._extendData||(o._extendData={}),o._extendData[t]=e,o}),n(this,"build",function(){var t=i({},o.buildPage());if(o._extendData)for(var e in o._extendData)t[e]=o._extendData[e];o.sortStore.length>0&&(t.sort=o.sortStore);var n=o.buildFilter();n&&(t.filter=n),o._noTotal&&(t.noTotal=o._noTotal);var r=o.buildRandomWithSeedKey();return r.key&&r.field&&(t.seedField=r.field.toString(),t.seedKey=r.key),t}),this._option=r},[{key:"extendData",get:function(){return this._extendData}}])}(),o=function(t){return new r(t)};export{r as RequestParam,o as createRequestBuilder};
|
|
2
2
|
//# sourceMappingURL=request-param.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-param.js","sources":["../../../../src/http-service/graphql/request-param.ts"],"sourcesContent":["export type IVariable<T extends object> = keyof T\r\n\r\nexport type ILogic = 'Or' | 'And'\r\n\r\nexport type ISortDirection = 'ASC' | 'DESC'\r\n\r\nexport interface ISeedModel<T> {\r\n key: string\r\n field: keyof T\r\n}\r\n\r\nexport interface IFilterOption {\r\n logic: ILogic\r\n ignoreEmpty: boolean\r\n}\r\n\r\nexport interface IRequestParamOption {\r\n ignoreEmpty: boolean\r\n}\r\n\r\nexport interface ISortOption {\r\n direction: ISortDirection\r\n}\r\n\r\nexport type ISortStore<T extends object> = { [key in keyof T]?: ISortDirection }\r\n\r\nexport type IAllOptions = IFilterOption & IRequestParamOption & ISortOption\r\n\r\nexport type IRequestParamResult<T extends object> = {\r\n sort?: ISortStore<T>[]\r\n skip?: number\r\n take?: number\r\n filter?: string\r\n noTotal?: boolean\r\n seedKey?: string\r\n seedField?: string\r\n}\r\n\r\nexport class RequestParam<T extends object = any> {\r\n private readonly _option?: Partial<IRequestParamOption>\r\n constructor(option?: Partial<IRequestParamOption>) {\r\n this._option = option\r\n }\r\n\r\n private mergeOptions = (...p: any[]): Partial<IAllOptions> => {\r\n return p.reduce((a, b) => {\r\n return Object.assign(a, b ?? {})\r\n }, {})\r\n }\r\n\r\n private ignoreEmpty = (field2: string, option?: Partial<IFilterOption>) => {\r\n const mOption = this.mergeOptions(this._option, option)\r\n return !field2 && mOption?.ignoreEmpty === true\r\n }\r\n\r\n private _filter: string[] = []\r\n private _filterBase = (field1: IVariable<T>, operation: string, field2: string, option?: Partial<IFilterOption>) => {\r\n const logicStr = this._filter.length ? ' ' + (option?.logic === 'And' ? '&&' : '||') + ' ' : ''\r\n this._filter.push(`${logicStr}${field1 as string}${operation}${field2 as string}`)\r\n return this\r\n }\r\n filter = (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption>) => {\r\n if (typeof field2 === 'string' && this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '==', typeof field2 === 'string' ? `\"${field2}\"` : field2.toString(), option)\r\n }\r\n filterEqual = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '==', `\"${field2}\"`, option)\r\n }\r\n filterNotEquals = (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption>) => {\r\n if (typeof field2 === 'string' && this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '!=', typeof field2 === 'string' ? `\"${field2}\"` : field2.toString(), option)\r\n }\r\n filterEnum = (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption>) => {\r\n if (typeof field2 === 'string' && this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '==', typeof field2 === 'string' ? field2 : field2.toString(), option)\r\n }\r\n filterStartsWith = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '.startsWith(\"' + (field2 as string) + '\")', '', option)\r\n }\r\n filterContains = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '.Contains(\"' + (field2 as string) + '\")', '', option)\r\n }\r\n filterLast = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '.endsWith(\"' + (field2 as string) + '\")', '', option)\r\n }\r\n filterNumber = (field1: IVariable<T>, operator: string, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, ` ${operator} ` + (field2 as string), '', option)\r\n }\r\n\r\n filterGreater = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, \" > '\" + (field2 as string) + \"'\", '', option)\r\n }\r\n filterGreaterEqual = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, \" >= '\" + (field2 as string) + \"'\", '', option)\r\n }\r\n filterLess = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, \" < '\" + (field2 as string) + \"'\", '', option)\r\n }\r\n filterLessEqual = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, \" <= '\" + (field2 as string) + \"'\", '', option)\r\n }\r\n filterCustom = (field1: string, option?: Partial<IFilterOption>) => {\r\n const logicStr = this._filter.length ? ' ' + (option?.logic === 'And' ? '&&' : '||') + ' ' : ''\r\n this._filter.push(`${logicStr}${field1 as string}`)\r\n return this\r\n }\r\n\r\n scope = (action: (crd: RequestParam<T>) => RequestParam<T>, option?: Partial<IFilterOption>) => {\r\n const crd = action(new RequestParam(this._option))\r\n const temp = crd.buildFilter()\r\n if (temp) {\r\n const logicStr = this._filter.length ? ' ' + (option?.logic === 'And' ? '&&' : '||') + ' ' : ''\r\n this._filter.push(`${logicStr}(${crd.buildFilter()})`)\r\n }\r\n return this\r\n }\r\n\r\n private seedStore?: ISeedModel<T>\r\n seed = (field: keyof T, key: string) => {\r\n this.seedStore = { field, key }\r\n return this\r\n }\r\n\r\n private _skip?: number\r\n skip = (skip: number) => {\r\n this._skip = skip\r\n return this\r\n }\r\n\r\n private _take?: number\r\n take = (take: number) => {\r\n this._take = take\r\n return this\r\n }\r\n\r\n private sortStore: ISortStore<T>[] = []\r\n private sortBase = (field1: IVariable<T>, direction: ISortDirection, option?: Partial<ISortOption>) => {\r\n const temp = {} as ISortStore<T>\r\n temp[field1] = direction\r\n if (!this.sortStore.some((item) => Object.keys(item)[0] === Object.keys(temp)[0])) {\r\n this.sortStore.push(temp)\r\n }\r\n return this\r\n }\r\n sort = (field1: IVariable<T>, option?: Partial<ISortOption>) => {\r\n this.sortBase(field1, option?.direction ? option.direction : 'ASC')\r\n return this\r\n }\r\n\r\n private _noTotal?: boolean\r\n noTotal = (value: boolean = true) => {\r\n this._noTotal = value\r\n return this\r\n }\r\n\r\n private buildFilter = () => {\r\n return this._filter.join('')\r\n }\r\n\r\n private buildPage = () => {\r\n const temp = {} as any\r\n if (this._skip) {\r\n temp.skip = this._skip\r\n }\r\n if (this._take) {\r\n temp.take = this._take\r\n }\r\n return temp as { skip: number; take: number }\r\n }\r\n\r\n private buildRandomWithSeedKey = (): Partial<ISeedModel<T>> => {\r\n if (this.seedStore?.field && !this.seedStore?.key) {\r\n console.warn('RandomWithSeedKey missing seedKey.')\r\n }\r\n if (this.seedStore?.key && !this.seedStore?.field) {\r\n console.warn('RandomWithSeedKey missing seedField.')\r\n }\r\n if (!this.seedStore?.key && !this.seedStore?.field) {\r\n return {}\r\n }\r\n return this.seedStore\r\n }\r\n\r\n build = (): IRequestParamResult<T> => {\r\n const obj: IRequestParamResult<T> = { ...this.buildPage() }\r\n if (this.sortStore.length > 0) obj.sort = this.sortStore\r\n const filter = this.buildFilter()\r\n if (filter) obj.filter = filter\r\n if (this._noTotal) obj.noTotal = this._noTotal\r\n const seedInfo = this.buildRandomWithSeedKey()\r\n if (!!seedInfo.key && !!seedInfo.field) {\r\n obj.seedField = seedInfo.field.toString()\r\n obj.seedKey = seedInfo.key\r\n }\r\n return obj\r\n }\r\n}\r\n\r\nexport const createRequestBuilder = <T extends object>(option?: Partial<IRequestParamOption>) => {\r\n return new RequestParam<T>(option)\r\n}\r\n"],"names":["RequestParam","_createClass","option","_this","this","_classCallCheck","_defineProperty","_len","arguments","length","p","Array","_key","reduce","a","b","Object","assign","field2","mOption","mergeOptions","_option","ignoreEmpty","field1","operation","logicStr","_filter","logic","push","concat","_filterBase","toString","operator","action","crd","buildFilter","field","key","seedStore","skip","_skip","take","_take","direction","temp","sortStore","some","item","keys","sortBase","value","undefined","_noTotal","join","_this$seedStore","_this$seedStore2","_this$seedStore3","_this$seedStore4","_this$seedStore5","_this$seedStore6","console","warn","obj","_objectSpread","buildPage","sort","filter","noTotal","seedInfo","buildRandomWithSeedKey","seedField","seedKey","createRequestBuilder"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"request-param.js","sources":["../../../../src/http-service/graphql/request-param.ts"],"sourcesContent":["export type IVariable<T extends object> = keyof T\r\n\r\nexport type ILogic = 'Or' | 'And'\r\n\r\nexport type ISortDirection = 'ASC' | 'DESC'\r\n\r\nexport interface ISeedModel<T> {\r\n key: string\r\n field: keyof T\r\n}\r\n\r\nexport interface IFilterOption {\r\n logic: ILogic\r\n ignoreEmpty: boolean\r\n}\r\n\r\nexport interface IRequestParamOption {\r\n ignoreEmpty: boolean\r\n}\r\n\r\nexport interface ISortOption {\r\n direction: ISortDirection\r\n}\r\n\r\nexport type ISortStore<T extends object> = { [key in keyof T]?: ISortDirection }\r\n\r\nexport type IAllOptions = IFilterOption & IRequestParamOption & ISortOption\r\n\r\nexport type IRequestParamResult<T extends object, U extends object = {}> = {\r\n sort?: ISortStore<T>[]\r\n skip?: number\r\n take?: number\r\n filter?: string\r\n noTotal?: boolean\r\n seedKey?: string\r\n seedField?: string\r\n} & U\r\n\r\nexport class RequestParam<T extends object = any, U extends object = {}> {\r\n private readonly _option?: Partial<IRequestParamOption>\r\n constructor(option?: Partial<IRequestParamOption>) {\r\n this._option = option\r\n }\r\n\r\n private mergeOptions = (...p: any[]): Partial<IAllOptions> => {\r\n return p.reduce((a, b) => {\r\n return Object.assign(a, b ?? {})\r\n }, {})\r\n }\r\n\r\n private ignoreEmpty = (field2: string, option?: Partial<IFilterOption>) => {\r\n const mOption = this.mergeOptions(this._option, option)\r\n return !field2 && mOption?.ignoreEmpty === true\r\n }\r\n\r\n private _filter: string[] = []\r\n private _filterBase = (field1: IVariable<T>, operation: string, field2: string, option?: Partial<IFilterOption>) => {\r\n const logicStr = this._filter.length ? ' ' + (option?.logic === 'And' ? '&&' : '||') + ' ' : ''\r\n this._filter.push(`${logicStr}${field1 as string}${operation}${field2 as string}`)\r\n return this\r\n }\r\n filter = (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption>) => {\r\n if (typeof field2 === 'string' && this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '==', typeof field2 === 'string' ? `\"${field2}\"` : field2.toString(), option)\r\n }\r\n filterEqual = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '==', `\"${field2}\"`, option)\r\n }\r\n filterNotEquals = (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption>) => {\r\n if (typeof field2 === 'string' && this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '!=', typeof field2 === 'string' ? `\"${field2}\"` : field2.toString(), option)\r\n }\r\n filterEnum = (field1: IVariable<T>, field2: string | number, option?: Partial<IFilterOption>) => {\r\n if (typeof field2 === 'string' && this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '==', typeof field2 === 'string' ? field2 : field2.toString(), option)\r\n }\r\n filterStartsWith = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '.startsWith(\"' + (field2 as string) + '\")', '', option)\r\n }\r\n filterContains = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '.Contains(\"' + (field2 as string) + '\")', '', option)\r\n }\r\n filterLast = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, '.endsWith(\"' + (field2 as string) + '\")', '', option)\r\n }\r\n filterNumber = (field1: IVariable<T>, operator: string, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, ` ${operator} ` + (field2 as string), '', option)\r\n }\r\n\r\n filterGreater = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, \" > '\" + (field2 as string) + \"'\", '', option)\r\n }\r\n filterGreaterEqual = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, \" >= '\" + (field2 as string) + \"'\", '', option)\r\n }\r\n filterLess = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, \" < '\" + (field2 as string) + \"'\", '', option)\r\n }\r\n filterLessEqual = (field1: IVariable<T>, field2: string, option?: Partial<IFilterOption>) => {\r\n if (this.ignoreEmpty(field2, option)) return this\r\n return this._filterBase(field1, \" <= '\" + (field2 as string) + \"'\", '', option)\r\n }\r\n filterCustom = (field1: string, option?: Partial<IFilterOption>) => {\r\n const logicStr = this._filter.length ? ' ' + (option?.logic === 'And' ? '&&' : '||') + ' ' : ''\r\n this._filter.push(`${logicStr}${field1 as string}`)\r\n return this\r\n }\r\n\r\n scope = (action: (crd: RequestParam<T>) => RequestParam<T>, option?: Partial<IFilterOption>) => {\r\n const crd = action(new RequestParam(this._option))\r\n const temp = crd.buildFilter()\r\n if (temp) {\r\n const logicStr = this._filter.length ? ' ' + (option?.logic === 'And' ? '&&' : '||') + ' ' : ''\r\n this._filter.push(`${logicStr}(${crd.buildFilter()})`)\r\n }\r\n this.mergeExtendData(crd.extendData as U)\r\n return this\r\n }\r\n\r\n private seedStore?: ISeedModel<T>\r\n seed = (field: keyof T, key: string) => {\r\n this.seedStore = { field, key }\r\n return this\r\n }\r\n\r\n private _skip?: number\r\n skip = (skip: number) => {\r\n this._skip = skip\r\n return this\r\n }\r\n\r\n private _take?: number\r\n take = (take: number) => {\r\n this._take = take\r\n return this\r\n }\r\n\r\n private sortStore: ISortStore<T>[] = []\r\n private sortBase = (field1: IVariable<T>, direction: ISortDirection, option?: Partial<ISortOption>) => {\r\n const temp = {} as ISortStore<T>\r\n temp[field1] = direction\r\n if (!this.sortStore.some((item) => Object.keys(item)[0] === Object.keys(temp)[0])) {\r\n this.sortStore.push(temp)\r\n }\r\n return this\r\n }\r\n sort = (field1: IVariable<T>, option?: Partial<ISortOption>) => {\r\n this.sortBase(field1, option?.direction ? option.direction : 'ASC')\r\n return this\r\n }\r\n private _noTotal?: boolean\r\n noTotal = (value: boolean = true) => {\r\n this._noTotal = value\r\n return this\r\n }\r\n\r\n private buildFilter = () => {\r\n return this._filter.join('')\r\n }\r\n\r\n private buildPage = () => {\r\n const temp = {} as any\r\n if (this._skip) {\r\n temp.skip = this._skip\r\n }\r\n if (this._take) {\r\n temp.take = this._take\r\n }\r\n return temp as { skip: number; take: number }\r\n }\r\n\r\n private buildRandomWithSeedKey = (): Partial<ISeedModel<T>> => {\r\n if (this.seedStore?.field && !this.seedStore?.key) {\r\n console.warn('RandomWithSeedKey missing seedKey.')\r\n }\r\n if (this.seedStore?.key && !this.seedStore?.field) {\r\n console.warn('RandomWithSeedKey missing seedField.')\r\n }\r\n if (!this.seedStore?.key && !this.seedStore?.field) {\r\n return {}\r\n }\r\n return this.seedStore\r\n }\r\n\r\n private _extendData: U = {} as U\r\n private get extendData(): U {\r\n return this._extendData\r\n }\r\n private mergeExtendData = (source: U) => {\r\n for (const key in source) {\r\n this._extendData[key] = source[key]\r\n }\r\n }\r\n extendResult = (customKey: keyof U, value: U[keyof U]) => {\r\n if (!this._extendData) {\r\n this._extendData = {} as U\r\n }\r\n this._extendData[customKey] = value\r\n return this\r\n }\r\n\r\n build = (): IRequestParamResult<T, U> => {\r\n const obj: IRequestParamResult<T, U> = { ...this.buildPage() } as IRequestParamResult<T, U>\r\n if (this._extendData) {\r\n for (const key in this._extendData) {\r\n obj[key] = this._extendData[key]\r\n }\r\n }\r\n if (this.sortStore.length > 0) obj.sort = this.sortStore\r\n const filter = this.buildFilter()\r\n if (filter) obj.filter = filter\r\n if (this._noTotal) obj.noTotal = this._noTotal\r\n const seedInfo = this.buildRandomWithSeedKey()\r\n if (!!seedInfo.key && !!seedInfo.field) {\r\n obj.seedField = seedInfo.field.toString()\r\n obj.seedKey = seedInfo.key\r\n }\r\n return obj\r\n }\r\n}\r\n\r\nexport const createRequestBuilder = <T extends object, U extends object = {}>(option?: Partial<IRequestParamOption>) => {\r\n return new RequestParam<T, U>(option)\r\n}\r\n"],"names":["RequestParam","_createClass","option","_this","this","_classCallCheck","_defineProperty","_len","arguments","length","p","Array","_key","reduce","a","b","Object","assign","field2","mOption","mergeOptions","_option","ignoreEmpty","field1","operation","logicStr","_filter","logic","push","concat","_filterBase","toString","operator","action","crd","buildFilter","mergeExtendData","extendData","field","key","seedStore","skip","_skip","take","_take","direction","temp","sortStore","some","item","keys","sortBase","value","undefined","_noTotal","join","_this$seedStore","_this$seedStore2","_this$seedStore3","_this$seedStore4","_this$seedStore5","_this$seedStore6","console","warn","source","_extendData","customKey","obj","_objectSpread","buildPage","sort","filter","noTotal","seedInfo","buildRandomWithSeedKey","seedField","seedKey","get","createRequestBuilder"],"mappings":"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"}
|
|
@@ -27,7 +27,15 @@ declare class ConvertFilterToGraphQL<T, G extends object> {
|
|
|
27
27
|
private handleSort;
|
|
28
28
|
private prebuildFunc?;
|
|
29
29
|
prebuild: (func: (requestParam: RequestParam<G>) => RequestParam<G>) => this;
|
|
30
|
-
build: () =>
|
|
30
|
+
build: () => {
|
|
31
|
+
sort?: import("../http-service/graphql/request-param").ISortStore<G>[] | undefined;
|
|
32
|
+
skip?: number | undefined;
|
|
33
|
+
take?: number | undefined;
|
|
34
|
+
filter?: string | undefined;
|
|
35
|
+
noTotal?: boolean | undefined;
|
|
36
|
+
seedKey?: string | undefined;
|
|
37
|
+
seedField?: string | undefined;
|
|
38
|
+
};
|
|
31
39
|
}
|
|
32
40
|
export default ConvertFilterToGraphQL;
|
|
33
41
|
export declare const createConvertFilterToGraphQL: <T, G extends object>(params: IFilterToGraphQLParams<T, G>) => ConvertFilterToGraphQL<T, G>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { RequestParam } from '../http-service/graphql/request-param';
|
|
2
2
|
import type { TFilterState, TFieldStore, TLogic, TDirection, TFieldType } from './types';
|
|
3
|
-
type TFilterScopeFn<TSource, TTarget extends object> = (currentBuilder: RequestParam<TTarget>, store?: TFieldStore<TSource>) => void;
|
|
3
|
+
type TFilterScopeFn<TSource, TTarget extends object, U extends object = {}> = (currentBuilder: RequestParam<TTarget, U>, store?: TFieldStore<TSource>) => void;
|
|
4
4
|
/**
|
|
5
5
|
* @en
|
|
6
6
|
* - Utility class to convert filter state from a filter bar into a GraphQL query builder.
|
|
@@ -9,18 +9,18 @@ type TFilterScopeFn<TSource, TTarget extends object> = (currentBuilder: RequestP
|
|
|
9
9
|
* - Lớp tiện ích để chuyển đổi trạng thái filter từ filter bar thành builder truy vấn GraphQL.
|
|
10
10
|
* - Hỗ trợ ánh xạ các trường filter sang các trường GraphQL khác, logic filter tùy chỉnh và sắp xếp.
|
|
11
11
|
*/
|
|
12
|
-
type TAutoMapFieldCustomFn<TSource, TTarget extends object> = (currentBuilder: RequestParam<TTarget>, value?: NonNullable<TFieldStore<TSource>>[keyof TFieldStore<TSource>], store?: TFieldStore<TSource>) => void;
|
|
13
|
-
type TAutoMapConfig<TSource, TTarget extends object> = {
|
|
12
|
+
type TAutoMapFieldCustomFn<TSource, TTarget extends object, U extends object = {}> = (currentBuilder: RequestParam<TTarget, U>, value?: NonNullable<TFieldStore<TSource>>[keyof TFieldStore<TSource>], store?: TFieldStore<TSource>) => void;
|
|
13
|
+
type TAutoMapConfig<TSource, TTarget extends object, U extends object = {}> = {
|
|
14
14
|
/**
|
|
15
15
|
* @en The target field in the GraphQL schema that this filter field maps to. If not provided, the source field name will be used as the target field.
|
|
16
16
|
* @vi Trường đích trong schema GraphQL mà trường filter này ánh xạ tới. Nếu không cung cấp, tên trường nguồn sẽ được sử dụng làm trường đích.
|
|
17
17
|
*/
|
|
18
18
|
targetfield?: keyof TTarget;
|
|
19
19
|
/**
|
|
20
|
-
* @en The operation to apply for the filter field.
|
|
21
|
-
* @vi Thao tác áp dụng cho trường filter.
|
|
20
|
+
* @en The operation to apply for the filter field. @default 'contains'
|
|
21
|
+
* @vi Thao tác áp dụng cho trường filter. @default 'contains'
|
|
22
22
|
*/
|
|
23
|
-
operation?: 'equal' | 'contains' | 'datetime';
|
|
23
|
+
operation?: 'equal' | 'contains' | 'datetime' | 'equalAndAny';
|
|
24
24
|
/**
|
|
25
25
|
* @en
|
|
26
26
|
* - Custom function to apply complex filter logic that doesn't fit standard 'equal' or 'contains' operations.
|
|
@@ -29,20 +29,22 @@ type TAutoMapConfig<TSource, TTarget extends object> = {
|
|
|
29
29
|
* - Hàm tùy chỉnh để áp dụng logic filter phức tạp không phù hợp với các thao tác 'equal' hoặc 'contains' tiêu chuẩn.
|
|
30
30
|
* - Nhận builder GraphQL hiện tại, giá trị của trường filter và toàn bộ store filter để có ngữ cảnh.
|
|
31
31
|
*/
|
|
32
|
-
custom?: TAutoMapFieldCustomFn<TSource, TTarget>;
|
|
32
|
+
custom?: TAutoMapFieldCustomFn<TSource, TTarget, U>;
|
|
33
33
|
};
|
|
34
|
-
type TAutoMapConfigs<TSource, TTarget extends object> = Partial<Record<keyof TSource, TAutoMapConfig<TSource, TTarget>>>;
|
|
34
|
+
type TAutoMapConfigs<TSource, TTarget extends object, U extends object = {}> = Partial<Record<keyof TSource, TAutoMapConfig<TSource, TTarget, U>>>;
|
|
35
35
|
type TFilterOption = {
|
|
36
36
|
logic?: TLogic;
|
|
37
37
|
};
|
|
38
38
|
export declare const mapLogic: (logic?: TLogic) => 'And' | 'Or';
|
|
39
39
|
export declare const mapSortDirection: (direction?: TDirection) => 'ASC' | 'DESC';
|
|
40
|
-
export declare class TableFileterConverter<TSource extends Record<string, any>, TTarget extends object> {
|
|
40
|
+
export declare class TableFileterConverter<TSource extends Record<string, any>, TTarget extends object, U extends object = {}> {
|
|
41
41
|
private state;
|
|
42
|
-
constructor(state: TFilterState<TSource>);
|
|
43
42
|
private graphqlBuilder;
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
constructor(state: TFilterState<TSource>);
|
|
44
|
+
filterScope(fn: TFilterScopeFn<TSource, TTarget, U>, options?: TFilterOption): this;
|
|
45
|
+
filterEqual(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption & {
|
|
46
|
+
isAny?: boolean;
|
|
47
|
+
}): this;
|
|
46
48
|
filterContains(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption): this;
|
|
47
49
|
filterDatetime(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption): this;
|
|
48
50
|
sort(param?: {
|
|
@@ -53,10 +55,10 @@ export declare class TableFileterConverter<TSource extends Record<string, any>,
|
|
|
53
55
|
}): this;
|
|
54
56
|
quickSearch(fields: TFieldType<TSource> | TFieldType<TSource>[]): this;
|
|
55
57
|
private currentObjectMap?;
|
|
56
|
-
autoMap: (objMap: TAutoMapConfigs<TSource, TTarget>) => this;
|
|
58
|
+
autoMap: (objMap: TAutoMapConfigs<TSource, TTarget, U>) => this;
|
|
57
59
|
private prebuildFunc?;
|
|
58
|
-
prebuild: (func: (requestParam: RequestParam<TTarget>) => RequestParam<TTarget>) => this;
|
|
59
|
-
build(): import("../http-service/graphql/request-param").IRequestParamResult<TTarget>;
|
|
60
|
+
prebuild: (func: (requestParam: RequestParam<TTarget, U>) => RequestParam<TTarget, U>) => this;
|
|
61
|
+
build(): import("../http-service/graphql/request-param").IRequestParamResult<TTarget, U>;
|
|
60
62
|
}
|
|
61
|
-
export declare const createConvertToGraphQL: <TSource extends Record<string, any>, TTarget extends object>(state: TFilterState<TSource>) => TableFileterConverter<TSource, TTarget>;
|
|
63
|
+
export declare const createConvertToGraphQL: <TSource extends Record<string, any>, TTarget extends object, U extends object = {}>(state: TFilterState<TSource>) => TableFileterConverter<TSource, TTarget, U>;
|
|
62
64
|
export {};
|
|
@@ -6,7 +6,7 @@ import createFormFieldSelectMultiple from './menu/create-form-field-select-multi
|
|
|
6
6
|
import createFormFieldDateTime, { formatterDateTime } from './menu/create-form-field-datetime';
|
|
7
7
|
export declare class DinoFilterBar {
|
|
8
8
|
createFilterBar: typeof createFilterBar;
|
|
9
|
-
createConvertToGraphQL: <TSource extends Record<string, any>, TTarget extends object>(state: import("./types").TFilterState<TSource>) => import("./convert-to-graphql").TableFileterConverter<TSource, TTarget>;
|
|
9
|
+
createConvertToGraphQL: <TSource extends Record<string, any>, TTarget extends object, U extends object = {}>(state: import("./types").TFilterState<TSource>) => import("./convert-to-graphql").TableFileterConverter<TSource, TTarget, U>;
|
|
10
10
|
createLocalFilterBuilder: <T>(data: T[], filterState: import("./types").TFilterState<T>) => import("./local-filter-builder").LocalFilterBuilder<T>;
|
|
11
11
|
createFormFieldString: typeof createFormFieldString;
|
|
12
12
|
createFormFieldSelect: typeof createFormFieldSelect;
|
|
@@ -19,7 +19,7 @@ export type ISortStore<T extends object> = {
|
|
|
19
19
|
[key in keyof T]?: ISortDirection;
|
|
20
20
|
};
|
|
21
21
|
export type IAllOptions = IFilterOption & IRequestParamOption & ISortOption;
|
|
22
|
-
export type IRequestParamResult<T extends object> = {
|
|
22
|
+
export type IRequestParamResult<T extends object, U extends object = {}> = {
|
|
23
23
|
sort?: ISortStore<T>[];
|
|
24
24
|
skip?: number;
|
|
25
25
|
take?: number;
|
|
@@ -27,8 +27,8 @@ export type IRequestParamResult<T extends object> = {
|
|
|
27
27
|
noTotal?: boolean;
|
|
28
28
|
seedKey?: string;
|
|
29
29
|
seedField?: string;
|
|
30
|
-
};
|
|
31
|
-
export declare class RequestParam<T extends object = any> {
|
|
30
|
+
} & U;
|
|
31
|
+
export declare class RequestParam<T extends object = any, U extends object = {}> {
|
|
32
32
|
private readonly _option?;
|
|
33
33
|
constructor(option?: Partial<IRequestParamOption>);
|
|
34
34
|
private mergeOptions;
|
|
@@ -63,6 +63,10 @@ export declare class RequestParam<T extends object = any> {
|
|
|
63
63
|
private buildFilter;
|
|
64
64
|
private buildPage;
|
|
65
65
|
private buildRandomWithSeedKey;
|
|
66
|
-
|
|
66
|
+
private _extendData;
|
|
67
|
+
private get extendData();
|
|
68
|
+
private mergeExtendData;
|
|
69
|
+
extendResult: (customKey: keyof U, value: U[keyof U]) => this;
|
|
70
|
+
build: () => IRequestParamResult<T, U>;
|
|
67
71
|
}
|
|
68
|
-
export declare const createRequestBuilder: <T extends object>(option?: Partial<IRequestParamOption>) => RequestParam<T>;
|
|
72
|
+
export declare const createRequestBuilder: <T extends object, U extends object = {}>(option?: Partial<IRequestParamOption>) => RequestParam<T, U>;
|