@hkyhy/marsun-components-core 0.1.15 → 0.1.18
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/components/Filter/CommonFilter/index.js +34 -30
- package/dist/components/Filter/CommonFilter/index.js.map +1 -1
- package/dist/components/Filter/CommonFilter/style.module.scss.js +17 -16
- package/dist/components/Filter/CommonFilter/style.module.scss.js.map +1 -1
- package/dist/components/Filter/FilterSelect/index.d.ts +2 -0
- package/dist/components/Filter/FilterSelect/index.js +140 -118
- package/dist/components/Filter/FilterSelect/index.js.map +1 -1
- package/dist/components/Filter/FilterSelect/style.module.scss.js +12 -10
- package/dist/components/Filter/FilterSelect/style.module.scss.js.map +1 -1
- package/dist/components/Filter/types.d.ts +2 -0
- package/dist/components/Filter/types.js.map +1 -1
- package/dist/components/Filter/useFilterState.d.ts +2 -0
- package/dist/components/Filter/useFilterState.js +27 -26
- package/dist/components/Filter/useFilterState.js.map +1 -1
- package/dist/components/Layout/ModulePageShell/index.d.ts +17 -0
- package/dist/components/Layout/ModulePageShell/index.js +42 -0
- package/dist/components/Layout/ModulePageShell/index.js.map +1 -0
- package/dist/components/Layout/ModulePageShell/style.module.scss.js +10 -0
- package/dist/components/Layout/ModulePageShell/style.module.scss.js.map +1 -0
- package/dist/components/Layout/PageHeaderLayout/index.d.ts +3 -1
- package/dist/components/Layout/PageHeaderLayout/index.js +43 -34
- package/dist/components/Layout/PageHeaderLayout/index.js.map +1 -1
- package/dist/components/Layout/PageHeaderLayout/style.module.scss.js +5 -4
- package/dist/components/Layout/PageHeaderLayout/style.module.scss.js.map +1 -1
- package/dist/components/Layout/PageShell/PageShellContext.d.ts +20 -0
- package/dist/components/Layout/PageShell/PageShellContext.js +39 -0
- package/dist/components/Layout/PageShell/PageShellContext.js.map +1 -0
- package/dist/components/Layout/PageShell/index.d.ts +2 -0
- package/dist/components/Layout/PageSpin/index.d.ts +9 -0
- package/dist/components/Layout/PageSpin/index.js +9 -0
- package/dist/components/Layout/PageSpin/index.js.map +1 -0
- package/dist/components/Layout/PageSpin/style.module.scss.js +7 -0
- package/dist/components/Layout/PageSpin/style.module.scss.js.map +1 -0
- package/dist/components/Layout/index.d.ts +6 -0
- package/dist/index.js +152 -144
- package/dist/index.js.map +1 -1
- package/dist/marsun-components-core.css +1 -1
- package/dist/styles/global.css +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/Filter/FilterSelect/index.tsx"],"sourcesContent":["import { Check, X } from '@/components/Icons';\nimport { Checkbox, Input, Space } from 'antd';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport PersonOptionRow from '../../Form/PersonOptionRow';\nimport FilterPopover from '../FilterPopover';\nimport type { BaseFilterProps, FilterOption, PersonOption } from '../types';\nimport { resolveFilterVisible } from '../types';\nimport { useFilterRegister } from '../useFilterState';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\nconst { Search } = Input;\n\nfunction formatPersonValueLabel(opt: PersonOption): string {\n const parts = [opt.label];\n if (opt.departmentName) parts.push(opt.departmentName);\n return parts.join(' · ');\n}\n\nfunction matchPersonOptionSearch(opt: PersonOption, keyword: string): boolean {\n const lower = keyword.toLowerCase();\n return [opt.label, opt.departmentName, opt.email, opt.phone, opt.employeeId]\n .filter(Boolean)\n .some((s) => String(s).toLowerCase().includes(lower));\n}\n\ntype FilterSelectValue = string | number | (string | number)[] | undefined;\n\nexport type { FilterSelectValue };\n\nfunction arraysEqual(\n a?: (string | number)[],\n b?: (string | number)[],\n): boolean {\n if (!a?.length && !b?.length) return true;\n if (!a || !b || a.length !== b.length) return false;\n const sortedA = [...a].map(String).sort();\n const sortedB = [...b].map(String).sort();\n return sortedA.every((v, i) => v === sortedB[i]);\n}\n\ninterface FilterSelectProps extends BaseFilterProps {\n options: FilterOption[];\n value?: FilterSelectValue;\n onChange?: (value: FilterSelectValue) => void;\n /** 默认值:与默认值相同时视为未筛选(不展示已选标签与选中态) */\n defaultValue?: string | number;\n /** 多选默认值:与默认集合相同时视为未筛选 */\n defaultValues?: (string | number)[];\n placeholder?: string;\n searchable?: boolean;\n /** 是否多选 */\n multiple?: boolean;\n /** 人员选项:展示部门与联系方式 */\n variant?: 'default' | 'person';\n}\n\nfunction toDisplayValue(\n value: FilterSelectValue,\n defaultValue: string | number | undefined,\n defaultValues: (string | number)[] | undefined,\n multiple: boolean,\n): string | number | (string | number)[] | undefined {\n if (multiple) {\n const arr = Array.isArray(value) ? value : value != null && value !== '' ? [value] : [];\n if (defaultValues?.length && arraysEqual(arr, defaultValues)) {\n return [];\n }\n return arr;\n }\n if (defaultValue !== undefined && value === defaultValue) return undefined;\n return value;\n}\n\nfunction formatValueLabel(\n displayVal: string | number | (string | number)[] | undefined,\n options: FilterOption[],\n multiple: boolean,\n isPersonVariant: boolean,\n): string {\n if (multiple) {\n const arr = (displayVal as (string | number)[]) || [];\n return arr.length > 0\n ? arr.map((v) => options.find((o) => o.value === v)?.label ?? String(v)).join('、')\n : '';\n }\n if (displayVal == null) return '';\n const opt = options.find((o) => o.value === displayVal);\n if (!opt) return String(displayVal);\n return isPersonVariant ? formatPersonValueLabel(opt as PersonOption) : opt.label;\n}\n\nconst FilterSelect: React.FC<FilterSelectProps> = ({\n filterKey,\n label,\n options = [],\n value,\n onChange,\n defaultValue,\n defaultValues,\n searchable = false,\n multiple = false,\n variant = 'default',\n active,\n hidden,\n display,\n}) => {\n const isPersonVariant = variant === 'person';\n const [open, setOpen] = useState(false);\n const [searchText, setSearchText] = useState('');\n const displayValue = toDisplayValue(value, defaultValue, defaultValues, multiple);\n const [localValue, setLocalValue] = useState<string | number | (string | number)[] | undefined>(\n displayValue ?? (multiple ? [] : undefined),\n );\n\n // ── 自动注册到 CommonFilter ──\n const registerFn = useFilterRegister();\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const handleRemove = useMemo(\n () => () => {\n onChangeRef.current?.(undefined);\n },\n [],\n );\n\n const revertToCommitted = () => {\n const next = displayValue ?? (multiple ? [] : undefined);\n setLocalValue(next);\n setSearchText('');\n };\n\n // 同步外部 value 到内部 localValue\n useEffect(() => {\n const nextDisplayValue = toDisplayValue(value, defaultValue, defaultValues, multiple);\n setLocalValue(nextDisplayValue ?? (multiple ? [] : undefined));\n if (\n nextDisplayValue === undefined ||\n nextDisplayValue === null ||\n (Array.isArray(nextDisplayValue) && nextDisplayValue.length === 0)\n ) {\n setSearchText('');\n }\n }, [value, defaultValue, defaultValues, multiple]);\n\n const committedValueLabel = useMemo(\n () => formatValueLabel(displayValue, options, multiple, isPersonVariant),\n [options, displayValue, multiple, isPersonVariant],\n );\n\n useEffect(() => {\n if (!registerFn) return;\n const ctx = { filterKey, label, value };\n if (!resolveFilterVisible({ display, hidden }, ctx)) {\n registerFn.unregister(filterKey);\n return;\n }\n if (committedValueLabel) {\n registerFn.register(filterKey, {\n label,\n valueLabel: committedValueLabel,\n onRemove: handleRemove,\n });\n } else {\n registerFn.unregister(filterKey);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [committedValueLabel, filterKey, label, hidden, display, handleRemove]);\n\n const visibilityCtx = { filterKey, label, value };\n if (!resolveFilterVisible({ display, hidden }, visibilityCtx)) return null;\n\n const filteredOptions = searchText\n ? options.filter((opt) =>\n isPersonVariant\n ? matchPersonOptionSearch(opt as PersonOption, searchText)\n : opt.label.toLowerCase().includes(searchText.toLowerCase()),\n )\n : options;\n\n const handleConfirm = () => {\n onChange?.(localValue as FilterSelectValue);\n setOpen(false);\n };\n\n const handleDiscardDraft = () => {\n revertToCommitted();\n setOpen(false);\n };\n\n const handleOpenChange = (nextOpen: boolean) => {\n if (!nextOpen && multiple) {\n revertToCommitted();\n }\n setOpen(nextOpen);\n };\n\n const handleClickOption = (optVal: string | number) => {\n if (!multiple) {\n const isDefaultOption = defaultValue !== undefined && optVal === defaultValue;\n let next: string | number | undefined;\n if (localValue === optVal || isDefaultOption) {\n next = undefined;\n } else {\n next = optVal;\n }\n setLocalValue(next);\n onChange?.(next);\n setOpen(false);\n }\n };\n\n const handleToggleMulti = (optVal: string | number) => {\n const arr = (localValue as (string | number)[]) || [];\n const next = arr.includes(optVal) ? arr.filter((v) => v !== optVal) : [...arr, optVal];\n setLocalValue(next);\n };\n\n const isActive = multiple\n ? Array.isArray(displayValue) && displayValue.length > 0\n : displayValue != null && displayValue !== '';\n\n return (\n <FilterPopover\n label={label}\n active={active || isActive}\n open={open}\n onOpenChange={handleOpenChange}\n onConfirm={multiple ? handleConfirm : undefined}\n onReset={multiple ? handleDiscardDraft : undefined}\n >\n {searchable && (\n <Search\n placeholder={`搜索${label}`}\n allowClear\n size=\"middle\"\n className={classNames('filter-select-search', styles['filter-select-search'])}\n value={searchText}\n onChange={(e) => setSearchText(e.target.value)}\n />\n )}\n\n <div className={classNames('filter-select-options', styles['filter-select-options'])}>\n {filteredOptions.map((opt) => (\n <div\n key={String(opt.value)}\n className={classNames('filter-select-option', styles['filter-select-option'],\n !multiple &&\n localValue === opt.value &&\n classNames('filter-select-option-selected', styles['filter-select-option-selected']),\n )}\n onClick={() =>\n multiple ? handleToggleMulti(opt.value) : handleClickOption(opt.value)\n }\n >\n {multiple && (\n <Checkbox\n checked={(localValue as (string | number)[])?.includes(opt.value)}\n onChange={() => handleToggleMulti(opt.value)}\n onClick={(e) => e.stopPropagation()}\n />\n )}\n {isPersonVariant ? (\n <PersonOptionRow option={opt as PersonOption} />\n ) : (\n <span>{opt.label}</span>\n )}\n {!multiple && !isPersonVariant && localValue === opt.value && (\n <Check className={classNames('filter-select-option-check', styles['filter-select-option-check'])} />\n )}\n </div>\n ))}\n {filteredOptions.length === 0 && (\n <div className={classNames('filter-select-empty', styles['filter-select-empty'])}>暂无数据</div>\n )}\n </div>\n\n {multiple && (localValue as (string | number)[])?.length > 0 && (\n <div className={classNames('filter-select-selected-bar', styles['filter-select-selected-bar'])}>\n <div className={classNames('filter-select-selected-label', styles['filter-select-selected-label'])}>已选:</div>\n <Space size={[4, 4]} wrap>\n {(localValue as (string | number)[]).map((v) => {\n const opt = options.find((o) => o.value === v);\n return (\n <span\n key={String(v)}\n className={classNames('filter-select-selected-tag', styles['filter-select-selected-tag'])}\n onClick={() => handleToggleMulti(v)}\n >\n {opt?.label ?? String(v)}\n <X className={classNames('filter-select-selected-remove', styles['filter-select-selected-remove'])} />\n </span>\n );\n })}\n </Space>\n </div>\n )}\n </FilterPopover>\n );\n};\n\nexport default FilterSelect;\nexport type { FilterSelectProps };\n"],"names":["Search","Input","formatPersonValueLabel","opt","parts","matchPersonOptionSearch","keyword","lower","s","arraysEqual","a","b","sortedA","sortedB","v","i","toDisplayValue","value","defaultValue","defaultValues","multiple","arr","formatValueLabel","displayVal","options","isPersonVariant","_a","o","FilterSelect","filterKey","label","onChange","searchable","variant","active","hidden","display","open","setOpen","useState","searchText","setSearchText","displayValue","localValue","setLocalValue","registerFn","useFilterRegister","onChangeRef","useRef","handleRemove","useMemo","revertToCommitted","useEffect","nextDisplayValue","committedValueLabel","resolveFilterVisible","filteredOptions","handleConfirm","handleDiscardDraft","handleOpenChange","nextOpen","handleClickOption","optVal","isDefaultOption","next","handleToggleMulti","isActive","jsxs","FilterPopover","jsx","classNames","styles","Checkbox","e","PersonOptionRow","Check","Space","X"],"mappings":";;;;;;;;;;AAWA,MAAM,EAAE,QAAAA,OAAWC;AAEnB,SAASC,GAAuBC,GAA2B;AACzD,QAAMC,IAAQ,CAACD,EAAI,KAAK;AACxB,SAAIA,EAAI,kBAAgBC,EAAM,KAAKD,EAAI,cAAc,GAC9CC,EAAM,KAAK,KAAK;AACzB;AAEA,SAASC,GAAwBF,GAAmBG,GAA0B;AAC5E,QAAMC,IAAQD,EAAQ,YAAA;AACtB,SAAO,CAACH,EAAI,OAAOA,EAAI,gBAAgBA,EAAI,OAAOA,EAAI,OAAOA,EAAI,UAAU,EACxE,OAAO,OAAO,EACd,KAAK,CAACK,MAAM,OAAOA,CAAC,EAAE,YAAA,EAAc,SAASD,CAAK,CAAC;AACxD;AAMA,SAASE,GACPC,GACAC,GACS;AACT,MAAI,EAACD,KAAA,QAAAA,EAAG,WAAU,EAACC,KAAA,QAAAA,EAAG,QAAQ,QAAO;AACrC,MAAI,CAACD,KAAK,CAACC,KAAKD,EAAE,WAAWC,EAAE,OAAQ,QAAO;AAC9C,QAAMC,IAAU,CAAC,GAAGF,CAAC,EAAE,IAAI,MAAM,EAAE,KAAA,GAC7BG,IAAU,CAAC,GAAGF,CAAC,EAAE,IAAI,MAAM,EAAE,KAAA;AACnC,SAAOC,EAAQ,MAAM,CAACE,GAAGC,MAAMD,MAAMD,EAAQE,CAAC,CAAC;AACjD;AAkBA,SAASC,EACPC,GACAC,GACAC,GACAC,GACmD;AACnD,MAAIA,GAAU;AACZ,UAAMC,IAAM,MAAM,QAAQJ,CAAK,IAAIA,IAAQA,KAAS,QAAQA,MAAU,KAAK,CAACA,CAAK,IAAI,CAAA;AACrF,WAAIE,KAAA,QAAAA,EAAe,UAAUV,GAAYY,GAAKF,CAAa,IAClD,CAAA,IAEFE;AAAA,EACT;AACA,MAAI,EAAAH,MAAiB,UAAaD,MAAUC;AAC5C,WAAOD;AACT;AAEA,SAASK,GACPC,GACAC,GACAJ,GACAK,GACQ;AACR,MAAIL,GAAU;AACZ,UAAMC,IAAOE,KAAsC,CAAA;AACnD,WAAOF,EAAI,SAAS,IAChBA,EAAI,IAAI,CAACP,MAAA;;AAAM,eAAAY,IAAAF,EAAQ,KAAK,CAACG,MAAMA,EAAE,UAAUb,CAAC,MAAjC,gBAAAY,EAAoC,UAAS,OAAOZ,CAAC;AAAA,KAAC,EAAE,KAAK,GAAG,IAC/E;AAAA,EACN;AACA,MAAIS,KAAc,KAAM,QAAO;AAC/B,QAAMpB,IAAMqB,EAAQ,KAAK,CAAC,MAAM,EAAE,UAAUD,CAAU;AACtD,SAAKpB,IACEsB,IAAkBvB,GAAuBC,CAAmB,IAAIA,EAAI,QAD1D,OAAOoB,CAAU;AAEpC;AAEA,MAAMK,KAA4C,CAAC;AAAA,EACjD,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,SAAAN,IAAU,CAAA;AAAA,EACV,OAAAP;AAAA,EACA,UAAAc;AAAA,EACA,cAAAb;AAAA,EACA,eAAAC;AAAA,EACA,YAAAa,IAAa;AAAA,EACb,UAAAZ,IAAW;AAAA,EACX,SAAAa,IAAU;AAAA,EACV,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC;AACF,MAAM;AACJ,QAAMX,IAAkBQ,MAAY,UAC9B,CAACI,GAAMC,CAAO,IAAIC,EAAS,EAAK,GAChC,CAACC,GAAYC,CAAa,IAAIF,EAAS,EAAE,GACzCG,IAAe1B,EAAeC,GAAOC,GAAcC,GAAeC,CAAQ,GAC1E,CAACuB,GAAYC,CAAa,IAAIL;AAAA,IAClCG,MAAiBtB,IAAW,CAAA,IAAK;AAAA,EAAA,GAI7ByB,IAAaC,GAAA,GACbC,IAAcC,EAAOjB,CAAQ;AACnC,EAAAgB,EAAY,UAAUhB;AAEtB,QAAMkB,IAAeC;AAAA,IACnB,MAAM,MAAM;;AACV,OAAAxB,IAAAqB,EAAY,YAAZ,QAAArB,EAAA,KAAAqB,GAAsB;AAAA,IACxB;AAAA,IACA,CAAA;AAAA,EAAC,GAGGI,IAAoB,MAAM;AAE9B,IAAAP,EADaF,MAAiBtB,IAAW,CAAA,IAAK,OAC5B,GAClBqB,EAAc,EAAE;AAAA,EAClB;AAGA,EAAAW,EAAU,MAAM;AACd,UAAMC,IAAmBrC,EAAeC,GAAOC,GAAcC,GAAeC,CAAQ;AACpF,IAAAwB,EAAcS,MAAqBjC,IAAW,CAAA,IAAK,OAAU,IAG3DiC,KAAqB,QACpB,MAAM,QAAQA,CAAgB,KAAKA,EAAiB,WAAW,MAEhEZ,EAAc,EAAE;AAAA,EAEpB,GAAG,CAACxB,GAAOC,GAAcC,GAAeC,CAAQ,CAAC;AAEjD,QAAMkC,IAAsBJ;AAAA,IAC1B,MAAM5B,GAAiBoB,GAAclB,GAASJ,GAAUK,CAAe;AAAA,IACvE,CAACD,GAASkB,GAActB,GAAUK,CAAe;AAAA,EAAA;AAuBnD,MApBA2B,EAAU,MAAM;AACd,QAAI,CAACP,EAAY;AAEjB,QAAI,CAACU,EAAqB,EAAE,SAAAnB,GAAS,QAAAD,EAAA,GADzB,EAAE,WAAAN,GAAW,OAAAC,GAAO,OAAAb,EAAA,CACkB,GAAG;AACnD,MAAA4B,EAAW,WAAWhB,CAAS;AAC/B;AAAA,IACF;AACA,IAAIyB,IACFT,EAAW,SAAShB,GAAW;AAAA,MAC7B,OAAAC;AAAA,MACA,YAAYwB;AAAA,MACZ,UAAUL;AAAA,IAAA,CACX,IAEDJ,EAAW,WAAWhB,CAAS;AAAA,EAGnC,GAAG,CAACyB,GAAqBzB,GAAWC,GAAOK,GAAQC,GAASa,CAAY,CAAC,GAGrE,CAACM,EAAqB,EAAE,SAAAnB,GAAS,QAAAD,KADf,EAAE,WAAAN,GAAW,OAAAC,GAAO,OAAAb,EAAA,CACkB,EAAG,QAAO;AAEtE,QAAMuC,IAAkBhB,IACpBhB,EAAQ;AAAA,IAAO,CAACrB,MACdsB,IACIpB,GAAwBF,GAAqBqC,CAAU,IACvDrC,EAAI,MAAM,YAAA,EAAc,SAASqC,EAAW,aAAa;AAAA,EAAA,IAE/DhB,GAEEiC,IAAgB,MAAM;AAC1B,IAAA1B,KAAA,QAAAA,EAAWY,IACXL,EAAQ,EAAK;AAAA,EACf,GAEMoB,IAAqB,MAAM;AAC/B,IAAAP,EAAA,GACAb,EAAQ,EAAK;AAAA,EACf,GAEMqB,IAAmB,CAACC,MAAsB;AAC9C,IAAI,CAACA,KAAYxC,KACf+B,EAAA,GAEFb,EAAQsB,CAAQ;AAAA,EAClB,GAEMC,IAAoB,CAACC,MAA4B;AACrD,QAAI,CAAC1C,GAAU;AACb,YAAM2C,IAAkB7C,MAAiB,UAAa4C,MAAW5C;AACjE,UAAI8C;AACJ,MAAIrB,MAAemB,KAAUC,IAC3BC,IAAO,SAEPA,IAAOF,GAETlB,EAAcoB,CAAI,GAClBjC,KAAA,QAAAA,EAAWiC,IACX1B,EAAQ,EAAK;AAAA,IACf;AAAA,EACF,GAEM2B,IAAoB,CAACH,MAA4B;AACrD,UAAMzC,IAAOsB,KAAsC,CAAA,GAC7CqB,IAAO3C,EAAI,SAASyC,CAAM,IAAIzC,EAAI,OAAO,CAACP,MAAMA,MAAMgD,CAAM,IAAI,CAAC,GAAGzC,GAAKyC,CAAM;AACrF,IAAAlB,EAAcoB,CAAI;AAAA,EACpB,GAEME,IAAW9C,IACb,MAAM,QAAQsB,CAAY,KAAKA,EAAa,SAAS,IACrDA,KAAgB,QAAQA,MAAiB;AAE7C,SACE,gBAAAyB;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,OAAAtC;AAAA,MACA,QAAQI,KAAUgC;AAAA,MAClB,MAAA7B;AAAA,MACA,cAAcsB;AAAA,MACd,WAAWvC,IAAWqC,IAAgB;AAAA,MACtC,SAASrC,IAAWsC,IAAqB;AAAA,MAExC,UAAA;AAAA,QAAA1B,KACC,gBAAAqC;AAAA,UAACrE;AAAA,UAAA;AAAA,YACC,aAAa,KAAK8B,CAAK;AAAA,YACvB,YAAU;AAAA,YACV,MAAK;AAAA,YACL,WAAWwC,EAAW,wBAAwBC,EAAO,sBAAsB,CAAC;AAAA,YAC5E,OAAO/B;AAAA,YACP,UAAU,CAAC,MAAMC,EAAc,EAAE,OAAO,KAAK;AAAA,UAAA;AAAA,QAAA;AAAA,QAIjD,gBAAA0B,EAAC,SAAI,WAAWG,EAAW,yBAAyBC,EAAO,uBAAuB,CAAC,GAChF,UAAA;AAAA,UAAAf,EAAgB,IAAI,CAACrD,MACpB,gBAAAgE;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,WAAWG;AAAA,gBAAW;AAAA,gBAAwBC,EAAO,sBAAsB;AAAA,gBACzE,CAACnD,KACCuB,MAAexC,EAAI,SACnBmE,EAAW,iCAAiCC,EAAO,+BAA+B,CAAC;AAAA,cAAA;AAAA,cAEvF,SAAS,MACPnD,IAAW6C,EAAkB9D,EAAI,KAAK,IAAI0D,EAAkB1D,EAAI,KAAK;AAAA,cAGtE,UAAA;AAAA,gBAAAiB,KACC,gBAAAiD;AAAA,kBAACG;AAAA,kBAAA;AAAA,oBACC,SAAU7B,KAAA,gBAAAA,EAAoC,SAASxC,EAAI;AAAA,oBAC3D,UAAU,MAAM8D,EAAkB9D,EAAI,KAAK;AAAA,oBAC3C,SAAS,CAACsE,MAAMA,EAAE,gBAAA;AAAA,kBAAgB;AAAA,gBAAA;AAAA,gBAGrChD,sBACEiD,GAAA,EAAgB,QAAQvE,GAAqB,IAE9C,gBAAAkE,EAAC,QAAA,EAAM,UAAAlE,EAAI,MAAA,CAAM;AAAA,gBAElB,CAACiB,KAAY,CAACK,KAAmBkB,MAAexC,EAAI,SACnD,gBAAAkE,EAACM,GAAA,EAAM,WAAWL,EAAW,8BAA8BC,EAAO,4BAA4B,CAAC,EAAA,CAAG;AAAA,cAAA;AAAA,YAAA;AAAA,YAvB/F,OAAOpE,EAAI,KAAK;AAAA,UAAA,CA0BxB;AAAA,UACAqD,EAAgB,WAAW,KAC1B,gBAAAa,EAAC,OAAA,EAAI,WAAWC,EAAW,uBAAuBC,EAAO,qBAAqB,CAAC,GAAG,UAAA,OAAA,CAAI;AAAA,QAAA,GAE1F;AAAA,QAECnD,MAAauB,KAAA,gBAAAA,EAAoC,UAAS,KACzD,gBAAAwB,EAAC,OAAA,EAAI,WAAWG,EAAW,8BAA8BC,EAAO,4BAA4B,CAAC,GAC3F,UAAA;AAAA,UAAA,gBAAAF,EAAC,OAAA,EAAI,WAAWC,EAAW,gCAAgCC,EAAO,8BAA8B,CAAC,GAAG,UAAA,MAAA,CAAG;AAAA,UACvG,gBAAAF,EAACO,GAAA,EAAM,MAAM,CAAC,GAAG,CAAC,GAAG,MAAI,IACrB,UAAAjC,EAAmC,IAAI,CAAC7B,MAAM;AAC9C,kBAAMX,IAAMqB,EAAQ,KAAK,CAACG,MAAMA,EAAE,UAAUb,CAAC;AAC7C,mBACE,gBAAAqD;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,WAAWG,EAAW,8BAA8BC,EAAO,4BAA4B,CAAC;AAAA,gBACxF,SAAS,MAAMN,EAAkBnD,CAAC;AAAA,gBAEjC,UAAA;AAAA,mBAAAX,KAAA,gBAAAA,EAAK,UAAS,OAAOW,CAAC;AAAA,kBACvB,gBAAAuD,EAACQ,KAAE,WAAWP,EAAW,iCAAiCC,EAAO,+BAA+B,CAAC,EAAA,CAAG;AAAA,gBAAA;AAAA,cAAA;AAAA,cAL/F,OAAOzD,CAAC;AAAA,YAAA;AAAA,UAQnB,CAAC,EAAA,CACH;AAAA,QAAA,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/Filter/FilterSelect/index.tsx"],"sourcesContent":["import { Check, X } from '@/components/Icons';\nimport { Checkbox, Input, Space } from 'antd';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport PersonOptionRow from '../../Form/PersonOptionRow';\nimport FilterPopover from '../FilterPopover';\nimport type { BaseFilterProps, FilterOption, PersonOption } from '../types';\nimport { resolveFilterVisible } from '../types';\nimport { useFilterRegister } from '../useFilterState';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\nconst { Search } = Input;\n\nfunction formatPersonValueLabel(opt: PersonOption): string {\n const parts = [opt.label];\n if (opt.departmentName) parts.push(opt.departmentName);\n return parts.join(' · ');\n}\n\nfunction matchPersonOptionSearch(opt: PersonOption, keyword: string): boolean {\n const lower = keyword.toLowerCase();\n return [opt.label, opt.departmentName, opt.email, opt.phone, opt.employeeId]\n .filter(Boolean)\n .some((s) => String(s).toLowerCase().includes(lower));\n}\n\ntype FilterSelectValue = string | number | (string | number)[] | undefined;\n\nexport type { FilterSelectValue };\n\nfunction arraysEqual(\n a?: (string | number)[],\n b?: (string | number)[],\n): boolean {\n if (!a?.length && !b?.length) return true;\n if (!a || !b || a.length !== b.length) return false;\n const sortedA = [...a].map(String).sort();\n const sortedB = [...b].map(String).sort();\n return sortedA.every((v, i) => v === sortedB[i]);\n}\n\ninterface FilterSelectProps extends BaseFilterProps {\n options: FilterOption[];\n value?: FilterSelectValue;\n onChange?: (value: FilterSelectValue) => void;\n /** 默认值:与默认值相同时视为未筛选(不展示已选标签与选中态) */\n defaultValue?: string | number;\n /** 多选默认值:与默认集合相同时视为未筛选 */\n defaultValues?: (string | number)[];\n placeholder?: string;\n searchable?: boolean;\n /** 是否多选 */\n multiple?: boolean;\n /** 多选至少保留项数;达到下限时不允许移除已选标签 */\n minSelection?: number;\n /** 人员选项:展示部门与联系方式 */\n variant?: 'default' | 'person';\n}\n\nfunction toDisplayValue(\n value: FilterSelectValue,\n defaultValue: string | number | undefined,\n defaultValues: (string | number)[] | undefined,\n multiple: boolean,\n): string | number | (string | number)[] | undefined {\n if (multiple) {\n const arr = Array.isArray(value) ? value : value != null && value !== '' ? [value] : [];\n if (defaultValues?.length && arraysEqual(arr, defaultValues)) {\n return [];\n }\n return arr;\n }\n if (defaultValue !== undefined && value === defaultValue) return undefined;\n return value;\n}\n\nfunction formatValueLabel(\n displayVal: string | number | (string | number)[] | undefined,\n options: FilterOption[],\n multiple: boolean,\n isPersonVariant: boolean,\n): string {\n if (multiple) {\n const arr = (displayVal as (string | number)[]) || [];\n return arr.length > 0\n ? arr.map((v) => options.find((o) => String(o.value) === String(v))?.label ?? String(v)).join('、')\n : '';\n }\n if (displayVal == null) return '';\n const opt = options.find((o) => String(o.value) === String(displayVal));\n if (!opt) return String(displayVal);\n return isPersonVariant ? formatPersonValueLabel(opt as PersonOption) : opt.label;\n}\n\nconst FilterSelect: React.FC<FilterSelectProps> = ({\n filterKey,\n label,\n options = [],\n value,\n onChange,\n defaultValue,\n defaultValues,\n searchable = false,\n multiple = false,\n minSelection,\n variant = 'default',\n active,\n hidden,\n display,\n}) => {\n const isPersonVariant = variant === 'person';\n const [open, setOpen] = useState(false);\n const [searchText, setSearchText] = useState('');\n const displayValue = toDisplayValue(value, defaultValue, defaultValues, multiple);\n const [localValue, setLocalValue] = useState<string | number | (string | number)[] | undefined>(\n displayValue ?? (multiple ? [] : undefined),\n );\n\n // ── 自动注册到 CommonFilter ──\n const registerFn = useFilterRegister();\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const handleRemove = useMemo(() => {\n const selectedArr = Array.isArray(displayValue)\n ? displayValue\n : displayValue != null && displayValue !== ''\n ? [displayValue]\n : [];\n const canRemove =\n !multiple ||\n minSelection == null ||\n selectedArr.length > minSelection;\n return () => {\n if (!canRemove) return;\n onChangeRef.current?.(undefined);\n };\n }, [displayValue, minSelection, multiple]);\n\n const revertToCommitted = () => {\n const next = displayValue ?? (multiple ? [] : undefined);\n setLocalValue(next);\n setSearchText('');\n };\n\n // 同步外部 value 到内部 localValue\n useEffect(() => {\n const nextDisplayValue = toDisplayValue(value, defaultValue, defaultValues, multiple);\n setLocalValue(nextDisplayValue ?? (multiple ? [] : undefined));\n if (\n nextDisplayValue === undefined ||\n nextDisplayValue === null ||\n (Array.isArray(nextDisplayValue) && nextDisplayValue.length === 0)\n ) {\n setSearchText('');\n }\n }, [value, defaultValue, defaultValues, multiple]);\n\n const committedValueLabel = useMemo(\n () => formatValueLabel(displayValue, options, multiple, isPersonVariant),\n [options, displayValue, multiple, isPersonVariant],\n );\n\n useEffect(() => {\n if (!registerFn) return;\n const ctx = { filterKey, label, value };\n if (!resolveFilterVisible({ display, hidden }, ctx)) {\n registerFn.unregister(filterKey);\n return;\n }\n if (committedValueLabel) {\n const selectedArr = Array.isArray(displayValue)\n ? displayValue\n : displayValue != null && displayValue !== ''\n ? [displayValue]\n : [];\n const removable =\n !multiple || minSelection == null || selectedArr.length > minSelection;\n registerFn.register(filterKey, {\n label,\n valueLabel: committedValueLabel,\n onRemove: handleRemove,\n removable,\n });\n } else {\n registerFn.unregister(filterKey);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [committedValueLabel, filterKey, label, hidden, display, handleRemove]);\n\n const visibilityCtx = { filterKey, label, value };\n if (!resolveFilterVisible({ display, hidden }, visibilityCtx)) return null;\n\n const filteredOptions = searchText\n ? options.filter((opt) =>\n isPersonVariant\n ? matchPersonOptionSearch(opt as PersonOption, searchText)\n : opt.label.toLowerCase().includes(searchText.toLowerCase()),\n )\n : options;\n\n const handleConfirm = () => {\n onChange?.(localValue as FilterSelectValue);\n setOpen(false);\n };\n\n const handleDiscardDraft = () => {\n revertToCommitted();\n setOpen(false);\n };\n\n const handleOpenChange = (nextOpen: boolean) => {\n if (!nextOpen && multiple) {\n revertToCommitted();\n }\n setOpen(nextOpen);\n };\n\n const handleClickOption = (optVal: string | number) => {\n if (!multiple) {\n const isDefaultOption = defaultValue !== undefined && optVal === defaultValue;\n let next: string | number | undefined;\n if (localValue === optVal || isDefaultOption) {\n next = undefined;\n } else {\n next = optVal;\n }\n setLocalValue(next);\n onChange?.(next);\n setOpen(false);\n }\n };\n\n const handleToggleMulti = (optVal: string | number) => {\n const arr = (localValue as (string | number)[]) || [];\n if (arr.includes(optVal) && minSelection != null && arr.length <= minSelection) {\n return;\n }\n const next = arr.includes(optVal) ? arr.filter((v) => v !== optVal) : [...arr, optVal];\n setLocalValue(next);\n };\n\n const isActive = multiple\n ? Array.isArray(displayValue) && displayValue.length > 0\n : displayValue != null && displayValue !== '';\n\n return (\n <FilterPopover\n label={label}\n active={active || isActive}\n open={open}\n onOpenChange={handleOpenChange}\n onConfirm={multiple ? handleConfirm : undefined}\n onReset={multiple ? handleDiscardDraft : undefined}\n >\n {searchable && (\n <Search\n placeholder={`搜索${label}`}\n allowClear\n size=\"middle\"\n className={classNames('filter-select-search', styles['filter-select-search'])}\n value={searchText}\n onChange={(e) => setSearchText(e.target.value)}\n />\n )}\n\n <div className={classNames('filter-select-options', styles['filter-select-options'])}>\n {filteredOptions.map((opt) => (\n <div\n key={String(opt.value)}\n className={classNames('filter-select-option', styles['filter-select-option'],\n !multiple &&\n localValue === opt.value &&\n classNames('filter-select-option-selected', styles['filter-select-option-selected']),\n )}\n onClick={() =>\n multiple ? handleToggleMulti(opt.value) : handleClickOption(opt.value)\n }\n >\n {multiple && (\n <Checkbox\n checked={(localValue as (string | number)[])?.includes(opt.value)}\n onChange={() => handleToggleMulti(opt.value)}\n onClick={(e) => e.stopPropagation()}\n />\n )}\n {isPersonVariant ? (\n <PersonOptionRow option={opt as PersonOption} />\n ) : (\n <span>{opt.label}</span>\n )}\n {!multiple && !isPersonVariant && localValue === opt.value && (\n <Check className={classNames('filter-select-option-check', styles['filter-select-option-check'])} />\n )}\n </div>\n ))}\n {filteredOptions.length === 0 && (\n <div className={classNames('filter-select-empty', styles['filter-select-empty'])}>暂无数据</div>\n )}\n </div>\n\n {multiple && (localValue as (string | number)[])?.length > 0 && (\n <div className={classNames('filter-select-selected-bar', styles['filter-select-selected-bar'])}>\n <div className={classNames('filter-select-selected-label', styles['filter-select-selected-label'])}>已选:</div>\n <Space size={[4, 4]} wrap>\n {(localValue as (string | number)[]).map((v) => {\n const opt = options.find((o) => String(o.value) === String(v));\n const arr = (localValue as (string | number)[]) || [];\n const tagRemovable = minSelection == null || arr.length > minSelection;\n return (\n <span\n key={String(v)}\n className={classNames(\n 'filter-select-selected-tag',\n styles['filter-select-selected-tag'],\n !tagRemovable && styles['filter-select-selected-tag-disabled'],\n )}\n onClick={() => tagRemovable && handleToggleMulti(v)}\n >\n {opt?.label ?? String(v)}\n <X\n className={classNames(\n 'filter-select-selected-remove',\n styles['filter-select-selected-remove'],\n !tagRemovable && styles['filter-select-selected-remove-disabled'],\n )}\n />\n </span>\n );\n })}\n </Space>\n </div>\n )}\n </FilterPopover>\n );\n};\n\nexport default FilterSelect;\nexport type { FilterSelectProps };\n"],"names":["Search","Input","formatPersonValueLabel","opt","parts","matchPersonOptionSearch","keyword","lower","s","arraysEqual","a","b","sortedA","sortedB","v","i","toDisplayValue","value","defaultValue","defaultValues","multiple","arr","formatValueLabel","displayVal","options","isPersonVariant","_a","o","FilterSelect","filterKey","label","onChange","searchable","minSelection","variant","active","hidden","display","open","setOpen","useState","searchText","setSearchText","displayValue","localValue","setLocalValue","registerFn","useFilterRegister","onChangeRef","useRef","handleRemove","useMemo","selectedArr","canRemove","revertToCommitted","useEffect","nextDisplayValue","committedValueLabel","resolveFilterVisible","removable","filteredOptions","handleConfirm","handleDiscardDraft","handleOpenChange","nextOpen","handleClickOption","optVal","isDefaultOption","next","handleToggleMulti","isActive","jsxs","FilterPopover","jsx","classNames","styles","Checkbox","e","PersonOptionRow","Check","Space","tagRemovable","X"],"mappings":"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"}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
const e = {
|
|
2
|
-
"filter-select-search": "_filter-select-
|
|
3
|
-
"filter-select-options": "_filter-select-
|
|
4
|
-
"filter-select-option": "_filter-select-
|
|
5
|
-
"filter-select-option-selected": "_filter-select-option-
|
|
6
|
-
"filter-select-option-check": "_filter-select-option-
|
|
7
|
-
"filter-select-empty": "_filter-select-
|
|
8
|
-
"filter-select-selected-bar": "_filter-select-selected-
|
|
9
|
-
"filter-select-selected-label": "_filter-select-selected-
|
|
10
|
-
"filter-select-selected-tag": "_filter-select-selected-
|
|
11
|
-
"filter-select-selected-
|
|
2
|
+
"filter-select-search": "_filter-select-search_11rsz_1",
|
|
3
|
+
"filter-select-options": "_filter-select-options_11rsz_5",
|
|
4
|
+
"filter-select-option": "_filter-select-option_11rsz_5",
|
|
5
|
+
"filter-select-option-selected": "_filter-select-option-selected_11rsz_23",
|
|
6
|
+
"filter-select-option-check": "_filter-select-option-check_11rsz_28",
|
|
7
|
+
"filter-select-empty": "_filter-select-empty_11rsz_34",
|
|
8
|
+
"filter-select-selected-bar": "_filter-select-selected-bar_11rsz_42",
|
|
9
|
+
"filter-select-selected-label": "_filter-select-selected-label_11rsz_49",
|
|
10
|
+
"filter-select-selected-tag": "_filter-select-selected-tag_11rsz_55",
|
|
11
|
+
"filter-select-selected-tag-disabled": "_filter-select-selected-tag-disabled_11rsz_68",
|
|
12
|
+
"filter-select-selected-remove": "_filter-select-selected-remove_11rsz_73",
|
|
13
|
+
"filter-select-selected-remove-disabled": "_filter-select-selected-remove-disabled_11rsz_77"
|
|
12
14
|
};
|
|
13
15
|
export {
|
|
14
16
|
e as default
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sources":["../../../src/components/Filter/types.ts"],"sourcesContent":["import type { MaybeFn, Visibility } from '@/utils/resolveMaybeFn';\nimport { resolveMaybeFn } from '@/utils/resolveMaybeFn';\n\n/** 筛选选项基础类型 */\nexport interface FilterOption {\n label: string;\n value: string | number;\n}\n\n/** 人员展示选项(仅 UI 字段,数据由消费方提供) */\nexport interface PersonOption extends FilterOption {\n departmentName?: string;\n email?: string;\n phone?: string;\n employeeId?: string;\n}\n\n/** 已选项 */\nexport interface SelectedItem {\n key: string;\n label: string;\n valueLabel: string;\n onRemove: () => void;\n}\n\n/** 所有筛选组件共用的 Props */\nexport interface BaseFilterProps {\n filterKey: string;\n label: string;\n active?: boolean;\n /** 隐藏;支持 boolean 或 (ctx) => boolean */\n hidden?: Visibility;\n /** 展示;与 hidden 二选一,display 优先 */\n display?: Visibility;\n}\n\nexport type FilterVisibilityContext = Record<string, unknown>;\n\n/** 解析 hidden(兼容旧 API,支持 MaybeFn) */\nexport function resolveHidden(\n hidden: MaybeFn<boolean, FilterVisibilityContext> | undefined,\n ctx: FilterVisibilityContext = {},\n): boolean {\n if (hidden === undefined) return false;\n return resolveMaybeFn(hidden, ctx, false);\n}\n\n/** 根据 display / hidden 计算筛选项是否可见 */\nexport function resolveFilterVisible(\n props: Pick<BaseFilterProps, 'display' | 'hidden'>,\n ctx: FilterVisibilityContext = {},\n): boolean {\n if (props.display !== undefined) {\n return resolveMaybeFn(props.display, ctx, true);\n }\n return !resolveHidden(props.hidden, ctx);\n}\n"],"names":["resolveHidden","hidden","ctx","resolveMaybeFn","resolveFilterVisible","props"],"mappings":";
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../../../src/components/Filter/types.ts"],"sourcesContent":["import type { MaybeFn, Visibility } from '@/utils/resolveMaybeFn';\nimport { resolveMaybeFn } from '@/utils/resolveMaybeFn';\n\n/** 筛选选项基础类型 */\nexport interface FilterOption {\n label: string;\n value: string | number;\n}\n\n/** 人员展示选项(仅 UI 字段,数据由消费方提供) */\nexport interface PersonOption extends FilterOption {\n departmentName?: string;\n email?: string;\n phone?: string;\n employeeId?: string;\n}\n\n/** 已选项 */\nexport interface SelectedItem {\n key: string;\n label: string;\n valueLabel: string;\n onRemove: () => void;\n /** 为 false 时不允许移除(如多选至少保留一项) */\n removable?: boolean;\n}\n\n/** 所有筛选组件共用的 Props */\nexport interface BaseFilterProps {\n filterKey: string;\n label: string;\n active?: boolean;\n /** 隐藏;支持 boolean 或 (ctx) => boolean */\n hidden?: Visibility;\n /** 展示;与 hidden 二选一,display 优先 */\n display?: Visibility;\n}\n\nexport type FilterVisibilityContext = Record<string, unknown>;\n\n/** 解析 hidden(兼容旧 API,支持 MaybeFn) */\nexport function resolveHidden(\n hidden: MaybeFn<boolean, FilterVisibilityContext> | undefined,\n ctx: FilterVisibilityContext = {},\n): boolean {\n if (hidden === undefined) return false;\n return resolveMaybeFn(hidden, ctx, false);\n}\n\n/** 根据 display / hidden 计算筛选项是否可见 */\nexport function resolveFilterVisible(\n props: Pick<BaseFilterProps, 'display' | 'hidden'>,\n ctx: FilterVisibilityContext = {},\n): boolean {\n if (props.display !== undefined) {\n return resolveMaybeFn(props.display, ctx, true);\n }\n return !resolveHidden(props.hidden, ctx);\n}\n"],"names":["resolveHidden","hidden","ctx","resolveMaybeFn","resolveFilterVisible","props"],"mappings":";AAyCO,SAASA,EACdC,GACAC,IAA+B,IACtB;AACT,SAAID,MAAW,SAAkB,KAC1BE,EAAeF,GAAQC,GAAK,EAAK;AAC1C;AAGO,SAASE,EACdC,GACAH,IAA+B,IACtB;AACT,SAAIG,EAAM,YAAY,SACbF,EAAeE,EAAM,SAASH,GAAK,EAAI,IAEzC,CAACF,EAAcK,EAAM,QAAQH,CAAG;AACzC;"}
|
|
@@ -1,35 +1,36 @@
|
|
|
1
1
|
import { jsx as m } from "react/jsx-runtime";
|
|
2
|
-
import { useContext as
|
|
2
|
+
import { useContext as v, useState as f, useCallback as a, useMemo as x, createContext as R } from "react";
|
|
3
3
|
const s = R(null);
|
|
4
|
-
function
|
|
5
|
-
return
|
|
4
|
+
function C() {
|
|
5
|
+
return v(s);
|
|
6
6
|
}
|
|
7
|
-
function
|
|
8
|
-
const [
|
|
9
|
-
n((
|
|
10
|
-
const
|
|
11
|
-
return
|
|
7
|
+
function F() {
|
|
8
|
+
const [o, n] = f({}), u = a((t, e) => {
|
|
9
|
+
n((l) => {
|
|
10
|
+
const r = l[t];
|
|
11
|
+
return r && r.label === e.label && r.valueLabel === e.valueLabel && (r.removable ?? !0) === (e.removable ?? !0) && r.onRemove === e.onRemove ? l : { ...l, [t]: e };
|
|
12
12
|
});
|
|
13
|
-
}, []),
|
|
14
|
-
n((
|
|
15
|
-
if (!(
|
|
16
|
-
const
|
|
17
|
-
return delete
|
|
13
|
+
}, []), i = a((t) => {
|
|
14
|
+
n((e) => {
|
|
15
|
+
if (!(t in e)) return e;
|
|
16
|
+
const l = { ...e };
|
|
17
|
+
return delete l[t], l;
|
|
18
18
|
});
|
|
19
|
-
}, []),
|
|
20
|
-
Object.values(
|
|
21
|
-
}, [
|
|
22
|
-
key:
|
|
23
|
-
label:
|
|
24
|
-
valueLabel:
|
|
25
|
-
onRemove:
|
|
26
|
-
|
|
27
|
-
|
|
19
|
+
}, []), c = a(() => {
|
|
20
|
+
Object.values(o).forEach((t) => t.onRemove()), n({});
|
|
21
|
+
}, [o]), b = x(() => Object.entries(o).filter(([, t]) => !!t.valueLabel).map(([t, e]) => ({
|
|
22
|
+
key: t,
|
|
23
|
+
label: e.label,
|
|
24
|
+
valueLabel: e.valueLabel,
|
|
25
|
+
onRemove: e.onRemove,
|
|
26
|
+
removable: e.removable ?? !0
|
|
27
|
+
})), [o]);
|
|
28
|
+
return { registrations: o, selectedItems: b, register: u, unregister: i, clearAll: c };
|
|
28
29
|
}
|
|
29
|
-
const
|
|
30
|
+
const j = ({ children: o, ctx: n }) => /* @__PURE__ */ m(s.Provider, { value: n, children: o });
|
|
30
31
|
export {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
j as FilterProvider,
|
|
33
|
+
C as useFilterRegister,
|
|
34
|
+
F as useFilterState
|
|
34
35
|
};
|
|
35
36
|
//# sourceMappingURL=useFilterState.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFilterState.js","sources":["../../../src/components/Filter/useFilterState.tsx"],"sourcesContent":["import React, { createContext, useCallback, useContext, useMemo, useState } from 'react';\nimport type { SelectedItem } from './types';\n\n/**\n * 筛选项注册信息\n */\ninterface FilterRegistration {\n /** 筛选项标签 */\n label: string;\n /** 当前值的展示文案(如 \"技术中心\" / \"审核员\"),为空则不显示该条目 */\n valueLabel: string;\n /** 移除回调 */\n onRemove: () => void;\n}\n\n/** Context 类型 */\ninterface FilterContextValue {\n /** 注册筛选条件(有值时调用) */\n register: (key: string, reg: FilterRegistration) => void;\n /** 注销筛选条件(组件卸载或值清空时调用) */\n unregister: (key: string) => void;\n}\n\nconst FilterContext = createContext<FilterContextValue | null>(null);\n\n/** 供子组件使用 —— 在 CommonFilter 内部注册自身状态(不在 CommonFilter 内时安全返回 null) */\nexport function useFilterRegister(): FilterContextValue | null {\n return useContext(FilterContext);\n}\n\n// ──────────────────── Hook ────────────────────\n\ninterface UseFilterStateReturn {\n /** 所有已注册的筛选项 */\n registrations: Record<string, FilterRegistration>;\n /** 已选条目数组(过滤掉无 valueLabel 的项) */\n selectedItems: SelectedItem[];\n /** 注册方法 */\n register: (key: string, reg: FilterRegistration) => void;\n /** 注销方法 */\n unregister: (key: string) => void;\n /** 清空全部 */\n clearAll: () => void;\n}\n\n/**\n * 筛选状态管理 Hook\n *\n * 各 Filter 子组件通过 `register(key, { label, valueLabel, onRemove })` 注册,\n * CommonFilter 自动聚合成 `selectedItems` 展示。\n */\nexport function useFilterState(): UseFilterStateReturn {\n const [registrations, setRegistrations] = useState<Record<string, FilterRegistration>>({});\n\n const register = useCallback((key: string, reg: FilterRegistration) => {\n setRegistrations((prev) => {\n const existing = prev[key];\n if (existing
|
|
1
|
+
{"version":3,"file":"useFilterState.js","sources":["../../../src/components/Filter/useFilterState.tsx"],"sourcesContent":["import React, { createContext, useCallback, useContext, useMemo, useState } from 'react';\nimport type { SelectedItem } from './types';\n\n/**\n * 筛选项注册信息\n */\ninterface FilterRegistration {\n /** 筛选项标签 */\n label: string;\n /** 当前值的展示文案(如 \"技术中心\" / \"审核员\"),为空则不显示该条目 */\n valueLabel: string;\n /** 移除回调 */\n onRemove: () => void;\n /** 是否允许移除标签,默认 true */\n removable?: boolean;\n}\n\n/** Context 类型 */\ninterface FilterContextValue {\n /** 注册筛选条件(有值时调用) */\n register: (key: string, reg: FilterRegistration) => void;\n /** 注销筛选条件(组件卸载或值清空时调用) */\n unregister: (key: string) => void;\n}\n\nconst FilterContext = createContext<FilterContextValue | null>(null);\n\n/** 供子组件使用 —— 在 CommonFilter 内部注册自身状态(不在 CommonFilter 内时安全返回 null) */\nexport function useFilterRegister(): FilterContextValue | null {\n return useContext(FilterContext);\n}\n\n// ──────────────────── Hook ────────────────────\n\ninterface UseFilterStateReturn {\n /** 所有已注册的筛选项 */\n registrations: Record<string, FilterRegistration>;\n /** 已选条目数组(过滤掉无 valueLabel 的项) */\n selectedItems: SelectedItem[];\n /** 注册方法 */\n register: (key: string, reg: FilterRegistration) => void;\n /** 注销方法 */\n unregister: (key: string) => void;\n /** 清空全部 */\n clearAll: () => void;\n}\n\n/**\n * 筛选状态管理 Hook\n *\n * 各 Filter 子组件通过 `register(key, { label, valueLabel, onRemove })` 注册,\n * CommonFilter 自动聚合成 `selectedItems` 展示。\n */\nexport function useFilterState(): UseFilterStateReturn {\n const [registrations, setRegistrations] = useState<Record<string, FilterRegistration>>({});\n\n const register = useCallback((key: string, reg: FilterRegistration) => {\n setRegistrations((prev) => {\n const existing = prev[key];\n if (\n existing &&\n existing.label === reg.label &&\n existing.valueLabel === reg.valueLabel &&\n (existing.removable ?? true) === (reg.removable ?? true) &&\n existing.onRemove === reg.onRemove\n ) {\n return prev;\n }\n return { ...prev, [key]: reg };\n });\n }, []);\n\n const unregister = useCallback((key: string) => {\n setRegistrations((prev) => {\n if (!(key in prev)) return prev;\n const next = { ...prev };\n delete next[key];\n return next;\n });\n }, []);\n\n const clearAll = useCallback(() => {\n // 依次调用每项的 onRemove\n Object.values(registrations).forEach((r) => r.onRemove());\n setRegistrations({});\n }, [registrations]);\n\n const selectedItems = useMemo<SelectedItem[]>(() => {\n return Object.entries(registrations)\n .filter(([, r]) => !!r.valueLabel)\n .map(([key, r]) => ({\n key,\n label: r.label,\n valueLabel: r.valueLabel,\n onRemove: r.onRemove,\n removable: r.removable ?? true,\n }));\n }, [registrations]);\n\n return { registrations, selectedItems, register, unregister, clearAll };\n}\n\n// ──────────────────── Provider ────────────────────\n\ninterface FilterProviderProps {\n children: React.ReactNode;\n /** register / unregister 方法 */\n ctx: Pick<UseFilterStateReturn, 'register' | 'unregister'>;\n}\n\n/** 内部 Provider,将 register/unregister 注入给子组件 */\nexport const FilterProvider: React.FC<FilterProviderProps> = ({ children, ctx }) => (\n <FilterContext.Provider value={ctx}>{children}</FilterContext.Provider>\n);\n\nexport default useFilterState;\n"],"names":["FilterContext","createContext","useFilterRegister","useContext","useFilterState","registrations","setRegistrations","useState","register","useCallback","key","reg","prev","existing","unregister","next","clearAll","r","selectedItems","useMemo","FilterProvider","children","ctx","jsx"],"mappings":";;AAyBA,MAAMA,IAAgBC,EAAyC,IAAI;AAG5D,SAASC,IAA+C;AAC7D,SAAOC,EAAWH,CAAa;AACjC;AAuBO,SAASI,IAAuC;AACrD,QAAM,CAACC,GAAeC,CAAgB,IAAIC,EAA6C,CAAA,CAAE,GAEnFC,IAAWC,EAAY,CAACC,GAAaC,MAA4B;AACrE,IAAAL,EAAiB,CAACM,MAAS;AACzB,YAAMC,IAAWD,EAAKF,CAAG;AACzB,aACEG,KACAA,EAAS,UAAUF,EAAI,SACvBE,EAAS,eAAeF,EAAI,eAC3BE,EAAS,aAAa,SAAWF,EAAI,aAAa,OACnDE,EAAS,aAAaF,EAAI,WAEnBC,IAEF,EAAE,GAAGA,GAAM,CAACF,CAAG,GAAGC,EAAA;AAAA,IAC3B,CAAC;AAAA,EACH,GAAG,CAAA,CAAE,GAECG,IAAaL,EAAY,CAACC,MAAgB;AAC9C,IAAAJ,EAAiB,CAACM,MAAS;AACzB,UAAI,EAAEF,KAAOE,GAAO,QAAOA;AAC3B,YAAMG,IAAO,EAAE,GAAGH,EAAA;AAClB,oBAAOG,EAAKL,CAAG,GACRK;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAA,CAAE,GAECC,IAAWP,EAAY,MAAM;AAEjC,WAAO,OAAOJ,CAAa,EAAE,QAAQ,CAACY,MAAMA,EAAE,UAAU,GACxDX,EAAiB,CAAA,CAAE;AAAA,EACrB,GAAG,CAACD,CAAa,CAAC,GAEZa,IAAgBC,EAAwB,MACrC,OAAO,QAAQd,CAAa,EAChC,OAAO,CAAC,CAAA,EAAGY,CAAC,MAAM,CAAC,CAACA,EAAE,UAAU,EAChC,IAAI,CAAC,CAACP,GAAKO,CAAC,OAAO;AAAA,IAClB,KAAAP;AAAA,IACA,OAAOO,EAAE;AAAA,IACT,YAAYA,EAAE;AAAA,IACd,UAAUA,EAAE;AAAA,IACZ,WAAWA,EAAE,aAAa;AAAA,EAAA,EAC1B,GACH,CAACZ,CAAa,CAAC;AAElB,SAAO,EAAE,eAAAA,GAAe,eAAAa,GAAe,UAAAV,GAAU,YAAAM,GAAY,UAAAE,EAAA;AAC/D;AAWO,MAAMI,IAAgD,CAAC,EAAE,UAAAC,GAAU,KAAAC,QACxE,gBAAAC,EAACvB,EAAc,UAAd,EAAuB,OAAOsB,GAAM,UAAAD,EAAA,CAAS;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export type ModulePageShellProps = {
|
|
3
|
+
title?: string;
|
|
4
|
+
description?: ReactNode;
|
|
5
|
+
breadcrumb?: ReactNode;
|
|
6
|
+
toolbar?: ReactNode;
|
|
7
|
+
/** 页面级 loading,与 usePageShellLoading 注册的 ctx loading 合并 */
|
|
8
|
+
spinning?: boolean;
|
|
9
|
+
/** 是否同步 title/description/actions 到 PageShellProvider(App 顶栏),默认 true */
|
|
10
|
+
syncPageMeta?: boolean;
|
|
11
|
+
actions?: Record<string, unknown>[];
|
|
12
|
+
children?: ReactNode;
|
|
13
|
+
className?: string;
|
|
14
|
+
bodyClassName?: string;
|
|
15
|
+
};
|
|
16
|
+
declare const ModulePageShell: React.FC<ModulePageShellProps>;
|
|
17
|
+
export default ModulePageShell;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { jsxs as h, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import l from "classnames";
|
|
3
|
+
import { useEffect as b } from "react";
|
|
4
|
+
import N from "../PageSpin/index.js";
|
|
5
|
+
import o from "./style.module.scss.js";
|
|
6
|
+
import { usePageShell as v } from "../PageShell/PageShellContext.js";
|
|
7
|
+
const w = ({
|
|
8
|
+
title: m,
|
|
9
|
+
description: r,
|
|
10
|
+
breadcrumb: s,
|
|
11
|
+
toolbar: d,
|
|
12
|
+
spinning: u = !1,
|
|
13
|
+
syncPageMeta: n = !0,
|
|
14
|
+
actions: i,
|
|
15
|
+
children: p,
|
|
16
|
+
className: t,
|
|
17
|
+
bodyClassName: g
|
|
18
|
+
}) => {
|
|
19
|
+
const { setPageMeta: a, pageLoading: c } = v(), f = !!(u || c);
|
|
20
|
+
return b(() => {
|
|
21
|
+
if (n)
|
|
22
|
+
return a({
|
|
23
|
+
title: m,
|
|
24
|
+
description: r,
|
|
25
|
+
actionItems: i
|
|
26
|
+
}), () => a({});
|
|
27
|
+
}, [m, r, i, n, a]), /* @__PURE__ */ h("div", { className: l("module-page-shell", o["module-page-shell"], t), children: [
|
|
28
|
+
s ? /* @__PURE__ */ e("div", { className: l("module-page-breadcrumb", o["module-page-breadcrumb"]), children: s }) : null,
|
|
29
|
+
d ? /* @__PURE__ */ e("div", { className: l("module-page-toolbar", o["module-page-toolbar"]), children: d }) : null,
|
|
30
|
+
/* @__PURE__ */ e(
|
|
31
|
+
"div",
|
|
32
|
+
{
|
|
33
|
+
className: l("module-page-body", o["module-page-body"], g),
|
|
34
|
+
children: /* @__PURE__ */ e(N, { spinning: f, children: p })
|
|
35
|
+
}
|
|
36
|
+
)
|
|
37
|
+
] });
|
|
38
|
+
};
|
|
39
|
+
export {
|
|
40
|
+
w as default
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/Layout/ModulePageShell/index.tsx"],"sourcesContent":["import classNames from 'classnames';\nimport type { ReactNode } from 'react';\nimport { useEffect } from 'react';\nimport PageSpin from '../PageSpin';\nimport { usePageShell } from '../PageShell';\nimport styles from './style.module.scss';\n\nexport type ModulePageShellProps = {\n title?: string;\n description?: ReactNode;\n breadcrumb?: ReactNode;\n toolbar?: ReactNode;\n /** 页面级 loading,与 usePageShellLoading 注册的 ctx loading 合并 */\n spinning?: boolean;\n /** 是否同步 title/description/actions 到 PageShellProvider(App 顶栏),默认 true */\n syncPageMeta?: boolean;\n actions?: Record<string, unknown>[];\n children?: ReactNode;\n className?: string;\n bodyClassName?: string;\n};\n\nconst ModulePageShell: React.FC<ModulePageShellProps> = ({\n title,\n description,\n breadcrumb,\n toolbar,\n spinning = false,\n syncPageMeta = true,\n actions,\n children,\n className,\n bodyClassName,\n}) => {\n const { setPageMeta, pageLoading: ctxLoading } = usePageShell();\n const showSpinning = Boolean(spinning || ctxLoading);\n\n useEffect(() => {\n if (!syncPageMeta) return;\n setPageMeta({\n title,\n description,\n actionItems: actions,\n });\n return () => setPageMeta({});\n }, [title, description, actions, syncPageMeta, setPageMeta]);\n\n return (\n <div className={classNames('module-page-shell', styles['module-page-shell'], className)}>\n {breadcrumb ? (\n <div className={classNames('module-page-breadcrumb', styles['module-page-breadcrumb'])}>\n {breadcrumb}\n </div>\n ) : null}\n\n {toolbar ? (\n <div className={classNames('module-page-toolbar', styles['module-page-toolbar'])}>\n {toolbar}\n </div>\n ) : null}\n\n <div\n className={classNames('module-page-body', styles['module-page-body'], bodyClassName)}\n >\n <PageSpin spinning={showSpinning}>{children}</PageSpin>\n </div>\n </div>\n );\n};\n\nexport default ModulePageShell;\n"],"names":["ModulePageShell","title","description","breadcrumb","toolbar","spinning","syncPageMeta","actions","children","className","bodyClassName","setPageMeta","ctxLoading","usePageShell","showSpinning","useEffect","jsxs","classNames","styles","jsx","PageSpin"],"mappings":";;;;;;AAsBA,MAAMA,IAAkD,CAAC;AAAA,EACvD,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,cAAAC,IAAe;AAAA,EACf,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,eAAAC;AACF,MAAM;AACJ,QAAM,EAAE,aAAAC,GAAa,aAAaC,EAAA,IAAeC,EAAA,GAC3CC,IAAe,GAAQT,KAAYO;AAEzC,SAAAG,EAAU,MAAM;AACd,QAAKT;AACL,aAAAK,EAAY;AAAA,QACV,OAAAV;AAAA,QACA,aAAAC;AAAA,QACA,aAAaK;AAAA,MAAA,CACd,GACM,MAAMI,EAAY,EAAE;AAAA,EAC7B,GAAG,CAACV,GAAOC,GAAaK,GAASD,GAAcK,CAAW,CAAC,GAGzD,gBAAAK,EAAC,SAAI,WAAWC,EAAW,qBAAqBC,EAAO,mBAAmB,GAAGT,CAAS,GACnF,UAAA;AAAA,IAAAN,IACC,gBAAAgB,EAAC,OAAA,EAAI,WAAWF,EAAW,0BAA0BC,EAAO,wBAAwB,CAAC,GAClF,UAAAf,EAAA,CACH,IACE;AAAA,IAEHC,IACC,gBAAAe,EAAC,OAAA,EAAI,WAAWF,EAAW,uBAAuBC,EAAO,qBAAqB,CAAC,GAC5E,UAAAd,EAAA,CACH,IACE;AAAA,IAEJ,gBAAAe;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWF,EAAW,oBAAoBC,EAAO,kBAAkB,GAAGR,CAAa;AAAA,QAEnF,UAAA,gBAAAS,EAACC,GAAA,EAAS,UAAUN,GAAe,UAAAN,EAAA,CAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EAC9C,GACF;AAEJ;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
const e = {
|
|
2
|
+
"module-page-shell": "_module-page-shell_140iw_1",
|
|
3
|
+
"module-page-breadcrumb": "_module-page-breadcrumb_140iw_10",
|
|
4
|
+
"module-page-toolbar": "_module-page-toolbar_140iw_19",
|
|
5
|
+
"module-page-body": "_module-page-body_140iw_26"
|
|
6
|
+
};
|
|
7
|
+
export {
|
|
8
|
+
e as default
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=style.module.scss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -5,8 +5,10 @@ export interface PageHeaderLayoutProps {
|
|
|
5
5
|
actions?: React.ReactNode;
|
|
6
6
|
/** 页面说明提示,显示在头部下方、内容区上方 */
|
|
7
7
|
description?: React.ReactNode;
|
|
8
|
+
/** 页面级 loading,与 usePageShellLoading 注册的 ctx loading 合并 */
|
|
9
|
+
spinning?: boolean;
|
|
8
10
|
children?: React.ReactNode;
|
|
9
11
|
}
|
|
10
|
-
/** 页面头部布局:返回按钮 + 标题 + 操作区 + 说明提示 +
|
|
12
|
+
/** 页面头部布局:返回按钮 + 标题 + 操作区 + 说明提示 + 内容(body 内置 PageSpin) */
|
|
11
13
|
declare const PageHeaderLayout: React.FC<PageHeaderLayoutProps>;
|
|
12
14
|
export default PageHeaderLayout;
|
|
@@ -1,41 +1,50 @@
|
|
|
1
1
|
import { jsxs as o, jsx as e } from "react/jsx-runtime";
|
|
2
|
-
import { ArrowLeft as
|
|
3
|
-
import { Button as
|
|
2
|
+
import { ArrowLeft as h } from "../../Icons/index.js";
|
|
3
|
+
import { Button as c } from "antd";
|
|
4
4
|
import a from "classnames";
|
|
5
|
+
import g from "../PageSpin/index.js";
|
|
5
6
|
import r from "./style.module.scss.js";
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
import { usePageShell as u } from "../PageShell/PageShellContext.js";
|
|
8
|
+
const P = ({
|
|
9
|
+
title: l,
|
|
8
10
|
onBack: t,
|
|
9
|
-
actions:
|
|
10
|
-
description:
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
{
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
11
|
+
actions: n,
|
|
12
|
+
description: i,
|
|
13
|
+
spinning: p = !1,
|
|
14
|
+
children: s
|
|
15
|
+
}) => {
|
|
16
|
+
const { pageLoading: d } = u(), m = !!(p || d);
|
|
17
|
+
return /* @__PURE__ */ o("div", { className: a("page-header-layout", r["page-header-layout"]), children: [
|
|
18
|
+
/* @__PURE__ */ o("div", { className: a("page-header-layout-root", r["page-header-layout-root"]), children: [
|
|
19
|
+
/* @__PURE__ */ o(
|
|
20
|
+
"div",
|
|
21
|
+
{
|
|
22
|
+
className: a(
|
|
23
|
+
"page-header-layout-container",
|
|
24
|
+
r["page-header-layout-container"]
|
|
25
|
+
),
|
|
26
|
+
children: [
|
|
27
|
+
t && /* @__PURE__ */ e(c, { type: "text", icon: /* @__PURE__ */ e(h, {}), onClick: t }),
|
|
28
|
+
/* @__PURE__ */ e(
|
|
29
|
+
"h2",
|
|
30
|
+
{
|
|
31
|
+
className: a(
|
|
32
|
+
"page-header-layout-wrapper",
|
|
33
|
+
r["page-header-layout-wrapper"]
|
|
34
|
+
),
|
|
35
|
+
children: l
|
|
36
|
+
}
|
|
37
|
+
)
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
),
|
|
41
|
+
/* @__PURE__ */ e("div", { children: n })
|
|
42
|
+
] }),
|
|
43
|
+
i && /* @__PURE__ */ e("div", { className: a("page-header-layout-inner", r["page-header-layout-inner"]), children: i }),
|
|
44
|
+
/* @__PURE__ */ e(g, { spinning: m, children: s })
|
|
45
|
+
] });
|
|
46
|
+
};
|
|
38
47
|
export {
|
|
39
|
-
|
|
48
|
+
P as default
|
|
40
49
|
};
|
|
41
50
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/Layout/PageHeaderLayout/index.tsx"],"sourcesContent":["import { ArrowLeft } from '@/components/Icons';\nimport { Button } from 'antd';\nimport classNames from 'classnames';\nimport React from 'react';\nimport styles from './style.module.scss';\n\nexport interface PageHeaderLayoutProps {\n title: string;\n onBack?: () => void;\n actions?: React.ReactNode;\n /** 页面说明提示,显示在头部下方、内容区上方 */\n description?: React.ReactNode;\n children?: React.ReactNode;\n}\n\n/** 页面头部布局:返回按钮 + 标题 + 操作区 + 说明提示 +
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/Layout/PageHeaderLayout/index.tsx"],"sourcesContent":["import { ArrowLeft } from '@/components/Icons';\nimport { Button } from 'antd';\nimport classNames from 'classnames';\nimport React from 'react';\nimport PageSpin from '../PageSpin';\nimport { usePageShell } from '../PageShell';\nimport styles from './style.module.scss';\n\nexport interface PageHeaderLayoutProps {\n title: string;\n onBack?: () => void;\n actions?: React.ReactNode;\n /** 页面说明提示,显示在头部下方、内容区上方 */\n description?: React.ReactNode;\n /** 页面级 loading,与 usePageShellLoading 注册的 ctx loading 合并 */\n spinning?: boolean;\n children?: React.ReactNode;\n}\n\n/** 页面头部布局:返回按钮 + 标题 + 操作区 + 说明提示 + 内容(body 内置 PageSpin) */\nconst PageHeaderLayout: React.FC<PageHeaderLayoutProps> = ({\n title,\n onBack,\n actions,\n description,\n spinning = false,\n children,\n}) => {\n const { pageLoading: ctxLoading } = usePageShell();\n const showSpinning = Boolean(spinning || ctxLoading);\n\n return (\n <div className={classNames('page-header-layout', styles['page-header-layout'])}>\n <div className={classNames('page-header-layout-root', styles['page-header-layout-root'])}>\n <div\n className={classNames(\n 'page-header-layout-container',\n styles['page-header-layout-container'],\n )}\n >\n {onBack && <Button type=\"text\" icon={<ArrowLeft />} onClick={onBack} />}\n <h2\n className={classNames(\n 'page-header-layout-wrapper',\n styles['page-header-layout-wrapper'],\n )}\n >\n {title}\n </h2>\n </div>\n <div>{actions}</div>\n </div>\n {description && (\n <div className={classNames('page-header-layout-inner', styles['page-header-layout-inner'])}>\n {description}\n </div>\n )}\n <PageSpin spinning={showSpinning}>{children}</PageSpin>\n </div>\n );\n};\n\nexport default PageHeaderLayout;\n"],"names":["PageHeaderLayout","title","onBack","actions","description","spinning","children","ctxLoading","usePageShell","showSpinning","jsxs","classNames","styles","jsx","Button","ArrowLeft","PageSpin"],"mappings":";;;;;;;AAoBA,MAAMA,IAAoD,CAAC;AAAA,EACzD,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,UAAAC;AACF,MAAM;AACJ,QAAM,EAAE,aAAaC,EAAA,IAAeC,EAAA,GAC9BC,IAAe,GAAQJ,KAAYE;AAEzC,SACE,gBAAAG,EAAC,SAAI,WAAWC,EAAW,sBAAsBC,EAAO,oBAAoB,CAAC,GAC3E,UAAA;AAAA,IAAA,gBAAAF,EAAC,SAAI,WAAWC,EAAW,2BAA2BC,EAAO,yBAAyB,CAAC,GACrF,UAAA;AAAA,MAAA,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWC;AAAA,YACT;AAAA,YACAC,EAAO,8BAA8B;AAAA,UAAA;AAAA,UAGtC,UAAA;AAAA,YAAAV,KAAU,gBAAAW,EAACC,KAAO,MAAK,QAAO,MAAM,gBAAAD,EAACE,GAAA,CAAA,CAAU,GAAI,SAASb,EAAA,CAAQ;AAAA,YACrE,gBAAAW;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAWF;AAAA,kBACT;AAAA,kBACAC,EAAO,4BAA4B;AAAA,gBAAA;AAAA,gBAGpC,UAAAX;AAAA,cAAA;AAAA,YAAA;AAAA,UACH;AAAA,QAAA;AAAA,MAAA;AAAA,MAEF,gBAAAY,EAAC,SAAK,UAAAV,EAAA,CAAQ;AAAA,IAAA,GAChB;AAAA,IACCC,KACC,gBAAAS,EAAC,OAAA,EAAI,WAAWF,EAAW,4BAA4BC,EAAO,0BAA0B,CAAC,GACtF,UAAAR,EAAA,CACH;AAAA,IAEF,gBAAAS,EAACG,GAAA,EAAS,UAAUP,GAAe,UAAAH,EAAA,CAAS;AAAA,EAAA,GAC9C;AAEJ;"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
const e = {
|
|
2
|
-
"page-header-layout
|
|
3
|
-
"page-header-layout-
|
|
4
|
-
"page-header-layout-
|
|
5
|
-
"page-header-layout-
|
|
2
|
+
"page-header-layout": "_page-header-layout_w8y3l_1",
|
|
3
|
+
"page-header-layout-root": "_page-header-layout-root_w8y3l_8",
|
|
4
|
+
"page-header-layout-container": "_page-header-layout-container_w8y3l_14",
|
|
5
|
+
"page-header-layout-wrapper": "_page-header-layout-wrapper_w8y3l_19",
|
|
6
|
+
"page-header-layout-inner": "_page-header-layout-inner_w8y3l_24"
|
|
6
7
|
};
|
|
7
8
|
export {
|
|
8
9
|
e as default
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export type PageShellMeta = {
|
|
3
|
+
title?: string;
|
|
4
|
+
description?: ReactNode;
|
|
5
|
+
actionItems?: Record<string, unknown>[];
|
|
6
|
+
};
|
|
7
|
+
type PageShellContextValue = {
|
|
8
|
+
meta: PageShellMeta;
|
|
9
|
+
setPageMeta: (next: PageShellMeta) => void;
|
|
10
|
+
pageLoading: boolean;
|
|
11
|
+
setPageLoading: (loading: boolean) => void;
|
|
12
|
+
};
|
|
13
|
+
export declare function usePageShell(): PageShellContextValue;
|
|
14
|
+
/** 深层子组件向 Layout body Spin 注册 loading(卸载时自动清除) */
|
|
15
|
+
export declare function usePageShellLoading(spinning: boolean): void;
|
|
16
|
+
export type PageShellProviderProps = {
|
|
17
|
+
children: ReactNode;
|
|
18
|
+
};
|
|
19
|
+
export declare function PageShellProvider({ children }: PageShellProviderProps): import("react").JSX.Element;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsx as f } from "react/jsx-runtime";
|
|
2
|
+
import { useState as g, useCallback as r, useMemo as d, useContext as m, useEffect as L, createContext as M } from "react";
|
|
3
|
+
const c = {}, l = M({
|
|
4
|
+
meta: c,
|
|
5
|
+
setPageMeta: () => {
|
|
6
|
+
},
|
|
7
|
+
pageLoading: !1,
|
|
8
|
+
setPageLoading: () => {
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
function S() {
|
|
12
|
+
return m(l);
|
|
13
|
+
}
|
|
14
|
+
function p(t) {
|
|
15
|
+
const { setPageLoading: e } = S();
|
|
16
|
+
L(() => (e(t), () => e(!1)), [t, e]);
|
|
17
|
+
}
|
|
18
|
+
function C({ children: t }) {
|
|
19
|
+
const [e, u] = g(c), [o, P] = g(!1), s = r((a) => {
|
|
20
|
+
u(a);
|
|
21
|
+
}, []), n = r((a) => {
|
|
22
|
+
P(a);
|
|
23
|
+
}, []), i = d(
|
|
24
|
+
() => ({
|
|
25
|
+
meta: e,
|
|
26
|
+
setPageMeta: s,
|
|
27
|
+
pageLoading: o,
|
|
28
|
+
setPageLoading: n
|
|
29
|
+
}),
|
|
30
|
+
[e, s, o, n]
|
|
31
|
+
);
|
|
32
|
+
return /* @__PURE__ */ f(l.Provider, { value: i, children: t });
|
|
33
|
+
}
|
|
34
|
+
export {
|
|
35
|
+
C as PageShellProvider,
|
|
36
|
+
S as usePageShell,
|
|
37
|
+
p as usePageShellLoading
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=PageShellContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageShellContext.js","sources":["../../../../src/components/Layout/PageShell/PageShellContext.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';\n\nexport type PageShellMeta = {\n title?: string;\n description?: ReactNode;\n actionItems?: Record<string, unknown>[];\n};\n\ntype PageShellContextValue = {\n meta: PageShellMeta;\n setPageMeta: (next: PageShellMeta) => void;\n pageLoading: boolean;\n setPageLoading: (loading: boolean) => void;\n};\n\nconst EMPTY_META: PageShellMeta = {};\n\nconst PageShellContext = createContext<PageShellContextValue>({\n meta: EMPTY_META,\n setPageMeta: () => {},\n pageLoading: false,\n setPageLoading: () => {},\n});\n\nexport function usePageShell() {\n return useContext(PageShellContext);\n}\n\n/** 深层子组件向 Layout body Spin 注册 loading(卸载时自动清除) */\nexport function usePageShellLoading(spinning: boolean) {\n const { setPageLoading } = usePageShell();\n useEffect(() => {\n setPageLoading(spinning);\n return () => setPageLoading(false);\n }, [spinning, setPageLoading]);\n}\n\nexport type PageShellProviderProps = {\n children: ReactNode;\n};\n\nexport function PageShellProvider({ children }: PageShellProviderProps) {\n const [meta, setMeta] = useState<PageShellMeta>(EMPTY_META);\n const [pageLoading, setPageLoadingState] = useState(false);\n\n const setPageMeta = useCallback((next: PageShellMeta) => {\n setMeta(next);\n }, []);\n\n const setPageLoading = useCallback((loading: boolean) => {\n setPageLoadingState(loading);\n }, []);\n\n const value = useMemo(\n () => ({\n meta,\n setPageMeta,\n pageLoading,\n setPageLoading,\n }),\n [meta, setPageMeta, pageLoading, setPageLoading],\n );\n\n return <PageShellContext.Provider value={value}>{children}</PageShellContext.Provider>;\n}\n"],"names":["EMPTY_META","PageShellContext","createContext","usePageShell","useContext","usePageShellLoading","spinning","setPageLoading","useEffect","PageShellProvider","children","meta","setMeta","useState","pageLoading","setPageLoadingState","setPageMeta","useCallback","next","loading","value","useMemo","jsx"],"mappings":";;AAgBA,MAAMA,IAA4B,CAAA,GAE5BC,IAAmBC,EAAqC;AAAA,EAC5D,MAAMF;AAAA,EACN,aAAa,MAAM;AAAA,EAAC;AAAA,EACpB,aAAa;AAAA,EACb,gBAAgB,MAAM;AAAA,EAAC;AACzB,CAAC;AAEM,SAASG,IAAe;AAC7B,SAAOC,EAAWH,CAAgB;AACpC;AAGO,SAASI,EAAoBC,GAAmB;AACrD,QAAM,EAAE,gBAAAC,EAAA,IAAmBJ,EAAA;AAC3B,EAAAK,EAAU,OACRD,EAAeD,CAAQ,GAChB,MAAMC,EAAe,EAAK,IAChC,CAACD,GAAUC,CAAc,CAAC;AAC/B;AAMO,SAASE,EAAkB,EAAE,UAAAC,KAAoC;AACtE,QAAM,CAACC,GAAMC,CAAO,IAAIC,EAAwBb,CAAU,GACpD,CAACc,GAAaC,CAAmB,IAAIF,EAAS,EAAK,GAEnDG,IAAcC,EAAY,CAACC,MAAwB;AACvD,IAAAN,EAAQM,CAAI;AAAA,EACd,GAAG,CAAA,CAAE,GAECX,IAAiBU,EAAY,CAACE,MAAqB;AACvD,IAAAJ,EAAoBI,CAAO;AAAA,EAC7B,GAAG,CAAA,CAAE,GAECC,IAAQC;AAAA,IACZ,OAAO;AAAA,MACL,MAAAV;AAAA,MACA,aAAAK;AAAA,MACA,aAAAF;AAAA,MACA,gBAAAP;AAAA,IAAA;AAAA,IAEF,CAACI,GAAMK,GAAaF,GAAaP,CAAc;AAAA,EAAA;AAGjD,SAAO,gBAAAe,EAACrB,EAAiB,UAAjB,EAA0B,OAAAmB,GAAe,UAAAV,EAAA,CAAS;AAC5D;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export type PageSpinProps = {
|
|
3
|
+
spinning: boolean;
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
className?: string;
|
|
6
|
+
};
|
|
7
|
+
/** 模块页 body 区整页 Spin:参与 flex 高度链,遮罩 Filter + 主工作区 */
|
|
8
|
+
declare const PageSpin: React.FC<PageSpinProps>;
|
|
9
|
+
export default PageSpin;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx as m } from "react/jsx-runtime";
|
|
2
|
+
import { Spin as o } from "antd";
|
|
3
|
+
import a from "classnames";
|
|
4
|
+
import e from "./style.module.scss.js";
|
|
5
|
+
const n = ({ spinning: p, children: r, className: s }) => /* @__PURE__ */ m(o, { spinning: p, wrapperClassName: a(e["page-spin"], s), children: r });
|
|
6
|
+
export {
|
|
7
|
+
n as default
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/Layout/PageSpin/index.tsx"],"sourcesContent":["import { Spin } from 'antd';\nimport classNames from 'classnames';\nimport type { ReactNode } from 'react';\nimport styles from './style.module.scss';\n\nexport type PageSpinProps = {\n spinning: boolean;\n children: ReactNode;\n className?: string;\n};\n\n/** 模块页 body 区整页 Spin:参与 flex 高度链,遮罩 Filter + 主工作区 */\nconst PageSpin: React.FC<PageSpinProps> = ({ spinning, children, className }) => (\n <Spin spinning={spinning} wrapperClassName={classNames(styles['page-spin'], className)}>\n {children}\n </Spin>\n);\n\nexport default PageSpin;\n"],"names":["PageSpin","spinning","children","className","jsx","Spin","classNames","styles"],"mappings":";;;;AAYA,MAAMA,IAAoC,CAAC,EAAE,UAAAC,GAAU,UAAAC,GAAU,WAAAC,QAC/D,gBAAAC,EAACC,GAAA,EAAK,UAAAJ,GAAoB,kBAAkBK,EAAWC,EAAO,WAAW,GAAGJ,CAAS,GAClF,UAAAD,EAAA,CACH;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
|