@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RelationField.js","names":["X","text","reference","item","entry","onChange","itemId","references","_c","styles","_Fragment"],"sources":["../../src/relation/RelationField.tsx"],"sourcesContent":["import { X } from 'lucide-react';\nimport { useEffect, useState } from 'react';\n\nimport { ComboBox, Fieldset, IconButton, usePanneauIntl } from '@panneau/ui';\n\nimport { useFieldsContext } from '../shared/context';\nimport { cx } from '../shared/cx';\nimport { getFieldProps } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport {\n type RelationReference,\n type RelationSource,\n toReferences,\n useRelationReferences,\n} from '../shared/relation';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './RelationField.module.css';\n\n/** The id of the \"Create “…”\" option of the picker. */\nconst CREATE_ID = '\\u0000create';\n\n/** Results of a search in a relation source, as it types. */\nexport function useRelationSearch(\n source: RelationSource | null,\n resource: string,\n query: string,\n { enabled = true, delay = 250 }: { enabled?: boolean; delay?: number } = {},\n): { items: RelationReference[]; isLoading: boolean } {\n const [state, setState] = useState<{\n key: string;\n items: RelationReference[];\n isLoading: boolean;\n }>({ key: '', items: [], isLoading: false });\n const key = `${resource}\\u0000${query}`;\n\n useEffect(() => {\n if (source === null || !enabled) {\n return undefined;\n }\n const controller = new AbortController();\n const timer = setTimeout(() => {\n setState((current) => ({ ...current, key, isLoading: true }));\n source\n .search(resource, query, { signal: controller.signal })\n .then((items) => {\n if (!controller.signal.aborted) {\n setState({ key, items, isLoading: false });\n }\n })\n .catch(() => {\n if (!controller.signal.aborted) {\n setState({ key, items: [], isLoading: false });\n }\n });\n }, delay);\n return () => {\n clearTimeout(timer);\n controller.abort();\n };\n }, [source, resource, query, key, enabled, delay]);\n\n return { items: state.items, isLoading: state.isLoading || state.key !== key };\n}\n\n/** Props of both single and multiple relation fields. */\nexport interface RelationFieldBaseProps extends Omit<FieldProps<never>, 'value' | 'onChange'> {\n /** Id of the related resource, passed to the source. */\n resource: string;\n /** Where to search. Defaults to the fields context's. Without one, the field is read-only. */\n source?: RelationSource | null;\n /**\n * Creates an item from the typed text, offered as \"Create “…”\" in the picker: it can open a\n * dialog, and resolves with the new reference, or `null` when nothing was created. Defaults to\n * the source's `create()`. `null` turns creating off.\n */\n onCreate?: ((text: string) => Promise<RelationReference | null>) | null;\n placeholder?: string;\n controlClassName?: string;\n}\n\nexport interface SingleRelationFieldProps extends RelationFieldBaseProps {\n multiple?: false;\n value?: RelationReference | null;\n onChange?: (value: RelationReference | null) => void;\n}\n\nexport interface MultipleRelationFieldProps extends RelationFieldBaseProps {\n multiple: true;\n value?: readonly RelationReference[] | null;\n /** Called with the references. An empty list is `null`. */\n onChange?: (value: RelationReference[] | null) => void;\n}\n\nexport type RelationFieldProps = SingleRelationFieldProps | MultipleRelationFieldProps;\n\nfunction References({\n references,\n onRemove,\n removeLabel,\n}: {\n references: readonly RelationReference[];\n onRemove?: (reference: RelationReference) => void;\n removeLabel: (reference: RelationReference) => string;\n}) {\n return (\n <ul className={cx(styles.selected, onRemove === undefined && styles.readOnly)}>\n {references.map((reference) => (\n <li key={reference.id} className={styles.reference}>\n <span className={styles.referenceLabel}>{reference.label}</span>\n {onRemove !== undefined ? (\n <IconButton\n icon={X}\n size=\"sm\"\n label={removeLabel(reference)}\n showTooltip={false}\n onPress={() => onRemove(reference)}\n />\n ) : null}\n </li>\n ))}\n </ul>\n );\n}\n\n/**\n * A reference to an item of another resource, or several with `multiple`, picked by searching a\n * `RelationSource`. Values are references (`{ id, label }`), as items carry them; plain ids get\n * their labels from the source's `resolve()`. When the source can `create()` (or with `onCreate`),\n * the picker offers to create an item from the typed text. Without a source, the field shows its\n * references and can't change them.\n */\nexport function RelationField(props: RelationFieldProps) {\n const intl = usePanneauIntl();\n const context = useFieldsContext();\n const source = props.source === undefined ? context.relationSource : props.source;\n const {\n resource,\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n placeholder = intl.formatMessage(messages.search),\n onBlur,\n name,\n id,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n controlClassName,\n } = props;\n const selected = useRelationReferences(source, resource, toReferences(props.value));\n const [query, setQuery] = useState<string | null>(null);\n const [creating, setCreating] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n const editable = source !== null && disabled !== true && readOnly !== true;\n const { items: found, isLoading: searching } = useRelationSearch(\n source,\n resource,\n query ?? '',\n { enabled: editable },\n );\n const sourceCreate = source?.create;\n const create =\n props.onCreate !== undefined\n ? props.onCreate\n : sourceCreate !== undefined && source?.canCreate?.(resource) !== false\n ? (text: string) => sourceCreate.call(source, resource, text)\n : null;\n const text = (query ?? '').trim();\n const offersCreate =\n create !== null &&\n text !== '' &&\n !searching &&\n ![...found, ...selected].some(\n (item) =>\n item.label.toLocaleLowerCase(intl.locale) === text.toLocaleLowerCase(intl.locale),\n );\n const items = offersCreate\n ? [\n ...found,\n { id: CREATE_ID, label: intl.formatMessage(messages.createRelation, { text }) },\n ]\n : found;\n const isLoading = searching || creating;\n const allErrors = createError !== null ? [...(errors ?? []), createError] : errors;\n /** Creates an item from the text, then adds its reference with `add`. */\n const createFrom = (add: (reference: RelationReference) => void) => {\n if (create === null) {\n return;\n }\n setCreating(true);\n setCreateError(null);\n create(text)\n .then((reference) => {\n if (reference !== null) {\n add(reference);\n setQuery(null);\n }\n })\n .catch(() =>\n setCreateError(intl.formatMessage(messages.createRelationFailed, { text })),\n )\n .finally(() => setCreating(false));\n };\n const removeLabel = (reference: RelationReference) =>\n `${intl.formatMessage(messages.remove)} ${reference.label}`;\n const chrome = {\n legend: label,\n errors: allErrors,\n isRequired: required,\n className,\n legendClassName: labelClassName,\n descriptionClassName,\n errorsClassName,\n };\n\n if (!editable) {\n return (\n <Fieldset\n {...chrome}\n description={\n source === null && disabled !== true && readOnly !== true ? (\n <>\n {description} {intl.formatMessage(messages.relationUnavailable)}\n </>\n ) : (\n description\n )\n }\n >\n {selected.length > 0 ? (\n <References references={selected} removeLabel={removeLabel} />\n ) : (\n <span className={styles.none}>{intl.formatMessage(messages.noRelation)}</span>\n )}\n </Fieldset>\n );\n }\n\n const comboLabel = typeof label === 'string' ? label : props['aria-label'];\n\n if (props.multiple === true) {\n const { onChange } = props;\n const set = (next: RelationReference[]) => onChange?.(next.length > 0 ? next : null);\n return (\n <Fieldset {...chrome} description={description}>\n <div className={styles.multiple}>\n {selected.length > 0 ? (\n <References\n references={selected}\n removeLabel={removeLabel}\n onRemove={(reference) =>\n set(selected.filter((entry) => entry.id !== reference.id))\n }\n />\n ) : null}\n <ComboBox\n aria-label={comboLabel}\n items={items\n .filter((item) => !selected.some((entry) => entry.id === item.id))\n .map((item) => ({ id: item.id, label: item.label }))}\n value={null}\n inputValue={query ?? ''}\n onInputChange={setQuery}\n onChange={(itemId) => {\n if (itemId === CREATE_ID) {\n createFrom((reference) => set([...selected, reference]));\n return;\n }\n const reference = found.find((item) => item.id === itemId);\n if (reference !== undefined) {\n set([...selected, reference]);\n setQuery(null);\n }\n }}\n isLoading={isLoading}\n placeholder={placeholder}\n emptyMessage={intl.formatMessage(messages.noResults)}\n {...(onBlur !== undefined ? { onBlur: () => onBlur() } : {})}\n {...(name !== undefined ? { name } : {})}\n {...(id !== undefined ? { id } : {})}\n {...(controlClassName !== undefined ? { controlClassName } : {})}\n />\n </div>\n </Fieldset>\n );\n }\n\n const { onChange } = props;\n const current = selected[0] ?? null;\n // The selected reference is among the items, so that the combo box knows its label.\n const shown =\n current !== null && !items.some((item) => item.id === current.id)\n ? [current, ...items]\n : items;\n return (\n <ComboBox\n label={label}\n description={description}\n errors={allErrors}\n isRequired={required}\n className={className}\n labelClassName={labelClassName}\n descriptionClassName={descriptionClassName}\n errorsClassName={errorsClassName}\n {...(controlClassName !== undefined ? { controlClassName } : {})}\n {...(props['aria-label'] !== undefined ? { 'aria-label': props['aria-label'] } : {})}\n items={shown.map((item) => ({ id: item.id, label: item.label }))}\n value={current?.id ?? null}\n inputValue={query ?? current?.label ?? ''}\n onInputChange={(text) => {\n setQuery(text);\n if (text === '' && current !== null) {\n onChange?.(null);\n }\n }}\n onChange={(itemId) => {\n if (itemId === CREATE_ID) {\n createFrom((reference) => onChange?.(reference));\n return;\n }\n setQuery(null);\n if (itemId === null) {\n return;\n }\n const reference = shown.find((item) => item.id === itemId) ?? null;\n if (reference?.id !== current?.id) {\n onChange?.(reference);\n }\n }}\n isLoading={isLoading}\n placeholder={placeholder}\n emptyMessage={intl.formatMessage(messages.noResults)}\n {...(onBlur !== undefined\n ? {\n onBlur: () => {\n setQuery(null);\n onBlur();\n },\n }\n : { onBlur: () => setQuery(null) })}\n {...(name !== undefined ? { name } : {})}\n {...(id !== undefined ? { id } : {})}\n />\n );\n}\n\n/** The `relation` type: `resource` and `multiple`. Items search the fields context's source. */\nexport function RelationFieldEntry(props: FieldEntryProps) {\n const { field } = props;\n const references = toReferences(props.value);\n const shared = { ...getFieldProps(props), resource: field.resource ?? '' };\n if (field.multiple === true) {\n return <RelationField {...shared} multiple value={references} onChange={props.onChange} />;\n }\n return <RelationField {...shared} value={references[0] ?? null} onChange={props.onChange} />;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RelationField.js","names":["X","useEffect","useState","ComboBox","Fieldset","IconButton","usePanneauIntl","useFieldsContext","cx","getFieldProps","messages","RelationReference","RelationSource","toReferences","useRelationReferences","FieldEntryProps","FieldProps","styles","CREATE_ID","useRelationSearch","source","resource","query","t0","$","_c","t1","undefined","enabled","t2","delay","t3","t4","Symbol","for","key","items","isLoading","state","setState","t5","t6","controller","AbortController","timer","setTimeout","current","search","signal","then","aborted","catch","clearTimeout","abort","t7","t8","RelationFieldBaseProps","Omit","onCreate","text","Promise","placeholder","controlClassName","SingleRelationFieldProps","multiple","value","onChange","MultipleRelationFieldProps","RelationFieldProps","References","references","onRemove","removeLabel","readOnly","selected","reference","id","referenceLabel","label","map","RelationField","props","intl","context","relationSource","description","errors","disabled","required","onBlur","name","className","labelClassName","descriptionClassName","errorsClassName","formatMessage","setQuery","creating","setCreating","createError","setCreateError","editable","found","searching","sourceCreate","create","canCreate","call","allErrors","createFrom","bb0","text_0","trim","offersCreate","some","item","toLocaleLowerCase","locale","createRelation","add","createRelationFailed","finally","reference_0","remove","legend","isRequired","legendClassName","chrome","t9","relationUnavailable","t10","length","none","noRelation","t11","comboLabel","next","set","reference_1","filter","entry","item_0","entry_0","t12","_temp","t13","noResults","t14","t15","t16","t17","t18","itemId","reference_2","reference_3","find","item_2","t19","t20","onChange_0","item_3","shown","_temp2","text_1","itemId_0","reference_4","reference_5","item_5","item_4","item_1","RelationFieldEntry","field","shared","_c","styles","_Fragment"],"sources":["../../src/relation/RelationField.tsx"],"sourcesContent":["import { X } from 'lucide-react';\nimport { useEffect, useState } from 'react';\n\nimport { ComboBox, Fieldset, IconButton, usePanneauIntl } from '@panneau/ui';\n\nimport { useFieldsContext } from '../shared/context';\nimport { cx } from '../shared/cx';\nimport { getFieldProps } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport {\n type RelationReference,\n type RelationSource,\n toReferences,\n useRelationReferences,\n} from '../shared/relation';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './RelationField.module.css';\n\n/** The id of the \"Create “…”\" option of the picker. */\nconst CREATE_ID = '\\u0000create';\n\n/** Results of a search in a relation source, as it types. */\nexport function useRelationSearch(\n source: RelationSource | null,\n resource: string,\n query: string,\n { enabled = true, delay = 250 }: { enabled?: boolean; delay?: number } = {},\n): { items: RelationReference[]; isLoading: boolean } {\n const [state, setState] = useState<{\n key: string;\n items: RelationReference[];\n isLoading: boolean;\n }>({ key: '', items: [], isLoading: false });\n const key = `${resource}\\u0000${query}`;\n\n useEffect(() => {\n if (source === null || !enabled) {\n return undefined;\n }\n const controller = new AbortController();\n const timer = setTimeout(() => {\n setState((current) => ({ ...current, key, isLoading: true }));\n source\n .search(resource, query, { signal: controller.signal })\n .then((items) => {\n if (!controller.signal.aborted) {\n setState({ key, items, isLoading: false });\n }\n })\n .catch(() => {\n if (!controller.signal.aborted) {\n setState({ key, items: [], isLoading: false });\n }\n });\n }, delay);\n return () => {\n clearTimeout(timer);\n controller.abort();\n };\n }, [source, resource, query, key, enabled, delay]);\n\n return { items: state.items, isLoading: state.isLoading || state.key !== key };\n}\n\n/** Props of both single and multiple relation fields. */\nexport interface RelationFieldBaseProps extends Omit<FieldProps<never>, 'value' | 'onChange'> {\n /** Id of the related resource, passed to the source. */\n resource: string;\n /** Where to search. Defaults to the fields context's. Without one, the field is read-only. */\n source?: RelationSource | null;\n /**\n * Creates an item from the typed text, offered as \"Create “…”\" in the picker: it can open a\n * dialog, and resolves with the new reference, or `null` when nothing was created. Defaults to\n * the source's `create()`. `null` turns creating off.\n */\n onCreate?: ((text: string) => Promise<RelationReference | null>) | null;\n placeholder?: string;\n controlClassName?: string;\n}\n\nexport interface SingleRelationFieldProps extends RelationFieldBaseProps {\n multiple?: false;\n value?: RelationReference | null;\n onChange?: (value: RelationReference | null) => void;\n}\n\nexport interface MultipleRelationFieldProps extends RelationFieldBaseProps {\n multiple: true;\n value?: readonly RelationReference[] | null;\n /** Called with the references. An empty list is `null`. */\n onChange?: (value: RelationReference[] | null) => void;\n}\n\nexport type RelationFieldProps = SingleRelationFieldProps | MultipleRelationFieldProps;\n\nfunction References({\n references,\n onRemove,\n removeLabel,\n}: {\n references: readonly RelationReference[];\n onRemove?: (reference: RelationReference) => void;\n removeLabel: (reference: RelationReference) => string;\n}) {\n return (\n <ul className={cx(styles.selected, onRemove === undefined && styles.readOnly)}>\n {references.map((reference) => (\n <li key={reference.id} className={styles.reference}>\n <span className={styles.referenceLabel}>{reference.label}</span>\n {onRemove !== undefined ? (\n <IconButton\n icon={X}\n size=\"sm\"\n label={removeLabel(reference)}\n showTooltip={false}\n onPress={() => onRemove(reference)}\n />\n ) : null}\n </li>\n ))}\n </ul>\n );\n}\n\n/**\n * A reference to an item of another resource, or several with `multiple`, picked by searching a\n * `RelationSource`. Values are references (`{ id, label }`), as items carry them; plain ids get\n * their labels from the source's `resolve()`. When the source can `create()` (or with `onCreate`),\n * the picker offers to create an item from the typed text. Without a source, the field shows its\n * references and can't change them.\n */\nexport function RelationField(props: RelationFieldProps) {\n const intl = usePanneauIntl();\n const context = useFieldsContext();\n const source = props.source === undefined ? context.relationSource : props.source;\n const {\n resource,\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n onBlur,\n name,\n id,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n controlClassName,\n } = props;\n const placeholder = props.placeholder ?? intl.formatMessage(messages.search);\n const selected = useRelationReferences(source, resource, toReferences(props.value));\n const [query, setQuery] = useState<string | null>(null);\n const [creating, setCreating] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n const editable = source !== null && disabled !== true && readOnly !== true;\n const { items: found, isLoading: searching } = useRelationSearch(\n source,\n resource,\n query ?? '',\n { enabled: editable },\n );\n const sourceCreate = source?.create;\n const create =\n props.onCreate !== undefined\n ? props.onCreate\n : sourceCreate !== undefined && source?.canCreate?.(resource) !== false\n ? (text: string) => sourceCreate.call(source, resource, text)\n : null;\n const text = (query ?? '').trim();\n const offersCreate =\n create !== null &&\n text !== '' &&\n !searching &&\n ![...found, ...selected].some(\n (item) =>\n item.label.toLocaleLowerCase(intl.locale) === text.toLocaleLowerCase(intl.locale),\n );\n const items = offersCreate\n ? [\n ...found,\n { id: CREATE_ID, label: intl.formatMessage(messages.createRelation, { text }) },\n ]\n : found;\n const isLoading = searching || creating;\n const allErrors = createError !== null ? [...(errors ?? []), createError] : errors;\n /** Creates an item from the text, then adds its reference with `add`. */\n const createFrom = (add: (reference: RelationReference) => void) => {\n if (create === null) {\n return;\n }\n setCreating(true);\n setCreateError(null);\n create(text)\n .then((reference) => {\n if (reference !== null) {\n add(reference);\n setQuery(null);\n }\n })\n .catch(() =>\n setCreateError(intl.formatMessage(messages.createRelationFailed, { text })),\n )\n .finally(() => setCreating(false));\n };\n const removeLabel = (reference: RelationReference) =>\n `${intl.formatMessage(messages.remove)} ${reference.label}`;\n const chrome = {\n legend: label,\n errors: allErrors,\n isRequired: required,\n className,\n legendClassName: labelClassName,\n descriptionClassName,\n errorsClassName,\n };\n\n if (!editable) {\n return (\n <Fieldset\n {...chrome}\n description={\n source === null && disabled !== true && readOnly !== true ? (\n <>\n {description} {intl.formatMessage(messages.relationUnavailable)}\n </>\n ) : (\n description\n )\n }\n >\n {selected.length > 0 ? (\n <References references={selected} removeLabel={removeLabel} />\n ) : (\n <span className={styles.none}>{intl.formatMessage(messages.noRelation)}</span>\n )}\n </Fieldset>\n );\n }\n\n const comboLabel = typeof label === 'string' ? label : props['aria-label'];\n\n if (props.multiple === true) {\n const { onChange } = props;\n const set = (next: RelationReference[]) => onChange?.(next.length > 0 ? next : null);\n return (\n <Fieldset {...chrome} description={description}>\n <div className={styles.multiple}>\n {selected.length > 0 ? (\n <References\n references={selected}\n removeLabel={removeLabel}\n onRemove={(reference) =>\n set(selected.filter((entry) => entry.id !== reference.id))\n }\n />\n ) : null}\n <ComboBox\n aria-label={comboLabel}\n items={items\n .filter((item) => !selected.some((entry) => entry.id === item.id))\n .map((item) => ({ id: item.id, label: item.label }))}\n value={null}\n inputValue={query ?? ''}\n onInputChange={setQuery}\n onChange={(itemId) => {\n if (itemId === CREATE_ID) {\n createFrom((reference) => set([...selected, reference]));\n return;\n }\n const reference = found.find((item) => item.id === itemId);\n if (reference !== undefined) {\n set([...selected, reference]);\n setQuery(null);\n }\n }}\n isLoading={isLoading}\n placeholder={placeholder}\n emptyMessage={intl.formatMessage(messages.noResults)}\n {...(onBlur !== undefined ? { onBlur: () => onBlur() } : {})}\n {...(name !== undefined ? { name } : {})}\n {...(id !== undefined ? { id } : {})}\n {...(controlClassName !== undefined ? { controlClassName } : {})}\n />\n </div>\n </Fieldset>\n );\n }\n\n const { onChange } = props;\n const current = selected[0] ?? null;\n // The selected reference is among the items, so that the combo box knows its label.\n const shown =\n current !== null && !items.some((item) => item.id === current.id)\n ? [current, ...items]\n : items;\n return (\n <ComboBox\n label={label}\n description={description}\n errors={allErrors}\n isRequired={required}\n className={className}\n labelClassName={labelClassName}\n descriptionClassName={descriptionClassName}\n errorsClassName={errorsClassName}\n {...(controlClassName !== undefined ? { controlClassName } : {})}\n {...(props['aria-label'] !== undefined ? { 'aria-label': props['aria-label'] } : {})}\n items={shown.map((item) => ({ id: item.id, label: item.label }))}\n value={current?.id ?? null}\n inputValue={query ?? current?.label ?? ''}\n onInputChange={(text) => {\n setQuery(text);\n if (text === '' && current !== null) {\n onChange?.(null);\n }\n }}\n onChange={(itemId) => {\n if (itemId === CREATE_ID) {\n createFrom((reference) => onChange?.(reference));\n return;\n }\n setQuery(null);\n if (itemId === null) {\n return;\n }\n const reference = shown.find((item) => item.id === itemId) ?? null;\n if (reference?.id !== current?.id) {\n onChange?.(reference);\n }\n }}\n isLoading={isLoading}\n placeholder={placeholder}\n emptyMessage={intl.formatMessage(messages.noResults)}\n {...(onBlur !== undefined\n ? {\n onBlur: () => {\n setQuery(null);\n onBlur();\n },\n }\n : { onBlur: () => setQuery(null) })}\n {...(name !== undefined ? { name } : {})}\n {...(id !== undefined ? { id } : {})}\n />\n );\n}\n\n/** The `relation` type: `resource` and `multiple`. Items search the fields context's source. */\nexport function RelationFieldEntry(props: FieldEntryProps) {\n const { field } = props;\n const references = toReferences(props.value);\n // A relation names one resource: `lintDefinition()` reports a list (only `media` fields take one).\n const resource = typeof field.resource === 'string' ? field.resource : '';\n const shared = { ...getFieldProps(props), resource };\n if (field.multiple === true) {\n return <RelationField {...shared} multiple value={references} onChange={props.onChange} />;\n }\n return <RelationField {...shared} value={references[0] ?? null} onChange={props.onChange} />;\n}\n"],"mappings":"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"}
|
package/dist/relation/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { type MultipleRelationFieldProps, type RelationFieldBaseProps, RelationField, RelationFieldEntry, type RelationFieldProps, type SingleRelationFieldProps, useRelationSearch, } from './RelationField';
|
|
2
|
-
export { type RelationListAdapter, type RelationReference, type RelationSource, type RelationSourceOptions, createRelationSource, useRelationReferences, } from '../shared/relation';
|
|
1
|
+
export { type MultipleRelationFieldProps, type RelationFieldBaseProps, RelationField, RelationFieldEntry, type RelationFieldProps, type SingleRelationFieldProps, useRelationSearch, } from './RelationField.js';
|
|
2
|
+
export { type RelationListAdapter, type RelationReference, type RelationSource, type RelationSourceOptions, createRelationSource, useRelationReferences, } from '../shared/relation.js';
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
1
2
|
import type { BlockType, Field } from '@panneau/protocol';
|
|
2
|
-
import type { FieldEntryProps, FieldProps } from '../shared/types';
|
|
3
|
+
import type { FieldEntryProps, FieldProps } from '../shared/types.js';
|
|
3
4
|
/** An item of a repeater. Typed blocks have their type in `type`. */
|
|
4
5
|
export type RepeaterItem = Record<string, unknown>;
|
|
5
6
|
export interface RepeaterFieldProps extends FieldProps<RepeaterItem[]> {
|
|
@@ -13,6 +14,16 @@ export interface RepeaterFieldProps extends FieldProps<RepeaterItem[]> {
|
|
|
13
14
|
min?: number;
|
|
14
15
|
/** Most items: no item can be added above it. */
|
|
15
16
|
max?: number;
|
|
17
|
+
/**
|
|
18
|
+
* The title of an item, after its number: a summary of its values (decision 0065). Without
|
|
19
|
+
* one, or when it gives `null`, the label of its type, or "Item 2".
|
|
20
|
+
*/
|
|
21
|
+
itemTitle?: (item: RepeaterItem, index: number) => string | null;
|
|
22
|
+
/**
|
|
23
|
+
* Lays out the rendered fields of an item, by name, instead of one under the other: the
|
|
24
|
+
* layout of a compound field (decision 0065).
|
|
25
|
+
*/
|
|
26
|
+
renderFields?: (parts: Readonly<Record<string, ReactNode>>, item: RepeaterItem) => ReactNode;
|
|
16
27
|
itemClassName?: string;
|
|
17
28
|
}
|
|
18
29
|
/**
|
|
@@ -20,7 +31,7 @@ export interface RepeaterFieldProps extends FieldProps<RepeaterItem[]> {
|
|
|
20
31
|
* can be added, moved and removed. Each field renders at the path `<list>.<index>.<field>`. An
|
|
21
32
|
* empty list is `null`.
|
|
22
33
|
*/
|
|
23
|
-
export declare function RepeaterField({ fields, types, path, name, value, onChange, onBlur, label, description, errors, disabled, readOnly, required, min, max, className, labelClassName, descriptionClassName, errorsClassName, itemClassName, }: RepeaterFieldProps): import("react").JSX.Element;
|
|
34
|
+
export declare function RepeaterField({ fields, types, path, name, value, onChange, onBlur, label, description, errors, disabled, readOnly, required, min, max, itemTitle, renderFields, className, labelClassName, descriptionClassName, errorsClassName, itemClassName, }: RepeaterFieldProps): import("react").JSX.Element;
|
|
24
35
|
/**
|
|
25
36
|
* The `repeater` type: `fields`, or `types` for typed blocks, with `min` and `max` items from its
|
|
26
37
|
* rules.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RepeaterField.d.ts","sourceRoot":"","sources":["../../src/repeater/RepeaterField.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RepeaterField.d.ts","sourceRoot":"","sources":["../../src/repeater/RepeaterField.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAS,MAAM,OAAO,CAAC;AAE9C,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAe1D,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGnE,qEAAqE;AACrE,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEnD,MAAM,WAAW,kBAAmB,SAAQ,UAAU,CAAC,YAAY,EAAE,CAAC;IAClE,+BAA+B;IAC/B,MAAM,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC;IAC1B,yEAAyE;IACzE,KAAK,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAC7B,mGAAmG;IACnG,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACjE;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,KAAK,SAAS,CAAC;IAC7F,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAUD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAC1B,MAAW,EACX,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,MAAM,EACN,KAAK,EACL,WAAW,EACX,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,GAAO,EACP,GAAG,EACH,SAAS,EACT,YAAY,EACZ,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,aAAa,GAChB,EAAE,kBAAkB,+BAoKpB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,+BAwBxD"}
|
|
@@ -5,9 +5,9 @@ import RepeaterField_module_default from "./RepeaterField.module.js";
|
|
|
5
5
|
import { NestedField } from "../shared/DefinitionField.js";
|
|
6
6
|
import { c } from "react/compiler-runtime";
|
|
7
7
|
import { Button, Fieldset, IconButton, Menu, MenuItem, MenuTrigger, usePanneauIntl } from "@panneau/ui";
|
|
8
|
-
import { useId } from "react";
|
|
9
8
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
9
|
import { ArrowDown, ArrowUp, Plus, Trash2 } from "lucide-react";
|
|
10
|
+
import { useId } from "react";
|
|
11
11
|
//#region src/repeater/RepeaterField.tsx
|
|
12
12
|
function defaults(fields) {
|
|
13
13
|
return Object.fromEntries(fields.flatMap((field) => field.default !== void 0 ? [[field.name, field.default]] : []));
|
|
@@ -17,43 +17,87 @@ function defaults(fields) {
|
|
|
17
17
|
* can be added, moved and removed. Each field renders at the path `<list>.<index>.<field>`. An
|
|
18
18
|
* empty list is `null`.
|
|
19
19
|
*/
|
|
20
|
-
function RepeaterField(
|
|
20
|
+
function RepeaterField(t0) {
|
|
21
|
+
const $ = c(47);
|
|
22
|
+
const { fields: t1, types, path, name, value, onChange, onBlur, label, description, errors, disabled, readOnly, required, min: t2, max, itemTitle, renderFields, className, labelClassName, descriptionClassName, errorsClassName, itemClassName } = t0;
|
|
23
|
+
let t3;
|
|
24
|
+
if ($[0] !== t1) {
|
|
25
|
+
t3 = t1 === void 0 ? [] : t1;
|
|
26
|
+
$[0] = t1;
|
|
27
|
+
$[1] = t3;
|
|
28
|
+
} else t3 = $[1];
|
|
29
|
+
const fields = t3;
|
|
30
|
+
const min = t2 === void 0 ? 0 : t2;
|
|
21
31
|
const intl = usePanneauIntl();
|
|
22
32
|
const id = useId();
|
|
23
33
|
const base = path ?? name ?? "";
|
|
24
|
-
|
|
34
|
+
let t4;
|
|
35
|
+
if ($[2] !== value) {
|
|
36
|
+
t4 = value ?? [];
|
|
37
|
+
$[2] = value;
|
|
38
|
+
$[3] = t4;
|
|
39
|
+
} else t4 = $[3];
|
|
40
|
+
const items = t4;
|
|
25
41
|
const editable = disabled !== true && readOnly !== true;
|
|
26
42
|
const canAdd = editable && (max === void 0 || items.length < max);
|
|
27
43
|
const canRemove = editable && items.length > min;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
44
|
+
let t5;
|
|
45
|
+
if ($[4] !== onChange) {
|
|
46
|
+
t5 = (next) => onChange?.(next.length > 0 ? next : null);
|
|
47
|
+
$[4] = onChange;
|
|
48
|
+
$[5] = t5;
|
|
49
|
+
} else t5 = $[5];
|
|
50
|
+
const set = t5;
|
|
51
|
+
let t6;
|
|
52
|
+
if ($[6] !== items || $[7] !== set) {
|
|
53
|
+
t6 = (from, to) => {
|
|
54
|
+
const next_0 = [...items];
|
|
55
|
+
const [moved] = next_0.splice(from, 1);
|
|
56
|
+
if (moved !== void 0) {
|
|
57
|
+
next_0.splice(to, 0, moved);
|
|
58
|
+
set(next_0);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
$[6] = items;
|
|
62
|
+
$[7] = set;
|
|
63
|
+
$[8] = t6;
|
|
64
|
+
} else t6 = $[8];
|
|
65
|
+
const move = t6;
|
|
66
|
+
let t7;
|
|
67
|
+
if ($[9] !== fields || $[10] !== items || $[11] !== set) {
|
|
68
|
+
t7 = (type) => set([...items, type !== void 0 ? {
|
|
69
|
+
type: type.id,
|
|
70
|
+
...defaults(type.fields)
|
|
71
|
+
} : defaults(fields)]);
|
|
72
|
+
$[9] = fields;
|
|
73
|
+
$[10] = items;
|
|
74
|
+
$[11] = set;
|
|
75
|
+
$[12] = t7;
|
|
76
|
+
} else t7 = $[12];
|
|
77
|
+
const add = t7;
|
|
78
|
+
let t8;
|
|
79
|
+
if ($[13] !== base || $[14] !== canRemove || $[15] !== disabled || $[16] !== editable || $[17] !== fields || $[18] !== id || $[19] !== intl || $[20] !== itemClassName || $[21] !== itemTitle || $[22] !== items || $[23] !== move || $[24] !== onBlur || $[25] !== readOnly || $[26] !== renderFields || $[27] !== set || $[28] !== types) {
|
|
80
|
+
t8 = items.length > 0 ? /* @__PURE__ */ jsx("ol", {
|
|
51
81
|
className: RepeaterField_module_default.items,
|
|
52
82
|
children: items.map((item, index) => {
|
|
53
83
|
const type_0 = types !== void 0 ? types.find((candidate) => candidate.id === item.type) : void 0;
|
|
54
84
|
const itemFields = types !== void 0 ? type_0?.fields ?? [] : fields;
|
|
55
85
|
const number = index + 1;
|
|
56
86
|
const titleId = `${id}-${index}`;
|
|
87
|
+
const summary = itemTitle?.(item, index) ?? null;
|
|
88
|
+
const renderField = (field) => /* @__PURE__ */ jsx(NestedField, {
|
|
89
|
+
field,
|
|
90
|
+
path: `${base}.${index}.${field.name}`,
|
|
91
|
+
value: item[field.name],
|
|
92
|
+
onChange: (next_1) => set(items.map((current, i) => i === index ? {
|
|
93
|
+
...current,
|
|
94
|
+
[field.name]: next_1
|
|
95
|
+
} : current)),
|
|
96
|
+
...onBlur !== void 0 ? { onBlur } : {},
|
|
97
|
+
parentValue: item,
|
|
98
|
+
...disabled !== void 0 ? { disabled } : {},
|
|
99
|
+
...readOnly !== void 0 ? { readOnly } : {}
|
|
100
|
+
}, field.name);
|
|
57
101
|
return /* @__PURE__ */ jsxs("li", {
|
|
58
102
|
className: cx(RepeaterField_module_default.item, itemClassName),
|
|
59
103
|
"aria-labelledby": titleId,
|
|
@@ -65,7 +109,7 @@ function RepeaterField({ fields = [], types, path, name, value, onChange, onBlur
|
|
|
65
109
|
children: [/* @__PURE__ */ jsx("span", {
|
|
66
110
|
className: RepeaterField_module_default.index,
|
|
67
111
|
children: number
|
|
68
|
-
}), type_0?.label ?? (typeof item.type === "string" ? item.type : intl.formatMessage(messages.item, { index: number }))]
|
|
112
|
+
}), summary ?? type_0?.label ?? (typeof item.type === "string" ? item.type : intl.formatMessage(messages.item, { index: number }))]
|
|
69
113
|
}), editable ? /* @__PURE__ */ jsxs("span", {
|
|
70
114
|
className: RepeaterField_module_default.tools,
|
|
71
115
|
children: [
|
|
@@ -88,32 +132,41 @@ function RepeaterField({ fields = [], types, path, name, value, onChange, onBlur
|
|
|
88
132
|
size: "sm",
|
|
89
133
|
label: intl.formatMessage(messages.removeItem, { index: number }),
|
|
90
134
|
isDisabled: !canRemove,
|
|
91
|
-
onPress: () => set(items.filter((_,
|
|
135
|
+
onPress: () => set(items.filter((_, i_0) => i_0 !== index))
|
|
92
136
|
})
|
|
93
137
|
]
|
|
94
138
|
}) : null]
|
|
95
139
|
}), /* @__PURE__ */ jsx("div", {
|
|
96
140
|
className: RepeaterField_module_default.body,
|
|
97
|
-
children: itemFields.map((
|
|
98
|
-
field,
|
|
99
|
-
path: `${base}.${index}.${field.name}`,
|
|
100
|
-
value: item[field.name],
|
|
101
|
-
onChange: (next_1) => set(items.map((current, i_0) => i_0 === index ? {
|
|
102
|
-
...current,
|
|
103
|
-
[field.name]: next_1
|
|
104
|
-
} : current)),
|
|
105
|
-
...onBlur !== void 0 ? { onBlur } : {},
|
|
106
|
-
parentValue: item,
|
|
107
|
-
...disabled !== void 0 ? { disabled } : {},
|
|
108
|
-
...readOnly !== void 0 ? { readOnly } : {}
|
|
109
|
-
}, field.name))
|
|
141
|
+
children: renderFields !== void 0 ? renderFields(Object.fromEntries(itemFields.map((field_0) => [field_0.name, renderField(field_0)])), item) : itemFields.map(renderField)
|
|
110
142
|
})]
|
|
111
143
|
}, index);
|
|
112
144
|
})
|
|
113
145
|
}) : /* @__PURE__ */ jsx("p", {
|
|
114
146
|
className: RepeaterField_module_default.empty,
|
|
115
147
|
children: intl.formatMessage(messages.noItems)
|
|
116
|
-
})
|
|
148
|
+
});
|
|
149
|
+
$[13] = base;
|
|
150
|
+
$[14] = canRemove;
|
|
151
|
+
$[15] = disabled;
|
|
152
|
+
$[16] = editable;
|
|
153
|
+
$[17] = fields;
|
|
154
|
+
$[18] = id;
|
|
155
|
+
$[19] = intl;
|
|
156
|
+
$[20] = itemClassName;
|
|
157
|
+
$[21] = itemTitle;
|
|
158
|
+
$[22] = items;
|
|
159
|
+
$[23] = move;
|
|
160
|
+
$[24] = onBlur;
|
|
161
|
+
$[25] = readOnly;
|
|
162
|
+
$[26] = renderFields;
|
|
163
|
+
$[27] = set;
|
|
164
|
+
$[28] = types;
|
|
165
|
+
$[29] = t8;
|
|
166
|
+
} else t8 = $[29];
|
|
167
|
+
let t9;
|
|
168
|
+
if ($[30] !== add || $[31] !== canAdd || $[32] !== editable || $[33] !== intl || $[34] !== types) {
|
|
169
|
+
t9 = editable ? /* @__PURE__ */ jsx("div", {
|
|
117
170
|
className: RepeaterField_module_default.footer,
|
|
118
171
|
children: types !== void 0 ? /* @__PURE__ */ jsxs(MenuTrigger, { children: [/* @__PURE__ */ jsx(Button, {
|
|
119
172
|
size: "sm",
|
|
@@ -123,10 +176,7 @@ function RepeaterField({ fields = [], types, path, name, value, onChange, onBlur
|
|
|
123
176
|
}), /* @__PURE__ */ jsx(Menu, {
|
|
124
177
|
"aria-label": intl.formatMessage(messages.add),
|
|
125
178
|
onAction: (key) => add(types.find((type_1) => type_1.id === key)),
|
|
126
|
-
children: types.map(
|
|
127
|
-
id: type_2.id,
|
|
128
|
-
children: type_2.label
|
|
129
|
-
}, type_2.id))
|
|
179
|
+
children: types.map(_temp)
|
|
130
180
|
})] }) : /* @__PURE__ */ jsx(Button, {
|
|
131
181
|
size: "sm",
|
|
132
182
|
icon: Plus,
|
|
@@ -134,13 +184,51 @@ function RepeaterField({ fields = [], types, path, name, value, onChange, onBlur
|
|
|
134
184
|
onPress: () => add(),
|
|
135
185
|
children: intl.formatMessage(messages.add)
|
|
136
186
|
})
|
|
137
|
-
}) : null
|
|
138
|
-
|
|
187
|
+
}) : null;
|
|
188
|
+
$[30] = add;
|
|
189
|
+
$[31] = canAdd;
|
|
190
|
+
$[32] = editable;
|
|
191
|
+
$[33] = intl;
|
|
192
|
+
$[34] = types;
|
|
193
|
+
$[35] = t9;
|
|
194
|
+
} else t9 = $[35];
|
|
195
|
+
let t10;
|
|
196
|
+
if ($[36] !== className || $[37] !== description || $[38] !== descriptionClassName || $[39] !== errors || $[40] !== errorsClassName || $[41] !== label || $[42] !== labelClassName || $[43] !== required || $[44] !== t8 || $[45] !== t9) {
|
|
197
|
+
t10 = /* @__PURE__ */ jsxs(Fieldset, {
|
|
198
|
+
legend: label,
|
|
199
|
+
description,
|
|
200
|
+
errors,
|
|
201
|
+
isRequired: required,
|
|
202
|
+
className,
|
|
203
|
+
legendClassName: labelClassName,
|
|
204
|
+
descriptionClassName,
|
|
205
|
+
errorsClassName,
|
|
206
|
+
children: [t8, t9]
|
|
207
|
+
});
|
|
208
|
+
$[36] = className;
|
|
209
|
+
$[37] = description;
|
|
210
|
+
$[38] = descriptionClassName;
|
|
211
|
+
$[39] = errors;
|
|
212
|
+
$[40] = errorsClassName;
|
|
213
|
+
$[41] = label;
|
|
214
|
+
$[42] = labelClassName;
|
|
215
|
+
$[43] = required;
|
|
216
|
+
$[44] = t8;
|
|
217
|
+
$[45] = t9;
|
|
218
|
+
$[46] = t10;
|
|
219
|
+
} else t10 = $[46];
|
|
220
|
+
return t10;
|
|
139
221
|
}
|
|
140
222
|
/**
|
|
141
223
|
* The `repeater` type: `fields`, or `types` for typed blocks, with `min` and `max` items from its
|
|
142
224
|
* rules.
|
|
143
225
|
*/
|
|
226
|
+
function _temp(type_2) {
|
|
227
|
+
return /* @__PURE__ */ jsx(MenuItem, {
|
|
228
|
+
id: type_2.id,
|
|
229
|
+
children: type_2.label
|
|
230
|
+
}, type_2.id);
|
|
231
|
+
}
|
|
144
232
|
function RepeaterFieldEntry(props) {
|
|
145
233
|
const $ = c(23);
|
|
146
234
|
const { field, value } = props;
|
|
@@ -173,7 +261,7 @@ function RepeaterFieldEntry(props) {
|
|
|
173
261
|
} else t3 = $[8];
|
|
174
262
|
let t4;
|
|
175
263
|
if ($[9] !== value) {
|
|
176
|
-
t4 = Array.isArray(value) ? value.filter(
|
|
264
|
+
t4 = Array.isArray(value) ? value.filter(_temp2) : null;
|
|
177
265
|
$[9] = value;
|
|
178
266
|
$[10] = t4;
|
|
179
267
|
} else t4 = $[10];
|
|
@@ -211,7 +299,7 @@ function RepeaterFieldEntry(props) {
|
|
|
211
299
|
} else t7 = $[22];
|
|
212
300
|
return t7;
|
|
213
301
|
}
|
|
214
|
-
function
|
|
302
|
+
function _temp2(item) {
|
|
215
303
|
return item !== null && typeof item === "object" && !Array.isArray(item);
|
|
216
304
|
}
|
|
217
305
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RepeaterField.js","names":["next","type","i","styles","_c"],"sources":["../../src/repeater/RepeaterField.tsx"],"sourcesContent":["import { ArrowDown, ArrowUp, Plus, Trash2 } from 'lucide-react';\nimport { useId } from 'react';\n\nimport type { BlockType, Field } from '@panneau/protocol';\nimport {\n Button,\n Fieldset,\n IconButton,\n Menu,\n MenuItem,\n MenuTrigger,\n usePanneauIntl,\n} from '@panneau/ui';\n\nimport { NestedField } from '../shared/DefinitionField';\nimport { cx } from '../shared/cx';\nimport { getFieldProps, getRuleNumber } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './RepeaterField.module.css';\n\n/** An item of a repeater. Typed blocks have their type in `type`. */\nexport type RepeaterItem = Record<string, unknown>;\n\nexport interface RepeaterFieldProps extends FieldProps<RepeaterItem[]> {\n /** The fields of each item. */\n fields?: readonly Field[];\n /** Typed blocks: each item has a `type`, and the fields of that type. */\n types?: readonly BlockType[];\n /** Dot path of the list, the prefix of its fields' paths (`blocks.2.body`). Defaults to `name`. */\n path?: string;\n /** Fewest items: items can't be removed below it. */\n min?: number;\n /** Most items: no item can be added above it. */\n max?: number;\n itemClassName?: string;\n}\n\nfunction defaults(fields: readonly Field[]): RepeaterItem {\n return Object.fromEntries(\n fields.flatMap((field) =>\n field.default !== undefined ? [[field.name, field.default]] : [],\n ),\n );\n}\n\n/**\n * A list of items, each with the same fields, or typed blocks with the fields of their type. Items\n * can be added, moved and removed. Each field renders at the path `<list>.<index>.<field>`. An\n * empty list is `null`.\n */\nexport function RepeaterField({\n fields = [],\n types,\n path,\n name,\n value,\n onChange,\n onBlur,\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n min = 0,\n max,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n itemClassName,\n}: RepeaterFieldProps) {\n const intl = usePanneauIntl();\n const id = useId();\n const base = path ?? name ?? '';\n const items = value ?? [];\n const editable = disabled !== true && readOnly !== true;\n const canAdd = editable && (max === undefined || items.length < max);\n const canRemove = editable && items.length > min;\n const set = (next: RepeaterItem[]) => onChange?.(next.length > 0 ? next : null);\n const move = (from: number, to: number) => {\n const next = [...items];\n const [moved] = next.splice(from, 1);\n if (moved !== undefined) {\n next.splice(to, 0, moved);\n set(next);\n }\n };\n const add = (type?: BlockType) =>\n set([\n ...items,\n type !== undefined ? { type: type.id, ...defaults(type.fields) } : defaults(fields),\n ]);\n\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 {items.length > 0 ? (\n <ol className={styles.items}>\n {items.map((item, index) => {\n const type =\n types !== undefined\n ? types.find((candidate) => candidate.id === item.type)\n : undefined;\n const itemFields = types !== undefined ? (type?.fields ?? []) : fields;\n const number = index + 1;\n const titleId = `${id}-${index}`;\n return (\n <li\n key={index}\n className={cx(styles.item, itemClassName)}\n aria-labelledby={titleId}\n >\n <div className={styles.header}>\n <span id={titleId} className={styles.title}>\n <span className={styles.index}>{number}</span>\n {type?.label ??\n (typeof item.type === 'string'\n ? item.type\n : intl.formatMessage(messages.item, {\n index: number,\n }))}\n </span>\n {editable ? (\n <span className={styles.tools}>\n <IconButton\n icon={ArrowUp}\n size=\"sm\"\n label={intl.formatMessage(messages.moveUp, {\n index: number,\n })}\n isDisabled={index === 0}\n onPress={() => move(index, index - 1)}\n />\n <IconButton\n icon={ArrowDown}\n size=\"sm\"\n label={intl.formatMessage(messages.moveDown, {\n index: number,\n })}\n isDisabled={index === items.length - 1}\n onPress={() => move(index, index + 1)}\n />\n <IconButton\n icon={Trash2}\n size=\"sm\"\n label={intl.formatMessage(messages.removeItem, {\n index: number,\n })}\n isDisabled={!canRemove}\n onPress={() =>\n set(items.filter((_, i) => i !== index))\n }\n />\n </span>\n ) : null}\n </div>\n <div className={styles.body}>\n {itemFields.map((field) => (\n <NestedField\n key={field.name}\n field={field}\n path={`${base}.${index}.${field.name}`}\n value={item[field.name]}\n onChange={(next) =>\n set(\n items.map((current, i) =>\n i === index\n ? { ...current, [field.name]: next }\n : current,\n ),\n )\n }\n {...(onBlur !== undefined ? { onBlur } : {})}\n parentValue={item}\n {...(disabled !== undefined ? { disabled } : {})}\n {...(readOnly !== undefined ? { readOnly } : {})}\n />\n ))}\n </div>\n </li>\n );\n })}\n </ol>\n ) : (\n <p className={styles.empty}>{intl.formatMessage(messages.noItems)}</p>\n )}\n {editable ? (\n <div className={styles.footer}>\n {types !== undefined ? (\n <MenuTrigger>\n <Button size=\"sm\" icon={Plus} isDisabled={!canAdd}>\n {intl.formatMessage(messages.add)}\n </Button>\n <Menu\n aria-label={intl.formatMessage(messages.add)}\n onAction={(key) => add(types.find((type) => type.id === key))}\n >\n {types.map((type) => (\n <MenuItem key={type.id} id={type.id}>\n {type.label}\n </MenuItem>\n ))}\n </Menu>\n </MenuTrigger>\n ) : (\n <Button size=\"sm\" icon={Plus} isDisabled={!canAdd} onPress={() => add()}>\n {intl.formatMessage(messages.add)}\n </Button>\n )}\n </div>\n ) : null}\n </Fieldset>\n );\n}\n\n/**\n * The `repeater` type: `fields`, or `types` for typed blocks, with `min` and `max` items from its\n * rules.\n */\nexport function RepeaterFieldEntry(props: FieldEntryProps) {\n const { field, value } = props;\n const min = getRuleNumber(field, 'min');\n const max = getRuleNumber(field, 'max');\n return (\n <RepeaterField\n {...getFieldProps(props)}\n path={props.path}\n {...(field.types !== undefined\n ? { types: field.types }\n : { fields: field.fields ?? [] })}\n value={\n Array.isArray(value)\n ? value.filter(\n (item): item is RepeaterItem =>\n item !== null && typeof item === 'object' && !Array.isArray(item),\n )\n : null\n }\n onChange={props.onChange}\n {...(min !== undefined ? { min } : {})}\n {...(max !== undefined ? { max } : {})}\n />\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RepeaterField.js","names":["ArrowDown","ArrowUp","Plus","Trash2","ReactNode","useId","BlockType","Field","Button","Fieldset","IconButton","Menu","MenuItem","MenuTrigger","usePanneauIntl","NestedField","cx","getFieldProps","getRuleNumber","messages","FieldEntryProps","FieldProps","styles","RepeaterItem","Record","RepeaterFieldProps","fields","types","path","min","max","itemTitle","item","index","renderFields","parts","Readonly","itemClassName","defaults","Object","fromEntries","flatMap","field","default","undefined","name","RepeaterField","t0","$","_c","t1","value","onChange","onBlur","label","description","errors","disabled","readOnly","required","t2","className","labelClassName","descriptionClassName","errorsClassName","t3","intl","id","base","t4","items","editable","canAdd","length","canRemove","t5","next","set","t6","from","to","next_0","moved","splice","move","t7","type","add","t8","map","type_0","find","candidate","itemFields","number","titleId","summary","renderField","next_1","current","i","header","title","formatMessage","tools","moveUp","moveDown","removeItem","filter","_","i_0","body","field_0","empty","noItems","t9","footer","key","type_1","_temp","t10","type_2","RepeaterFieldEntry","props","Array","isArray","_temp2","_c","styles"],"sources":["../../src/repeater/RepeaterField.tsx"],"sourcesContent":["import { ArrowDown, ArrowUp, Plus, Trash2 } from 'lucide-react';\nimport { type ReactNode, useId } from 'react';\n\nimport type { BlockType, Field } from '@panneau/protocol';\nimport {\n Button,\n Fieldset,\n IconButton,\n Menu,\n MenuItem,\n MenuTrigger,\n usePanneauIntl,\n} from '@panneau/ui';\n\nimport { NestedField } from '../shared/DefinitionField';\nimport { cx } from '../shared/cx';\nimport { getFieldProps, getRuleNumber } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './RepeaterField.module.css';\n\n/** An item of a repeater. Typed blocks have their type in `type`. */\nexport type RepeaterItem = Record<string, unknown>;\n\nexport interface RepeaterFieldProps extends FieldProps<RepeaterItem[]> {\n /** The fields of each item. */\n fields?: readonly Field[];\n /** Typed blocks: each item has a `type`, and the fields of that type. */\n types?: readonly BlockType[];\n /** Dot path of the list, the prefix of its fields' paths (`blocks.2.body`). Defaults to `name`. */\n path?: string;\n /** Fewest items: items can't be removed below it. */\n min?: number;\n /** Most items: no item can be added above it. */\n max?: number;\n /**\n * The title of an item, after its number: a summary of its values (decision 0065). Without\n * one, or when it gives `null`, the label of its type, or \"Item 2\".\n */\n itemTitle?: (item: RepeaterItem, index: number) => string | null;\n /**\n * Lays out the rendered fields of an item, by name, instead of one under the other: the\n * layout of a compound field (decision 0065).\n */\n renderFields?: (parts: Readonly<Record<string, ReactNode>>, item: RepeaterItem) => ReactNode;\n itemClassName?: string;\n}\n\nfunction defaults(fields: readonly Field[]): RepeaterItem {\n return Object.fromEntries(\n fields.flatMap((field) =>\n field.default !== undefined ? [[field.name, field.default]] : [],\n ),\n );\n}\n\n/**\n * A list of items, each with the same fields, or typed blocks with the fields of their type. Items\n * can be added, moved and removed. Each field renders at the path `<list>.<index>.<field>`. An\n * empty list is `null`.\n */\nexport function RepeaterField({\n fields = [],\n types,\n path,\n name,\n value,\n onChange,\n onBlur,\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n min = 0,\n max,\n itemTitle,\n renderFields,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n itemClassName,\n}: RepeaterFieldProps) {\n const intl = usePanneauIntl();\n const id = useId();\n const base = path ?? name ?? '';\n const items = value ?? [];\n const editable = disabled !== true && readOnly !== true;\n const canAdd = editable && (max === undefined || items.length < max);\n const canRemove = editable && items.length > min;\n const set = (next: RepeaterItem[]) => onChange?.(next.length > 0 ? next : null);\n const move = (from: number, to: number) => {\n const next = [...items];\n const [moved] = next.splice(from, 1);\n if (moved !== undefined) {\n next.splice(to, 0, moved);\n set(next);\n }\n };\n const add = (type?: BlockType) =>\n set([\n ...items,\n type !== undefined ? { type: type.id, ...defaults(type.fields) } : defaults(fields),\n ]);\n\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 {items.length > 0 ? (\n <ol className={styles.items}>\n {items.map((item, index) => {\n const type =\n types !== undefined\n ? types.find((candidate) => candidate.id === item.type)\n : undefined;\n const itemFields = types !== undefined ? (type?.fields ?? []) : fields;\n const number = index + 1;\n const titleId = `${id}-${index}`;\n const summary = itemTitle?.(item, index) ?? null;\n const renderField = (field: Field) => (\n <NestedField\n key={field.name}\n field={field}\n path={`${base}.${index}.${field.name}`}\n value={item[field.name]}\n onChange={(next) =>\n set(\n items.map((current, i) =>\n i === index\n ? { ...current, [field.name]: next }\n : current,\n ),\n )\n }\n {...(onBlur !== undefined ? { onBlur } : {})}\n parentValue={item}\n {...(disabled !== undefined ? { disabled } : {})}\n {...(readOnly !== undefined ? { readOnly } : {})}\n />\n );\n return (\n <li\n key={index}\n className={cx(styles.item, itemClassName)}\n aria-labelledby={titleId}\n >\n <div className={styles.header}>\n <span id={titleId} className={styles.title}>\n <span className={styles.index}>{number}</span>\n {summary ??\n type?.label ??\n (typeof item.type === 'string'\n ? item.type\n : intl.formatMessage(messages.item, {\n index: number,\n }))}\n </span>\n {editable ? (\n <span className={styles.tools}>\n <IconButton\n icon={ArrowUp}\n size=\"sm\"\n label={intl.formatMessage(messages.moveUp, {\n index: number,\n })}\n isDisabled={index === 0}\n onPress={() => move(index, index - 1)}\n />\n <IconButton\n icon={ArrowDown}\n size=\"sm\"\n label={intl.formatMessage(messages.moveDown, {\n index: number,\n })}\n isDisabled={index === items.length - 1}\n onPress={() => move(index, index + 1)}\n />\n <IconButton\n icon={Trash2}\n size=\"sm\"\n label={intl.formatMessage(messages.removeItem, {\n index: number,\n })}\n isDisabled={!canRemove}\n onPress={() =>\n set(items.filter((_, i) => i !== index))\n }\n />\n </span>\n ) : null}\n </div>\n <div className={styles.body}>\n {renderFields !== undefined\n ? renderFields(\n Object.fromEntries(\n itemFields.map((field) => [\n field.name,\n renderField(field),\n ]),\n ),\n item,\n )\n : itemFields.map(renderField)}\n </div>\n </li>\n );\n })}\n </ol>\n ) : (\n <p className={styles.empty}>{intl.formatMessage(messages.noItems)}</p>\n )}\n {editable ? (\n <div className={styles.footer}>\n {types !== undefined ? (\n <MenuTrigger>\n <Button size=\"sm\" icon={Plus} isDisabled={!canAdd}>\n {intl.formatMessage(messages.add)}\n </Button>\n <Menu\n aria-label={intl.formatMessage(messages.add)}\n onAction={(key) => add(types.find((type) => type.id === key))}\n >\n {types.map((type) => (\n <MenuItem key={type.id} id={type.id}>\n {type.label}\n </MenuItem>\n ))}\n </Menu>\n </MenuTrigger>\n ) : (\n <Button size=\"sm\" icon={Plus} isDisabled={!canAdd} onPress={() => add()}>\n {intl.formatMessage(messages.add)}\n </Button>\n )}\n </div>\n ) : null}\n </Fieldset>\n );\n}\n\n/**\n * The `repeater` type: `fields`, or `types` for typed blocks, with `min` and `max` items from its\n * rules.\n */\nexport function RepeaterFieldEntry(props: FieldEntryProps) {\n const { field, value } = props;\n const min = getRuleNumber(field, 'min');\n const max = getRuleNumber(field, 'max');\n return (\n <RepeaterField\n {...getFieldProps(props)}\n path={props.path}\n {...(field.types !== undefined\n ? { types: field.types }\n : { fields: field.fields ?? [] })}\n value={\n Array.isArray(value)\n ? value.filter(\n (item): item is RepeaterItem =>\n item !== null && typeof item === 'object' && !Array.isArray(item),\n )\n : null\n }\n onChange={props.onChange}\n {...(min !== undefined ? { min } : {})}\n {...(max !== undefined ? { max } : {})}\n />\n );\n}\n"],"mappings":"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"}
|
package/dist/repeater/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { RepeaterField, RepeaterFieldEntry, type RepeaterFieldProps, type RepeaterItem, } from './RepeaterField';
|
|
1
|
+
export { RepeaterField, RepeaterFieldEntry, type RepeaterFieldProps, type RepeaterItem, } from './RepeaterField.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Option } from '@panneau/protocol';
|
|
2
2
|
import { type OptionValue } from '@panneau/ui';
|
|
3
|
-
import type { FieldEntryProps, FieldProps } from '../shared/types';
|
|
3
|
+
import type { FieldEntryProps, FieldProps } from '../shared/types.js';
|
|
4
4
|
export type { OptionValue };
|
|
5
5
|
/** Props of both single and multiple select fields. */
|
|
6
6
|
export interface SelectFieldBaseProps extends Omit<FieldProps<never>, 'value' | 'onChange'> {
|