@lobehub/ui 5.61.0 → 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.
- package/es/base-ui/Input/style.d.mts +1 -1
- package/es/base-ui/ProTable/ColumnSetting.mjs +156 -0
- package/es/base-ui/ProTable/ColumnSetting.mjs.map +1 -0
- package/es/base-ui/ProTable/FieldControl.mjs +108 -0
- package/es/base-ui/ProTable/FieldControl.mjs.map +1 -0
- package/es/base-ui/ProTable/LightFilter.mjs +71 -0
- package/es/base-ui/ProTable/LightFilter.mjs.map +1 -0
- package/es/base-ui/ProTable/OptionPopover.mjs +21 -0
- package/es/base-ui/ProTable/OptionPopover.mjs.map +1 -0
- package/es/base-ui/ProTable/ProTable.d.mts +13 -0
- package/es/base-ui/ProTable/ProTable.mjs +651 -0
- package/es/base-ui/ProTable/ProTable.mjs.map +1 -0
- package/es/base-ui/ProTable/SearchForm.mjs +138 -0
- package/es/base-ui/ProTable/SearchForm.mjs.map +1 -0
- package/es/base-ui/ProTable/index.d.mts +3 -0
- package/es/base-ui/ProTable/index.mjs +1 -0
- package/es/base-ui/ProTable/renderValue.mjs +118 -0
- package/es/base-ui/ProTable/renderValue.mjs.map +1 -0
- package/es/base-ui/ProTable/style.mjs +373 -0
- package/es/base-ui/ProTable/style.mjs.map +1 -0
- package/es/base-ui/ProTable/type.d.mts +343 -0
- package/es/base-ui/ProTable/useFetchData.mjs +98 -0
- package/es/base-ui/ProTable/useFetchData.mjs.map +1 -0
- package/es/base-ui/ProTable/useSearchForm.mjs +151 -0
- package/es/base-ui/ProTable/useSearchForm.mjs.map +1 -0
- package/es/base-ui/ProTable/utils.mjs +102 -0
- package/es/base-ui/ProTable/utils.mjs.map +1 -0
- package/es/base-ui/Select/Select.mjs +15 -8
- package/es/base-ui/Select/Select.mjs.map +1 -1
- package/es/base-ui/Select/helpers.mjs +8 -1
- package/es/base-ui/Select/helpers.mjs.map +1 -1
- package/es/base-ui/Table/Table.mjs +6 -2
- package/es/base-ui/Table/Table.mjs.map +1 -1
- package/es/base-ui/Text/style.d.mts +1 -1
- package/es/dashboard/ConsoleShell/style.mjs +3 -1
- package/es/dashboard/ConsoleShell/style.mjs.map +1 -1
- package/es/dashboard/MetricStrip/MetricCell.mjs +25 -14
- package/es/dashboard/MetricStrip/MetricCell.mjs.map +1 -1
- package/es/dashboard/MetricStrip/style.mjs +14 -0
- package/es/dashboard/MetricStrip/style.mjs.map +1 -1
- package/es/dashboard/MetricStrip/type.d.mts +2 -0
- package/es/dashboard/StatCard/StatCard.d.mts +1 -1
- package/es/dashboard/StatCard/StatCard.mjs +2 -1
- package/es/dashboard/StatCard/StatCard.mjs.map +1 -1
- package/es/dashboard/StatCard/type.d.mts +2 -0
- package/es/dashboard/Surface/style.d.mts +3 -2
- package/es/dashboard/Surface/style.mjs +7 -3
- package/es/dashboard/Surface/style.mjs.map +1 -1
- package/package.json +5 -1
|
@@ -30,7 +30,7 @@ declare const styles: {
|
|
|
30
30
|
};
|
|
31
31
|
declare const rootVariants: (props?: ({
|
|
32
32
|
shadow?: boolean | null | undefined;
|
|
33
|
-
size?: "
|
|
33
|
+
size?: "large" | "middle" | "small" | null | undefined;
|
|
34
34
|
variant?: "filled" | "outlined" | "borderless" | null | undefined;
|
|
35
35
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
36
36
|
//#endregion
|
|
@@ -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
|