@panneau/fields 5.0.0-alpha.6 → 5.0.0-alpha.7

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 (67) hide show
  1. package/dist/boolean/BooleanField.js +78 -17
  2. package/dist/boolean/BooleanField.js.map +1 -1
  3. package/dist/color/ColorField.js.map +1 -1
  4. package/dist/date/DateField.js.map +1 -1
  5. package/dist/datetime/DateTimeField.js +107 -20
  6. package/dist/datetime/DateTimeField.js.map +1 -1
  7. package/dist/duration/DurationField.js +126 -41
  8. package/dist/duration/DurationField.js.map +1 -1
  9. package/dist/email/EmailField.js.map +1 -1
  10. package/dist/embed/EmbedField.js +185 -69
  11. package/dist/embed/EmbedField.js.map +1 -1
  12. package/dist/file/FileField.d.ts.map +1 -1
  13. package/dist/file/FileField.js +167 -77
  14. package/dist/file/FileField.js.map +1 -1
  15. package/dist/group/GroupField.js.map +1 -1
  16. package/dist/json/JsonField.js +104 -22
  17. package/dist/json/JsonField.js.map +1 -1
  18. package/dist/locales/index.js.map +1 -1
  19. package/dist/localized/LocalizedField.js.map +1 -1
  20. package/dist/location/LocationField.d.ts.map +1 -1
  21. package/dist/location/LocationField.js +351 -138
  22. package/dist/location/LocationField.js.map +1 -1
  23. package/dist/location/LocationMap.d.ts.map +1 -1
  24. package/dist/location/LocationMap.js +155 -65
  25. package/dist/location/LocationMap.js.map +1 -1
  26. package/dist/location/leafletCss.js.map +1 -1
  27. package/dist/location/nominatim.js.map +1 -1
  28. package/dist/missing/MissingField.d.ts +3 -2
  29. package/dist/missing/MissingField.d.ts.map +1 -1
  30. package/dist/missing/MissingField.js +3 -2
  31. package/dist/missing/MissingField.js.map +1 -1
  32. package/dist/number/NumberField.js.map +1 -1
  33. package/dist/range/RangeField.js +82 -11
  34. package/dist/range/RangeField.js.map +1 -1
  35. package/dist/relation/RelationField.js +485 -145
  36. package/dist/relation/RelationField.js.map +1 -1
  37. package/dist/repeater/RepeaterField.js +118 -34
  38. package/dist/repeater/RepeaterField.js.map +1 -1
  39. package/dist/select/SelectField.js.map +1 -1
  40. package/dist/shared/DefinitionField.js.map +1 -1
  41. package/dist/shared/builtIn.js.map +1 -1
  42. package/dist/shared/check.js.map +1 -1
  43. package/dist/shared/context.js.map +1 -1
  44. package/dist/shared/cx.js.map +1 -1
  45. package/dist/shared/dates.js.map +1 -1
  46. package/dist/shared/embed.js.map +1 -1
  47. package/dist/shared/entry.js.map +1 -1
  48. package/dist/shared/relation.js.map +1 -1
  49. package/dist/slug/SlugField.d.ts.map +1 -1
  50. package/dist/slug/SlugField.js +184 -36
  51. package/dist/slug/SlugField.js.map +1 -1
  52. package/dist/tags/TagsField.js.map +1 -1
  53. package/dist/tel/TelField.js.map +1 -1
  54. package/dist/text/TextField.js.map +1 -1
  55. package/dist/textarea/TextAreaField.js.map +1 -1
  56. package/dist/time/TimeField.js +64 -10
  57. package/dist/time/TimeField.js.map +1 -1
  58. package/dist/upload/FilePicker.js +107 -24
  59. package/dist/upload/FilePicker.js.map +1 -1
  60. package/dist/upload/UploadList.js.map +1 -1
  61. package/dist/upload/files.js.map +1 -1
  62. package/dist/upload/useRejectionMessage.js.map +1 -1
  63. package/dist/upload/useUploads.js.map +1 -1
  64. package/dist/uppy/uploader.js.map +1 -1
  65. package/dist/url/UrlField.js +69 -14
  66. package/dist/url/UrlField.js.map +1 -1
  67. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"EmailField.js","names":["value","onChange","_c"],"sources":["../../src/email/EmailField.tsx"],"sourcesContent":["import { getFieldProps, isString } from '../shared/entry';\nimport type { FieldEntryProps } from '../shared/types';\nimport { TextField, type TextFieldProps } from '../text/TextField';\n\nexport type EmailFieldProps = Omit<TextFieldProps, 'type' | 'inputMode'>;\n\n/** An email address, with the email keyboard on phones. Spaces around it are removed on blur. */\nexport function EmailField({ value, onChange, onBlur, ...props }: EmailFieldProps) {\n return (\n <TextField\n autoComplete=\"off\"\n {...props}\n type=\"email\"\n inputMode=\"email\"\n value={value}\n onChange={onChange}\n onBlur={() => {\n const trimmed = value?.trim() ?? null;\n if (trimmed !== value) {\n onChange?.(trimmed === '' ? null : trimmed);\n }\n onBlur?.();\n }}\n />\n );\n}\n\n/** The `email` type. */\nexport function EmailFieldEntry(props: FieldEntryProps) {\n return (\n <EmailField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n />\n );\n}\n"],"mappings":";;;;;;AAOA,SAAO,WAAA,IAAA;CAAA,MAAA,IAAAE,EAAA,EAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,IAAA;EAAoB,CAAA,CAAA,OAAA,UAAA,QAAA,GAAA,SAAA;EAAsD,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA;EAAA,SAAA,EAAA;EAAA,WAAA,EAAA;EAAA,QAAA,EAAA;EAAA,QAAA,EAAA;CAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,UAAA,EAAA,OAAA,YAAA,EAAA,OAAA,OAAA;EAS7D,WAAA;GACJ,MAAA,UAAgB,OAAK,KAAe,KAApB;GAChB,IAAI,YAAY,OACZ,WAAW,YAAY,KAAZ,OAAA,OAA+B;GAE9C,SAAS;EAAC;EACb,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,YAAA,EAAA,QAAA,SAAA,EAAA,QAAA,MAAA,EAAA,QAAA,OAAA;EAbL,KAAA,oBAAC,WAAD;GACiB,cAAA;GAAK,GACd;GACC,MAAA;GACK,WAAA;GACH;GACG;GACF,QAAA;EAMP,CAAA;EACH,EAAA,KAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OAdF;AAcE;;AAKV,SAAO,gBAAA,OAAA;CAAA,MAAA,IAAAA,EAAA,CAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA;EAGS,KAAA,cAAc,KAAK;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CACjB,MAAA,KAAA,SAAS,MAAK,KAA2B,IAAjB,MAAK,QAA7B;CAA0C,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA,YAAA,EAAA,OAAA,MAAA,EAAA,OAAA,IAAA;EAFrD,KAAA,oBAAC,YAAD;GAAW,GACH;GACG,OAAA;GACG,UAAA,MAAK;EAAS,CAAA;EAC1B,EAAA,KAAA,MAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OAJF;AAIE"}
