dinocollab-core 1.0.0 → 1.0.2
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/_virtual/_rollupPluginBabelHelpers.js +67 -10
- package/dist/_virtual/_rollupPluginBabelHelpers.js.map +1 -1
- package/dist/{src/api-context → api-context}/alert-global.js +49 -34
- package/dist/api-context/alert-global.js.map +1 -0
- package/dist/{src/api-context → api-context}/drawer-global.js +40 -33
- package/dist/api-context/drawer-global.js.map +1 -0
- package/dist/{src/api-context → api-context}/global-modal.js +40 -32
- package/dist/api-context/global-modal.js.map +1 -0
- package/dist/{src/api-context → api-context}/popover-global.js +44 -36
- package/dist/api-context/popover-global.js.map +1 -0
- package/dist/api-context/popover.js +94 -0
- package/dist/api-context/popover.js.map +1 -0
- package/dist/{src/api-context → api-context}/ui.units.js +12 -10
- package/dist/api-context/ui.units.js.map +1 -0
- package/dist/components/breadcrumbs.js +65 -0
- package/dist/components/breadcrumbs.js.map +1 -0
- package/dist/{src/components → components}/copy-to-clipboard.js +39 -32
- package/dist/components/copy-to-clipboard.js.map +1 -0
- package/dist/components/help-tooltip.js +104 -0
- package/dist/components/help-tooltip.js.map +1 -0
- package/dist/components/image-with-fallback.js +51 -0
- package/dist/components/image-with-fallback.js.map +1 -0
- package/dist/{src/components → components}/text-editor.js +24 -23
- package/dist/components/text-editor.js.map +1 -0
- package/dist/components/text-editor.preview.js +27 -0
- package/dist/components/text-editor.preview.js.map +1 -0
- package/dist/form/create.autocomplete.chips.js +228 -0
- package/dist/form/create.autocomplete.chips.js.map +1 -0
- package/dist/{src/form → form}/create.date-expired.js +71 -61
- package/dist/form/create.date-expired.js.map +1 -0
- package/dist/{src/form → form}/create.date-picker.js +40 -37
- package/dist/form/create.date-picker.js.map +1 -0
- package/dist/{src/form → form}/create.form-base.js +47 -41
- package/dist/form/create.form-base.js.map +1 -0
- package/dist/form/create.form-comfirm.js +131 -0
- package/dist/form/create.form-comfirm.js.map +1 -0
- package/dist/form/create.form-grid-layout.js +188 -0
- package/dist/form/create.form-grid-layout.js.map +1 -0
- package/dist/{src/form → form}/create.form-grid-layout.units.js +17 -14
- package/dist/form/create.form-grid-layout.units.js.map +1 -0
- package/dist/form/create.input.file.js +79 -0
- package/dist/form/create.input.file.js.map +1 -0
- package/dist/form/create.input.js +276 -0
- package/dist/form/create.input.js.map +1 -0
- package/dist/form/create.select-simple.js +114 -0
- package/dist/form/create.select-simple.js.map +1 -0
- package/dist/form/create.select-with-api.js +277 -0
- package/dist/form/create.select-with-api.js.map +1 -0
- package/dist/form/create.text-editor.js +181 -0
- package/dist/form/create.text-editor.js.map +1 -0
- package/dist/{src/form → form}/dino-form.js +17 -18
- package/dist/form/dino-form.js.map +1 -0
- package/dist/{src/form → form}/helper.js +14 -14
- package/dist/form/helper.js.map +1 -0
- package/dist/{src/form → form}/modal-wrapper.js +32 -25
- package/dist/form/modal-wrapper.js.map +1 -0
- package/dist/{src/form → form}/validator.js +47 -43
- package/dist/form/validator.js.map +1 -0
- package/dist/{src/hooks → hooks}/index.js +1 -1
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.d.ts +928 -0
- package/dist/{src/index.js → index.js} +10 -3
- package/dist/{src/index.js.map → index.js.map} +1 -1
- package/dist/redux/create.hoc-lazy.js +71 -0
- package/dist/redux/create.hoc-lazy.js.map +1 -0
- package/dist/{src/redux → redux}/dino.js +2 -2
- package/dist/redux/dino.js.map +1 -0
- package/dist/redux/types.js.map +1 -0
- package/dist/redux/ui.error-page.js +89 -0
- package/dist/redux/ui.error-page.js.map +1 -0
- package/dist/redux/vector-404.webp.js.map +1 -0
- package/dist/{src/table → table}/context.js +5 -2
- package/dist/table/context.js.map +1 -0
- package/dist/table/create.action-row.js +144 -0
- package/dist/table/create.action-row.js.map +1 -0
- package/dist/table/create.table.js +246 -0
- package/dist/table/create.table.js.map +1 -0
- package/dist/{src/table → table}/custom.filter-operators.js +2 -2
- package/dist/table/custom.filter-operators.js.map +1 -0
- package/dist/table/dino.js +136 -0
- package/dist/table/dino.js.map +1 -0
- package/dist/{src/table → table}/helpers.js +31 -32
- package/dist/table/helpers.js.map +1 -0
- package/dist/table/model-filter.js.map +1 -0
- package/dist/table/toolbar-pannel.js +143 -0
- package/dist/table/toolbar-pannel.js.map +1 -0
- package/dist/table/ui.buttons.js +67 -0
- package/dist/table/ui.buttons.js.map +1 -0
- package/dist/table/ui.units.js +248 -0
- package/dist/table/ui.units.js.map +1 -0
- package/dist/types/api-context/alert-global.d.ts +29 -0
- package/dist/types/api-context/drawer-global.d.ts +32 -0
- package/dist/types/api-context/global-modal.d.ts +37 -0
- package/dist/types/api-context/index.d.ts +9 -0
- package/dist/types/api-context/popover-global.d.ts +37 -0
- package/dist/types/api-context/popover.d.ts +32 -0
- package/dist/types/api-context/ui.units.d.ts +2 -0
- package/dist/types/components/breadcrumbs.d.ts +13 -0
- package/dist/types/components/copy-to-clipboard.d.ts +26 -0
- package/dist/types/components/help-tooltip.d.ts +15 -0
- package/dist/types/components/image-with-fallback.d.ts +13 -0
- package/dist/types/components/index.d.ts +11 -0
- package/dist/types/components/input-debounce-timer.d.ts +9 -0
- package/dist/types/components/loading-buttons.d.ts +6 -0
- package/dist/types/components/text-editor.d.ts +26 -0
- package/dist/types/components/text-editor.preview.d.ts +5 -0
- package/dist/types/form/create.autocomplete.chips.d.ts +16 -0
- package/dist/types/form/create.date-expired.d.ts +19 -0
- package/dist/types/form/create.date-picker.d.ts +19 -0
- package/dist/types/form/create.form-base.d.ts +30 -0
- package/dist/types/form/create.form-comfirm.d.ts +20 -0
- package/dist/types/form/create.form-grid-layout.d.ts +44 -0
- package/dist/types/form/create.form-grid-layout.units.d.ts +8 -0
- package/dist/types/form/create.input.d.ts +29 -0
- package/dist/types/form/create.input.file.d.ts +16 -0
- package/dist/types/form/create.select-simple.d.ts +24 -0
- package/dist/types/form/create.select-with-api.d.ts +29 -0
- package/dist/types/form/create.text-editor.d.ts +42 -0
- package/dist/types/form/dino-form.d.ts +26 -0
- package/dist/types/form/helper.d.ts +14 -0
- package/dist/types/form/index.d.ts +7 -0
- package/dist/types/form/modal-wrapper.d.ts +14 -0
- package/dist/types/form/types.d.ts +15 -0
- package/dist/types/form/validator.d.ts +64 -0
- package/dist/types/hooks/index.d.ts +4 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/lab/create.autocomplete.simple.d.ts +19 -0
- package/dist/types/lab/create.dino-store.d.ts +1 -0
- package/dist/types/lab/create.multi-select-dropdown.d.ts +23 -0
- package/dist/types/lab/create.select-mul-with-api/index.d.ts +26 -0
- package/dist/types/lab/create.select-mul-with-api/table-custom.d.ts +43 -0
- package/dist/types/lab/create.select-mul-with-api/types.d.ts +21 -0
- package/dist/types/lab/create.select-mul-with-api/ui.units.d.ts +29 -0
- package/dist/types/lab/filter-bar/base.d.ts +34 -0
- package/dist/types/lab/filter-bar/create.filter-bar.d.ts +92 -0
- package/dist/types/lab/filter-bar/create.filter-menu.d.ts +66 -0
- package/dist/types/lab/filter-bar/create.filter-panel.d.ts +117 -0
- package/dist/types/lab/filter-bar/create.filtered.d.ts +59 -0
- package/dist/types/lab/filter-bar/create.sort-menu.d.ts +7 -0
- package/dist/types/lab/filter-bar/demo.d.ts +3 -0
- package/dist/types/lab/filter-bar/index.d.ts +4 -0
- package/dist/types/lab/filter-bar/types.d.ts +81 -0
- package/dist/types/lab/filter-bar/ui.units.d.ts +13 -0
- package/dist/types/lab/grafana-dashboard/configs.d.ts +4 -0
- package/dist/types/lab/grafana-dashboard/date-time-range/absolute-time-rage.d.ts +14 -0
- package/dist/types/lab/grafana-dashboard/date-time-range/helpers.d.ts +36 -0
- package/dist/types/lab/grafana-dashboard/date-time-range/index.d.ts +24 -0
- package/dist/types/lab/grafana-dashboard/date-time-range/menu-wrap.d.ts +19 -0
- package/dist/types/lab/grafana-dashboard/date-time-range/quick-ranges.d.ts +20 -0
- package/dist/types/lab/grafana-dashboard/date-time-range/types.d.ts +8 -0
- package/dist/types/lab/grafana-dashboard/date-time-range/units.d.ts +2 -0
- package/dist/types/lab/grafana-dashboard/helper.d.ts +7 -0
- package/dist/types/lab/grafana-dashboard/hooks.d.ts +10 -0
- package/dist/types/lab/grafana-dashboard/icons.d.ts +5 -0
- package/dist/types/lab/grafana-dashboard/index.d.ts +12 -0
- package/dist/types/lab/grafana-dashboard/top-bar.d.ts +19 -0
- package/dist/types/lab/grafana-dashboard/top-bar.types.d.ts +4 -0
- package/dist/types/lab/grafana-dashboard/types.d.ts +8 -0
- package/dist/types/lab/media-player.core1.d.ts +14 -0
- package/dist/types/lab/media-player.muted.d.ts +10 -0
- package/dist/types/lab/media-player.units.d.ts +36 -0
- package/dist/types/lab/table-grid/create.table-grid.d.ts +4 -0
- package/dist/types/lab/table-grid/demo.d.ts +3 -0
- package/dist/types/lab/table-grid/dino.d.ts +6 -0
- package/dist/types/lab/table-grid/helpers.d.ts +11 -0
- package/dist/types/lab/table-grid/index.d.ts +2 -0
- package/dist/types/lab/table-grid/item-actions.d.ts +93 -0
- package/dist/types/lab/table-grid/toolbar-pannel.d.ts +27 -0
- package/dist/types/lab/table-grid/types.d.ts +56 -0
- package/dist/types/redux/create.hoc-lazy.d.ts +19 -0
- package/dist/types/redux/dino.d.ts +6 -0
- package/dist/types/redux/index.d.ts +4 -0
- package/dist/types/redux/types.d.ts +22 -0
- package/dist/types/redux/ui.error-page.d.ts +3 -0
- package/dist/types/redux/ui.units.d.ts +9 -0
- package/dist/types/table/context.d.ts +8 -0
- package/dist/types/table/create.action-row.d.ts +16 -0
- package/dist/types/table/create.table.d.ts +33 -0
- package/dist/types/table/custom.filter-operators.d.ts +2 -0
- package/dist/types/table/dino.d.ts +41 -0
- package/dist/types/table/helpers.d.ts +23 -0
- package/dist/types/table/index.d.ts +7 -0
- package/dist/types/table/model-filter.d.ts +38 -0
- package/dist/types/table/toolbar-pannel.d.ts +18 -0
- package/dist/types/table/types.d.ts +40 -0
- package/dist/types/table/ui.buttons.d.ts +16 -0
- package/dist/types/table/ui.units.d.ts +62 -0
- package/dist/types/utils/dayjs-config.d.ts +2 -0
- package/dist/types/utils/helpers.d.ts +35 -0
- package/dist/types/utils/index.d.ts +4 -0
- package/dist/types/utils/json-object.d.ts +9 -0
- package/dist/types/utils/mfe-events.d.ts +12 -0
- package/dist/types/utils/query-param.d.ts +25 -0
- package/dist/utils/dayjs-config.js.map +1 -0
- package/dist/{src/utils → utils}/helpers.js +11 -9
- package/dist/utils/helpers.js.map +1 -0
- package/dist/{src/utils → utils}/json-object.js +13 -13
- package/dist/utils/json-object.js.map +1 -0
- package/dist/{src/utils → utils}/query-param.js +17 -17
- package/dist/utils/query-param.js.map +1 -0
- package/package.json +18 -4
- package/dist/node_modules/.pnpm/@rollup_plugin-typescript@1_d0d2002d9033600b6738d939bd598bc6/node_modules/tslib/tslib.es6.js +0 -46
- package/dist/node_modules/.pnpm/@rollup_plugin-typescript@1_d0d2002d9033600b6738d939bd598bc6/node_modules/tslib/tslib.es6.js.map +0 -1
- package/dist/src/api-context/alert-global.js.map +0 -1
- package/dist/src/api-context/drawer-global.js.map +0 -1
- package/dist/src/api-context/global-modal.js.map +0 -1
- package/dist/src/api-context/popover-global.js.map +0 -1
- package/dist/src/api-context/popover.js +0 -86
- package/dist/src/api-context/popover.js.map +0 -1
- package/dist/src/api-context/ui.units.js.map +0 -1
- package/dist/src/components/copy-to-clipboard.js.map +0 -1
- package/dist/src/components/custom.breadcrumbs.js +0 -61
- package/dist/src/components/custom.breadcrumbs.js.map +0 -1
- package/dist/src/components/help-tooltip.js +0 -91
- package/dist/src/components/help-tooltip.js.map +0 -1
- package/dist/src/components/image-with-fallback.js +0 -48
- package/dist/src/components/image-with-fallback.js.map +0 -1
- package/dist/src/components/text-editor.js.map +0 -1
- package/dist/src/form/create.autocomplete.chips.js +0 -218
- package/dist/src/form/create.autocomplete.chips.js.map +0 -1
- package/dist/src/form/create.date-expired.js.map +0 -1
- package/dist/src/form/create.date-picker.js.map +0 -1
- package/dist/src/form/create.form-base.js.map +0 -1
- package/dist/src/form/create.form-comfirm.js +0 -119
- package/dist/src/form/create.form-comfirm.js.map +0 -1
- package/dist/src/form/create.form-grid-layout.js +0 -177
- package/dist/src/form/create.form-grid-layout.js.map +0 -1
- package/dist/src/form/create.form-grid-layout.units.js.map +0 -1
- package/dist/src/form/create.input-base.js +0 -260
- package/dist/src/form/create.input-base.js.map +0 -1
- package/dist/src/form/create.input.file.js +0 -74
- package/dist/src/form/create.input.file.js.map +0 -1
- package/dist/src/form/create.select-simple.js +0 -104
- package/dist/src/form/create.select-simple.js.map +0 -1
- package/dist/src/form/create.select-with-api.js +0 -271
- package/dist/src/form/create.select-with-api.js.map +0 -1
- package/dist/src/form/create.text-editor.js +0 -156
- package/dist/src/form/create.text-editor.js.map +0 -1
- package/dist/src/form/dino-form.js.map +0 -1
- package/dist/src/form/helper.js.map +0 -1
- package/dist/src/form/modal-wrapper.js.map +0 -1
- package/dist/src/form/validator.js.map +0 -1
- package/dist/src/hooks/index.js.map +0 -1
- package/dist/src/redux/create.hoc-lazy.js +0 -67
- package/dist/src/redux/create.hoc-lazy.js.map +0 -1
- package/dist/src/redux/dino.js.map +0 -1
- package/dist/src/redux/types.js.map +0 -1
- package/dist/src/redux/ui.error-page.js +0 -80
- package/dist/src/redux/ui.error-page.js.map +0 -1
- package/dist/src/redux/vector-404.webp.js.map +0 -1
- package/dist/src/table/context.js.map +0 -1
- package/dist/src/table/create.action-row.js +0 -135
- package/dist/src/table/create.action-row.js.map +0 -1
- package/dist/src/table/create.status-cell.js +0 -49
- package/dist/src/table/create.status-cell.js.map +0 -1
- package/dist/src/table/create.table.js +0 -233
- package/dist/src/table/create.table.js.map +0 -1
- package/dist/src/table/custom.filter-operators.js.map +0 -1
- package/dist/src/table/dino.js +0 -129
- package/dist/src/table/dino.js.map +0 -1
- package/dist/src/table/helpers.js.map +0 -1
- package/dist/src/table/model-filter.js.map +0 -1
- package/dist/src/table/toolbar-pannel.js +0 -134
- package/dist/src/table/toolbar-pannel.js.map +0 -1
- package/dist/src/table/ui.buttons.js +0 -60
- package/dist/src/table/ui.buttons.js.map +0 -1
- package/dist/src/table/ui.units.js +0 -201
- package/dist/src/table/ui.units.js.map +0 -1
- package/dist/src/utils/dayjs-config.js.map +0 -1
- package/dist/src/utils/helpers.js.map +0 -1
- package/dist/src/utils/json-object.js.map +0 -1
- package/dist/src/utils/query-param.js.map +0 -1
- package/rollup.config.js +0 -39
- package/src/@types/global.d.ts +0 -5
- package/src/api-context/alert-global.tsx +0 -174
- package/src/api-context/drawer-global.tsx +0 -116
- package/src/api-context/global-modal.tsx +0 -109
- package/src/api-context/index.ts +0 -13
- package/src/api-context/popover-global.tsx +0 -107
- package/src/api-context/popover.tsx +0 -89
- package/src/api-context/ui.units.tsx +0 -10
- package/src/components/copy-to-clipboard.tsx +0 -86
- package/src/components/custom.breadcrumbs.tsx +0 -67
- package/src/components/help-tooltip.tsx +0 -75
- package/src/components/image-with-fallback.tsx +0 -51
- package/src/components/index.tsx +0 -1
- package/src/components/input-debounce-timer.tsx +0 -138
- package/src/components/loading-buttons.tsx +0 -35
- package/src/components/text-editor.preview.tsx +0 -30
- package/src/components/text-editor.tsx +0 -125
- package/src/form/README.md +0 -55
- package/src/form/create.autocomplete.chips.tsx +0 -199
- package/src/form/create.date-expired.tsx +0 -195
- package/src/form/create.date-picker.tsx +0 -122
- package/src/form/create.form-base.tsx +0 -102
- package/src/form/create.form-comfirm.tsx +0 -83
- package/src/form/create.form-grid-layout.tsx +0 -170
- package/src/form/create.form-grid-layout.units.tsx +0 -37
- package/src/form/create.input-base.tsx +0 -222
- package/src/form/create.input.file.tsx +0 -76
- package/src/form/create.select-simple.tsx +0 -101
- package/src/form/create.select-with-api.tsx +0 -213
- package/src/form/create.text-editor.tsx +0 -161
- package/src/form/dino-form.tsx +0 -40
- package/src/form/helper.ts +0 -132
- package/src/form/index.ts +0 -12
- package/src/form/modal-wrapper.tsx +0 -75
- package/src/form/types.ts +0 -16
- package/src/form/validator.ts +0 -202
- package/src/hooks/index.ts +0 -44
- package/src/index.ts +0 -7
- package/src/lab/create.autocomplete.simple.tsx +0 -57
- package/src/lab/create.dino-store.ts +0 -59
- package/src/lab/create.multi-select-dropdown.tsx +0 -189
- package/src/lab/create.select-mul-with-api/index.tsx +0 -271
- package/src/lab/create.select-mul-with-api/table-custom.tsx +0 -194
- package/src/lab/create.select-mul-with-api/types.ts +0 -26
- package/src/lab/create.select-mul-with-api/ui.units.tsx +0 -163
- package/src/lab/filter-bar/base.tsx +0 -162
- package/src/lab/filter-bar/create.filter-bar.tsx +0 -190
- package/src/lab/filter-bar/create.filter-menu.tsx +0 -156
- package/src/lab/filter-bar/create.filter-panel.tsx +0 -95
- package/src/lab/filter-bar/create.filtered.tsx +0 -41
- package/src/lab/filter-bar/create.sort-menu.tsx +0 -43
- package/src/lab/filter-bar/demo.tsx +0 -50
- package/src/lab/filter-bar/index.ts +0 -6
- package/src/lab/filter-bar/types.ts +0 -105
- package/src/lab/filter-bar/ui.units.tsx +0 -70
- package/src/lab/grafana-dashboard/configs.ts +0 -43
- package/src/lab/grafana-dashboard/date-time-range/absolute-time-rage.tsx +0 -137
- package/src/lab/grafana-dashboard/date-time-range/helpers.ts +0 -126
- package/src/lab/grafana-dashboard/date-time-range/index.tsx +0 -62
- package/src/lab/grafana-dashboard/date-time-range/menu-wrap.tsx +0 -101
- package/src/lab/grafana-dashboard/date-time-range/quick-ranges.tsx +0 -161
- package/src/lab/grafana-dashboard/date-time-range/types.ts +0 -9
- package/src/lab/grafana-dashboard/date-time-range/units.tsx +0 -18
- package/src/lab/grafana-dashboard/helper.ts +0 -25
- package/src/lab/grafana-dashboard/hooks.tsx +0 -79
- package/src/lab/grafana-dashboard/icons.tsx +0 -67
- package/src/lab/grafana-dashboard/index.tsx +0 -120
- package/src/lab/grafana-dashboard/top-bar.tsx +0 -62
- package/src/lab/grafana-dashboard/top-bar.types.ts +0 -5
- package/src/lab/grafana-dashboard/types.ts +0 -8
- package/src/lab/media-player.core1.tsx +0 -273
- package/src/lab/media-player.muted.tsx +0 -62
- package/src/lab/media-player.units.ts +0 -80
- package/src/lab/table-grid/create.table-grid.tsx +0 -183
- package/src/lab/table-grid/demo.tsx +0 -53
- package/src/lab/table-grid/dino.tsx +0 -8
- package/src/lab/table-grid/helpers.tsx +0 -11
- package/src/lab/table-grid/index.ts +0 -3
- package/src/lab/table-grid/item-actions.tsx +0 -138
- package/src/lab/table-grid/toolbar-pannel.tsx +0 -98
- package/src/lab/table-grid/types.ts +0 -68
- package/src/redux/create.hoc-lazy.tsx +0 -80
- package/src/redux/dino.ts +0 -9
- package/src/redux/index.ts +0 -6
- package/src/redux/types.ts +0 -27
- package/src/redux/ui.error-page.tsx +0 -62
- package/src/redux/ui.units.tsx +0 -41
- package/src/redux/vector-404.webp +0 -0
- package/src/table/context.tsx +0 -16
- package/src/table/create.action-row.tsx +0 -91
- package/src/table/create.status-cell.tsx +0 -51
- package/src/table/create.table.tsx +0 -239
- package/src/table/custom.filter-operators.ts +0 -94
- package/src/table/dino.tsx +0 -120
- package/src/table/helpers.ts +0 -94
- package/src/table/index.ts +0 -13
- package/src/table/model-filter.ts +0 -43
- package/src/table/toolbar-pannel.tsx +0 -106
- package/src/table/types.ts +0 -50
- package/src/table/ui.buttons.tsx +0 -54
- package/src/table/ui.units.tsx +0 -189
- package/src/utils/dayjs-config.ts +0 -13
- package/src/utils/helpers.ts +0 -171
- package/src/utils/index.ts +0 -7
- package/src/utils/json-object.ts +0 -29
- package/src/utils/mfe-events.tsx +0 -34
- package/src/utils/query-param.ts +0 -129
- package/tsconfig.json +0 -20
- /package/dist/{src/redux → redux}/types.js +0 -0
- /package/dist/{src/redux → redux}/vector-404.webp.js +0 -0
- /package/dist/{src/table → table}/model-filter.js +0 -0
- /package/dist/{src/utils → utils}/dayjs-config.js +0 -0
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
import React, { Component } from 'react'
|
|
2
|
-
import { EFieldValidate, ESearchMatch, FilterField, FilterFields, FilterItemModel, FilterModel, FilterState } from './types'
|
|
3
|
-
|
|
4
|
-
export const filterPanelClasses = {
|
|
5
|
-
root: 'FilterPanel-root',
|
|
6
|
-
list: 'FilterPanel-list',
|
|
7
|
-
item: 'FilterPanel-item'
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export default class FilterBarBase<P, S, T = any> extends Component<P, S> {
|
|
11
|
-
//#region Filter
|
|
12
|
-
mergeFilter = (f1?: FilterState<T>, f2?: FilterState<T>): FilterState<T> => {
|
|
13
|
-
const mergedFilter: FilterModel<T> = f2?.filter ?? {}
|
|
14
|
-
|
|
15
|
-
if (f1?.filter) {
|
|
16
|
-
for (const key in f1?.filter) {
|
|
17
|
-
const fieldKey = key as keyof T
|
|
18
|
-
const existingItems = mergedFilter[fieldKey] ?? []
|
|
19
|
-
const newItems = f1?.filter[fieldKey] ?? []
|
|
20
|
-
|
|
21
|
-
const existingValues = new Set(existingItems.map((item) => item.value))
|
|
22
|
-
|
|
23
|
-
const mergedItems = [...existingItems, ...newItems.filter((item) => !existingValues.has(item.value))]
|
|
24
|
-
|
|
25
|
-
if (mergedItems.length > 0) {
|
|
26
|
-
mergedFilter[fieldKey] = mergedItems
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const result: FilterState<T> = {
|
|
32
|
-
filter: Object.keys(mergedFilter).length ? mergedFilter : {},
|
|
33
|
-
details: f2?.details ?? f1?.details
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
return result
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
patchFilterWithKey = (filterState: FilterState<T>, key: keyof FilterModel<T>, value: FilterItemModel) => {
|
|
40
|
-
const clonedFilter: FilterModel<T> = { ...(filterState.filter || {}) }
|
|
41
|
-
let filter = clonedFilter[key] ?? []
|
|
42
|
-
const isChanged = !filter.map((x) => x.value).includes(value.value)
|
|
43
|
-
if (isChanged) filter = [...filter, value]
|
|
44
|
-
clonedFilter[key] = filter
|
|
45
|
-
return { isChanged, filterState: { ...filterState, filter: clonedFilter } }
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
deleteFilterWithKey = (filterState: FilterState<T>, key: keyof FilterModel<T>) => {
|
|
49
|
-
const clonedFilter: FilterModel<T> = { ...(filterState.filter || {}) }
|
|
50
|
-
const isChanged = key in clonedFilter
|
|
51
|
-
if (isChanged) delete clonedFilter[key]
|
|
52
|
-
return { isChanged, filterState: { ...filterState, filter: clonedFilter } }
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
isFilterEmpty = (filterState: FilterState<T>) => {
|
|
56
|
-
const values = Object.values(filterState.filter ?? {})
|
|
57
|
-
return values.length < 1 || values.every((x) => x.length < 1)
|
|
58
|
-
}
|
|
59
|
-
//#endregion
|
|
60
|
-
|
|
61
|
-
//#region Field
|
|
62
|
-
isYoutubeLink = (val: string) => /^https?:\/\/(www\.)?(youtube\.com|youtu\.be)\//.test(val)
|
|
63
|
-
|
|
64
|
-
isGenericLink = (val: string) => /^https?:\/\/[^ ]+$/.test(val)
|
|
65
|
-
|
|
66
|
-
isGuid = (val: string) => /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(val)
|
|
67
|
-
|
|
68
|
-
getFieldsMatches = (fields: FilterFields<T>, keyword: string, showAll?: boolean): FilterFields<T> => {
|
|
69
|
-
const trimmed = keyword.trim().toLowerCase()
|
|
70
|
-
if (!trimmed) return fields
|
|
71
|
-
|
|
72
|
-
const matched: FilterFields<T> = {}
|
|
73
|
-
|
|
74
|
-
for (const key in fields) {
|
|
75
|
-
const field = key as keyof FilterFields<T>
|
|
76
|
-
const config = fields[field]
|
|
77
|
-
if (!config) continue
|
|
78
|
-
|
|
79
|
-
const matches = Array.isArray(config.searchMatches) ? config.searchMatches : config.searchMatches ? [config.searchMatches] : []
|
|
80
|
-
|
|
81
|
-
let visible = false
|
|
82
|
-
|
|
83
|
-
for (const matchObj of matches) {
|
|
84
|
-
switch (matchObj.rule) {
|
|
85
|
-
case ESearchMatch.AlwaysVisible:
|
|
86
|
-
visible = true
|
|
87
|
-
break
|
|
88
|
-
case ESearchMatch.MatchOnly:
|
|
89
|
-
if (typeof matchObj.match === 'function') {
|
|
90
|
-
if (matchObj.match(trimmed)) visible = true
|
|
91
|
-
}
|
|
92
|
-
break
|
|
93
|
-
case ESearchMatch.LinkYoutube:
|
|
94
|
-
if (this.isYoutubeLink(trimmed)) visible = true
|
|
95
|
-
break
|
|
96
|
-
case ESearchMatch.Link:
|
|
97
|
-
if (this.isGenericLink(trimmed)) visible = true
|
|
98
|
-
break
|
|
99
|
-
case ESearchMatch.Guid:
|
|
100
|
-
if (this.isGuid(trimmed)) visible = true
|
|
101
|
-
break
|
|
102
|
-
default:
|
|
103
|
-
break
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
if (visible) break
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
if (visible) matched[field] = config
|
|
110
|
-
}
|
|
111
|
-
return Object.keys(matched).length === 0 ? (showAll ? fields : {}) : matched
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
validated = (value: string, fieldKey: keyof FilterModel<T>, filterField?: FilterField): { error: boolean; message?: string } => {
|
|
115
|
-
const trimmed = value.trim().toLowerCase()
|
|
116
|
-
if (!trimmed) return { error: true, message: `The ${fieldKey.toString()} is required ` }
|
|
117
|
-
const validate = Array.isArray(filterField?.validate) ? (filterField?.validate ?? []) : filterField?.validate ? [filterField.validate] : []
|
|
118
|
-
const obj: { error: boolean; message?: string } = { error: false }
|
|
119
|
-
for (const validateObj of validate) {
|
|
120
|
-
switch (validateObj.rule) {
|
|
121
|
-
case EFieldValidate.LinkYoutube:
|
|
122
|
-
if (!this.isYoutubeLink(trimmed)) {
|
|
123
|
-
obj.error = true
|
|
124
|
-
obj.message = `The ${filterField?.label ?? fieldKey.toString()} must be a valid YouTube link`
|
|
125
|
-
}
|
|
126
|
-
break
|
|
127
|
-
|
|
128
|
-
case EFieldValidate.Link:
|
|
129
|
-
if (!this.isGenericLink(trimmed)) {
|
|
130
|
-
obj.error = true
|
|
131
|
-
obj.message = `The ${filterField?.label ?? fieldKey.toString()} must be a valid URL link`
|
|
132
|
-
}
|
|
133
|
-
break
|
|
134
|
-
|
|
135
|
-
case EFieldValidate.Custom:
|
|
136
|
-
if (typeof validateObj.custom === 'function' && !validateObj.custom(trimmed)) {
|
|
137
|
-
obj.error = true
|
|
138
|
-
obj.message = `The ${filterField?.label ?? fieldKey.toString()} is invalid`
|
|
139
|
-
}
|
|
140
|
-
break
|
|
141
|
-
default:
|
|
142
|
-
break
|
|
143
|
-
}
|
|
144
|
-
if (obj.error) break
|
|
145
|
-
}
|
|
146
|
-
return obj
|
|
147
|
-
}
|
|
148
|
-
//#endregion
|
|
149
|
-
|
|
150
|
-
//#region Sort
|
|
151
|
-
getSortFields = (fields: FilterFields<T>) => {
|
|
152
|
-
const keys = Object.keys(fields) as (keyof FilterFields<T>)[]
|
|
153
|
-
return keys.reduce<FilterFields<T>>((a, b) => {
|
|
154
|
-
const item = fields[b]
|
|
155
|
-
if (item?.sortable !== false) {
|
|
156
|
-
a[b] = item
|
|
157
|
-
}
|
|
158
|
-
return a
|
|
159
|
-
}, {})
|
|
160
|
-
}
|
|
161
|
-
//#endregion
|
|
162
|
-
}
|
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { Box, ClickAwayListener, IconButton, InputBase, styled } from '@mui/material'
|
|
3
|
-
import SwapVertIcon from '@mui/icons-material/SwapVert'
|
|
4
|
-
import FilterListIcon from '@mui/icons-material/FilterList'
|
|
5
|
-
import { ButtonClear, FilterHelpNotes, FilterHelpNotesProps } from './ui.units'
|
|
6
|
-
import { FilterFields, FilterItemModel, FilterModel, FilterReason, FilterState } from './types'
|
|
7
|
-
import CreateFilterPanel, { FilterPanelState } from './create.filter-panel'
|
|
8
|
-
import FilterBarBase from './base'
|
|
9
|
-
import CreateFiltered from './create.filtered'
|
|
10
|
-
|
|
11
|
-
export interface FilterBarParams<T> {
|
|
12
|
-
fields: FilterFields<T>
|
|
13
|
-
id?: string
|
|
14
|
-
placeholder?: string
|
|
15
|
-
helpNotes?: FilterHelpNotesProps
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
interface IProps<T> {
|
|
19
|
-
id?: string
|
|
20
|
-
placeholder?: string
|
|
21
|
-
value?: FilterState<T>
|
|
22
|
-
onChange?: (value: FilterState<T>) => void
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
interface IState {
|
|
26
|
-
panelState: FilterPanelState
|
|
27
|
-
keyword: string
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function CreateFilterBar<T>(params: FilterBarParams<T>) {
|
|
31
|
-
const FilterPanelInstance = CreateFilterPanel<T>({ fields: params.fields })
|
|
32
|
-
const FilteredInstance = CreateFiltered<T>()
|
|
33
|
-
|
|
34
|
-
class FilterBar extends FilterBarBase<IProps<T>, IState, T> {
|
|
35
|
-
defaultState: IState = { keyword: '', panelState: { anchorEl: null } }
|
|
36
|
-
constructor(props: IProps<T>) {
|
|
37
|
-
super(props)
|
|
38
|
-
this.state = this.defaultState
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
filterStateStore: FilterState<T> = { filter: {} }
|
|
42
|
-
get filterState(): FilterState<T> {
|
|
43
|
-
return this.props.value ?? this.filterStateStore
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
setFilterState = (filterState: FilterState<T>) => {
|
|
47
|
-
if (!this.props.value) {
|
|
48
|
-
this.filterStateStore = filterState
|
|
49
|
-
}
|
|
50
|
-
this.props.onChange && this.props.onChange(filterState)
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
get configs() {
|
|
54
|
-
return {
|
|
55
|
-
id: this.props.id ?? params.id ?? new Date().getTime().toString(),
|
|
56
|
-
placeholder: this.props.placeholder ?? params.placeholder ?? 'Filter',
|
|
57
|
-
helpNotes: params.helpNotes
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
refFilterButton: HTMLButtonElement | null = null
|
|
62
|
-
refSortButton: HTMLButtonElement | null = null
|
|
63
|
-
render() {
|
|
64
|
-
return (
|
|
65
|
-
<ClickAwayListener onClickAway={this.closePanel}>
|
|
66
|
-
<Wrapper>
|
|
67
|
-
<IconButton ref={(ref) => (this.refFilterButton = ref)} onClick={() => this.showPanel('filterButton')}>
|
|
68
|
-
<FilterListIcon />
|
|
69
|
-
</IconButton>
|
|
70
|
-
<Content>
|
|
71
|
-
<FilteredInstance fields={params.fields} filterState={this.filterState} onRemove={this.handleRemove} />
|
|
72
|
-
{this.renderTextField()}
|
|
73
|
-
</Content>
|
|
74
|
-
<ButtonClear visibled={!this.isFilterEmpty(this.filterState)} onClick={this.handleClear} />
|
|
75
|
-
{/* <IconButton ref={(ref) => (this.refSortButton = ref)} onClick={() => this.showPanel('sortButton')}>
|
|
76
|
-
<SwapVertIcon />
|
|
77
|
-
</IconButton> */}
|
|
78
|
-
<FilterHelpNotes {...this.configs.helpNotes} />
|
|
79
|
-
<FilterPanelInstance {...this.state.panelState} keyword={this.state.keyword} onSubmit={this.handleAdd} onClose={this.closePanel} />
|
|
80
|
-
</Wrapper>
|
|
81
|
-
</ClickAwayListener>
|
|
82
|
-
)
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
refInput: HTMLInputElement | null = null
|
|
86
|
-
refBeforeInput: HTMLElement | null = null
|
|
87
|
-
renderTextField = () => (
|
|
88
|
-
<Box component='label' htmlFor={this.configs.id} sx={{ flex: 1, display: 'flex', alignItems: 'flex-end' }}>
|
|
89
|
-
<Box ref={(ref: HTMLElement) => (this.refBeforeInput = ref)} sx={{ height: '100%' }} />
|
|
90
|
-
<InputBase
|
|
91
|
-
id={this.configs.id}
|
|
92
|
-
placeholder={this.configs.placeholder}
|
|
93
|
-
fullWidth
|
|
94
|
-
autoComplete='off'
|
|
95
|
-
inputRef={(ref: HTMLInputElement) => (this.refInput = ref)}
|
|
96
|
-
onChange={(event) => this.setState({ keyword: event.target.value })}
|
|
97
|
-
value={this.state.keyword}
|
|
98
|
-
onFocus={() => this.showPanel('searchInput')}
|
|
99
|
-
onKeyDown={this.handleKeyDown}
|
|
100
|
-
/>
|
|
101
|
-
</Box>
|
|
102
|
-
)
|
|
103
|
-
|
|
104
|
-
handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => {
|
|
105
|
-
const keyCode: number = event.keyCode
|
|
106
|
-
if (keyCode === 13) {
|
|
107
|
-
if (!this.state.keyword) return
|
|
108
|
-
const temp = this.patchFilterWithKey(this.filterState, 'Search', { value: this.state.keyword })
|
|
109
|
-
temp.filterState.details = 'add'
|
|
110
|
-
if (!!temp.isChanged) {
|
|
111
|
-
this.refInput?.blur()
|
|
112
|
-
this.setFilterState(temp.filterState)
|
|
113
|
-
this.setState(this.defaultState)
|
|
114
|
-
}
|
|
115
|
-
} else if (keyCode === 27) {
|
|
116
|
-
this.refInput?.blur()
|
|
117
|
-
this.setState(this.defaultState)
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
handleAdd = (key: keyof FilterModel<T>, value: FilterItemModel) => {
|
|
122
|
-
const temp = this.patchFilterWithKey(this.filterState, key, value)
|
|
123
|
-
temp.filterState.details = 'add'
|
|
124
|
-
if (!!temp.isChanged) {
|
|
125
|
-
this.refInput?.blur()
|
|
126
|
-
this.setFilterState(temp.filterState)
|
|
127
|
-
this.setState(this.defaultState)
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
handleRemove = (key: keyof FilterModel<T>) => {
|
|
132
|
-
const temp = this.deleteFilterWithKey(this.filterState, key)
|
|
133
|
-
temp.filterState.details = 'remove'
|
|
134
|
-
if (!!temp.isChanged) {
|
|
135
|
-
this.refInput?.blur()
|
|
136
|
-
this.setFilterState(temp.filterState)
|
|
137
|
-
this.forceUpdate()
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
handleClear = () => {
|
|
142
|
-
this.setFilterState({ filter: {}, details: 'remove' })
|
|
143
|
-
this.setState(this.defaultState)
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
showPanel = (reason: FilterReason) => {
|
|
147
|
-
let anchorEl = null
|
|
148
|
-
switch (reason) {
|
|
149
|
-
case 'searchInput':
|
|
150
|
-
anchorEl = this.refBeforeInput
|
|
151
|
-
break
|
|
152
|
-
case 'filterButton':
|
|
153
|
-
anchorEl = this.refFilterButton
|
|
154
|
-
break
|
|
155
|
-
case 'sortButton':
|
|
156
|
-
anchorEl = this.refSortButton
|
|
157
|
-
break
|
|
158
|
-
default:
|
|
159
|
-
break
|
|
160
|
-
}
|
|
161
|
-
this.setState({ panelState: { anchorEl, reason } })
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
closePanel = () => this.setState({ panelState: { anchorEl: null } })
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
return FilterBar
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
export default CreateFilterBar
|
|
171
|
-
|
|
172
|
-
const Wrapper = styled(Box)({
|
|
173
|
-
display: 'flex',
|
|
174
|
-
gap: '8px',
|
|
175
|
-
width: '100%',
|
|
176
|
-
borderRadius: '6px',
|
|
177
|
-
transition: 'all linear 0.2s',
|
|
178
|
-
padding: '2px',
|
|
179
|
-
backgroundColor: '#fafafa',
|
|
180
|
-
'&:hover': { backgroundColor: '#ededed' }
|
|
181
|
-
})
|
|
182
|
-
|
|
183
|
-
const Content = styled(Box)({
|
|
184
|
-
flex: 1,
|
|
185
|
-
minHeight: '40px',
|
|
186
|
-
display: 'flex',
|
|
187
|
-
flexWrap: 'wrap',
|
|
188
|
-
alignItems: 'center',
|
|
189
|
-
gap: '6px'
|
|
190
|
-
})
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import React, { Fragment } from 'react'
|
|
2
|
-
import { Box, Button, ButtonProps, Divider } from '@mui/material'
|
|
3
|
-
import { FormControlLabel, MenuItem, MenuList, Radio, RadioGroup, styled, TextField, Typography } from '@mui/material'
|
|
4
|
-
import FilterBarBase, { filterPanelClasses } from './base'
|
|
5
|
-
import { FilterModel, FilterPanelParams, FilterPannelSubmitFunc } from './types'
|
|
6
|
-
import { convertFormDataToJson } from '../../form'
|
|
7
|
-
|
|
8
|
-
interface IProps<T> {
|
|
9
|
-
onSubmit?: FilterPannelSubmitFunc<T>
|
|
10
|
-
onCancel?: ButtonProps['onClick']
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
interface IState<T> {
|
|
14
|
-
fieldSelected: keyof FilterModel<T> | null
|
|
15
|
-
messageError?: string
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
function CreateFilterMenu<T>(params: FilterPanelParams<T>) {
|
|
19
|
-
class FilterMenu extends FilterBarBase<IProps<T>, IState<T>, T> {
|
|
20
|
-
constructor(props: IProps<T>) {
|
|
21
|
-
super(props)
|
|
22
|
-
this.state = { fieldSelected: null }
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
render() {
|
|
26
|
-
const { fieldSelected } = this.state
|
|
27
|
-
if (!!fieldSelected) return this.renderFrom(fieldSelected)
|
|
28
|
-
const keys = Object.keys(params.fields).filter((x) => !!x) as (keyof FilterModel<T>)[]
|
|
29
|
-
return (
|
|
30
|
-
<MenuList className={filterPanelClasses.list} sx={{ minWidth: '200px' }}>
|
|
31
|
-
{keys.map((x, i) => {
|
|
32
|
-
const item = params.fields[x]
|
|
33
|
-
if (!item) return <Fragment key={x.toString() + i} />
|
|
34
|
-
return (
|
|
35
|
-
<MenuItem
|
|
36
|
-
key={x.toString() + i}
|
|
37
|
-
className={filterPanelClasses.item}
|
|
38
|
-
onClick={() => this.setState({ fieldSelected: x, messageError: undefined })}
|
|
39
|
-
>
|
|
40
|
-
{item?.label ?? x.toString()}
|
|
41
|
-
</MenuItem>
|
|
42
|
-
)
|
|
43
|
-
})}
|
|
44
|
-
</MenuList>
|
|
45
|
-
)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
renderFrom = (fieldSelected: keyof FilterModel<T>) => {
|
|
49
|
-
const fieldConfig = params.fields[fieldSelected]
|
|
50
|
-
const label = fieldConfig?.label ?? fieldSelected.toString()
|
|
51
|
-
return (
|
|
52
|
-
<form onSubmit={(e) => this.handleSubmit(fieldSelected, e)}>
|
|
53
|
-
<WrapPanelFilterMode>
|
|
54
|
-
<Box className='top-bar'>
|
|
55
|
-
<Typography variant='subtitle2'>{label}</Typography>
|
|
56
|
-
</Box>
|
|
57
|
-
<Box className='content'>{this.renderWithMode(fieldSelected)}</Box>
|
|
58
|
-
{fieldConfig?.type === 'select' && <Divider variant='middle' />}
|
|
59
|
-
<Box className='actions'>
|
|
60
|
-
<Button size='small' color='inherit' onClick={this.props.onCancel}>
|
|
61
|
-
Cancel
|
|
62
|
-
</Button>
|
|
63
|
-
<Button size='small' color='primary' type='submit' sx={{ fontWeight: 700 }}>
|
|
64
|
-
Apply
|
|
65
|
-
</Button>
|
|
66
|
-
</Box>
|
|
67
|
-
</WrapPanelFilterMode>
|
|
68
|
-
</form>
|
|
69
|
-
)
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
renderWithMode = (fieldSelected: keyof FilterModel<T>) => {
|
|
73
|
-
const fieldConfig = params.fields[fieldSelected]
|
|
74
|
-
const { messageError } = this.state
|
|
75
|
-
switch (fieldConfig?.type) {
|
|
76
|
-
case 'select':
|
|
77
|
-
return (
|
|
78
|
-
<CustomRadioGroup
|
|
79
|
-
name={fieldSelected.toString()}
|
|
80
|
-
className={messageError ? 'error' : ''}
|
|
81
|
-
onChange={() => this.setState({ messageError: undefined })}
|
|
82
|
-
>
|
|
83
|
-
{fieldConfig.options.map((x, i) => (
|
|
84
|
-
<FormControlLabel key={x.value.toString() + i} value={x.value} control={<Radio />} label={x.label ?? x.value} />
|
|
85
|
-
))}
|
|
86
|
-
</CustomRadioGroup>
|
|
87
|
-
)
|
|
88
|
-
case 'string':
|
|
89
|
-
default:
|
|
90
|
-
return <TextField autoFocus name={fieldSelected.toString()} size='small' error={!!messageError} helperText={messageError} />
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
handleSubmit = (fieldSelected: keyof FilterModel<T>, event: React.FormEvent<HTMLFormElement>) => {
|
|
95
|
-
event.preventDefault()
|
|
96
|
-
event.stopPropagation()
|
|
97
|
-
const formData = new FormData(event.currentTarget as HTMLFormElement)
|
|
98
|
-
const obj = convertFormDataToJson<T>(formData)
|
|
99
|
-
const value = obj[fieldSelected as keyof T]?.toString()
|
|
100
|
-
|
|
101
|
-
const fieldConfig = params.fields[fieldSelected]
|
|
102
|
-
const validate = this.validated(value ?? '', fieldSelected, fieldConfig)
|
|
103
|
-
if (validate.error) {
|
|
104
|
-
this.setState({ messageError: validate.message })
|
|
105
|
-
return
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
let label: string | undefined = undefined
|
|
109
|
-
if (fieldConfig?.type === 'select') {
|
|
110
|
-
label = fieldConfig.options.find((x) => x.value === value)?.label
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
this.props.onSubmit && this.props.onSubmit(fieldSelected, label ? { value, label } : { value })
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
return FilterMenu
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
export default CreateFilterMenu
|
|
121
|
-
|
|
122
|
-
const WrapPanelFilterMode = styled(Box)({
|
|
123
|
-
minWidth: '200px',
|
|
124
|
-
borderRadius: '4px',
|
|
125
|
-
overflow: 'hidden',
|
|
126
|
-
'.top-bar': {
|
|
127
|
-
background: '#000',
|
|
128
|
-
padding: '8px',
|
|
129
|
-
'.MuiTypography-root': {
|
|
130
|
-
color: '#fff'
|
|
131
|
-
}
|
|
132
|
-
},
|
|
133
|
-
'.content': {
|
|
134
|
-
padding: '8px'
|
|
135
|
-
},
|
|
136
|
-
'.actions': {
|
|
137
|
-
display: 'flex',
|
|
138
|
-
alignItems: 'center',
|
|
139
|
-
justifyContent: 'flex-end',
|
|
140
|
-
padding: '8px'
|
|
141
|
-
}
|
|
142
|
-
})
|
|
143
|
-
|
|
144
|
-
const CustomRadioGroup = styled(RadioGroup)({
|
|
145
|
-
marginLeft: '-8px',
|
|
146
|
-
marginRight: '-8px',
|
|
147
|
-
'&.error .MuiRadio-root': {
|
|
148
|
-
color: '#d32f2f'
|
|
149
|
-
},
|
|
150
|
-
'.MuiFormControlLabel-root': {
|
|
151
|
-
margin: 0
|
|
152
|
-
},
|
|
153
|
-
'.MuiFormControlLabel-root:hover': {
|
|
154
|
-
backgroundColor: 'rgba(25, 118, 210, 0.04)'
|
|
155
|
-
}
|
|
156
|
-
})
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import React, { PropsWithChildren } from 'react'
|
|
2
|
-
import { Popper, Fade, Box, styled, MenuList, MenuItem, Typography } from '@mui/material'
|
|
3
|
-
import { FilterModel, FilterReason, FilterPanelParams, FilterPannelSubmitFunc } from './types'
|
|
4
|
-
import FilterBarBase, { filterPanelClasses } from './base'
|
|
5
|
-
import CreateFilterMenu from './create.filter-menu'
|
|
6
|
-
import { FilterHelpNotes } from './ui.units'
|
|
7
|
-
import CreateFilterSort from './create.sort-menu'
|
|
8
|
-
|
|
9
|
-
export interface FilterPanelState {
|
|
10
|
-
anchorEl: HTMLElement | null
|
|
11
|
-
reason?: FilterReason
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
interface IProps<T> extends FilterPanelState, PropsWithChildren {
|
|
15
|
-
keyword?: string
|
|
16
|
-
onSubmit?: FilterPannelSubmitFunc<T>
|
|
17
|
-
onClose?: () => void
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
function CreateFilterPanel<T>(params: FilterPanelParams<T>) {
|
|
21
|
-
const FilterMenuInstance = CreateFilterMenu<T>(params)
|
|
22
|
-
const SortMenuInstance = CreateFilterSort<T>(params)
|
|
23
|
-
|
|
24
|
-
class FilterPanel extends FilterBarBase<IProps<T>, {}, T> {
|
|
25
|
-
render() {
|
|
26
|
-
const isOpen = Boolean(this.props.anchorEl) && (!!this.props.keyword || this.props.reason !== 'searchInput')
|
|
27
|
-
return (
|
|
28
|
-
<Popper anchorEl={this.props.anchorEl} open={isOpen} placement='bottom-start' transition sx={{ zIndex: 1350 }}>
|
|
29
|
-
{({ TransitionProps }) => (
|
|
30
|
-
<Fade {...TransitionProps} timeout={0}>
|
|
31
|
-
<Wrapper className={filterPanelClasses.root}>{this.renderContent()}</Wrapper>
|
|
32
|
-
</Fade>
|
|
33
|
-
)}
|
|
34
|
-
</Popper>
|
|
35
|
-
)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
renderContent = () => {
|
|
39
|
-
switch (this.props.reason) {
|
|
40
|
-
case 'searchInput':
|
|
41
|
-
return this.renderSearchInput()
|
|
42
|
-
case 'filterButton':
|
|
43
|
-
return (
|
|
44
|
-
<FilterMenuInstance
|
|
45
|
-
onCancel={this.props.onClose}
|
|
46
|
-
onSubmit={(f, v) => {
|
|
47
|
-
this.props.onSubmit && this.props.onSubmit(f, v)
|
|
48
|
-
this.props.onClose && this.props.onClose()
|
|
49
|
-
}}
|
|
50
|
-
/>
|
|
51
|
-
)
|
|
52
|
-
case 'sortButton':
|
|
53
|
-
return <SortMenuInstance />
|
|
54
|
-
default:
|
|
55
|
-
break
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
renderSearchInput = () => {
|
|
60
|
-
if (this.props.reason !== 'searchInput') return <></>
|
|
61
|
-
const fields = this.getFieldsMatches(params.fields, this.props.keyword ?? '')
|
|
62
|
-
const keys = Object.keys(fields).filter((x) => !!x) as (keyof FilterModel<T>)[]
|
|
63
|
-
return (
|
|
64
|
-
<MenuList className={filterPanelClasses.list}>
|
|
65
|
-
{keys.map((x, i) => {
|
|
66
|
-
const item = params.fields[x]
|
|
67
|
-
return (
|
|
68
|
-
<MenuItem key={x.toString() + i} className={filterPanelClasses.item} onClick={() => this.handleClick(x)}>
|
|
69
|
-
{item?.label ?? x.toString()} "{this.props.keyword}"
|
|
70
|
-
</MenuItem>
|
|
71
|
-
)
|
|
72
|
-
})}
|
|
73
|
-
{this.props.keyword && (
|
|
74
|
-
<MenuItem className={filterPanelClasses.item} onClick={() => this.handleClick('Search')}>
|
|
75
|
-
Search "{this.props.keyword}"{/* <FilterHelpNotes title='The quick search includes' items={[]} /> */}
|
|
76
|
-
</MenuItem>
|
|
77
|
-
)}
|
|
78
|
-
</MenuList>
|
|
79
|
-
)
|
|
80
|
-
}
|
|
81
|
-
handleClick = (key: keyof FilterModel<T>) => {
|
|
82
|
-
if (!this.props.onSubmit) return
|
|
83
|
-
this.props.onSubmit(key, { value: this.props.keyword })
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
return FilterPanel
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export default CreateFilterPanel
|
|
90
|
-
|
|
91
|
-
const Wrapper = styled(Box)({
|
|
92
|
-
borderRadius: '4px',
|
|
93
|
-
boxShadow: 'rgba(0, 0, 0, 0.06) 0px 5px 22px, rgba(0, 0, 0, 0.04) 0px 0px 0px 0.5px',
|
|
94
|
-
backgroundColor: '#fff'
|
|
95
|
-
})
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import React, { Component } from 'react'
|
|
2
|
-
import { Chip, Typography } from '@mui/material'
|
|
3
|
-
import { FilterFields, FilterModel, FilterState } from './types'
|
|
4
|
-
|
|
5
|
-
interface IProps<T> {
|
|
6
|
-
fields: FilterFields<T>
|
|
7
|
-
filterState: FilterState<T>
|
|
8
|
-
onRemove?: (key: keyof FilterModel<T>) => void
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
function CreateFiltered<T>() {
|
|
12
|
-
class Filtered extends Component<IProps<T>> {
|
|
13
|
-
render() {
|
|
14
|
-
const keys = Object.keys(this.props.filterState.filter ?? {}) as (keyof FilterModel<T>)[]
|
|
15
|
-
return keys.map((key, i) => {
|
|
16
|
-
const item = this.props.filterState.filter?.[key]
|
|
17
|
-
const config = this.props.fields[key]
|
|
18
|
-
return (
|
|
19
|
-
<Chip
|
|
20
|
-
key={`${key?.toString()}${i}`}
|
|
21
|
-
onDelete={() => this.handleRemove(key)}
|
|
22
|
-
size='small'
|
|
23
|
-
label={
|
|
24
|
-
<Typography component='span' variant='caption'>
|
|
25
|
-
{config?.label ?? key?.toString() ?? 'Search'} {item?.map((x) => `"${x.label ?? x.value}"`).join(' ')}
|
|
26
|
-
</Typography>
|
|
27
|
-
}
|
|
28
|
-
/>
|
|
29
|
-
)
|
|
30
|
-
})
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
handleRemove = (key: keyof FilterModel<T>) => {
|
|
34
|
-
if (!this.props.onRemove) return
|
|
35
|
-
this.props.onRemove(key)
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return Filtered
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export default CreateFiltered
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { List, ListItem, ListItemButton, ListItemText } from '@mui/material'
|
|
2
|
-
import FilterBarBase from './base'
|
|
3
|
-
import { FilterFields, FilterPanelParams, FilterPannelSubmitFunc } from './types'
|
|
4
|
-
|
|
5
|
-
interface IProps<T> {
|
|
6
|
-
onSubmit?: FilterPannelSubmitFunc<T>
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
interface IState<T> {}
|
|
10
|
-
|
|
11
|
-
function CreateFilterSort<T>(params: FilterPanelParams<T>): React.ComponentType<IProps<T>> {
|
|
12
|
-
class FilterSort extends FilterBarBase<IProps<T>, IState<T>, T> {
|
|
13
|
-
render() {
|
|
14
|
-
// const sortFields = this.getSortFields(params.fields)
|
|
15
|
-
// const keys = Object.keys(sortFields) as (keyof FilterFields<T>)[]
|
|
16
|
-
return (
|
|
17
|
-
<List disablePadding>
|
|
18
|
-
<ListItem>
|
|
19
|
-
<ListItemButton>
|
|
20
|
-
<ListItemText>Item 1</ListItemText>
|
|
21
|
-
</ListItemButton>
|
|
22
|
-
</ListItem>
|
|
23
|
-
<ListItem>
|
|
24
|
-
<ListItemButton>Item 2</ListItemButton>
|
|
25
|
-
</ListItem>
|
|
26
|
-
<ListItem>
|
|
27
|
-
<ListItemButton>Item 3</ListItemButton>
|
|
28
|
-
</ListItem>
|
|
29
|
-
<ListItem>
|
|
30
|
-
<ListItemButton>Item 4</ListItemButton>
|
|
31
|
-
</ListItem>
|
|
32
|
-
<ListItem>
|
|
33
|
-
<ListItemButton>Item 5</ListItemButton>
|
|
34
|
-
</ListItem>
|
|
35
|
-
</List>
|
|
36
|
-
)
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return FilterSort
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export default CreateFilterSort
|