@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.
- package/dist/relation/RelationField.css +106 -0
- package/dist/relation/RelationField.d.ts +10 -3
- package/dist/relation/RelationField.d.ts.map +1 -1
- package/dist/relation/RelationField.js +641 -379
- package/dist/relation/RelationField.js.map +1 -1
- package/dist/relation/RelationField.module.js +23 -1
- package/dist/relation/RelationField.module.js.map +1 -1
- package/dist/shared/relation.d.ts +32 -5
- package/dist/shared/relation.d.ts.map +1 -1
- package/dist/shared/relation.js +133 -54
- package/dist/shared/relation.js.map +1 -1
- package/package.json +4 -4
|
@@ -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
|
-
/**
|
|
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
|
|
69
|
-
*
|
|
70
|
-
*
|
|
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;
|
|
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"}
|
package/dist/shared/relation.js
CHANGED
|
@@ -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
|
|
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 = {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
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 {
|
|
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) =>
|
|
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
|
-
*
|
|
103
|
-
*
|
|
104
|
-
|
|
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(
|
|
108
|
-
const cache = source !== null ? resolvedOf(source).
|
|
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 [
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
}));
|
|
132
|
-
});
|
|
133
|
-
return () => {
|
|
134
|
-
active = false;
|
|
173
|
+
return () => {
|
|
174
|
+
active = false;
|
|
175
|
+
};
|
|
135
176
|
};
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
|
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
|
|