@startdownnotez404/ui 1.3.5 → 1.3.6
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/AutocompleteField-653233JU.mjs +203 -0
- package/dist/AutocompleteField-653233JU.mjs.map +1 -0
- package/dist/AvatarField-KFASMVZU.mjs +378 -0
- package/dist/AvatarField-KFASMVZU.mjs.map +1 -0
- package/dist/{DateField-ZYMZFHL4.mjs → DateField-CDJ6W6XF.mjs} +19 -7
- package/dist/DateField-CDJ6W6XF.mjs.map +1 -0
- package/dist/DateRangeField-ZWSFT5KV.mjs +118 -0
- package/dist/DateRangeField-ZWSFT5KV.mjs.map +1 -0
- package/dist/{DateTimeField-TPTJ7YIZ.mjs → DateTimeField-SFAF4I6A.mjs} +36 -11
- package/dist/DateTimeField-SFAF4I6A.mjs.map +1 -0
- package/dist/FileUploadField-TSNCSLXX.mjs +101 -0
- package/dist/FileUploadField-TSNCSLXX.mjs.map +1 -0
- package/dist/{JSONEditorField-TMRWGXVR.mjs → JSONEditorField-3KXC2GOG.mjs} +7 -6
- package/dist/{JSONEditorField-TMRWGXVR.mjs.map → JSONEditorField-3KXC2GOG.mjs.map} +1 -1
- package/dist/{PopperMenu-LJ36RPBW.mjs → PopperMenu-PSHLKIEZ.mjs} +26 -12
- package/dist/{PopperMenu-LJ36RPBW.mjs.map → PopperMenu-PSHLKIEZ.mjs.map} +1 -1
- package/dist/{TelField-LOGRVZ4I.mjs → TelField-FRQT2UBJ.mjs} +8 -7
- package/dist/{TelField-LOGRVZ4I.mjs.map → TelField-FRQT2UBJ.mjs.map} +1 -1
- package/dist/TimeField-XVWXBJID.mjs +94 -0
- package/dist/TimeField-XVWXBJID.mjs.map +1 -0
- package/dist/alert.d.mts +148 -18
- package/dist/alert.d.ts +148 -18
- package/dist/alert.js +698 -254
- package/dist/alert.js.map +1 -1
- package/dist/alert.mjs +46 -10
- package/dist/autocomplete.d.mts +438 -4
- package/dist/autocomplete.d.ts +438 -4
- package/dist/autocomplete.js +632 -21
- package/dist/autocomplete.js.map +1 -1
- package/dist/autocomplete.mjs +26 -7
- package/dist/avatar.js +2 -1
- package/dist/avatar.js.map +1 -1
- package/dist/avatar.mjs +12 -11
- package/dist/box.mjs +2 -1
- package/dist/button.mjs +3 -2
- package/dist/chart.mjs +3 -2
- package/dist/checkbox.mjs +3 -2
- package/dist/chunk-2FK24ZPJ.mjs +78 -0
- package/dist/chunk-2FK24ZPJ.mjs.map +1 -0
- package/dist/{chunk-V26V2S3W.mjs → chunk-3O3N6X6D.mjs} +3 -3
- package/dist/{chunk-Y74ALKBL.mjs → chunk-4MSPA7U7.mjs} +11 -9
- package/dist/{chunk-Y74ALKBL.mjs.map → chunk-4MSPA7U7.mjs.map} +1 -1
- package/dist/{chunk-24XDGNJ6.mjs → chunk-4P45Z5LR.mjs} +63 -41
- package/dist/chunk-4P45Z5LR.mjs.map +1 -0
- package/dist/chunk-4SSJY32J.mjs +1182 -0
- package/dist/chunk-4SSJY32J.mjs.map +1 -0
- package/dist/{chunk-XJ2SXC2Q.mjs → chunk-6B6I27TT.mjs} +18 -16
- package/dist/{chunk-XJ2SXC2Q.mjs.map → chunk-6B6I27TT.mjs.map} +1 -1
- package/dist/chunk-6JKMEH2L.mjs +205 -0
- package/dist/chunk-6JKMEH2L.mjs.map +1 -0
- package/dist/{chunk-IN3O4R7Q.mjs → chunk-7O526A2D.mjs} +6 -4
- package/dist/{chunk-IN3O4R7Q.mjs.map → chunk-7O526A2D.mjs.map} +1 -1
- package/dist/chunk-AFLEG5ZC.mjs +28 -0
- package/dist/chunk-AFLEG5ZC.mjs.map +1 -0
- package/dist/{chunk-UGMRJMFZ.mjs → chunk-BO5CU4ZM.mjs} +4 -4
- package/dist/{chunk-JIU5GVM7.mjs → chunk-D4XPNSSI.mjs} +5 -3
- package/dist/{chunk-JIU5GVM7.mjs.map → chunk-D4XPNSSI.mjs.map} +1 -1
- package/dist/chunk-DPIMA5IO.mjs +72 -0
- package/dist/chunk-DPIMA5IO.mjs.map +1 -0
- package/dist/chunk-F2CGFVIZ.mjs +83 -0
- package/dist/chunk-F2CGFVIZ.mjs.map +1 -0
- package/dist/{chunk-R5MKQN6D.mjs → chunk-FBLSJQWK.mjs} +3 -3
- package/dist/{chunk-BGB7JHIU.mjs → chunk-FMGZCOJC.mjs} +5 -3
- package/dist/{chunk-BGB7JHIU.mjs.map → chunk-FMGZCOJC.mjs.map} +1 -1
- package/dist/{chunk-UTVSYS6S.mjs → chunk-FNSIQ2B7.mjs} +18 -6
- package/dist/chunk-FNSIQ2B7.mjs.map +1 -0
- package/dist/{chunk-JWANK42G.mjs → chunk-FUZ2JNTZ.mjs} +3 -3
- package/dist/{chunk-CRYIEYZZ.mjs → chunk-HAJWE62X.mjs} +66 -42
- package/dist/chunk-HAJWE62X.mjs.map +1 -0
- package/dist/{chunk-CWFWRZWU.mjs → chunk-KSN33A6I.mjs} +3 -2
- package/dist/{chunk-CWFWRZWU.mjs.map → chunk-KSN33A6I.mjs.map} +1 -1
- package/dist/chunk-KYTHGFFY.mjs +866 -0
- package/dist/chunk-KYTHGFFY.mjs.map +1 -0
- package/dist/{chunk-QKGCW37O.mjs → chunk-LDFM46LV.mjs} +5 -3
- package/dist/{chunk-QKGCW37O.mjs.map → chunk-LDFM46LV.mjs.map} +1 -1
- package/dist/chunk-LQNDBPHU.mjs +142 -0
- package/dist/chunk-LQNDBPHU.mjs.map +1 -0
- package/dist/{chunk-E3I2VDHZ.mjs → chunk-M2PYXSAF.mjs} +6 -4
- package/dist/{chunk-E3I2VDHZ.mjs.map → chunk-M2PYXSAF.mjs.map} +1 -1
- package/dist/{chunk-DELCADNF.mjs → chunk-ODVKRIVN.mjs} +30 -30
- package/dist/{chunk-HR3A4H4E.mjs → chunk-PEJL2T2K.mjs} +13 -11
- package/dist/{chunk-HR3A4H4E.mjs.map → chunk-PEJL2T2K.mjs.map} +1 -1
- package/dist/{chunk-OGNGPI3M.mjs → chunk-PL55YKT4.mjs} +2 -2
- package/dist/{chunk-S6EZVRZC.mjs → chunk-PNSJC6PC.mjs} +5 -28
- package/dist/chunk-PNSJC6PC.mjs.map +1 -0
- package/dist/{chunk-TDRA5EZI.mjs → chunk-PUREEN2J.mjs} +7 -7
- package/dist/chunk-QFS5CENY.mjs +659 -0
- package/dist/chunk-QFS5CENY.mjs.map +1 -0
- package/dist/chunk-RSN7NH2J.mjs +250 -0
- package/dist/chunk-RSN7NH2J.mjs.map +1 -0
- package/dist/{chunk-UDREPVEY.mjs → chunk-RVSMEZE3.mjs} +12 -78
- package/dist/chunk-RVSMEZE3.mjs.map +1 -0
- package/dist/{chunk-SRWPHN2N.mjs → chunk-S64IYJ6Y.mjs} +2 -2
- package/dist/{chunk-ZG3NQI77.mjs → chunk-SMD7OEUW.mjs} +6 -4
- package/dist/{chunk-ZG3NQI77.mjs.map → chunk-SMD7OEUW.mjs.map} +1 -1
- package/dist/{chunk-NJYNJLT7.mjs → chunk-SWFB3A3G.mjs} +2 -2
- package/dist/{chunk-RXBQ7KXF.mjs → chunk-USXGNKWJ.mjs} +98 -44
- package/dist/chunk-USXGNKWJ.mjs.map +1 -0
- package/dist/{chunk-OJV6V7YZ.mjs → chunk-VL7V52YD.mjs} +27 -20
- package/dist/chunk-VL7V52YD.mjs.map +1 -0
- package/dist/{chunk-2ZZJTBTE.mjs → chunk-WJZ3IYET.mjs} +2 -2
- package/dist/chunk-XAJAMVAG.mjs +1720 -0
- package/dist/chunk-XAJAMVAG.mjs.map +1 -0
- package/dist/chunk-YIJ5QVJ6.mjs +277 -0
- package/dist/chunk-YIJ5QVJ6.mjs.map +1 -0
- package/dist/{chunk-T6AMRENK.mjs → chunk-YRW5NKD7.mjs} +148 -112
- package/dist/chunk-YRW5NKD7.mjs.map +1 -0
- package/dist/chunk-ZMJKG2UI.mjs +71 -0
- package/dist/chunk-ZMJKG2UI.mjs.map +1 -0
- package/dist/confirm.d.mts +48 -0
- package/dist/confirm.d.ts +48 -0
- package/dist/confirm.js +334 -0
- package/dist/confirm.js.map +1 -0
- package/dist/confirm.mjs +20 -0
- package/dist/datePicker.d.mts +256 -14
- package/dist/datePicker.d.ts +256 -14
- package/dist/datePicker.js +1624 -145
- package/dist/datePicker.js.map +1 -1
- package/dist/datePicker.mjs +19 -6
- package/dist/dialog.d.mts +166 -0
- package/dist/dialog.d.ts +166 -0
- package/dist/dialog.js +362 -0
- package/dist/dialog.js.map +1 -0
- package/dist/dialog.mjs +45 -0
- package/dist/emptyState.d.mts +17 -0
- package/dist/emptyState.d.ts +17 -0
- package/dist/emptyState.js +253 -0
- package/dist/emptyState.js.map +1 -0
- package/dist/emptyState.mjs +12 -0
- package/dist/emptyState.mjs.map +1 -0
- package/dist/errorState.d.mts +18 -0
- package/dist/errorState.d.ts +18 -0
- package/dist/{displayFile.js → errorState.js} +107 -156
- package/dist/errorState.js.map +1 -0
- package/dist/errorState.mjs +15 -0
- package/dist/errorState.mjs.map +1 -0
- package/dist/fileUpload.d.mts +197 -0
- package/dist/fileUpload.d.ts +197 -0
- package/dist/fileUpload.js +1483 -0
- package/dist/fileUpload.js.map +1 -0
- package/dist/fileUpload.mjs +65 -0
- package/dist/fileUpload.mjs.map +1 -0
- package/dist/flowMap.mjs +7 -6
- package/dist/flowMap.mjs.map +1 -1
- package/dist/image.js +1195 -429
- package/dist/image.js.map +1 -1
- package/dist/image.mjs +8 -6
- package/dist/index.d.ts +7 -2
- package/dist/index.js +8606 -4087
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +314 -152
- package/dist/inlineError.d.mts +16 -0
- package/dist/inlineError.d.ts +16 -0
- package/dist/inlineError.js +297 -0
- package/dist/inlineError.js.map +1 -0
- package/dist/inlineError.mjs +15 -0
- package/dist/inlineError.mjs.map +1 -0
- package/dist/input.mjs +8 -7
- package/dist/jsonEditor.mjs +3 -2
- package/dist/list.mjs +7 -6
- package/dist/loading.mjs +8 -6
- package/dist/markdown.mjs +7 -6
- package/dist/markdown.mjs.map +1 -1
- package/dist/menu.mjs +9 -8
- package/dist/modal.js +2 -1
- package/dist/modal.js.map +1 -1
- package/dist/modal.mjs +7 -5
- package/dist/process.d.mts +33 -75
- package/dist/process.d.ts +33 -75
- package/dist/process.js +1275 -203
- package/dist/process.js.map +1 -1
- package/dist/process.mjs +12 -9
- package/dist/scrollToLoad.mjs +4 -3
- package/dist/select.mjs +10 -9
- package/dist/skeleton.d.mts +15 -1
- package/dist/skeleton.d.ts +15 -1
- package/dist/skeleton.js +114 -2
- package/dist/skeleton.js.map +1 -1
- package/dist/skeleton.mjs +6 -3
- package/dist/stepper.mjs +4 -3
- package/dist/tab.mjs +10 -9
- package/dist/table.d.mts +269 -85
- package/dist/table.d.ts +269 -85
- package/dist/table.js +5102 -3153
- package/dist/table.js.map +1 -1
- package/dist/table.mjs +21 -19
- package/dist/theme.js +1766 -432
- package/dist/theme.js.map +1 -1
- package/dist/theme.mjs +32 -25
- package/dist/timeline.mjs +4 -3
- package/dist/toast.d.mts +49 -0
- package/dist/toast.d.ts +49 -0
- package/dist/toast.js +175 -0
- package/dist/toast.js.map +1 -0
- package/dist/toast.mjs +9 -0
- package/dist/toast.mjs.map +1 -0
- package/dist/toggleButtonGroup.mjs +3 -2
- package/dist/useForm.d.mts +270 -86
- package/dist/useForm.d.ts +270 -86
- package/dist/useForm.js +4672 -2727
- package/dist/useForm.js.map +1 -1
- package/dist/useForm.mjs +18 -16
- package/dist/useSearch.mjs +13 -12
- package/dist/variablesRenderer.mjs +8 -7
- package/package.json +3 -3
- package/dist/AutocompleteField-ZKNU2IRR.mjs +0 -181
- package/dist/AutocompleteField-ZKNU2IRR.mjs.map +0 -1
- package/dist/AvatarField-SAODT3CZ.mjs +0 -275
- package/dist/AvatarField-SAODT3CZ.mjs.map +0 -1
- package/dist/DateField-ZYMZFHL4.mjs.map +0 -1
- package/dist/DateTimeField-TPTJ7YIZ.mjs.map +0 -1
- package/dist/FileUploadField-NTMWBJER.mjs +0 -78
- package/dist/FileUploadField-NTMWBJER.mjs.map +0 -1
- package/dist/chunk-24XDGNJ6.mjs.map +0 -1
- package/dist/chunk-27KYFU7R.mjs +0 -30
- package/dist/chunk-27KYFU7R.mjs.map +0 -1
- package/dist/chunk-AAH2O24U.mjs +0 -325
- package/dist/chunk-AAH2O24U.mjs.map +0 -1
- package/dist/chunk-CRYIEYZZ.mjs.map +0 -1
- package/dist/chunk-EEH7HACG.mjs +0 -249
- package/dist/chunk-EEH7HACG.mjs.map +0 -1
- package/dist/chunk-EKPULYPU.mjs +0 -497
- package/dist/chunk-EKPULYPU.mjs.map +0 -1
- package/dist/chunk-OJV6V7YZ.mjs.map +0 -1
- package/dist/chunk-RXBQ7KXF.mjs.map +0 -1
- package/dist/chunk-S6EZVRZC.mjs.map +0 -1
- package/dist/chunk-SGCUDWO3.mjs +0 -396
- package/dist/chunk-SGCUDWO3.mjs.map +0 -1
- package/dist/chunk-T6AMRENK.mjs.map +0 -1
- package/dist/chunk-UDREPVEY.mjs.map +0 -1
- package/dist/chunk-UTVSYS6S.mjs.map +0 -1
- package/dist/chunk-XIMFP6RB.mjs +0 -161
- package/dist/chunk-XIMFP6RB.mjs.map +0 -1
- package/dist/displayFile.d.mts +0 -95
- package/dist/displayFile.d.ts +0 -95
- package/dist/displayFile.js.map +0 -1
- package/dist/displayFile.mjs +0 -19
- package/dist/fileUploader.d.mts +0 -86
- package/dist/fileUploader.d.ts +0 -86
- package/dist/fileUploader.js +0 -722
- package/dist/fileUploader.js.map +0 -1
- package/dist/fileUploader.mjs +0 -16
- /package/dist/{chunk-V26V2S3W.mjs.map → chunk-3O3N6X6D.mjs.map} +0 -0
- /package/dist/{chunk-UGMRJMFZ.mjs.map → chunk-BO5CU4ZM.mjs.map} +0 -0
- /package/dist/{chunk-R5MKQN6D.mjs.map → chunk-FBLSJQWK.mjs.map} +0 -0
- /package/dist/{chunk-JWANK42G.mjs.map → chunk-FUZ2JNTZ.mjs.map} +0 -0
- /package/dist/{chunk-DELCADNF.mjs.map → chunk-ODVKRIVN.mjs.map} +0 -0
- /package/dist/{chunk-OGNGPI3M.mjs.map → chunk-PL55YKT4.mjs.map} +0 -0
- /package/dist/{chunk-TDRA5EZI.mjs.map → chunk-PUREEN2J.mjs.map} +0 -0
- /package/dist/{chunk-SRWPHN2N.mjs.map → chunk-S64IYJ6Y.mjs.map} +0 -0
- /package/dist/{chunk-NJYNJLT7.mjs.map → chunk-SWFB3A3G.mjs.map} +0 -0
- /package/dist/{chunk-2ZZJTBTE.mjs.map → chunk-WJZ3IYET.mjs.map} +0 -0
- /package/dist/{displayFile.mjs.map → confirm.mjs.map} +0 -0
- /package/dist/{fileUploader.mjs.map → dialog.mjs.map} +0 -0
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getHelperText
|
|
3
|
+
} from "./chunk-MI64T62E.mjs";
|
|
4
|
+
import {
|
|
5
|
+
Explanation_default,
|
|
6
|
+
getFieldExplanation,
|
|
7
|
+
mergeFieldSx
|
|
8
|
+
} from "./chunk-FNSIQ2B7.mjs";
|
|
9
|
+
import "./chunk-T4X375IG.mjs";
|
|
10
|
+
import {
|
|
11
|
+
Autocomplete_default
|
|
12
|
+
} from "./chunk-KYTHGFFY.mjs";
|
|
13
|
+
import "./chunk-VL7V52YD.mjs";
|
|
14
|
+
import "./chunk-LQNDBPHU.mjs";
|
|
15
|
+
import "./chunk-56TI2ZBT.mjs";
|
|
16
|
+
import "./chunk-VYD3PDBB.mjs";
|
|
17
|
+
import "./chunk-MDAUF7IL.mjs";
|
|
18
|
+
import "./chunk-QFF3HTHL.mjs";
|
|
19
|
+
import "./chunk-ZVFYOXDE.mjs";
|
|
20
|
+
import "./chunk-D4XPNSSI.mjs";
|
|
21
|
+
import "./chunk-4Q54P737.mjs";
|
|
22
|
+
import "./chunk-OP6LKXPA.mjs";
|
|
23
|
+
import "./chunk-4RPFRNXG.mjs";
|
|
24
|
+
import {
|
|
25
|
+
default as default2
|
|
26
|
+
} from "./chunk-PNSJC6PC.mjs";
|
|
27
|
+
import {
|
|
28
|
+
mergeSx
|
|
29
|
+
} from "./chunk-AFLEG5ZC.mjs";
|
|
30
|
+
import "./chunk-FJ6ZGZIA.mjs";
|
|
31
|
+
|
|
32
|
+
// src/components/compound/UseForm/src/Fields/AutocompleteField.tsx
|
|
33
|
+
import React from "react";
|
|
34
|
+
import { Controller, useFormContext } from "react-hook-form";
|
|
35
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
36
|
+
var EMPTY_OPTIONS = [];
|
|
37
|
+
function toAutocompleteOption(option) {
|
|
38
|
+
return {
|
|
39
|
+
id: option.id,
|
|
40
|
+
label: option.label,
|
|
41
|
+
disabled: option.disabled,
|
|
42
|
+
description: option.description,
|
|
43
|
+
group: option.group
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function idsFromValue(value, multiple) {
|
|
47
|
+
if (multiple) {
|
|
48
|
+
if (Array.isArray(value)) return value.map(String).filter(Boolean);
|
|
49
|
+
return value ? [String(value)] : [];
|
|
50
|
+
}
|
|
51
|
+
if (Array.isArray(value)) return value[0] ? [String(value[0])] : [];
|
|
52
|
+
return value ? [String(value)] : [];
|
|
53
|
+
}
|
|
54
|
+
function toFormValue(next, multiple) {
|
|
55
|
+
if (multiple) {
|
|
56
|
+
if (next == null) return [];
|
|
57
|
+
const list = Array.isArray(next) ? next : [next];
|
|
58
|
+
return list.map((item) => typeof item === "string" ? item : item.id);
|
|
59
|
+
}
|
|
60
|
+
if (next == null) return "";
|
|
61
|
+
const single = Array.isArray(next) ? next[0] : next;
|
|
62
|
+
if (single == null) return "";
|
|
63
|
+
return typeof single === "string" ? single : single.id;
|
|
64
|
+
}
|
|
65
|
+
var AutocompleteField = ({ field }) => {
|
|
66
|
+
const acSlot = field.slotProps;
|
|
67
|
+
if (acSlot?.useOptions) {
|
|
68
|
+
return /* @__PURE__ */ jsx(AutocompleteFieldWithOptions, { field, useOptions: acSlot.useOptions });
|
|
69
|
+
}
|
|
70
|
+
return /* @__PURE__ */ jsx(AutocompleteFieldView, { field, options: acSlot?.options ?? EMPTY_OPTIONS });
|
|
71
|
+
};
|
|
72
|
+
var AutocompleteFieldWithOptions = ({
|
|
73
|
+
field,
|
|
74
|
+
useOptions
|
|
75
|
+
}) => {
|
|
76
|
+
const { options = EMPTY_OPTIONS, loading } = useOptions();
|
|
77
|
+
return /* @__PURE__ */ jsx(AutocompleteFieldView, { field, options, loading });
|
|
78
|
+
};
|
|
79
|
+
var AutocompleteFieldView = ({
|
|
80
|
+
field,
|
|
81
|
+
options,
|
|
82
|
+
loading
|
|
83
|
+
}) => {
|
|
84
|
+
const { control, getValues } = useFormContext();
|
|
85
|
+
const {
|
|
86
|
+
name,
|
|
87
|
+
label,
|
|
88
|
+
required,
|
|
89
|
+
disabled,
|
|
90
|
+
sx,
|
|
91
|
+
size,
|
|
92
|
+
slotProps,
|
|
93
|
+
errorMsg,
|
|
94
|
+
defaultValue
|
|
95
|
+
} = field;
|
|
96
|
+
const acSlot = slotProps;
|
|
97
|
+
const multiple = acSlot?.multiple ?? true;
|
|
98
|
+
const softOptions = React.useMemo(
|
|
99
|
+
() => options.map(toAutocompleteOption),
|
|
100
|
+
[options]
|
|
101
|
+
);
|
|
102
|
+
return /* @__PURE__ */ jsx(
|
|
103
|
+
Controller,
|
|
104
|
+
{
|
|
105
|
+
control,
|
|
106
|
+
name,
|
|
107
|
+
defaultValue,
|
|
108
|
+
render: ({ field: { onChange: controllerOnChange, value }, fieldState: { error } }) => /* @__PURE__ */ jsx(
|
|
109
|
+
SoftAutocompleteControl,
|
|
110
|
+
{
|
|
111
|
+
name,
|
|
112
|
+
value,
|
|
113
|
+
controllerOnChange,
|
|
114
|
+
softOptions,
|
|
115
|
+
multiple,
|
|
116
|
+
loading,
|
|
117
|
+
disabled,
|
|
118
|
+
required,
|
|
119
|
+
error,
|
|
120
|
+
errorMsg,
|
|
121
|
+
helperText: field.helperText,
|
|
122
|
+
label,
|
|
123
|
+
placeholder: acSlot?.placeholder,
|
|
124
|
+
size,
|
|
125
|
+
sx,
|
|
126
|
+
explanation: getFieldExplanation(field),
|
|
127
|
+
onFieldChange: (next) => {
|
|
128
|
+
field.onChange?.(next, getValues());
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
)
|
|
132
|
+
}
|
|
133
|
+
);
|
|
134
|
+
};
|
|
135
|
+
function SoftAutocompleteControl({
|
|
136
|
+
name,
|
|
137
|
+
value,
|
|
138
|
+
controllerOnChange,
|
|
139
|
+
softOptions,
|
|
140
|
+
multiple,
|
|
141
|
+
loading,
|
|
142
|
+
disabled,
|
|
143
|
+
required,
|
|
144
|
+
error,
|
|
145
|
+
errorMsg,
|
|
146
|
+
helperText,
|
|
147
|
+
label,
|
|
148
|
+
placeholder,
|
|
149
|
+
size,
|
|
150
|
+
sx,
|
|
151
|
+
explanation,
|
|
152
|
+
onFieldChange
|
|
153
|
+
}) {
|
|
154
|
+
const selectedIds = idsFromValue(value, multiple);
|
|
155
|
+
const acValue = multiple ? selectedIds : selectedIds[0] ?? null;
|
|
156
|
+
const resolvedPlaceholder = placeholder ?? (multiple ? "Select options" : "Select an option");
|
|
157
|
+
return /* @__PURE__ */ jsxs(
|
|
158
|
+
default2,
|
|
159
|
+
{
|
|
160
|
+
sx: mergeSx(
|
|
161
|
+
{
|
|
162
|
+
display: "flex",
|
|
163
|
+
alignItems: "flex-start",
|
|
164
|
+
gap: 1,
|
|
165
|
+
// Soft elevated Autocomplete shadow must not be clipped by this row.
|
|
166
|
+
overflow: "visible"
|
|
167
|
+
},
|
|
168
|
+
mergeFieldSx(size, sx)
|
|
169
|
+
),
|
|
170
|
+
children: [
|
|
171
|
+
/* @__PURE__ */ jsx(
|
|
172
|
+
Autocomplete_default,
|
|
173
|
+
{
|
|
174
|
+
name,
|
|
175
|
+
options: softOptions,
|
|
176
|
+
value: acValue,
|
|
177
|
+
multiple,
|
|
178
|
+
loading,
|
|
179
|
+
onChange: (next) => {
|
|
180
|
+
const formValue = toFormValue(next, multiple);
|
|
181
|
+
controllerOnChange(formValue);
|
|
182
|
+
onFieldChange(formValue);
|
|
183
|
+
},
|
|
184
|
+
label,
|
|
185
|
+
placeholder: resolvedPlaceholder,
|
|
186
|
+
required,
|
|
187
|
+
disabled,
|
|
188
|
+
error: !!error,
|
|
189
|
+
helperText: getHelperText(error, errorMsg, helperText),
|
|
190
|
+
fullWidth: true,
|
|
191
|
+
size: "small",
|
|
192
|
+
sx: { flex: 1 }
|
|
193
|
+
}
|
|
194
|
+
),
|
|
195
|
+
/* @__PURE__ */ jsx(Explanation_default, { alignToInput: true, explanation })
|
|
196
|
+
]
|
|
197
|
+
}
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
export {
|
|
201
|
+
AutocompleteField
|
|
202
|
+
};
|
|
203
|
+
//# sourceMappingURL=AutocompleteField-653233JU.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/compound/UseForm/src/Fields/AutocompleteField.tsx"],"sourcesContent":["import React from 'react';\nimport { Controller, useFormContext, type FieldError } from 'react-hook-form';\nimport { Box } from '@/ele/Box';\nimport {\n Autocomplete,\n type AutocompleteOption,\n type OptionParams,\n} from '@/ele/Autocomplete';\nimport { FieldConfig, FormTypeMap, InferFormDataType, getHelperText, mergeFieldSx } from '../_utils';\nimport { mergeSx } from '@/_utils/_func';\nimport { getFieldExplanation } from '../_utils/helpers';\nimport Explanation from './Explanation';\nimport { FIELD_TYPEs } from '../_utils/constants';\nimport type { AutocompleteSlotProps } from '../_utils/slotProps';\n\ninterface AutocompleteFieldProps<T extends FormTypeMap = FormTypeMap> {\n field: Extract<FieldConfig<T>, { type: typeof FIELD_TYPEs.autocomplete }>;\n}\n\ntype AutocompleteUseOptions = NonNullable<AutocompleteSlotProps['useOptions']>;\n\nconst EMPTY_OPTIONS: OptionParams[] = [];\n\n/** Map UseForm OptionParams → soft AutocompleteOption (id/label oriented). */\nfunction toAutocompleteOption(option: OptionParams): AutocompleteOption {\n return {\n id: option.id,\n label: option.label,\n disabled: option.disabled,\n description: option.description,\n group: option.group,\n };\n}\n\nfunction idsFromValue(value: unknown, multiple: boolean): string[] {\n if (multiple) {\n if (Array.isArray(value)) return value.map(String).filter(Boolean);\n return value ? [String(value)] : [];\n }\n if (Array.isArray(value)) return value[0] ? [String(value[0])] : [];\n return value ? [String(value)] : [];\n}\n\nfunction toFormValue(\n next: AutocompleteOption | AutocompleteOption[] | string | string[] | null,\n multiple: boolean,\n): string | string[] {\n if (multiple) {\n if (next == null) return [];\n const list = Array.isArray(next) ? next : [next];\n return list.map((item) => (typeof item === 'string' ? item : item.id));\n }\n if (next == null) return '';\n const single = Array.isArray(next) ? next[0] : next;\n if (single == null) return '';\n return typeof single === 'string' ? single : single.id;\n}\n\nexport const AutocompleteField = <T extends FormTypeMap = FormTypeMap>({ field }: AutocompleteFieldProps<T>) => {\n const acSlot = field.slotProps as AutocompleteSlotProps | undefined;\n if (acSlot?.useOptions) {\n return <AutocompleteFieldWithOptions field={field} useOptions={acSlot.useOptions} />;\n }\n return <AutocompleteFieldView field={field} options={acSlot?.options ?? EMPTY_OPTIONS} />;\n};\n\nconst AutocompleteFieldWithOptions = <T extends FormTypeMap>({\n field,\n useOptions,\n}: AutocompleteFieldProps<T> & { useOptions: AutocompleteUseOptions }) => {\n const { options = EMPTY_OPTIONS, loading } = useOptions();\n return <AutocompleteFieldView field={field} options={options} loading={loading} />;\n};\n\nconst AutocompleteFieldView = <T extends FormTypeMap>({\n field,\n options,\n loading,\n}: AutocompleteFieldProps<T> & { options: OptionParams[]; loading?: boolean }) => {\n const { control, getValues } = useFormContext();\n const {\n name,\n label,\n required,\n disabled,\n sx,\n size,\n slotProps,\n errorMsg,\n defaultValue,\n } = field;\n\n const acSlot = slotProps as AutocompleteSlotProps | undefined;\n const multiple = acSlot?.multiple ?? true;\n const softOptions = React.useMemo(\n () => options.map(toAutocompleteOption),\n [options],\n );\n\n return (\n <Controller\n control={control}\n name={name}\n defaultValue={defaultValue}\n render={({ field: { onChange: controllerOnChange, value }, fieldState: { error } }) => (\n <SoftAutocompleteControl\n name={name}\n value={value}\n controllerOnChange={controllerOnChange}\n softOptions={softOptions}\n multiple={multiple}\n loading={loading}\n disabled={disabled}\n required={required}\n error={error}\n errorMsg={errorMsg}\n helperText={field.helperText}\n label={label}\n placeholder={acSlot?.placeholder}\n size={size}\n sx={sx}\n explanation={getFieldExplanation(field)}\n onFieldChange={(next) => {\n field.onChange?.(next, getValues() as InferFormDataType<T>);\n }}\n />\n )}\n />\n );\n};\n\ntype SoftAutocompleteControlProps = {\n name: string;\n value: unknown;\n controllerOnChange: (value: unknown) => void;\n softOptions: AutocompleteOption[];\n multiple: boolean;\n loading?: boolean;\n disabled?: boolean;\n required?: boolean;\n error: FieldError | undefined;\n errorMsg?: string;\n helperText?: string;\n label?: string;\n placeholder?: string;\n size?: { width?: number | string; height?: number | string };\n sx?: Record<string, unknown>;\n explanation?: React.ComponentProps<typeof Explanation>['explanation'];\n onFieldChange: (next: unknown) => void;\n};\n\nfunction SoftAutocompleteControl({\n name,\n value,\n controllerOnChange,\n softOptions,\n multiple,\n loading,\n disabled,\n required,\n error,\n errorMsg,\n helperText,\n label,\n placeholder,\n size,\n sx,\n explanation,\n onFieldChange,\n}: SoftAutocompleteControlProps) {\n const selectedIds = idsFromValue(value, multiple);\n // Soft Autocomplete resolves string ids against options — TextField-like chrome.\n const acValue = multiple ? selectedIds : (selectedIds[0] ?? null);\n const resolvedPlaceholder =\n placeholder\n ?? (multiple ? 'Select options' : 'Select an option');\n\n return (\n <Box\n sx={mergeSx(\n {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 1,\n // Soft elevated Autocomplete shadow must not be clipped by this row.\n overflow: 'visible',\n },\n mergeFieldSx(size, sx),\n )}\n >\n <Autocomplete\n name={name}\n options={softOptions}\n value={acValue}\n multiple={multiple}\n loading={loading}\n onChange={(next) => {\n const formValue = toFormValue(next, multiple);\n controllerOnChange(formValue);\n onFieldChange(formValue);\n }}\n label={label}\n placeholder={resolvedPlaceholder}\n required={required}\n disabled={disabled}\n error={!!error}\n helperText={getHelperText(error, errorMsg, helperText)}\n fullWidth\n size=\"small\"\n sx={{ flex: 1 }}\n />\n <Explanation alignToInput explanation={explanation} />\n </Box>\n );\n}"],"mappings":"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","names":["default"]}
|
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Cropper_default
|
|
3
|
+
} from "./chunk-USXGNKWJ.mjs";
|
|
4
|
+
import "./chunk-4SSJY32J.mjs";
|
|
5
|
+
import {
|
|
6
|
+
AvatarButton
|
|
7
|
+
} from "./chunk-4MSPA7U7.mjs";
|
|
8
|
+
import {
|
|
9
|
+
FieldHelperText
|
|
10
|
+
} from "./chunk-MI64T62E.mjs";
|
|
11
|
+
import {
|
|
12
|
+
Explanation_default,
|
|
13
|
+
getFieldExplanation,
|
|
14
|
+
mergeFieldSx
|
|
15
|
+
} from "./chunk-FNSIQ2B7.mjs";
|
|
16
|
+
import "./chunk-EW4DTFH3.mjs";
|
|
17
|
+
import {
|
|
18
|
+
MuiModal
|
|
19
|
+
} from "./chunk-RVSMEZE3.mjs";
|
|
20
|
+
import "./chunk-2FK24ZPJ.mjs";
|
|
21
|
+
import {
|
|
22
|
+
CLASSNAMEs
|
|
23
|
+
} from "./chunk-KSN33A6I.mjs";
|
|
24
|
+
import "./chunk-PEJL2T2K.mjs";
|
|
25
|
+
import "./chunk-PUREEN2J.mjs";
|
|
26
|
+
import "./chunk-3DQINB57.mjs";
|
|
27
|
+
import "./chunk-I5JWS4Z7.mjs";
|
|
28
|
+
import "./chunk-FMGZCOJC.mjs";
|
|
29
|
+
import "./chunk-3VUAM2GY.mjs";
|
|
30
|
+
import {
|
|
31
|
+
MuiFormLabel,
|
|
32
|
+
default as default5
|
|
33
|
+
} from "./chunk-T4X375IG.mjs";
|
|
34
|
+
import "./chunk-WYYP3Y34.mjs";
|
|
35
|
+
import "./chunk-LQNDBPHU.mjs";
|
|
36
|
+
import "./chunk-56TI2ZBT.mjs";
|
|
37
|
+
import "./chunk-MDAUF7IL.mjs";
|
|
38
|
+
import "./chunk-UMJ5SCIQ.mjs";
|
|
39
|
+
import {
|
|
40
|
+
default79 as default4
|
|
41
|
+
} from "./chunk-ZVFYOXDE.mjs";
|
|
42
|
+
import "./chunk-D4XPNSSI.mjs";
|
|
43
|
+
import "./chunk-4Q54P737.mjs";
|
|
44
|
+
import "./chunk-OP6LKXPA.mjs";
|
|
45
|
+
import "./chunk-4RPFRNXG.mjs";
|
|
46
|
+
import {
|
|
47
|
+
default as default2,
|
|
48
|
+
default2 as default3
|
|
49
|
+
} from "./chunk-PNSJC6PC.mjs";
|
|
50
|
+
import "./chunk-AFLEG5ZC.mjs";
|
|
51
|
+
import "./chunk-FJ6ZGZIA.mjs";
|
|
52
|
+
|
|
53
|
+
// src/components/compound/UseForm/src/Fields/AvatarField.tsx
|
|
54
|
+
import React, { useEffect, useState } from "react";
|
|
55
|
+
import { Controller, useFormContext, useWatch } from "react-hook-form";
|
|
56
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
57
|
+
var AVATAR_CROP_CONFIG = { width: 200, unit: "px" };
|
|
58
|
+
var AvatarCropPreview = React.forwardRef((_, ref) => {
|
|
59
|
+
return /* @__PURE__ */ jsx(
|
|
60
|
+
"canvas",
|
|
61
|
+
{
|
|
62
|
+
ref,
|
|
63
|
+
width: 200,
|
|
64
|
+
height: 200,
|
|
65
|
+
style: {
|
|
66
|
+
width: 200,
|
|
67
|
+
height: 200,
|
|
68
|
+
maxWidth: "100%",
|
|
69
|
+
maxHeight: "100%",
|
|
70
|
+
border: "1px dashed grey",
|
|
71
|
+
borderRadius: "50%",
|
|
72
|
+
objectFit: "contain",
|
|
73
|
+
backgroundColor: "transparent"
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
);
|
|
77
|
+
});
|
|
78
|
+
AvatarCropPreview.displayName = "AvatarCropPreview";
|
|
79
|
+
function acceptToInputAccept(accept) {
|
|
80
|
+
if (!accept) return "image/*";
|
|
81
|
+
if (typeof accept === "string") return accept;
|
|
82
|
+
const parts = [];
|
|
83
|
+
Object.entries(accept).forEach(([mime, exts]) => {
|
|
84
|
+
parts.push(mime);
|
|
85
|
+
if (Array.isArray(exts)) parts.push(...exts);
|
|
86
|
+
});
|
|
87
|
+
return parts.length ? parts.join(",") : "image/*";
|
|
88
|
+
}
|
|
89
|
+
function useFileObjectUrl(file) {
|
|
90
|
+
const [url, setUrl] = useState("");
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
if (!file) {
|
|
93
|
+
setUrl("");
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const objectUrl = URL.createObjectURL(file);
|
|
97
|
+
setUrl(objectUrl);
|
|
98
|
+
return () => {
|
|
99
|
+
URL.revokeObjectURL(objectUrl);
|
|
100
|
+
};
|
|
101
|
+
}, [file]);
|
|
102
|
+
return url;
|
|
103
|
+
}
|
|
104
|
+
async function blobUrlToFile(url, filename = "avatar.png") {
|
|
105
|
+
const res = await fetch(url);
|
|
106
|
+
const blob = await res.blob();
|
|
107
|
+
return new File([blob], filename, { type: blob.type || "image/png" });
|
|
108
|
+
}
|
|
109
|
+
var AvatarField = ({
|
|
110
|
+
field
|
|
111
|
+
}) => {
|
|
112
|
+
const watchKey = field.slotProps?.watchAvatarNameKey;
|
|
113
|
+
if (watchKey) {
|
|
114
|
+
return /* @__PURE__ */ jsx(AvatarFieldWithNameWatch, { field, watchKey });
|
|
115
|
+
}
|
|
116
|
+
return /* @__PURE__ */ jsx(AvatarFieldView, { field, watchedName: void 0 });
|
|
117
|
+
};
|
|
118
|
+
var AvatarFieldWithNameWatch = ({
|
|
119
|
+
field,
|
|
120
|
+
watchKey
|
|
121
|
+
}) => {
|
|
122
|
+
const { control } = useFormContext();
|
|
123
|
+
const watchedName = useWatch({
|
|
124
|
+
control,
|
|
125
|
+
name: watchKey
|
|
126
|
+
});
|
|
127
|
+
return /* @__PURE__ */ jsx(AvatarFieldView, { field, watchedName });
|
|
128
|
+
};
|
|
129
|
+
var AvatarFieldView = ({
|
|
130
|
+
field,
|
|
131
|
+
watchedName
|
|
132
|
+
}) => {
|
|
133
|
+
const { control, getValues, setValue } = useFormContext();
|
|
134
|
+
const {
|
|
135
|
+
name,
|
|
136
|
+
label,
|
|
137
|
+
required,
|
|
138
|
+
disabled,
|
|
139
|
+
sx,
|
|
140
|
+
size,
|
|
141
|
+
slotProps,
|
|
142
|
+
errorMsg,
|
|
143
|
+
defaultValue
|
|
144
|
+
} = field;
|
|
145
|
+
const avatarSlot = slotProps;
|
|
146
|
+
const [editorOpen, setEditorOpen] = React.useState(false);
|
|
147
|
+
const [editorBlobUrl, setEditorBlobUrl] = React.useState("");
|
|
148
|
+
const initialFileRef = React.useRef(null);
|
|
149
|
+
const transientBlobUrlsRef = React.useRef([]);
|
|
150
|
+
const inputAccept = acceptToInputAccept(avatarSlot?.accept);
|
|
151
|
+
const backgroundIcon = (typeof avatarSlot?.useBackgroundIcon === "function" ? avatarSlot?.useBackgroundIcon() : null) || avatarSlot?.backgroundIcon;
|
|
152
|
+
const displayNameRaw = (avatarSlot?.watchAvatarNameKey ? watchedName : void 0) ?? avatarSlot?.avatarName ?? avatarSlot?.name ?? "";
|
|
153
|
+
const displayName = String(displayNameRaw ?? "").trim() || void 0;
|
|
154
|
+
return /* @__PURE__ */ jsx(
|
|
155
|
+
Controller,
|
|
156
|
+
{
|
|
157
|
+
control,
|
|
158
|
+
name,
|
|
159
|
+
defaultValue: defaultValue ?? null,
|
|
160
|
+
render: ({ field: { onChange, value }, fieldState: { error } }) => {
|
|
161
|
+
const fileValue = value ?? null;
|
|
162
|
+
return /* @__PURE__ */ jsx(
|
|
163
|
+
AvatarFieldControl,
|
|
164
|
+
{
|
|
165
|
+
fileValue,
|
|
166
|
+
onChange,
|
|
167
|
+
error,
|
|
168
|
+
disabled,
|
|
169
|
+
required,
|
|
170
|
+
label,
|
|
171
|
+
name: String(name),
|
|
172
|
+
errorMsg,
|
|
173
|
+
helperText: field.helperText,
|
|
174
|
+
size,
|
|
175
|
+
sx,
|
|
176
|
+
displayName,
|
|
177
|
+
backgroundIcon,
|
|
178
|
+
avatarSlot,
|
|
179
|
+
field,
|
|
180
|
+
getValues,
|
|
181
|
+
setValue,
|
|
182
|
+
editorOpen,
|
|
183
|
+
setEditorOpen,
|
|
184
|
+
editorBlobUrl,
|
|
185
|
+
setEditorBlobUrl,
|
|
186
|
+
initialFileRef,
|
|
187
|
+
transientBlobUrlsRef,
|
|
188
|
+
inputAccept
|
|
189
|
+
}
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
);
|
|
194
|
+
};
|
|
195
|
+
function AvatarFieldControl({
|
|
196
|
+
fileValue,
|
|
197
|
+
onChange,
|
|
198
|
+
error,
|
|
199
|
+
disabled,
|
|
200
|
+
required,
|
|
201
|
+
label,
|
|
202
|
+
name,
|
|
203
|
+
errorMsg,
|
|
204
|
+
helperText,
|
|
205
|
+
size,
|
|
206
|
+
sx,
|
|
207
|
+
displayName,
|
|
208
|
+
backgroundIcon,
|
|
209
|
+
avatarSlot,
|
|
210
|
+
field,
|
|
211
|
+
getValues,
|
|
212
|
+
setValue,
|
|
213
|
+
editorOpen,
|
|
214
|
+
setEditorOpen,
|
|
215
|
+
editorBlobUrl,
|
|
216
|
+
setEditorBlobUrl,
|
|
217
|
+
initialFileRef,
|
|
218
|
+
transientBlobUrlsRef,
|
|
219
|
+
inputAccept
|
|
220
|
+
}) {
|
|
221
|
+
const src = useFileObjectUrl(fileValue);
|
|
222
|
+
const revokeTransient = () => {
|
|
223
|
+
transientBlobUrlsRef.current.forEach((u) => {
|
|
224
|
+
try {
|
|
225
|
+
URL.revokeObjectURL(u);
|
|
226
|
+
} catch {
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
transientBlobUrlsRef.current = [];
|
|
230
|
+
};
|
|
231
|
+
const openEditor = () => {
|
|
232
|
+
initialFileRef.current = fileValue;
|
|
233
|
+
if (fileValue) {
|
|
234
|
+
const u = URL.createObjectURL(fileValue);
|
|
235
|
+
transientBlobUrlsRef.current.push(u);
|
|
236
|
+
setEditorBlobUrl(u);
|
|
237
|
+
} else {
|
|
238
|
+
setEditorBlobUrl("");
|
|
239
|
+
}
|
|
240
|
+
setEditorOpen(true);
|
|
241
|
+
};
|
|
242
|
+
const closeEditor = () => {
|
|
243
|
+
setEditorOpen(false);
|
|
244
|
+
setEditorBlobUrl("");
|
|
245
|
+
revokeTransient();
|
|
246
|
+
};
|
|
247
|
+
const handleSave = async (url) => {
|
|
248
|
+
const next = url ? await blobUrlToFile(url, fileValue?.name || "avatar.png") : null;
|
|
249
|
+
if (url) {
|
|
250
|
+
try {
|
|
251
|
+
URL.revokeObjectURL(url);
|
|
252
|
+
} catch {
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
onChange(next);
|
|
256
|
+
try {
|
|
257
|
+
setValue(name, next, { shouldDirty: true, shouldTouch: true });
|
|
258
|
+
} catch {
|
|
259
|
+
}
|
|
260
|
+
field.onChange?.(next, getValues());
|
|
261
|
+
initialFileRef.current = next;
|
|
262
|
+
setEditorBlobUrl("");
|
|
263
|
+
revokeTransient();
|
|
264
|
+
setEditorOpen(false);
|
|
265
|
+
};
|
|
266
|
+
const onFileSelectFromSelector = (file) => {
|
|
267
|
+
if (editorBlobUrl) {
|
|
268
|
+
try {
|
|
269
|
+
URL.revokeObjectURL(editorBlobUrl);
|
|
270
|
+
} catch {
|
|
271
|
+
}
|
|
272
|
+
transientBlobUrlsRef.current = transientBlobUrlsRef.current.filter(
|
|
273
|
+
(u) => u !== editorBlobUrl
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
if (!file) {
|
|
277
|
+
setEditorBlobUrl("");
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
const blobUrl = URL.createObjectURL(file);
|
|
281
|
+
transientBlobUrlsRef.current.push(blobUrl);
|
|
282
|
+
setEditorBlobUrl(blobUrl);
|
|
283
|
+
};
|
|
284
|
+
return /* @__PURE__ */ jsxs(
|
|
285
|
+
default5,
|
|
286
|
+
{
|
|
287
|
+
className: CLASSNAMEs.compound.useForm.avatarField,
|
|
288
|
+
disabled,
|
|
289
|
+
required,
|
|
290
|
+
error: !!error,
|
|
291
|
+
fullWidth: true,
|
|
292
|
+
size: "small",
|
|
293
|
+
sx: mergeFieldSx(size, sx),
|
|
294
|
+
children: [
|
|
295
|
+
/* @__PURE__ */ jsxs(
|
|
296
|
+
default3,
|
|
297
|
+
{
|
|
298
|
+
direction: "column",
|
|
299
|
+
alignItems: "center",
|
|
300
|
+
justifyContent: "center",
|
|
301
|
+
gap: 0.5,
|
|
302
|
+
children: [
|
|
303
|
+
/* @__PURE__ */ jsxs(default2, { sx: { display: "flex", alignItems: "center", gap: 1, mb: 1 }, children: [
|
|
304
|
+
/* @__PURE__ */ jsx(MuiFormLabel, { component: "legend", children: label }),
|
|
305
|
+
/* @__PURE__ */ jsx(Explanation_default, { explanation: getFieldExplanation(field) })
|
|
306
|
+
] }),
|
|
307
|
+
/* @__PURE__ */ jsx(default2, { sx: { display: "flex", alignItems: "center", gap: 1 }, children: /* @__PURE__ */ jsx(default2, { sx: { cursor: disabled ? "not-allowed" : "pointer" }, children: /* @__PURE__ */ jsx(
|
|
308
|
+
AvatarButton,
|
|
309
|
+
{
|
|
310
|
+
onClick: disabled ? void 0 : openEditor,
|
|
311
|
+
size: avatarSlot?.size,
|
|
312
|
+
dim: avatarSlot?.dim,
|
|
313
|
+
name: displayName,
|
|
314
|
+
src,
|
|
315
|
+
backgroundIcon: src ? void 0 : backgroundIcon,
|
|
316
|
+
icon: /* @__PURE__ */ jsx(default4, { fontSize: "small" }),
|
|
317
|
+
"aria-label": typeof label === "string" ? label : "Avatar"
|
|
318
|
+
}
|
|
319
|
+
) }) }),
|
|
320
|
+
/* @__PURE__ */ jsx(
|
|
321
|
+
FieldHelperText,
|
|
322
|
+
{
|
|
323
|
+
error,
|
|
324
|
+
errorMsg,
|
|
325
|
+
helpers: [typeof helperText === "string" ? helperText : void 0]
|
|
326
|
+
}
|
|
327
|
+
)
|
|
328
|
+
]
|
|
329
|
+
}
|
|
330
|
+
),
|
|
331
|
+
editorOpen ? /* @__PURE__ */ jsx(
|
|
332
|
+
MuiModal,
|
|
333
|
+
{
|
|
334
|
+
className: CLASSNAMEs.elemental.modal,
|
|
335
|
+
openProps: [editorOpen, setEditorOpen],
|
|
336
|
+
onClose: closeEditor,
|
|
337
|
+
title: typeof label === "string" ? label : "Avatar",
|
|
338
|
+
size: { w: "70vw", h: "80vh" },
|
|
339
|
+
children: /* @__PURE__ */ jsx(
|
|
340
|
+
default2,
|
|
341
|
+
{
|
|
342
|
+
sx: {
|
|
343
|
+
display: "flex",
|
|
344
|
+
flexDirection: "column",
|
|
345
|
+
height: "100%",
|
|
346
|
+
gap: 2,
|
|
347
|
+
overflow: "hidden"
|
|
348
|
+
},
|
|
349
|
+
children: /* @__PURE__ */ jsx(default2, { sx: { flex: "1 1 auto", minHeight: 0 }, children: /* @__PURE__ */ jsx(
|
|
350
|
+
Cropper_default,
|
|
351
|
+
{
|
|
352
|
+
setImgNull: () => setEditorBlobUrl(""),
|
|
353
|
+
blobUrl: editorBlobUrl,
|
|
354
|
+
onSave: handleSave,
|
|
355
|
+
onClear: () => handleSave(""),
|
|
356
|
+
circularCrop: true,
|
|
357
|
+
defaultRatio: 1,
|
|
358
|
+
resizeCropEnabled: true,
|
|
359
|
+
cropConfig: AVATAR_CROP_CONFIG,
|
|
360
|
+
PreviewRenderer: AvatarCropPreview,
|
|
361
|
+
showFileSelector: true,
|
|
362
|
+
fileSelectorAccept: inputAccept,
|
|
363
|
+
fileSelectorButtonLabel: "Select Image",
|
|
364
|
+
onFileSelect: onFileSelectFromSelector
|
|
365
|
+
}
|
|
366
|
+
) })
|
|
367
|
+
}
|
|
368
|
+
)
|
|
369
|
+
}
|
|
370
|
+
) : null
|
|
371
|
+
]
|
|
372
|
+
}
|
|
373
|
+
);
|
|
374
|
+
}
|
|
375
|
+
export {
|
|
376
|
+
AvatarField
|
|
377
|
+
};
|
|
378
|
+
//# sourceMappingURL=AvatarField-KFASMVZU.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/compound/UseForm/src/Fields/AvatarField.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react'\nimport { Controller, useFormContext, useWatch } from 'react-hook-form'\nimport { Box, Stack } from '@/ele/Box'\nimport { FormControl, FormLabel } from '@/ele/Form'\nimport { EditIcon } from '@/icons/MuiIcon'\n\nimport { FieldHelperText } from '../_utils/helperText'\nimport { AvatarButton } from '@/ele/Avatar'\nimport { MuiModal } from '@/ele/Modal'\nimport { Cropper } from '@/ele/Image'\n\nimport { FieldConfig, FormTypeMap, InferFormDataType } from '../_utils'\nimport { FIELD_TYPEs } from '../_utils/constants'\nimport type { AvatarSlotProps } from '../_utils/slotProps'\nimport Explanation from './Explanation'\nimport { CLASSNAMEs } from '@/_utils/_const/classNames'\nimport { getFieldExplanation, mergeFieldSx } from '../_utils/helpers'\n\ninterface AvatarFieldProps<T extends FormTypeMap = FormTypeMap> {\n field: Extract<FieldConfig<T>, { type: typeof FIELD_TYPEs.avatar }>\n}\n\nconst AVATAR_CROP_CONFIG = { width: 200, unit: 'px' } as const\n\nconst AvatarCropPreview = React.forwardRef<HTMLCanvasElement>((_, ref) => {\n return (\n <canvas\n ref={ref}\n width={200}\n height={200}\n style={{\n width: 200,\n height: 200,\n maxWidth: '100%',\n maxHeight: '100%',\n border: '1px dashed grey',\n borderRadius: '50%',\n objectFit: 'contain',\n backgroundColor: 'transparent',\n }}\n />\n )\n})\n\nAvatarCropPreview.displayName = 'AvatarCropPreview'\n\nfunction acceptToInputAccept(accept: AvatarSlotProps['accept']): string {\n if (!accept) return 'image/*'\n if (typeof accept === 'string') return accept\n\n const parts: string[] = []\n Object.entries(accept).forEach(([mime, exts]) => {\n parts.push(mime)\n if (Array.isArray(exts)) parts.push(...exts)\n })\n return parts.length ? parts.join(',') : 'image/*'\n}\n\n/** Stable object URL for a File; revoked on change/unmount. */\nfunction useFileObjectUrl(file: File | null | undefined): string {\n const [url, setUrl] = useState('')\n useEffect(() => {\n if (!file) {\n setUrl('')\n return\n }\n const objectUrl = URL.createObjectURL(file)\n setUrl(objectUrl)\n return () => {\n URL.revokeObjectURL(objectUrl)\n }\n }, [file])\n return url\n}\n\nasync function blobUrlToFile(url: string, filename = 'avatar.png'): Promise<File> {\n const res = await fetch(url)\n const blob = await res.blob()\n return new File([blob], filename, { type: blob.type || 'image/png' })\n}\n\nexport const AvatarField = <T extends FormTypeMap = FormTypeMap>({\n field,\n}: AvatarFieldProps<T>) => {\n const watchKey = (field.slotProps as AvatarSlotProps | undefined)\n ?.watchAvatarNameKey\n if (watchKey) {\n return <AvatarFieldWithNameWatch field={field} watchKey={watchKey} />\n }\n return <AvatarFieldView field={field} watchedName={undefined} />\n}\n\nconst AvatarFieldWithNameWatch = <T extends FormTypeMap>({\n field,\n watchKey,\n}: AvatarFieldProps<T> & { watchKey: string }) => {\n const { control } = useFormContext()\n const watchedName = useWatch({\n control,\n name: watchKey as never,\n })\n return <AvatarFieldView field={field} watchedName={watchedName} />\n}\n\nconst AvatarFieldView = <T extends FormTypeMap>({\n field,\n watchedName,\n}: AvatarFieldProps<T> & { watchedName: unknown }) => {\n const { control, getValues, setValue } = useFormContext()\n\n const {\n name,\n label,\n required,\n disabled,\n sx,\n size,\n slotProps,\n errorMsg,\n defaultValue,\n } = field\n\n const avatarSlot = slotProps as AvatarSlotProps | undefined\n const [editorOpen, setEditorOpen] = React.useState(false)\n const [editorBlobUrl, setEditorBlobUrl] = React.useState('')\n const initialFileRef = React.useRef<File | null>(null)\n const transientBlobUrlsRef = React.useRef<string[]>([])\n\n const inputAccept = acceptToInputAccept(avatarSlot?.accept)\n const backgroundIcon =\n (typeof avatarSlot?.useBackgroundIcon === 'function'\n ? avatarSlot?.useBackgroundIcon()\n : null) || avatarSlot?.backgroundIcon\n\n const displayNameRaw =\n (avatarSlot?.watchAvatarNameKey ? watchedName : undefined) ??\n avatarSlot?.avatarName ??\n avatarSlot?.name ??\n ''\n const displayName = String(displayNameRaw ?? '').trim() || undefined\n\n return (\n <Controller\n control={control}\n name={name}\n defaultValue={(defaultValue ?? null) as File | null}\n render={({ field: { onChange, value }, fieldState: { error } }) => {\n const fileValue = (value ?? null) as File | null\n return (\n <AvatarFieldControl\n fileValue={fileValue}\n onChange={onChange}\n error={error}\n disabled={disabled}\n required={required}\n label={label}\n name={String(name)}\n errorMsg={errorMsg}\n helperText={field.helperText}\n size={size}\n sx={sx}\n displayName={displayName}\n backgroundIcon={backgroundIcon}\n avatarSlot={avatarSlot}\n field={field}\n getValues={getValues}\n setValue={setValue}\n editorOpen={editorOpen}\n setEditorOpen={setEditorOpen}\n editorBlobUrl={editorBlobUrl}\n setEditorBlobUrl={setEditorBlobUrl}\n initialFileRef={initialFileRef}\n transientBlobUrlsRef={transientBlobUrlsRef}\n inputAccept={inputAccept}\n />\n )\n }}\n />\n )\n}\n\ntype ControlProps<T extends FormTypeMap> = {\n fileValue: File | null\n onChange: (value: File | null) => void\n error: { message?: string } | undefined\n disabled?: boolean\n required?: boolean\n label?: React.ReactNode\n name: string\n errorMsg?: string | null\n helperText?: React.ReactNode\n size?: unknown\n sx?: unknown\n displayName?: string\n backgroundIcon?: React.ReactNode\n avatarSlot?: AvatarSlotProps\n field: AvatarFieldProps<T>['field']\n getValues: () => unknown\n setValue: (name: string, value: unknown, opts?: object) => void\n editorOpen: boolean\n setEditorOpen: (open: boolean) => void\n editorBlobUrl: string\n setEditorBlobUrl: (url: string) => void\n initialFileRef: React.MutableRefObject<File | null>\n transientBlobUrlsRef: React.MutableRefObject<string[]>\n inputAccept: string\n}\n\nfunction AvatarFieldControl<T extends FormTypeMap>({\n fileValue,\n onChange,\n error,\n disabled,\n required,\n label,\n name,\n errorMsg,\n helperText,\n size,\n sx,\n displayName,\n backgroundIcon,\n avatarSlot,\n field,\n getValues,\n setValue,\n editorOpen,\n setEditorOpen,\n editorBlobUrl,\n setEditorBlobUrl,\n initialFileRef,\n transientBlobUrlsRef,\n inputAccept,\n}: ControlProps<T>) {\n const src = useFileObjectUrl(fileValue)\n\n const revokeTransient = () => {\n transientBlobUrlsRef.current.forEach((u) => {\n try {\n URL.revokeObjectURL(u)\n } catch {\n /* ignore */\n }\n })\n transientBlobUrlsRef.current = []\n }\n\n const openEditor = () => {\n initialFileRef.current = fileValue\n if (fileValue) {\n const u = URL.createObjectURL(fileValue)\n transientBlobUrlsRef.current.push(u)\n setEditorBlobUrl(u)\n } else {\n setEditorBlobUrl('')\n }\n setEditorOpen(true)\n }\n\n const closeEditor = () => {\n setEditorOpen(false)\n setEditorBlobUrl('')\n revokeTransient()\n }\n\n const handleSave = async (url: string) => {\n const next = url ? await blobUrlToFile(url, fileValue?.name || 'avatar.png') : null\n if (url) {\n try {\n URL.revokeObjectURL(url)\n } catch {\n /* ignore */\n }\n }\n\n onChange(next)\n try {\n setValue(name, next, { shouldDirty: true, shouldTouch: true })\n } catch {\n /* ignore */\n }\n field.onChange?.(next, getValues() as InferFormDataType<T>)\n\n initialFileRef.current = next\n setEditorBlobUrl('')\n revokeTransient()\n setEditorOpen(false)\n }\n\n const onFileSelectFromSelector = (file: File | null) => {\n if (editorBlobUrl) {\n try {\n URL.revokeObjectURL(editorBlobUrl)\n } catch {\n /* ignore */\n }\n transientBlobUrlsRef.current = transientBlobUrlsRef.current.filter(\n (u) => u !== editorBlobUrl,\n )\n }\n if (!file) {\n setEditorBlobUrl('')\n return\n }\n const blobUrl = URL.createObjectURL(file)\n transientBlobUrlsRef.current.push(blobUrl)\n setEditorBlobUrl(blobUrl)\n }\n\n return (\n <FormControl\n className={CLASSNAMEs.compound.useForm.avatarField}\n disabled={disabled}\n required={required}\n error={!!error}\n fullWidth\n size=\"small\"\n sx={mergeFieldSx(size as never, sx as never)}\n >\n <Stack\n direction=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={0.5}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1 }}>\n <FormLabel component=\"legend\">{label}</FormLabel>\n <Explanation explanation={getFieldExplanation(field)} />\n </Box>\n\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box sx={{ cursor: disabled ? 'not-allowed' : 'pointer' }}>\n <AvatarButton\n onClick={disabled ? undefined : openEditor}\n size={avatarSlot?.size}\n dim={avatarSlot?.dim}\n name={displayName}\n src={src}\n backgroundIcon={src ? undefined : backgroundIcon}\n icon={<EditIcon fontSize=\"small\" />}\n aria-label={typeof label === 'string' ? label : 'Avatar'}\n />\n </Box>\n </Box>\n\n <FieldHelperText\n error={error as never}\n errorMsg={errorMsg}\n helpers={[typeof helperText === 'string' ? helperText : undefined]}\n />\n </Stack>\n\n {editorOpen ? (\n <MuiModal\n className={CLASSNAMEs.elemental.modal}\n openProps={[editorOpen, setEditorOpen]}\n onClose={closeEditor}\n title={typeof label === 'string' ? label : 'Avatar'}\n size={{ w: '70vw', h: '80vh' }}\n >\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n gap: 2,\n overflow: 'hidden',\n }}\n >\n <Box sx={{ flex: '1 1 auto', minHeight: 0 }}>\n <Cropper\n setImgNull={() => setEditorBlobUrl('')}\n blobUrl={editorBlobUrl}\n onSave={handleSave}\n onClear={() => handleSave('')}\n circularCrop\n defaultRatio={1}\n resizeCropEnabled\n cropConfig={AVATAR_CROP_CONFIG}\n PreviewRenderer={AvatarCropPreview}\n showFileSelector\n fileSelectorAccept={inputAccept}\n fileSelectorButtonLabel=\"Select Image\"\n onFileSelect={onFileSelectFromSelector}\n />\n </Box>\n </Box>\n </MuiModal>\n ) : null}\n </FormControl>\n )\n}\n"],"mappings":"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","names":["default"]}
|