@panneau/fields 5.0.0-alpha.15 → 5.0.0-alpha.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +53 -3
- package/dist/address/AddressField.css +44 -0
- package/dist/address/AddressField.d.ts +37 -0
- package/dist/address/AddressField.d.ts.map +1 -0
- package/dist/address/AddressField.js +411 -0
- package/dist/address/AddressField.js.map +1 -0
- package/dist/address/AddressField.module.js +22 -0
- package/dist/address/AddressField.module.js.map +1 -0
- package/dist/address/address.d.ts +23 -0
- package/dist/address/address.d.ts.map +1 -0
- package/dist/address/address.js +58 -0
- package/dist/address/address.js.map +1 -0
- package/dist/address/index.d.ts +3 -0
- package/dist/address/index.d.ts.map +1 -0
- package/dist/address/index.js +3 -0
- package/dist/color/ColorField.css +9 -0
- package/dist/color/ColorField.d.ts +10 -3
- package/dist/color/ColorField.d.ts.map +1 -1
- package/dist/color/ColorField.js +341 -81
- package/dist/color/ColorField.js.map +1 -1
- package/dist/color/ColorField.module.js +4 -2
- package/dist/color/ColorField.module.js.map +1 -1
- package/dist/color/index.d.ts +1 -0
- package/dist/color/index.d.ts.map +1 -1
- package/dist/color/index.js +3 -1
- package/dist/color/palette.d.ts +23 -0
- package/dist/color/palette.d.ts.map +1 -0
- package/dist/color/palette.js +34 -0
- package/dist/color/palette.js.map +1 -0
- package/dist/country/CountryField.css +42 -0
- package/dist/country/CountryField.d.ts +19 -4
- package/dist/country/CountryField.d.ts.map +1 -1
- package/dist/country/CountryField.js +355 -82
- package/dist/country/CountryField.js.map +1 -1
- package/dist/country/CountryField.module.js +20 -0
- package/dist/country/CountryField.module.js.map +1 -0
- package/dist/country/index.d.ts +1 -1
- package/dist/country/index.d.ts.map +1 -1
- package/dist/daterange/DateRangeField.css +9 -0
- package/dist/daterange/DateRangeField.d.ts +31 -0
- package/dist/daterange/DateRangeField.d.ts.map +1 -0
- package/dist/daterange/DateRangeField.js +372 -0
- package/dist/daterange/DateRangeField.js.map +1 -0
- package/dist/daterange/DateRangeField.module.js +12 -0
- package/dist/daterange/DateRangeField.module.js.map +1 -0
- package/dist/daterange/index.d.ts +3 -0
- package/dist/daterange/index.d.ts.map +1 -0
- package/dist/daterange/index.js +3 -0
- package/dist/daterange/range.d.ts +61 -0
- package/dist/daterange/range.d.ts.map +1 -0
- package/dist/daterange/range.js +119 -0
- package/dist/daterange/range.js.map +1 -0
- package/dist/duration/DurationField.css +1 -1
- package/dist/duration/DurationField.d.ts +54 -13
- package/dist/duration/DurationField.d.ts.map +1 -1
- package/dist/duration/DurationField.js +205 -159
- package/dist/duration/DurationField.js.map +1 -1
- package/dist/duration/DurationField.module.js.map +1 -1
- package/dist/duration/index.d.ts +1 -1
- package/dist/duration/index.d.ts.map +1 -1
- package/dist/duration/index.js +1 -1
- package/dist/embed/EmbedField.d.ts +11 -2
- package/dist/embed/EmbedField.d.ts.map +1 -1
- package/dist/embed/EmbedField.js +179 -116
- package/dist/embed/EmbedField.js.map +1 -1
- package/dist/link/LinkField.css +12 -0
- package/dist/link/LinkField.d.ts +38 -0
- package/dist/link/LinkField.d.ts.map +1 -0
- package/dist/link/LinkField.js +742 -0
- package/dist/link/LinkField.js.map +1 -0
- package/dist/link/LinkField.module.js +8 -0
- package/dist/link/LinkField.module.js.map +1 -0
- package/dist/link/index.d.ts +3 -0
- package/dist/link/index.d.ts.map +1 -0
- package/dist/link/index.js +3 -0
- package/dist/link/link.d.ts +30 -0
- package/dist/link/link.d.ts.map +1 -0
- package/dist/link/link.js +63 -0
- package/dist/link/link.js.map +1 -0
- package/dist/link/pages.d.ts +17 -0
- package/dist/link/pages.d.ts.map +1 -0
- package/dist/link/pages.js +104 -0
- package/dist/link/pages.js.map +1 -0
- package/dist/location/LocationField.d.ts.map +1 -1
- package/dist/location/LocationField.js +9 -85
- package/dist/location/LocationField.js.map +1 -1
- package/dist/location/nominatim.d.ts +8 -2
- package/dist/location/nominatim.d.ts.map +1 -1
- package/dist/location/nominatim.js +32 -3
- package/dist/location/nominatim.js.map +1 -1
- package/dist/location/search.d.ts +10 -0
- package/dist/location/search.d.ts.map +1 -0
- package/dist/location/search.js +83 -0
- package/dist/location/search.js.map +1 -0
- package/dist/location/types.d.ts +8 -2
- package/dist/location/types.d.ts.map +1 -1
- package/dist/money/MoneyField.d.ts +28 -0
- package/dist/money/MoneyField.d.ts.map +1 -0
- package/dist/money/MoneyField.js +269 -0
- package/dist/money/MoneyField.js.map +1 -0
- package/dist/money/index.d.ts +3 -0
- package/dist/money/index.d.ts.map +1 -0
- package/dist/money/index.js +3 -0
- package/dist/money/money.d.ts +27 -0
- package/dist/money/money.d.ts.map +1 -0
- package/dist/money/money.js +56 -0
- package/dist/money/money.js.map +1 -0
- package/dist/region/RegionField.js +1 -1
- package/dist/shared/builtIn.d.ts +3 -1
- package/dist/shared/builtIn.d.ts.map +1 -1
- package/dist/shared/builtIn.js +18 -8
- package/dist/shared/builtIn.js.map +1 -1
- package/dist/shared/dates.js +2 -2
- package/dist/shared/dates.js.map +1 -1
- package/dist/shared/flow.d.ts.map +1 -1
- package/dist/shared/flow.js +1 -0
- package/dist/shared/flow.js.map +1 -1
- package/dist/shared/part.d.ts +26 -0
- package/dist/shared/part.d.ts.map +1 -0
- package/dist/shared/part.js +64 -0
- package/dist/shared/part.js.map +1 -0
- package/dist/tel/TelField.css +25 -0
- package/dist/tel/TelField.d.ts +14 -2
- package/dist/tel/TelField.d.ts.map +1 -1
- package/dist/tel/TelField.js +246 -145
- package/dist/tel/TelField.js.map +1 -1
- package/dist/tel/TelField.module.js +12 -0
- package/dist/tel/TelField.module.js.map +1 -0
- package/dist/tel/index.d.ts +1 -1
- package/dist/tel/index.d.ts.map +1 -1
- package/dist/tel/index.js +2 -2
- package/dist/tel/phone.d.ts +28 -0
- package/dist/tel/phone.d.ts.map +1 -1
- package/dist/tel/phone.js +48 -1
- package/dist/tel/phone.js.map +1 -1
- package/dist/url/UrlField.d.ts.map +1 -1
- package/dist/url/UrlField.js +1 -1
- package/dist/url/UrlField.js.map +1 -1
- package/package.json +24 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LinkField.js","names":["File","FileIcon","FileText","Globe","Hash","Mail","Phone","ReactNode","useState","Field","LinkValue","LinkNewTab","LinkType","getLinkNewTab","getLinkTypes","Checkbox","ComboBox","Fieldset","IconComponent","SegmentedControl","TextInput","usePanneauIntl","EmailField","LocalizedField","LocalizedValue","DefinitionField","useFieldsContext","getFieldProps","getSetting","isString","messages","BoundPart","BoundPartProps","FieldEntryProps","FieldProps","TelField","TextField","UrlField","styles","LinkPage","cleanLink","getLinkPage","isLink","usePageSearch","LinkLabelMode","LinkFieldProps","path","types","pages","libraries","newTab","labelMode","singleLabel","DEFAULT_TYPES","id","TYPE_ICONS","Readonly","Record","url","page","email","tel","file","withoutScheme","scheme","undefined","toLowerCase","startsWith","slice","length","LinkField","t0","$","_c","value","onChange","onBlur","name","typesProp","t1","t2","t3","t4","label","description","errors","disabled","readOnly","required","className","t5","intl","locales","relationSource","defaultType","t6","type","find","candidate","base","t7","part","partPath","editable","t8","next","link","change","t9","setUrl","t10","candidate_0","formatMessage","linkTypeUrl","linkTypePage","linkTypeEmail","linkTypeTel","linkTypeFile","typeName","t11","bound","shared","t12","partName","partType","render","part_0","input","bb0","t13","bound_5","linkUrl","t14","bound_4","linkEmail","bound_3","linkTel","number","bound_2","linkPage","linkFile","resource","t15","fileField","t16","bound_1","t17","bound_0","placeholder","linkLabel","labelText","labelRequired","bound_6","text","next_0","localeInput","text_0","labelInput","linkType","map","candidate_1","icon","next_1","selected","linkNewTab","t18","PagePickerProps","resources","PagePicker","query","setQuery","enabled","items","isLoading","item","keyOf","T0","current","shown","some","item_0","item_1","key","found","item_2","search","noResults","isLabelMode","isCodes","Array","isArray","every","LinkFieldEntry","props","field","fieldProps","_placeholder","locale","FileIcon","_c","styles"],"sources":["../../src/link/LinkField.tsx"],"sourcesContent":["import { File as FileIcon, FileText, Globe, Hash, Mail, Phone } from 'lucide-react';\nimport { type ReactNode, useState } from 'react';\n\nimport type { Field, LinkValue } from '@panneau/protocol';\nimport {\n type LinkNewTab,\n type LinkType,\n getLinkNewTab,\n getLinkTypes,\n} from '@panneau/protocol/runtime';\nimport {\n Checkbox,\n ComboBox,\n Fieldset,\n type IconComponent,\n SegmentedControl,\n TextInput,\n usePanneauIntl,\n} from '@panneau/ui';\n\nimport { EmailField } from '../email/EmailField';\nimport { LocalizedField, type LocalizedValue } from '../localized/LocalizedField';\nimport { DefinitionField } from '../shared/DefinitionField';\nimport { useFieldsContext } from '../shared/context';\nimport { getFieldProps, getSetting, isString } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport { BoundPart, type BoundPartProps } from '../shared/part';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport { TelField } from '../tel/TelField';\nimport { TextField } from '../text/TextField';\nimport { UrlField } from '../url/UrlField';\nimport styles from './LinkField.module.css';\nimport { type LinkPage, cleanLink, getLinkPage, isLink } from './link';\nimport { usePageSearch } from './pages';\n\n/** Whether links have a label: optional, required, or none. */\nexport type LinkLabelMode = 'optional' | 'required' | 'none';\n\nexport interface LinkFieldProps extends FieldProps<LinkValue> {\n /** Dot path of the value, the prefix of the paths of its parts. Defaults to `name`. */\n path?: string;\n /** The types offered, in order. Defaults to `url`, `email` and `tel`. */\n types?: readonly LinkType[];\n /** The resources of `page` links. */\n pages?: readonly string[];\n /** The media libraries of `file` links. Defaults to every library. */\n libraries?: readonly string[];\n /** Which links open in a new tab. Defaults to `choose`, a checkbox. */\n newTab?: LinkNewTab;\n /** Whether links have a label. Defaults to `optional`. */\n labelMode?: LinkLabelMode;\n /**\n * The label is a string, not a value per locale: in a `localized` link field, where the whole\n * link is per locale already.\n */\n singleLabel?: boolean;\n}\n\nconst DEFAULT_TYPES: readonly LinkType[] = [{ id: 'url' }, { id: 'email' }, { id: 'tel' }];\n\nconst TYPE_ICONS: Readonly<Record<string, IconComponent>> = {\n url: Globe,\n page: FileText,\n email: Mail,\n tel: Phone,\n file: FileIcon,\n};\n\n/** The text of a URL after its scheme: `info@example.com` in `mailto:info@example.com`. */\nfunction withoutScheme(url: string | undefined, scheme: string): string | null {\n if (url === undefined || url === '') {\n return null;\n }\n return url.toLowerCase().startsWith(scheme) ? url.slice(scheme.length) : url;\n}\n\n/**\n * A link (decision 0055): its type, in a segmented control, then the input of the type (a URL, a\n * page searched in the resources of `pages`, an email address, a phone number, a media, or the\n * text of a type of the site), its label per locale, and whether it opens in a new tab. Each part\n * shows the errors of its own path (`link.url`) in a form.\n */\nexport function LinkField({\n value,\n onChange,\n onBlur,\n path,\n name,\n types: typesProp,\n pages = [],\n libraries,\n newTab = 'choose',\n labelMode = 'optional',\n singleLabel = false,\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n className,\n}: LinkFieldProps) {\n const intl = usePanneauIntl();\n const { locales, relationSource } = useFieldsContext();\n const types = typesProp !== undefined && typesProp.length > 0 ? typesProp : DEFAULT_TYPES;\n const defaultType = types[0]?.id;\n const type = types.find((candidate) => candidate.id === value?.type) ?? types[0];\n const base = path ?? name ?? '';\n const partPath = (part: string) => (base !== '' ? `${base}.${part}` : part);\n const editable = disabled !== true && readOnly !== true;\n\n const change = (next: Partial<LinkValue>) => {\n const link = { ...value, type: value?.type ?? defaultType ?? 'url', ...next };\n onChange?.(cleanLink(link, { newTab, defaultType }));\n };\n const setUrl = (url: string | null) => change({ url: url ?? undefined });\n\n const typeName = (candidate: LinkType) => {\n switch (candidate.id) {\n case 'url':\n return intl.formatMessage(messages.linkTypeUrl);\n case 'page':\n return intl.formatMessage(messages.linkTypePage);\n case 'email':\n return intl.formatMessage(messages.linkTypeEmail);\n case 'tel':\n return intl.formatMessage(messages.linkTypeTel);\n case 'file':\n return intl.formatMessage(messages.linkTypeFile);\n default:\n return candidate.label ?? candidate.id;\n }\n };\n const shared = (bound: BoundPartProps) => ({\n errors: bound.errors ?? [],\n ...(bound.onBlur !== undefined ? { onBlur: bound.onBlur } : {}),\n ...(disabled !== undefined ? { disabled } : {}),\n ...(readOnly !== undefined ? { readOnly } : {}),\n required: required === true || (value ?? null) !== null,\n });\n const part = (\n partName: string,\n partType: string,\n render: (bound: BoundPartProps) => ReactNode,\n ) => (\n <BoundPart\n field={{ name: partName, type: partType }}\n path={partPath(partName)}\n {...(onBlur !== undefined ? { onBlur } : {})}\n render={render}\n />\n );\n\n let input: ReactNode = null;\n if (type !== undefined) {\n switch (type.id) {\n case 'url':\n input = part('url', 'url', (bound) => (\n <UrlField\n {...shared(bound)}\n label={intl.formatMessage(messages.linkUrl)}\n value={value?.url ?? null}\n onChange={setUrl}\n />\n ));\n break;\n case 'email':\n input = part('url', 'email', (bound) => (\n <EmailField\n {...shared(bound)}\n label={intl.formatMessage(messages.linkEmail)}\n value={withoutScheme(value?.url, 'mailto:')}\n onChange={(email) => setUrl(email !== null ? `mailto:${email}` : null)}\n />\n ));\n break;\n case 'tel':\n input = part('url', 'tel', (bound) => (\n <TelField\n {...shared(bound)}\n label={intl.formatMessage(messages.linkTel)}\n value={withoutScheme(value?.url, 'tel:')}\n onChange={(number) => setUrl(number !== null ? `tel:${number}` : null)}\n />\n ));\n break;\n case 'page':\n input = part('page', 'relation', (bound) => (\n <PagePicker\n {...shared(bound)}\n label={intl.formatMessage(messages.linkPage)}\n resources={pages}\n page={getLinkPage(value)}\n editable={editable && relationSource !== null}\n onChange={(page) =>\n change({ page: page !== null ? { ...page } : undefined })\n }\n />\n ));\n break;\n case 'file': {\n const fileField: Field = {\n name: 'file',\n type: 'media',\n label: intl.formatMessage(messages.linkFile),\n ...(libraries !== undefined && libraries.length > 0\n ? { resource: [...libraries] }\n : {}),\n };\n // The media entry of the fields context, set as a part of the link\n input = part('file', 'media', (bound) => (\n <DefinitionField\n field={fileField}\n path={partPath('file')}\n value={value?.file ?? null}\n onChange={(file) =>\n change({ file: (file ?? undefined) as LinkValue['file'] })\n }\n errors={bound.errors ?? []}\n {...(bound.onBlur !== undefined ? { onBlur: bound.onBlur } : {})}\n {...(disabled !== undefined ? { disabled } : {})}\n {...(readOnly !== undefined ? { readOnly } : {})}\n />\n ));\n break;\n }\n default:\n input = part('url', 'text', (bound) => (\n <TextField\n {...shared(bound)}\n label={typeName(type)}\n autoComplete=\"off\"\n {...(type.placeholder !== undefined\n ? { placeholder: type.placeholder }\n : {})}\n value={value?.url ?? null}\n onChange={setUrl}\n />\n ));\n }\n }\n\n const labelText = intl.formatMessage(messages.linkLabel);\n const labelRequired = labelMode === 'required';\n const labelInput =\n labelMode === 'none'\n ? null\n : part('label', 'text', (bound) =>\n singleLabel || locales.length === 0 ? (\n <TextField\n {...shared(bound)}\n label={labelText}\n required={labelRequired}\n value={typeof value?.label === 'string' ? value.label : null}\n onChange={(text) => change({ label: text })}\n />\n ) : (\n <LocalizedField<string>\n label={labelText}\n errors={bound.errors ?? []}\n required={labelRequired}\n locales={locales}\n value={\n value?.label !== null && typeof value?.label === 'object'\n ? (value.label as LocalizedValue<string>)\n : {}\n }\n onChange={(next) =>\n change({ label: (next ?? null) as LinkValue['label'] })\n }\n >\n {(localeInput) => (\n <TextInput\n aria-label={`${labelText} (${localeInput.label})`}\n value={localeInput.value ?? ''}\n onChange={(text) =>\n localeInput.onChange(text === '' ? null : text)\n }\n {...(bound.onBlur !== undefined ? { onBlur: bound.onBlur } : {})}\n isDisabled={disabled === true}\n isReadOnly={readOnly === true}\n />\n )}\n </LocalizedField>\n ),\n );\n\n return (\n <Fieldset\n legend={label}\n description={description}\n errors={errors}\n isRequired={required}\n isDisabled={disabled}\n className={className}\n >\n <div className={styles.link}>\n {types.length > 1 ? (\n <SegmentedControl\n aria-label={intl.formatMessage(messages.linkType)}\n size=\"sm\"\n isDisabled={!editable}\n options={types.map((candidate) => ({\n value: candidate.id,\n label: typeName(candidate),\n icon: TYPE_ICONS[candidate.id] ?? Hash,\n }))}\n {...(type !== undefined ? { value: type.id } : {})}\n onChange={(next) => {\n if (next !== type?.id) {\n // A new type keeps the label only\n onChange?.(\n cleanLink(\n {\n type: next,\n label: value?.label ?? null,\n newTab: value?.newTab ?? false,\n },\n { newTab, defaultType },\n ),\n );\n }\n }}\n />\n ) : null}\n {input}\n {labelInput}\n {newTab === 'choose' ? (\n <Checkbox\n isSelected={value?.newTab === true}\n onChange={(selected) => change({ newTab: selected })}\n isDisabled={!editable}\n >\n {intl.formatMessage(messages.linkNewTab)}\n </Checkbox>\n ) : null}\n </div>\n </Fieldset>\n );\n}\n\ninterface PagePickerProps {\n label: string;\n resources: readonly string[];\n page: LinkPage | null;\n onChange: (page: LinkPage | null) => void;\n editable: boolean;\n errors: readonly string[];\n onBlur?: () => void;\n required: boolean;\n}\n\n/** The page of a link: searched in every resource of `pages`, with the relation source. */\nfunction PagePicker({\n label,\n resources,\n page,\n onChange,\n editable,\n errors,\n onBlur,\n required,\n}: PagePickerProps) {\n const intl = usePanneauIntl();\n const { relationSource } = useFieldsContext();\n const [query, setQuery] = useState<string | null>(null);\n const { items, isLoading } = usePageSearch(relationSource, resources, query ?? '', {\n enabled: editable,\n });\n const keyOf = (item: { id: string; resource?: string }) =>\n `${item.resource ?? resources[0] ?? ''}\\u0000${item.id}`;\n const current = page !== null ? { ...page, label: page.label ?? page.id } : null;\n const shown =\n current !== null && !items.some((item) => keyOf(item) === keyOf(current))\n ? [current, ...items]\n : items;\n return (\n <ComboBox\n label={label}\n errors={errors}\n isRequired={required}\n isDisabled={!editable}\n items={shown.map((item) => ({ id: keyOf(item), label: item.label }))}\n value={current !== null ? keyOf(current) : null}\n inputValue={query ?? current?.label ?? ''}\n onInputChange={(text) => {\n setQuery(text);\n if (text === '' && current !== null) {\n onChange(null);\n }\n }}\n onChange={(key) => {\n setQuery(null);\n const found = shown.find((item) => keyOf(item) === key);\n if (found !== undefined) {\n onChange({\n id: found.id,\n label: found.label,\n ...(found.resource !== undefined\n ? { resource: found.resource }\n : resources[0] !== undefined\n ? { resource: resources[0] }\n : {}),\n });\n }\n }}\n isLoading={isLoading}\n placeholder={intl.formatMessage(messages.search)}\n emptyMessage={intl.formatMessage(messages.noResults)}\n {...(onBlur !== undefined ? { onBlur: () => onBlur() } : {})}\n />\n );\n}\n\nconst isLabelMode = (value: unknown): value is LinkLabelMode =>\n value === 'optional' || value === 'required' || value === 'none';\nconst isCodes = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every(isString);\n\n/**\n * The `link` type: its `resource` (the resources of `page` links), and settings `types`,\n * `newTab`, `label` and `libraries`. In a localized field, the label of each locale's link is a\n * string.\n */\nexport function LinkFieldEntry(props: FieldEntryProps) {\n const { field } = props;\n const labelMode = getSetting(field, 'label', isLabelMode);\n const libraries = getSetting(field, 'libraries', isCodes);\n const pages =\n field.resource === undefined\n ? []\n : typeof field.resource === 'string'\n ? [field.resource]\n : field.resource;\n const { placeholder: _placeholder, ...fieldProps } = getFieldProps(props);\n return (\n <LinkField\n {...fieldProps}\n path={props.path}\n value={isLink(props.value) ? props.value : null}\n onChange={props.onChange}\n types={getLinkTypes(field)}\n pages={pages}\n newTab={getLinkNewTab(field)}\n singleLabel={props.locale !== undefined}\n {...(labelMode !== undefined ? { labelMode } : {})}\n {...(libraries !== undefined ? { libraries } : {})}\n />\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import "./LinkField.css";
|
|
2
|
+
//#region src/link/LinkField.module.css
|
|
3
|
+
var link = "panneau-link-field-link";
|
|
4
|
+
var LinkField_module_default = { link };
|
|
5
|
+
//#endregion
|
|
6
|
+
export { LinkField_module_default as default, link };
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=LinkField.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LinkField.module.js","names":[],"sources":["../../src/link/LinkField.module.css"],"sourcesContent":["/* The type, its input, the label, then the new tab. */\n.link {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--panneau-space-3);\n}\n\n.link > :first-child {\n align-self: flex-start;\n max-width: 100%;\n}\n"],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/link/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACjG,OAAO,EACH,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,SAAS,EACT,YAAY,EACZ,WAAW,EACX,WAAW,EACX,MAAM,GACT,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { LinkValue } from '@panneau/protocol';
|
|
2
|
+
import { type LinkNewTab } from '@panneau/protocol/runtime';
|
|
3
|
+
export type { LinkValue };
|
|
4
|
+
/** A page of a link: its id, its resource, and its label. */
|
|
5
|
+
export interface LinkPage {
|
|
6
|
+
id: string;
|
|
7
|
+
resource?: string;
|
|
8
|
+
label?: string;
|
|
9
|
+
}
|
|
10
|
+
/** Whether a value is a link: an object with a `type`. */
|
|
11
|
+
export declare function isLink(value: unknown): value is LinkValue;
|
|
12
|
+
/** The page of a link, as a reference: an id alone (`"12"`) has no label. */
|
|
13
|
+
export declare function getLinkPage(link: LinkValue | null | undefined): LinkPage | null;
|
|
14
|
+
/** The label of a link in a locale: that locale's, the first filled one, or a string label. */
|
|
15
|
+
export declare function getLinkLabel(link: LinkValue | null | undefined, locale?: string): string | null;
|
|
16
|
+
/**
|
|
17
|
+
* What a link shows: its label in the locale, or the label of its page, or its URL without its
|
|
18
|
+
* scheme (`example.com`, `info@example.com`, `+15145550199`).
|
|
19
|
+
*/
|
|
20
|
+
export declare function getLinkText(link: LinkValue | null | undefined, locale?: string): string | null;
|
|
21
|
+
/**
|
|
22
|
+
* A link with the parts of its type only (`url`, or `page`, or `file`), its label when it has one,
|
|
23
|
+
* and its `newTab` as the setting sets it. `null` when the link is of the first type of its field,
|
|
24
|
+
* without a URL, a page, a file or a label.
|
|
25
|
+
*/
|
|
26
|
+
export declare function cleanLink(link: LinkValue, { newTab, defaultType }: {
|
|
27
|
+
newTab: LinkNewTab;
|
|
28
|
+
defaultType: string | undefined;
|
|
29
|
+
}): LinkValue | null;
|
|
30
|
+
//# sourceMappingURL=link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/link/link.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,KAAK,UAAU,EAAqB,MAAM,2BAA2B,CAAC;AAE/E,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B,6DAA6D;AAC7D,MAAM,WAAW,QAAQ;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,0DAA0D;AAC1D,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAOzD;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,CAY/E;AAED,+FAA+F;AAC/F,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkB/F;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAa9F;AAYD;;;;GAIG;AACH,wBAAgB,SAAS,CACrB,IAAI,EAAE,SAAS,EACf,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACjF,SAAS,GAAG,IAAI,CAiBlB"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { resolveLinkNewTab } from "@panneau/protocol/runtime";
|
|
2
|
+
//#region src/link/link.ts
|
|
3
|
+
/** Whether a value is a link: an object with a `type`. */
|
|
4
|
+
function isLink(value) {
|
|
5
|
+
return value !== null && typeof value === "object" && !Array.isArray(value) && typeof value.type === "string";
|
|
6
|
+
}
|
|
7
|
+
/** The page of a link, as a reference: an id alone (`"12"`) has no label. */
|
|
8
|
+
function getLinkPage(link) {
|
|
9
|
+
const page = link?.page;
|
|
10
|
+
if (typeof page === "string") return page !== "" ? { id: page } : null;
|
|
11
|
+
return page !== void 0 && page !== null && typeof page.id === "string" ? {
|
|
12
|
+
id: page.id,
|
|
13
|
+
...typeof page.resource === "string" ? { resource: page.resource } : {},
|
|
14
|
+
...typeof page.label === "string" ? { label: page.label } : {}
|
|
15
|
+
} : null;
|
|
16
|
+
}
|
|
17
|
+
/** The label of a link in a locale: that locale's, the first filled one, or a string label. */
|
|
18
|
+
function getLinkLabel(link, locale) {
|
|
19
|
+
const label = link?.label;
|
|
20
|
+
if (typeof label === "string") return label.trim() !== "" ? label : null;
|
|
21
|
+
if (label === null || label === void 0) return null;
|
|
22
|
+
const language = locale?.split("-")[0];
|
|
23
|
+
const own = (locale !== void 0 ? label[locale] : void 0) ?? (language !== void 0 ? label[language] : void 0);
|
|
24
|
+
if (typeof own === "string" && own.trim() !== "") return own;
|
|
25
|
+
return Object.values(label).find((text) => typeof text === "string" && text.trim() !== "") ?? null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* What a link shows: its label in the locale, or the label of its page, or its URL without its
|
|
29
|
+
* scheme (`example.com`, `info@example.com`, `+15145550199`).
|
|
30
|
+
*/
|
|
31
|
+
function getLinkText(link, locale) {
|
|
32
|
+
const label = getLinkLabel(link, locale);
|
|
33
|
+
if (label !== null) return label;
|
|
34
|
+
const page = getLinkPage(link);
|
|
35
|
+
if (page !== null) return page.label ?? page.id;
|
|
36
|
+
const url = link?.url;
|
|
37
|
+
return typeof url === "string" && url !== "" ? url.replace(/^(https?:\/\/|mailto:|tel:)/i, "").replace(/\/$/, "") : null;
|
|
38
|
+
}
|
|
39
|
+
function isEmptyLabel(label) {
|
|
40
|
+
if (label === null || label === void 0) return true;
|
|
41
|
+
if (typeof label === "string") return label.trim() === "";
|
|
42
|
+
return !Object.values(label).some((text) => typeof text === "string" && text.trim() !== "");
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* A link with the parts of its type only (`url`, or `page`, or `file`), its label when it has one,
|
|
46
|
+
* and its `newTab` as the setting sets it. `null` when the link is of the first type of its field,
|
|
47
|
+
* without a URL, a page, a file or a label.
|
|
48
|
+
*/
|
|
49
|
+
function cleanLink(link, { newTab, defaultType }) {
|
|
50
|
+
const { type } = link;
|
|
51
|
+
const next = { type };
|
|
52
|
+
if (type === "page" || type === "file") {
|
|
53
|
+
const target = link[type];
|
|
54
|
+
if (target !== void 0 && target !== null && target !== "") next[type] = target;
|
|
55
|
+
} else if (typeof link.url === "string" && link.url !== "") next.url = link.url;
|
|
56
|
+
if (!isEmptyLabel(link.label)) next.label = link.label ?? null;
|
|
57
|
+
next.newTab = resolveLinkNewTab(newTab, link);
|
|
58
|
+
return next.url === void 0 && next.page === void 0 && next.file === void 0 && next.label === void 0 && type === defaultType ? null : next;
|
|
59
|
+
}
|
|
60
|
+
//#endregion
|
|
61
|
+
export { cleanLink, getLinkLabel, getLinkPage, getLinkText, isLink };
|
|
62
|
+
|
|
63
|
+
//# sourceMappingURL=link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.js","names":["LinkValue","LinkNewTab","resolveLinkNewTab","LinkPage","id","resource","label","isLink","value","Array","isArray","type","getLinkPage","link","page","undefined","getLinkLabel","locale","trim","language","split","own","Object","values","find","text","getLinkText","url","replace","isEmptyLabel","some","cleanLink","newTab","defaultType","next","target","empty","file"],"sources":["../../src/link/link.ts"],"sourcesContent":["import type { LinkValue } from '@panneau/protocol';\nimport { type LinkNewTab, resolveLinkNewTab } from '@panneau/protocol/runtime';\n\nexport type { LinkValue };\n\n/** A page of a link: its id, its resource, and its label. */\nexport interface LinkPage {\n id: string;\n resource?: string;\n label?: string;\n}\n\n/** Whether a value is a link: an object with a `type`. */\nexport function isLink(value: unknown): value is LinkValue {\n return (\n value !== null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n typeof (value as { type?: unknown }).type === 'string'\n );\n}\n\n/** The page of a link, as a reference: an id alone (`\"12\"`) has no label. */\nexport function getLinkPage(link: LinkValue | null | undefined): LinkPage | null {\n const page = link?.page;\n if (typeof page === 'string') {\n return page !== '' ? { id: page } : null;\n }\n return page !== undefined && page !== null && typeof page.id === 'string'\n ? {\n id: page.id,\n ...(typeof page.resource === 'string' ? { resource: page.resource } : {}),\n ...(typeof page.label === 'string' ? { label: page.label } : {}),\n }\n : null;\n}\n\n/** The label of a link in a locale: that locale's, the first filled one, or a string label. */\nexport function getLinkLabel(link: LinkValue | null | undefined, locale?: string): string | null {\n const label = link?.label;\n if (typeof label === 'string') {\n return label.trim() !== '' ? label : null;\n }\n if (label === null || label === undefined) {\n return null;\n }\n const language = locale?.split('-')[0];\n const own =\n (locale !== undefined ? label[locale] : undefined) ??\n (language !== undefined ? label[language] : undefined);\n if (typeof own === 'string' && own.trim() !== '') {\n return own;\n }\n return (\n Object.values(label).find((text) => typeof text === 'string' && text.trim() !== '') ?? null\n );\n}\n\n/**\n * What a link shows: its label in the locale, or the label of its page, or its URL without its\n * scheme (`example.com`, `info@example.com`, `+15145550199`).\n */\nexport function getLinkText(link: LinkValue | null | undefined, locale?: string): string | null {\n const label = getLinkLabel(link, locale);\n if (label !== null) {\n return label;\n }\n const page = getLinkPage(link);\n if (page !== null) {\n return page.label ?? page.id;\n }\n const url = link?.url;\n return typeof url === 'string' && url !== ''\n ? url.replace(/^(https?:\\/\\/|mailto:|tel:)/i, '').replace(/\\/$/, '')\n : null;\n}\n\nfunction isEmptyLabel(label: LinkValue['label']): boolean {\n if (label === null || label === undefined) {\n return true;\n }\n if (typeof label === 'string') {\n return label.trim() === '';\n }\n return !Object.values(label).some((text) => typeof text === 'string' && text.trim() !== '');\n}\n\n/**\n * A link with the parts of its type only (`url`, or `page`, or `file`), its label when it has one,\n * and its `newTab` as the setting sets it. `null` when the link is of the first type of its field,\n * without a URL, a page, a file or a label.\n */\nexport function cleanLink(\n link: LinkValue,\n { newTab, defaultType }: { newTab: LinkNewTab; defaultType: string | undefined },\n): LinkValue | null {\n const { type } = link;\n const next: LinkValue = { type };\n if (type === 'page' || type === 'file') {\n const target = link[type];\n if (target !== undefined && target !== null && target !== '') {\n next[type] = target as never;\n }\n } else if (typeof link.url === 'string' && link.url !== '') {\n next.url = link.url;\n }\n if (!isEmptyLabel(link.label)) {\n next.label = link.label ?? null;\n }\n next.newTab = resolveLinkNewTab(newTab, link);\n const empty = next.url === undefined && next.page === undefined && next.file === undefined;\n return empty && next.label === undefined && type === defaultType ? null : next;\n}\n"],"mappings":";;;AAaA,SAAgBO,OAAOC,OAAoC;CACvD,OACIA,UAAU,QACV,OAAOA,UAAU,YACjB,CAACC,MAAMC,QAAQF,KAAK,KACpB,OAAQA,MAA6BG,SAAS;AAEtD;;AAGA,SAAgBC,YAAYC,MAAqD;CAC7E,MAAMC,OAAOD,MAAMC;CACnB,IAAI,OAAOA,SAAS,UAChB,OAAOA,SAAS,KAAK,EAAEV,IAAIU,KAAK,IAAI;CAExC,OAAOA,SAASC,KAAAA,KAAaD,SAAS,QAAQ,OAAOA,KAAKV,OAAO,WAC3D;EACIA,IAAIU,KAAKV;EACT,GAAI,OAAOU,KAAKT,aAAa,WAAW,EAAEA,UAAUS,KAAKT,SAAS,IAAI,CAAC;EACvE,GAAI,OAAOS,KAAKR,UAAU,WAAW,EAAEA,OAAOQ,KAAKR,MAAM,IAAI,CAAC;CAClE,IACA;AACV;;AAGA,SAAgBU,aAAaH,MAAoCI,QAAgC;CAC7F,MAAMX,QAAQO,MAAMP;CACpB,IAAI,OAAOA,UAAU,UACjB,OAAOA,MAAMY,KAAK,MAAM,KAAKZ,QAAQ;CAEzC,IAAIA,UAAU,QAAQA,UAAUS,KAAAA,GAC5B,OAAO;CAEX,MAAMI,WAAWF,QAAQG,MAAM,GAAG,CAAC,CAAC;CACpC,MAAMC,OACDJ,WAAWF,KAAAA,IAAYT,MAAMW,UAAUF,KAAAA,OACvCI,aAAaJ,KAAAA,IAAYT,MAAMa,YAAYJ,KAAAA;CAChD,IAAI,OAAOM,QAAQ,YAAYA,IAAIH,KAAK,MAAM,IAC1C,OAAOG;CAEX,OACIC,OAAOC,OAAOjB,KAAK,CAAC,CAACkB,MAAMC,SAAS,OAAOA,SAAS,YAAYA,KAAKP,KAAK,MAAM,EAAE,KAAK;AAE/F;;;;;AAMA,SAAgBQ,YAAYb,MAAoCI,QAAgC;CAC5F,MAAMX,QAAQU,aAAaH,MAAMI,MAAM;CACvC,IAAIX,UAAU,MACV,OAAOA;CAEX,MAAMQ,OAAOF,YAAYC,IAAI;CAC7B,IAAIC,SAAS,MACT,OAAOA,KAAKR,SAASQ,KAAKV;CAE9B,MAAMuB,MAAMd,MAAMc;CAClB,OAAO,OAAOA,QAAQ,YAAYA,QAAQ,KACpCA,IAAIC,QAAQ,gCAAgC,EAAE,CAAC,CAACA,QAAQ,OAAO,EAAE,IACjE;AACV;AAEA,SAASC,aAAavB,OAAoC;CACtD,IAAIA,UAAU,QAAQA,UAAUS,KAAAA,GAC5B,OAAO;CAEX,IAAI,OAAOT,UAAU,UACjB,OAAOA,MAAMY,KAAK,MAAM;CAE5B,OAAO,CAACI,OAAOC,OAAOjB,KAAK,CAAC,CAACwB,MAAML,SAAS,OAAOA,SAAS,YAAYA,KAAKP,KAAK,MAAM,EAAE;AAC9F;;;;;;AAOA,SAAgBa,UACZlB,MACA,EAAEmB,QAAQC,eACM;CAChB,MAAM,EAAEtB,SAASE;CACjB,MAAMqB,OAAkB,EAAEvB,KAAK;CAC/B,IAAIA,SAAS,UAAUA,SAAS,QAAQ;EACpC,MAAMwB,SAAStB,KAAKF;EACpB,IAAIwB,WAAWpB,KAAAA,KAAaoB,WAAW,QAAQA,WAAW,IACtDD,KAAKvB,QAAQwB;CAErB,OAAO,IAAI,OAAOtB,KAAKc,QAAQ,YAAYd,KAAKc,QAAQ,IACpDO,KAAKP,MAAMd,KAAKc;CAEpB,IAAI,CAACE,aAAahB,KAAKP,KAAK,GACxB4B,KAAK5B,QAAQO,KAAKP,SAAS;CAE/B4B,KAAKF,SAAS9B,kBAAkB8B,QAAQnB,IAAI;CAE5C,OADcqB,KAAKP,QAAQZ,KAAAA,KAAamB,KAAKpB,SAASC,KAAAA,KAAamB,KAAKG,SAAStB,KAAAA,KACjEmB,KAAK5B,UAAUS,KAAAA,KAAaJ,SAASsB,cAAc,OAAOC;AAC9E"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { RelationReference, RelationSource } from '../shared/relation.js';
|
|
2
|
+
/** A page found: its reference, and its resource. */
|
|
3
|
+
export interface FoundPage extends RelationReference {
|
|
4
|
+
resource: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* The pages of several resources that match a text, as it is typed: the results of each resource,
|
|
8
|
+
* in the order of the resources.
|
|
9
|
+
*/
|
|
10
|
+
export declare function usePageSearch(source: RelationSource | null, resources: readonly string[], query: string, { enabled, delay }?: {
|
|
11
|
+
enabled?: boolean;
|
|
12
|
+
delay?: number;
|
|
13
|
+
}): {
|
|
14
|
+
items: FoundPage[];
|
|
15
|
+
isLoading: boolean;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=pages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../src/link/pages.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE5E,qDAAqD;AACrD,MAAM,WAAW,SAAU,SAAQ,iBAAiB;IAChD,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CACzB,MAAM,EAAE,cAAc,GAAG,IAAI,EAC7B,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,KAAK,EAAE,MAAM,EACb,EAAE,OAAc,EAAE,KAAW,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5E;IAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAqC5C"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { c } from "react/compiler-runtime";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
//#region src/link/pages.ts
|
|
4
|
+
/**
|
|
5
|
+
* The pages of several resources that match a text, as it is typed: the results of each resource,
|
|
6
|
+
* in the order of the resources.
|
|
7
|
+
*/
|
|
8
|
+
function usePageSearch(source, resources, query, t0) {
|
|
9
|
+
const $ = c(14);
|
|
10
|
+
let t1;
|
|
11
|
+
if ($[0] !== t0) {
|
|
12
|
+
t1 = t0 === void 0 ? {} : t0;
|
|
13
|
+
$[0] = t0;
|
|
14
|
+
$[1] = t1;
|
|
15
|
+
} else t1 = $[1];
|
|
16
|
+
const { enabled: t2, delay: t3 } = t1;
|
|
17
|
+
const enabled = t2 === void 0 ? true : t2;
|
|
18
|
+
const delay = t3 === void 0 ? 250 : t3;
|
|
19
|
+
let t4;
|
|
20
|
+
if ($[2] !== resources) {
|
|
21
|
+
t4 = resources.join("\0");
|
|
22
|
+
$[2] = resources;
|
|
23
|
+
$[3] = t4;
|
|
24
|
+
} else t4 = $[3];
|
|
25
|
+
const key = `${t4}\u0001${query}`;
|
|
26
|
+
let t5;
|
|
27
|
+
if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
|
|
28
|
+
t5 = {
|
|
29
|
+
key: "",
|
|
30
|
+
items: [],
|
|
31
|
+
isLoading: false
|
|
32
|
+
};
|
|
33
|
+
$[4] = t5;
|
|
34
|
+
} else t5 = $[4];
|
|
35
|
+
const [state, setState] = useState(t5);
|
|
36
|
+
let t6;
|
|
37
|
+
let t7;
|
|
38
|
+
if ($[5] !== delay || $[6] !== enabled || $[7] !== key || $[8] !== source) {
|
|
39
|
+
t6 = () => {
|
|
40
|
+
if (source === null || !enabled) return;
|
|
41
|
+
const controller = new AbortController();
|
|
42
|
+
const timer = setTimeout(() => {
|
|
43
|
+
setState((current) => ({
|
|
44
|
+
...current,
|
|
45
|
+
key,
|
|
46
|
+
isLoading: true
|
|
47
|
+
}));
|
|
48
|
+
const [t8, t9] = key.split("");
|
|
49
|
+
const joined = t8 === void 0 ? "" : t8;
|
|
50
|
+
const text = t9 === void 0 ? "" : t9;
|
|
51
|
+
Promise.all(joined.split("\0").map((resource) => source.search(resource, text, { signal: controller.signal }).then((items) => items.map((item) => ({
|
|
52
|
+
...item,
|
|
53
|
+
resource
|
|
54
|
+
}))).catch(_temp))).then((lists) => {
|
|
55
|
+
if (!controller.signal.aborted) setState({
|
|
56
|
+
key,
|
|
57
|
+
items: lists.flat(),
|
|
58
|
+
isLoading: false
|
|
59
|
+
});
|
|
60
|
+
}).catch(_temp2);
|
|
61
|
+
}, delay);
|
|
62
|
+
return () => {
|
|
63
|
+
clearTimeout(timer);
|
|
64
|
+
controller.abort();
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
t7 = [
|
|
68
|
+
source,
|
|
69
|
+
key,
|
|
70
|
+
enabled,
|
|
71
|
+
delay
|
|
72
|
+
];
|
|
73
|
+
$[5] = delay;
|
|
74
|
+
$[6] = enabled;
|
|
75
|
+
$[7] = key;
|
|
76
|
+
$[8] = source;
|
|
77
|
+
$[9] = t6;
|
|
78
|
+
$[10] = t7;
|
|
79
|
+
} else {
|
|
80
|
+
t6 = $[9];
|
|
81
|
+
t7 = $[10];
|
|
82
|
+
}
|
|
83
|
+
useEffect(t6, t7);
|
|
84
|
+
const t8 = state.isLoading || state.key !== key;
|
|
85
|
+
let t9;
|
|
86
|
+
if ($[11] !== state.items || $[12] !== t8) {
|
|
87
|
+
t9 = {
|
|
88
|
+
items: state.items,
|
|
89
|
+
isLoading: t8
|
|
90
|
+
};
|
|
91
|
+
$[11] = state.items;
|
|
92
|
+
$[12] = t8;
|
|
93
|
+
$[13] = t9;
|
|
94
|
+
} else t9 = $[13];
|
|
95
|
+
return t9;
|
|
96
|
+
}
|
|
97
|
+
function _temp2() {}
|
|
98
|
+
function _temp() {
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
//#endregion
|
|
102
|
+
export { usePageSearch };
|
|
103
|
+
|
|
104
|
+
//# sourceMappingURL=pages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pages.js","names":["useEffect","useState","RelationReference","RelationSource","FoundPage","resource","usePageSearch","source","resources","query","t0","$","_c","t1","undefined","enabled","t2","delay","t3","t4","join","key","t5","Symbol","for","items","isLoading","state","setState","t6","t7","controller","AbortController","timer","setTimeout","current","t8","t9","split","joined","text","Promise","all","map","search","signal","then","item","catch","_temp","lists","aborted","flat","_temp2","clearTimeout","abort","_c"],"sources":["../../src/link/pages.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { RelationReference, RelationSource } from '../shared/relation';\n\n/** A page found: its reference, and its resource. */\nexport interface FoundPage extends RelationReference {\n resource: string;\n}\n\n/**\n * The pages of several resources that match a text, as it is typed: the results of each resource,\n * in the order of the resources.\n */\nexport function usePageSearch(\n source: RelationSource | null,\n resources: readonly string[],\n query: string,\n { enabled = true, delay = 250 }: { enabled?: boolean; delay?: number } = {},\n): { items: FoundPage[]; isLoading: boolean } {\n const key = `${resources.join('\\u0000')}\\u0001${query}`;\n const [state, setState] = useState<{ key: string; items: FoundPage[]; isLoading: boolean }>({\n key: '',\n items: [],\n isLoading: false,\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 // The resources and the query, from the key that stands for them\n const [joined = '', text = ''] = key.split('\\u0001');\n Promise.all(\n joined.split('\\u0000').map((resource) =>\n source\n .search(resource, text, { signal: controller.signal })\n .then((items) => items.map((item) => ({ ...item, resource })))\n .catch(() => [] as FoundPage[]),\n ),\n )\n .then((lists) => {\n if (!controller.signal.aborted) {\n setState({ key, items: lists.flat(), isLoading: false });\n }\n })\n .catch(() => undefined);\n }, delay);\n return () => {\n clearTimeout(timer);\n controller.abort();\n };\n }, [source, key, enabled, delay]);\n return { items: state.items, isLoading: state.isLoading || state.key !== key };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocationField.d.ts","sourceRoot":"","sources":["../../src/location/LocationField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAavD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"LocationField.d.ts","sourceRoot":"","sources":["../../src/location/LocationField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAavD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AAExD,OAAO,KAAK,EAAmB,eAAe,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE1E,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,kFAAkF;AAClF,eAAO,MAAM,qBAAqB,EAAE,QAKnC,CAAC;AAIF,MAAM,WAAW,kBAAmB,SAAQ,UAAU,CAAC,aAAa,CAAC;IACjE,gGAAgG;IAChG,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,2FAA2F;IAC3F,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,wEAAwE;IACxE,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,kCAAkC;AAClC,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAOjE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,MAAM,EACN,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,SAAS,EAChB,MAAuB,EACvB,IAAS,EACT,KAAK,EACL,WAAW,EACX,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,SAAS,GACZ,EAAE,kBAAkB,+BA0KpB;AAMD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,+BAwBxD"}
|
|
@@ -3,9 +3,10 @@ import { getFieldProps, getSetting, isNumber, isString } from "../shared/entry.j
|
|
|
3
3
|
import { messages } from "../shared/messages.js";
|
|
4
4
|
import LocationField_module_default from "./LocationField.module.js";
|
|
5
5
|
import { LocationMap } from "./LocationMap.js";
|
|
6
|
+
import { useAddressSearch } from "./search.js";
|
|
6
7
|
import { c } from "react/compiler-runtime";
|
|
7
8
|
import { X } from "lucide-react";
|
|
8
|
-
import {
|
|
9
|
+
import { useRef, useState } from "react";
|
|
9
10
|
import { ComboBox, Fieldset, IconButton, NumberInput, TextInput, usePanneauIntl } from "@panneau/ui";
|
|
10
11
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
11
12
|
//#region src/location/LocationField.tsx
|
|
@@ -15,8 +16,6 @@ var OPEN_STREET_MAP_TILES = {
|
|
|
15
16
|
attribution: "© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors",
|
|
16
17
|
maxZoom: 19
|
|
17
18
|
};
|
|
18
|
-
var SEARCH_DELAY = 400;
|
|
19
|
-
var SEARCH_MIN_LENGTH = 3;
|
|
20
19
|
var DEFAULT_CENTER = {
|
|
21
20
|
lat: 20,
|
|
22
21
|
lng: 0
|
|
@@ -25,86 +24,11 @@ var DEFAULT_CENTER = {
|
|
|
25
24
|
function isLocation(value) {
|
|
26
25
|
return value !== null && typeof value === "object" && isNumber(value.lat) && isNumber(value.lng);
|
|
27
26
|
}
|
|
28
|
-
/** The search of addresses: results of the text typed, after a pause. */
|
|
29
|
-
function useAddressSearch(geocoding, query, locale) {
|
|
30
|
-
const $ = c(9);
|
|
31
|
-
let t0;
|
|
32
|
-
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
|
|
33
|
-
t0 = {
|
|
34
|
-
query: "",
|
|
35
|
-
results: [],
|
|
36
|
-
loading: false
|
|
37
|
-
};
|
|
38
|
-
$[0] = t0;
|
|
39
|
-
} else t0 = $[0];
|
|
40
|
-
const [state, setState] = useState(t0);
|
|
41
|
-
let t1;
|
|
42
|
-
let t2;
|
|
43
|
-
if ($[1] !== geocoding || $[2] !== locale || $[3] !== query) {
|
|
44
|
-
t1 = () => {
|
|
45
|
-
const text = query.trim();
|
|
46
|
-
if (geocoding === null || text.length < SEARCH_MIN_LENGTH) return;
|
|
47
|
-
const controller = new AbortController();
|
|
48
|
-
const timeout = window.setTimeout(() => {
|
|
49
|
-
setState(_temp);
|
|
50
|
-
geocoding.search(text, {
|
|
51
|
-
signal: controller.signal,
|
|
52
|
-
locale
|
|
53
|
-
}).then((results) => setState({
|
|
54
|
-
query: text,
|
|
55
|
-
results,
|
|
56
|
-
loading: false
|
|
57
|
-
})).catch(() => {
|
|
58
|
-
if (!controller.signal.aborted) setState({
|
|
59
|
-
query: text,
|
|
60
|
-
results: [],
|
|
61
|
-
loading: false
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
}, SEARCH_DELAY);
|
|
65
|
-
return () => {
|
|
66
|
-
window.clearTimeout(timeout);
|
|
67
|
-
controller.abort();
|
|
68
|
-
};
|
|
69
|
-
};
|
|
70
|
-
t2 = [
|
|
71
|
-
geocoding,
|
|
72
|
-
query,
|
|
73
|
-
locale
|
|
74
|
-
];
|
|
75
|
-
$[1] = geocoding;
|
|
76
|
-
$[2] = locale;
|
|
77
|
-
$[3] = query;
|
|
78
|
-
$[4] = t1;
|
|
79
|
-
$[5] = t2;
|
|
80
|
-
} else {
|
|
81
|
-
t1 = $[4];
|
|
82
|
-
t2 = $[5];
|
|
83
|
-
}
|
|
84
|
-
useEffect(t1, t2);
|
|
85
|
-
let t3;
|
|
86
|
-
if ($[6] !== query || $[7] !== state) {
|
|
87
|
-
t3 = query.trim().length >= SEARCH_MIN_LENGTH ? state : {
|
|
88
|
-
...state,
|
|
89
|
-
results: []
|
|
90
|
-
};
|
|
91
|
-
$[6] = query;
|
|
92
|
-
$[7] = state;
|
|
93
|
-
$[8] = t3;
|
|
94
|
-
} else t3 = $[8];
|
|
95
|
-
return t3;
|
|
96
|
-
}
|
|
97
27
|
/**
|
|
98
28
|
* A point on a map, and its address. Clicking the map or dragging the marker places the point,
|
|
99
29
|
* and its latitude and longitude can be typed. With an address search, a place found sets the
|
|
100
30
|
* point and the address; with a reverse search, placing a point fills an empty address.
|
|
101
31
|
*/
|
|
102
|
-
function _temp(current) {
|
|
103
|
-
return {
|
|
104
|
-
...current,
|
|
105
|
-
loading: true
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
32
|
function LocationField(t0) {
|
|
109
33
|
const $ = c(100);
|
|
110
34
|
const { value, onChange, onBlur, geocoding: geocodingProp, tiles: tilesProp, center: t1, zoom: t2, label, description, errors, disabled, readOnly, required, className } = t0;
|
|
@@ -174,7 +98,7 @@ function LocationField(t0) {
|
|
|
174
98
|
...next,
|
|
175
99
|
address: place.label
|
|
176
100
|
});
|
|
177
|
-
}).catch(
|
|
101
|
+
}).catch(_temp);
|
|
178
102
|
}
|
|
179
103
|
};
|
|
180
104
|
$[9] = geocoding;
|
|
@@ -220,10 +144,10 @@ function LocationField(t0) {
|
|
|
220
144
|
"aria-label": intl.formatMessage(messages.searchAddress),
|
|
221
145
|
placeholder: intl.formatMessage(messages.searchAddress),
|
|
222
146
|
onInputChange: setQuery,
|
|
223
|
-
items: places.map(
|
|
147
|
+
items: places.map(_temp2),
|
|
224
148
|
isLoading: search.loading,
|
|
225
149
|
menuTrigger: "input",
|
|
226
|
-
emptyMessage: query.trim().length <
|
|
150
|
+
emptyMessage: query.trim().length < 3 ? intl.formatMessage(messages.searchAddressHint, { count: 3 }) : intl.formatMessage(messages.noPlaces),
|
|
227
151
|
value: chosen !== null && query === chosen.label ? "0" : null,
|
|
228
152
|
onChange: (id) => {
|
|
229
153
|
const result_0 = id !== null ? places[Number(id)] : void 0;
|
|
@@ -464,13 +388,13 @@ function LocationField(t0) {
|
|
|
464
388
|
} else t30 = $[99];
|
|
465
389
|
return t30;
|
|
466
390
|
}
|
|
467
|
-
function
|
|
391
|
+
function _temp2(result, index) {
|
|
468
392
|
return {
|
|
469
393
|
id: String(index),
|
|
470
394
|
label: result.label
|
|
471
395
|
};
|
|
472
396
|
}
|
|
473
|
-
function
|
|
397
|
+
function _temp() {}
|
|
474
398
|
function isPoint(value) {
|
|
475
399
|
return isLocation(value);
|
|
476
400
|
}
|
|
@@ -497,7 +421,7 @@ function LocationFieldEntry(props) {
|
|
|
497
421
|
const center = t1;
|
|
498
422
|
let t2;
|
|
499
423
|
if ($[4] !== field) {
|
|
500
|
-
t2 = getSetting(field, "tiles",
|
|
424
|
+
t2 = getSetting(field, "tiles", _temp3);
|
|
501
425
|
$[4] = field;
|
|
502
426
|
$[5] = t2;
|
|
503
427
|
} else t2 = $[5];
|
|
@@ -554,7 +478,7 @@ function LocationFieldEntry(props) {
|
|
|
554
478
|
} else t8 = $[22];
|
|
555
479
|
return t8;
|
|
556
480
|
}
|
|
557
|
-
function
|
|
481
|
+
function _temp3(value) {
|
|
558
482
|
return value !== null && typeof value === "object" && isString(value.url) && isString(value.attribution);
|
|
559
483
|
}
|
|
560
484
|
//#endregion
|