@panneau/fields 5.0.0-alpha.6 → 5.0.0-alpha.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/boolean/BooleanField.js +78 -17
- package/dist/boolean/BooleanField.js.map +1 -1
- package/dist/color/ColorField.js.map +1 -1
- package/dist/date/DateField.js.map +1 -1
- package/dist/datetime/DateTimeField.js +107 -20
- package/dist/datetime/DateTimeField.js.map +1 -1
- package/dist/duration/DurationField.js +126 -41
- package/dist/duration/DurationField.js.map +1 -1
- package/dist/email/EmailField.js.map +1 -1
- package/dist/embed/EmbedField.js +185 -69
- package/dist/embed/EmbedField.js.map +1 -1
- package/dist/file/FileField.d.ts.map +1 -1
- package/dist/file/FileField.js +167 -77
- package/dist/file/FileField.js.map +1 -1
- package/dist/group/GroupField.js.map +1 -1
- package/dist/json/JsonField.js +104 -22
- package/dist/json/JsonField.js.map +1 -1
- package/dist/locales/index.js.map +1 -1
- package/dist/localized/LocalizedField.js.map +1 -1
- package/dist/location/LocationField.d.ts.map +1 -1
- package/dist/location/LocationField.js +351 -138
- package/dist/location/LocationField.js.map +1 -1
- package/dist/location/LocationMap.d.ts.map +1 -1
- package/dist/location/LocationMap.js +155 -65
- package/dist/location/LocationMap.js.map +1 -1
- package/dist/location/leafletCss.js.map +1 -1
- package/dist/location/nominatim.js.map +1 -1
- package/dist/missing/MissingField.d.ts +3 -2
- 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/number/NumberField.js.map +1 -1
- package/dist/range/RangeField.js +82 -11
- package/dist/range/RangeField.js.map +1 -1
- package/dist/relation/RelationField.js +485 -145
- package/dist/relation/RelationField.js.map +1 -1
- package/dist/repeater/RepeaterField.js +118 -34
- package/dist/repeater/RepeaterField.js.map +1 -1
- package/dist/select/SelectField.js.map +1 -1
- package/dist/shared/DefinitionField.js.map +1 -1
- package/dist/shared/builtIn.js.map +1 -1
- package/dist/shared/check.js.map +1 -1
- package/dist/shared/context.js.map +1 -1
- package/dist/shared/cx.js.map +1 -1
- package/dist/shared/dates.js.map +1 -1
- package/dist/shared/embed.js.map +1 -1
- package/dist/shared/entry.js.map +1 -1
- package/dist/shared/relation.js.map +1 -1
- package/dist/slug/SlugField.d.ts.map +1 -1
- package/dist/slug/SlugField.js +184 -36
- package/dist/slug/SlugField.js.map +1 -1
- package/dist/tags/TagsField.js.map +1 -1
- package/dist/tel/TelField.js.map +1 -1
- package/dist/text/TextField.js.map +1 -1
- package/dist/textarea/TextAreaField.js.map +1 -1
- package/dist/time/TimeField.js +64 -10
- package/dist/time/TimeField.js.map +1 -1
- package/dist/upload/FilePicker.js +107 -24
- package/dist/upload/FilePicker.js.map +1 -1
- package/dist/upload/UploadList.js.map +1 -1
- package/dist/upload/files.js.map +1 -1
- package/dist/upload/useRejectionMessage.js.map +1 -1
- package/dist/upload/useUploads.js.map +1 -1
- package/dist/uppy/uploader.js.map +1 -1
- package/dist/url/UrlField.js +69 -14
- package/dist/url/UrlField.js.map +1 -1
- package/package.json +4 -4
|
@@ -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 // 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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"}
|
|
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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"}
|
|
@@ -17,37 +17,67 @@ 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(45);
|
|
22
|
+
const { fields: t1, types, path, name, value, onChange, onBlur, label, description, errors, disabled, readOnly, required, min: t2, max, 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] !== items || $[22] !== move || $[23] !== onBlur || $[24] !== readOnly || $[25] !== set || $[26] !== 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;
|
|
@@ -113,7 +143,26 @@ function RepeaterField({ fields = [], types, path, name, value, onChange, onBlur
|
|
|
113
143
|
}) : /* @__PURE__ */ jsx("p", {
|
|
114
144
|
className: RepeaterField_module_default.empty,
|
|
115
145
|
children: intl.formatMessage(messages.noItems)
|
|
116
|
-
})
|
|
146
|
+
});
|
|
147
|
+
$[13] = base;
|
|
148
|
+
$[14] = canRemove;
|
|
149
|
+
$[15] = disabled;
|
|
150
|
+
$[16] = editable;
|
|
151
|
+
$[17] = fields;
|
|
152
|
+
$[18] = id;
|
|
153
|
+
$[19] = intl;
|
|
154
|
+
$[20] = itemClassName;
|
|
155
|
+
$[21] = items;
|
|
156
|
+
$[22] = move;
|
|
157
|
+
$[23] = onBlur;
|
|
158
|
+
$[24] = readOnly;
|
|
159
|
+
$[25] = set;
|
|
160
|
+
$[26] = types;
|
|
161
|
+
$[27] = t8;
|
|
162
|
+
} else t8 = $[27];
|
|
163
|
+
let t9;
|
|
164
|
+
if ($[28] !== add || $[29] !== canAdd || $[30] !== editable || $[31] !== intl || $[32] !== types) {
|
|
165
|
+
t9 = editable ? /* @__PURE__ */ jsx("div", {
|
|
117
166
|
className: RepeaterField_module_default.footer,
|
|
118
167
|
children: types !== void 0 ? /* @__PURE__ */ jsxs(MenuTrigger, { children: [/* @__PURE__ */ jsx(Button, {
|
|
119
168
|
size: "sm",
|
|
@@ -123,10 +172,7 @@ function RepeaterField({ fields = [], types, path, name, value, onChange, onBlur
|
|
|
123
172
|
}), /* @__PURE__ */ jsx(Menu, {
|
|
124
173
|
"aria-label": intl.formatMessage(messages.add),
|
|
125
174
|
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))
|
|
175
|
+
children: types.map(_temp)
|
|
130
176
|
})] }) : /* @__PURE__ */ jsx(Button, {
|
|
131
177
|
size: "sm",
|
|
132
178
|
icon: Plus,
|
|
@@ -134,13 +180,51 @@ function RepeaterField({ fields = [], types, path, name, value, onChange, onBlur
|
|
|
134
180
|
onPress: () => add(),
|
|
135
181
|
children: intl.formatMessage(messages.add)
|
|
136
182
|
})
|
|
137
|
-
}) : null
|
|
138
|
-
|
|
183
|
+
}) : null;
|
|
184
|
+
$[28] = add;
|
|
185
|
+
$[29] = canAdd;
|
|
186
|
+
$[30] = editable;
|
|
187
|
+
$[31] = intl;
|
|
188
|
+
$[32] = types;
|
|
189
|
+
$[33] = t9;
|
|
190
|
+
} else t9 = $[33];
|
|
191
|
+
let t10;
|
|
192
|
+
if ($[34] !== className || $[35] !== description || $[36] !== descriptionClassName || $[37] !== errors || $[38] !== errorsClassName || $[39] !== label || $[40] !== labelClassName || $[41] !== required || $[42] !== t8 || $[43] !== t9) {
|
|
193
|
+
t10 = /* @__PURE__ */ jsxs(Fieldset, {
|
|
194
|
+
legend: label,
|
|
195
|
+
description,
|
|
196
|
+
errors,
|
|
197
|
+
isRequired: required,
|
|
198
|
+
className,
|
|
199
|
+
legendClassName: labelClassName,
|
|
200
|
+
descriptionClassName,
|
|
201
|
+
errorsClassName,
|
|
202
|
+
children: [t8, t9]
|
|
203
|
+
});
|
|
204
|
+
$[34] = className;
|
|
205
|
+
$[35] = description;
|
|
206
|
+
$[36] = descriptionClassName;
|
|
207
|
+
$[37] = errors;
|
|
208
|
+
$[38] = errorsClassName;
|
|
209
|
+
$[39] = label;
|
|
210
|
+
$[40] = labelClassName;
|
|
211
|
+
$[41] = required;
|
|
212
|
+
$[42] = t8;
|
|
213
|
+
$[43] = t9;
|
|
214
|
+
$[44] = t10;
|
|
215
|
+
} else t10 = $[44];
|
|
216
|
+
return t10;
|
|
139
217
|
}
|
|
140
218
|
/**
|
|
141
219
|
* The `repeater` type: `fields`, or `types` for typed blocks, with `min` and `max` items from its
|
|
142
220
|
* rules.
|
|
143
221
|
*/
|
|
222
|
+
function _temp(type_2) {
|
|
223
|
+
return /* @__PURE__ */ jsx(MenuItem, {
|
|
224
|
+
id: type_2.id,
|
|
225
|
+
children: type_2.label
|
|
226
|
+
}, type_2.id);
|
|
227
|
+
}
|
|
144
228
|
function RepeaterFieldEntry(props) {
|
|
145
229
|
const $ = c(23);
|
|
146
230
|
const { field, value } = props;
|
|
@@ -173,7 +257,7 @@ function RepeaterFieldEntry(props) {
|
|
|
173
257
|
} else t3 = $[8];
|
|
174
258
|
let t4;
|
|
175
259
|
if ($[9] !== value) {
|
|
176
|
-
t4 = Array.isArray(value) ? value.filter(
|
|
260
|
+
t4 = Array.isArray(value) ? value.filter(_temp2) : null;
|
|
177
261
|
$[9] = value;
|
|
178
262
|
$[10] = t4;
|
|
179
263
|
} else t4 = $[10];
|
|
@@ -211,7 +295,7 @@ function RepeaterFieldEntry(props) {
|
|
|
211
295
|
} else t7 = $[22];
|
|
212
296
|
return t7;
|
|
213
297
|
}
|
|
214
|
-
function
|
|
298
|
+
function _temp2(item) {
|
|
215
299
|
return item !== null && typeof item === "object" && !Array.isArray(item);
|
|
216
300
|
}
|
|
217
301
|
//#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","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","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","item","index","type_0","find","candidate","itemFields","number","titleId","header","title","formatMessage","tools","moveUp","moveDown","removeItem","filter","_","i","body","next_1","current","i_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 { 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectField.js","names":["index","option","readOnly","value","controlClassName","label","description","errors","required","disabled","className","labelClassName","descriptionClassName","errorsClassName","options","selected","change","locked","_c","styles"],"sources":["../../src/select/SelectField.tsx"],"sourcesContent":["import type { Option } from '@panneau/protocol';\nimport { Checkbox, Fieldset, type OptionValue, RadioGroup, Select } from '@panneau/ui';\n\nimport { getFieldProps, getSetting, isString } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './SelectField.module.css';\n\nexport type { OptionValue };\n\n/** Props of both single and multiple select fields. */\nexport interface SelectFieldBaseProps extends Omit<FieldProps<never>, 'value' | 'onChange'> {\n /** The choices. Same shape as the protocol's `Option`. */\n options: readonly Option[];\n placeholder?: string;\n controlClassName?: string;\n}\n\nexport interface SingleSelectFieldProps extends SelectFieldBaseProps {\n multiple?: false;\n value?: OptionValue | null;\n onChange?: (value: OptionValue | null) => void;\n /** `select` (default): a dropdown. `radios`: every choice visible. */\n widget?: 'select' | 'radios';\n}\n\nexport interface MultipleSelectFieldProps extends SelectFieldBaseProps {\n multiple: true;\n value?: readonly OptionValue[] | null;\n /** Called with the selected values, in the order of the options. An empty list is `null`. */\n onChange?: (value: OptionValue[] | null) => void;\n /** `select` (default): a dropdown. `checkboxes`: every choice visible. */\n widget?: 'select' | 'checkboxes';\n}\n\nexport type SelectFieldProps = SingleSelectFieldProps | MultipleSelectFieldProps;\n\n/**\n * A choice among options, or several with `multiple`, as a dropdown or as radios and checkboxes.\n * Values keep their type (strings, numbers, booleans).\n */\nexport function SelectField(props: SelectFieldProps) {\n const {\n options,\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n placeholder,\n name,\n id,\n autoFocus,\n onBlur,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n controlClassName,\n } = props;\n const chrome = {\n label,\n description,\n errors,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n ...(props['aria-label'] !== undefined ? { 'aria-label': props['aria-label'] } : {}),\n };\n const locked = disabled === true || readOnly === true;\n\n if (props.multiple === true) {\n const selected = props.value ?? [];\n const change = (next: readonly OptionValue[]) => {\n // Keep the order of the options, whatever the order of the clicks.\n const ordered = options\n .map((option) => option.value)\n .filter((value) => next.includes(value));\n props.onChange?.(ordered.length > 0 ? ordered : null);\n };\n if (props.widget === 'checkboxes') {\n return (\n <Fieldset\n legend={label}\n description={description}\n errors={errors}\n isRequired={required}\n isDisabled={disabled}\n className={className}\n legendClassName={labelClassName}\n descriptionClassName={descriptionClassName}\n errorsClassName={errorsClassName}\n >\n <div className={styles.checkboxes}>\n {options.map((option, index) => (\n <Checkbox\n key={index}\n isSelected={selected.includes(option.value)}\n isDisabled={option.disabled}\n isReadOnly={readOnly}\n description={option.description}\n onChange={(checked) =>\n change(\n checked\n ? [...selected, option.value]\n : selected.filter((value) => value !== option.value),\n )\n }\n checkboxClassName={controlClassName}\n >\n {option.label}\n </Checkbox>\n ))}\n </div>\n </Fieldset>\n );\n }\n return (\n <Select\n {...chrome}\n multiple\n options={options}\n value={selected}\n onChange={change}\n isRequired={required}\n isDisabled={locked}\n {...(placeholder !== undefined ? { placeholder } : {})}\n {...(name !== undefined ? { name } : {})}\n {...(id !== undefined ? { id } : {})}\n {...(autoFocus !== undefined ? { autoFocus } : {})}\n {...(onBlur !== undefined ? { onBlur } : {})}\n {...(controlClassName !== undefined ? { triggerClassName: controlClassName } : {})}\n />\n );\n }\n\n if (props.widget === 'radios') {\n return (\n <RadioGroup\n {...chrome}\n options={options}\n value={props.value ?? null}\n onChange={(value) => props.onChange?.(value)}\n isRequired={required}\n isDisabled={disabled}\n isReadOnly={readOnly}\n {...(name !== undefined ? { name } : {})}\n {...(id !== undefined ? { id } : {})}\n {...(onBlur !== undefined ? { onBlur } : {})}\n {...(controlClassName !== undefined ? { radioClassName: controlClassName } : {})}\n />\n );\n }\n return (\n <Select\n {...chrome}\n options={options}\n value={props.value ?? null}\n onChange={(value) => props.onChange?.(value)}\n isRequired={required}\n isDisabled={locked}\n {...(placeholder !== undefined ? { placeholder } : {})}\n {...(name !== undefined ? { name } : {})}\n {...(id !== undefined ? { id } : {})}\n {...(autoFocus !== undefined ? { autoFocus } : {})}\n {...(onBlur !== undefined ? { onBlur } : {})}\n {...(controlClassName !== undefined ? { triggerClassName: controlClassName } : {})}\n />\n );\n}\n\nfunction isOptionValue(value: unknown): value is OptionValue {\n return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n}\n\n/**\n * The `select` type: `options`, `multiple`, and setting `widget` (`radios` for a single choice,\n * `checkboxes` for several).\n */\nexport function SelectFieldEntry(props: FieldEntryProps) {\n const { field } = props;\n const widget = getSetting(field, 'widget', isString);\n const options = field.options ?? [];\n if (field.multiple === true) {\n const value = Array.isArray(props.value) ? props.value.filter(isOptionValue) : null;\n return (\n <SelectField\n {...getFieldProps(props)}\n multiple\n options={options}\n value={value}\n onChange={props.onChange}\n {...(widget === 'checkboxes' ? { widget } : {})}\n />\n );\n }\n return (\n <SelectField\n {...getFieldProps(props)}\n options={options}\n value={isOptionValue(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(widget === 'radios' ? { widget } : {})}\n />\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SelectField.js","names":["Option","Checkbox","Fieldset","OptionValue","RadioGroup","Select","getFieldProps","getSetting","isString","FieldEntryProps","FieldProps","styles","SelectFieldBaseProps","Omit","options","placeholder","controlClassName","SingleSelectFieldProps","multiple","value","onChange","widget","MultipleSelectFieldProps","SelectFieldProps","SelectField","props","$","_c","label","description","errors","disabled","readOnly","required","name","id","autoFocus","onBlur","className","labelClassName","descriptionClassName","errorsClassName","t0","undefined","t1","chrome","locked","t2","selected","t3","next","ordered","map","_temp","filter","includes","length","change","t4","t5","option_0","index","option","checked","value_0","checkboxes","t6","t7","t8","t9","triggerClassName","t10","value_1","radioClassName","value_2","isOptionValue","SelectFieldEntry","field","Array","isArray","_c","styles"],"sources":["../../src/select/SelectField.tsx"],"sourcesContent":["import type { Option } from '@panneau/protocol';\nimport { Checkbox, Fieldset, type OptionValue, RadioGroup, Select } from '@panneau/ui';\n\nimport { getFieldProps, getSetting, isString } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './SelectField.module.css';\n\nexport type { OptionValue };\n\n/** Props of both single and multiple select fields. */\nexport interface SelectFieldBaseProps extends Omit<FieldProps<never>, 'value' | 'onChange'> {\n /** The choices. Same shape as the protocol's `Option`. */\n options: readonly Option[];\n placeholder?: string;\n controlClassName?: string;\n}\n\nexport interface SingleSelectFieldProps extends SelectFieldBaseProps {\n multiple?: false;\n value?: OptionValue | null;\n onChange?: (value: OptionValue | null) => void;\n /** `select` (default): a dropdown. `radios`: every choice visible. */\n widget?: 'select' | 'radios';\n}\n\nexport interface MultipleSelectFieldProps extends SelectFieldBaseProps {\n multiple: true;\n value?: readonly OptionValue[] | null;\n /** Called with the selected values, in the order of the options. An empty list is `null`. */\n onChange?: (value: OptionValue[] | null) => void;\n /** `select` (default): a dropdown. `checkboxes`: every choice visible. */\n widget?: 'select' | 'checkboxes';\n}\n\nexport type SelectFieldProps = SingleSelectFieldProps | MultipleSelectFieldProps;\n\n/**\n * A choice among options, or several with `multiple`, as a dropdown or as radios and checkboxes.\n * Values keep their type (strings, numbers, booleans).\n */\nexport function SelectField(props: SelectFieldProps) {\n const {\n options,\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n placeholder,\n name,\n id,\n autoFocus,\n onBlur,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n controlClassName,\n } = props;\n const chrome = {\n label,\n description,\n errors,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n ...(props['aria-label'] !== undefined ? { 'aria-label': props['aria-label'] } : {}),\n };\n const locked = disabled === true || readOnly === true;\n\n if (props.multiple === true) {\n const selected = props.value ?? [];\n const change = (next: readonly OptionValue[]) => {\n // Keep the order of the options, whatever the order of the clicks.\n const ordered = options\n .map((option) => option.value)\n .filter((value) => next.includes(value));\n props.onChange?.(ordered.length > 0 ? ordered : null);\n };\n if (props.widget === 'checkboxes') {\n return (\n <Fieldset\n legend={label}\n description={description}\n errors={errors}\n isRequired={required}\n isDisabled={disabled}\n className={className}\n legendClassName={labelClassName}\n descriptionClassName={descriptionClassName}\n errorsClassName={errorsClassName}\n >\n <div className={styles.checkboxes}>\n {options.map((option, index) => (\n <Checkbox\n key={index}\n isSelected={selected.includes(option.value)}\n isDisabled={option.disabled}\n isReadOnly={readOnly}\n description={option.description}\n onChange={(checked) =>\n change(\n checked\n ? [...selected, option.value]\n : selected.filter((value) => value !== option.value),\n )\n }\n checkboxClassName={controlClassName}\n >\n {option.label}\n </Checkbox>\n ))}\n </div>\n </Fieldset>\n );\n }\n return (\n <Select\n {...chrome}\n multiple\n options={options}\n value={selected}\n onChange={change}\n isRequired={required}\n isDisabled={locked}\n {...(placeholder !== undefined ? { placeholder } : {})}\n {...(name !== undefined ? { name } : {})}\n {...(id !== undefined ? { id } : {})}\n {...(autoFocus !== undefined ? { autoFocus } : {})}\n {...(onBlur !== undefined ? { onBlur } : {})}\n {...(controlClassName !== undefined ? { triggerClassName: controlClassName } : {})}\n />\n );\n }\n\n if (props.widget === 'radios') {\n return (\n <RadioGroup\n {...chrome}\n options={options}\n value={props.value ?? null}\n onChange={(value) => props.onChange?.(value)}\n isRequired={required}\n isDisabled={disabled}\n isReadOnly={readOnly}\n {...(name !== undefined ? { name } : {})}\n {...(id !== undefined ? { id } : {})}\n {...(onBlur !== undefined ? { onBlur } : {})}\n {...(controlClassName !== undefined ? { radioClassName: controlClassName } : {})}\n />\n );\n }\n return (\n <Select\n {...chrome}\n options={options}\n value={props.value ?? null}\n onChange={(value) => props.onChange?.(value)}\n isRequired={required}\n isDisabled={locked}\n {...(placeholder !== undefined ? { placeholder } : {})}\n {...(name !== undefined ? { name } : {})}\n {...(id !== undefined ? { id } : {})}\n {...(autoFocus !== undefined ? { autoFocus } : {})}\n {...(onBlur !== undefined ? { onBlur } : {})}\n {...(controlClassName !== undefined ? { triggerClassName: controlClassName } : {})}\n />\n );\n}\n\nfunction isOptionValue(value: unknown): value is OptionValue {\n return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n}\n\n/**\n * The `select` type: `options`, `multiple`, and setting `widget` (`radios` for a single choice,\n * `checkboxes` for several).\n */\nexport function SelectFieldEntry(props: FieldEntryProps) {\n const { field } = props;\n const widget = getSetting(field, 'widget', isString);\n const options = field.options ?? [];\n if (field.multiple === true) {\n const value = Array.isArray(props.value) ? props.value.filter(isOptionValue) : null;\n return (\n <SelectField\n {...getFieldProps(props)}\n multiple\n options={options}\n value={value}\n onChange={props.onChange}\n {...(widget === 'checkboxes' ? { widget } : {})}\n />\n );\n }\n return (\n <SelectField\n {...getFieldProps(props)}\n options={options}\n value={isOptionValue(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(widget === 'radios' ? { widget } : {})}\n />\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefinitionField.js","names":["field","path","value","_c"],"sources":["../../src/shared/DefinitionField.tsx"],"sourcesContent":["import type { Field } from '@panneau/protocol';\nimport { evaluateCondition } from '@panneau/protocol/runtime';\n\n// Groups, repeaters and localized values render nested fields, which render through\n// `DefinitionField`: the modules import each other, which is fine since they only use each other\n// while rendering.\nimport { LocalizedFieldEntry } from '../localized/LocalizedField';\nimport { MissingFieldEntry } from '../missing/MissingField';\nimport { builtInFields } from './builtIn';\nimport { getParentPath, useFieldsContext } from './context';\nimport type { FieldEntryProps } from './types';\n\nexport interface NestedFieldProps {\n field: Field;\n /** Dot path of the field's value. */\n path: string;\n /** The value, without a binding. */\n value?: unknown;\n /** Sets the value, without a binding. */\n onChange?: (value: unknown) => void;\n onBlur?: () => void;\n errors?: readonly string[];\n /** The object the field belongs to, for conditions and generated values. */\n parentValue?: unknown;\n /** The locale of the value, in a localized field. */\n locale?: string;\n disabled?: boolean;\n readOnly?: boolean;\n className?: string;\n}\n\n/**\n * A field inside another one (a group, a block, a localized value), or at the top of a form.\n * With a binding in context, the binding gives its value and decides whether it shows. Without\n * one, it uses `value` and `onChange`, and hides itself when its `visibleWhen` condition on the\n * parent value is false.\n */\nexport function NestedField({\n field,\n path,\n value,\n onChange,\n onBlur,\n errors,\n parentValue,\n locale,\n disabled,\n readOnly,\n className,\n}: NestedFieldProps) {\n const { binding: Binding } = useFieldsContext();\n const shared = {\n field,\n path,\n parentValue,\n ...(locale !== undefined ? { locale } : {}),\n ...(disabled !== undefined ? { disabled } : {}),\n ...(readOnly !== undefined ? { readOnly } : {}),\n ...(className !== undefined ? { className } : {}),\n };\n if (Binding !== null) {\n return (\n <Binding\n field={field}\n path={path}\n parentPath={getParentPath(path)}\n render={(bound) => <DefinitionField {...shared} {...bound} />}\n />\n );\n }\n if (field.visibleWhen !== undefined && !evaluateCondition(field.visibleWhen, parentValue)) {\n return null;\n }\n return (\n <DefinitionField\n {...shared}\n value={value}\n onChange={onChange ?? (() => undefined)}\n {...(onBlur !== undefined ? { onBlur } : {})}\n {...(errors !== undefined ? { errors } : {})}\n />\n );\n}\n\n/**\n * Renders a field of the definition with the entry of its type: from the fields context, or a\n * built-in one. A localized field renders an input per locale. A type without an entry renders a\n * placeholder that names the missing plugin.\n */\nexport function DefinitionField(props: FieldEntryProps) {\n const { components } = useFieldsContext();\n const { field } = props;\n if (field.localized === true) {\n return <LocalizedFieldEntry {...props} />;\n }\n const Entry = components[field.type] ?? builtInFields[field.type] ?? MissingFieldEntry;\n return <Entry {...props} />;\n}\n"],"mappings":";;;;;;;;;;;;;;AAqCA,
|
|
1
|
+
{"version":3,"file":"DefinitionField.js","names":["Field","evaluateCondition","LocalizedFieldEntry","MissingFieldEntry","builtInFields","getParentPath","useFieldsContext","FieldEntryProps","NestedFieldProps","field","path","value","onChange","onBlur","errors","parentValue","locale","disabled","readOnly","className","NestedField","t0","$","_c","binding","Binding","t1","undefined","t2","t3","t4","t5","shared","t6","t7","bound","t8","visibleWhen","_temp","t9","DefinitionField","props","components","localized","Entry","type","_c"],"sources":["../../src/shared/DefinitionField.tsx"],"sourcesContent":["import type { Field } from '@panneau/protocol';\nimport { evaluateCondition } from '@panneau/protocol/runtime';\n\n// Groups, repeaters and localized values render nested fields, which render through\n// `DefinitionField`: the modules import each other, which is fine since they only use each other\n// while rendering.\nimport { LocalizedFieldEntry } from '../localized/LocalizedField';\nimport { MissingFieldEntry } from '../missing/MissingField';\nimport { builtInFields } from './builtIn';\nimport { getParentPath, useFieldsContext } from './context';\nimport type { FieldEntryProps } from './types';\n\nexport interface NestedFieldProps {\n field: Field;\n /** Dot path of the field's value. */\n path: string;\n /** The value, without a binding. */\n value?: unknown;\n /** Sets the value, without a binding. */\n onChange?: (value: unknown) => void;\n onBlur?: () => void;\n errors?: readonly string[];\n /** The object the field belongs to, for conditions and generated values. */\n parentValue?: unknown;\n /** The locale of the value, in a localized field. */\n locale?: string;\n disabled?: boolean;\n readOnly?: boolean;\n className?: string;\n}\n\n/**\n * A field inside another one (a group, a block, a localized value), or at the top of a form.\n * With a binding in context, the binding gives its value and decides whether it shows. Without\n * one, it uses `value` and `onChange`, and hides itself when its `visibleWhen` condition on the\n * parent value is false.\n */\nexport function NestedField({\n field,\n path,\n value,\n onChange,\n onBlur,\n errors,\n parentValue,\n locale,\n disabled,\n readOnly,\n className,\n}: NestedFieldProps) {\n const { binding: Binding } = useFieldsContext();\n const shared = {\n field,\n path,\n parentValue,\n ...(locale !== undefined ? { locale } : {}),\n ...(disabled !== undefined ? { disabled } : {}),\n ...(readOnly !== undefined ? { readOnly } : {}),\n ...(className !== undefined ? { className } : {}),\n };\n if (Binding !== null) {\n return (\n <Binding\n field={field}\n path={path}\n parentPath={getParentPath(path)}\n render={(bound) => <DefinitionField {...shared} {...bound} />}\n />\n );\n }\n if (field.visibleWhen !== undefined && !evaluateCondition(field.visibleWhen, parentValue)) {\n return null;\n }\n return (\n <DefinitionField\n {...shared}\n value={value}\n onChange={onChange ?? (() => undefined)}\n {...(onBlur !== undefined ? { onBlur } : {})}\n {...(errors !== undefined ? { errors } : {})}\n />\n );\n}\n\n/**\n * Renders a field of the definition with the entry of its type: from the fields context, or a\n * built-in one. A localized field renders an input per locale. A type without an entry renders a\n * placeholder that names the missing plugin.\n */\nexport function DefinitionField(props: FieldEntryProps) {\n const { components } = useFieldsContext();\n const { field } = props;\n if (field.localized === true) {\n return <LocalizedFieldEntry {...props} />;\n }\n const Entry = components[field.type] ?? builtInFields[field.type] ?? MissingFieldEntry;\n return <Entry {...props} />;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builtIn.js","names":[],"sources":["../../src/shared/builtIn.ts"],"sourcesContent":["import { fr } from '@panneau/intl';\n\nimport { BooleanFieldEntry } from '../boolean/BooleanField';\nimport { ColorFieldEntry } from '../color/ColorField';\nimport { DateFieldEntry } from '../date/DateField';\nimport { DateTimeFieldEntry } from '../datetime/DateTimeField';\nimport { DurationFieldEntry } from '../duration/DurationField';\nimport { EmailFieldEntry } from '../email/EmailField';\nimport { EmbedFieldEntry } from '../embed/EmbedField';\nimport { FileFieldEntry } from '../file/FileField';\nimport { GroupFieldEntry } from '../group/GroupField';\nimport { JsonFieldEntry } from '../json/JsonField';\nimport { LocationFieldEntry } from '../location/LocationField';\nimport { NumberFieldEntry } from '../number/NumberField';\nimport { RangeFieldEntry } from '../range/RangeField';\nimport { RelationFieldEntry } from '../relation/RelationField';\nimport { RepeaterFieldEntry } from '../repeater/RepeaterField';\nimport { SelectFieldEntry } from '../select/SelectField';\nimport { SlugFieldEntry } from '../slug/SlugField';\nimport { TagsFieldEntry } from '../tags/TagsField';\nimport { TelFieldEntry } from '../tel/TelField';\nimport { TextFieldEntry } from '../text/TextField';\nimport { TextAreaFieldEntry } from '../textarea/TextAreaField';\nimport { TimeFieldEntry } from '../time/TimeField';\nimport { UrlFieldEntry } from '../url/UrlField';\nimport type { FieldEntry } from './types';\n\n/**\n * The entries of the built-in field types. `richtext` and `media` come with their plugins\n * (`@panneau/editor` and `@panneau/media`): without them, `DefinitionField` renders a placeholder.\n * `file` uploads through the upload source of the fields context, or gives the files themselves.\n * `embed` and `location` use its embed source and its maps; `location` loads Leaflet when shown.\n */\nexport const builtInFields: Readonly<Record<string, FieldEntry>> = {\n text: TextFieldEntry,\n textarea: TextAreaFieldEntry,\n number: NumberFieldEntry,\n boolean: BooleanFieldEntry,\n date: DateFieldEntry,\n datetime: DateTimeFieldEntry,\n time: TimeFieldEntry,\n select: SelectFieldEntry,\n email: EmailFieldEntry,\n url: UrlFieldEntry,\n color: ColorFieldEntry,\n slug: SlugFieldEntry,\n file: FileFieldEntry,\n relation: RelationFieldEntry,\n group: GroupFieldEntry,\n repeater: RepeaterFieldEntry,\n tel: TelFieldEntry,\n range: RangeFieldEntry,\n duration: DurationFieldEntry,\n json: JsonFieldEntry,\n tags: TagsFieldEntry,\n embed: EmbedFieldEntry,\n location: LocationFieldEntry,\n};\n\n/**\n * The built-in fields as a `@panneau/core` plugin: their entries, and the French messages of\n * every Panneau package (`@panneau/ui`, `@panneau/fields`, `@panneau/forms`…, from\n * `@panneau/intl`). Pass it before the plugins that override a type.\n */\nexport const fieldsPlugin: {\n id: string;\n fields: Readonly<Record<string, FieldEntry>>;\n locales: Readonly<Record<string, Record<string, string>>>;\n} = {\n id: 'panneau-fields',\n fields: builtInFields,\n locales: { fr },\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,
|
|
1
|
+
{"version":3,"file":"builtIn.js","names":["fr","BooleanFieldEntry","ColorFieldEntry","DateFieldEntry","DateTimeFieldEntry","DurationFieldEntry","EmailFieldEntry","EmbedFieldEntry","FileFieldEntry","GroupFieldEntry","JsonFieldEntry","LocationFieldEntry","NumberFieldEntry","RangeFieldEntry","RelationFieldEntry","RepeaterFieldEntry","SelectFieldEntry","SlugFieldEntry","TagsFieldEntry","TelFieldEntry","TextFieldEntry","TextAreaFieldEntry","TimeFieldEntry","UrlFieldEntry","FieldEntry","builtInFields","Readonly","Record","text","textarea","number","boolean","date","datetime","time","select","email","url","color","slug","file","relation","group","repeater","tel","range","duration","json","tags","embed","location","fieldsPlugin","id","fields","locales"],"sources":["../../src/shared/builtIn.ts"],"sourcesContent":["import { fr } from '@panneau/intl';\n\nimport { BooleanFieldEntry } from '../boolean/BooleanField';\nimport { ColorFieldEntry } from '../color/ColorField';\nimport { DateFieldEntry } from '../date/DateField';\nimport { DateTimeFieldEntry } from '../datetime/DateTimeField';\nimport { DurationFieldEntry } from '../duration/DurationField';\nimport { EmailFieldEntry } from '../email/EmailField';\nimport { EmbedFieldEntry } from '../embed/EmbedField';\nimport { FileFieldEntry } from '../file/FileField';\nimport { GroupFieldEntry } from '../group/GroupField';\nimport { JsonFieldEntry } from '../json/JsonField';\nimport { LocationFieldEntry } from '../location/LocationField';\nimport { NumberFieldEntry } from '../number/NumberField';\nimport { RangeFieldEntry } from '../range/RangeField';\nimport { RelationFieldEntry } from '../relation/RelationField';\nimport { RepeaterFieldEntry } from '../repeater/RepeaterField';\nimport { SelectFieldEntry } from '../select/SelectField';\nimport { SlugFieldEntry } from '../slug/SlugField';\nimport { TagsFieldEntry } from '../tags/TagsField';\nimport { TelFieldEntry } from '../tel/TelField';\nimport { TextFieldEntry } from '../text/TextField';\nimport { TextAreaFieldEntry } from '../textarea/TextAreaField';\nimport { TimeFieldEntry } from '../time/TimeField';\nimport { UrlFieldEntry } from '../url/UrlField';\nimport type { FieldEntry } from './types';\n\n/**\n * The entries of the built-in field types. `richtext` and `media` come with their plugins\n * (`@panneau/editor` and `@panneau/media`): without them, `DefinitionField` renders a placeholder.\n * `file` uploads through the upload source of the fields context, or gives the files themselves.\n * `embed` and `location` use its embed source and its maps; `location` loads Leaflet when shown.\n */\nexport const builtInFields: Readonly<Record<string, FieldEntry>> = {\n text: TextFieldEntry,\n textarea: TextAreaFieldEntry,\n number: NumberFieldEntry,\n boolean: BooleanFieldEntry,\n date: DateFieldEntry,\n datetime: DateTimeFieldEntry,\n time: TimeFieldEntry,\n select: SelectFieldEntry,\n email: EmailFieldEntry,\n url: UrlFieldEntry,\n color: ColorFieldEntry,\n slug: SlugFieldEntry,\n file: FileFieldEntry,\n relation: RelationFieldEntry,\n group: GroupFieldEntry,\n repeater: RepeaterFieldEntry,\n tel: TelFieldEntry,\n range: RangeFieldEntry,\n duration: DurationFieldEntry,\n json: JsonFieldEntry,\n tags: TagsFieldEntry,\n embed: EmbedFieldEntry,\n location: LocationFieldEntry,\n};\n\n/**\n * The built-in fields as a `@panneau/core` plugin: their entries, and the French messages of\n * every Panneau package (`@panneau/ui`, `@panneau/fields`, `@panneau/forms`…, from\n * `@panneau/intl`). Pass it before the plugins that override a type.\n */\nexport const fieldsPlugin: {\n id: string;\n fields: Readonly<Record<string, FieldEntry>>;\n locales: Readonly<Record<string, Record<string, string>>>;\n} = {\n id: 'panneau-fields',\n fields: builtInFields,\n locales: { fr },\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,IAAayB,gBAAsD;CAC/DG,MAAMR;CACNS,UAAUR;CACVS,QAAQlB;CACRmB,SAAS9B;CACT+B,MAAM7B;CACN8B,UAAU7B;CACV8B,MAAMZ;CACNa,QAAQnB;CACRoB,OAAO9B;CACP+B,KAAKd;CACLe,OAAOpC;CACPqC,MAAMtB;CACNuB,MAAMhC;CACNiC,UAAU3B;CACV4B,OAAOjC;CACPkC,UAAU5B;CACV6B,KAAKzB;CACL0B,OAAOhC;CACPiC,UAAUzC;CACV0C,MAAMrC;CACNsC,MAAM9B;CACN+B,OAAO1C;CACP2C,UAAUvC;AACd;;;;;;AAOA,IAAawC,eAIT;CACAC,IAAI;CACJC,QAAQ5B;CACR6B,SAAS,EAAEtD,GAAG;AAClB"}
|
package/dist/shared/check.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","names":[],"sources":["../../src/shared/check.ts"],"sourcesContent":["import type { FieldCheckRequest, FieldCheckResponse } from '@panneau/protocol';\n\n/**\n * Where fields with `check` check their value as it is typed: whether a slug is available, and\n * its URL. The value's locale and the form's values come with each check.\n */\nexport interface FieldCheckSource {\n check(\n field: string,\n request: { value: string; locale?: string; values?: Record<string, unknown> },\n options: { signal: AbortSignal },\n ): Promise<FieldCheckResponse>;\n}\n\n/** What `createFieldCheckSource()` needs from an adapter: the `checkField()` of `@panneau/data`. */\nexport interface FieldCheckAdapter {\n checkField?(\n resource: string,\n field: string,\n request: FieldCheckRequest,\n options?: { signal?: AbortSignal },\n ): Promise<FieldCheckResponse>;\n}\n\n/**\n * The check source of a form of a resource, through an adapter (`POST\n * /resources/{resource}/fields/{field}/check`): `id` is the item being edited, or null when\n * creating one. Null when the adapter can't check.\n */\nexport function createFieldCheckSource(\n adapter: FieldCheckAdapter,\n resource: string,\n id: string | null = null,\n): FieldCheckSource | null {\n const { checkField } = adapter;\n if (checkField === undefined) {\n return null;\n }\n return {\n check: (field, request, { signal }) =>\n checkField.call(adapter, resource, field, { ...request, id }, { signal }),\n };\n}\n"],"mappings":";;;;;;AA6BA,
|
|
1
|
+
{"version":3,"file":"check.js","names":["FieldCheckRequest","FieldCheckResponse","FieldCheckSource","check","field","request","value","locale","values","Record","options","signal","AbortSignal","Promise","FieldCheckAdapter","checkField","resource","createFieldCheckSource","adapter","id","undefined","call"],"sources":["../../src/shared/check.ts"],"sourcesContent":["import type { FieldCheckRequest, FieldCheckResponse } from '@panneau/protocol';\n\n/**\n * Where fields with `check` check their value as it is typed: whether a slug is available, and\n * its URL. The value's locale and the form's values come with each check.\n */\nexport interface FieldCheckSource {\n check(\n field: string,\n request: { value: string; locale?: string; values?: Record<string, unknown> },\n options: { signal: AbortSignal },\n ): Promise<FieldCheckResponse>;\n}\n\n/** What `createFieldCheckSource()` needs from an adapter: the `checkField()` of `@panneau/data`. */\nexport interface FieldCheckAdapter {\n checkField?(\n resource: string,\n field: string,\n request: FieldCheckRequest,\n options?: { signal?: AbortSignal },\n ): Promise<FieldCheckResponse>;\n}\n\n/**\n * The check source of a form of a resource, through an adapter (`POST\n * /resources/{resource}/fields/{field}/check`): `id` is the item being edited, or null when\n * creating one. Null when the adapter can't check.\n */\nexport function createFieldCheckSource(\n adapter: FieldCheckAdapter,\n resource: string,\n id: string | null = null,\n): FieldCheckSource | null {\n const { checkField } = adapter;\n if (checkField === undefined) {\n return null;\n }\n return {\n check: (field, request, { signal }) =>\n checkField.call(adapter, resource, field, { ...request, id }, { signal }),\n };\n}\n"],"mappings":";;;;;;AA6BA,SAAgBiB,uBACZC,SACAF,UACAG,KAAoB,MACG;CACvB,MAAM,EAAEJ,eAAeG;CACvB,IAAIH,eAAeK,KAAAA,GACf,OAAO;CAEX,OAAO,EACHjB,QAAQC,OAAOC,SAAS,EAAEM,aACtBI,WAAWM,KAAKH,SAASF,UAAUZ,OAAO;EAAE,GAAGC;EAASc;CAAG,GAAG,EAAER,OAAO,CAAC,EAChF;AACJ"}
|