1
+ {"version":3,"file":"EmailField.js","names":["getFieldProps","isString","FieldEntryProps","TextField","TextFieldProps","EmailFieldProps","Omit","EmailField","t0","$","_c","onBlur","onChange","props","value","t1","trimmed","trim","t2","EmailFieldEntry","_c"],"sources":["../../src/email/EmailField.tsx"],"sourcesContent":["import { getFieldProps, isString } from '../shared/entry';\nimport type { FieldEntryProps } from '../shared/types';\nimport { TextField, type TextFieldProps } from '../text/TextField';\n\nexport type EmailFieldProps = Omit<TextFieldProps, 'type' | 'inputMode'>;\n\n/** An email address, with the email keyboard on phones. Spaces around it are removed on blur. */\nexport function EmailField({ value, onChange, onBlur, ...props }: EmailFieldProps) {\n return (\n <TextField\n autoComplete=\"off\"\n {...props}\n type=\"email\"\n inputMode=\"email\"\n value={value}\n onChange={onChange}\n onBlur={() => {\n const trimmed = value?.trim() ?? null;\n if (trimmed !== value) {\n onChange?.(trimmed === '' ? null : trimmed);\n }\n onBlur?.();\n }}\n />\n );\n}\n\n/** The `email` type. */\nexport function EmailFieldEntry(props: FieldEntryProps) {\n return (\n <EmailField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n />\n );\n}\n"],"mappings":";;;;;;AAOA,SAAOO,WAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAL,EAAA,OAAAD,IAAA;EAAoB,CAAA,CAAAM,OAAAF,UAAAD,QAAA,GAAAE,SAAAL;EAAsDC,EAAA,KAAAD;EAAAC,EAAA,KAAAE;EAAAF,EAAA,KAAAG;EAAAH,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;CAAA,OAAA;EAAAH,SAAAF,EAAA;EAAAG,WAAAH,EAAA;EAAAI,QAAAJ,EAAA;EAAAK,QAAAL,EAAA;CAAA;CAAA,IAAAM;CAAA,IAAAN,EAAA,OAAAE,UAAAF,EAAA,OAAAG,YAAAH,EAAA,OAAAK,OAAA;EAS7DC,WAAA;GACJ,MAAAC,UAAgBF,OAAKG,KAAe,KAApB;GAChB,IAAID,YAAYF,OACZF,WAAWI,YAAY,KAAZ,OAAAA,OAA+B;GAE9CL,SAAS;EAAC;EACbF,EAAA,KAAAE;EAAAF,EAAA,KAAAG;EAAAH,EAAA,KAAAK;EAAAL,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,IAAAS;CAAA,IAAAT,EAAA,OAAAG,YAAAH,EAAA,QAAAI,SAAAJ,EAAA,QAAAM,MAAAN,EAAA,QAAAK,OAAA;EAbLI,KAAA,oBAAC,WAAD;GACiB,cAAA;GAAK,GACdL;GACC,MAAA;GACK,WAAA;GACHC;GACGF;GACF,QAAAG;EAMP,CAAA;EACHN,EAAA,KAAAG;EAAAH,EAAA,MAAAI;EAAAJ,EAAA,MAAAM;EAAAN,EAAA,MAAAK;EAAAL,EAAA,MAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,OAdFS;AAcE;;AAKV,SAAOC,gBAAAN,OAAA;CAAA,MAAAJ,IAAAC,EAAA,CAAA;CAAA,IAAAF;CAAA,IAAAC,EAAA,OAAAI,OAAA;EAGSL,KAAAR,cAAca,KAAK;EAACJ,EAAA,KAAAI;EAAAJ,EAAA,KAAAD;CAAA,OAAAA,KAAAC,EAAA;CACjB,MAAAM,KAAAd,SAASY,MAAKC,KAA2B,IAAjBD,MAAKC,QAA7B;CAA0C,IAAAI;CAAA,IAAAT,EAAA,OAAAI,MAAAD,YAAAH,EAAA,OAAAD,MAAAC,EAAA,OAAAM,IAAA;EAFrDG,KAAA,oBAAC,YAAD;GAAW,GACHV;GACG,OAAAO;GACG,UAAAF,MAAKD;EAAS,CAAA;EAC1BH,EAAA,KAAAI,MAAAD;EAAAH,EAAA,KAAAD;EAAAC,EAAA,KAAAM;EAAAN,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,OAJFS;AAIE"}
@@ -4,7 +4,7 @@ import { messages } from "../shared/messages.js";
4
4
  import EmbedField_module_default from "./EmbedField.module.js";
