@seij/common-ui 0.1.1 → 0.1.3

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 (41) hide show
  1. package/README.md +15 -3
  2. package/dist/index.d.ts +3 -2
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +101 -95
  5. package/dist/index.js.map +1 -1
  6. package/dist/init/SeijUIProvider.d.ts.map +1 -1
  7. package/dist/init/SeijUIProvider.js +8 -8
  8. package/dist/init/SeijUIProvider.js.map +1 -1
  9. package/dist/lib/applicationshell/ApplicationShell.js +30 -30
  10. package/dist/lib/applicationshell/ApplicationShell.js.map +1 -1
  11. package/dist/lib/i18n/i18n.detect.js +5 -6
  12. package/dist/lib/i18n/i18n.detect.js.map +1 -1
  13. package/dist/lib/i18n/i18n.react.d.ts +2 -11
  14. package/dist/lib/i18n/i18n.react.d.ts.map +1 -1
  15. package/dist/lib/i18n/i18n.react.js +29 -23
  16. package/dist/lib/i18n/i18n.react.js.map +1 -1
  17. package/dist/lib/i18n/i18n.service.d.ts +27 -0
  18. package/dist/lib/i18n/i18n.service.d.ts.map +1 -0
  19. package/dist/lib/i18n/i18n.service.js +65 -0
  20. package/dist/lib/i18n/i18n.service.js.map +1 -0
  21. package/dist/lib/i18n/i18n.types.d.ts +3 -3
  22. package/dist/lib/i18n/i18n.types.d.ts.map +1 -1
  23. package/dist/lib/i18n/index.d.ts +2 -1
  24. package/dist/lib/i18n/index.d.ts.map +1 -1
  25. package/dist/lib/localdate/InputLocalDate.js +1 -1
  26. package/dist/lib/localdate/InputLocalDate.js.map +1 -1
  27. package/dist/lib/month/InputMonth.js +1 -1
  28. package/dist/lib/month/InputMonth.js.map +1 -1
  29. package/dist/lib/number/InputNumber.js +56 -56
  30. package/dist/lib/number/InputNumber.js.map +1 -1
  31. package/dist/lib/percent/InputPercent.js +12 -12
  32. package/dist/lib/percent/InputPercent.js.map +1 -1
  33. package/dist/lib/select/InputSelect.js +15 -16
  34. package/dist/lib/select/InputSelect.js.map +1 -1
  35. package/dist/lib/view_layout/ViewTitle.js +16 -17
  36. package/dist/lib/view_layout/ViewTitle.js.map +1 -1
  37. package/package.json +4 -4
  38. package/dist/lib/i18n/i18n.factory.d.ts +0 -3
  39. package/dist/lib/i18n/i18n.factory.d.ts.map +0 -1
  40. package/dist/lib/i18n/i18n.factory.js +0 -70
  41. package/dist/lib/i18n/i18n.factory.js.map +0 -1
