@lobehub/ui 5.61.1 → 5.62.0

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.
Files changed (44) hide show
  1. package/es/base-ui/ProTable/ColumnSetting.mjs +156 -0
  2. package/es/base-ui/ProTable/ColumnSetting.mjs.map +1 -0
  3. package/es/base-ui/ProTable/FieldControl.mjs +108 -0
  4. package/es/base-ui/ProTable/FieldControl.mjs.map +1 -0
  5. package/es/base-ui/ProTable/LightFilter.mjs +71 -0
  6. package/es/base-ui/ProTable/LightFilter.mjs.map +1 -0
  7. package/es/base-ui/ProTable/OptionPopover.mjs +21 -0
  8. package/es/base-ui/ProTable/OptionPopover.mjs.map +1 -0
  9. package/es/base-ui/ProTable/ProTable.d.mts +13 -0
  10. package/es/base-ui/ProTable/ProTable.mjs +651 -0
  11. package/es/base-ui/ProTable/ProTable.mjs.map +1 -0
  12. package/es/base-ui/ProTable/SearchForm.mjs +138 -0
  13. package/es/base-ui/ProTable/SearchForm.mjs.map +1 -0
  14. package/es/base-ui/ProTable/index.d.mts +3 -0
  15. package/es/base-ui/ProTable/index.mjs +1 -0
  16. package/es/base-ui/ProTable/renderValue.mjs +118 -0
  17. package/es/base-ui/ProTable/renderValue.mjs.map +1 -0
  18. package/es/base-ui/ProTable/style.mjs +373 -0
  19. package/es/base-ui/ProTable/style.mjs.map +1 -0
  20. package/es/base-ui/ProTable/type.d.mts +343 -0
  21. package/es/base-ui/ProTable/useFetchData.mjs +98 -0
  22. package/es/base-ui/ProTable/useFetchData.mjs.map +1 -0
  23. package/es/base-ui/ProTable/useSearchForm.mjs +151 -0
  24. package/es/base-ui/ProTable/useSearchForm.mjs.map +1 -0
  25. package/es/base-ui/ProTable/utils.mjs +102 -0
  26. package/es/base-ui/ProTable/utils.mjs.map +1 -0
  27. package/es/base-ui/Table/Table.mjs +6 -2
  28. package/es/base-ui/Table/Table.mjs.map +1 -1
  29. package/es/base-ui/Text/style.d.mts +1 -1
  30. package/es/dashboard/ConsoleShell/style.mjs +3 -1
  31. package/es/dashboard/ConsoleShell/style.mjs.map +1 -1
  32. package/es/dashboard/MetricStrip/MetricCell.mjs +25 -14
  33. package/es/dashboard/MetricStrip/MetricCell.mjs.map +1 -1
  34. package/es/dashboard/MetricStrip/style.mjs +14 -0
  35. package/es/dashboard/MetricStrip/style.mjs.map +1 -1
  36. package/es/dashboard/MetricStrip/type.d.mts +2 -0
  37. package/es/dashboard/StatCard/StatCard.d.mts +1 -1
  38. package/es/dashboard/StatCard/StatCard.mjs +2 -1
  39. package/es/dashboard/StatCard/StatCard.mjs.map +1 -1
  40. package/es/dashboard/StatCard/type.d.mts +2 -0
  41. package/es/dashboard/Surface/style.d.mts +3 -2
  42. package/es/dashboard/Surface/style.mjs +7 -3
  43. package/es/dashboard/Surface/style.mjs.map +1 -1
  44. package/package.json +5 -1
