@panneau/fields 5.0.0-alpha.2 → 5.0.0-alpha.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +186 -20
- package/dist/address/AddressField.css +44 -0
- package/dist/address/AddressField.d.ts +37 -0
- package/dist/address/AddressField.d.ts.map +1 -0
- package/dist/address/AddressField.js +411 -0
- package/dist/address/AddressField.js.map +1 -0
- package/dist/address/AddressField.module.js +22 -0
- package/dist/address/AddressField.module.js.map +1 -0
- package/dist/address/address.d.ts +23 -0
- package/dist/address/address.d.ts.map +1 -0
- package/dist/address/address.js +58 -0
- package/dist/address/address.js.map +1 -0
- package/dist/address/index.d.ts +3 -0
- package/dist/address/index.d.ts.map +1 -0
- package/dist/address/index.js +3 -0
- package/dist/boolean/BooleanField.d.ts +1 -1
- package/dist/boolean/BooleanField.js +78 -17
- package/dist/boolean/BooleanField.js.map +1 -1
- package/dist/boolean/index.d.ts +1 -1
- package/dist/color/ColorField.css +9 -0
- package/dist/color/ColorField.d.ts +12 -5
- package/dist/color/ColorField.d.ts.map +1 -1
- package/dist/color/ColorField.js +341 -81
- package/dist/color/ColorField.js.map +1 -1
- package/dist/color/ColorField.module.js +4 -2
- package/dist/color/ColorField.module.js.map +1 -1
- package/dist/color/index.d.ts +2 -1
- package/dist/color/index.d.ts.map +1 -1
- package/dist/color/index.js +3 -1
- package/dist/color/palette.d.ts +23 -0
- package/dist/color/palette.d.ts.map +1 -0
- package/dist/color/palette.js +34 -0
- package/dist/color/palette.js.map +1 -0
- package/dist/compound/Compound.css +26 -0
- package/dist/compound/Compound.module.js +16 -0
- package/dist/compound/Compound.module.js.map +1 -0
- package/dist/compound/compound.d.ts +56 -0
- package/dist/compound/compound.d.ts.map +1 -0
- package/dist/compound/compound.js +186 -0
- package/dist/compound/compound.js.map +1 -0
- package/dist/country/CountryField.css +42 -0
- package/dist/country/CountryField.d.ts +32 -0
- package/dist/country/CountryField.d.ts.map +1 -0
- package/dist/country/CountryField.js +424 -0
- package/dist/country/CountryField.js.map +1 -0
- package/dist/country/CountryField.module.js +20 -0
- package/dist/country/CountryField.module.js.map +1 -0
- package/dist/country/codes.d.ts +6 -0
- package/dist/country/codes.d.ts.map +1 -0
- package/dist/country/codes.js +261 -0
- package/dist/country/codes.js.map +1 -0
- package/dist/country/countries.d.ts +32 -0
- package/dist/country/countries.d.ts.map +1 -0
- package/dist/country/countries.js +60 -0
- package/dist/country/countries.js.map +1 -0
- package/dist/country/index.d.ts +3 -0
- package/dist/country/index.d.ts.map +1 -0
- package/dist/country/index.js +4 -0
- package/dist/credits/CreditsField.d.ts +15 -0
- package/dist/credits/CreditsField.d.ts.map +1 -0
- package/dist/credits/CreditsField.js +58 -0
- package/dist/credits/CreditsField.js.map +1 -0
- package/dist/credits/credits.d.ts +18 -0
- package/dist/credits/credits.d.ts.map +1 -0
- package/dist/credits/credits.js +33 -0
- package/dist/credits/credits.js.map +1 -0
- package/dist/credits/index.d.ts +5 -0
- package/dist/credits/index.d.ts.map +1 -0
- package/dist/credits/index.js +3 -0
- package/dist/date/DateField.d.ts +1 -1
- package/dist/date/DateField.js.map +1 -1
- package/dist/date/index.d.ts +1 -1
- package/dist/daterange/DateRangeField.css +9 -0
- package/dist/daterange/DateRangeField.d.ts +31 -0
- package/dist/daterange/DateRangeField.d.ts.map +1 -0
- package/dist/daterange/DateRangeField.js +372 -0
- package/dist/daterange/DateRangeField.js.map +1 -0
- package/dist/daterange/DateRangeField.module.js +12 -0
- package/dist/daterange/DateRangeField.module.js.map +1 -0
- package/dist/daterange/index.d.ts +3 -0
- package/dist/daterange/index.d.ts.map +1 -0
- package/dist/daterange/index.js +3 -0
- package/dist/daterange/range.d.ts +61 -0
- package/dist/daterange/range.d.ts.map +1 -0
- package/dist/daterange/range.js +119 -0
- package/dist/daterange/range.js.map +1 -0
- package/dist/datetime/DateTimeField.d.ts +1 -1
- package/dist/datetime/DateTimeField.js +107 -20
- package/dist/datetime/DateTimeField.js.map +1 -1
- package/dist/datetime/index.d.ts +1 -1
- package/dist/duration/DurationField.css +11 -0
- package/dist/duration/DurationField.d.ts +67 -0
- package/dist/duration/DurationField.d.ts.map +1 -0
- package/dist/duration/DurationField.js +260 -0
- package/dist/duration/DurationField.js.map +1 -0
- package/dist/duration/DurationField.module.js +12 -0
- package/dist/duration/DurationField.module.js.map +1 -0
- package/dist/duration/index.d.ts +2 -0
- package/dist/duration/index.d.ts.map +1 -0
- package/dist/duration/index.js +1 -0
- package/dist/email/EmailField.d.ts +2 -2
- package/dist/email/EmailField.js.map +1 -1
- package/dist/email/index.d.ts +1 -1
- package/dist/embed/EmbedField.css +60 -0
- package/dist/embed/EmbedField.d.ts +29 -0
- package/dist/embed/EmbedField.d.ts.map +1 -0
- package/dist/embed/EmbedField.js +309 -0
- package/dist/embed/EmbedField.js.map +1 -0
- package/dist/embed/EmbedField.module.js +22 -0
- package/dist/embed/EmbedField.module.js.map +1 -0
- package/dist/embed/index.d.ts +3 -0
- package/dist/embed/index.d.ts.map +1 -0
- package/dist/embed/index.js +3 -0
- package/dist/file/FileField.css +54 -0
- package/dist/file/FileField.d.ts +50 -0
- package/dist/file/FileField.d.ts.map +1 -0
- package/dist/file/FileField.js +288 -0
- package/dist/file/FileField.js.map +1 -0
- package/dist/file/FileField.module.js +22 -0
- package/dist/file/FileField.module.js.map +1 -0
- package/dist/file/index.d.ts +3 -0
- package/dist/file/index.d.ts.map +1 -0
- package/dist/file/index.js +1 -0
- package/dist/group/GroupField.css +20 -3
- package/dist/group/GroupField.d.ts +10 -4
- package/dist/group/GroupField.d.ts.map +1 -1
- package/dist/group/GroupField.js +71 -66
- package/dist/group/GroupField.js.map +1 -1
- package/dist/group/GroupField.module.js +10 -2
- package/dist/group/GroupField.module.js.map +1 -1
- package/dist/group/index.d.ts +1 -1
- package/dist/index.d.ts +21 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -2
- package/dist/json/JsonField.css +7 -0
- package/dist/json/JsonField.d.ts +22 -0
- package/dist/json/JsonField.d.ts.map +1 -0
- package/dist/json/JsonField.js +207 -0
- package/dist/json/JsonField.js.map +1 -0
- package/dist/json/JsonField.module.js +8 -0
- package/dist/json/JsonField.module.js.map +1 -0
- package/dist/json/index.d.ts +2 -0
- package/dist/json/index.d.ts.map +1 -0
- package/dist/json/index.js +1 -0
- package/dist/link/LinkField.css +12 -0
- package/dist/link/LinkField.d.ts +38 -0
- package/dist/link/LinkField.d.ts.map +1 -0
- package/dist/link/LinkField.js +742 -0
- package/dist/link/LinkField.js.map +1 -0
- package/dist/link/LinkField.module.js +8 -0
- package/dist/link/LinkField.module.js.map +1 -0
- package/dist/link/index.d.ts +3 -0
- package/dist/link/index.d.ts.map +1 -0
- package/dist/link/index.js +3 -0
- package/dist/link/link.d.ts +30 -0
- package/dist/link/link.d.ts.map +1 -0
- package/dist/link/link.js +63 -0
- package/dist/link/link.js.map +1 -0
- package/dist/link/pages.d.ts +17 -0
- package/dist/link/pages.d.ts.map +1 -0
- package/dist/link/pages.js +104 -0
- package/dist/link/pages.js.map +1 -0
- package/dist/locales/index.js.map +1 -1
- package/dist/localized/LocalizedField.css +27 -6
- package/dist/localized/LocalizedField.d.ts +19 -8
- package/dist/localized/LocalizedField.d.ts.map +1 -1
- package/dist/localized/LocalizedField.js +238 -105
- package/dist/localized/LocalizedField.js.map +1 -1
- package/dist/localized/LocalizedField.module.js +10 -4
- package/dist/localized/LocalizedField.module.js.map +1 -1
- package/dist/localized/index.d.ts +1 -1
- package/dist/location/LocationField.css +54 -0
- package/dist/location/LocationField.d.ts +31 -0
- package/dist/location/LocationField.d.ts.map +1 -0
- package/dist/location/LocationField.js +487 -0
- package/dist/location/LocationField.js.map +1 -0
- package/dist/location/LocationField.module.js +22 -0
- package/dist/location/LocationField.module.js.map +1 -0
- package/dist/location/LocationMap.d.ts +25 -0
- package/dist/location/LocationMap.d.ts.map +1 -0
- package/dist/location/LocationMap.js +205 -0
- package/dist/location/LocationMap.js.map +1 -0
- package/dist/location/index.d.ts +5 -0
- package/dist/location/index.d.ts.map +1 -0
- package/dist/location/index.js +4 -0
- package/dist/location/leafletCss.d.ts +2 -0
- package/dist/location/leafletCss.d.ts.map +1 -0
- package/dist/location/leafletCss.js +6 -0
- package/dist/location/leafletCss.js.map +1 -0
- package/dist/location/nominatim.d.ts +23 -0
- package/dist/location/nominatim.d.ts.map +1 -0
- package/dist/location/nominatim.js +79 -0
- package/dist/location/nominatim.js.map +1 -0
- package/dist/location/search.d.ts +10 -0
- package/dist/location/search.d.ts.map +1 -0
- package/dist/location/search.js +83 -0
- package/dist/location/search.js.map +1 -0
- package/dist/location/types.d.ts +46 -0
- package/dist/location/types.d.ts.map +1 -0
- package/dist/missing/MissingField.d.ts +4 -3
- package/dist/missing/MissingField.d.ts.map +1 -1
- package/dist/missing/MissingField.js +3 -2
- package/dist/missing/MissingField.js.map +1 -1
- package/dist/money/MoneyField.d.ts +28 -0
- package/dist/money/MoneyField.d.ts.map +1 -0
- package/dist/money/MoneyField.js +269 -0
- package/dist/money/MoneyField.js.map +1 -0
- package/dist/money/index.d.ts +3 -0
- package/dist/money/index.d.ts.map +1 -0
- package/dist/money/index.js +3 -0
- package/dist/money/money.d.ts +27 -0
- package/dist/money/money.d.ts.map +1 -0
- package/dist/money/money.js +56 -0
- package/dist/money/money.js.map +1 -0
- package/dist/number/NumberField.d.ts +1 -1
- package/dist/number/NumberField.js.map +1 -1
- package/dist/number/index.d.ts +1 -1
- package/dist/range/RangeField.d.ts +22 -0
- package/dist/range/RangeField.d.ts.map +1 -0
- package/dist/range/RangeField.js +203 -0
- package/dist/range/RangeField.js.map +1 -0
- package/dist/range/index.d.ts +2 -0
- package/dist/range/index.d.ts.map +1 -0
- package/dist/range/index.js +1 -0
- package/dist/region/RegionField.d.ts +23 -0
- package/dist/region/RegionField.d.ts.map +1 -0
- package/dist/region/RegionField.js +174 -0
- package/dist/region/RegionField.js.map +1 -0
- package/dist/region/RegionFlag.css +9 -0
- package/dist/region/RegionFlag.d.ts +20 -0
- package/dist/region/RegionFlag.d.ts.map +1 -0
- package/dist/region/RegionFlag.js +61 -0
- package/dist/region/RegionFlag.js.map +1 -0
- package/dist/region/RegionFlag.module.js +8 -0
- package/dist/region/RegionFlag.module.js.map +1 -0
- package/dist/region/data.d.ts +5 -0
- package/dist/region/data.d.ts.map +1 -0
- package/dist/region/data.js +513 -0
- package/dist/region/data.js.map +1 -0
- package/dist/region/flags/CA.d.ts +4 -0
- package/dist/region/flags/CA.d.ts.map +1 -0
- package/dist/region/flags/CA.js +21 -0
- package/dist/region/flags/CA.js.map +1 -0
- package/dist/region/flags/US.d.ts +4 -0
- package/dist/region/flags/US.d.ts.map +1 -0
- package/dist/region/flags/US.js +65 -0
- package/dist/region/flags/US.js.map +1 -0
- package/dist/region/flags.d.ts +17 -0
- package/dist/region/flags.d.ts.map +1 -0
- package/dist/region/flags.js +84 -0
- package/dist/region/flags.js.map +1 -0
- package/dist/region/index.d.ts +5 -0
- package/dist/region/index.d.ts.map +1 -0
- package/dist/region/index.js +5 -0
- package/dist/region/regions.d.ts +15 -0
- package/dist/region/regions.d.ts.map +1 -0
- package/dist/region/regions.js +29 -0
- package/dist/region/regions.js.map +1 -0
- package/dist/relation/RelationField.d.ts +2 -2
- package/dist/relation/RelationField.d.ts.map +1 -1
- package/dist/relation/RelationField.js +511 -171
- package/dist/relation/RelationField.js.map +1 -1
- package/dist/relation/index.d.ts +2 -2
- package/dist/repeater/RepeaterField.d.ts +13 -2
- package/dist/repeater/RepeaterField.d.ts.map +1 -1
- package/dist/repeater/RepeaterField.js +138 -50
- package/dist/repeater/RepeaterField.js.map +1 -1
- package/dist/repeater/index.d.ts +1 -1
- package/dist/select/SelectField.d.ts +1 -1
- package/dist/select/SelectField.js.map +1 -1
- package/dist/select/index.d.ts +1 -1
- package/dist/sessions/SessionsField.d.ts +15 -0
- package/dist/sessions/SessionsField.d.ts.map +1 -0
- package/dist/sessions/SessionsField.js +49 -0
- package/dist/sessions/SessionsField.js.map +1 -0
- package/dist/sessions/index.d.ts +4 -0
- package/dist/sessions/index.d.ts.map +1 -0
- package/dist/sessions/index.js +1 -0
- package/dist/shared/CodeComboBox.d.ts +21 -0
- package/dist/shared/CodeComboBox.d.ts.map +1 -0
- package/dist/shared/CodeComboBox.js +238 -0
- package/dist/shared/CodeComboBox.js.map +1 -0
- package/dist/shared/DefinitionField.d.ts +9 -4
- package/dist/shared/DefinitionField.d.ts.map +1 -1
- package/dist/shared/DefinitionField.js +98 -78
- package/dist/shared/DefinitionField.js.map +1 -1
- package/dist/shared/builtIn.d.ts +7 -3
- package/dist/shared/builtIn.d.ts.map +1 -1
- package/dist/shared/builtIn.js +39 -7
- package/dist/shared/builtIn.js.map +1 -1
- package/dist/shared/check.d.ts +27 -0
- package/dist/shared/check.d.ts.map +1 -0
- package/dist/shared/check.js +18 -0
- package/dist/shared/check.js.map +1 -0
- package/dist/shared/context.d.ts +33 -5
- package/dist/shared/context.d.ts.map +1 -1
- package/dist/shared/context.js +36 -20
- package/dist/shared/context.js.map +1 -1
- package/dist/shared/cx.js.map +1 -1
- package/dist/shared/dates.js +2 -2
- package/dist/shared/dates.js.map +1 -1
- package/dist/shared/embed.d.ts +19 -0
- package/dist/shared/embed.d.ts.map +1 -0
- package/dist/shared/embed.js +14 -0
- package/dist/shared/embed.js.map +1 -0
- package/dist/shared/entry.d.ts +13 -4
- package/dist/shared/entry.d.ts.map +1 -1
- package/dist/shared/entry.js +24 -7
- package/dist/shared/entry.js.map +1 -1
- package/dist/shared/flow.d.ts +8 -0
- package/dist/shared/flow.d.ts.map +1 -0
- package/dist/shared/flow.js +38 -0
- package/dist/shared/flow.js.map +1 -0
- package/dist/shared/part.d.ts +26 -0
- package/dist/shared/part.d.ts.map +1 -0
- package/dist/shared/part.js +64 -0
- package/dist/shared/part.js.map +1 -0
- package/dist/shared/relation.js.map +1 -1
- package/dist/shared/reveal.d.ts +16 -0
- package/dist/shared/reveal.d.ts.map +1 -0
- package/dist/shared/reveal.js +46 -0
- package/dist/shared/reveal.js.map +1 -0
- package/dist/shared/types.d.ts +12 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/slug/SlugField.css +18 -0
- package/dist/slug/SlugField.d.ts +33 -5
- package/dist/slug/SlugField.d.ts.map +1 -1
- package/dist/slug/SlugField.js +346 -126
- package/dist/slug/SlugField.js.map +1 -1
- package/dist/slug/SlugField.module.js +14 -0
- package/dist/slug/SlugField.module.js.map +1 -0
- package/dist/slug/index.d.ts +1 -1
- package/dist/slug/index.d.ts.map +1 -1
- package/dist/slug/index.js +1 -1
- package/dist/tags/TagsField.d.ts +17 -0
- package/dist/tags/TagsField.d.ts.map +1 -0
- package/dist/tags/TagsField.js +120 -0
- package/dist/tags/TagsField.js.map +1 -0
- package/dist/tags/index.d.ts +2 -0
- package/dist/tags/index.d.ts.map +1 -0
- package/dist/tags/index.js +1 -0
- package/dist/tel/TelField.css +25 -0
- package/dist/tel/TelField.d.ts +34 -0
- package/dist/tel/TelField.d.ts.map +1 -0
- package/dist/tel/TelField.js +390 -0
- package/dist/tel/TelField.js.map +1 -0
- package/dist/tel/TelField.module.js +12 -0
- package/dist/tel/TelField.module.js.map +1 -0
- package/dist/tel/index.d.ts +3 -0
- package/dist/tel/index.d.ts.map +1 -0
- package/dist/tel/index.js +3 -0
- package/dist/tel/phone.d.ts +59 -0
- package/dist/tel/phone.d.ts.map +1 -0
- package/dist/tel/phone.js +107 -0
- package/dist/tel/phone.js.map +1 -0
- package/dist/text/TextField.d.ts +12 -4
- package/dist/text/TextField.d.ts.map +1 -1
- package/dist/text/TextField.js +104 -60
- package/dist/text/TextField.js.map +1 -1
- package/dist/text/index.d.ts +1 -1
- package/dist/textarea/TextAreaField.d.ts +1 -1
- package/dist/textarea/TextAreaField.js.map +1 -1
- package/dist/textarea/index.d.ts +1 -1
- package/dist/time/TimeField.d.ts +1 -1
- package/dist/time/TimeField.js +64 -10
- package/dist/time/TimeField.js.map +1 -1
- package/dist/time/index.d.ts +1 -1
- package/dist/upload/FilePicker.css +24 -0
- package/dist/upload/FilePicker.d.ts +14 -0
- package/dist/upload/FilePicker.d.ts.map +1 -0
- package/dist/upload/FilePicker.js +130 -0
- package/dist/upload/FilePicker.js.map +1 -0
- package/dist/upload/FilePicker.module.js +12 -0
- package/dist/upload/FilePicker.module.js.map +1 -0
- package/dist/upload/UploadList.css +93 -0
- package/dist/upload/UploadList.d.ts +18 -0
- package/dist/upload/UploadList.d.ts.map +1 -0
- package/dist/upload/UploadList.js +144 -0
- package/dist/upload/UploadList.js.map +1 -0
- package/dist/upload/UploadList.module.js +32 -0
- package/dist/upload/UploadList.module.js.map +1 -0
- package/dist/upload/files.d.ts +5 -0
- package/dist/upload/files.d.ts.map +1 -0
- package/dist/upload/files.js +26 -0
- package/dist/upload/files.js.map +1 -0
- package/dist/upload/types.d.ts +58 -0
- package/dist/upload/types.d.ts.map +1 -0
- package/dist/upload/useRejectionMessage.d.ts +4 -0
- package/dist/upload/useRejectionMessage.d.ts.map +1 -0
- package/dist/upload/useRejectionMessage.js +25 -0
- package/dist/upload/useRejectionMessage.js.map +1 -0
- package/dist/upload/useUploads.d.ts +30 -0
- package/dist/upload/useUploads.d.ts.map +1 -0
- package/dist/upload/useUploads.js +115 -0
- package/dist/upload/useUploads.js.map +1 -0
- package/dist/uppy/index.d.ts +3 -0
- package/dist/uppy/index.d.ts.map +1 -0
- package/dist/uppy/index.js +1 -0
- package/dist/uppy/uploader.d.ts +44 -0
- package/dist/uppy/uploader.d.ts.map +1 -0
- package/dist/uppy/uploader.js +139 -0
- package/dist/uppy/uploader.js.map +1 -0
- package/dist/url/UrlField.d.ts +2 -2
- package/dist/url/UrlField.d.ts.map +1 -1
- package/dist/url/UrlField.js +69 -14
- package/dist/url/UrlField.js.map +1 -1
- package/dist/url/index.d.ts +1 -1
- package/package.json +110 -7
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
import { useFieldsContext } from "../shared/context.js";
|
|
2
1
|
import { cx } from "../shared/cx.js";
|
|
3
2
|
import { getFieldProps } from "../shared/entry.js";
|
|
3
|
+
import { useFieldsContext } from "../shared/context.js";
|
|
4
|
+
import { messages } from "../shared/messages.js";
|
|
5
|
+
import { useRevealer } from "../shared/reveal.js";
|
|
4
6
|
import LocalizedField_module_default from "./LocalizedField.module.js";
|
|
5
7
|
import { NestedField } from "../shared/DefinitionField.js";
|
|
6
8
|
import { c } from "react/compiler-runtime";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
+
import { isFilled } from "@panneau/protocol/runtime";
|
|
10
|
+
import { Fieldset, Icon, SegmentedControl, usePanneauIntl } from "@panneau/ui";
|
|
11
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
12
|
+
import { Plus } from "lucide-react";
|
|
13
|
+
import { useState } from "react";
|
|
9
14
|
//#region src/localized/LocalizedField.tsx
|
|
10
15
|
/** The name of a locale in the UI's language, capitalized (`Français`, `English`). */
|
|
11
16
|
function useLocaleName() {
|
|
@@ -29,27 +34,114 @@ function useLocaleName() {
|
|
|
29
34
|
return t0;
|
|
30
35
|
}
|
|
31
36
|
/**
|
|
32
|
-
* A value per locale
|
|
33
|
-
*
|
|
37
|
+
* A value per locale: one locale at a time, under the field's label, with a switch at the end of
|
|
38
|
+
* the label's line for the others. The switch marks the locales in error, and the empty ones: to
|
|
39
|
+
* fill in when the field is required, to add otherwise. A value without any locale filled is
|
|
40
|
+
* `null`.
|
|
34
41
|
*/
|
|
35
42
|
function LocalizedField(t0) {
|
|
36
|
-
const $ = c(
|
|
37
|
-
const { locales, children, value, onChange, onBlur, label, description, errors, disabled, readOnly, required, className, labelClassName, descriptionClassName, errorsClassName, localeClassName } = t0;
|
|
43
|
+
const $ = c(58);
|
|
44
|
+
const { locales, children, value, onChange, onBlur, label, description, errors, disabled, readOnly, required, locale, onLocaleChange, invalidLocales: t1, className, labelClassName, descriptionClassName, errorsClassName, localeClassName } = t0;
|
|
45
|
+
let t2;
|
|
46
|
+
if ($[0] !== t1) {
|
|
47
|
+
t2 = t1 === void 0 ? [] : t1;
|
|
48
|
+
$[0] = t1;
|
|
49
|
+
$[1] = t2;
|
|
50
|
+
} else t2 = $[1];
|
|
51
|
+
const invalidLocales = t2;
|
|
52
|
+
const intl = usePanneauIntl();
|
|
38
53
|
const localeName = useLocaleName();
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
54
|
+
const [uncontrolled, setUncontrolled] = useState(locales[0]);
|
|
55
|
+
const wanted = locale ?? uncontrolled;
|
|
56
|
+
let t3;
|
|
57
|
+
if ($[2] !== locales || $[3] !== wanted) {
|
|
58
|
+
t3 = wanted !== void 0 && locales.includes(wanted) ? wanted : locales[0];
|
|
59
|
+
$[2] = locales;
|
|
60
|
+
$[3] = wanted;
|
|
61
|
+
$[4] = t3;
|
|
62
|
+
} else t3 = $[4];
|
|
63
|
+
const current = t3;
|
|
64
|
+
let t4;
|
|
65
|
+
if ($[5] !== intl || $[6] !== invalidLocales || $[7] !== localeName || $[8] !== locales || $[9] !== required || $[10] !== value) {
|
|
66
|
+
let t5;
|
|
67
|
+
if ($[12] !== intl || $[13] !== invalidLocales || $[14] !== localeName || $[15] !== required || $[16] !== value) {
|
|
68
|
+
t5 = (option, index) => {
|
|
69
|
+
const name = localeName(option);
|
|
70
|
+
const invalid = invalidLocales.includes(option);
|
|
71
|
+
const empty = !isFilled(value?.[option]);
|
|
72
|
+
const addable = !invalid && empty && required !== true && index > 0;
|
|
73
|
+
let textValue = name;
|
|
74
|
+
if (invalid) textValue = intl.formatMessage(messages.localeInvalid, { locale: name });
|
|
75
|
+
else if (addable) textValue = intl.formatMessage(messages.addLocale, { locale: name });
|
|
76
|
+
else if (empty) textValue = intl.formatMessage(messages.localeEmpty, { locale: name });
|
|
77
|
+
return {
|
|
78
|
+
value: option,
|
|
79
|
+
textValue,
|
|
80
|
+
label: /* @__PURE__ */ jsxs("span", {
|
|
81
|
+
className: LocalizedField_module_default.option,
|
|
82
|
+
children: [
|
|
83
|
+
addable ? /* @__PURE__ */ jsx(Icon, {
|
|
84
|
+
icon: Plus,
|
|
85
|
+
size: "sm"
|
|
86
|
+
}) : null,
|
|
87
|
+
option.toUpperCase(),
|
|
88
|
+
invalid ? /* @__PURE__ */ jsx("span", { className: cx(LocalizedField_module_default.marker, LocalizedField_module_default.invalid) }) : null,
|
|
89
|
+
!invalid && empty && required === true ? /* @__PURE__ */ jsx("span", { className: cx(LocalizedField_module_default.marker, LocalizedField_module_default.empty) }) : null
|
|
90
|
+
]
|
|
91
|
+
})
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
$[12] = intl;
|
|
95
|
+
$[13] = invalidLocales;
|
|
96
|
+
$[14] = localeName;
|
|
97
|
+
$[15] = required;
|
|
98
|
+
$[16] = value;
|
|
99
|
+
$[17] = t5;
|
|
100
|
+
} else t5 = $[17];
|
|
101
|
+
t4 = locales.map(t5);
|
|
102
|
+
$[5] = intl;
|
|
103
|
+
$[6] = invalidLocales;
|
|
104
|
+
$[7] = localeName;
|
|
105
|
+
$[8] = locales;
|
|
106
|
+
$[9] = required;
|
|
107
|
+
$[10] = value;
|
|
108
|
+
$[11] = t4;
|
|
109
|
+
} else t4 = $[11];
|
|
110
|
+
const options = t4;
|
|
111
|
+
let t5;
|
|
112
|
+
if ($[18] !== current || $[19] !== intl || $[20] !== locales.length || $[21] !== onLocaleChange || $[22] !== options) {
|
|
113
|
+
t5 = locales.length > 1 ? /* @__PURE__ */ jsx(SegmentedControl, {
|
|
114
|
+
size: "sm",
|
|
115
|
+
"aria-label": intl.formatMessage(messages.locales),
|
|
116
|
+
options,
|
|
117
|
+
...current !== void 0 ? { value: current } : {},
|
|
118
|
+
onChange: (next) => {
|
|
119
|
+
setUncontrolled(next);
|
|
120
|
+
onLocaleChange?.(next);
|
|
121
|
+
}
|
|
122
|
+
}) : void 0;
|
|
123
|
+
$[18] = current;
|
|
124
|
+
$[19] = intl;
|
|
125
|
+
$[20] = locales.length;
|
|
126
|
+
$[21] = onLocaleChange;
|
|
127
|
+
$[22] = options;
|
|
128
|
+
$[23] = t5;
|
|
129
|
+
} else t5 = $[23];
|
|
130
|
+
let t6;
|
|
131
|
+
if ($[24] !== children || $[25] !== current || $[26] !== disabled || $[27] !== localeClassName || $[28] !== localeName || $[29] !== locales || $[30] !== onBlur || $[31] !== onChange || $[32] !== readOnly || $[33] !== required || $[34] !== value) {
|
|
132
|
+
let t7;
|
|
133
|
+
if ($[36] !== children || $[37] !== current || $[38] !== disabled || $[39] !== localeClassName || $[40] !== localeName || $[41] !== onBlur || $[42] !== onChange || $[43] !== readOnly || $[44] !== required || $[45] !== value) {
|
|
134
|
+
t7 = (option_0) => /* @__PURE__ */ jsx("div", {
|
|
44
135
|
className: cx(LocalizedField_module_default.locale, localeClassName),
|
|
136
|
+
hidden: option_0 !== current,
|
|
45
137
|
children: children({
|
|
46
|
-
locale,
|
|
47
|
-
label: localeName(
|
|
48
|
-
value: value?.[
|
|
49
|
-
onChange: (
|
|
138
|
+
locale: option_0,
|
|
139
|
+
label: localeName(option_0),
|
|
140
|
+
value: value?.[option_0] ?? null,
|
|
141
|
+
onChange: (next_0) => {
|
|
50
142
|
const updated = {
|
|
51
143
|
...value,
|
|
52
|
-
[
|
|
144
|
+
[option_0]: next_0
|
|
53
145
|
};
|
|
54
146
|
const filled = Object.values(updated).some(_temp);
|
|
55
147
|
onChange?.(filled ? updated : null);
|
|
@@ -59,44 +151,38 @@ function LocalizedField(t0) {
|
|
|
59
151
|
...readOnly !== void 0 ? { readOnly } : {},
|
|
60
152
|
...required !== void 0 ? { required } : {}
|
|
61
153
|
})
|
|
62
|
-
},
|
|
63
|
-
$[
|
|
64
|
-
$[
|
|
65
|
-
$[
|
|
66
|
-
$[
|
|
67
|
-
$[
|
|
68
|
-
$[
|
|
69
|
-
$[
|
|
70
|
-
$[
|
|
71
|
-
$[
|
|
72
|
-
$[
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
$[
|
|
77
|
-
$[
|
|
78
|
-
$[
|
|
79
|
-
$[
|
|
80
|
-
$[
|
|
81
|
-
$[
|
|
82
|
-
$[
|
|
83
|
-
$[
|
|
84
|
-
$[
|
|
85
|
-
$[
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
});
|
|
93
|
-
$[21] = t1;
|
|
94
|
-
$[22] = t2;
|
|
95
|
-
} else t2 = $[22];
|
|
96
|
-
let t3;
|
|
97
|
-
if ($[23] !== className || $[24] !== description || $[25] !== descriptionClassName || $[26] !== errors || $[27] !== errorsClassName || $[28] !== label || $[29] !== labelClassName || $[30] !== required || $[31] !== t2) {
|
|
98
|
-
t3 = /* @__PURE__ */ jsx(Fieldset, {
|
|
154
|
+
}, option_0);
|
|
155
|
+
$[36] = children;
|
|
156
|
+
$[37] = current;
|
|
157
|
+
$[38] = disabled;
|
|
158
|
+
$[39] = localeClassName;
|
|
159
|
+
$[40] = localeName;
|
|
160
|
+
$[41] = onBlur;
|
|
161
|
+
$[42] = onChange;
|
|
162
|
+
$[43] = readOnly;
|
|
163
|
+
$[44] = required;
|
|
164
|
+
$[45] = value;
|
|
165
|
+
$[46] = t7;
|
|
166
|
+
} else t7 = $[46];
|
|
167
|
+
t6 = locales.map(t7);
|
|
168
|
+
$[24] = children;
|
|
169
|
+
$[25] = current;
|
|
170
|
+
$[26] = disabled;
|
|
171
|
+
$[27] = localeClassName;
|
|
172
|
+
$[28] = localeName;
|
|
173
|
+
$[29] = locales;
|
|
174
|
+
$[30] = onBlur;
|
|
175
|
+
$[31] = onChange;
|
|
176
|
+
$[32] = readOnly;
|
|
177
|
+
$[33] = required;
|
|
178
|
+
$[34] = value;
|
|
179
|
+
$[35] = t6;
|
|
180
|
+
} else t6 = $[35];
|
|
181
|
+
let t7;
|
|
182
|
+
if ($[47] !== className || $[48] !== description || $[49] !== descriptionClassName || $[50] !== errors || $[51] !== errorsClassName || $[52] !== label || $[53] !== labelClassName || $[54] !== required || $[55] !== t5 || $[56] !== t6) {
|
|
183
|
+
t7 = /* @__PURE__ */ jsx(Fieldset, {
|
|
99
184
|
legend: label,
|
|
185
|
+
legendEnd: t5,
|
|
100
186
|
description,
|
|
101
187
|
errors,
|
|
102
188
|
isRequired: required,
|
|
@@ -104,30 +190,36 @@ function LocalizedField(t0) {
|
|
|
104
190
|
legendClassName: labelClassName,
|
|
105
191
|
descriptionClassName,
|
|
106
192
|
errorsClassName,
|
|
107
|
-
children:
|
|
193
|
+
children: t6
|
|
108
194
|
});
|
|
109
|
-
$[
|
|
110
|
-
$[
|
|
111
|
-
$[
|
|
112
|
-
$[
|
|
113
|
-
$[
|
|
114
|
-
$[
|
|
115
|
-
$[
|
|
116
|
-
$[
|
|
117
|
-
$[
|
|
118
|
-
$[
|
|
119
|
-
|
|
120
|
-
|
|
195
|
+
$[47] = className;
|
|
196
|
+
$[48] = description;
|
|
197
|
+
$[49] = descriptionClassName;
|
|
198
|
+
$[50] = errors;
|
|
199
|
+
$[51] = errorsClassName;
|
|
200
|
+
$[52] = label;
|
|
201
|
+
$[53] = labelClassName;
|
|
202
|
+
$[54] = required;
|
|
203
|
+
$[55] = t5;
|
|
204
|
+
$[56] = t6;
|
|
205
|
+
$[57] = t7;
|
|
206
|
+
} else t7 = $[57];
|
|
207
|
+
return t7;
|
|
121
208
|
}
|
|
122
|
-
/**
|
|
123
|
-
* A field of the definition with `localized: true`: the field of its type for each locale of the
|
|
124
|
-
* fields context, each at its own path (`title.fr`).
|
|
125
|
-
*/
|
|
209
|
+
/** The locale of a path inside a localized field (`title.en`, `body.en.0` in `title`), if any. */
|
|
126
210
|
function _temp(entry) {
|
|
127
211
|
return entry !== null && entry !== void 0 && entry !== "";
|
|
128
212
|
}
|
|
213
|
+
function localeOf(path, fieldPath, locales) {
|
|
214
|
+
return locales.find((locale) => path === `${fieldPath}.${locale}` || path.startsWith(`${fieldPath}.${locale}.`));
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* A field of the definition with `localized: true`: the field of its type for each locale of the
|
|
218
|
+
* fields context, each at its own path (`title.fr`). It shows the locale of a path the form
|
|
219
|
+
* reveals, such as the first error on submit.
|
|
220
|
+
*/
|
|
129
221
|
function LocalizedFieldEntry(props) {
|
|
130
|
-
const $ = c(
|
|
222
|
+
const $ = c(36);
|
|
131
223
|
const { locales: contextLocales } = useFieldsContext();
|
|
132
224
|
const { field, path, value } = props;
|
|
133
225
|
let t0;
|
|
@@ -145,22 +237,56 @@ function LocalizedFieldEntry(props) {
|
|
|
145
237
|
$[4] = t1;
|
|
146
238
|
} else t1 = $[4];
|
|
147
239
|
const locales = t1;
|
|
240
|
+
const [locale, setLocale] = useState(locales[0]);
|
|
148
241
|
let t2;
|
|
149
|
-
if ($[5] !==
|
|
150
|
-
t2 =
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
const { name: _name, onBlur: _onBlur, ...t3 } = t2;
|
|
157
|
-
chrome = t3;
|
|
242
|
+
if ($[5] !== locales || $[6] !== path) {
|
|
243
|
+
t2 = (revealed) => {
|
|
244
|
+
const found = localeOf(revealed, path, locales);
|
|
245
|
+
if (found !== void 0) setLocale(found);
|
|
246
|
+
};
|
|
247
|
+
$[5] = locales;
|
|
248
|
+
$[6] = path;
|
|
158
249
|
$[7] = t2;
|
|
159
|
-
|
|
160
|
-
|
|
250
|
+
} else t2 = $[7];
|
|
251
|
+
useRevealer(t2);
|
|
161
252
|
let t3;
|
|
162
|
-
if ($[
|
|
163
|
-
|
|
253
|
+
if ($[8] !== locales || $[9] !== path || $[10] !== props.invalidPaths) {
|
|
254
|
+
let t4;
|
|
255
|
+
if ($[12] !== path || $[13] !== props.invalidPaths) {
|
|
256
|
+
t4 = (candidate) => (props.invalidPaths ?? []).some((invalid) => localeOf(invalid, path, [candidate]) !== void 0);
|
|
257
|
+
$[12] = path;
|
|
258
|
+
$[13] = props.invalidPaths;
|
|
259
|
+
$[14] = t4;
|
|
260
|
+
} else t4 = $[14];
|
|
261
|
+
t3 = locales.filter(t4);
|
|
262
|
+
$[8] = locales;
|
|
263
|
+
$[9] = path;
|
|
264
|
+
$[10] = props.invalidPaths;
|
|
265
|
+
$[11] = t3;
|
|
266
|
+
} else t3 = $[11];
|
|
267
|
+
const invalidLocales = t3;
|
|
268
|
+
let t4;
|
|
269
|
+
if ($[15] !== props) {
|
|
270
|
+
t4 = getFieldProps(props);
|
|
271
|
+
$[15] = props;
|
|
272
|
+
$[16] = t4;
|
|
273
|
+
} else t4 = $[16];
|
|
274
|
+
let chrome;
|
|
275
|
+
if ($[17] !== t4) {
|
|
276
|
+
const { name: _name, onBlur: _onBlur, ...t5 } = t4;
|
|
277
|
+
chrome = t5;
|
|
278
|
+
$[17] = t4;
|
|
279
|
+
$[18] = chrome;
|
|
280
|
+
} else chrome = $[18];
|
|
281
|
+
let t5;
|
|
282
|
+
if ($[19] !== locale) {
|
|
283
|
+
t5 = locale !== void 0 ? { locale } : {};
|
|
284
|
+
$[19] = locale;
|
|
285
|
+
$[20] = t5;
|
|
286
|
+
} else t5 = $[20];
|
|
287
|
+
let t6;
|
|
288
|
+
if ($[21] !== field || $[22] !== path || $[23] !== props.disabled || $[24] !== props.onBlur || $[25] !== props.parentValue || $[26] !== props.readOnly) {
|
|
289
|
+
t6 = (input) => /* @__PURE__ */ jsx(NestedField, {
|
|
164
290
|
field: {
|
|
165
291
|
...field,
|
|
166
292
|
localized: false,
|
|
@@ -172,34 +298,41 @@ function LocalizedFieldEntry(props) {
|
|
|
172
298
|
onChange: input.onChange,
|
|
173
299
|
...props.onBlur !== void 0 ? { onBlur: props.onBlur } : {},
|
|
174
300
|
parentValue: props.parentValue,
|
|
301
|
+
locale: input.locale,
|
|
302
|
+
hideLabel: true,
|
|
175
303
|
...props.disabled !== void 0 ? { disabled: props.disabled } : {},
|
|
176
304
|
...props.readOnly !== void 0 ? { readOnly: props.readOnly } : {}
|
|
177
305
|
});
|
|
178
|
-
$[
|
|
179
|
-
$[
|
|
180
|
-
$[
|
|
181
|
-
$[
|
|
182
|
-
$[
|
|
183
|
-
$[
|
|
184
|
-
$[
|
|
185
|
-
} else
|
|
186
|
-
let
|
|
187
|
-
if ($[
|
|
188
|
-
|
|
306
|
+
$[21] = field;
|
|
307
|
+
$[22] = path;
|
|
308
|
+
$[23] = props.disabled;
|
|
309
|
+
$[24] = props.onBlur;
|
|
310
|
+
$[25] = props.parentValue;
|
|
311
|
+
$[26] = props.readOnly;
|
|
312
|
+
$[27] = t6;
|
|
313
|
+
} else t6 = $[27];
|
|
314
|
+
let t7;
|
|
315
|
+
if ($[28] !== chrome || $[29] !== invalidLocales || $[30] !== locales || $[31] !== props.onChange || $[32] !== record || $[33] !== t5 || $[34] !== t6) {
|
|
316
|
+
t7 = /* @__PURE__ */ jsx(LocalizedField, {
|
|
189
317
|
...chrome,
|
|
190
318
|
locales,
|
|
191
319
|
value: record,
|
|
192
320
|
onChange: props.onChange,
|
|
193
|
-
|
|
321
|
+
...t5,
|
|
322
|
+
onLocaleChange: setLocale,
|
|
323
|
+
invalidLocales,
|
|
324
|
+
children: t6
|
|
194
325
|
});
|
|
195
|
-
$[
|
|
196
|
-
$[
|
|
197
|
-
$[
|
|
198
|
-
$[
|
|
199
|
-
$[
|
|
200
|
-
$[
|
|
201
|
-
|
|
202
|
-
|
|
326
|
+
$[28] = chrome;
|
|
327
|
+
$[29] = invalidLocales;
|
|
328
|
+
$[30] = locales;
|
|
329
|
+
$[31] = props.onChange;
|
|
330
|
+
$[32] = record;
|
|
331
|
+
$[33] = t5;
|
|
332
|
+
$[34] = t6;
|
|
333
|
+
$[35] = t7;
|
|
334
|
+
} else t7 = $[35];
|
|
335
|
+
return t7;
|
|
203
336
|
}
|
|
204
337
|
//#endregion
|
|
205
338
|
export { LocalizedField, LocalizedFieldEntry, useLocaleName };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocalizedField.js","names":["name","locale","label","description","errors","required","className","labelClassName","descriptionClassName","errorsClassName","locales","record","_c","styles"],"sources":["../../src/localized/LocalizedField.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Fieldset, usePanneauIntl } from '@panneau/ui';\n\nimport { NestedField } from '../shared/DefinitionField';\nimport { useFieldsContext } from '../shared/context';\nimport { cx } from '../shared/cx';\nimport { getFieldProps } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './LocalizedField.module.css';\n\n/** A localized value: a value per locale (`{ fr: 'Été', en: 'Summer' }`). */\nexport type LocalizedValue<V> = Partial<Record<string, V | null>>;\n\n/** What `LocalizedField` gives the input of each locale. */\nexport interface LocalizedInputProps<V> {\n locale: string;\n /** Name of the locale in the UI's language, as the input's label. */\n label: string;\n value: V | null;\n onChange: (value: V | null) => void;\n onBlur?: () => void;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n}\n\nexport interface LocalizedFieldProps<V> extends FieldProps<LocalizedValue<V>> {\n /** Locales, in order. */\n locales: readonly string[];\n /** Renders the input of a locale. */\n children: (props: LocalizedInputProps<V>) => ReactNode;\n localeClassName?: string;\n}\n\n/** The name of a locale in the UI's language, capitalized (`Français`, `English`). */\nexport function useLocaleName(): (locale: string) => string {\n const intl = usePanneauIntl();\n return (locale) => {\n let name: string | undefined;\n try {\n name = intl.formatDisplayName(locale, { type: 'language' });\n } catch {\n name = undefined;\n }\n const text = name ?? locale.toUpperCase();\n return text.charAt(0).toLocaleUpperCase(intl.locale) + text.slice(1);\n };\n}\n\n/**\n * A value per locale, with an input for each locale under one legend. A value without any locale\n * filled is `null`.\n */\nexport function LocalizedField<V>({\n locales,\n children,\n value,\n onChange,\n onBlur,\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n localeClassName,\n}: LocalizedFieldProps<V>) {\n const localeName = useLocaleName();\n return (\n <Fieldset\n legend={label}\n description={description}\n errors={errors}\n isRequired={required}\n className={className}\n legendClassName={labelClassName}\n descriptionClassName={descriptionClassName}\n errorsClassName={errorsClassName}\n >\n <div className={styles.locales}>\n {locales.map((locale) => (\n <div key={locale} className={cx(styles.locale, localeClassName)}>\n {children({\n locale,\n label: localeName(locale),\n value: value?.[locale] ?? null,\n onChange: (next) => {\n const updated = { ...value, [locale]: next };\n const filled = Object.values(updated).some(\n (entry) =>\n entry !== null && entry !== undefined && entry !== '',\n );\n onChange?.(filled ? updated : null);\n },\n ...(onBlur !== undefined ? { onBlur } : {}),\n ...(disabled !== undefined ? { disabled } : {}),\n ...(readOnly !== undefined ? { readOnly } : {}),\n ...(required !== undefined ? { required } : {}),\n })}\n </div>\n ))}\n </div>\n </Fieldset>\n );\n}\n\n/**\n * A field of the definition with `localized: true`: the field of its type for each locale of the\n * fields context, each at its own path (`title.fr`).\n */\nexport function LocalizedFieldEntry(props: FieldEntryProps) {\n const { locales: contextLocales } = useFieldsContext();\n const { field, path, value } = props;\n const record =\n value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n const locales = contextLocales.length > 0 ? contextLocales : Object.keys(record);\n const { name: _name, onBlur: _onBlur, ...chrome } = getFieldProps(props);\n return (\n <LocalizedField<unknown>\n {...chrome}\n locales={locales}\n value={record}\n onChange={props.onChange}\n >\n {(input) => (\n <NestedField\n field={{ ...field, localized: false, label: input.label, help: undefined }}\n path={`${path}.${input.locale}`}\n value={input.value}\n onChange={input.onChange}\n {...(props.onBlur !== undefined ? { onBlur: props.onBlur } : {})}\n parentValue={props.parentValue}\n {...(props.disabled !== undefined ? { disabled: props.disabled } : {})}\n {...(props.readOnly !== undefined ? { readOnly: props.readOnly } : {})}\n />\n )}\n </LocalizedField>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LocalizedField.js","names":["Plus","ReactNode","useState","isFilled","Fieldset","Icon","SegmentedControl","usePanneauIntl","NestedField","useFieldsContext","cx","getFieldProps","messages","useRevealer","FieldEntryProps","FieldProps","styles","LocalizedValue","Partial","Record","V","LocalizedInputProps","locale","label","value","onChange","onBlur","disabled","readOnly","required","LocalizedFieldProps","locales","children","props","onLocaleChange","invalidLocales","localeClassName","useLocaleName","$","_c","intl","t0","name","formatDisplayName","type","undefined","text","toUpperCase","charAt","toLocaleUpperCase","slice","LocalizedField","description","errors","t1","className","labelClassName","descriptionClassName","errorsClassName","t2","localeName","uncontrolled","setUncontrolled","wanted","t3","includes","current","t4","t5","option","index","invalid","empty","addable","textValue","formatMessage","localeInvalid","addLocale","localeEmpty","marker","map","options","length","next","t6","t7","option_0","next_0","updated","filled","Object","values","some","_temp","entry","localeOf","path","fieldPath","find","startsWith","LocalizedFieldEntry","contextLocales","field","Array","isArray","record","keys","setLocale","revealed","found","invalidPaths","candidate","filter","chrome","_name","_onBlur","parentValue","input","localized","help","_c","styles"],"sources":["../../src/localized/LocalizedField.tsx"],"sourcesContent":["import { Plus } from 'lucide-react';\nimport { type ReactNode, useState } from 'react';\n\nimport { isFilled } from '@panneau/protocol/runtime';\nimport { Fieldset, Icon, SegmentedControl, usePanneauIntl } from '@panneau/ui';\n\nimport { NestedField } from '../shared/DefinitionField';\nimport { useFieldsContext } from '../shared/context';\nimport { cx } from '../shared/cx';\nimport { getFieldProps } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport { useRevealer } from '../shared/reveal';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './LocalizedField.module.css';\n\n/** A localized value: a value per locale (`{ fr: 'Été', en: 'Summer' }`). */\nexport type LocalizedValue<V> = Partial<Record<string, V | null>>;\n\n/** What `LocalizedField` gives the input of each locale. */\nexport interface LocalizedInputProps<V> {\n locale: string;\n /**\n * Name of the locale in the UI's language. The field shows the locales: give it to the input\n * as its `aria-label`, not as a visible label.\n */\n label: string;\n value: V | null;\n onChange: (value: V | null) => void;\n onBlur?: () => void;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n}\n\nexport interface LocalizedFieldProps<V> extends FieldProps<LocalizedValue<V>> {\n /** Locales, in order. The first one shows first. */\n locales: readonly string[];\n /** Renders the input of a locale. */\n children: (props: LocalizedInputProps<V>) => ReactNode;\n /** The locale shown. Controlled with `onLocaleChange`. */\n locale?: string;\n onLocaleChange?: (locale: string) => void;\n /** Locales whose value has errors: their switch shows it. */\n invalidLocales?: readonly string[];\n localeClassName?: string;\n}\n\n/** The name of a locale in the UI's language, capitalized (`Français`, `English`). */\nexport function useLocaleName(): (locale: string) => string {\n const intl = usePanneauIntl();\n return (locale) => {\n let name: string | undefined;\n try {\n name = intl.formatDisplayName(locale, { type: 'language' });\n } catch {\n name = undefined;\n }\n const text = name ?? locale.toUpperCase();\n return text.charAt(0).toLocaleUpperCase(intl.locale) + text.slice(1);\n };\n}\n\n/**\n * A value per locale: one locale at a time, under the field's label, with a switch at the end of\n * the label's line for the others. The switch marks the locales in error, and the empty ones: to\n * fill in when the field is required, to add otherwise. A value without any locale filled is\n * `null`.\n */\nexport function LocalizedField<V>({\n locales,\n children,\n value,\n onChange,\n onBlur,\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n locale,\n onLocaleChange,\n invalidLocales = [],\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n localeClassName,\n}: LocalizedFieldProps<V>) {\n const intl = usePanneauIntl();\n const localeName = useLocaleName();\n const [uncontrolled, setUncontrolled] = useState(locales[0]);\n const wanted = locale ?? uncontrolled;\n const current = wanted !== undefined && locales.includes(wanted) ? wanted : locales[0];\n\n const options = locales.map((option, index) => {\n const name = localeName(option);\n const invalid = invalidLocales.includes(option);\n const empty = !isFilled(value?.[option]);\n // An empty locale after the first is a translation to add, unless every locale is required.\n const addable = !invalid && empty && required !== true && index > 0;\n let textValue = name;\n if (invalid) {\n textValue = intl.formatMessage(messages.localeInvalid, { locale: name });\n } else if (addable) {\n textValue = intl.formatMessage(messages.addLocale, { locale: name });\n } else if (empty) {\n textValue = intl.formatMessage(messages.localeEmpty, { locale: name });\n }\n return {\n value: option,\n textValue,\n label: (\n <span className={styles.option}>\n {addable ? <Icon icon={Plus} size=\"sm\" /> : null}\n {option.toUpperCase()}\n {invalid ? <span className={cx(styles.marker, styles.invalid)} /> : null}\n {!invalid && empty && required === true ? (\n <span className={cx(styles.marker, styles.empty)} />\n ) : null}\n </span>\n ),\n };\n });\n\n return (\n <Fieldset\n legend={label}\n legendEnd={\n locales.length > 1 ? (\n <SegmentedControl\n size=\"sm\"\n aria-label={intl.formatMessage(messages.locales)}\n options={options}\n {...(current !== undefined ? { value: current } : {})}\n onChange={(next) => {\n setUncontrolled(next);\n onLocaleChange?.(next);\n }}\n />\n ) : undefined\n }\n description={description}\n errors={errors}\n isRequired={required}\n className={className}\n legendClassName={labelClassName}\n descriptionClassName={descriptionClassName}\n errorsClassName={errorsClassName}\n >\n {locales.map((option) => (\n // Every locale stays mounted: inputs keep their state, and errors can be revealed.\n <div\n key={option}\n className={cx(styles.locale, localeClassName)}\n hidden={option !== current}\n >\n {children({\n locale: option,\n label: localeName(option),\n value: value?.[option] ?? null,\n onChange: (next) => {\n const updated = { ...value, [option]: next };\n const filled = Object.values(updated).some(\n (entry) => entry !== null && entry !== undefined && entry !== '',\n );\n onChange?.(filled ? updated : null);\n },\n ...(onBlur !== undefined ? { onBlur } : {}),\n ...(disabled !== undefined ? { disabled } : {}),\n ...(readOnly !== undefined ? { readOnly } : {}),\n ...(required !== undefined ? { required } : {}),\n })}\n </div>\n ))}\n </Fieldset>\n );\n}\n\n/** The locale of a path inside a localized field (`title.en`, `body.en.0` in `title`), if any. */\nfunction localeOf(path: string, fieldPath: string, locales: readonly string[]) {\n return locales.find(\n (locale) => path === `${fieldPath}.${locale}` || path.startsWith(`${fieldPath}.${locale}.`),\n );\n}\n\n/**\n * A field of the definition with `localized: true`: the field of its type for each locale of the\n * fields context, each at its own path (`title.fr`). It shows the locale of a path the form\n * reveals, such as the first error on submit.\n */\nexport function LocalizedFieldEntry(props: FieldEntryProps) {\n const { locales: contextLocales } = useFieldsContext();\n const { field, path, value } = props;\n const record =\n value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n const locales = contextLocales.length > 0 ? contextLocales : Object.keys(record);\n const [locale, setLocale] = useState(locales[0]);\n useRevealer((revealed) => {\n const found = localeOf(revealed, path, locales);\n if (found !== undefined) {\n setLocale(found);\n }\n });\n const invalidLocales = locales.filter((candidate) =>\n (props.invalidPaths ?? []).some(\n (invalid) => localeOf(invalid, path, [candidate]) !== undefined,\n ),\n );\n const { name: _name, onBlur: _onBlur, ...chrome } = getFieldProps(props);\n return (\n <LocalizedField<unknown>\n {...chrome}\n locales={locales}\n value={record}\n onChange={props.onChange}\n {...(locale !== undefined ? { locale } : {})}\n onLocaleChange={setLocale}\n invalidLocales={invalidLocales}\n >\n {(input) => (\n <NestedField\n field={{ ...field, localized: false, label: input.label, help: undefined }}\n path={`${path}.${input.locale}`}\n value={input.value}\n onChange={input.onChange}\n {...(props.onBlur !== undefined ? { onBlur: props.onBlur } : {})}\n parentValue={props.parentValue}\n locale={input.locale}\n hideLabel\n {...(props.disabled !== undefined ? { disabled: props.disabled } : {})}\n {...(props.readOnly !== undefined ? { readOnly: props.readOnly } : {})}\n />\n )}\n </LocalizedField>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import "./LocalizedField.css";
|
|
2
2
|
//#region src/localized/LocalizedField.module.css
|
|
3
|
-
var locales = "panneau-localized-field-locales";
|
|
4
3
|
var locale = "panneau-localized-field-locale";
|
|
4
|
+
var option = "panneau-localized-field-option";
|
|
5
|
+
var marker = "panneau-localized-field-marker";
|
|
6
|
+
var invalid = "panneau-localized-field-invalid";
|
|
7
|
+
var empty = "panneau-localized-field-empty";
|
|
5
8
|
var LocalizedField_module_default = {
|
|
6
|
-
|
|
7
|
-
|
|
9
|
+
locale,
|
|
10
|
+
option,
|
|
11
|
+
marker,
|
|
12
|
+
invalid,
|
|
13
|
+
empty
|
|
8
14
|
};
|
|
9
15
|
//#endregion
|
|
10
|
-
export { LocalizedField_module_default as default, locale,
|
|
16
|
+
export { LocalizedField_module_default as default, empty, invalid, locale, marker, option };
|
|
11
17
|
|
|
12
18
|
//# sourceMappingURL=LocalizedField.module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocalizedField.module.js","names":[],"sources":["../../src/localized/LocalizedField.module.css"],"sourcesContent":[".
|
|
1
|
+
{"version":3,"file":"LocalizedField.module.js","names":[],"sources":["../../src/localized/LocalizedField.module.css"],"sourcesContent":[".locale {\n min-width: 0;\n}\n\n.locale[hidden] {\n display: none;\n}\n\n.option {\n display: inline-flex;\n align-items: center;\n gap: var(--panneau-space-1);\n letter-spacing: 0.02em;\n}\n\n.marker {\n flex: 0 0 auto;\n width: 0.45em;\n height: 0.45em;\n background-color: currentcolor;\n border-radius: 50%;\n}\n\n.invalid {\n color: var(--panneau-color-danger);\n}\n\n.empty {\n color: var(--panneau-color-warning);\n}\n"],"mappings":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { LocalizedField, LocalizedFieldEntry, type LocalizedFieldProps, type LocalizedInputProps, type LocalizedValue, useLocaleName, } from './LocalizedField';
|
|
1
|
+
export { LocalizedField, LocalizedFieldEntry, type LocalizedFieldProps, type LocalizedInputProps, type LocalizedValue, useLocaleName, } from './LocalizedField.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/* The search, the map, then the coordinates and the address. */
|
|
2
|
+
.panneau-location-field-location {
|
|
3
|
+
display: flex;
|
|
4
|
+
flex-direction: column;
|
|
5
|
+
gap: var(--panneau-space-2);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.panneau-location-field-map {
|
|
9
|
+
position: relative;
|
|
10
|
+
z-index: 0;
|
|
11
|
+
height: 16rem;
|
|
12
|
+
overflow: hidden;
|
|
13
|
+
background-color: var(--panneau-color-surface-sunken);
|
|
14
|
+
border: var(--panneau-border-width) solid var(--panneau-color-border-control);
|
|
15
|
+
border-radius: var(--panneau-radius-md);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.panneau-location-field-map:focus-visible {
|
|
19
|
+
outline: var(--panneau-focus-width) solid var(--panneau-color-focus);
|
|
20
|
+
outline-offset: 1px;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* A pin: a round head pointing down at the point. */
|
|
24
|
+
.panneau-location-field-marker {
|
|
25
|
+
background: none;
|
|
26
|
+
border: 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.panneau-location-field-pin {
|
|
30
|
+
display: block;
|
|
31
|
+
width: 100%;
|
|
32
|
+
height: 100%;
|
|
33
|
+
box-sizing: border-box;
|
|
34
|
+
background-color: var(--panneau-color-accent);
|
|
35
|
+
border: 2px solid var(--panneau-color-surface);
|
|
36
|
+
border-radius: 50% 50% 50% 0;
|
|
37
|
+
box-shadow: var(--panneau-shadow-sm);
|
|
38
|
+
rotate: -45deg;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.panneau-location-field-coordinates {
|
|
42
|
+
display: flex;
|
|
43
|
+
flex-wrap: wrap;
|
|
44
|
+
align-items: flex-end;
|
|
45
|
+
gap: var(--panneau-space-2);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.panneau-location-field-coordinate {
|
|
49
|
+
flex: 1 1 8rem;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.panneau-location-field-remove {
|
|
53
|
+
flex: none;
|
|
54
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { LocationValue } from '@panneau/protocol';
|
|
2
|
+
import type { FieldEntryProps, FieldProps } from '../shared/types.js';
|
|
3
|
+
import { type Point } from './LocationMap.js';
|
|
4
|
+
import type { GeocodingSource, MapTiles } from './types.js';
|
|
5
|
+
export type { LocationValue };
|
|
6
|
+
/** OpenStreetMap's standard tiles: fine for an admin panel, with their credit. */
|
|
7
|
+
export declare const OPEN_STREET_MAP_TILES: MapTiles;
|
|
8
|
+
export interface LocationFieldProps extends FieldProps<LocationValue> {
|
|
9
|
+
/** The address search. Defaults to that of the `FieldsProvider`; without one, there is none. */
|
|
10
|
+
geocoding?: GeocodingSource | null;
|
|
11
|
+
/** The tiles of the map. Defaults to those of the `FieldsProvider`, or OpenStreetMap's. */
|
|
12
|
+
tiles?: MapTiles;
|
|
13
|
+
/** Where the map opens without a point. Defaults to the whole world. */
|
|
14
|
+
center?: Point;
|
|
15
|
+
/** Zoom of the map on a point. Defaults to 15. */
|
|
16
|
+
zoom?: number;
|
|
17
|
+
}
|
|
18
|
+
/** Whether a value is a point. */
|
|
19
|
+
export declare function isLocation(value: unknown): value is LocationValue;
|
|
20
|
+
/**
|
|
21
|
+
* A point on a map, and its address. Clicking the map or dragging the marker places the point,
|
|
22
|
+
* and its latitude and longitude can be typed. With an address search, a place found sets the
|
|
23
|
+
* point and the address; with a reverse search, placing a point fills an empty address.
|
|
24
|
+
*/
|
|
25
|
+
export declare function LocationField({ value, onChange, onBlur, geocoding: geocodingProp, tiles: tilesProp, center, zoom, label, description, errors, disabled, readOnly, required, className, }: LocationFieldProps): import("react").JSX.Element;
|
|
26
|
+
/**
|
|
27
|
+
* The `location` type: settings `zoom`, `center` (`{ "lat", "lng" }`, where the map opens without
|
|
28
|
+
* a point) and `tiles` (`{ "url", "attribution" }`), over the maps of the `FieldsProvider`.
|
|
29
|
+
*/
|
|
30
|
+
export declare function LocationFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
|
|
31
|
+
//# sourceMappingURL=LocationField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocationField.d.ts","sourceRoot":"","sources":["../../src/location/LocationField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAavD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AAExD,OAAO,KAAK,EAAmB,eAAe,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE1E,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,kFAAkF;AAClF,eAAO,MAAM,qBAAqB,EAAE,QAKnC,CAAC;AAIF,MAAM,WAAW,kBAAmB,SAAQ,UAAU,CAAC,aAAa,CAAC;IACjE,gGAAgG;IAChG,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,2FAA2F;IAC3F,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,wEAAwE;IACxE,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,kCAAkC;AAClC,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAOjE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,MAAM,EACN,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,SAAS,EAChB,MAAuB,EACvB,IAAS,EACT,KAAK,EACL,WAAW,EACX,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,SAAS,GACZ,EAAE,kBAAkB,+BA0KpB;AAMD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,+BAwBxD"}
|