@@ -1,29 +1,35 @@
1
- import { jsx as f } from "react/jsx-runtime";
2
- import { toProblem as I } from "@seij/common-types";
3
- import { createContext as d, useContext as v, useMemo as p, useState as i, useEffect as x } from "react";
4
- import { normalize as C, detectClientLocale as h } from "./i18n.detect.js";
5
- import { createI18nEngine as E } from "./i18n.factory.js";
6
- const m = d(null);
7
- function z({ children: t, initialLocale: n, forcedLocale: o, load: s }) {
8
- const e = p(
9
- () => C(o || n || h()),
10
- [o, n]
11
- ), [u, c] = i(null), [a, l] = i(null);
12
- return x(() => {
13
- s(e).then((r) => {
14
- c(E(e, r.messages, r.formats)), l(null);
15
- }).catch((r) => {
16
- l(I(r));
1
+ import { jsx as u } from "react/jsx-runtime";
2
+ import i from "i18next";
3
+ import { createContext as g, useContext as f, useState as v, useMemo as s } from "react";
4
+ import { normalize as I, detectClientLocale as d } from "./i18n.detect.js";
5
+ import { I18nServiceInstance as n } from "./i18n.service.js";
6
+ const a = g({ i18nService: n, lastChange: 0 });
7
+ function S({ children: e, initialLocale: t }) {
8
+ const [r, c] = v(0);
9
+ s(() => {
10
+ const o = I(t || d());
11
+ o !== i.language && n.readyPromise.then(() => {
12
+ i.changeLanguage(o, () => {
13
+ c((/* @__PURE__ */ new Date()).getTime());
14
+ });
17
15
  });
18
- }, [e, s]), a ? "Could not load locale " + e : u ? /* @__PURE__ */ f(m.Provider, { value: u, children: t }) : null;
16
+ }, [t]);
17
+ const m = s(
18
+ () => ({
19
+ i18nService: n,
20
+ lastChange: r
21
+ }),
22
+ [r]
23
+ );
24
+ return /* @__PURE__ */ u(a.Provider, { value: m, children: e });
19
25
  }
20
- function M() {
21
- const t = v(m);
22
- if (!t) throw new Error("useI18n must be used within I18nProvider");
23
- return t;
26
+ function w() {
27
+ const e = f(a);
28
+ if (!e) throw new Error("useI18n must be used within I18nProvider");
29
+ return e.i18nService;
24
30
  }
25
31
  export {
26
- z as I18nProvider,
27
- M as useI18n
32
+ S as I18nProvider,
33
+ w as useI18n
28
34
  };
29
35
  //# sourceMappingURL=i18n.react.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.react.js","sources":["../../../src/lib/i18n/i18n.react.tsx"],"sourcesContent":["// i18n/I18nProvider.tsx\nimport { Problem, toProblem } from \"@seij/common-types\";\nimport React, { createContext, useContext, useEffect, useMemo, useState } from \"react\";\nimport { detectClientLocale, normalize } from \"./i18n.detect\";\nimport { createI18nEngine } from \"./i18n.factory\";\nimport { Formats, I18n, Messages } from \"./i18n.types\";\n\ntype Loader = (locale: string) => Promise<{ messages: Messages; formats: Formats }>;\n\nconst I18nCtx = createContext<I18n | null>(null);\n\nexport interface I18nProviderProps {\n children: React.ReactNode;\n /** SSR hydrate */\n initialLocale?: string;\n /** for tests, storybook, preview */\n forcedLocale?: string;\n /** Lazy loading by locale of messages and formats (promise) */\n load: Loader;\n}\n\nexport function I18nProvider({ children, initialLocale, forcedLocale, load }: I18nProviderProps) {\n // Detects the locale: first used the forced one, then initial, then use autodetection\n const locale = useMemo(\n () => normalize(forcedLocale || initialLocale || detectClientLocale()),\n [forcedLocale, initialLocale],\n );\n\n const [validInstance, setValidInstance] = useState<I18n | null>(null);\n const [error, setError] = useState<Problem | null>(null);\n\n useEffect(() => {\n load(locale)\n .then((resp) => {\n setValidInstance(createI18nEngine(locale, resp.messages, resp.formats));\n setError(null);\n })\n .catch((err) => {\n setError(toProblem(err));\n });\n }, [locale, load]);\n\n if (error) return \"Could not load locale \" + locale;\n if (!validInstance) return null;\n return <I18nCtx.Provider value={validInstance}>{children}</I18nCtx.Provider>;\n}\n\nexport function useI18n(): I18n {\n const v = useContext(I18nCtx);\n if (!v) throw new Error(\"useI18n must be used within I18nProvider\");\n return v;\n}\n"],"names":["I18nCtx","createContext","I18nProvider","children","initialLocale","forcedLocale","load","locale","useMemo","normalize","detectClientLocale","validInstance","setValidInstance","useState","error","setError","useEffect","resp","createI18nEngine","err","toProblem","useI18n","v","useContext"],"mappings":";;;;;AASA,MAAMA,IAAUC,EAA2B,IAAI;AAYxC,SAASC,EAAa,EAAE,UAAAC,GAAU,eAAAC,GAAe,cAAAC,GAAc,MAAAC,KAA2B;AAE/F,QAAMC,IAASC;AAAA,IACb,MAAMC,EAAUJ,KAAgBD,KAAiBM,GAAoB;AAAA,IACrE,CAACL,GAAcD,CAAa;AAAA,EAAA,GAGxB,CAACO,GAAeC,CAAgB,IAAIC,EAAsB,IAAI,GAC9D,CAACC,GAAOC,CAAQ,IAAIF,EAAyB,IAAI;AAavD,SAXAG,EAAU,MAAM;AACd,IAAAV,EAAKC,CAAM,EACR,KAAK,CAACU,MAAS;AACd,MAAAL,EAAiBM,EAAiBX,GAAQU,EAAK,UAAUA,EAAK,OAAO,CAAC,GACtEF,EAAS,IAAI;AAAA,IACf,CAAC,EACA,MAAM,CAACI,MAAQ;AACd,MAAAJ,EAASK,EAAUD,CAAG,CAAC;AAAA,IACzB,CAAC;AAAA,EACL,GAAG,CAACZ,GAAQD,CAAI,CAAC,GAEbQ,IAAc,2BAA2BP,IACxCI,sBACGX,EAAQ,UAAR,EAAiB,OAAOW,GAAgB,UAAAR,GAAS,IAD9B;AAE7B;AAEO,SAASkB,IAAgB;AAC9B,QAAMC,IAAIC,EAAWvB,CAAO;AAC5B,MAAI,CAACsB,EAAG,OAAM,IAAI,MAAM,0CAA0C;AAClE,SAAOA;AACT;"}
1
+ {"version":3,"file":"i18n.react.js","sources":["../../../src/lib/i18n/i18n.react.tsx"],"sourcesContent":["// i18n/I18nProvider.tsx\nimport i18next from \"i18next\";\nimport React, { createContext, useContext, useMemo, useState } from \"react\";\nimport { detectClientLocale, normalize } from \"./i18n.detect\";\nimport { I18nService, I18nServiceInstance } from \"./i18n.service\";\nimport { I18n } from \"./i18n.types\";\n\ntype I18nCtxType = {\n i18nService: I18nService;\n lastChange: number;\n};\nconst I18nCtx = createContext<I18nCtxType>({ i18nService: I18nServiceInstance, lastChange: 0 });\n\nexport interface I18nProviderProps {\n children: React.ReactNode;\n /** SSR hydrate */\n initialLocale?: string;\n}\n\nexport function I18nProvider({ children, initialLocale }: I18nProviderProps) {\n // Detects the locale: first used the forced one, then initial, then use autodetection\n\n const [instanceTs, setInstanceTs] = useState(0);\n useMemo(() => {\n const language = normalize(initialLocale || detectClientLocale());\n if (language !== i18next.language) {\n I18nServiceInstance.readyPromise.then(() => {\n i18next.changeLanguage(language, () => {\n setInstanceTs(new Date().getTime());\n });\n });\n }\n }, [initialLocale]);\n\n const value: I18nCtxType = useMemo(\n () => ({\n i18nService: I18nServiceInstance,\n lastChange: instanceTs,\n }),\n [instanceTs],\n );\n\n return <I18nCtx.Provider value={value}>{children}</I18nCtx.Provider>;\n}\n\nexport function useI18n(): I18n {\n const v = useContext(I18nCtx);\n if (!v) throw new Error(\"useI18n must be used within I18nProvider\");\n return v.i18nService;\n}\n"],"names":["I18nCtx","createContext","I18nServiceInstance","I18nProvider","children","initialLocale","instanceTs","setInstanceTs","useState","useMemo","language","normalize","detectClientLocale","i18next","value","jsx","useI18n","v","useContext"],"mappings":";;;;;AAWA,MAAMA,IAAUC,EAA2B,EAAE,aAAaC,GAAqB,YAAY,GAAG;AAQvF,SAASC,EAAa,EAAE,UAAAC,GAAU,eAAAC,KAAoC;AAG3E,QAAM,CAACC,GAAYC,CAAa,IAAIC,EAAS,CAAC;AAC9C,EAAAC,EAAQ,MAAM;AACZ,UAAMC,IAAWC,EAAUN,KAAiBO,EAAA,CAAoB;AAChE,IAAIF,MAAaG,EAAQ,YACvBX,EAAoB,aAAa,KAAK,MAAM;AAC1C,MAAAW,EAAQ,eAAeH,GAAU,MAAM;AACrC,QAAAH,GAAc,oBAAI,KAAA,GAAO,QAAA,CAAS;AAAA,MACpC,CAAC;AAAA,IACH,CAAC;AAAA,EAEL,GAAG,CAACF,CAAa,CAAC;AAElB,QAAMS,IAAqBL;AAAA,IACzB,OAAO;AAAA,MACL,aAAaP;AAAA,MACb,YAAYI;AAAA,IAAA;AAAA,IAEd,CAACA,CAAU;AAAA,EAAA;AAGb,SAAO,gBAAAS,EAACf,EAAQ,UAAR,EAAiB,OAAAc,GAAe,UAAAV,EAAA,CAAS;AACnD;AAEO,SAASY,IAAgB;AAC9B,QAAMC,IAAIC,EAAWlB,CAAO;AAC5B,MAAI,CAACiB,EAAG,OAAM,IAAI,MAAM,0CAA0C;AAClE,SAAOA,EAAE;AACX;"}
@@ -0,0 +1,27 @@
1
+ import { I18n } from './i18n.types';
2
+ export declare class I18nService implements I18n {
3
+ readyPromise: Promise<import('i18next').TFunction<"translation", undefined>>;
4
+ getLocale: () => string;
5
+ rich: (id: string, values?: Record<string, unknown | ((chunks: string) => React.ReactNode)>) => React.ReactNode;
6
+ t: (id: string, values?: Record<string, unknown>) => string;
7
+ formats: () => import('./i18n.types').Formats;
8
+ language: () => string;
9
+ dtf: (style?: string) => Intl.DateTimeFormat;
10
+ nf: (style?: string) => Intl.NumberFormat;
11
+ lf: (style?: string) => Intl.ListFormat;
12
+ rtf: () => Intl.RelativeTimeFormat;
13
+ formatDate: (d: Date | number, style?: string) => string;
14
+ formatNumber: (n: number, style?: string) => string;
15
+ formatList: (items: string[], style?: string) => string;
16
+ formatRelative: (d: Date | number) => string;
17
+ localDatePlaceholder: () => string;
18
+ localDateInputMask: () => string;
19
+ localDateFormattedToISO: (str: string) => string;
20
+ localDateISOToFormattedInput: (str: string) => string;
21
+ monthList: () => {
22
+ code: number;
23
+ label: string;
24
+ }[];
25
+ }
26
+ export declare const I18nServiceInstance: I18nService;
27
+ //# sourceMappingURL=i18n.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.service.d.ts","sourceRoot":"","sources":["../../../src/lib/i18n/i18n.service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAUpC,qBAAa,WAAY,YAAW,IAAI;IACtC,YAAY,iEAA8B;IAE1C,SAAS,QAAO,MAAM,CAEpB;IAEF,IAAI,GAAI,IAAI,MAAM,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC,KAAG,KAAK,CAAC,SAAS,CAE5G;IAEF,CAAC,GAAI,IAAI,MAAM,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,CAExD;IAEF,OAAO,uCAEL;IAEF,QAAQ,eAEN;IAEF,GAAG,GAAI,QAAQ,MAAM,yBAEnB;IAEF,EAAE,GAAI,QAAQ,MAAM,uBAEnB;IAED,EAAE,GAAI,QAAQ,MAAM,qBAKnB;IAED,GAAG,gCAEF;IAED,UAAU,GAAI,GAAG,IAAI,GAAG,MAAM,EAAE,QAAQ,MAAM,KAAG,MAAM,CAEtD;IAED,YAAY,GAAG,GAAG,MAAM,EAAE,QAAQ,MAAM,KAAG,MAAM,CAEhD;IAED,UAAU,GAAI,OAAO,MAAM,EAAE,EAAE,QAAQ,MAAM,KAAG,MAAM,CAErD;IAED,cAAc,GAAI,GAAG,IAAI,GAAG,MAAM,KAAG,MAAM,CA4B1C;IAED,oBAAoB,QAAO,MAAM,CAEhC;IAED,kBAAkB,QAAO,MAAM,CAE9B;IAED,uBAAuB,GAAI,KAAK,MAAM,KAAG,MAAM,CAU9C;IAED,4BAA4B,GAAI,KAAK,MAAM,KAAG,MAAM,CAcnD;IAED,SAAS;cAKqC,MAAM;eAAS,MAAM;QAHlE;CACF;AAQD,eAAO,MAAM,mBAAmB,aAAoB,CAAC"}
@@ -0,0 +1,65 @@
1
+ import { parse as f, isDate as s, isValid as i, formatISO as c, format as h } from "date-fns";
2
+ import d from "i18next";
3
+ import g from "i18next-icu";
4
+ import m from "../../locales/fr.js";
5
+ import u from "../../locales/en.js";
6
+ import { isString as p } from "lodash-es";
7
+ const n = d.createInstance(), I = n.use(g).init({
8
+ debug: !0,
9
+ resources: { fr: { translation: m.messages }, en: { translation: u.messages } },
10
+ interpolation: { escapeValue: !1 }
11
+ });
12
+ class D {
13
+ readyPromise = I;
14
+ getLocale = () => n.language;
15
+ rich = (t, e) => n.t(t, e);
16
+ t = (t, e) => n.t(t, e);
17
+ formats = () => n.language === "fr" ? m.formats : u.formats;
18
+ language = () => n.language;
19
+ dtf = (t) => new Intl.DateTimeFormat(this.language(), t && this.formats().date[t] || void 0);
20
+ nf = (t) => new Intl.NumberFormat(this.language(), t && this.formats().number[t] || void 0);
21
+ lf = (t) => new Intl.ListFormat(
22
+ this.language(),
23
+ t && this.formats().list[t] || { type: "conjunction", style: "long" }
24
+ );
25
+ rtf = () => new Intl.RelativeTimeFormat(this.language(), { numeric: "auto" });
26
+ formatDate = (t, e) => this.dtf(e).format(t);
27
+ formatNumber = (t, e) => this.nf(e).format(t);
28
+ formatList = (t, e) => this.lf(e).format(t);
29
+ formatRelative = (t) => {
30
+ const e = (Number(t) - Date.now()) / 1e3, a = Math.abs(e), r = a < 60 ? "second" : a < 3600 ? "minute" : a < 86400 ? "hour" : a < 2592e3 ? "day" : a < 31536e3 ? "month" : "year", l = Math.round(r === "second" ? e : r === "minute" ? e / 60 : r === "hour" ? e / 3600 : r === "day" ? e / 86400 : r === "month" ? e / 2592e3 : e / 31536e3);
31
+ return this.rtf().format(l, r);
32
+ };
33
+ localDatePlaceholder = () => this.formats().localdate.placeholder;
34
+ localDateInputMask = () => this.formats().localdate.inputmask;
35
+ localDateFormattedToISO = (t) => {
36
+ const e = this.formats().localdate.inputmask, a = f(
37
+ t,
38
+ e,
39
+ /* @__PURE__ */ new Date()
40
+ // { locale: fr }
41
+ );
42
+ return !s(a) || !i(a) ? "" : c(a, { representation: "date" });
43
+ };
44
+ localDateISOToFormattedInput = (t) => {
45
+ const e = this.formats().localdate.inputmask;
46
+ let a;
47
+ if (p(t)) {
48
+ const r = new Date(t);
49
+ s(r) && i(r) ? a = h(r, e) : a = "";
50
+ } else
51
+ a = "";
52
+ return a;
53
+ };
54
+ monthList = () => M(this.language());
55
+ }
56
+ function M(o) {
57
+ const t = new Intl.DateTimeFormat(o, { month: "long" });
58
+ return Array.from({ length: 12 }, (a, r) => t.format(new Date(2e3, r, 1))).map((a, r) => ({ code: r + 1, label: a }));
59
+ }
60
+ const S = new D();
61
+ export {
62
+ D as I18nService,
63
+ S as I18nServiceInstance
64
+ };
65
+ //# sourceMappingURL=i18n.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.service.js","sources":["../../../src/lib/i18n/i18n.service.ts"],"sourcesContent":["import { format, formatISO, isDate, isValid, parse } from \"date-fns\";\nimport i18next from \"i18next\";\nimport ICU from \"i18next-icu\";\n\nimport fr from \"../../locales/fr\";\nimport en from \"../../locales/en\";\nimport { I18n } from \"./i18n.types\";\nimport { isString } from \"lodash-es\";\n\nconst i18NextInstance = i18next.createInstance();\nconst i18NextinstanceInitPromise = i18NextInstance.use(ICU).init({\n debug: true,\n resources: { fr: { translation: fr.messages }, en: { translation: en.messages } },\n interpolation: { escapeValue: false },\n});\n\nexport class I18nService implements I18n {\n readyPromise = i18NextinstanceInitPromise;\n\n getLocale = (): string => {\n return i18NextInstance.language;\n };\n\n rich = (id: string, values?: Record<string, unknown | ((chunks: string) => React.ReactNode)>): React.ReactNode => {\n return i18NextInstance.t(id, values);\n };\n\n t = (id: string, values?: Record<string, unknown>): string => {\n return i18NextInstance.t(id, values);\n };\n\n formats = () => {\n return i18NextInstance.language === \"fr\" ? fr.formats : en.formats;\n };\n\n language = () => {\n return i18NextInstance.language;\n };\n\n dtf = (style?: string) => {\n return new Intl.DateTimeFormat(this.language(), (style && this.formats().date[style]) || undefined);\n };\n\n nf = (style?: string) => {\n return new Intl.NumberFormat(this.language(), (style && this.formats().number[style]) || undefined);\n }\n\n lf = (style?: string) => {\n return new Intl.ListFormat(\n this.language(),\n (style && this.formats().list[style]) || { type: \"conjunction\", style: \"long\" },\n );\n }\n\n rtf = () => {\n return new Intl.RelativeTimeFormat(this.language(), { numeric: \"auto\" });\n }\n\n formatDate = (d: Date | number, style?: string): string => {\n return this.dtf(style).format(d);\n }\n\n formatNumber =(n: number, style?: string): string => {\n return this.nf(style).format(n);\n }\n\n formatList = (items: string[], style?: string): string => {\n return this.lf(style).format(items);\n }\n\n formatRelative = (d: Date | number): string => {\n const diff = (Number(d) - Date.now()) / 1000;\n const abs = Math.abs(diff);\n const unit =\n abs < 60\n ? \"second\"\n : abs < 3600\n ? \"minute\"\n : abs < 86400\n ? \"hour\"\n : abs < 2592000\n ? \"day\"\n : abs < 31536000\n ? \"month\"\n : \"year\";\n const value =\n unit === \"second\"\n ? Math.round(diff)\n : unit === \"minute\"\n ? Math.round(diff / 60)\n : unit === \"hour\"\n ? Math.round(diff / 3600)\n : unit === \"day\"\n ? Math.round(diff / 86400)\n : unit === \"month\"\n ? Math.round(diff / 2592000)\n : Math.round(diff / 31536000);\n return this.rtf().format(value, unit as Intl.RelativeTimeFormatUnit);\n }\n\n localDatePlaceholder = (): string => {\n return this.formats().localdate.placeholder;\n }\n\n localDateInputMask = (): string => {\n return this.formats().localdate.inputmask;\n }\n\n localDateFormattedToISO = (str: string): string => {\n const inputMask = this.formats().localdate.inputmask;\n const parsed = parse(\n str,\n inputMask,\n new Date(),\n // { locale: fr }\n );\n if (!isDate(parsed) || !isValid(parsed)) return \"\";\n return formatISO(parsed, { representation: \"date\" });\n }\n\n localDateISOToFormattedInput = (str: string): string => {\n const inputMask = this.formats().localdate.inputmask;\n let result;\n if (isString(str)) {\n const date = new Date(str);\n if (isDate(date) && isValid(date)) {\n result = format(date, inputMask);\n } else {\n result = \"\";\n }\n } else {\n result = \"\";\n }\n return result;\n }\n\n monthList = () => {\n return getMonthNames(this.language());\n }\n}\n\nfunction getMonthNames(locale: string): { code: number; label: string }[] {\n const formatter = new Intl.DateTimeFormat(locale, { month: \"long\" });\n const months = Array.from({ length: 12 }, (_, i) => formatter.format(new Date(2000, i, 1)));\n return months.map((i, index) => ({ code: index + 1, label: i }));\n}\n\nexport const I18nServiceInstance = new I18nService();\n"],"names":["i18NextInstance","i18next","i18NextinstanceInitPromise","ICU","fr","en","I18nService","id","values","style","d","n","items","diff","abs","unit","value","str","inputMask","parsed","parse","isDate","isValid","formatISO","result","isString","date","format","getMonthNames","locale","formatter","_","i","index","I18nServiceInstance"],"mappings":";;;;;;AASA,MAAMA,IAAkBC,EAAQ,eAAA,GAC1BC,IAA6BF,EAAgB,IAAIG,CAAG,EAAE,KAAK;AAAA,EAC/D,OAAO;AAAA,EACP,WAAW,EAAE,IAAI,EAAE,aAAaC,EAAG,YAAY,IAAI,EAAE,aAAaC,EAAG,WAAS;AAAA,EAC9E,eAAe,EAAE,aAAa,GAAA;AAChC,CAAC;AAEM,MAAMC,EAA4B;AAAA,EACvC,eAAeJ;AAAA,EAEf,YAAY,MACHF,EAAgB;AAAA,EAGzB,OAAO,CAACO,GAAYC,MACXR,EAAgB,EAAEO,GAAIC,CAAM;AAAA,EAGrC,IAAI,CAACD,GAAYC,MACRR,EAAgB,EAAEO,GAAIC,CAAM;AAAA,EAGrC,UAAU,MACDR,EAAgB,aAAa,OAAOI,EAAG,UAAUC,EAAG;AAAA,EAG7D,WAAW,MACFL,EAAgB;AAAA,EAGzB,MAAM,CAACS,MACE,IAAI,KAAK,eAAe,KAAK,SAAA,GAAaA,KAAS,KAAK,QAAA,EAAU,KAAKA,CAAK,KAAM,MAAS;AAAA,EAGpG,KAAK,CAACA,MACG,IAAI,KAAK,aAAa,KAAK,SAAA,GAAaA,KAAS,KAAK,QAAA,EAAU,OAAOA,CAAK,KAAM,MAAS;AAAA,EAGpG,KAAK,CAACA,MACG,IAAI,KAAK;AAAA,IACd,KAAK,SAAA;AAAA,IACJA,KAAS,KAAK,QAAA,EAAU,KAAKA,CAAK,KAAM,EAAE,MAAM,eAAe,OAAO,OAAA;AAAA,EAAO;AAAA,EAIlF,MAAM,MACG,IAAI,KAAK,mBAAmB,KAAK,YAAY,EAAE,SAAS,QAAQ;AAAA,EAGzE,aAAa,CAACC,GAAkBD,MACvB,KAAK,IAAIA,CAAK,EAAE,OAAOC,CAAC;AAAA,EAGjC,eAAc,CAACC,GAAWF,MACjB,KAAK,GAAGA,CAAK,EAAE,OAAOE,CAAC;AAAA,EAGhC,aAAa,CAACC,GAAiBH,MACtB,KAAK,GAAGA,CAAK,EAAE,OAAOG,CAAK;AAAA,EAGpC,iBAAiB,CAACF,MAA6B;AAC7C,UAAMG,KAAQ,OAAOH,CAAC,IAAI,KAAK,SAAS,KAClCI,IAAM,KAAK,IAAID,CAAI,GACnBE,IACJD,IAAM,KACF,WACAA,IAAM,OACJ,WACAA,IAAM,QACJ,SACAA,IAAM,SACJ,QACAA,IAAM,UACJ,UACA,QACRE,IAEA,KAAK,MADTD,MAAS,WACMF,IACXE,MAAS,WACIF,IAAO,KAClBE,MAAS,SACIF,IAAO,OAClBE,MAAS,QACIF,IAAO,QAClBE,MAAS,UACIF,IAAO,SACPA,IAAO,OATX;AAUrB,WAAO,KAAK,IAAA,EAAM,OAAOG,GAAOD,CAAmC;AAAA,EACrE;AAAA,EAEA,uBAAuB,MACd,KAAK,UAAU,UAAU;AAAA,EAGlC,qBAAqB,MACZ,KAAK,UAAU,UAAU;AAAA,EAGlC,0BAA0B,CAACE,MAAwB;AACjD,UAAMC,IAAY,KAAK,QAAA,EAAU,UAAU,WACrCC,IAASC;AAAA,MACbH;AAAA,MACAC;AAAA,0BACI,KAAA;AAAA;AAAA,IAAK;AAGX,WAAI,CAACG,EAAOF,CAAM,KAAK,CAACG,EAAQH,CAAM,IAAU,KACzCI,EAAUJ,GAAQ,EAAE,gBAAgB,QAAQ;AAAA,EACrD;AAAA,EAEA,+BAA+B,CAACF,MAAwB;AACtD,UAAMC,IAAY,KAAK,QAAA,EAAU,UAAU;AAC3C,QAAIM;AACJ,QAAIC,EAASR,CAAG,GAAG;AACjB,YAAMS,IAAO,IAAI,KAAKT,CAAG;AACzB,MAAII,EAAOK,CAAI,KAAKJ,EAAQI,CAAI,IAC9BF,IAASG,EAAOD,GAAMR,CAAS,IAE/BM,IAAS;AAAA,IAEb;AACE,MAAAA,IAAS;AAEX,WAAOA;AAAA,EACT;AAAA,EAEA,YAAY,MACHI,EAAc,KAAK,UAAU;AAExC;AAEA,SAASA,EAAcC,GAAmD;AACxE,QAAMC,IAAY,IAAI,KAAK,eAAeD,GAAQ,EAAE,OAAO,QAAQ;AAEnE,SADe,MAAM,KAAK,EAAE,QAAQ,GAAA,GAAM,CAACE,GAAGC,MAAMF,EAAU,OAAO,IAAI,KAAK,KAAME,GAAG,CAAC,CAAC,CAAC,EAC5E,IAAI,CAACA,GAAGC,OAAW,EAAE,MAAMA,IAAQ,GAAG,OAAOD,EAAA,EAAI;AACjE;AAEO,MAAME,IAAsB,IAAI5B,EAAA;"}
@@ -15,11 +15,11 @@ export interface I18n {
15
15
  formatNumber(n: number, style?: string): string;
16
16
  formatList(items: string[], style?: string): string;
17
17
  formatRelative(d: Date | number): string;
18
- localDatePlaceholder: string;
19
- localDateInputMask: string;
18
+ localDatePlaceholder(): string;
19
+ localDateInputMask(): string;
20
20
  localDateFormattedToISO: (str: string) => string;
21
21
  localDateISOToFormattedInput: (str: string) => string;
22
- monthList: {
22
+ monthList(): {
23
23
  code: number;
24
24
  label: string;
25
25
  }[];
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.types.d.ts","sourceRoot":"","sources":["../../../src/lib/i18n/i18n.types.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC9C,MAAM,MAAM,OAAO,GAAG;IACpB,SAAS,EAAE;QACT,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACjD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACjD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;CAC9C,CAAC;AAEF,MAAM,WAAW,IAAI;IACnB,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC;IACxD,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;IAC5G,UAAU,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrD,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAChD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACpD,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;IACzC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,uBAAuB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACjD,4BAA4B,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACtD,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC7C,SAAS,IAAI,MAAM,CAAC;CACrB"}
1
+ {"version":3,"file":"i18n.types.d.ts","sourceRoot":"","sources":["../../../src/lib/i18n/i18n.types.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC9C,MAAM,MAAM,OAAO,GAAG;IACpB,SAAS,EAAE;QACT,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACjD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACjD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;CAC9C,CAAC;AAEF,MAAM,WAAW,IAAI;IACnB,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC;IACxD,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;IAC5G,UAAU,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrD,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAChD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACpD,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;IACzC,oBAAoB,IAAI,MAAM,CAAC;IAC/B,kBAAkB,IAAI,MAAM,CAAC;IAC7B,uBAAuB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACjD,4BAA4B,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACtD,SAAS,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/C,SAAS,IAAI,MAAM,CAAC;CACrB"}
@@ -1,3 +1,4 @@
1
1
  export * from './i18n.types';
2
- export * from './i18n.factory';
2
+ export { I18nService, I18nServiceInstance } from './i18n.service';
3
+ export { useI18n, I18nProvider, type I18nProviderProps } from './i18n.react';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/i18n/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/i18n/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACjE,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAC,MAAM,cAAc,CAAC"}
@@ -44,7 +44,7 @@ const N = S({
44
44
  children: ({ value: s, onChange: a }) => /* @__PURE__ */ f(
45
45
  y,
46
46
  {
47
- placeholder: $,
47
+ placeholder: $(),
48
48
  className: D.root,
49
49
  value: s,
50
50
  onChange: a,
@@ -1 +1 @@
1
- {"version":3,"file":"InputLocalDate.js","sources":["../../../src/lib/localdate/InputLocalDate.tsx"],"sourcesContent":["import { Input, makeStyles } from \"@fluentui/react-components\";\nimport { LocalDate } from \"@seij/common-types\";\nimport { forwardRef, InputHTMLAttributes, useCallback, useEffect, useState } from \"react\";\nimport { Rifm } from \"rifm\";\nimport { useI18n } from \"../i18n/i18n.react\";\n\nconst useStyles = makeStyles({\n root: {\n width: \"8em\",\n \"> input\": {\n textAlign: \"right\",\n },\n },\n});\n\nconst parseDigits = (string: string): string => (string.match(/\\d+/g) || []).join(\"\");\nconst formatDate = (string: string): string => {\n const digits = parseDigits(string);\n const chars = digits.split(\"\");\n return chars.reduce((r, v, index) => (index === 2 || index === 4 ? `${r}/${v}` : `${r}${v}`), \"\").substr(0, 10);\n};\n\nconst formatDateWithAppend = (string: string): string => {\n const res = formatDate(string);\n\n if (string.endsWith(\"/\")) {\n if (res.length === 2) {\n return `${res}/`;\n }\n\n if (res.length === 5) {\n return `${res}/`;\n }\n }\n return res;\n};\nconst appendHyphen = (v: string): string => (v.length === 2 || v.length === 5 ? `${v}/` : v);\n\n/**\n * Input field for local dates with automatic adding of /\n * Values are in ISO8601 date part only\n *\n * Controlled component only\n *\n * @param props same props as an input\n * @return {JSX.Element}\n */\nexport interface InputLocalDateProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"value\" | \"onChange\"> {\n value?: string;\n onValueChange?: (value: LocalDate) => void;\n}\n\nexport const InputLocalDate = forwardRef<HTMLInputElement, InputLocalDateProps>((props, ref) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { onValueChange, value = \"\", children, size, defaultValue, type, ...delegatedProps } = props;\n const classNames = useStyles();\n const { localDatePlaceholder, localDateFormattedToISO, localDateISOToFormattedInput } = useI18n();\n const [formattedA, setFormattedA] = useState(localDateISOToFormattedInput(value));\n const [normalizedValue, setNormalizedValue] = useState(value);\n\n useEffect(() => {\n if (value !== normalizedValue) {\n setNormalizedValue(value);\n setFormattedA(localDateISOToFormattedInput(value));\n }\n });\n\n const handleChange = useCallback(\n (inputValue: string) => {\n setFormattedA(inputValue);\n const parsed = localDateFormattedToISO(inputValue);\n if (parsed !== normalizedValue) {\n setNormalizedValue(parsed);\n if (onValueChange) onValueChange(parsed);\n }\n },\n [setFormattedA, normalizedValue, setNormalizedValue, onValueChange, localDateFormattedToISO],\n );\n return (\n <Rifm\n accept={/\\d+/g}\n mask={10 <= formattedA.length}\n format={formatDateWithAppend}\n append={appendHyphen}\n value={formattedA}\n onChange={handleChange}\n >\n {({ value, onChange }) => (\n <Input\n placeholder={localDatePlaceholder}\n className={classNames.root}\n value={value}\n onChange={onChange}\n ref={ref}\n {...delegatedProps}\n />\n )}\n </Rifm>\n );\n});\n"],"names":["useStyles","makeStyles","parseDigits","string","formatDate","r","v","index","formatDateWithAppend","res","appendHyphen","InputLocalDate","forwardRef","props","ref","onValueChange","value","children","size","defaultValue","type","delegatedProps","classNames","localDatePlaceholder","localDateFormattedToISO","localDateISOToFormattedInput","useI18n","formattedA","setFormattedA","useState","normalizedValue","setNormalizedValue","useEffect","handleChange","useCallback","inputValue","parsed","jsx","Rifm","onChange","Input"],"mappings":";;;;;AAMA,MAAMA,IAAYC,EAAW;AAAA,EAC3B,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,WAAW;AAAA,MACT,WAAW;AAAA,IAAA;AAAA,EACb;AAEJ,CAAC,GAEKC,IAAc,CAACC,OAA4BA,EAAO,MAAM,MAAM,KAAK,CAAA,GAAI,KAAK,EAAE,GAC9EC,IAAa,CAACD,MACHD,EAAYC,CAAM,EACZ,MAAM,EAAE,EAChB,OAAO,CAACE,GAAGC,GAAGC,MAAWA,MAAU,KAAKA,MAAU,IAAI,GAAGF,CAAC,IAAIC,CAAC,KAAK,GAAGD,CAAC,GAAGC,CAAC,IAAK,EAAE,EAAE,OAAO,GAAG,EAAE,GAG1GE,IAAuB,CAACL,MAA2B;AACvD,QAAMM,IAAML,EAAWD,CAAM;AAE7B,MAAIA,EAAO,SAAS,GAAG,GAAG;AACxB,QAAIM,EAAI,WAAW;AACjB,aAAO,GAAGA,CAAG;AAGf,QAAIA,EAAI,WAAW;AACjB,aAAO,GAAGA,CAAG;AAAA,EAEjB;AACA,SAAOA;AACT,GACMC,IAAe,CAACJ,MAAuBA,EAAE,WAAW,KAAKA,EAAE,WAAW,IAAI,GAAGA,CAAC,MAAMA,GAgB7EK,IAAiBC,EAAkD,CAACC,GAAOC,MAAQ;AAE9F,QAAM,EAAE,eAAAC,GAAe,OAAAC,IAAQ,IAAI,UAAAC,GAAU,MAAAC,GAAM,cAAAC,GAAc,MAAAC,GAAM,GAAGC,EAAA,IAAmBR,GACvFS,IAAatB,EAAA,GACb,EAAE,sBAAAuB,GAAsB,yBAAAC,GAAyB,8BAAAC,EAAA,IAAiCC,EAAA,GAClF,CAACC,GAAYC,CAAa,IAAIC,EAASJ,EAA6BT,CAAK,CAAC,GAC1E,CAACc,GAAiBC,CAAkB,IAAIF,EAASb,CAAK;AAE5D,EAAAgB,EAAU,MAAM;AACd,IAAIhB,MAAUc,MACZC,EAAmBf,CAAK,GACxBY,EAAcH,EAA6BT,CAAK,CAAC;AAAA,EAErD,CAAC;AAED,QAAMiB,IAAeC;AAAA,IACnB,CAACC,MAAuB;AACtB,MAAAP,EAAcO,CAAU;AACxB,YAAMC,IAASZ,EAAwBW,CAAU;AACjD,MAAIC,MAAWN,MACbC,EAAmBK,CAAM,GACrBrB,OAA6BqB,CAAM;AAAA,IAE3C;AAAA,IACA,CAACR,GAAeE,GAAiBC,GAAoBhB,GAAeS,CAAuB;AAAA,EAAA;AAE7F,SACE,gBAAAa;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,QAAQ;AAAA,MACR,MAAM,MAAMX,EAAW;AAAA,MACvB,QAAQnB;AAAA,MACR,QAAQE;AAAA,MACR,OAAOiB;AAAA,MACP,UAAUM;AAAA,MAET,UAAA,CAAC,EAAE,OAAAjB,GAAO,UAAAuB,QACT,gBAAAF;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,aAAajB;AAAA,UACb,WAAWD,EAAW;AAAA,UACtB,OAAON;AAAAA,UACP,UAAAuB;AAAA,UACA,KAAAzB;AAAA,UACC,GAAGO;AAAA,QAAA;AAAA,MAAA;AAAA,IACN;AAAA,EAAA;AAIR,CAAC;"}
1
+ {"version":3,"file":"InputLocalDate.js","sources":["../../../src/lib/localdate/InputLocalDate.tsx"],"sourcesContent":["import { Input, makeStyles } from \"@fluentui/react-components\";\nimport { LocalDate } from \"@seij/common-types\";\nimport { forwardRef, InputHTMLAttributes, useCallback, useEffect, useState } from \"react\";\nimport { Rifm } from \"rifm\";\nimport { useI18n } from \"../i18n/i18n.react\";\n\nconst useStyles = makeStyles({\n root: {\n width: \"8em\",\n \"> input\": {\n textAlign: \"right\",\n },\n },\n});\n\nconst parseDigits = (string: string): string => (string.match(/\\d+/g) || []).join(\"\");\nconst formatDate = (string: string): string => {\n const digits = parseDigits(string);\n const chars = digits.split(\"\");\n return chars.reduce((r, v, index) => (index === 2 || index === 4 ? `${r}/${v}` : `${r}${v}`), \"\").substr(0, 10);\n};\n\nconst formatDateWithAppend = (string: string): string => {\n const res = formatDate(string);\n\n if (string.endsWith(\"/\")) {\n if (res.length === 2) {\n return `${res}/`;\n }\n\n if (res.length === 5) {\n return `${res}/`;\n }\n }\n return res;\n};\nconst appendHyphen = (v: string): string => (v.length === 2 || v.length === 5 ? `${v}/` : v);\n\n/**\n * Input field for local dates with automatic adding of /\n * Values are in ISO8601 date part only\n *\n * Controlled component only\n *\n * @param props same props as an input\n * @return {JSX.Element}\n */\nexport interface InputLocalDateProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"value\" | \"onChange\"> {\n value?: string;\n onValueChange?: (value: LocalDate) => void;\n}\n\nexport const InputLocalDate = forwardRef<HTMLInputElement, InputLocalDateProps>((props, ref) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { onValueChange, value = \"\", children, size, defaultValue, type, ...delegatedProps } = props;\n const classNames = useStyles();\n const { localDatePlaceholder, localDateFormattedToISO, localDateISOToFormattedInput } = useI18n();\n const [formattedA, setFormattedA] = useState(localDateISOToFormattedInput(value));\n const [normalizedValue, setNormalizedValue] = useState(value);\n\n useEffect(() => {\n if (value !== normalizedValue) {\n setNormalizedValue(value);\n setFormattedA(localDateISOToFormattedInput(value));\n }\n });\n\n const handleChange = useCallback(\n (inputValue: string) => {\n setFormattedA(inputValue);\n const parsed = localDateFormattedToISO(inputValue);\n if (parsed !== normalizedValue) {\n setNormalizedValue(parsed);\n if (onValueChange) onValueChange(parsed);\n }\n },\n [setFormattedA, normalizedValue, setNormalizedValue, onValueChange, localDateFormattedToISO],\n );\n return (\n <Rifm\n accept={/\\d+/g}\n mask={10 <= formattedA.length}\n format={formatDateWithAppend}\n append={appendHyphen}\n value={formattedA}\n onChange={handleChange}\n >\n {({ value, onChange }) => (\n <Input\n placeholder={localDatePlaceholder()}\n className={classNames.root}\n value={value}\n onChange={onChange}\n ref={ref}\n {...delegatedProps}\n />\n )}\n </Rifm>\n );\n});\n"],"names":["useStyles","makeStyles","parseDigits","string","formatDate","r","v","index","formatDateWithAppend","res","appendHyphen","InputLocalDate","forwardRef","props","ref","onValueChange","value","children","size","defaultValue","type","delegatedProps","classNames","localDatePlaceholder","localDateFormattedToISO","localDateISOToFormattedInput","useI18n","formattedA","setFormattedA","useState","normalizedValue","setNormalizedValue","useEffect","handleChange","useCallback","inputValue","parsed","jsx","Rifm","onChange","Input"],"mappings":";;;;;AAMA,MAAMA,IAAYC,EAAW;AAAA,EAC3B,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,WAAW;AAAA,MACT,WAAW;AAAA,IAAA;AAAA,EACb;AAEJ,CAAC,GAEKC,IAAc,CAACC,OAA4BA,EAAO,MAAM,MAAM,KAAK,CAAA,GAAI,KAAK,EAAE,GAC9EC,IAAa,CAACD,MACHD,EAAYC,CAAM,EACZ,MAAM,EAAE,EAChB,OAAO,CAACE,GAAGC,GAAGC,MAAWA,MAAU,KAAKA,MAAU,IAAI,GAAGF,CAAC,IAAIC,CAAC,KAAK,GAAGD,CAAC,GAAGC,CAAC,IAAK,EAAE,EAAE,OAAO,GAAG,EAAE,GAG1GE,IAAuB,CAACL,MAA2B;AACvD,QAAMM,IAAML,EAAWD,CAAM;AAE7B,MAAIA,EAAO,SAAS,GAAG,GAAG;AACxB,QAAIM,EAAI,WAAW;AACjB,aAAO,GAAGA,CAAG;AAGf,QAAIA,EAAI,WAAW;AACjB,aAAO,GAAGA,CAAG;AAAA,EAEjB;AACA,SAAOA;AACT,GACMC,IAAe,CAACJ,MAAuBA,EAAE,WAAW,KAAKA,EAAE,WAAW,IAAI,GAAGA,CAAC,MAAMA,GAgB7EK,IAAiBC,EAAkD,CAACC,GAAOC,MAAQ;AAE9F,QAAM,EAAE,eAAAC,GAAe,OAAAC,IAAQ,IAAI,UAAAC,GAAU,MAAAC,GAAM,cAAAC,GAAc,MAAAC,GAAM,GAAGC,EAAA,IAAmBR,GACvFS,IAAatB,EAAA,GACb,EAAE,sBAAAuB,GAAsB,yBAAAC,GAAyB,8BAAAC,EAAA,IAAiCC,EAAA,GAClF,CAACC,GAAYC,CAAa,IAAIC,EAASJ,EAA6BT,CAAK,CAAC,GAC1E,CAACc,GAAiBC,CAAkB,IAAIF,EAASb,CAAK;AAE5D,EAAAgB,EAAU,MAAM;AACd,IAAIhB,MAAUc,MACZC,EAAmBf,CAAK,GACxBY,EAAcH,EAA6BT,CAAK,CAAC;AAAA,EAErD,CAAC;AAED,QAAMiB,IAAeC;AAAA,IACnB,CAACC,MAAuB;AACtB,MAAAP,EAAcO,CAAU;AACxB,YAAMC,IAASZ,EAAwBW,CAAU;AACjD,MAAIC,MAAWN,MACbC,EAAmBK,CAAM,GACrBrB,OAA6BqB,CAAM;AAAA,IAE3C;AAAA,IACA,CAACR,GAAeE,GAAiBC,GAAoBhB,GAAeS,CAAuB;AAAA,EAAA;AAE7F,SACE,gBAAAa;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,QAAQ;AAAA,MACR,MAAM,MAAMX,EAAW;AAAA,MACvB,QAAQnB;AAAA,MACR,QAAQE;AAAA,MACR,OAAOiB;AAAA,MACP,UAAUM;AAAA,MAET,UAAA,CAAC,EAAE,OAAAjB,GAAO,UAAAuB,QACT,gBAAAF;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,aAAajB,EAAA;AAAA,UACb,WAAWD,EAAW;AAAA,UACtB,OAAON;AAAAA,UACP,UAAAuB;AAAA,UACA,KAAAzB;AAAA,UACC,GAAGO;AAAA,QAAA;AAAA,MAAA;AAAA,IACN;AAAA,EAAA;AAIR,CAAC;"}
@@ -4,7 +4,7 @@ import { useI18n as p } from "../i18n/i18n.react.js";
4
4
  import { InputSelect as h } from "../select/InputSelect.js";
5
5
  const b = (l) => {
6
6
  const { value: r, onValueChange: c, required: i, ...m } = l, { monthList: t, t: o } = p(), s = a(() => {
7
- const e = t.map((n) => ({ code: "" + n.code, label: n.label }));
7
+ const e = t().map((n) => ({ code: "" + n.code, label: n.label }));
8
8
  return [{ code: "", label: "-- " + o("InputSelect_select") + " --" }, ...e];
9
9
  }, [t, o]);
10
10
  return /* @__PURE__ */ u(h, { options: s, value: "" + r, onValueChange: (e) => c(parseInt(e)), ...m });
@@ -1 +1 @@
1
- {"version":3,"file":"InputMonth.js","sources":["../../../src/lib/month/InputMonth.tsx"],"sourcesContent":["import { Month } from \"@seij/common-types\";\nimport React, { useMemo } from \"react\";\nimport { useI18n } from \"../i18n/i18n.react\";\nimport { InputSelect } from \"../select/InputSelect\";\n\ntype HTMLInputElementCurated = Omit<\n React.SelectHTMLAttributes<HTMLSelectElement>,\n \"value\" | \"defaultValue\" | \"onChange\" | \"children\"\n>;\n\nexport interface InputMonthProps extends HTMLInputElementCurated {\n value: Month;\n onValueChange: (value: Month) => unknown;\n}\n\n/**\n * Permet de saisir un mois.\n */\nexport const InputMonth: React.FC<InputMonthProps> = (props) => {\n const { value, onValueChange, required, ...other } = props;\n const { monthList, t } = useI18n();\n const options = useMemo(() => {\n const months = monthList.map((it) => ({ code: \"\" + it.code, label: it.label }));\n const emptyValueSelect = t(\"InputSelect_select\");\n return [{ code: \"\", label: \"-- \" + emptyValueSelect + \" --\" }, ...months];\n }, [monthList, t]);\n\n return (\n <InputSelect options={options} value={\"\" + value} onValueChange={(v) => onValueChange(parseInt(v))} {...other} />\n );\n};\n"],"names":["InputMonth","props","value","onValueChange","required","other","monthList","t","useI18n","options","useMemo","months","it","jsx","InputSelect","v"],"mappings":";;;;AAkBO,MAAMA,IAAwC,CAACC,MAAU;AAC9D,QAAM,EAAE,OAAAC,GAAO,eAAAC,GAAe,UAAAC,GAAU,GAAGC,MAAUJ,GAC/C,EAAE,WAAAK,GAAW,GAAAC,EAAA,IAAMC,EAAA,GACnBC,IAAUC,EAAQ,MAAM;AAC5B,UAAMC,IAASL,EAAU,IAAI,CAACM,OAAQ,EAAE,MAAM,KAAKA,EAAG,MAAM,OAAOA,EAAG,QAAQ;AAE9E,WAAO,CAAC,EAAE,MAAM,IAAI,OAAO,QADFL,EAAE,oBAAoB,IACO,SAAS,GAAGI,CAAM;AAAA,EAC1E,GAAG,CAACL,GAAWC,CAAC,CAAC;AAEjB,SACE,gBAAAM,EAACC,GAAA,EAAY,SAAAL,GAAkB,OAAO,KAAKP,GAAO,eAAe,CAACa,MAAMZ,EAAc,SAASY,CAAC,CAAC,GAAI,GAAGV,GAAO;AAEnH;"}
1
+ {"version":3,"file":"InputMonth.js","sources":["../../../src/lib/month/InputMonth.tsx"],"sourcesContent":["import { Month } from \"@seij/common-types\";\nimport React, { useMemo } from \"react\";\nimport { useI18n } from \"../i18n/i18n.react\";\nimport { InputSelect } from \"../select/InputSelect\";\n\ntype HTMLInputElementCurated = Omit<\n React.SelectHTMLAttributes<HTMLSelectElement>,\n \"value\" | \"defaultValue\" | \"onChange\" | \"children\"\n>;\n\nexport interface InputMonthProps extends HTMLInputElementCurated {\n value: Month;\n onValueChange: (value: Month) => unknown;\n}\n\n/**\n * Permet de saisir un mois.\n */\nexport const InputMonth: React.FC<InputMonthProps> = (props) => {\n const { value, onValueChange, required, ...other } = props;\n const { monthList, t } = useI18n();\n const options = useMemo(() => {\n const months = monthList().map((it) => ({ code: \"\" + it.code, label: it.label }));\n const emptyValueSelect = t(\"InputSelect_select\");\n return [{ code: \"\", label: \"-- \" + emptyValueSelect + \" --\" }, ...months];\n }, [monthList, t]);\n\n return (\n <InputSelect options={options} value={\"\" + value} onValueChange={(v) => onValueChange(parseInt(v))} {...other} />\n );\n};\n"],"names":["InputMonth","props","value","onValueChange","required","other","monthList","t","useI18n","options","useMemo","months","it","jsx","InputSelect","v"],"mappings":";;;;AAkBO,MAAMA,IAAwC,CAACC,MAAU;AAC9D,QAAM,EAAE,OAAAC,GAAO,eAAAC,GAAe,UAAAC,GAAU,GAAGC,MAAUJ,GAC/C,EAAE,WAAAK,GAAW,GAAAC,EAAA,IAAMC,EAAA,GACnBC,IAAUC,EAAQ,MAAM;AAC5B,UAAMC,IAASL,EAAA,EAAY,IAAI,CAACM,OAAQ,EAAE,MAAM,KAAKA,EAAG,MAAM,OAAOA,EAAG,QAAQ;AAEhF,WAAO,CAAC,EAAE,MAAM,IAAI,OAAO,QADFL,EAAE,oBAAoB,IACO,SAAS,GAAGI,CAAM;AAAA,EAC1E,GAAG,CAACL,GAAWC,CAAC,CAAC;AAEjB,SACE,gBAAAM,EAACC,GAAA,EAAY,SAAAL,GAAkB,OAAO,KAAKP,GAAO,eAAe,CAACa,MAAMZ,EAAc,SAASY,CAAC,CAAC,GAAI,GAAGV,GAAO;AAEnH;"}
@@ -1,82 +1,82 @@
1
- import { jsx as R } from "react/jsx-runtime";
2
- import { makeStyles as u, Input as y } from "@fluentui/react-components";
3
- import _, { useMemo as w, useEffect as L } from "react";
4
- const j = [",", "."], O = (r, c, t) => new RegExp(
5
- "^" + (r ? "-?" : "") + "\\d*" + (c > 0 ? "((\\.|,)\\d{0," + c + "})?" : "") + "$"
6
- ), T = u({
1
+ import { jsx as A } from "react/jsx-runtime";
2
+ import { makeStyles as I, Input as g } from "@fluentui/react-components";
3
+ import S, { useMemo as x, useEffect as E } from "react";
4
+ const T = [",", "."], R = (e, s, o) => new RegExp(
5
+ "^" + (e ? "-?" : "") + "\\d*" + (s > 0 ? "((\\.|,)\\d{0," + s + "})?" : "") + "$"
6
+ ), y = I({
7
7
  root: {
8
8
  "> input": {
9
9
  textAlign: "right"
10
10
  }
11
11
  }
12
- }), k = ({
13
- value: r,
14
- defaultValue: c,
15
- onValueChange: t,
16
- decimalScale: e = 0,
17
- allowNegative: N = !1,
18
- thousandSeparator: M = " ",
19
- min: d,
20
- max: p,
21
- size: B = 10,
22
- unit: A,
23
- ...I
12
+ }), B = ({
13
+ value: e,
14
+ defaultValue: s,
15
+ onValueChange: o,
16
+ decimalScale: a = 0,
17
+ allowNegative: p = !1,
18
+ thousandSeparator: l = " ",
19
+ min: i,
20
+ max: u,
21
+ size: _ = 10,
22
+ unit: N,
23
+ ...b
24
24
  }) => {
25
- const [m, f] = _.useState((r == null ? void 0 : r.toString()) ?? ""), S = T();
26
- r === void 0 && c === void 0 && console.warn("InputNumber must be provided a value or a defaultValue"), r !== void 0 && c !== void 0 && console.warn(
25
+ const [c, d] = S.useState(e?.toString() ?? ""), h = y();
26
+ e === void 0 && s === void 0 && console.warn("InputNumber must be provided a value or a defaultValue"), e !== void 0 && s !== void 0 && console.warn(
27
27
  "InputNumber can not be used as a controlled and uncontrolled component at the same time. You muse provide a value or a defaultValue but not both at the same time."
28
28
  );
29
- const b = w(
30
- () => O(N, e),
31
- [N, e, M]
29
+ const m = x(
30
+ () => R(p, a),
31
+ [p, a, l]
32
32
  );
33
- L(() => {
34
- f((r == null ? void 0 : r.toString()) ?? "");
35
- }, [r]);
36
- const x = (o) => {
37
- const s = o.target.value;
38
- if (b.test(s) || s === "") {
39
- if (f(s), s === "") {
40
- t == null || t(0);
33
+ E(() => {
34
+ d(e?.toString() ?? "");
35
+ }, [e]);
36
+ const v = (r) => {
37
+ const t = r.target.value;
38
+ if (m.test(t) || t === "") {
39
+ if (d(t), t === "") {
40
+ o?.(0);
41
41
  return;
42
42
  }
43
- const n = Number(s);
44
- if (!isNaN(n)) {
45
- let i = n;
46
- d !== void 0 && (i = Math.max(i, d)), p !== void 0 && (i = Math.min(i, p)), i !== r && (t == null || t(i));
43
+ const f = Number(t);
44
+ if (!isNaN(f)) {
45
+ let n = f;
46
+ i !== void 0 && (n = Math.max(n, i)), u !== void 0 && (n = Math.min(n, u)), n !== e && o?.(n);
47
47
  }
48
48
  }
49
- }, E = () => {
50
- if (m === "") {
51
- t == null || t(0);
49
+ }, M = () => {
50
+ if (c === "") {
51
+ o?.(0);
52
52
  return;
53
53
  }
54
- const o = Number(m);
55
- if (isNaN(o))
56
- t == null || t(0);
54
+ const r = Number(c);
55
+ if (isNaN(r))
56
+ o?.(0);
57
57
  else {
58
- let s = o;
59
- d !== void 0 && (s = Math.max(s, d)), p !== void 0 && (s = Math.min(s, p)), f(s.toString()), t == null || t(s);
58
+ let t = r;
59
+ i !== void 0 && (t = Math.max(t, i)), u !== void 0 && (t = Math.min(t, u)), d(t.toString()), o?.(t);
60
60
  }
61
61
  };
62
- return /* @__PURE__ */ R(
63
- y,
62
+ return /* @__PURE__ */ A(
63
+ g,
64
64
  {
65
- ...I,
66
- className: S.root,
65
+ ...b,
66
+ className: h.root,
67
67
  type: "number",
68
- value: m,
69
- onChange: x,
70
- onBlur: E,
71
- inputMode: e > 0 ? "decimal" : "numeric",
72
- pattern: b.source,
73
- onFocus: (o) => o.target.select(),
74
- contentAfter: A
68
+ value: c,
69
+ onChange: v,
70
+ onBlur: M,
71
+ inputMode: a > 0 ? "decimal" : "numeric",
72
+ pattern: m.source,
73
+ onFocus: (r) => r.target.select(),
74
+ contentAfter: N
75
75
  }
76
76
  );
77
77
  };
78
78
  export {
79
- j as INPUT_AMOUNT_ALLOWED_DECIMAL_SEPARATORS,
80
- k as InputNumber
79
+ T as INPUT_AMOUNT_ALLOWED_DECIMAL_SEPARATORS,
80
+ B as InputNumber
81
81
  };
82
82
  //# sourceMappingURL=InputNumber.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InputNumber.js","sources":["../../../src/lib/number/InputNumber.tsx"],"sourcesContent":["import { Input, InputProps, makeStyles } from \"@fluentui/react-components\";\nimport React, { useEffect, useMemo } from \"react\";\n\ntype HTMLInputElementCurated = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"value\" | \"defaultValue\" | \"onChange\" | \"type\" | \"min\" | \"max\" | \"children\"\n>;\nexport interface InputNumberProps extends HTMLInputElementCurated {\n id?: string;\n name?: string;\n value?: number;\n defaultValue?: number;\n min?: number;\n max?: number;\n onValueChange?: (value: number) => void;\n\n unit?: InputProps[\"contentAfter\"];\n}\n\nexport const INPUT_AMOUNT_ALLOWED_DECIMAL_SEPARATORS = [\",\", \".\"];\n\ninterface InputNumberCompletProps extends InputNumberProps {\n decimalScale?: number;\n allowNegative?: boolean;\n thousandSeparator?: string | boolean;\n}\n\nconst createRegexp = (allowNegative: boolean, decimalScale: number, thousandSeparator: string | boolean) => {\n return new RegExp(\n \"^\" +\n (allowNegative ? \"-?\" : \"\") +\n \"\\\\d*\" +\n (decimalScale > 0 ? \"((\\\\.|,)\\\\d{0,\" + decimalScale + \"})?\" : \"\") +\n \"$\",\n );\n};\n\nconst useStyles = makeStyles({\n root: {\n \"> input\": {\n textAlign: \"right\",\n },\n },\n});\n\nexport const InputNumber: React.FC<InputNumberCompletProps> = ({\n value,\n defaultValue,\n onValueChange,\n decimalScale = 0,\n allowNegative = false,\n thousandSeparator = \" \",\n min,\n max,\n size = 10,\n unit,\n ...rest\n}: InputNumberCompletProps) => {\n const [internalValue, setInternalValue] = React.useState<string>(value?.toString() ?? \"\");\n const styles = useStyles();\n\n if (value === undefined && defaultValue === undefined) {\n console.warn(\"InputNumber must be provided a value or a defaultValue\");\n }\n if (value !== undefined && defaultValue !== undefined) {\n console.warn(\n \"InputNumber can not be used as a controlled and uncontrolled component at the same time. You muse provide a value or a defaultValue but not both at the same time.\",\n );\n }\n\n // Toujours permettre d'écrire librement (même vide, -, . etc.)\n const rex = useMemo(\n () => createRegexp(allowNegative, decimalScale, thousandSeparator),\n [allowNegative, decimalScale, thousandSeparator],\n );\n\n useEffect(() => {\n // Synchroniser l'état interne si la prop change de l'extérieur\n setInternalValue(value?.toString() ?? \"\");\n }, [value]);\n\n const handleChange = (ev: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = ev.target.value;\n\n if (rex.test(newValue) || newValue === \"\") {\n setInternalValue(newValue);\n\n if (newValue === \"\") {\n onValueChange?.(0);\n return;\n }\n\n const parsed = Number(newValue);\n if (!isNaN(parsed)) {\n let clamped = parsed;\n if (min !== undefined) clamped = Math.max(clamped, min);\n if (max !== undefined) clamped = Math.min(clamped, max);\n if (clamped !== value) {\n onValueChange?.(clamped);\n }\n }\n }\n };\n\n const handleBlur = () => {\n if (internalValue === \"\") {\n onValueChange?.(0);\n return;\n }\n\n const parsed = Number(internalValue);\n if (!isNaN(parsed)) {\n let clamped = parsed;\n if (min !== undefined) clamped = Math.max(clamped, min);\n if (max !== undefined) clamped = Math.min(clamped, max);\n // IMPORTANT: on recale l'affichage après blur\n setInternalValue(clamped.toString());\n onValueChange?.(clamped);\n } else {\n onValueChange?.(0);\n }\n };\n\n return (\n <Input\n {...rest}\n className={styles.root}\n type=\"number\"\n value={internalValue}\n onChange={handleChange}\n onBlur={handleBlur}\n inputMode={decimalScale > 0 ? \"decimal\" : \"numeric\"}\n pattern={rex.source}\n onFocus={(e) => e.target.select()}\n contentAfter={unit}\n />\n );\n};\n"],"names":["INPUT_AMOUNT_ALLOWED_DECIMAL_SEPARATORS","createRegexp","allowNegative","decimalScale","thousandSeparator","useStyles","makeStyles","InputNumber","value","defaultValue","onValueChange","min","max","size","unit","rest","internalValue","setInternalValue","React","styles","rex","useMemo","useEffect","handleChange","ev","newValue","parsed","clamped","handleBlur","jsx","Input","e"],"mappings":";;;AAmBO,MAAMA,IAA0C,CAAC,KAAK,GAAG,GAQ1DC,IAAe,CAACC,GAAwBC,GAAsBC,MAC3D,IAAI;AAAA,EACT,OACGF,IAAgB,OAAO,MACxB,UACCC,IAAe,IAAI,mBAAmBA,IAAe,QAAQ,MAC9D;AAAA,GAIAE,IAAYC,EAAW;AAAA,EAC3B,MAAM;AAAA,IACJ,WAAW;AAAA,MACT,WAAW;AAAA,IAAA;AAAA,EACb;AAEJ,CAAC,GAEYC,IAAiD,CAAC;AAAA,EAC7D,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA,eAAAC;AAAA,EACA,cAAAP,IAAe;AAAA,EACf,eAAAD,IAAgB;AAAA,EAChB,mBAAAE,IAAoB;AAAA,EACpB,KAAAO;AAAA,EACA,KAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,MAAAC;AAAA,EACA,GAAGC;AACL,MAA+B;AAC7B,QAAM,CAACC,GAAeC,CAAgB,IAAIC,EAAM,UAAiBV,KAAA,gBAAAA,EAAO,eAAc,EAAE,GAClFW,IAASd,EAAA;AAEf,EAAIG,MAAU,UAAaC,MAAiB,UAC1C,QAAQ,KAAK,wDAAwD,GAEnED,MAAU,UAAaC,MAAiB,UAC1C,QAAQ;AAAA,IACN;AAAA,EAAA;AAKJ,QAAMW,IAAMC;AAAA,IACV,MAAMpB,EAAaC,GAAeC,CAA+B;AAAA,IACjE,CAACD,GAAeC,GAAcC,CAAiB;AAAA,EAAA;AAGjD,EAAAkB,EAAU,MAAM;AAEd,IAAAL,GAAiBT,KAAA,gBAAAA,EAAO,eAAc,EAAE;AAAA,EAC1C,GAAG,CAACA,CAAK,CAAC;AAEV,QAAMe,IAAe,CAACC,MAA4C;AAChE,UAAMC,IAAWD,EAAG,OAAO;AAE3B,QAAIJ,EAAI,KAAKK,CAAQ,KAAKA,MAAa,IAAI;AAGzC,UAFAR,EAAiBQ,CAAQ,GAErBA,MAAa,IAAI;AACnB,QAAAf,KAAA,QAAAA,EAAgB;AAChB;AAAA,MACF;AAEA,YAAMgB,IAAS,OAAOD,CAAQ;AAC9B,UAAI,CAAC,MAAMC,CAAM,GAAG;AAClB,YAAIC,IAAUD;AACd,QAAIf,MAAQ,WAAWgB,IAAU,KAAK,IAAIA,GAAShB,CAAG,IAClDC,MAAQ,WAAWe,IAAU,KAAK,IAAIA,GAASf,CAAG,IAClDe,MAAYnB,MACdE,KAAA,QAAAA,EAAgBiB;AAAA,MAEpB;AAAA,IACF;AAAA,EACF,GAEMC,IAAa,MAAM;AACvB,QAAIZ,MAAkB,IAAI;AACxB,MAAAN,KAAA,QAAAA,EAAgB;AAChB;AAAA,IACF;AAEA,UAAMgB,IAAS,OAAOV,CAAa;AACnC,QAAK,MAAMU,CAAM;AAQf,MAAAhB,KAAA,QAAAA,EAAgB;AAAA,SARE;AAClB,UAAIiB,IAAUD;AACd,MAAIf,MAAQ,WAAWgB,IAAU,KAAK,IAAIA,GAAShB,CAAG,IAClDC,MAAQ,WAAWe,IAAU,KAAK,IAAIA,GAASf,CAAG,IAEtDK,EAAiBU,EAAQ,UAAU,GACnCjB,KAAA,QAAAA,EAAgBiB;AAAA,IAClB;AAAA,EAGF;AAEA,SACE,gBAAAE;AAAA,IAACC;AAAA,IAAA;AAAA,MACE,GAAGf;AAAA,MACJ,WAAWI,EAAO;AAAA,MAClB,MAAK;AAAA,MACL,OAAOH;AAAA,MACP,UAAUO;AAAA,MACV,QAAQK;AAAA,MACR,WAAWzB,IAAe,IAAI,YAAY;AAAA,MAC1C,SAASiB,EAAI;AAAA,MACb,SAAS,CAACW,MAAMA,EAAE,OAAO,OAAA;AAAA,MACzB,cAAcjB;AAAA,IAAA;AAAA,EAAA;AAGpB;"}
1
+ {"version":3,"file":"InputNumber.js","sources":["../../../src/lib/number/InputNumber.tsx"],"sourcesContent":["import { Input, InputProps, makeStyles } from \"@fluentui/react-components\";\nimport React, { useEffect, useMemo } from \"react\";\n\ntype HTMLInputElementCurated = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"value\" | \"defaultValue\" | \"onChange\" | \"type\" | \"min\" | \"max\" | \"children\"\n>;\nexport interface InputNumberProps extends HTMLInputElementCurated {\n id?: string;\n name?: string;\n value?: number;\n defaultValue?: number;\n min?: number;\n max?: number;\n onValueChange?: (value: number) => void;\n\n unit?: InputProps[\"contentAfter\"];\n}\n\nexport const INPUT_AMOUNT_ALLOWED_DECIMAL_SEPARATORS = [\",\", \".\"];\n\ninterface InputNumberCompletProps extends InputNumberProps {\n decimalScale?: number;\n allowNegative?: boolean;\n thousandSeparator?: string | boolean;\n}\n\nconst createRegexp = (allowNegative: boolean, decimalScale: number, thousandSeparator: string | boolean) => {\n return new RegExp(\n \"^\" +\n (allowNegative ? \"-?\" : \"\") +\n \"\\\\d*\" +\n (decimalScale > 0 ? \"((\\\\.|,)\\\\d{0,\" + decimalScale + \"})?\" : \"\") +\n \"$\",\n );\n};\n\nconst useStyles = makeStyles({\n root: {\n \"> input\": {\n textAlign: \"right\",\n },\n },\n});\n\nexport const InputNumber: React.FC<InputNumberCompletProps> = ({\n value,\n defaultValue,\n onValueChange,\n decimalScale = 0,\n allowNegative = false,\n thousandSeparator = \" \",\n min,\n max,\n size = 10,\n unit,\n ...rest\n}: InputNumberCompletProps) => {\n const [internalValue, setInternalValue] = React.useState<string>(value?.toString() ?? \"\");\n const styles = useStyles();\n\n if (value === undefined && defaultValue === undefined) {\n console.warn(\"InputNumber must be provided a value or a defaultValue\");\n }\n if (value !== undefined && defaultValue !== undefined) {\n console.warn(\n \"InputNumber can not be used as a controlled and uncontrolled component at the same time. You muse provide a value or a defaultValue but not both at the same time.\",\n );\n }\n\n // Toujours permettre d'écrire librement (même vide, -, . etc.)\n const rex = useMemo(\n () => createRegexp(allowNegative, decimalScale, thousandSeparator),\n [allowNegative, decimalScale, thousandSeparator],\n );\n\n useEffect(() => {\n // Synchroniser l'état interne si la prop change de l'extérieur\n setInternalValue(value?.toString() ?? \"\");\n }, [value]);\n\n const handleChange = (ev: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = ev.target.value;\n\n if (rex.test(newValue) || newValue === \"\") {\n setInternalValue(newValue);\n\n if (newValue === \"\") {\n onValueChange?.(0);\n return;\n }\n\n const parsed = Number(newValue);\n if (!isNaN(parsed)) {\n let clamped = parsed;\n if (min !== undefined) clamped = Math.max(clamped, min);\n if (max !== undefined) clamped = Math.min(clamped, max);\n if (clamped !== value) {\n onValueChange?.(clamped);\n }\n }\n }\n };\n\n const handleBlur = () => {\n if (internalValue === \"\") {\n onValueChange?.(0);\n return;\n }\n\n const parsed = Number(internalValue);\n if (!isNaN(parsed)) {\n let clamped = parsed;\n if (min !== undefined) clamped = Math.max(clamped, min);\n if (max !== undefined) clamped = Math.min(clamped, max);\n // IMPORTANT: on recale l'affichage après blur\n setInternalValue(clamped.toString());\n onValueChange?.(clamped);\n } else {\n onValueChange?.(0);\n }\n };\n\n return (\n <Input\n {...rest}\n className={styles.root}\n type=\"number\"\n value={internalValue}\n onChange={handleChange}\n onBlur={handleBlur}\n inputMode={decimalScale > 0 ? \"decimal\" : \"numeric\"}\n pattern={rex.source}\n onFocus={(e) => e.target.select()}\n contentAfter={unit}\n />\n );\n};\n"],"names":["INPUT_AMOUNT_ALLOWED_DECIMAL_SEPARATORS","createRegexp","allowNegative","decimalScale","thousandSeparator","useStyles","makeStyles","InputNumber","value","defaultValue","onValueChange","min","max","size","unit","rest","internalValue","setInternalValue","React","styles","rex","useMemo","useEffect","handleChange","ev","newValue","parsed","clamped","handleBlur","jsx","Input","e"],"mappings":";;;AAmBO,MAAMA,IAA0C,CAAC,KAAK,GAAG,GAQ1DC,IAAe,CAACC,GAAwBC,GAAsBC,MAC3D,IAAI;AAAA,EACT,OACGF,IAAgB,OAAO,MACxB,UACCC,IAAe,IAAI,mBAAmBA,IAAe,QAAQ,MAC9D;AAAA,GAIAE,IAAYC,EAAW;AAAA,EAC3B,MAAM;AAAA,IACJ,WAAW;AAAA,MACT,WAAW;AAAA,IAAA;AAAA,EACb;AAEJ,CAAC,GAEYC,IAAiD,CAAC;AAAA,EAC7D,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA,eAAAC;AAAA,EACA,cAAAP,IAAe;AAAA,EACf,eAAAD,IAAgB;AAAA,EAChB,mBAAAE,IAAoB;AAAA,EACpB,KAAAO;AAAA,EACA,KAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,MAAAC;AAAA,EACA,GAAGC;AACL,MAA+B;AAC7B,QAAM,CAACC,GAAeC,CAAgB,IAAIC,EAAM,SAAiBV,GAAO,SAAA,KAAc,EAAE,GAClFW,IAASd,EAAA;AAEf,EAAIG,MAAU,UAAaC,MAAiB,UAC1C,QAAQ,KAAK,wDAAwD,GAEnED,MAAU,UAAaC,MAAiB,UAC1C,QAAQ;AAAA,IACN;AAAA,EAAA;AAKJ,QAAMW,IAAMC;AAAA,IACV,MAAMpB,EAAaC,GAAeC,CAA+B;AAAA,IACjE,CAACD,GAAeC,GAAcC,CAAiB;AAAA,EAAA;AAGjD,EAAAkB,EAAU,MAAM;AAEd,IAAAL,EAAiBT,GAAO,SAAA,KAAc,EAAE;AAAA,EAC1C,GAAG,CAACA,CAAK,CAAC;AAEV,QAAMe,IAAe,CAACC,MAA4C;AAChE,UAAMC,IAAWD,EAAG,OAAO;AAE3B,QAAIJ,EAAI,KAAKK,CAAQ,KAAKA,MAAa,IAAI;AAGzC,UAFAR,EAAiBQ,CAAQ,GAErBA,MAAa,IAAI;AACnB,QAAAf,IAAgB,CAAC;AACjB;AAAA,MACF;AAEA,YAAMgB,IAAS,OAAOD,CAAQ;AAC9B,UAAI,CAAC,MAAMC,CAAM,GAAG;AAClB,YAAIC,IAAUD;AACd,QAAIf,MAAQ,WAAWgB,IAAU,KAAK,IAAIA,GAAShB,CAAG,IAClDC,MAAQ,WAAWe,IAAU,KAAK,IAAIA,GAASf,CAAG,IAClDe,MAAYnB,KACdE,IAAgBiB,CAAO;AAAA,MAE3B;AAAA,IACF;AAAA,EACF,GAEMC,IAAa,MAAM;AACvB,QAAIZ,MAAkB,IAAI;AACxB,MAAAN,IAAgB,CAAC;AACjB;AAAA,IACF;AAEA,UAAMgB,IAAS,OAAOV,CAAa;AACnC,QAAK,MAAMU,CAAM;AAQf,MAAAhB,IAAgB,CAAC;AAAA,SARC;AAClB,UAAIiB,IAAUD;AACd,MAAIf,MAAQ,WAAWgB,IAAU,KAAK,IAAIA,GAAShB,CAAG,IAClDC,MAAQ,WAAWe,IAAU,KAAK,IAAIA,GAASf,CAAG,IAEtDK,EAAiBU,EAAQ,UAAU,GACnCjB,IAAgBiB,CAAO;AAAA,IACzB;AAAA,EAGF;AAEA,SACE,gBAAAE;AAAA,IAACC;AAAA,IAAA;AAAA,MACE,GAAGf;AAAA,MACJ,WAAWI,EAAO;AAAA,MAClB,MAAK;AAAA,MACL,OAAOH;AAAA,MACP,UAAUO;AAAA,MACV,QAAQK;AAAA,MACR,WAAWzB,IAAe,IAAI,YAAY;AAAA,MAC1C,SAASiB,EAAI;AAAA,MACb,SAAS,CAACW,MAAMA,EAAE,OAAO,OAAA;AAAA,MACzB,cAAcjB;AAAA,IAAA;AAAA,EAAA;AAGpB;"}
@@ -1,25 +1,25 @@
1
- import { jsx as n } from "react/jsx-runtime";
1
+ import { jsx as d } from "react/jsx-runtime";
2
2
  import { InputNumber as s } from "../number/InputNumber.js";
3
- import { isNil as u } from "lodash-es";
4
- const N = (a) => {
5
- const { min: r, max: m, onValueChange: e, value: t, defaultValue: i, ...d } = a, l = (o) => {
6
- o == null ? e == null || e(0) : e == null || e(Number((o / 100).toFixed(4)));
3
+ import { isNil as l } from "lodash-es";
4
+ const N = (n) => {
5
+ const { min: a, max: i, onValueChange: u, value: e, defaultValue: o, ...r } = n, m = (t) => {
6
+ t == null ? u?.(0) : u?.(Number((t / 100).toFixed(4)));
7
7
  };
8
- return /* @__PURE__ */ n(
8
+ return /* @__PURE__ */ d(
9
9
  s,
10
10
  {
11
- ...d,
11
+ ...r,
12
12
  decimalScale: 2,
13
13
  allowNegative: !1,
14
14
  inputMode: "decimal",
15
15
  thousandSeparator: !1,
16
16
  size: 9,
17
17
  unit: "%",
18
- min: r ? Number((r * 100).toFixed(2)) : void 0,
19
- max: m ? Number((m * 100).toFixed(2)) : void 0,
20
- value: u(t) ? t : Number((t * 100).toFixed(2)),
21
- defaultValue: u(i) ? i : Number((i * 100).toFixed(2)),
22
- onValueChange: l
18
+ min: a ? Number((a * 100).toFixed(2)) : void 0,
19
+ max: i ? Number((i * 100).toFixed(2)) : void 0,
20
+ value: l(e) ? e : Number((e * 100).toFixed(2)),
21
+ defaultValue: l(o) ? o : Number((o * 100).toFixed(2)),
22
+ onValueChange: m
23
23
  }
24
24
  );
25
25
  };
@@ -1 +1 @@
1
- {"version":3,"file":"InputPercent.js","sources":["../../../src/lib/percent/InputPercent.tsx"],"sourcesContent":["import React from \"react\";\nimport { InputNumber, InputNumberProps } from \"../number/InputNumber\";\nimport { isNil } from \"lodash-es\";\n\nexport interface InputPercentProps extends InputNumberProps {}\n\n/**\n * Un input special annee.\n */\nexport const InputPercent: React.FC<InputPercentProps> = (props) => {\n const { min, max, onValueChange, value, defaultValue, ...other } = props;\n\n const handleValueChange = (value: number | null | undefined) => {\n if (value === null || value === undefined) {\n onValueChange?.(0);\n } else {\n onValueChange?.(Number((value / 100).toFixed(4)));\n }\n };\n\n return (\n <InputNumber\n {...other}\n decimalScale={2}\n allowNegative={false}\n inputMode=\"decimal\"\n thousandSeparator={false}\n size={9}\n unit={\"%\"}\n min={min ? Number((min * 100).toFixed(2)) : undefined}\n max={max ? Number((max * 100).toFixed(2)) : undefined}\n value={isNil(value) ? value : Number((value * 100).toFixed(2))}\n defaultValue={isNil(defaultValue) ? defaultValue : Number((defaultValue * 100).toFixed(2))}\n onValueChange={handleValueChange}\n />\n );\n};\n"],"names":["InputPercent","props","min","max","onValueChange","value","defaultValue","other","handleValueChange","jsx","InputNumber","isNil"],"mappings":";;;AASO,MAAMA,IAA4C,CAACC,MAAU;AAClE,QAAM,EAAE,KAAAC,GAAK,KAAAC,GAAK,eAAAC,GAAe,OAAAC,GAAO,cAAAC,GAAc,GAAGC,MAAUN,GAE7DO,IAAoB,CAACH,MAAqC;AAC9D,IAAIA,KAAU,OACZD,KAAA,QAAAA,EAAgB,KAEhBA,KAAA,QAAAA,EAAgB,QAAQC,IAAQ,KAAK,QAAQ,CAAC,CAAC;AAAA,EAEnD;AAEA,SACE,gBAAAI;AAAA,IAACC;AAAA,IAAA;AAAA,MACE,GAAGH;AAAA,MACJ,cAAc;AAAA,MACd,eAAe;AAAA,MACf,WAAU;AAAA,MACV,mBAAmB;AAAA,MACnB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAKL,IAAM,QAAQA,IAAM,KAAK,QAAQ,CAAC,CAAC,IAAI;AAAA,MAC5C,KAAKC,IAAM,QAAQA,IAAM,KAAK,QAAQ,CAAC,CAAC,IAAI;AAAA,MAC5C,OAAOQ,EAAMN,CAAK,IAAIA,IAAQ,QAAQA,IAAQ,KAAK,QAAQ,CAAC,CAAC;AAAA,MAC7D,cAAcM,EAAML,CAAY,IAAIA,IAAe,QAAQA,IAAe,KAAK,QAAQ,CAAC,CAAC;AAAA,MACzF,eAAeE;AAAA,IAAA;AAAA,EAAA;AAGrB;"}
1
+ {"version":3,"file":"InputPercent.js","sources":["../../../src/lib/percent/InputPercent.tsx"],"sourcesContent":["import React from \"react\";\nimport { InputNumber, InputNumberProps } from \"../number/InputNumber\";\nimport { isNil } from \"lodash-es\";\n\nexport interface InputPercentProps extends InputNumberProps {}\n\n/**\n * Un input special annee.\n */\nexport const InputPercent: React.FC<InputPercentProps> = (props) => {\n const { min, max, onValueChange, value, defaultValue, ...other } = props;\n\n const handleValueChange = (value: number | null | undefined) => {\n if (value === null || value === undefined) {\n onValueChange?.(0);\n } else {\n onValueChange?.(Number((value / 100).toFixed(4)));\n }\n };\n\n return (\n <InputNumber\n {...other}\n decimalScale={2}\n allowNegative={false}\n inputMode=\"decimal\"\n thousandSeparator={false}\n size={9}\n unit={\"%\"}\n min={min ? Number((min * 100).toFixed(2)) : undefined}\n max={max ? Number((max * 100).toFixed(2)) : undefined}\n value={isNil(value) ? value : Number((value * 100).toFixed(2))}\n defaultValue={isNil(defaultValue) ? defaultValue : Number((defaultValue * 100).toFixed(2))}\n onValueChange={handleValueChange}\n />\n );\n};\n"],"names":["InputPercent","props","min","max","onValueChange","value","defaultValue","other","handleValueChange","jsx","InputNumber","isNil"],"mappings":";;;AASO,MAAMA,IAA4C,CAACC,MAAU;AAClE,QAAM,EAAE,KAAAC,GAAK,KAAAC,GAAK,eAAAC,GAAe,OAAAC,GAAO,cAAAC,GAAc,GAAGC,MAAUN,GAE7DO,IAAoB,CAACH,MAAqC;AAC9D,IAAIA,KAAU,OACZD,IAAgB,CAAC,IAEjBA,IAAgB,QAAQC,IAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC;AAAA,EAEpD;AAEA,SACE,gBAAAI;AAAA,IAACC;AAAA,IAAA;AAAA,MACE,GAAGH;AAAA,MACJ,cAAc;AAAA,MACd,eAAe;AAAA,MACf,WAAU;AAAA,MACV,mBAAmB;AAAA,MACnB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAKL,IAAM,QAAQA,IAAM,KAAK,QAAQ,CAAC,CAAC,IAAI;AAAA,MAC5C,KAAKC,IAAM,QAAQA,IAAM,KAAK,QAAQ,CAAC,CAAC,IAAI;AAAA,MAC5C,OAAOQ,EAAMN,CAAK,IAAIA,IAAQ,QAAQA,IAAQ,KAAK,QAAQ,CAAC,CAAC;AAAA,MAC7D,cAAcM,EAAML,CAAY,IAAIA,IAAe,QAAQA,IAAe,KAAK,QAAQ,CAAC,CAAC;AAAA,MACzF,eAAeE;AAAA,IAAA;AAAA,EAAA;AAGrB;"}
@@ -1,31 +1,30 @@
1
- import { jsxs as a, jsx as i } from "react/jsx-runtime";
2
- import { Select as h, Caption1 as s } from "@fluentui/react-components";
3
- function u({
4
- id: o,
1
+ import { jsxs as p, jsx as i } from "react/jsx-runtime";
2
+ import { Select as a, Caption1 as h } from "@fluentui/react-components";
3
+ function m({
4
+ id: d,
5
5
  value: n,
6
- disabled: t = !1,
6
+ disabled: o = !1,
7
7
  options: c,
8
- onValueChange: l
8
+ onValueChange: t
9
9
  }) {
10
- var d;
11
- const r = (d = c.find((e) => e.code === n)) == null ? void 0 : d.description;
12
- return /* @__PURE__ */ a("div", { children: [
10
+ const r = c.find((e) => e.code === n)?.description;
11
+ return /* @__PURE__ */ p("div", { children: [
13
12
  /* @__PURE__ */ i(
14
- h,
13
+ a,
15
14
  {
16
- id: o,
15
+ id: d,
17
16
  value: n,
18
- onChange: (e, p) => {
19
- l(p.value ?? "");
17
+ onChange: (e, l) => {
18
+ t(l.value ?? "");
20
19
  },
21
- disabled: t,
20
+ disabled: o,
22
21
  children: c.map((e) => /* @__PURE__ */ i("option", { value: e.code, children: e.label }, e.code))
23
22
  }
24
23
  ),
25
- r && /* @__PURE__ */ i("div", { children: /* @__PURE__ */ i(s, { children: r }) })
24
+ r && /* @__PURE__ */ i("div", { children: /* @__PURE__ */ i(h, { children: r }) })
26
25
  ] });
27
26
  }
28
27
  export {
29
- u as InputSelect
28
+ m as InputSelect
30
29
  };
31
30
  //# sourceMappingURL=InputSelect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InputSelect.js","sources":["../../../src/lib/select/InputSelect.tsx"],"sourcesContent":["import { Caption1, Select } from \"@fluentui/react-components\";\n\nexport interface InputSelectOption {\n code: string;\n label: string;\n description?: string | null | undefined;\n}\nexport interface InputSelectProps<T extends InputSelectOption> {\n id?: string;\n /** Le code de la valeur sélectionnée. */\n value: string;\n /** Indique si le champ est désactivé */\n disabled?: boolean;\n /** La liste des options à afficher dans la liste déroulante. */\n options: T[];\n /** La fonction à appeler lorsque la valeur sélectionnée change. */\n onValueChange: (value: string) => void;\n}\n/**\n * Une combobox de sélection d'entrée avec une liste déroulante d'options.\n * @returns Un composant de combobox de sélection (sans saisie de texte possible).\n */\nexport function InputSelect<T extends InputSelectOption>({\n id,\n value,\n disabled = false,\n options,\n onValueChange,\n}: InputSelectProps<T>) {\n const description = options.find((it) => it.code === value)?.description;\n return (\n <div>\n <Select\n id={id}\n value={value}\n onChange={(ev, data) => {\n onValueChange(data.value ?? \"\");\n }}\n disabled={disabled}\n >\n {options.map((o) => (\n <option key={o.code} value={o.code}>\n {o.label}\n </option>\n ))}\n </Select>\n {description && (\n <div>\n <Caption1>{description}</Caption1>\n </div>\n )}\n </div>\n );\n}\n"],"names":["InputSelect","id","value","disabled","options","onValueChange","description","_a","it","jsx","Select","ev","data","o","Caption1"],"mappings":";;AAsBO,SAASA,EAAyC;AAAA,EACvD,IAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,SAAAC;AAAA,EACA,eAAAC;AACF,GAAwB;;AACtB,QAAMC,KAAcC,IAAAH,EAAQ,KAAK,CAACI,MAAOA,EAAG,SAASN,CAAK,MAAtC,gBAAAK,EAAyC;AAC7D,2BACG,OAAA,EACC,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,IAAAT;AAAA,QACA,OAAAC;AAAA,QACA,UAAU,CAACS,GAAIC,MAAS;AACtB,UAAAP,EAAcO,EAAK,SAAS,EAAE;AAAA,QAChC;AAAA,QACA,UAAAT;AAAA,QAEC,UAAAC,EAAQ,IAAI,CAACS,MACZ,gBAAAJ,EAAC,UAAA,EAAoB,OAAOI,EAAE,MAC3B,UAAAA,EAAE,MAAA,GADQA,EAAE,IAEf,CACD;AAAA,MAAA;AAAA,IAAA;AAAA,IAEFP,KACC,gBAAAG,EAAC,OAAA,EACC,UAAA,gBAAAA,EAACK,GAAA,EAAU,aAAY,EAAA,CACzB;AAAA,EAAA,GAEJ;AAEJ;"}
1
+ {"version":3,"file":"InputSelect.js","sources":["../../../src/lib/select/InputSelect.tsx"],"sourcesContent":["import { Caption1, Select } from \"@fluentui/react-components\";\n\nexport interface InputSelectOption {\n code: string;\n label: string;\n description?: string | null | undefined;\n}\nexport interface InputSelectProps<T extends InputSelectOption> {\n id?: string;\n /** Le code de la valeur sélectionnée. */\n value: string;\n /** Indique si le champ est désactivé */\n disabled?: boolean;\n /** La liste des options à afficher dans la liste déroulante. */\n options: T[];\n /** La fonction à appeler lorsque la valeur sélectionnée change. */\n onValueChange: (value: string) => void;\n}\n/**\n * Une combobox de sélection d'entrée avec une liste déroulante d'options.\n * @returns Un composant de combobox de sélection (sans saisie de texte possible).\n */\nexport function InputSelect<T extends InputSelectOption>({\n id,\n value,\n disabled = false,\n options,\n onValueChange,\n}: InputSelectProps<T>) {\n const description = options.find((it) => it.code === value)?.description;\n return (\n <div>\n <Select\n id={id}\n value={value}\n onChange={(ev, data) => {\n onValueChange(data.value ?? \"\");\n }}\n disabled={disabled}\n >\n {options.map((o) => (\n <option key={o.code} value={o.code}>\n {o.label}\n </option>\n ))}\n </Select>\n {description && (\n <div>\n <Caption1>{description}</Caption1>\n </div>\n )}\n </div>\n );\n}\n"],"names":["InputSelect","id","value","disabled","options","onValueChange","description","it","jsx","Select","ev","data","o","Caption1"],"mappings":";;AAsBO,SAASA,EAAyC;AAAA,EACvD,IAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,SAAAC;AAAA,EACA,eAAAC;AACF,GAAwB;AACtB,QAAMC,IAAcF,EAAQ,KAAK,CAACG,MAAOA,EAAG,SAASL,CAAK,GAAG;AAC7D,2BACG,OAAA,EACC,UAAA;AAAA,IAAA,gBAAAM;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,IAAAR;AAAA,QACA,OAAAC;AAAA,QACA,UAAU,CAACQ,GAAIC,MAAS;AACtB,UAAAN,EAAcM,EAAK,SAAS,EAAE;AAAA,QAChC;AAAA,QACA,UAAAR;AAAA,QAEC,UAAAC,EAAQ,IAAI,CAACQ,MACZ,gBAAAJ,EAAC,UAAA,EAAoB,OAAOI,EAAE,MAC3B,UAAAA,EAAE,MAAA,GADQA,EAAE,IAEf,CACD;AAAA,MAAA;AAAA,IAAA;AAAA,IAEFN,KACC,gBAAAE,EAAC,OAAA,EACC,UAAA,gBAAAA,EAACK,GAAA,EAAU,aAAY,EAAA,CACzB;AAAA,EAAA,GAEJ;AAEJ;"}