@@ -0,0 +1,156 @@
1
+ import Button from "../Button/Button.mjs";
2
+ import ActionIcon from "../ActionIcon/ActionIcon.mjs";
3
+ import Checkbox_default from "../Checkbox/Checkbox.mjs";
4
+ import { styles } from "./style.mjs";
5
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
+ import { ArrowDown, ArrowLeftToLine, ArrowRightToLine, ArrowUp, PinOff } from "lucide-react";
7
+ //#region src/base-ui/ProTable/ColumnSetting.tsx
8
+ const fixedGroupOf = (fixed) => {
9
+ if (fixed === true || fixed === "left" || fixed === "start") return "start";
10
+ if (fixed === "right" || fixed === "end") return "end";
11
+ return "none";
12
+ };
13
+ /** Toolbar "column setting" panel (rendered in an `OptionPopover`): show / hide, pin to start / end, reorder, reset. */
14
+ const ColumnSetting = ({ checkable = true, columns, draggable = true, locale, onChange, onReset, showListItemOption = true, state }) => {
15
+ const isShown = (key) => state[key]?.show !== false;
16
+ const toggleable = columns.filter((column) => !column.disabled);
17
+ const shownCount = toggleable.filter((column) => isShown(column.key)).length;
18
+ const patch = (key, value) => onChange({
19
+ ...state,
20
+ [key]: {
21
+ ...state[key],
22
+ ...value
23
+ }
24
+ });
25
+ const setAll = (show) => {
26
+ const next = { ...state };
27
+ toggleable.forEach(({ key }) => {
28
+ next[key] = {
29
+ ...next[key],
30
+ show
31
+ };
32
+ });
33
+ onChange(next);
34
+ };
35
+ const groups = {
36
+ end: [],
37
+ none: [],
38
+ start: []
39
+ };
40
+ columns.forEach((column) => groups[fixedGroupOf(state[column.key]?.fixed)].push(column));
41
+ const move = (key, delta) => {
42
+ const keys = columns.map((column) => column.key);
43
+ const from = keys.indexOf(key);
44
+ const to = from + delta;
45
+ if (from < 0 || to < 0 || to >= keys.length) return;
46
+ [keys[from], keys[to]] = [keys[to], keys[from]];
47
+ const next = { ...state };
48
+ keys.forEach((k, order) => {
49
+ next[k] = {
50
+ ...next[k],
51
+ order
52
+ };
53
+ });
54
+ onChange(next);
55
+ };
56
+ const renderItem = (column, group) => {
57
+ const position = columns.indexOf(column);
58
+ return /* @__PURE__ */ jsxs("div", {
59
+ className: styles.settingItem,
60
+ "data-column-key": column.key,
61
+ children: [
62
+ checkable ? /* @__PURE__ */ jsx(Checkbox_default, {
63
+ checked: isShown(column.key),
64
+ disabled: column.disabled,
65
+ onChange: (checked) => patch(column.key, { show: checked }),
66
+ children: /* @__PURE__ */ jsx("span", {
67
+ className: styles.settingItemTitle,
68
+ children: column.title
69
+ })
70
+ }) : /* @__PURE__ */ jsx("span", {
71
+ className: styles.settingItemTitle,
72
+ children: column.title
73
+ }),
74
+ /* @__PURE__ */ jsx("span", { style: { flex: 1 } }),
75
+ /* @__PURE__ */ jsxs("span", {
76
+ className: styles.settingItemActions,
77
+ "data-setting-actions": "",
78
+ children: [
79
+ showListItemOption && group !== "start" && /* @__PURE__ */ jsx(ActionIcon, {
80
+ "aria-label": locale.fixedStart,
81
+ icon: ArrowLeftToLine,
82
+ size: "small",
83
+ onClick: () => patch(column.key, { fixed: "start" })
84
+ }),
85
+ showListItemOption && group !== "none" && /* @__PURE__ */ jsx(ActionIcon, {
86
+ "aria-label": locale.noFixed,
87
+ icon: PinOff,
88
+ size: "small",
89
+ onClick: () => patch(column.key, { fixed: void 0 })
90
+ }),
91
+ showListItemOption && group !== "end" && /* @__PURE__ */ jsx(ActionIcon, {
92
+ "aria-label": locale.fixedEnd,
93
+ icon: ArrowRightToLine,
94
+ size: "small",
95
+ onClick: () => patch(column.key, { fixed: "end" })
96
+ }),
97
+ draggable && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(ActionIcon, {
98
+ "aria-label": locale.moveUp,
99
+ disabled: position === 0,
100
+ icon: ArrowUp,
101
+ size: "small",
102
+ onClick: () => move(column.key, -1)
103
+ }), /* @__PURE__ */ jsx(ActionIcon, {
104
+ "aria-label": locale.moveDown,
105
+ disabled: position === columns.length - 1,
106
+ icon: ArrowDown,
107
+ size: "small",
108
+ onClick: () => move(column.key, 1)
109
+ })] })
110
+ ]
111
+ })
112
+ ]
113
+ }, column.key);
114
+ };
115
+ const titles = {
116
+ end: locale.fixedEndTitle,
117
+ none: locale.unfixedTitle,
118
+ start: locale.fixedStartTitle
119
+ };
120
+ const pinnedAny = groups.start.length > 0 || groups.end.length > 0;
121
+ return /* @__PURE__ */ jsxs("div", {
122
+ className: styles.setting,
123
+ "data-pro-table-setting": "",
124
+ children: [/* @__PURE__ */ jsxs("div", {
125
+ className: styles.settingHeader,
126
+ children: [checkable ? /* @__PURE__ */ jsx(Checkbox_default, {
127
+ checked: shownCount > 0 && shownCount === toggleable.length,
128
+ indeterminate: shownCount > 0 && shownCount < toggleable.length,
129
+ onChange: (checked) => setAll(checked),
130
+ children: locale.columnSettingTitle
131
+ }) : /* @__PURE__ */ jsx("span", { children: locale.columnSettingTitle }), /* @__PURE__ */ jsx(Button, {
132
+ size: "small",
133
+ type: "link",
134
+ onClick: onReset,
135
+ children: locale.columnSettingReset
136
+ })]
137
+ }), /* @__PURE__ */ jsx("div", {
138
+ className: styles.settingList,
139
+ children: [
140
+ "start",
141
+ "none",
142
+ "end"
143
+ ].map((group) => groups[group].length === 0 ? null : /* @__PURE__ */ jsxs("div", {
144
+ "data-group": group,
145
+ children: [pinnedAny && /* @__PURE__ */ jsx("div", {
146
+ className: styles.settingGroupTitle,
147
+ children: titles[group]
148
+ }), groups[group].map((column) => renderItem(column, group))]
149
+ }, group))
150
+ })]
151
+ });
152
+ };
153
+ //#endregion
154
+ export { ColumnSetting as default, fixedGroupOf };
155
+
156
+ //# sourceMappingURL=ColumnSetting.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColumnSetting.mjs","names":["Checkbox"],"sources":["../../../src/base-ui/ProTable/ColumnSetting.tsx"],"sourcesContent":["import { ArrowDown, ArrowLeftToLine, ArrowRightToLine, ArrowUp, PinOff } from 'lucide-react';\nimport { type ReactNode } from 'react';\n\nimport ActionIcon from '@/base-ui/ActionIcon';\nimport Button from '@/base-ui/Button';\nimport Checkbox from '@/base-ui/Checkbox/Checkbox';\n\nimport { styles } from './style';\nimport type { ProTableColumnsStateItem, ProTableColumnsStateMap, ProTableLocale } from './type';\n\nexport interface SettingColumn {\n disabled: boolean;\n key: string;\n title: ReactNode;\n}\n\ntype FixedGroup = 'start' | 'none' | 'end';\n\nexport const fixedGroupOf = (fixed: ProTableColumnsStateItem['fixed']): FixedGroup => {\n if (fixed === true || fixed === 'left' || fixed === 'start') return 'start';\n if (fixed === 'right' || fixed === 'end') return 'end';\n return 'none';\n};\n\nexport interface ColumnSettingProps {\n checkable?: boolean;\n columns: SettingColumn[];\n draggable?: boolean;\n locale: Required<\n Pick<\n ProTableLocale,\n | 'columnSetting'\n | 'columnSettingReset'\n | 'columnSettingTitle'\n | 'fixedEnd'\n | 'fixedEndTitle'\n | 'fixedStart'\n | 'fixedStartTitle'\n | 'moveDown'\n | 'moveUp'\n | 'noFixed'\n | 'unfixedTitle'\n >\n >;\n onChange: (map: ProTableColumnsStateMap) => void;\n onReset: () => void;\n showListItemOption?: boolean;\n state: ProTableColumnsStateMap;\n}\n\n/** Toolbar \"column setting\" panel (rendered in an `OptionPopover`): show / hide, pin to start / end, reorder, reset. */\nconst ColumnSetting = ({\n checkable = true,\n columns,\n draggable = true,\n locale,\n onChange,\n onReset,\n showListItemOption = true,\n state,\n}: ColumnSettingProps) => {\n const isShown = (key: string) => state[key]?.show !== false;\n const toggleable = columns.filter((column) => !column.disabled);\n const shownCount = toggleable.filter((column) => isShown(column.key)).length;\n\n const patch = (key: string, value: Partial<ProTableColumnsStateItem>) =>\n onChange({ ...state, [key]: { ...state[key], ...value } });\n\n const setAll = (show: boolean) => {\n const next = { ...state };\n toggleable.forEach(({ key }) => {\n next[key] = { ...next[key], show };\n });\n onChange(next);\n };\n\n const groups: Record<FixedGroup, SettingColumn[]> = { end: [], none: [], start: [] };\n columns.forEach((column) => groups[fixedGroupOf(state[column.key]?.fixed)].push(column));\n\n // Reorder within the full list; `order` is rewritten for every column so it stays dense.\n const move = (key: string, delta: -1 | 1) => {\n const keys = columns.map((column) => column.key);\n const from = keys.indexOf(key);\n const to = from + delta;\n if (from < 0 || to < 0 || to >= keys.length) return;\n [keys[from], keys[to]] = [keys[to], keys[from]];\n const next = { ...state };\n keys.forEach((k, order) => {\n next[k] = { ...next[k], order };\n });\n onChange(next);\n };\n\n const renderItem = (column: SettingColumn, group: FixedGroup) => {\n const position = columns.indexOf(column);\n return (\n <div className={styles.settingItem} data-column-key={column.key} key={column.key}>\n {checkable ? (\n <Checkbox\n checked={isShown(column.key)}\n disabled={column.disabled}\n onChange={(checked) => patch(column.key, { show: checked })}\n >\n <span className={styles.settingItemTitle}>{column.title}</span>\n </Checkbox>\n ) : (\n <span className={styles.settingItemTitle}>{column.title}</span>\n )}\n <span style={{ flex: 1 }} />\n <span className={styles.settingItemActions} data-setting-actions=\"\">\n {showListItemOption && group !== 'start' && (\n <ActionIcon\n aria-label={locale.fixedStart}\n icon={ArrowLeftToLine}\n size=\"small\"\n onClick={() => patch(column.key, { fixed: 'start' })}\n />\n )}\n {showListItemOption && group !== 'none' && (\n <ActionIcon\n aria-label={locale.noFixed}\n icon={PinOff}\n size=\"small\"\n onClick={() => patch(column.key, { fixed: undefined })}\n />\n )}\n {showListItemOption && group !== 'end' && (\n <ActionIcon\n aria-label={locale.fixedEnd}\n icon={ArrowRightToLine}\n size=\"small\"\n onClick={() => patch(column.key, { fixed: 'end' })}\n />\n )}\n {draggable && (\n <>\n <ActionIcon\n aria-label={locale.moveUp}\n disabled={position === 0}\n icon={ArrowUp}\n size=\"small\"\n onClick={() => move(column.key, -1)}\n />\n <ActionIcon\n aria-label={locale.moveDown}\n disabled={position === columns.length - 1}\n icon={ArrowDown}\n size=\"small\"\n onClick={() => move(column.key, 1)}\n />\n </>\n )}\n </span>\n </div>\n );\n };\n\n const titles: Record<FixedGroup, ReactNode> = {\n end: locale.fixedEndTitle,\n none: locale.unfixedTitle,\n start: locale.fixedStartTitle,\n };\n const pinnedAny = groups.start.length > 0 || groups.end.length > 0;\n\n const panel = (\n <div className={styles.setting} data-pro-table-setting=\"\">\n <div className={styles.settingHeader}>\n {checkable ? (\n <Checkbox\n checked={shownCount > 0 && shownCount === toggleable.length}\n indeterminate={shownCount > 0 && shownCount < toggleable.length}\n onChange={(checked) => setAll(checked)}\n >\n {locale.columnSettingTitle}\n </Checkbox>\n ) : (\n <span>{locale.columnSettingTitle}</span>\n )}\n <Button size=\"small\" type=\"link\" onClick={onReset}>\n {locale.columnSettingReset}\n </Button>\n </div>\n <div className={styles.settingList}>\n {(['start', 'none', 'end'] as FixedGroup[]).map((group) =>\n groups[group].length === 0 ? null : (\n <div data-group={group} key={group}>\n {pinnedAny && <div className={styles.settingGroupTitle}>{titles[group]}</div>}\n {groups[group].map((column) => renderItem(column, group))}\n </div>\n ),\n )}\n </div>\n </div>\n );\n\n return panel;\n};\n\nexport default ColumnSetting;\n"],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ import Switch from "../Switch/Switch.mjs";
2
+ import Input_default from "../Input/Input.mjs";
3
+ import InputNumber_default from "../Input/InputNumber.mjs";
4
+ import Select from "../Select/Select.mjs";
5
+ import DatePicker from "../DatePicker/DatePicker.mjs";
6
+ import DateRangePicker from "../DatePicker/DateRangePicker.mjs";
7
+ import { resolveValueEnum, resolveValueType, valueEnumToList } from "./utils.mjs";
8
+ import { jsx } from "react/jsx-runtime";
9
+ import { useThemeMode } from "antd-style";
10
+ //#region src/base-ui/ProTable/FieldControl.tsx
11
+ const SELECT_TYPES = /* @__PURE__ */ new Set([
12
+ "select",
13
+ "radio",
14
+ "checkbox"
15
+ ]);
16
+ /** The search-form control of a column (Pro "edit" mode, query flavor). */
17
+ const FieldControl = ({ column, form, light, onChange, placeholder, value }) => {
18
+ const valueType = resolveValueType(column) ?? "text";
19
+ const valueEnum = resolveValueEnum(column);
20
+ const { fieldProps = {} } = column;
21
+ const label = typeof column.title === "string" ? column.title : void 0;
22
+ const size = light ? "small" : void 0;
23
+ const { isDarkMode } = useThemeMode();
24
+ const variant = light ? isDarkMode ? "filled" : "outlined" : void 0;
25
+ if (column.renderFormItem) return column.renderFormItem(column, {
26
+ form,
27
+ isQuery: !light,
28
+ onChange,
29
+ value
30
+ }, form);
31
+ if (valueEnum || SELECT_TYPES.has(valueType)) {
32
+ const options = fieldProps.options ?? valueEnumToList(valueEnum).map((item) => ({
33
+ disabled: item.disabled,
34
+ label: item.text,
35
+ value: item.value
36
+ }));
37
+ return /* @__PURE__ */ jsx(Select, {
38
+ allowClear: true,
39
+ mode: valueType === "checkbox" ? "multiple" : void 0,
40
+ options,
41
+ placeholder: light ? label : placeholder.select,
42
+ size,
43
+ style: { width: "100%" },
44
+ value: value ?? (valueType === "checkbox" ? [] : null),
45
+ variant,
46
+ ...fieldProps,
47
+ onChange: (next) => onChange(next ?? void 0)
48
+ });
49
+ }
50
+ switch (valueType) {
51
+ case "digit":
52
+ case "money":
53
+ case "percent":
54
+ case "progress": return /* @__PURE__ */ jsx(InputNumber_default, {
55
+ placeholder: light ? label : placeholder.input,
56
+ size,
57
+ style: { width: "100%" },
58
+ value: value ?? null,
59
+ variant,
60
+ ...fieldProps,
61
+ onChange: (next) => onChange(next ?? void 0)
62
+ });
63
+ case "switch": return /* @__PURE__ */ jsx(Switch, {
64
+ checked: !!value,
65
+ ...fieldProps,
66
+ onChange: (next) => onChange(next)
67
+ });
68
+ case "date":
69
+ case "dateTime": return /* @__PURE__ */ jsx(DatePicker, {
70
+ allowClear: true,
71
+ placeholder: light ? label : placeholder.select,
72
+ size,
73
+ style: { width: "100%" },
74
+ value: value ?? null,
75
+ variant,
76
+ ...fieldProps,
77
+ onChange: (next) => onChange(next ?? void 0)
78
+ });
79
+ case "dateRange":
80
+ case "dateTimeRange": return /* @__PURE__ */ jsx(DateRangePicker, {
81
+ allowClear: true,
82
+ size,
83
+ style: { width: "100%" },
84
+ value: value ?? [null, null],
85
+ variant,
86
+ ...fieldProps,
87
+ onChange: (next) => onChange(next && (next[0] || next[1]) ? next : void 0)
88
+ });
89
+ default: return /* @__PURE__ */ jsx(Input_default, {
90
+ allowClear: true,
91
+ placeholder: light ? label : placeholder.input,
92
+ size,
93
+ type: valueType === "password" ? "password" : void 0,
94
+ value: value ?? "",
95
+ variant,
96
+ ...fieldProps,
97
+ onChange: (event) => onChange(event.target.value === "" ? void 0 : event.target.value),
98
+ onClear: () => {
99
+ onChange(void 0);
100
+ fieldProps.onClear?.();
101
+ }
102
+ });
103
+ }
104
+ };
105
+ //#endregion
106
+ export { FieldControl as default };
107
+
108
+ //# sourceMappingURL=FieldControl.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldControl.mjs","names":["InputNumber","Input"],"sources":["../../../src/base-ui/ProTable/FieldControl.tsx"],"sourcesContent":["import { useThemeMode } from 'antd-style';\nimport { type ReactNode } from 'react';\n\nimport DatePicker from '@/base-ui/DatePicker/DatePicker';\nimport DateRangePicker from '@/base-ui/DatePicker/DateRangePicker';\nimport Input from '@/base-ui/Input/Input';\nimport InputNumber from '@/base-ui/Input/InputNumber';\nimport Select from '@/base-ui/Select';\nimport Switch from '@/base-ui/Switch';\n\nimport type { ProColumnType, ProTableFormInstance, ProTableValueType } from './type';\nimport { resolveValueEnum, resolveValueType, valueEnumToList } from './utils';\n\nexport interface FieldControlProps {\n column: ProColumnType<any>;\n form: ProTableFormInstance;\n /** Light filter bar: small controls, outlined in light mode and filled in dark mode. */\n light?: boolean;\n onChange: (value: any) => void;\n placeholder: { input: string; select: string };\n value: any;\n}\n\nconst SELECT_TYPES = new Set<ProTableValueType>(['select', 'radio', 'checkbox']);\n\n/** The search-form control of a column (Pro \"edit\" mode, query flavor). */\nconst FieldControl = ({ column, form, light, onChange, placeholder, value }: FieldControlProps) => {\n const valueType = resolveValueType(column) ?? 'text';\n const valueEnum = resolveValueEnum(column);\n const { fieldProps = {} } = column;\n const label = typeof column.title === 'string' ? column.title : undefined;\n const size = light ? 'small' : undefined;\n const { isDarkMode } = useThemeMode();\n // Light filter: outlined on light backgrounds, filled in dark mode.\n const variant = light ? (isDarkMode ? 'filled' : 'outlined') : undefined;\n\n if (column.renderFormItem) {\n return column.renderFormItem(\n column,\n { form, isQuery: !light, onChange, value },\n form,\n ) as ReactNode;\n }\n\n if (valueEnum || SELECT_TYPES.has(valueType)) {\n const options =\n fieldProps.options ??\n valueEnumToList(valueEnum).map((item) => ({\n disabled: item.disabled,\n label: item.text,\n value: item.value,\n }));\n return (\n <Select\n allowClear\n mode={valueType === 'checkbox' ? 'multiple' : undefined}\n options={options}\n placeholder={light ? label : placeholder.select}\n size={size}\n style={{ width: '100%' }}\n value={value ?? (valueType === 'checkbox' ? [] : null)}\n variant={variant}\n {...fieldProps}\n onChange={(next) => onChange(next ?? undefined)}\n />\n );\n }\n\n switch (valueType) {\n case 'digit':\n case 'money':\n case 'percent':\n case 'progress': {\n return (\n <InputNumber\n placeholder={light ? label : placeholder.input}\n size={size}\n style={{ width: '100%' }}\n value={value ?? null}\n variant={variant}\n {...fieldProps}\n onChange={(next) => onChange(next ?? undefined)}\n />\n );\n }\n case 'switch': {\n return <Switch checked={!!value} {...fieldProps} onChange={(next) => onChange(next)} />;\n }\n case 'date':\n case 'dateTime': {\n return (\n <DatePicker\n allowClear\n placeholder={light ? label : placeholder.select}\n size={size}\n style={{ width: '100%' }}\n value={value ?? null}\n variant={variant}\n {...fieldProps}\n onChange={(next) => onChange(next ?? undefined)}\n />\n );\n }\n case 'dateRange':\n case 'dateTimeRange': {\n return (\n <DateRangePicker\n allowClear\n size={size}\n style={{ width: '100%' }}\n value={value ?? [null, null]}\n variant={variant}\n {...fieldProps}\n onChange={(next) => onChange(next && (next[0] || next[1]) ? next : undefined)}\n />\n );\n }\n default: {\n return (\n <Input\n allowClear\n placeholder={light ? label : placeholder.input}\n size={size}\n type={valueType === 'password' ? 'password' : undefined}\n value={value ?? ''}\n variant={variant}\n {...fieldProps}\n onChange={(event) => onChange(event.target.value === '' ? undefined : event.target.value)}\n onClear={() => {\n onChange(undefined);\n fieldProps.onClear?.();\n }}\n />\n );\n }\n }\n};\n\nexport default FieldControl;\n"],"mappings":";;;;;;;;;;AAuBA,MAAM,+BAAe,IAAI,IAAuB;CAAC;CAAU;CAAS;AAAU,CAAC;;AAG/E,MAAM,gBAAgB,EAAE,QAAQ,MAAM,OAAO,UAAU,aAAa,YAA+B;CACjG,MAAM,YAAY,iBAAiB,MAAM,KAAK;CAC9C,MAAM,YAAY,iBAAiB,MAAM;CACzC,MAAM,EAAE,aAAa,CAAC,MAAM;CAC5B,MAAM,QAAQ,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ,KAAA;CAChE,MAAM,OAAO,QAAQ,UAAU,KAAA;CAC/B,MAAM,EAAE,eAAe,aAAa;CAEpC,MAAM,UAAU,QAAS,aAAa,WAAW,aAAc,KAAA;CAE/D,IAAI,OAAO,gBACT,OAAO,OAAO,eACZ,QACA;EAAE;EAAM,SAAS,CAAC;EAAO;EAAU;CAAM,GACzC,IACF;CAGF,IAAI,aAAa,aAAa,IAAI,SAAS,GAAG;EAC5C,MAAM,UACJ,WAAW,WACX,gBAAgB,SAAS,CAAC,CAAC,KAAK,UAAU;GACxC,UAAU,KAAK;GACf,OAAO,KAAK;GACZ,OAAO,KAAK;EACd,EAAE;EACJ,OACE,oBAAC,QAAD;GACE,YAAA;GACA,MAAM,cAAc,aAAa,aAAa,KAAA;GACrC;GACT,aAAa,QAAQ,QAAQ,YAAY;GACnC;GACN,OAAO,EAAE,OAAO,OAAO;GACvB,OAAO,UAAU,cAAc,aAAa,CAAC,IAAI;GACxC;GACT,GAAI;GACJ,WAAW,SAAS,SAAS,QAAQ,KAAA,CAAS;EAC/C,CAAA;CAEL;CAEA,QAAQ,WAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,YACH,OACE,oBAACA,qBAAD;GACE,aAAa,QAAQ,QAAQ,YAAY;GACnC;GACN,OAAO,EAAE,OAAO,OAAO;GACvB,OAAO,SAAS;GACP;GACT,GAAI;GACJ,WAAW,SAAS,SAAS,QAAQ,KAAA,CAAS;EAC/C,CAAA;EAGL,KAAK,UACH,OAAO,oBAAC,QAAD;GAAQ,SAAS,CAAC,CAAC;GAAO,GAAI;GAAY,WAAW,SAAS,SAAS,IAAI;EAAI,CAAA;EAExF,KAAK;EACL,KAAK,YACH,OACE,oBAAC,YAAD;GACE,YAAA;GACA,aAAa,QAAQ,QAAQ,YAAY;GACnC;GACN,OAAO,EAAE,OAAO,OAAO;GACvB,OAAO,SAAS;GACP;GACT,GAAI;GACJ,WAAW,SAAS,SAAS,QAAQ,KAAA,CAAS;EAC/C,CAAA;EAGL,KAAK;EACL,KAAK,iBACH,OACE,oBAAC,iBAAD;GACE,YAAA;GACM;GACN,OAAO,EAAE,OAAO,OAAO;GACvB,OAAO,SAAS,CAAC,MAAM,IAAI;GAClB;GACT,GAAI;GACJ,WAAW,SAAS,SAAS,SAAS,KAAK,MAAM,KAAK,MAAM,OAAO,KAAA,CAAS;EAC7E,CAAA;EAGL,SACE,OACE,oBAACC,eAAD;GACE,YAAA;GACA,aAAa,QAAQ,QAAQ,YAAY;GACnC;GACN,MAAM,cAAc,aAAa,aAAa,KAAA;GAC9C,OAAO,SAAS;GACP;GACT,GAAI;GACJ,WAAW,UAAU,SAAS,MAAM,OAAO,UAAU,KAAK,KAAA,IAAY,MAAM,OAAO,KAAK;GACxF,eAAe;IACb,SAAS,KAAA,CAAS;IAClB,WAAW,UAAU;GACvB;EACD,CAAA;CAGP;AACF"}
@@ -0,0 +1,71 @@
1
+ import { Form } from "../FormKit/index.mjs";
2
+ import { styles } from "./style.mjs";
3
+ import FieldControl from "./FieldControl.mjs";
4
+ import { rulesToFieldProps } from "./useSearchForm.mjs";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/base-ui/ProTable/LightFilter.tsx
7
+ const TEXT_TYPES = /* @__PURE__ */ new Set([
8
+ "text",
9
+ "textarea",
10
+ "password",
11
+ "code"
12
+ ]);
13
+ /**
14
+ * Pro `LightFilter` (`search.filterType: 'light'`): the same base-ui Form instance rendered as
15
+ * bare inline fields in the toolbar; select-like fields query on change, text fields on Enter / clear.
16
+ */
17
+ const LightFilter = ({ fields, form, placeholder }) => /* @__PURE__ */ jsxs(Form, {
18
+ className: styles.lightFilter,
19
+ "data-pro-table-light-filter": "",
20
+ form,
21
+ variant: "borderless",
22
+ layout: "horizontal",
23
+ style: {
24
+ alignItems: "center",
25
+ display: "flex",
26
+ flex: "0 1 auto",
27
+ flexDirection: "row",
28
+ flexWrap: "wrap",
29
+ gap: 8,
30
+ minWidth: 0,
31
+ width: "auto"
32
+ },
33
+ children: [fields.map(({ column, name }) => {
34
+ const isText = !column.valueEnum && !column.renderFormItem && (!column.valueType || TEXT_TYPES.has(column.valueType));
35
+ const wrapped = isText ? {
36
+ ...column,
37
+ fieldProps: {
38
+ ...column.fieldProps,
39
+ onClear: () => void form.submit()
40
+ }
41
+ } : column;
42
+ const { required, validate } = rulesToFieldProps(column.formItemProps?.rules, column.formItemProps?.required);
43
+ return /* @__PURE__ */ jsx("div", {
44
+ className: styles.lightFilterItem,
45
+ children: /* @__PURE__ */ jsx(Form.Field, {
46
+ bare: true,
47
+ name,
48
+ required,
49
+ validate,
50
+ render: ({ value, onChange }) => /* @__PURE__ */ jsx(FieldControl, {
51
+ light: true,
52
+ column: wrapped,
53
+ form,
54
+ placeholder,
55
+ value,
56
+ onChange: (next) => {
57
+ onChange(next);
58
+ if (!isText) form.submit();
59
+ }
60
+ })
61
+ })
62
+ }, name);
63
+ }), /* @__PURE__ */ jsx("button", {
64
+ hidden: true,
65
+ type: "submit"
66
+ })]
67
+ });
68
+ //#endregion
69
+ export { LightFilter as default };
70
+
71
+ //# sourceMappingURL=LightFilter.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LightFilter.mjs","names":[],"sources":["../../../src/base-ui/ProTable/LightFilter.tsx"],"sourcesContent":["import Form from '@lobehub/ui/base-ui/form';\n\nimport FieldControl from './FieldControl';\nimport { styles } from './style';\nimport type { ProTableFormInstance } from './type';\nimport { rulesToFieldProps, type SearchFieldSchema } from './useSearchForm';\n\nexport interface LightFilterProps {\n fields: SearchFieldSchema[];\n form: ProTableFormInstance;\n placeholder: { input: string; select: string };\n}\n\nconst TEXT_TYPES = new Set(['text', 'textarea', 'password', 'code']);\n\n/**\n * Pro `LightFilter` (`search.filterType: 'light'`): the same base-ui Form instance rendered as\n * bare inline fields in the toolbar; select-like fields query on change, text fields on Enter / clear.\n */\nconst LightFilter = ({ fields, form, placeholder }: LightFilterProps) => (\n <Form\n className={styles.lightFilter}\n data-pro-table-light-filter=\"\"\n form={form}\n variant=\"borderless\"\n layout=\"horizontal\"\n // The base-ui Form root stacks its children; the light filter is one wrapping row.\n style={{\n alignItems: 'center',\n display: 'flex',\n flex: '0 1 auto',\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 8,\n minWidth: 0,\n width: 'auto',\n }}\n >\n {fields.map(({ column, name }) => {\n const isText =\n !column.valueEnum &&\n !column.renderFormItem &&\n (!column.valueType || TEXT_TYPES.has(column.valueType as string));\n const wrapped = isText\n ? {\n ...column,\n fieldProps: {\n ...column.fieldProps,\n onClear: () => void form.submit(),\n },\n }\n : column;\n const { required, validate } = rulesToFieldProps(\n column.formItemProps?.rules,\n column.formItemProps?.required,\n );\n return (\n <div className={styles.lightFilterItem} key={name}>\n <Form.Field\n bare\n name={name}\n required={required}\n validate={validate}\n render={({ value, onChange }) => (\n <FieldControl\n light\n column={wrapped}\n form={form}\n placeholder={placeholder}\n value={value}\n onChange={(next) => {\n onChange(next);\n if (!isText) void form.submit();\n }}\n />\n )}\n />\n </div>\n );\n })}\n {/* Text fields query on Enter through the native form submit. */}\n <button hidden type=\"submit\" />\n </Form>\n);\n\nexport default LightFilter;\n"],"mappings":";;;;;;AAaA,MAAM,6BAAa,IAAI,IAAI;CAAC;CAAQ;CAAY;CAAY;AAAM,CAAC;;;;;AAMnE,MAAM,eAAe,EAAE,QAAQ,MAAM,kBACnC,qBAAC,MAAD;CACE,WAAW,OAAO;CAClB,+BAA4B;CACtB;CACN,SAAQ;CACR,QAAO;CAEP,OAAO;EACL,YAAY;EACZ,SAAS;EACT,MAAM;EACN,eAAe;EACf,UAAU;EACV,KAAK;EACL,UAAU;EACV,OAAO;CACT;CAhBF,UAAA,CAkBG,OAAO,KAAK,EAAE,QAAQ,WAAW;EAChC,MAAM,SACJ,CAAC,OAAO,aACR,CAAC,OAAO,mBACP,CAAC,OAAO,aAAa,WAAW,IAAI,OAAO,SAAmB;EACjE,MAAM,UAAU,SACZ;GACE,GAAG;GACH,YAAY;IACV,GAAG,OAAO;IACV,eAAe,KAAK,KAAK,OAAO;GAClC;EACF,IACA;EACJ,MAAM,EAAE,UAAU,aAAa,kBAC7B,OAAO,eAAe,OACtB,OAAO,eAAe,QACxB;EACA,OACE,oBAAC,OAAD;GAAK,WAAW,OAAO;GACrB,UAAA,oBAAC,KAAK,OAAN;IACE,MAAA;IACM;IACI;IACA;IACV,SAAS,EAAE,OAAO,eAChB,oBAAC,cAAD;KACE,OAAA;KACA,QAAQ;KACF;KACO;KACN;KACP,WAAW,SAAS;MAClB,SAAS,IAAI;MACb,IAAI,CAAC,QAAQ,KAAU,OAAO;KAChC;IACD,CAAA;GAEJ,CAAA;EACE,GApBwC,IAoBxC;CAET,CAAC,GAED,oBAAC,UAAD;EAAQ,QAAA;EAAO,MAAK;CAAU,CAAA,CAC1B"}
@@ -0,0 +1,21 @@
1
+ import { PopoverPopup, PopoverPortal, PopoverPositioner, PopoverRoot } from "../Popover/atoms.mjs";
2
+ import { jsx } from "react/jsx-runtime";
3
+ //#region src/base-ui/ProTable/OptionPopover.tsx
4
+ /**
5
+ * A controlled popover anchored to an `ActionIconGroup` item. The group only renders plain
6
+ * buttons, so the density menu and column setting panel open from their click handlers.
7
+ */
8
+ const OptionPopover = ({ anchor, children, onOpenChange, open }) => /* @__PURE__ */ jsx(PopoverRoot, {
9
+ open: open && !!anchor,
10
+ onOpenChange: (next) => onOpenChange(next),
11
+ children: /* @__PURE__ */ jsx(PopoverPortal, { children: /* @__PURE__ */ jsx(PopoverPositioner, {
12
+ anchor,
13
+ placement: "bottomRight",
14
+ sideOffset: 4,
15
+ children: /* @__PURE__ */ jsx(PopoverPopup, { children })
16
+ }) })
17
+ });
18
+ //#endregion
19
+ export { OptionPopover as default };
20
+
21
+ //# sourceMappingURL=OptionPopover.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OptionPopover.mjs","names":[],"sources":["../../../src/base-ui/ProTable/OptionPopover.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\n\nimport { PopoverPopup, PopoverPortal, PopoverPositioner, PopoverRoot } from '@/base-ui/Popover';\n\nexport interface OptionPopoverProps {\n /** The toolbar icon that was clicked; the popup is positioned against it. */\n anchor: HTMLElement | null;\n children: ReactNode;\n onOpenChange: (open: boolean) => void;\n open: boolean;\n}\n\n/**\n * A controlled popover anchored to an `ActionIconGroup` item. The group only renders plain\n * buttons, so the density menu and column setting panel open from their click handlers.\n */\nconst OptionPopover = ({ anchor, children, onOpenChange, open }: OptionPopoverProps) => (\n <PopoverRoot open={open && !!anchor} onOpenChange={(next) => onOpenChange(next)}>\n <PopoverPortal>\n <PopoverPositioner anchor={anchor} placement=\"bottomRight\" sideOffset={4}>\n <PopoverPopup>{children}</PopoverPopup>\n </PopoverPositioner>\n </PopoverPortal>\n </PopoverRoot>\n);\n\nexport default OptionPopover;\n"],"mappings":";;;;;;;AAgBA,MAAM,iBAAiB,EAAE,QAAQ,UAAU,cAAc,WACvD,oBAAC,aAAD;CAAa,MAAM,QAAQ,CAAC,CAAC;CAAQ,eAAe,SAAS,aAAa,IAAI;CAC5E,UAAA,oBAAC,eAAD,EAAA,UACE,oBAAC,mBAAD;EAA2B;EAAQ,WAAU;EAAc,YAAY;EACrE,UAAA,oBAAC,cAAD,EAAe,SAAuB,CAAA;CACrB,CAAA,EACN,CAAA;AACJ,CAAA"}
@@ -0,0 +1,13 @@
1
+ import { ProTableLocale, ProTableProps } from "./type.mjs";
2
+ import { ReactNode } from "react";
3
+ //#region src/base-ui/ProTable/ProTable.d.ts
4
+ declare const DEFAULT_PRO_TABLE_LOCALE: Required<Omit<ProTableLocale, 'alertSelected'>> & {
5
+ alertSelected: (count: number) => ReactNode;
6
+ };
7
+ declare const ProTable: {
8
+ <T extends Record<string, any> = any, Params extends Record<string, any> = Record<string, any>>(props: ProTableProps<T, Params>): import("react").JSX.Element;
9
+ displayName: string;
10
+ };
11
+ //#endregion
12
+ export { DEFAULT_PRO_TABLE_LOCALE, ProTable as default };
13
+ //# sourceMappingURL=ProTable.d.mts.map