5
5
  import { c } from "react/compiler-runtime";
6
6
  import { Spinner, TextInput, usePanneauIntl } from "@panneau/ui";
7
- import { useEffect, useState } from "react";
7
+ import { useEffect, useEffectEvent, useState } from "react";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
9
  //#region src/embed/EmbedField.tsx
10
10
  var RESOLVE_DELAY = 500;
@@ -21,84 +21,200 @@ function isResolved(value) {
21
21
  * oEmbed: its thumbnail, title and provider. The URL is kept as soon as it is typed, and its
22
22
  * preview follows. Without an embed source, the value is the URL alone.
23
23
  */
24
- function EmbedField({ value, onChange, onBlur, embedSource: embedSourceProp, errors = [], disabled, readOnly, required, ...props }) {
24
+ function EmbedField(t0) {
25
+ const $ = c(47);
26
+ let disabled;
27
+ let embedSourceProp;
28
+ let onBlur;
29
+ let onChange;
30
+ let props;
31
+ let readOnly;
32
+ let required;
33
+ let t1;
34
+ let value;
35
+ if ($[0] !== t0) {
36
+ ({value, onChange, onBlur, embedSource: embedSourceProp, errors: t1, disabled, readOnly, required, ...props} = t0);
37
+ $[0] = t0;
38
+ $[1] = disabled;
39
+ $[2] = embedSourceProp;
40
+ $[3] = onBlur;
41
+ $[4] = onChange;
42
+ $[5] = props;
43
+ $[6] = readOnly;
44
+ $[7] = required;
45
+ $[8] = t1;
46
+ $[9] = value;
47
+ } else {
48
+ disabled = $[1];
49
+ embedSourceProp = $[2];
50
+ onBlur = $[3];
51
+ onChange = $[4];
52
+ props = $[5];
53
+ readOnly = $[6];
54
+ required = $[7];
55
+ t1 = $[8];
56
+ value = $[9];
57
+ }
58
+ let t2;
59
+ if ($[10] !== t1) {
60
+ t2 = t1 === void 0 ? [] : t1;
61
+ $[10] = t1;
62
+ $[11] = t2;
63
+ } else t2 = $[11];
64
+ const errors = t2;
25
65
  const intl = usePanneauIntl();
26
66
  const context = useFieldsContext();
27
67
  const embedSource = embedSourceProp === void 0 ? context.embedSource : embedSourceProp;
28
68
  const url = value?.url ?? "";
29
69
  const [status, setStatus] = useState(null);
30
70
  const pending = value !== null && value !== void 0 && !isResolved(value) ? value.url : null;
31
- useEffect(() => {
32
- if (embedSource === null || pending === null || !URL.canParse(pending)) return;
33
- const controller = new AbortController();
34
- const timeout = window.setTimeout(() => {
35
- setStatus({
36
- url: pending,
37
- state: "loading"
38
- });
39
- embedSource.resolve(pending, { signal: controller.signal }).then((embed) => {
40
- setStatus(null);
41
- onChange?.({
42
- ...embed,
43
- url: pending
44
- });
45
- }).catch(() => {
46
- if (!controller.signal.aborted) setStatus({
71
+ let t3;
72
+ if ($[12] !== onChange) {
73
+ t3 = (embed) => onChange?.(embed);
74
+ $[12] = onChange;
75
+ $[13] = t3;
76
+ } else t3 = $[13];
77
+ const resolved = useEffectEvent(t3);
78
+ let t4;
79
+ if ($[14] !== embedSource || $[15] !== pending || $[16] !== resolved) {
80
+ t4 = () => {
81
+ if (embedSource === null || pending === null || !URL.canParse(pending)) return;
82
+ const controller = new AbortController();
83
+ const timeout = window.setTimeout(() => {
84
+ setStatus({
47
85
  url: pending,
48
- state: "failed"
86
+ state: "loading"
87
+ });
88
+ embedSource.resolve(pending, { signal: controller.signal }).then((embed_0) => {
89
+ setStatus(null);
90
+ resolved({
91
+ ...embed_0,
92
+ url: pending
93
+ });
94
+ }).catch(() => {
95
+ if (!controller.signal.aborted) setStatus({
96
+ url: pending,
97
+ state: "failed"
98
+ });
49
99
  });
50
- });
51
- }, RESOLVE_DELAY);
52
- return () => {
53
- window.clearTimeout(timeout);
54
- controller.abort();
100
+ }, RESOLVE_DELAY);
101
+ return () => {
102
+ window.clearTimeout(timeout);
103
+ controller.abort();
104
+ };
55
105
  };
56
- }, [embedSource, pending]);
106
+ $[14] = embedSource;
107
+ $[15] = pending;
108
+ $[16] = resolved;
109
+ $[17] = t4;
110
+ } else t4 = $[17];
111
+ let t5;
112
+ if ($[18] !== embedSource || $[19] !== pending) {
113
+ t5 = [embedSource, pending];
114
+ $[18] = embedSource;
115
+ $[19] = pending;
116
+ $[20] = t5;
117
+ } else t5 = $[20];
118
+ useEffect(t4, t5);
57
119
  const current = status !== null && status.url === url ? status.state : null;
58
- const shownErrors = current === "failed" && errors.length === 0 ? [intl.formatMessage(messages.embedFailed)] : errors;
59
- return /* @__PURE__ */ jsxs("div", {
60
- className: EmbedField_module_default.embed,
61
- children: [
62
- /* @__PURE__ */ jsx(TextInput, {
63
- ...props,
64
- type: "url",
65
- inputMode: "url",
66
- autoComplete: "off",
67
- value: url,
68
- onChange: (next) => onChange?.(next.trim() === "" ? null : { url: next.trim() }),
69
- onBlur: () => onBlur?.(),
70
- errors: shownErrors,
71
- isDisabled: disabled,
72
- isReadOnly: readOnly,
73
- isRequired: required
74
- }),
75
- current === "loading" ? /* @__PURE__ */ jsxs("div", {
76
- className: EmbedField_module_default.status,
77
- role: "status",
78
- children: [/* @__PURE__ */ jsx(Spinner, { size: "sm" }), intl.formatMessage(messages.embedLoading)]
79
- }) : null,
80
- value !== null && value !== void 0 && isResolved(value) ? /* @__PURE__ */ jsxs("a", {
81
- className: EmbedField_module_default.preview,
82
- href: value.url,
83
- target: "_blank",
84
- rel: "noreferrer",
85
- children: [value.thumbnailUrl !== void 0 ? /* @__PURE__ */ jsx("img", {
86
- className: EmbedField_module_default.thumbnail,
87
- src: value.thumbnailUrl,
88
- alt: ""
89
- }) : null, /* @__PURE__ */ jsxs("span", {
90
- className: EmbedField_module_default.text,
91
- children: [/* @__PURE__ */ jsx("span", {
92
- className: EmbedField_module_default.title,
93
- children: value.title ?? value.url
94
- }), value.provider !== void 0 ? /* @__PURE__ */ jsx("span", {
95
- className: EmbedField_module_default.provider,
96
- children: value.provider
97
- }) : null]
98
- })]
99
- }) : null
100
- ]
101
- });
120
+ let t6;
121
+ if ($[21] !== current || $[22] !== errors || $[23] !== intl) {
122
+ t6 = current === "failed" && errors.length === 0 ? [intl.formatMessage(messages.embedFailed)] : errors;
123
+ $[21] = current;
124
+ $[22] = errors;
125
+ $[23] = intl;
126
+ $[24] = t6;
127
+ } else t6 = $[24];
128
+ const shownErrors = t6;
129
+ let t7;
130
+ if ($[25] !== onChange) {
131
+ t7 = (next) => onChange?.(next.trim() === "" ? null : { url: next.trim() });
132
+ $[25] = onChange;
133
+ $[26] = t7;
134
+ } else t7 = $[26];
135
+ let t8;
136
+ if ($[27] !== onBlur) {
137
+ t8 = () => onBlur?.();
138
+ $[27] = onBlur;
139
+ $[28] = t8;
140
+ } else t8 = $[28];
141
+ let t9;
142
+ if ($[29] !== disabled || $[30] !== props || $[31] !== readOnly || $[32] !== required || $[33] !== shownErrors || $[34] !== t7 || $[35] !== t8 || $[36] !== url) {
143
+ t9 = /* @__PURE__ */ jsx(TextInput, {
144
+ ...props,
145
+ type: "url",
146
+ inputMode: "url",
147
+ autoComplete: "off",
148
+ value: url,
149
+ onChange: t7,
150
+ onBlur: t8,
151
+ errors: shownErrors,
152
+ isDisabled: disabled,
153
+ isReadOnly: readOnly,
154
+ isRequired: required
155
+ });
156
+ $[29] = disabled;
157
+ $[30] = props;
158
+ $[31] = readOnly;
159
+ $[32] = required;
160
+ $[33] = shownErrors;
161
+ $[34] = t7;
162
+ $[35] = t8;
163
+ $[36] = url;
164
+ $[37] = t9;
165
+ } else t9 = $[37];
166
+ let t10;
167
+ if ($[38] !== current || $[39] !== intl) {
168
+ t10 = current === "loading" ? /* @__PURE__ */ jsxs("div", {
169
+ className: EmbedField_module_default.status,
170
+ role: "status",
171
+ children: [/* @__PURE__ */ jsx(Spinner, { size: "sm" }), intl.formatMessage(messages.embedLoading)]
172
+ }) : null;
173
+ $[38] = current;
174
+ $[39] = intl;
175
+ $[40] = t10;
176
+ } else t10 = $[40];
177
+ let t11;
178
+ if ($[41] !== value) {
179
+ t11 = value !== null && value !== void 0 && isResolved(value) ? /* @__PURE__ */ jsxs("a", {
180
+ className: EmbedField_module_default.preview,
181
+ href: value.url,
182
+ target: "_blank",
183
+ rel: "noreferrer",
184
+ children: [value.thumbnailUrl !== void 0 ? /* @__PURE__ */ jsx("img", {
185
+ className: EmbedField_module_default.thumbnail,
186
+ src: value.thumbnailUrl,
187
+ alt: ""
188
+ }) : null, /* @__PURE__ */ jsxs("span", {
189
+ className: EmbedField_module_default.text,
190
+ children: [/* @__PURE__ */ jsx("span", {
191
+ className: EmbedField_module_default.title,
192
+ children: value.title ?? value.url
193
+ }), value.provider !== void 0 ? /* @__PURE__ */ jsx("span", {
194
+ className: EmbedField_module_default.provider,
195
+ children: value.provider
196
+ }) : null]
197
+ })]
198
+ }) : null;
199
+ $[41] = value;
200
+ $[42] = t11;
201
+ } else t11 = $[42];
202
+ let t12;
203
+ if ($[43] !== t10 || $[44] !== t11 || $[45] !== t9) {
204
+ t12 = /* @__PURE__ */ jsxs("div", {
205
+ className: EmbedField_module_default.embed,
206
+ children: [
207
+ t9,
208
+ t10,
209
+ t11
210
+ ]
211
+ });
212
+ $[43] = t10;
213
+ $[44] = t11;
214
+ $[45] = t9;
215
+ $[46] = t12;
216
+ } else t12 = $[46];
217
+ return t12;
102
218
  }
103
219
  /** The `embed` type: its preview comes from the embed source of the `FieldsProvider`. */
104
220
  function EmbedFieldEntry(props) {
@@ -1 +1 @@
1
- {"version":3,"file":"EmbedField.js","names":["styles","_c"],"sources":["../../src/embed/EmbedField.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { EmbedValue } from '@panneau/protocol';\nimport { Spinner, TextInput, usePanneauIntl } from '@panneau/ui';\n\nimport { useFieldsContext } from '../shared/context';\nimport type { EmbedSource } from '../shared/embed';\nimport { getFieldProps, isString } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './EmbedField.module.css';\n\nexport type { EmbedValue };\n\nconst RESOLVE_DELAY = 500;\n\nexport interface EmbedFieldProps extends FieldProps<EmbedValue> {\n placeholder?: string;\n /** Where the preview comes from. Defaults to that of the `FieldsProvider`. */\n embedSource?: EmbedSource | null;\n}\n\n/** Whether a value is an embed: an object with a `url`. */\nexport function isEmbed(value: unknown): value is EmbedValue {\n return (\n value !== null &&\n typeof value === 'object' &&\n isString((value as Record<string, unknown>).url)\n );\n}\n\n/** Whether a value has been resolved: it has more than its URL. */\nfunction isResolved(value: EmbedValue): boolean {\n return Object.keys(value).some((key) => key !== 'url');\n}\n\n/**\n * A URL of a video, a sound or a post, with the preview the backend gets from its provider's\n * oEmbed: its thumbnail, title and provider. The URL is kept as soon as it is typed, and its\n * preview follows. Without an embed source, the value is the URL alone.\n */\nexport function EmbedField({\n value,\n onChange,\n onBlur,\n embedSource: embedSourceProp,\n errors = [],\n disabled,\n readOnly,\n required,\n ...props\n}: EmbedFieldProps) {\n const intl = usePanneauIntl();\n const context = useFieldsContext();\n const embedSource = embedSourceProp === undefined ? context.embedSource : embedSourceProp;\n const url = value?.url ?? '';\n const [status, setStatus] = useState<{ url: string; state: 'loading' | 'failed' } | null>(null);\n\n // Resolves a URL that hasn't been, after a pause in typing\n const pending = value !== null && value !== undefined && !isResolved(value) ? value.url : null;\n useEffect(() => {\n if (embedSource === null || pending === null || !URL.canParse(pending)) {\n return undefined;\n }\n const controller = new AbortController();\n const timeout = window.setTimeout(() => {\n setStatus({ url: pending, state: 'loading' });\n embedSource\n .resolve(pending, { signal: controller.signal })\n .then((embed) => {\n setStatus(null);\n onChange?.({ ...embed, url: pending });\n })\n .catch(() => {\n if (!controller.signal.aborted) {\n setStatus({ url: pending, state: 'failed' });\n }\n });\n }, RESOLVE_DELAY);\n return () => {\n window.clearTimeout(timeout);\n controller.abort();\n };\n // `onChange` changes on every render of a form\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [embedSource, pending]);\n\n const current = status !== null && status.url === url ? status.state : null;\n const shownErrors =\n current === 'failed' && errors.length === 0\n ? [intl.formatMessage(messages.embedFailed)]\n : errors;\n return (\n <div className={styles.embed}>\n <TextInput\n {...props}\n type=\"url\"\n inputMode=\"url\"\n autoComplete=\"off\"\n value={url}\n onChange={(next) => onChange?.(next.trim() === '' ? null : { url: next.trim() })}\n onBlur={() => onBlur?.()}\n errors={shownErrors}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n {current === 'loading' ? (\n <div className={styles.status} role=\"status\">\n <Spinner size=\"sm\" />\n {intl.formatMessage(messages.embedLoading)}\n </div>\n ) : null}\n {value !== null && value !== undefined && isResolved(value) ? (\n <a className={styles.preview} href={value.url} target=\"_blank\" rel=\"noreferrer\">\n {value.thumbnailUrl !== undefined ? (\n <img className={styles.thumbnail} src={value.thumbnailUrl} alt=\"\" />\n ) : null}\n <span className={styles.text}>\n <span className={styles.title}>{value.title ?? value.url}</span>\n {value.provider !== undefined ? (\n <span className={styles.provider}>{value.provider}</span>\n ) : null}\n </span>\n </a>\n ) : null}\n </div>\n );\n}\n\n/** The `embed` type: its preview comes from the embed source of the `FieldsProvider`. */\nexport function EmbedFieldEntry(props: FieldEntryProps) {\n return (\n <EmbedField\n {...getFieldProps(props)}\n value={isEmbed(props.value) ? props.value : null}\n onChange={props.onChange}\n />\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"EmbedField.js","names":["useEffect","useEffectEvent","useState","EmbedValue","Spinner","TextInput","usePanneauIntl","useFieldsContext","EmbedSource","getFieldProps","isString","messages","FieldEntryProps","FieldProps","styles","RESOLVE_DELAY","EmbedFieldProps","placeholder","embedSource","isEmbed","value","Record","url","isResolved","Object","keys","some","key","EmbedField","t0","$","_c","disabled","embedSourceProp","onBlur","onChange","props","readOnly","required","t1","errors","t2","undefined","intl","context","status","setStatus","pending","t3","embed","resolved","t4","URL","canParse","controller","AbortController","timeout","window","setTimeout","state","resolve","signal","then","embed_0","catch","aborted","clearTimeout","abort","t5","current","t6","length","formatMessage","embedFailed","shownErrors","t7","next","trim","t8","t9","t10","embedLoading","t11","preview","thumbnailUrl","thumbnail","text","title","provider","t12","EmbedFieldEntry","_c","styles"],"sources":["../../src/embed/EmbedField.tsx"],"sourcesContent":["import { useEffect, useEffectEvent, useState } from 'react';\n\nimport type { EmbedValue } from '@panneau/protocol';\nimport { Spinner, TextInput, usePanneauIntl } from '@panneau/ui';\n\nimport { useFieldsContext } from '../shared/context';\nimport type { EmbedSource } from '../shared/embed';\nimport { getFieldProps, isString } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './EmbedField.module.css';\n\nexport type { EmbedValue };\n\nconst RESOLVE_DELAY = 500;\n\nexport interface EmbedFieldProps extends FieldProps<EmbedValue> {\n placeholder?: string;\n /** Where the preview comes from. Defaults to that of the `FieldsProvider`. */\n embedSource?: EmbedSource | null;\n}\n\n/** Whether a value is an embed: an object with a `url`. */\nexport function isEmbed(value: unknown): value is EmbedValue {\n return (\n value !== null &&\n typeof value === 'object' &&\n isString((value as Record<string, unknown>).url)\n );\n}\n\n/** Whether a value has been resolved: it has more than its URL. */\nfunction isResolved(value: EmbedValue): boolean {\n return Object.keys(value).some((key) => key !== 'url');\n}\n\n/**\n * A URL of a video, a sound or a post, with the preview the backend gets from its provider's\n * oEmbed: its thumbnail, title and provider. The URL is kept as soon as it is typed, and its\n * preview follows. Without an embed source, the value is the URL alone.\n */\nexport function EmbedField({\n value,\n onChange,\n onBlur,\n embedSource: embedSourceProp,\n errors = [],\n disabled,\n readOnly,\n required,\n ...props\n}: EmbedFieldProps) {\n const intl = usePanneauIntl();\n const context = useFieldsContext();\n const embedSource = embedSourceProp === undefined ? context.embedSource : embedSourceProp;\n const url = value?.url ?? '';\n const [status, setStatus] = useState<{ url: string; state: 'loading' | 'failed' } | null>(null);\n\n // Resolves a URL that hasn't been, after a pause in typing\n const pending = value !== null && value !== undefined && !isResolved(value) ? value.url : null;\n // `onChange` changes on every render of a form: the latest one gets the preview\n const resolved = useEffectEvent((embed: EmbedValue) => onChange?.(embed));\n useEffect(() => {\n if (embedSource === null || pending === null || !URL.canParse(pending)) {\n return undefined;\n }\n const controller = new AbortController();\n const timeout = window.setTimeout(() => {\n setStatus({ url: pending, state: 'loading' });\n embedSource\n .resolve(pending, { signal: controller.signal })\n .then((embed) => {\n setStatus(null);\n resolved({ ...embed, url: pending });\n })\n .catch(() => {\n if (!controller.signal.aborted) {\n setStatus({ url: pending, state: 'failed' });\n }\n });\n }, RESOLVE_DELAY);\n return () => {\n window.clearTimeout(timeout);\n controller.abort();\n };\n }, [embedSource, pending]);\n\n const current = status !== null && status.url === url ? status.state : null;\n const shownErrors =\n current === 'failed' && errors.length === 0\n ? [intl.formatMessage(messages.embedFailed)]\n : errors;\n return (\n <div className={styles.embed}>\n <TextInput\n {...props}\n type=\"url\"\n inputMode=\"url\"\n autoComplete=\"off\"\n value={url}\n onChange={(next) => onChange?.(next.trim() === '' ? null : { url: next.trim() })}\n onBlur={() => onBlur?.()}\n errors={shownErrors}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n {current === 'loading' ? (\n <div className={styles.status} role=\"status\">\n <Spinner size=\"sm\" />\n {intl.formatMessage(messages.embedLoading)}\n </div>\n ) : null}\n {value !== null && value !== undefined && isResolved(value) ? (\n <a className={styles.preview} href={value.url} target=\"_blank\" rel=\"noreferrer\">\n {value.thumbnailUrl !== undefined ? (\n <img className={styles.thumbnail} src={value.thumbnailUrl} alt=\"\" />\n ) : null}\n <span className={styles.text}>\n <span className={styles.title}>{value.title ?? value.url}</span>\n {value.provider !== undefined ? (\n <span className={styles.provider}>{value.provider}</span>\n ) : null}\n </span>\n </a>\n ) : null}\n </div>\n );\n}\n\n/** The `embed` type: its preview comes from the embed source of the `FieldsProvider`. */\nexport function EmbedFieldEntry(props: FieldEntryProps) {\n return (\n <EmbedField\n {...getFieldProps(props)}\n value={isEmbed(props.value) ? props.value : null}\n onChange={props.onChange}\n />\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FileField.d.ts","sourceRoot":"","sources":["../../src/file/FileField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAInE,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAKlE;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,IAAI,CAAC;AAEzD,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACrF,mGAAmG;IACnG,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAClC,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC5D,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,sBAAuB,SAAQ,kBAAkB;IAC9D,QAAQ,EAAE,IAAI,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAAC;IACpC,sDAAsD;IACtD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC;CAClD;AAED,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG,sBAAsB,CAAC;AAY3E,mDAAmD;AACnD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAS9D;AAED,gDAAgD;AAChD,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,EAAE,CAKnD;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,+BAgI9C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,+BAYpD"}
1
+ {"version":3,"file":"FileField.d.ts","sourceRoot":"","sources":["../../src/file/FileField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAInE,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAKlE;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,IAAI,CAAC;AAEzD,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACrF,mGAAmG;IACnG,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAClC,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC5D,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,sBAAuB,SAAQ,kBAAkB;IAC9D,QAAQ,EAAE,IAAI,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAAC;IACpC,sDAAsD;IACtD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC;CAClD;AAED,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG,sBAAsB,CAAC;AAY3E,mDAAmD;AACnD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAS9D;AAED,gDAAgD;AAChD,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,EAAE,CAKnD;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,+BAiI9C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,+BAYpD"}
@@ -37,102 +37,192 @@ function toFiles(value) {
37
37
  * value, and is added to a multiple one.
38
38
  */
39
39
  function FileField(props) {
40
+ const $ = c(42);
40
41
  const intl = usePanneauIntl();
41
42
  const context = useFieldsContext();
42
- const { accept = null, maxSize = null, uploadSource = context.uploadSource, label, description, errors = [], disabled, readOnly, required, className, labelClassName, descriptionClassName, errorsClassName } = props;
43
+ const { accept: t0, maxSize: t1, label, description, errors: t2, disabled, readOnly, required, className, labelClassName, descriptionClassName, errorsClassName } = props;
44
+ const accept = t0 === void 0 ? null : t0;
45
+ const maxSize = t1 === void 0 ? null : t1;
46
+ let t3;
47
+ if ($[0] !== t2) {
48
+ t3 = t2 === void 0 ? [] : t2;
49
+ $[0] = t2;
50
+ $[1] = t3;
51
+ } else t3 = $[1];
52
+ const errors = t3;
53
+ const uploadSource = props.uploadSource === void 0 ? context.uploadSource : props.uploadSource;
43
54
  const multiple = props.multiple === true;
44
- const files = toFiles(props.value);
55
+ let t4;
56
+ if ($[2] !== props.value) {
57
+ t4 = toFiles(props.value);
58
+ $[2] = props.value;
59
+ $[3] = t4;
60
+ } else t4 = $[3];
61
+ const files = t4;
45
62
  const editable = disabled !== true && readOnly !== true;
46
- const [rejections, setRejections] = useState([]);
63
+ let t5;
64
+ if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
65
+ t5 = [];
66
+ $[4] = t5;
67
+ } else t5 = $[4];
68
+ const [rejections, setRejections] = useState(t5);
47
69
  const rejectionMessage = useRejectionMessage(maxSize);
48
70
  const latest = useRef(files);
49
- useEffect(() => {
50
- latest.current = files;
51
- });
71
+ let t6;
72
+ if ($[5] !== files) {
73
+ t6 = () => {
74
+ latest.current = files;
75
+ };
76
+ $[5] = files;
77
+ $[6] = t6;
78
+ } else t6 = $[6];
79
+ useEffect(t6);
52
80
  const set = (next) => {
53
81
  latest.current = next;
54
82
  if (props.multiple === true) props.onChange?.(next.length > 0 ? next : null);
55
83
  else props.onChange?.(next[0] ?? null);
56
84
  };
85
+ let t7;
86
+ if ($[7] !== rejectionMessage) {
87
+ t7 = (file_0, reason) => setRejections((current) => [...current, rejectionMessage(file_0, reason)]);
88
+ $[7] = rejectionMessage;
89
+ $[8] = t7;
90
+ } else t7 = $[8];
57
91
  const upload = useUploads({
58
92
  source: uploadSource,
59
93
  accept,
60
94
  maxSize,
61
95
  onUploaded: (file) => set(multiple ? [...latest.current, file] : [file]),
62
- onRejected: (file_0, reason) => setRejections((current) => [...current, rejectionMessage(file_0, reason)])
96
+ onRejected: t7
63
97
  });
64
- return /* @__PURE__ */ jsx(Fieldset, {
65
- legend: label,
66
- description,
67
- errors: [...errors, ...rejections],
68
- isRequired: required,
69
- isDisabled: disabled,
70
- className,
71
- legendClassName: labelClassName,
72
- descriptionClassName,
73
- errorsClassName,
74
- children: /* @__PURE__ */ jsxs("div", {
75
- className: FileField_module_default.field,
98
+ const T0 = Fieldset;
99
+ let t8;
100
+ if ($[9] !== errors || $[10] !== rejections) {
101
+ t8 = [...errors, ...rejections];
102
+ $[9] = errors;
103
+ $[10] = rejections;
104
+ $[11] = t8;
105
+ } else t8 = $[11];
106
+ const t9 = FileField_module_default;
107
+ const t10 = files.length > 0 ? /* @__PURE__ */ jsx("ul", {
108
+ className: FileField_module_default.files,
109
+ children: files.map((file_1, index) => {
110
+ const { name } = file_1;
111
+ const url = fileUrl(file_1);
112
+ const size = fileSize(file_1);
113
+ return /* @__PURE__ */ jsxs("li", {
114
+ className: FileField_module_default.file,
115
+ children: [
116
+ /* @__PURE__ */ jsx(FileText, {
117
+ "aria-hidden": true,
118
+ className: FileField_module_default.icon
119
+ }),
120
+ url !== null ? /* @__PURE__ */ jsx("a", {
121
+ href: url,
122
+ className: FileField_module_default.name,
123
+ target: "_blank",
124
+ rel: "noreferrer",
125
+ children: name
126
+ }) : /* @__PURE__ */ jsx("span", {
127
+ className: FileField_module_default.name,
128
+ children: name
129
+ }),
130
+ size !== null ? /* @__PURE__ */ jsx("span", {
131
+ className: FileField_module_default.size,
132
+ children: formatSize(size, intl.locale)
133
+ }) : null,
134
+ editable ? /* @__PURE__ */ jsx(IconButton, {
135
+ icon: X,
136
+ size: "sm",
137
+ label: intl.formatMessage(messages.removeFile, { name }),
138
+ onPress: () => set(latest.current.filter((_, at) => at !== index))
139
+ }) : null
140
+ ]
141
+ }, `${String(index)}-${name}`);
142
+ })
143
+ }) : upload.items.length === 0 ? /* @__PURE__ */ jsx("span", {
144
+ className: FileField_module_default.none,
145
+ children: intl.formatMessage(messages.noFile)
146
+ }) : null;
147
+ let t11;
148
+ if ($[12] !== upload.cancel || $[13] !== upload.items || $[14] !== upload.pause || $[15] !== upload.resume || $[16] !== upload.retry) {
149
+ t11 = /* @__PURE__ */ jsx(UploadList, {
150
+ items: upload.items,
151
+ onPause: upload.pause,
152
+ onResume: upload.resume,
153
+ onCancel: upload.cancel,
154
+ onRetry: upload.retry
155
+ });
156
+ $[12] = upload.cancel;
157
+ $[13] = upload.items;
158
+ $[14] = upload.pause;
159
+ $[15] = upload.resume;
160
+ $[16] = upload.retry;
161
+ $[17] = t11;
162
+ } else t11 = $[17];
163
+ let t12;
164
+ if ($[18] !== accept || $[19] !== editable || $[20] !== files.length || $[21] !== intl || $[22] !== multiple || $[23] !== upload) {
165
+ t12 = editable ? /* @__PURE__ */ jsx(FilePicker, {
166
+ accept,
167
+ multiple,
168
+ ...!multiple && files.length > 0 ? { label: intl.formatMessage(messages.replaceFile) } : {},
169
+ onSelect: (selected) => {
170
+ setRejections([]);
171
+ upload.add(selected);
172
+ }
173
+ }) : null;
174
+ $[18] = accept;
175
+ $[19] = editable;
176
+ $[20] = files.length;
177
+ $[21] = intl;
178
+ $[22] = multiple;
179
+ $[23] = upload;
180
+ $[24] = t12;
181
+ } else t12 = $[24];
182
+ let t13;
183
+ if ($[25] !== t10 || $[26] !== t11 || $[27] !== t12 || $[28] !== t9.field) {
184
+ t13 = /* @__PURE__ */ jsxs("div", {
185
+ className: t9.field,
76
186
  children: [
77
- files.length > 0 ? /* @__PURE__ */ jsx("ul", {
78
- className: FileField_module_default.files,
79
- children: files.map((file_1, index) => {
80
- const { name } = file_1;
81
- const url = fileUrl(file_1);
82
- const size = fileSize(file_1);
83
- return /* @__PURE__ */ jsxs("li", {
84
- className: FileField_module_default.file,
85
- children: [
86
- /* @__PURE__ */ jsx(FileText, {
87
- "aria-hidden": true,
88
- className: FileField_module_default.icon
89
- }),
90
- url !== null ? /* @__PURE__ */ jsx("a", {
91
- href: url,
92
- className: FileField_module_default.name,
93
- target: "_blank",
94
- rel: "noreferrer",
95
- children: name
96
- }) : /* @__PURE__ */ jsx("span", {
97
- className: FileField_module_default.name,
98
- children: name
99
- }),
100
- size !== null ? /* @__PURE__ */ jsx("span", {
101
- className: FileField_module_default.size,
102
- children: formatSize(size, intl.locale)
103
- }) : null,
104
- editable ? /* @__PURE__ */ jsx(IconButton, {
105
- icon: X,
106
- size: "sm",
107
- label: intl.formatMessage(messages.removeFile, { name }),
108
- onPress: () => set(latest.current.filter((_, at) => at !== index))
109
- }) : null
110
- ]
111
- }, `${String(index)}-${name}`);
112
- })
113
- }) : upload.items.length === 0 ? /* @__PURE__ */ jsx("span", {
114
- className: FileField_module_default.none,
115
- children: intl.formatMessage(messages.noFile)
116
- }) : null,
117
- /* @__PURE__ */ jsx(UploadList, {
118
- items: upload.items,
119
- onPause: upload.pause,
120
- onResume: upload.resume,
121
- onCancel: upload.cancel,
122
- onRetry: upload.retry
123
- }),
124
- editable ? /* @__PURE__ */ jsx(FilePicker, {
125
- accept,
126
- multiple,
127
- ...!multiple && files.length > 0 ? { label: intl.formatMessage(messages.replaceFile) } : {},
128
- onSelect: (selected) => {
129
- setRejections([]);
130
- upload.add(selected);
131
- }
132
- }) : null
187
+ t10,
188
+ t11,
189
+ t12
133
190
  ]
134
- })
135
- });
191
+ });
192
+ $[25] = t10;
193
+ $[26] = t11;
194
+ $[27] = t12;
195
+ $[28] = t9.field;
196
+ $[29] = t13;
197
+ } else t13 = $[29];
198
+ let t14;
199
+ if ($[30] !== T0 || $[31] !== className || $[32] !== description || $[33] !== descriptionClassName || $[34] !== disabled || $[35] !== errorsClassName || $[36] !== label || $[37] !== labelClassName || $[38] !== required || $[39] !== t13 || $[40] !== t8) {
200
+ t14 = /* @__PURE__ */ jsx(T0, {
201
+ legend: label,
202
+ description,
203
+ errors: t8,
204
+ isRequired: required,
205
+ isDisabled: disabled,
206
+ className,
207
+ legendClassName: labelClassName,
208
+ descriptionClassName,
209
+ errorsClassName,
210
+ children: t13
211
+ });
212
+ $[30] = T0;
213
+ $[31] = className;
214
+ $[32] = description;
215
+ $[33] = descriptionClassName;
216
+ $[34] = disabled;
217
+ $[35] = errorsClassName;
218
+ $[36] = label;
219
+ $[37] = labelClassName;
220
+ $[38] = required;
221
+ $[39] = t13;
222
+ $[40] = t8;
223
+ $[41] = t14;
224
+ } else t14 = $[41];
225
+ return t14;
136
226
  }
137
227
  /**
138
228
  * The registry entry of the `file` type: the field's `multiple`, `accept` (or its `accept` rule)