@panneau/fields 5.0.0-alpha.20 → 5.0.0-alpha.22

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.
@@ -1 +1 @@
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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"}
1
+ {"version":3,"file":"RelationField.js","names":["File","ImageOff","X","useEffect","useRef","useState","Link","Button","ComboBox","Fieldset","Icon","IconButton","getNamedIcon","usePanneauIntl","useFieldsContext","cx","getFieldProps","messages","RelationReference","RelationResourceInfo","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","compact","SingleRelationFieldProps","multiple","value","onChange","MultipleRelationFieldProps","RelationFieldProps","References","references","onRemove","removeLabel","readOnly","selected","reference","id","referenceLabel","label","map","Thumbnail","info","className","thumbnail","imageUrl","image","icon","CardsProps","getHref","changeLabel","changeText","RelationCards","ariaLabel","href","card","cardText","cardLabel","link","description","cardDescription","cardActions","cards","RelationField","props","intl","context","relationSource","errors","disabled","required","onBlur","name","labelClassName","descriptionClassName","errorsClassName","formatMessage","describe","setQuery","creating","setCreating","createError","setCreateError","changing","setChanging","container","focusNext","target","querySelectorAll","Math","min","length","element","querySelector","focus","editable","found","searching","sourceCreate","create","canCreate","call","T0","t10","t11","t12","t13","t14","t9","bb0","text_0","trim","offersCreate","some","item","toLocaleLowerCase","locale","t15","allErrors","createFrom","add","createRelationFailed","finally","t16","reference_0","remove","t17","reference_1","changeRelation","t18","reference_2","getItemHref","t19","change","t20","cards_0","t21","legend","isRequired","legendClassName","chrome","comboLabel","options","exclude","filter","item_0","entry","item_1","prefix","optionThumbnail","createRelation","pick","itemId","add_0","reference_3","find","item_2","t22","t23","noResults","t24","t25","t26","t27","t28","inputValue","onInputChange","emptyMessage","pickerProps","t29","relationUnavailable","t30","none","noRelation","t31","next","set","reference_4","entry_0","reference_5","entry_1","indexOf","itemId_0","reference_6","t32","onChange_0","shown","item_3","_temp","text_1","t33","t34","t35","t36","itemId_1","reference_7","reference_8","item_5","cancel","single","event","picker","itemId_2","reference_9","cancelChange","item_4","RelationFieldEntry","field","shared","_c","styles","_Fragment"],"sources":["../../src/relation/RelationField.tsx"],"sourcesContent":["import { File, ImageOff, X } from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\nimport { Link } from 'react-aria-components';\n\nimport {\n Button,\n ComboBox,\n Fieldset,\n Icon,\n IconButton,\n getNamedIcon,\n usePanneauIntl,\n} 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 RelationResourceInfo,\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 * Shows the items as chips, and the single item as the text of its picker, rather than as cards\n * (decision 0067): for small places, such as the filters of a list.\n */\n compact?: boolean;\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\n/** The items of a compact field, as chips. */\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/** The square before the label of a card or an option: the item's image, or the resource's icon. */\nfunction Thumbnail({\n reference,\n info,\n className,\n}: {\n reference: RelationReference;\n info: RelationResourceInfo | null;\n className?: string;\n}) {\n return (\n <span className={cx(styles.thumbnail, className)} aria-hidden=\"true\">\n {reference.imageUrl !== undefined ? (\n <img src={reference.imageUrl} alt=\"\" loading=\"lazy\" />\n ) : (\n <Icon\n icon={\n info?.image === true\n ? ImageOff\n : info?.icon !== undefined\n ? getNamedIcon(info.icon)\n : File\n }\n />\n )}\n </span>\n );\n}\n\ninterface CardsProps {\n references: readonly RelationReference[];\n info: RelationResourceInfo | null;\n getHref: (reference: RelationReference) => string | null;\n /** Picks another item in place of this one: the single field's \"Change\". */\n onChange?: ((reference: RelationReference) => void) | undefined;\n onRemove?: ((reference: RelationReference) => void) | undefined;\n removeLabel: (reference: RelationReference) => string;\n changeLabel: (reference: RelationReference) => string;\n /** The visible text of the button that changes the item. */\n changeText: string;\n /** Names the list, for screen readers. */\n 'aria-label'?: string | undefined;\n}\n\n/**\n * The chosen items, as cards (decision 0067): the image of each one, or its resource's icon, its\n * label, linked to the item when the source says where it opens, its description, and the buttons\n * that change or remove it.\n */\nfunction RelationCards({\n references,\n info,\n getHref,\n onChange,\n onRemove,\n removeLabel,\n changeLabel,\n changeText,\n 'aria-label': ariaLabel,\n}: CardsProps) {\n return (\n <ul className={styles.cards} aria-label={ariaLabel}>\n {references.map((reference) => {\n const href = getHref(reference);\n return (\n <li key={reference.id} className={styles.card} data-relation-card=\"\">\n <Thumbnail reference={reference} info={info} />\n <span className={styles.cardText}>\n {href !== null ? (\n // Through React Aria: an app's `RouterProvider` opens it with its router\n <Link href={href} className={cx(styles.cardLabel, styles.link)}>\n {reference.label}\n </Link>\n ) : (\n <span className={styles.cardLabel}>{reference.label}</span>\n )}\n {reference.description !== undefined ? (\n <span className={styles.cardDescription}>\n {reference.description}\n </span>\n ) : null}\n </span>\n {onChange !== undefined || onRemove !== undefined ? (\n <span className={styles.cardActions}>\n {onChange !== undefined ? (\n <Button\n size=\"sm\"\n appearance=\"ghost\"\n aria-label={changeLabel(reference)}\n onPress={() => onChange(reference)}\n >\n {changeText}\n </Button>\n ) : null}\n {onRemove !== undefined ? (\n <IconButton\n icon={X}\n size=\"sm\"\n label={removeLabel(reference)}\n onPress={() => onRemove(reference)}\n />\n ) : null}\n </span>\n ) : null}\n </li>\n );\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()`. The chosen items show as cards (decision 0067), with\n * their image and their description when the source gives them, a link to each one\n * (`getItemHref()`), and buttons to change or remove them. When the source can `create()` (or with\n * `onCreate`), the picker offers to create an item from the typed text. Without a source, the field\n * shows its items 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 compact = false,\n } = props;\n const placeholder = props.placeholder ?? intl.formatMessage(messages.search);\n const selected = useRelationReferences(source, resource, toReferences(props.value));\n const info = source?.describe?.(resource) ?? null;\n const [query, setQuery] = useState<string | null>(null);\n const [creating, setCreating] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n // The single field picks another item in place of its card\n const [changing, setChanging] = useState(false);\n const container = useRef<HTMLDivElement>(null);\n // Where the focus goes once the field changed: the picker, or the card that replaced it\n // (the first button of a card, by its index)\n const focusNext = useRef<'picker' | number | null>(null);\n useEffect(() => {\n const target = focusNext.current;\n if (target === null) {\n return;\n }\n focusNext.current = null;\n const cards = container.current?.querySelectorAll('[data-relation-card]') ?? [];\n const card = target !== 'picker' ? cards[Math.min(target, cards.length - 1)] : undefined;\n const element =\n card !== undefined\n ? card.querySelector<HTMLElement>('button')\n : container.current?.querySelector<HTMLElement>('input');\n element?.focus();\n });\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 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 changeLabel = (reference: RelationReference) =>\n intl.formatMessage(messages.changeRelation, { item: reference.label });\n const getHref = (reference: RelationReference) =>\n source?.getItemHref?.(resource, reference.id) ?? null;\n const cards = {\n info,\n getHref,\n removeLabel,\n changeLabel,\n changeText: intl.formatMessage(messages.change),\n };\n const chrome = {\n legend: label,\n errors: allErrors,\n isRequired: required,\n className,\n legendClassName: labelClassName,\n descriptionClassName,\n errorsClassName,\n };\n const comboLabel = typeof label === 'string' ? label : props['aria-label'];\n // The options of the picker, with the image and the description of each item\n const options = (exclude: readonly RelationReference[]) => [\n ...found\n .filter((item) => !exclude.some((entry) => entry.id === item.id))\n .map((item) => ({\n id: item.id,\n label: item.label,\n ...(item.description !== undefined ? { description: item.description } : {}),\n ...(info?.image === true || item.imageUrl !== undefined\n ? {\n prefix: (\n <Thumbnail\n reference={item}\n info={info}\n className={styles.optionThumbnail}\n />\n ),\n }\n : {}),\n })),\n ...(offersCreate\n ? [{ id: CREATE_ID, label: intl.formatMessage(messages.createRelation, { text }) }]\n : []),\n ];\n const pick = (itemId: string | null, add: (reference: RelationReference) => void) => {\n if (itemId === CREATE_ID) {\n createFrom(add);\n return;\n }\n const reference = found.find((item) => item.id === itemId);\n if (reference !== undefined) {\n add(reference);\n setQuery(null);\n }\n };\n const pickerProps = {\n 'aria-label': comboLabel,\n inputValue: query ?? '',\n onInputChange: setQuery,\n isLoading,\n isRequired: required,\n 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\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 && compact ? (\n <References references={selected} removeLabel={removeLabel} />\n ) : selected.length > 0 ? (\n <RelationCards {...cards} references={selected} />\n ) : (\n <span className={styles.none}>{intl.formatMessage(messages.noRelation)}</span>\n )}\n </Fieldset>\n );\n }\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 ref={container} className={styles.multiple}>\n {selected.length > 0 && compact ? (\n <References\n references={selected}\n removeLabel={removeLabel}\n onRemove={(reference) =>\n set(selected.filter((entry) => entry.id !== reference.id))\n }\n />\n ) : selected.length > 0 ? (\n <RelationCards\n {...cards}\n references={selected}\n onRemove={(reference) => {\n set(selected.filter((entry) => entry.id !== reference.id));\n // The next card, or the last one, so that several go in a row\n focusNext.current = selected.indexOf(reference);\n }}\n />\n ) : null}\n <ComboBox\n {...pickerProps}\n items={options(selected)}\n value={null}\n onChange={(itemId) =>\n pick(itemId, (reference) => set([...selected, reference]))\n }\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 items = options([]);\n const shown =\n current !== null && !items.some((item) => item.id === current.id)\n ? [current, ...items]\n : items;\n if (compact) {\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\n ? { 'aria-label': props['aria-label'] }\n : {})}\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 const cancel = () => {\n setChanging(false);\n setQuery(null);\n focusNext.current = 0;\n };\n return (\n <Fieldset {...chrome} description={description}>\n <div\n ref={container}\n className={styles.single}\n // Escape, once the picker has nothing to close or clear, keeps the item\n onKeyDown={(event) => {\n if (event.key === 'Escape' && changing && current !== null) {\n cancel();\n }\n }}\n >\n {current !== null && !changing ? (\n <RelationCards\n {...cards}\n references={[current]}\n onChange={() => {\n setChanging(true);\n focusNext.current = 'picker';\n }}\n onRemove={() => {\n onChange?.(null);\n focusNext.current = 'picker';\n }}\n />\n ) : (\n <div className={styles.picker}>\n <ComboBox\n {...pickerProps}\n items={options(current !== null ? [current] : [])}\n value={null}\n onChange={(itemId) =>\n pick(itemId, (reference) => {\n if (reference.id !== current?.id) {\n onChange?.(reference);\n }\n setChanging(false);\n focusNext.current = 0;\n })\n }\n />\n {changing && current !== null ? (\n <Button size=\"sm\" appearance=\"ghost\" onPress={cancel}>\n {intl.formatMessage(messages.cancelChange)}\n </Button>\n ) : null}\n </div>\n )}\n </div>\n </Fieldset>\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,13 +1,35 @@
1
1
  import "./RelationField.css";
2
2
  //#region src/relation/RelationField.module.css
3
+ var single = "panneau-relation-field-single";
3
4
  var multiple = "panneau-relation-field-multiple";
5
+ var picker = "panneau-relation-field-picker";
6
+ var cards = "panneau-relation-field-cards";
7
+ var card = "panneau-relation-field-card";
8
+ var thumbnail = "panneau-relation-field-thumbnail";
9
+ var optionThumbnail = "panneau-relation-field-option-thumbnail";
10
+ var cardText = "panneau-relation-field-card-text";
11
+ var cardLabel = "panneau-relation-field-card-label";
12
+ var link = "panneau-relation-field-link";
13
+ var cardDescription = "panneau-relation-field-card-description";
14
+ var cardActions = "panneau-relation-field-card-actions";
4
15
  var selected = "panneau-relation-field-selected";
5
16
  var reference = "panneau-relation-field-reference";
6
17
  var readOnly = "panneau-relation-field-read-only";
7
18
  var referenceLabel = "panneau-relation-field-reference-label";
8
19
  var none = "panneau-relation-field-none";
9
20
  var RelationField_module_default = {
21
+ single,
10
22
  multiple,
23
+ picker,
24
+ cards,
25
+ card,
26
+ thumbnail,
27
+ optionThumbnail,
28
+ cardText,
29
+ cardLabel,
30
+ link,
31
+ cardDescription,
32
+ cardActions,
11
33
  selected,
12
34
  reference,
13
35
  readOnly,
@@ -15,6 +37,6 @@ var RelationField_module_default = {
15
37
  none
16
38
  };
17
39
  //#endregion
18
- export { RelationField_module_default as default, multiple, none, readOnly, reference, referenceLabel, selected };
40
+ export { card, cardActions, cardDescription, cardLabel, cardText, cards, RelationField_module_default as default, link, multiple, none, optionThumbnail, picker, readOnly, reference, referenceLabel, selected, single, thumbnail };
19
41
 
20
42
  //# sourceMappingURL=RelationField.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RelationField.module.js","names":[],"sources":["../../src/relation/RelationField.module.css"],"sourcesContent":[".multiple {\n display: flex;\n flex-direction: column;\n gap: var(--panneau-space-2);\n}\n\n.selected {\n display: flex;\n flex-wrap: wrap;\n gap: var(--panneau-space-1) var(--panneau-space-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.reference {\n display: inline-flex;\n align-items: center;\n gap: var(--panneau-space-1);\n min-height: var(--panneau-control-height-sm);\n max-width: 100%;\n padding-inline: var(--panneau-space-3) var(--panneau-space-1);\n font-size: var(--panneau-font-size-sm);\n background-color: var(--panneau-color-surface-sunken);\n border: var(--panneau-border-width) solid var(--panneau-color-border);\n border-radius: var(--panneau-radius-full);\n}\n\n.reference:only-child,\n.readOnly .reference {\n padding-inline-end: var(--panneau-space-3);\n}\n\n.referenceLabel {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.none {\n font-size: var(--panneau-font-size-md);\n color: var(--panneau-color-text-muted);\n}\n"],"mappings":""}
1
+ {"version":3,"file":"RelationField.module.js","names":[],"sources":["../../src/relation/RelationField.module.css"],"sourcesContent":[".single,\n.multiple {\n display: flex;\n flex-direction: column;\n gap: var(--panneau-space-2);\n}\n\n/* The picker of the single field, with \"Cancel\" while it changes the item. */\n.picker {\n display: flex;\n align-items: center;\n gap: var(--panneau-space-2);\n}\n\n.picker > :first-child {\n flex: 1;\n min-width: 0;\n}\n\n/* The chosen items, as cards (decision 0067). */\n.cards {\n display: flex;\n flex-direction: column;\n gap: var(--panneau-space-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.card {\n display: flex;\n align-items: center;\n gap: var(--panneau-space-3);\n min-width: 0;\n padding: var(--panneau-space-2);\n background-color: var(--panneau-color-surface);\n border: var(--panneau-border-width) solid var(--panneau-color-border);\n border-radius: var(--panneau-radius-md);\n}\n\n/* The item's image, or its resource's icon. */\n.thumbnail {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 2.5rem;\n height: 2.5rem;\n overflow: hidden;\n color: var(--panneau-color-text-muted);\n background-color: var(--panneau-color-surface-sunken);\n border-radius: var(--panneau-radius-sm);\n}\n\n.thumbnail img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.optionThumbnail {\n width: 1.75rem;\n height: 1.75rem;\n}\n\n.cardText {\n display: flex;\n flex: 1;\n flex-direction: column;\n min-width: 0;\n}\n\n.cardLabel {\n overflow: hidden;\n font-size: var(--panneau-font-size-md);\n font-weight: var(--panneau-font-weight-medium);\n color: var(--panneau-color-text);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.link {\n align-self: flex-start;\n max-width: 100%;\n text-decoration: none;\n border-radius: var(--panneau-radius-sm);\n}\n\n.link:hover {\n text-decoration: underline;\n}\n\n.link[data-focus-visible] {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: 2px;\n}\n\n.cardDescription {\n overflow: hidden;\n font-size: var(--panneau-font-size-sm);\n color: var(--panneau-color-text-muted);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.cardActions {\n display: inline-flex;\n flex: none;\n gap: var(--panneau-space-1);\n}\n\n/* The items of a compact field, as chips. */\n.selected {\n display: flex;\n flex-wrap: wrap;\n gap: var(--panneau-space-1) var(--panneau-space-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.reference {\n display: inline-flex;\n align-items: center;\n gap: var(--panneau-space-1);\n min-height: var(--panneau-control-height-sm);\n max-width: 100%;\n padding-inline: var(--panneau-space-3) var(--panneau-space-1);\n font-size: var(--panneau-font-size-sm);\n background-color: var(--panneau-color-surface-sunken);\n border: var(--panneau-border-width) solid var(--panneau-color-border);\n border-radius: var(--panneau-radius-full);\n}\n\n.reference:only-child,\n.readOnly .reference {\n padding-inline-end: var(--panneau-space-3);\n}\n\n.referenceLabel {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.none {\n font-size: var(--panneau-font-size-md);\n color: var(--panneau-color-text-muted);\n}\n"],"mappings":""}
@@ -1,8 +1,24 @@
1
1
  import type { Definition, Item, ListQuery } from '@panneau/protocol';
2
- /** A related item: its id, and a label to show it. The value of a relation field. */
2
+ /**
3
+ * A related item: its id, and a label to show it. The value of a relation field. Its card also
4
+ * shows its `description` and its image, when the source gives them (decision 0067).
5
+ */
3
6
  export interface RelationReference {
4
7
  id: string;
5
8
  label: string;
9
+ /** A line under the label: the related resource's `itemSubtitle`, as text. */
10
+ description?: string;
11
+ /** The URL of its image: the related resource's `itemImage` (decision 0061). */
12
+ imageUrl?: string;
13
+ }
14
+ /** How a relation field shows the items of a resource, in its cards (decision 0067). */
15
+ export interface RelationResourceInfo {
16
+ /** The name of the resource's icon, for items without an image. */
17
+ icon?: string;
18
+ /** Whether its items have an image (`itemImage`). */
19
+ image?: boolean;
20
+ /** Whether its items have a description (`itemSubtitle`). */
21
+ description?: boolean;
6
22
  }
7
23
  /** Where relation fields search for items. */
8
24
  export interface RelationSource {
@@ -26,6 +42,14 @@ export interface RelationSource {
26
42
  create?(resource: string, text: string): Promise<RelationReference | null>;
27
43
  /** Whether `create()` can create items of a resource. Defaults to true. */
28
44
  canCreate?(resource: string): boolean;
45
+ /**
46
+ * How the items of a resource show in their cards: its icon, and whether they have an image or
47
+ * a description. When they do, references that come without them (`{ id, label }`, from items)
48
+ * get them from `resolve()`.
49
+ */
50
+ describe?(resource: string): RelationResourceInfo | null;
51
+ /** Where an item opens, for the link of its card. Without it, or `null`, the card has none. */
52
+ getItemHref?(resource: string, id: string): string | null;
29
53
  }
30
54
  /** What `createRelationSource()` needs from an adapter: the `list()`, `get()` and `create()` of `@panneau/data`. */
31
55
  export interface RelationListAdapter {
@@ -55,19 +79,22 @@ export interface RelationSourceOptions {
55
79
  * instead, or `null` for a resource where items can't be created.
56
80
  */
57
81
  create?: boolean | ((text: string, resource: string) => Record<string, unknown> | null);
82
+ /** Where an item opens, for the link of its card, such as its page in the app. */
83
+ getItemHref?: (resource: string, id: string) => string | null;
58
84
  }
59
85
  /**
60
86
  * A relation source over an adapter, such as the `DataAdapter` of `@panneau/data`: a search is a
61
87
  * list query with `q`, ids are resolved with `get()`, and, with the `create` option, items are
62
88
  * created with `create()`. Labels come from the resource's `itemTitle`.
63
89
  */
64
- export declare function createRelationSource(adapter: RelationListAdapter, { definition, perPage, getLabel, create }?: RelationSourceOptions): RelationSource;
90
+ export declare function createRelationSource(adapter: RelationListAdapter, { definition, perPage, getLabel, create, getItemHref }?: RelationSourceOptions): RelationSource;
65
91
  /** Reads relation values: references, ids, or lists of them. */
66
92
  export declare function toReferences(value: unknown): RelationReference[];
67
93
  /**
68
- * Relation references with the labels of plain ids: references whose label is their id (from
69
- * `"12"`) are resolved with the source's `resolve()`, once per source, resource and id. They keep
70
- * their id as label until then, or when the source doesn't find them.
94
+ * Relation references with what the source knows of them: plain ids (`"12"`) get their labels, and
95
+ * references of a resource whose items have a description or an image (`describe()`) get them, from
96
+ * the source's `resolve()`, once per source, resource and id. They stay as they are until then, or
97
+ * when the source doesn't find them.
71
98
  */
72
99
  export declare function useRelationReferences(source: RelationSource | null, resource: string, references: readonly RelationReference[]): RelationReference[];
73
100
  //# sourceMappingURL=relation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"relation.d.ts","sourceRoot":"","sources":["../../src/shared/relation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAErE,qFAAqF;AACrF,MAAM,WAAW,iBAAiB;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,8CAA8C;AAC9C,MAAM,WAAW,cAAc;IAC3B,6DAA6D;IAC7D,MAAM,CACF,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE,GACjC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAChC;;;;OAIG;IACH,OAAO,CAAC,CACJ,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,SAAS,MAAM,EAAE,EACtB,OAAO,EAAE;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE,GACjC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAChC;;;;OAIG;IACH,MAAM,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IAC3E,2EAA2E;IAC3E,SAAS,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CACzC;AAED,oHAAoH;AACpH,MAAM,WAAW,mBAAmB;IAChC,IAAI,CACA,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,SAAS,EACjB,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACnC,OAAO,CAAC;QAAE,IAAI,EAAE,IAAI,EAAE,CAAA;KAAE,CAAC,CAAC;IAC7B,6EAA6E;IAC7E,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtF,uCAAuC;IACvC,MAAM,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7E;AAED,MAAM,WAAW,qBAAqB;IAClC,0FAA0F;IAC1F,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC3F,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IACpD;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;CAC3F;AAeD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAChC,OAAO,EAAE,mBAAmB,EAC5B,EAAE,UAAiB,EAAE,OAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAE,qBAA0B,GAClF,cAAc,CAgEhB;AAED,gEAAgE;AAChE,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,EAAE,CAkBhE;AAiDD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACjC,MAAM,EAAE,cAAc,GAAG,IAAI,EAC7B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,SAAS,iBAAiB,EAAE,GACzC,iBAAiB,EAAE,CA2CrB"}
1
+ {"version":3,"file":"relation.d.ts","sourceRoot":"","sources":["../../src/shared/relation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGrE;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wFAAwF;AACxF,MAAM,WAAW,oBAAoB;IACjC,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,8CAA8C;AAC9C,MAAM,WAAW,cAAc;IAC3B,6DAA6D;IAC7D,MAAM,CACF,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE,GACjC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAChC;;;;OAIG;IACH,OAAO,CAAC,CACJ,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,SAAS,MAAM,EAAE,EACtB,OAAO,EAAE;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE,GACjC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAChC;;;;OAIG;IACH,MAAM,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IAC3E,2EAA2E;IAC3E,SAAS,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IACtC;;;;OAIG;IACH,QAAQ,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAAC;IACzD,+FAA+F;IAC/F,WAAW,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAC7D;AAED,oHAAoH;AACpH,MAAM,WAAW,mBAAmB;IAChC,IAAI,CACA,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,SAAS,EACjB,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACnC,OAAO,CAAC;QAAE,IAAI,EAAE,IAAI,EAAE,CAAA;KAAE,CAAC,CAAC;IAC7B,6EAA6E;IAC7E,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtF,uCAAuC;IACvC,MAAM,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7E;AAED,MAAM,WAAW,qBAAqB;IAClC,0FAA0F;IAC1F,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC3F,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IACpD;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACxF,kFAAkF;IAClF,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CACjE;AAeD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAChC,OAAO,EAAE,mBAAmB,EAC5B,EAAE,UAAiB,EAAE,OAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,GAAE,qBAA0B,GAC/F,cAAc,CAsFhB;AAED,gEAAgE;AAChE,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,EAAE,CA8BhE;AA4DD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACjC,MAAM,EAAE,cAAc,GAAG,IAAI,EAC7B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,SAAS,iBAAiB,EAAE,GACzC,iBAAiB,EAAE,CAsDrB"}
@@ -1,4 +1,5 @@
1
1
  import { c } from "react/compiler-runtime";
2
+ import { getImageUrl, getItemImageField } from "@panneau/protocol/runtime";
2
3
  import { useEffect, useState } from "react";
3
4
  //#region src/shared/relation.ts
4
5
  function labelOf(value, locale) {
@@ -15,13 +16,20 @@ function labelOf(value, locale) {
15
16
  * list query with `q`, ids are resolved with `get()`, and, with the `create` option, items are
16
17
  * created with `create()`. Labels come from the resource's `itemTitle`.
17
18
  */
18
- function createRelationSource(adapter, { definition = null, perPage = 20, getLabel, create } = {}) {
19
+ function createRelationSource(adapter, { definition = null, perPage = 20, getLabel, create, getItemHref } = {}) {
19
20
  const resourceOf = (resource) => definition?.resources.find((candidate) => candidate.id === resource);
20
21
  const toReference = (item, resource) => {
21
- const titleField = resourceOf(resource)?.itemTitle;
22
+ const definitionResource = resourceOf(resource);
23
+ const titleField = definitionResource?.itemTitle;
24
+ const subtitleField = definitionResource?.itemSubtitle;
25
+ const imageField = definitionResource !== void 0 ? getItemImageField(definitionResource) : void 0;
26
+ const description = subtitleField !== void 0 ? labelOf(item[subtitleField]) : null;
27
+ const imageUrl = imageField !== void 0 ? getImageUrl(item[imageField]) : null;
22
28
  return {
23
29
  id: item.id,
24
- label: getLabel?.(item, resource) ?? (titleField !== void 0 ? labelOf(item[titleField]) : null) ?? item.id
30
+ label: getLabel?.(item, resource) ?? (titleField !== void 0 ? labelOf(item[titleField]) : null) ?? item.id,
31
+ ...description !== null && description !== "" ? { description } : {},
32
+ ...imageUrl !== null ? { imageUrl } : {}
25
33
  };
26
34
  };
27
35
  const valuesOf = (text, resource) => {
@@ -33,13 +41,25 @@ function createRelationSource(adapter, { definition = null, perPage = 20, getLab
33
41
  const locales = definition?.locales ?? [];
34
42
  return { [titleField]: field?.localized === true && locales.length > 0 ? Object.fromEntries(locales.map((locale) => [locale, text])) : text };
35
43
  };
36
- const source = { async search(resource, query, { signal }) {
37
- return (await adapter.list(resource, {
38
- page: 1,
39
- perPage,
40
- ...query !== "" ? { q: query } : {}
41
- }, { signal })).data.map((item) => toReference(item, resource));
42
- } };
44
+ const source = {
45
+ async search(resource, query, { signal }) {
46
+ return (await adapter.list(resource, {
47
+ page: 1,
48
+ perPage,
49
+ ...query !== "" ? { q: query } : {}
50
+ }, { signal })).data.map((item) => toReference(item, resource));
51
+ },
52
+ describe(resource) {
53
+ const definitionResource = resourceOf(resource);
54
+ if (definitionResource === void 0) return null;
55
+ return {
56
+ ...definitionResource.icon !== void 0 ? { icon: definitionResource.icon } : {},
57
+ image: getItemImageField(definitionResource) !== void 0,
58
+ description: definitionResource.itemSubtitle !== void 0
59
+ };
60
+ }
61
+ };
62
+ if (getItemHref !== void 0) source.getItemHref = getItemHref;
43
63
  const { get, create: createItem } = adapter;
44
64
  if (get !== void 0) source.resolve = async (resource, ids, { signal }) => {
45
65
  return (await Promise.allSettled(ids.map((id) => get.call(adapter, resource, id, { signal })))).flatMap((result) => result.status === "fulfilled" ? [toReference(result.value, resource)] : []);
@@ -62,10 +82,12 @@ function toReferences(value) {
62
82
  label: String(entry)
63
83
  }];
64
84
  if (entry !== null && typeof entry === "object" && "id" in entry) {
65
- const { id, label } = entry;
85
+ const { id, label, description, imageUrl } = entry;
66
86
  if (typeof id === "string" || typeof id === "number") return [{
67
87
  id: String(id),
68
- label: typeof label === "string" ? label : String(id)
88
+ label: typeof label === "string" ? label : String(id),
89
+ ...typeof description === "string" ? { description } : {},
90
+ ...typeof imageUrl === "string" ? { imageUrl } : {}
69
91
  }];
70
92
  }
71
93
  return [];
@@ -76,7 +98,7 @@ function resolvedOf(source) {
76
98
  let entry = resolved.get(source);
77
99
  if (entry === void 0) {
78
100
  entry = {
79
- labels: /* @__PURE__ */ new Map(),
101
+ references: /* @__PURE__ */ new Map(),
80
102
  pending: /* @__PURE__ */ new Map()
81
103
  };
82
104
  resolved.set(source, entry);
@@ -86,11 +108,11 @@ function resolvedOf(source) {
86
108
  var keyOf = (resource, id) => `${resource}\u0000${id}`;
87
109
  /** Resolves the ids that no request has resolved or is resolving yet, and waits for all of them. */
88
110
  function resolveIds(source, resource, ids) {
89
- const { labels, pending } = resolvedOf(source);
111
+ const { references, pending } = resolvedOf(source);
90
112
  const fresh = ids.filter((id) => !pending.has(keyOf(resource, id)));
91
113
  if (fresh.length > 0 && source.resolve !== void 0) {
92
114
  const request = source.resolve(resource, fresh, { signal: new AbortController().signal }).then((found) => {
93
- fresh.forEach((id) => labels.set(keyOf(resource, id), found.find((candidate) => candidate.id === id)?.label ?? null));
115
+ fresh.forEach((id) => references.set(keyOf(resource, id), found.find((candidate) => candidate.id === id) ?? null));
94
116
  }, () => {
95
117
  fresh.forEach((id) => pending.delete(keyOf(resource, id)));
96
118
  });
@@ -99,57 +121,114 @@ function resolveIds(source, resource, ids) {
99
121
  return Promise.all(ids.map((id) => pending.get(keyOf(resource, id))));
100
122
  }
101
123
  /**
102
- * Relation references with the labels of plain ids: references whose label is their id (from
103
- * `"12"`) are resolved with the source's `resolve()`, once per source, resource and id. They keep
104
- * their id as label until then, or when the source doesn't find them.
124
+ * Whether a reference needs `resolve()`: a plain id (its label is its id), or a reference without
125
+ * the description or the image that the items of its resource have (decision 0067).
126
+ */
127
+ function needsResolving(reference, detailed) {
128
+ return reference.label === reference.id || detailed && reference.description === void 0 && reference.imageUrl === void 0;
129
+ }
130
+ /**
131
+ * Relation references with what the source knows of them: plain ids (`"12"`) get their labels, and
132
+ * references of a resource whose items have a description or an image (`describe()`) get them, from
133
+ * the source's `resolve()`, once per source, resource and id. They stay as they are until then, or
134
+ * when the source doesn't find them.
105
135
  */
106
136
  function useRelationReferences(source, resource, references) {
107
- const $ = c(1);
108
- const cache = source !== null ? resolvedOf(source).labels : null;
137
+ const $ = c(26);
138
+ const cache = source !== null ? resolvedOf(source).references : null;
109
139
  let t0;
110
140
  if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
111
141
  t0 = {};
112
142
  $[0] = t0;
113
143
  } else t0 = $[0];
114
- const [labels, setLabels] = useState(t0);
115
- const label = (id) => labels[keyOf(resource, id)] ?? cache?.get(keyOf(resource, id)) ?? void 0;
116
- const missingKey = (source?.resolve !== void 0 && cache !== null ? references.filter(_temp).map(_temp2).filter((id_0) => !cache.has(keyOf(resource, id_0))) : []).join("\0");
117
- useEffect(() => {
118
- const ids = missingKey === "" ? [] : missingKey.split("\0");
119
- if (source === null || cache === null || ids.length === 0) return;
120
- let active = true;
121
- resolveIds(source, resource, ids).then(() => {
122
- if (!active) return;
123
- const next = {};
124
- ids.forEach((id_1) => {
125
- const found = cache.get(keyOf(resource, id_1));
126
- if (typeof found === "string") next[keyOf(resource, id_1)] = found;
144
+ const [found, setFound] = useState(t0);
145
+ let t1;
146
+ if ($[1] !== resource || $[2] !== source) {
147
+ t1 = source?.describe?.(resource) ?? null;
148
+ $[1] = resource;
149
+ $[2] = source;
150
+ $[3] = t1;
151
+ } else t1 = $[3];
152
+ const info = t1;
153
+ const detailed = info?.image === true || info?.description === true;
154
+ const missingKey = (source?.resolve !== void 0 && cache !== null ? references.filter((reference) => needsResolving(reference, detailed)).map(_temp).filter((id) => !cache.has(keyOf(resource, id))) : []).join("\0");
155
+ let t2;
156
+ if ($[4] !== cache || $[5] !== missingKey || $[6] !== resource || $[7] !== setFound || $[8] !== source) {
157
+ t2 = () => {
158
+ const ids = missingKey === "" ? [] : missingKey.split("\0");
159
+ if (source === null || cache === null || ids.length === 0) return;
160
+ let active = true;
161
+ resolveIds(source, resource, ids).then(() => {
162
+ if (!active) return;
163
+ const next = {};
164
+ ids.forEach((id_0) => {
165
+ const reference_1 = cache.get(keyOf(resource, id_0));
166
+ if (reference_1 !== void 0 && reference_1 !== null) next[keyOf(resource, id_0)] = reference_1;
167
+ });
168
+ setFound((current) => ({
169
+ ...current,
170
+ ...next
171
+ }));
127
172
  });
128
- setLabels((current) => ({
129
- ...current,
130
- ...next
131
- }));
132
- });
133
- return () => {
134
- active = false;
173
+ return () => {
174
+ active = false;
175
+ };
135
176
  };
136
- }, [
137
- source,
138
- cache,
139
- resource,
140
- missingKey
141
- ]);
142
- return references.map((reference_1) => reference_1.label === reference_1.id ? {
143
- id: reference_1.id,
144
- label: label(reference_1.id) ?? reference_1.id
145
- } : reference_1);
177
+ $[4] = cache;
178
+ $[5] = missingKey;
179
+ $[6] = resource;
180
+ $[7] = setFound;
181
+ $[8] = source;
182
+ $[9] = t2;
183
+ } else t2 = $[9];
184
+ let t3;
185
+ if ($[10] !== cache || $[11] !== missingKey || $[12] !== resource || $[13] !== source) {
186
+ t3 = [
187
+ source,
188
+ cache,
189
+ resource,
190
+ missingKey
191
+ ];
192
+ $[10] = cache;
193
+ $[11] = missingKey;
194
+ $[12] = resource;
195
+ $[13] = source;
196
+ $[14] = t3;
197
+ } else t3 = $[14];
198
+ useEffect(t2, t3);
199
+ let t4;
200
+ if ($[15] !== cache || $[16] !== detailed || $[17] !== found || $[18] !== references || $[19] !== resource) {
201
+ let t5;
202
+ if ($[21] !== cache || $[22] !== detailed || $[23] !== found || $[24] !== resource) {
203
+ t5 = (reference_2) => {
204
+ if (!needsResolving(reference_2, detailed)) return reference_2;
205
+ const known = found[keyOf(resource, reference_2.id)] ?? cache?.get(keyOf(resource, reference_2.id));
206
+ if (known === void 0 || known === null) return reference_2;
207
+ return {
208
+ ...known,
209
+ ...reference_2,
210
+ label: reference_2.label === reference_2.id ? known.label : reference_2.label
211
+ };
212
+ };
213
+ $[21] = cache;
214
+ $[22] = detailed;
215
+ $[23] = found;
216
+ $[24] = resource;
217
+ $[25] = t5;
218
+ } else t5 = $[25];
219
+ t4 = references.map(t5);
220
+ $[15] = cache;
221
+ $[16] = detailed;
222
+ $[17] = found;
223
+ $[18] = references;
224
+ $[19] = resource;
225
+ $[20] = t4;
226
+ } else t4 = $[20];
227
+ return t4;
146
228
  }
147
- function _temp2(reference_0) {
229
+ function _temp(reference_0) {
148
230
  return reference_0.id;
149
231
  }
150
- function _temp(reference) {
151
- return reference.label === reference.id;
152
- }
153
232
  //#endregion
154
233
  export { createRelationSource, toReferences, useRelationReferences };
155
234