@panneau/fields 5.0.0-alpha.6 → 5.0.0-alpha.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/boolean/BooleanField.d.ts +1 -1
- package/dist/boolean/BooleanField.js +78 -17
- package/dist/boolean/BooleanField.js.map +1 -1
- package/dist/boolean/index.d.ts +1 -1
- package/dist/color/ColorField.d.ts +2 -2
- package/dist/color/ColorField.js.map +1 -1
- package/dist/color/index.d.ts +1 -1
- package/dist/date/DateField.d.ts +1 -1
- package/dist/date/DateField.js.map +1 -1
- package/dist/date/index.d.ts +1 -1
- package/dist/datetime/DateTimeField.d.ts +1 -1
- package/dist/datetime/DateTimeField.js +107 -20
- package/dist/datetime/DateTimeField.js.map +1 -1
- package/dist/datetime/index.d.ts +1 -1
- package/dist/duration/DurationField.d.ts +1 -1
- package/dist/duration/DurationField.js +126 -41
- package/dist/duration/DurationField.js.map +1 -1
- package/dist/duration/index.d.ts +1 -1
- package/dist/email/EmailField.d.ts +2 -2
- package/dist/email/EmailField.js.map +1 -1
- package/dist/email/index.d.ts +1 -1
- package/dist/embed/EmbedField.d.ts +2 -2
- package/dist/embed/EmbedField.js +185 -69
- package/dist/embed/EmbedField.js.map +1 -1
- package/dist/embed/index.d.ts +2 -2
- package/dist/file/FileField.d.ts +2 -2
- package/dist/file/FileField.d.ts.map +1 -1
- package/dist/file/FileField.js +167 -77
- package/dist/file/FileField.js.map +1 -1
- package/dist/file/index.d.ts +2 -2
- package/dist/group/GroupField.d.ts +1 -1
- package/dist/group/GroupField.js.map +1 -1
- package/dist/group/index.d.ts +1 -1
- package/dist/index.d.ts +18 -18
- package/dist/json/JsonField.d.ts +1 -1
- package/dist/json/JsonField.js +104 -22
- package/dist/json/JsonField.js.map +1 -1
- package/dist/json/index.d.ts +1 -1
- package/dist/locales/index.js.map +1 -1
- package/dist/localized/LocalizedField.d.ts +1 -1
- package/dist/localized/LocalizedField.js.map +1 -1
- package/dist/localized/index.d.ts +1 -1
- package/dist/location/LocationField.d.ts +3 -3
- package/dist/location/LocationField.d.ts.map +1 -1
- package/dist/location/LocationField.js +351 -138
- package/dist/location/LocationField.js.map +1 -1
- package/dist/location/LocationMap.d.ts +1 -1
- package/dist/location/LocationMap.d.ts.map +1 -1
- package/dist/location/LocationMap.js +155 -65
- package/dist/location/LocationMap.js.map +1 -1
- package/dist/location/index.d.ts +4 -4
- package/dist/location/leafletCss.js.map +1 -1
- package/dist/location/nominatim.d.ts +1 -1
- package/dist/location/nominatim.js.map +1 -1
- package/dist/missing/MissingField.d.ts +4 -3
- package/dist/missing/MissingField.d.ts.map +1 -1
- package/dist/missing/MissingField.js +3 -2
- package/dist/missing/MissingField.js.map +1 -1
- package/dist/number/NumberField.d.ts +1 -1
- package/dist/number/NumberField.js.map +1 -1
- package/dist/number/index.d.ts +1 -1
- package/dist/range/RangeField.d.ts +1 -1
- package/dist/range/RangeField.js +82 -11
- package/dist/range/RangeField.js.map +1 -1
- package/dist/range/index.d.ts +1 -1
- package/dist/relation/RelationField.d.ts +2 -2
- package/dist/relation/RelationField.js +485 -145
- package/dist/relation/RelationField.js.map +1 -1
- package/dist/relation/index.d.ts +2 -2
- package/dist/repeater/RepeaterField.d.ts +1 -1
- package/dist/repeater/RepeaterField.js +118 -34
- package/dist/repeater/RepeaterField.js.map +1 -1
- package/dist/repeater/index.d.ts +1 -1
- package/dist/select/SelectField.d.ts +1 -1
- package/dist/select/SelectField.js.map +1 -1
- package/dist/select/index.d.ts +1 -1
- package/dist/shared/DefinitionField.d.ts +1 -1
- package/dist/shared/DefinitionField.js.map +1 -1
- package/dist/shared/builtIn.d.ts +1 -1
- package/dist/shared/builtIn.js.map +1 -1
- package/dist/shared/check.js.map +1 -1
- package/dist/shared/context.d.ts +6 -6
- package/dist/shared/context.js.map +1 -1
- package/dist/shared/cx.js.map +1 -1
- package/dist/shared/dates.js.map +1 -1
- package/dist/shared/embed.js.map +1 -1
- package/dist/shared/entry.d.ts +1 -1
- package/dist/shared/entry.js.map +1 -1
- package/dist/shared/relation.js.map +1 -1
- package/dist/slug/SlugField.d.ts +2 -2
- package/dist/slug/SlugField.d.ts.map +1 -1
- package/dist/slug/SlugField.js +184 -36
- package/dist/slug/SlugField.js.map +1 -1
- package/dist/slug/index.d.ts +1 -1
- package/dist/tags/TagsField.d.ts +1 -1
- package/dist/tags/TagsField.js.map +1 -1
- package/dist/tags/index.d.ts +1 -1
- package/dist/tel/TelField.d.ts +2 -2
- package/dist/tel/TelField.js.map +1 -1
- package/dist/tel/index.d.ts +1 -1
- package/dist/text/TextField.d.ts +1 -1
- package/dist/text/TextField.js.map +1 -1
- package/dist/text/index.d.ts +1 -1
- package/dist/textarea/TextAreaField.d.ts +1 -1
- package/dist/textarea/TextAreaField.js.map +1 -1
- package/dist/textarea/index.d.ts +1 -1
- package/dist/time/TimeField.d.ts +1 -1
- package/dist/time/TimeField.js +64 -10
- package/dist/time/TimeField.js.map +1 -1
- package/dist/time/index.d.ts +1 -1
- package/dist/upload/FilePicker.js +107 -24
- package/dist/upload/FilePicker.js.map +1 -1
- package/dist/upload/UploadList.d.ts +1 -1
- package/dist/upload/UploadList.js.map +1 -1
- package/dist/upload/files.js.map +1 -1
- package/dist/upload/useRejectionMessage.d.ts +1 -1
- package/dist/upload/useRejectionMessage.js.map +1 -1
- package/dist/upload/useUploads.d.ts +1 -1
- package/dist/upload/useUploads.js.map +1 -1
- package/dist/uppy/index.d.ts +2 -2
- package/dist/uppy/uploader.d.ts +1 -1
- package/dist/uppy/uploader.js.map +1 -1
- package/dist/url/UrlField.d.ts +2 -2
- package/dist/url/UrlField.js +69 -14
- package/dist/url/UrlField.js.map +1 -1
- package/dist/url/index.d.ts +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SlugField.js","names":["check","next","onCheck","_c","styles"],"sources":["../../src/slug/SlugField.tsx"],"sourcesContent":["import { WandSparkles } from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\n\nimport type { FieldCheckResponse } from '@panneau/protocol';\nimport { Button, IconButton, usePanneauIntl } from '@panneau/ui';\n\nimport { useFieldsContext } from '../shared/context';\nimport { getFieldProps, getSetting, isString } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps } from '../shared/types';\nimport { TextField, type TextFieldProps } from '../text/TextField';\nimport styles from './SlugField.module.css';\n\n/**\n * Turns a text into a slug: lowercase ASCII letters and digits separated by dashes, without\n * accents (`Été à Montréal` gives `ete-a-montreal`).\n */\nexport function slugify(text: string): string {\n return text\n .normalize('NFKD')\n .replace(/[̀-ͯ]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\n/** Checks a slug with the backend: whether it is available, and its URL. */\nexport type SlugCheck = (\n value: string,\n options: { signal: AbortSignal },\n) => Promise<FieldCheckResponse>;\n\nexport interface SlugFieldProps extends Omit<TextFieldProps, 'type' | 'suffix'> {\n /**\n * The text the slug is made from (a title). While the slug is empty or still matches it, the\n * slug follows it.\n */\n source?: string | null;\n /** Name of the source, for the button that generates the slug from it. */\n sourceLabel?: string;\n /**\n * Checks the slug as it is typed, and once when the field shows: the field then shows the\n * URL the backend gives, and says when the slug is taken, with a free one to use instead.\n */\n onCheck?: SlugCheck | null;\n /** How long typing must pause before a check, in milliseconds. Defaults to 300. */\n checkDelay?: number;\n /**\n * What the check depends on besides the slug, such as the form's values: the slug is checked\n * again when it changes. `onCheck` itself can change on every render.\n */\n checkKey?: string;\n}\n\n/**\n * Checks a slug after a pause in typing, and keeps the latest answer for it. A check that\n * fails leaves the field as it is: saving still validates the slug.\n */\nfunction useSlugCheck(\n value: string,\n onCheck: SlugCheck | null | undefined,\n delay: number,\n key: string,\n): FieldCheckResponse | null {\n const [result, setResult] = useState<{ value: string; check: FieldCheckResponse } | null>(null);\n const latest = useRef(onCheck);\n useEffect(() => {\n latest.current = onCheck;\n });\n const enabled = onCheck !== null && onCheck !== undefined;\n useEffect(() => {\n if (!enabled || value === '') {\n return undefined;\n }\n const controller = new AbortController();\n const timer = setTimeout(() => {\n const check = latest.current;\n if (check === null || check === undefined) {\n return;\n }\n check(value, { signal: controller.signal })\n .then((check) => {\n if (!controller.signal.aborted) {\n setResult({ value, check });\n }\n })\n .catch(() => undefined);\n }, delay);\n return () => {\n clearTimeout(timer);\n controller.abort();\n };\n }, [value, enabled, delay, key]);\n return result !== null && result.value === value ? result.check : null;\n}\n\n/**\n * A slug for URLs. Typed text is cleaned up on blur. With a `source`, the slug follows it until\n * it is edited, and a button generates it again. With `onCheck`, the backend says whether the\n * slug is taken, and gives its URL.\n */\nexport function SlugField({\n value,\n onChange,\n onBlur,\n source,\n sourceLabel,\n onCheck,\n checkDelay = 300,\n checkKey = '',\n disabled,\n readOnly,\n prefix,\n errors,\n description,\n ...props\n}: SlugFieldProps) {\n const intl = usePanneauIntl();\n const previousSource = useRef(source);\n const check = useSlugCheck(value ?? '', onCheck, checkDelay, checkKey);\n const disabledByBackend = check?.disabled === true;\n const editable = disabled !== true && readOnly !== true && !disabledByBackend;\n\n useEffect(() => {\n const previous = previousSource.current;\n previousSource.current = source;\n if (!editable || source === previous || source === undefined) {\n return;\n }\n const current = value ?? '';\n if (current === '' || current === slugify(previous ?? '')) {\n const next = slugify(source ?? '');\n if (next !== current) {\n onChange?.(next === '' ? null : next);\n }\n }\n }, [source, value, onChange, editable]);\n\n const generated = slugify(source ?? '');\n const taken = check !== null && !check.available;\n const suggestion = taken && isString(check.suggestion) ? check.suggestion : null;\n const url = check !== null && isString(check.url) && !taken ? check.url : null;\n return (\n <TextField\n autoComplete=\"off\"\n {...props}\n value={value}\n onChange={onChange}\n disabled={disabled}\n readOnly={readOnly === true || disabledByBackend}\n {...(check !== null && isString(check.prefix)\n ? { prefix: check.prefix }\n : prefix !== undefined\n ? { prefix }\n : {})}\n {...(errors !== undefined ? { errors } : {})}\n description={\n taken || url !== null || description !== undefined ? (\n <span className={styles.description}>\n {description !== undefined ? <span>{description}</span> : null}\n {url !== null ? (\n <a href={url} target=\"_blank\" rel=\"noreferrer\" className={styles.url}>\n {url}\n </a>\n ) : null}\n {taken ? (\n <span className={styles.taken} role=\"status\">\n {intl.formatMessage(messages.slugTaken)}\n {suggestion !== null && editable ? (\n <Button\n size=\"sm\"\n appearance=\"ghost\"\n onPress={() => onChange?.(suggestion)}\n >\n {intl.formatMessage(messages.useSuggestion, {\n suggestion,\n })}\n </Button>\n ) : null}\n </span>\n ) : null}\n </span>\n ) : undefined\n }\n onBlur={() => {\n if (value !== null && value !== undefined) {\n const next = slugify(value);\n if (next !== value) {\n onChange?.(next === '' ? null : next);\n }\n }\n onBlur?.();\n }}\n suffix={\n source !== undefined && editable ? (\n <IconButton\n icon={WandSparkles}\n size=\"sm\"\n label={intl.formatMessage(messages.generateSlug, {\n field: sourceLabel ?? '',\n })}\n isDisabled={generated === '' || generated === value}\n onPress={() => onChange?.(generated === '' ? null : generated)}\n />\n ) : undefined\n }\n />\n );\n}\n\n/**\n * The text of a source value: the value itself, or for a localized value, its value in `locale`.\n * Without a locale, the first locale that has a value.\n */\nexport function sourceText(value: unknown, locale?: string): string | null {\n if (typeof value === 'string') {\n return value;\n }\n if (value !== null && typeof value === 'object') {\n const record = value as Record<string, unknown>;\n if (locale !== undefined) {\n const text = record[locale];\n return isString(text) ? text : null;\n }\n return Object.values(record).find(isString) ?? null;\n }\n return null;\n}\n\n/** The form's values that a check depends on: all but the slug itself. */\nfunction checkKeyOf(values: Record<string, unknown> | null, name: string): string {\n if (values === null) {\n return '';\n }\n const { [name]: _slug, ...others } = values;\n try {\n return JSON.stringify(others);\n } catch {\n return '';\n }\n}\n\n/**\n * The `slug` type: `from` names the field it follows, in the slug's own locale, or in the default\n * locale (the first of the fields context) for a slug that isn't localized. Setting `prefix`\n * shows a URL prefix. With `check`, the fields context's check source checks the slug of a field\n * at the top of the resource, with the form's values.\n */\nexport function SlugFieldEntry(props: FieldEntryProps) {\n const { field, parentValue, locale, path } = props;\n const { locales, checkSource } = useFieldsContext();\n const prefix = getSetting(field, 'prefix', isString);\n const values =\n parentValue !== null && typeof parentValue === 'object'\n ? (parentValue as Record<string, unknown>)\n : null;\n const source =\n field.from !== undefined && values !== null\n ? sourceText(values[field.from], locale ?? locales[0])\n : undefined;\n const topLevel = path === field.name || path === `${field.name}.${locale ?? ''}`;\n const onCheck: SlugCheck | null =\n field.check === true && checkSource !== null && topLevel\n ? (value, { signal }) =>\n checkSource.check(\n field.name,\n {\n value,\n ...(locale !== undefined ? { locale } : {}),\n values: values ?? {},\n },\n { signal },\n )\n : null;\n return (\n <SlugField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n onCheck={onCheck}\n checkKey={onCheck !== null ? checkKeyOf(values, field.name) : ''}\n {...(source !== undefined ? { source, sourceLabel: field.from ?? '' } : {})}\n {...(prefix !== undefined ? { prefix } : {})}\n />\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SlugField.js","names":["WandSparkles","useEffect","useRef","useState","FieldCheckResponse","Button","IconButton","usePanneauIntl","useFieldsContext","getFieldProps","getSetting","isString","messages","FieldEntryProps","TextField","TextFieldProps","styles","suggestionMessage","useSuggestion","slugify","text","normalize","replace","toLowerCase","SlugCheck","value","options","signal","AbortSignal","Promise","SlugFieldProps","Omit","source","sourceLabel","onCheck","checkDelay","checkKey","useSlugCheck","delay","key","$","_c","result","setResult","latest","t0","current","enabled","undefined","t1","controller","AbortController","timer","setTimeout","check","then","check_0","aborted","catch","_temp","clearTimeout","abort","t2","SlugField","description","disabled","errors","onBlur","onChange","prefix","props","readOnly","intl","previousSource","disabledByBackend","editable","t3","t4","previous","next","t5","t6","generated","taken","available","t7","suggestion","t8","url","t9","t10","t11","t12","formatMessage","slugTaken","t13","next_0","t14","generateSlug","field","t15","sourceText","locale","record","Record","Object","values","find","checkKeyOf","name","_slug","others","JSON","stringify","SlugFieldEntry","parentValue","path","locales","checkSource","from","topLevel","_c","styles"],"sources":["../../src/slug/SlugField.tsx"],"sourcesContent":["import { WandSparkles } from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\n\nimport type { FieldCheckResponse } from '@panneau/protocol';\nimport { Button, IconButton, usePanneauIntl } from '@panneau/ui';\n\nimport { useFieldsContext } from '../shared/context';\nimport { getFieldProps, getSetting, isString } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps } from '../shared/types';\nimport { TextField, type TextFieldProps } from '../text/TextField';\nimport styles from './SlugField.module.css';\n\n// Read outside the component: the React Compiler takes any `use…` name for a hook.\nconst suggestionMessage = messages.useSuggestion;\n\n/**\n * Turns a text into a slug: lowercase ASCII letters and digits separated by dashes, without\n * accents (`Été à Montréal` gives `ete-a-montreal`).\n */\nexport function slugify(text: string): string {\n return text\n .normalize('NFKD')\n .replace(/[̀-ͯ]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\n/** Checks a slug with the backend: whether it is available, and its URL. */\nexport type SlugCheck = (\n value: string,\n options: { signal: AbortSignal },\n) => Promise<FieldCheckResponse>;\n\nexport interface SlugFieldProps extends Omit<TextFieldProps, 'type' | 'suffix'> {\n /**\n * The text the slug is made from (a title). While the slug is empty or still matches it, the\n * slug follows it.\n */\n source?: string | null;\n /** Name of the source, for the button that generates the slug from it. */\n sourceLabel?: string;\n /**\n * Checks the slug as it is typed, and once when the field shows: the field then shows the\n * URL the backend gives, and says when the slug is taken, with a free one to use instead.\n */\n onCheck?: SlugCheck | null;\n /** How long typing must pause before a check, in milliseconds. Defaults to 300. */\n checkDelay?: number;\n /**\n * What the check depends on besides the slug, such as the form's values: the slug is checked\n * again when it changes. `onCheck` itself can change on every render.\n */\n checkKey?: string;\n}\n\n/**\n * Checks a slug after a pause in typing, and keeps the latest answer for it. A check that\n * fails leaves the field as it is: saving still validates the slug.\n */\nfunction useSlugCheck(\n value: string,\n onCheck: SlugCheck | null | undefined,\n delay: number,\n key: string,\n): FieldCheckResponse | null {\n const [result, setResult] = useState<{ value: string; check: FieldCheckResponse } | null>(null);\n const latest = useRef(onCheck);\n useEffect(() => {\n latest.current = onCheck;\n });\n const enabled = onCheck !== null && onCheck !== undefined;\n useEffect(() => {\n if (!enabled || value === '') {\n return undefined;\n }\n const controller = new AbortController();\n const timer = setTimeout(() => {\n const check = latest.current;\n if (check === null || check === undefined) {\n return;\n }\n check(value, { signal: controller.signal })\n .then((check) => {\n if (!controller.signal.aborted) {\n setResult({ value, check });\n }\n })\n .catch(() => undefined);\n }, delay);\n return () => {\n clearTimeout(timer);\n controller.abort();\n };\n }, [value, enabled, delay, key]);\n return result !== null && result.value === value ? result.check : null;\n}\n\n/**\n * A slug for URLs. Typed text is cleaned up on blur. With a `source`, the slug follows it until\n * it is edited, and a button generates it again. With `onCheck`, the backend says whether the\n * slug is taken, and gives its URL.\n */\nexport function SlugField({\n value,\n onChange,\n onBlur,\n source,\n sourceLabel,\n onCheck,\n checkDelay = 300,\n checkKey = '',\n disabled,\n readOnly,\n prefix,\n errors,\n description,\n ...props\n}: SlugFieldProps) {\n const intl = usePanneauIntl();\n const previousSource = useRef(source);\n const check = useSlugCheck(value ?? '', onCheck, checkDelay, checkKey);\n const disabledByBackend = check?.disabled === true;\n const editable = disabled !== true && readOnly !== true && !disabledByBackend;\n\n useEffect(() => {\n const previous = previousSource.current;\n previousSource.current = source;\n if (!editable || source === previous || source === undefined) {\n return;\n }\n const current = value ?? '';\n if (current === '' || current === slugify(previous ?? '')) {\n const next = slugify(source ?? '');\n if (next !== current) {\n onChange?.(next === '' ? null : next);\n }\n }\n }, [source, value, onChange, editable]);\n\n const generated = slugify(source ?? '');\n const taken = check !== null && !check.available;\n const suggestion = taken && isString(check.suggestion) ? check.suggestion : null;\n const url = check !== null && isString(check.url) && !taken ? check.url : null;\n return (\n <TextField\n autoComplete=\"off\"\n {...props}\n value={value}\n onChange={onChange}\n disabled={disabled}\n readOnly={readOnly === true || disabledByBackend}\n {...(check !== null && isString(check.prefix)\n ? { prefix: check.prefix }\n : prefix !== undefined\n ? { prefix }\n : {})}\n {...(errors !== undefined ? { errors } : {})}\n description={\n taken || url !== null || description !== undefined ? (\n <span className={styles.description}>\n {description !== undefined ? <span>{description}</span> : null}\n {url !== null ? (\n <a href={url} target=\"_blank\" rel=\"noreferrer\" className={styles.url}>\n {url}\n </a>\n ) : null}\n {taken ? (\n <span className={styles.taken} role=\"status\">\n {intl.formatMessage(messages.slugTaken)}\n {suggestion !== null && editable ? (\n <Button\n size=\"sm\"\n appearance=\"ghost\"\n onPress={() => onChange?.(suggestion)}\n >\n {intl.formatMessage(suggestionMessage, {\n suggestion,\n })}\n </Button>\n ) : null}\n </span>\n ) : null}\n </span>\n ) : undefined\n }\n onBlur={() => {\n if (value !== null && value !== undefined) {\n const next = slugify(value);\n if (next !== value) {\n onChange?.(next === '' ? null : next);\n }\n }\n onBlur?.();\n }}\n suffix={\n source !== undefined && editable ? (\n <IconButton\n icon={WandSparkles}\n size=\"sm\"\n label={intl.formatMessage(messages.generateSlug, {\n field: sourceLabel ?? '',\n })}\n isDisabled={generated === '' || generated === value}\n onPress={() => onChange?.(generated === '' ? null : generated)}\n />\n ) : undefined\n }\n />\n );\n}\n\n/**\n * The text of a source value: the value itself, or for a localized value, its value in `locale`.\n * Without a locale, the first locale that has a value.\n */\nexport function sourceText(value: unknown, locale?: string): string | null {\n if (typeof value === 'string') {\n return value;\n }\n if (value !== null && typeof value === 'object') {\n const record = value as Record<string, unknown>;\n if (locale !== undefined) {\n const text = record[locale];\n return isString(text) ? text : null;\n }\n return Object.values(record).find(isString) ?? null;\n }\n return null;\n}\n\n/** The form's values that a check depends on: all but the slug itself. */\nfunction checkKeyOf(values: Record<string, unknown> | null, name: string): string {\n if (values === null) {\n return '';\n }\n const { [name]: _slug, ...others } = values;\n try {\n return JSON.stringify(others);\n } catch {\n return '';\n }\n}\n\n/**\n * The `slug` type: `from` names the field it follows, in the slug's own locale, or in the default\n * locale (the first of the fields context) for a slug that isn't localized. Setting `prefix`\n * shows a URL prefix. With `check`, the fields context's check source checks the slug of a field\n * at the top of the resource, with the form's values.\n */\nexport function SlugFieldEntry(props: FieldEntryProps) {\n const { field, parentValue, locale, path } = props;\n const { locales, checkSource } = useFieldsContext();\n const prefix = getSetting(field, 'prefix', isString);\n const values =\n parentValue !== null && typeof parentValue === 'object'\n ? (parentValue as Record<string, unknown>)\n : null;\n const source =\n field.from !== undefined && values !== null\n ? sourceText(values[field.from], locale ?? locales[0])\n : undefined;\n const topLevel = path === field.name || path === `${field.name}.${locale ?? ''}`;\n const onCheck: SlugCheck | null =\n field.check === true && checkSource !== null && topLevel\n ? (value, { signal }) =>\n checkSource.check(\n field.name,\n {\n value,\n ...(locale !== undefined ? { locale } : {}),\n values: values ?? {},\n },\n { signal },\n )\n : null;\n return (\n <SlugField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n onCheck={onCheck}\n checkKey={onCheck !== null ? checkKeyOf(values, field.name) : ''}\n {...(source !== undefined ? { source, sourceLabel: field.from ?? '' } : {})}\n {...(prefix !== undefined ? { prefix } : {})}\n />\n );\n}\n"],"mappings":"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"}
|
package/dist/slug/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { SlugField, SlugFieldEntry, type SlugCheck, type SlugFieldProps, slugify, sourceText, } from './SlugField';
|
|
1
|
+
export { SlugField, SlugFieldEntry, type SlugCheck, type SlugFieldProps, slugify, sourceText, } from './SlugField.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/tags/TagsField.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type TagSuggestion } from '@panneau/ui';
|
|
2
|
-
import type { FieldEntryProps, FieldProps } from '../shared/types';
|
|
2
|
+
import type { FieldEntryProps, FieldProps } from '../shared/types.js';
|
|
3
3
|
export interface TagsFieldProps extends FieldProps<string[]> {
|
|
4
4
|
placeholder?: string;
|
|
5
5
|
/** Tags offered as the user types. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TagsField.js","names":["disabled","readOnly","required","value","_c"],"sources":["../../src/tags/TagsField.tsx"],"sourcesContent":["import type { Option } from '@panneau/protocol';\nimport { type TagSuggestion, TagsInput } from '@panneau/ui';\n\nimport { getFieldProps, getSetting, isString } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\n\nexport interface TagsFieldProps extends FieldProps<string[]> {\n placeholder?: string;\n /** Tags offered as the user types. */\n suggestions?: readonly TagSuggestion[];\n /** Whether tags outside the suggestions are allowed. Defaults to true. */\n allowCustom?: boolean;\n}\n\n/** A list of words, typed or picked among suggestions. An empty list is `null`. */\nexport function TagsField({ disabled, readOnly, required, ...props }: TagsFieldProps) {\n return (\n <TagsInput {...props} isDisabled={disabled} isReadOnly={readOnly} isRequired={required} />\n );\n}\n\n/** The options of a field as suggestions: their values as strings. */\nfunction toSuggestions(options: readonly Option[]): TagSuggestion[] {\n return options.map((option) => ({ value: String(option.value), label: option.label }));\n}\n\n/**\n * The `tags` type: its `options` as suggestions, and setting `allowCustom` (true by default)\n * for tags outside them.\n */\nexport function TagsFieldEntry(props: FieldEntryProps) {\n const { field } = props;\n const allowCustom = getSetting(\n field,\n 'allowCustom',\n (value): value is boolean => typeof value === 'boolean',\n );\n const value = Array.isArray(props.value) ? props.value.filter(isString) : null;\n return (\n <TagsField\n {...getFieldProps(props)}\n value={value !== null && value.length > 0 ? value : null}\n onChange={props.onChange}\n suggestions={toSuggestions(field.options ?? [])}\n {...(allowCustom !== undefined ? { allowCustom } : {})}\n />\n );\n}\n"],"mappings":";;;;;;AAeA,
|
|
1
|
+
{"version":3,"file":"TagsField.js","names":["Option","TagSuggestion","TagsInput","getFieldProps","getSetting","isString","FieldEntryProps","FieldProps","TagsFieldProps","placeholder","suggestions","allowCustom","TagsField","t0","$","_c","disabled","props","readOnly","required","t1","toSuggestions","options","map","option","value","String","label","TagsFieldEntry","field","_temp","Array","isArray","filter","value_0","t2","t3","length","t4","onChange","t5","t6","t7","undefined","t8","_c"],"sources":["../../src/tags/TagsField.tsx"],"sourcesContent":["import type { Option } from '@panneau/protocol';\nimport { type TagSuggestion, TagsInput } from '@panneau/ui';\n\nimport { getFieldProps, getSetting, isString } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\n\nexport interface TagsFieldProps extends FieldProps<string[]> {\n placeholder?: string;\n /** Tags offered as the user types. */\n suggestions?: readonly TagSuggestion[];\n /** Whether tags outside the suggestions are allowed. Defaults to true. */\n allowCustom?: boolean;\n}\n\n/** A list of words, typed or picked among suggestions. An empty list is `null`. */\nexport function TagsField({ disabled, readOnly, required, ...props }: TagsFieldProps) {\n return (\n <TagsInput {...props} isDisabled={disabled} isReadOnly={readOnly} isRequired={required} />\n );\n}\n\n/** The options of a field as suggestions: their values as strings. */\nfunction toSuggestions(options: readonly Option[]): TagSuggestion[] {\n return options.map((option) => ({ value: String(option.value), label: option.label }));\n}\n\n/**\n * The `tags` type: its `options` as suggestions, and setting `allowCustom` (true by default)\n * for tags outside them.\n */\nexport function TagsFieldEntry(props: FieldEntryProps) {\n const { field } = props;\n const allowCustom = getSetting(\n field,\n 'allowCustom',\n (value): value is boolean => typeof value === 'boolean',\n );\n const value = Array.isArray(props.value) ? props.value.filter(isString) : null;\n return (\n <TagsField\n {...getFieldProps(props)}\n value={value !== null && value.length > 0 ? value : null}\n onChange={props.onChange}\n suggestions={toSuggestions(field.options ?? [])}\n {...(allowCustom !== undefined ? { allowCustom } : {})}\n />\n );\n}\n"],"mappings":"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"}
|
package/dist/tags/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { TagsField, TagsFieldEntry, type TagsFieldProps } from './TagsField';
|
|
1
|
+
export { TagsField, TagsFieldEntry, type TagsFieldProps } from './TagsField.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/tel/TelField.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { FieldEntryProps } from '../shared/types';
|
|
2
|
-
import { type TextFieldProps } from '../text/TextField';
|
|
1
|
+
import type { FieldEntryProps } from '../shared/types.js';
|
|
2
|
+
import { type TextFieldProps } from '../text/TextField.js';
|
|
3
3
|
export type TelFieldProps = Omit<TextFieldProps, 'type' | 'inputMode'>;
|
|
4
4
|
/**
|
|
5
5
|
* A phone number, as typed, with the phone keyboard on phones. Spaces around it are removed on
|
package/dist/tel/TelField.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TelField.js","names":["
|
|
1
|
+
{"version":3,"file":"TelField.js","names":["getFieldProps","isString","FieldEntryProps","TextField","TextFieldProps","TelFieldProps","Omit","TelField","t0","$","_c","onBlur","onChange","props","value","t1","trimmed","trim","t2","TelFieldEntry","_c"],"sources":["../../src/tel/TelField.tsx"],"sourcesContent":["import { getFieldProps, isString } from '../shared/entry';\nimport type { FieldEntryProps } from '../shared/types';\nimport { TextField, type TextFieldProps } from '../text/TextField';\n\nexport type TelFieldProps = Omit<TextFieldProps, 'type' | 'inputMode'>;\n\n/**\n * A phone number, as typed, with the phone keyboard on phones. Spaces around it are removed on\n * blur. A `pattern` rule constrains its format when a project needs one.\n */\nexport function TelField({ value, onChange, onBlur, ...props }: TelFieldProps) {\n return (\n <TextField\n autoComplete=\"tel\"\n {...props}\n type=\"tel\"\n inputMode=\"tel\"\n value={value}\n onChange={onChange}\n onBlur={() => {\n const trimmed = value?.trim() ?? null;\n if (trimmed !== value) {\n onChange?.(trimmed === '' ? null : trimmed);\n }\n onBlur?.();\n }}\n />\n );\n}\n\n/** The `tel` type. */\nexport function TelFieldEntry(props: FieldEntryProps) {\n return (\n <TelField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n />\n );\n}\n"],"mappings":";;;;;;;;;AAUA,SAAOO,SAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAL,EAAA,OAAAD,IAAA;EAAkB,CAAA,CAAAM,OAAAF,UAAAD,QAAA,GAAAE,SAAAL;EAAoDC,EAAA,KAAAD;EAAAC,EAAA,KAAAE;EAAAF,EAAA,KAAAG;EAAAH,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;CAAA,OAAA;EAAAH,SAAAF,EAAA;EAAAG,WAAAH,EAAA;EAAAI,QAAAJ,EAAA;EAAAK,QAAAL,EAAA;CAAA;CAAA,IAAAM;CAAA,IAAAN,EAAA,OAAAE,UAAAF,EAAA,OAAAG,YAAAH,EAAA,OAAAK,OAAA;EASzDC,WAAA;GACJ,MAAAC,UAAgBF,OAAKG,KAAe,KAApB;GAChB,IAAID,YAAYF,OACZF,WAAWI,YAAY,KAAZ,OAAAA,OAA+B;GAE9CL,SAAS;EAAC;EACbF,EAAA,KAAAE;EAAAF,EAAA,KAAAG;EAAAH,EAAA,KAAAK;EAAAL,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,IAAAS;CAAA,IAAAT,EAAA,OAAAG,YAAAH,EAAA,QAAAI,SAAAJ,EAAA,QAAAM,MAAAN,EAAA,QAAAK,OAAA;EAbLI,KAAA,oBAAC,WAAD;GACiB,cAAA;GAAK,GACdL;GACC,MAAA;GACK,WAAA;GACHC;GACGF;GACF,QAAAG;EAMP,CAAA;EACHN,EAAA,KAAAG;EAAAH,EAAA,MAAAI;EAAAJ,EAAA,MAAAM;EAAAN,EAAA,MAAAK;EAAAL,EAAA,MAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,OAdFS;AAcE;;AAKV,SAAOC,cAAAN,OAAA;CAAA,MAAAJ,IAAAC,EAAA,CAAA;CAAA,IAAAF;CAAA,IAAAC,EAAA,OAAAI,OAAA;EAGSL,KAAAR,cAAca,KAAK;EAACJ,EAAA,KAAAI;EAAAJ,EAAA,KAAAD;CAAA,OAAAA,KAAAC,EAAA;CACjB,MAAAM,KAAAd,SAASY,MAAKC,KAA2B,IAAjBD,MAAKC,QAA7B;CAA0C,IAAAI;CAAA,IAAAT,EAAA,OAAAI,MAAAD,YAAAH,EAAA,OAAAD,MAAAC,EAAA,OAAAM,IAAA;EAFrDG,KAAA,oBAAC,UAAD;GAAS,GACDV;GACG,OAAAO;GACG,UAAAF,MAAKD;EAAS,CAAA;EAC1BH,EAAA,KAAAI,MAAAD;EAAAH,EAAA,KAAAD;EAAAC,EAAA,KAAAM;EAAAN,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,OAJFS;AAIE"}
|
package/dist/tel/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { TelField, TelFieldEntry, type TelFieldProps } from './TelField';
|
|
1
|
+
export { TelField, TelFieldEntry, type TelFieldProps } from './TelField.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/text/TextField.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
|
-
import type { FieldEntryProps, FieldProps } from '../shared/types';
|
|
2
|
+
import type { FieldEntryProps, FieldProps } from '../shared/types.js';
|
|
3
3
|
export interface TextFieldProps extends FieldProps<string> {
|
|
4
4
|
placeholder?: string;
|
|
5
5
|
/** Shows a count of characters against this maximum. It doesn't stop typing. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextField.js","names":["
|
|
1
|
+
{"version":3,"file":"TextField.js","names":["ReactNode","TextInput","usePanneauIntl","getFieldProps","getRuleNumber","getSetting","isString","messages","FieldEntryProps","FieldProps","TextFieldProps","placeholder","maxLength","prefix","suffix","type","inputMode","autoComplete","controlClassName","inputClassName","useCountedDescription","description","value","$","_c","intl","undefined","t0","formatMessage","characterCount","count","length","max","t1","t2","TextField","disabled","onChange","props","readOnly","required","shownDescription","next","t3","TextFieldEntry","field","t4","t5","t6","t7","t8","_c","_Fragment"],"sources":["../../src/text/TextField.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { TextInput, usePanneauIntl } from '@panneau/ui';\n\nimport { getFieldProps, getRuleNumber, getSetting, isString } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\n\nexport interface TextFieldProps extends FieldProps<string> {\n placeholder?: string;\n /** Shows a count of characters against this maximum. It doesn't stop typing. */\n maxLength?: number;\n /** Content before the text, inside the control. */\n prefix?: ReactNode;\n /** Content after the text, inside the control. */\n suffix?: ReactNode;\n /** Type of the input. Defaults to `text`. */\n type?: 'text' | 'email' | 'url' | 'tel' | 'password' | 'search';\n inputMode?: 'text' | 'email' | 'url' | 'tel' | 'search' | 'numeric' | 'decimal' | 'none';\n autoComplete?: string;\n controlClassName?: string;\n inputClassName?: string;\n}\n\n/** The description of a text field, with its character count. */\nexport function useCountedDescription(\n description: ReactNode,\n value: string | null | undefined,\n maxLength: number | undefined,\n): ReactNode {\n const intl = usePanneauIntl();\n if (maxLength === undefined) {\n return description;\n }\n const count = intl.formatMessage(messages.characterCount, {\n count: (value ?? '').length,\n max: maxLength,\n });\n if (description === undefined || description === null) {\n return count;\n }\n return (\n <>\n {description} <span>{count}</span>\n </>\n );\n}\n\n/** A single-line text. An empty text is `null`. */\nexport function TextField({\n value,\n onChange,\n description,\n maxLength,\n disabled,\n readOnly,\n required,\n ...props\n}: TextFieldProps) {\n const shownDescription = useCountedDescription(description, value, maxLength);\n return (\n <TextInput\n {...props}\n value={value ?? ''}\n onChange={(next) => onChange?.(next === '' ? null : next)}\n description={shownDescription}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `text` type: settings `prefix` and `suffix`, and a character count from the `max` rule. */\nexport function TextFieldEntry(props: FieldEntryProps) {\n const { field } = props;\n const prefix = getSetting(field, 'prefix', isString);\n const suffix = getSetting(field, 'suffix', isString);\n const max = getRuleNumber(field, 'max');\n return (\n <TextField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(max !== undefined ? { maxLength: max } : {})}\n {...(prefix !== undefined ? { prefix } : {})}\n {...(suffix !== undefined ? { suffix } : {})}\n />\n );\n}\n"],"mappings":";;;;;;;AAyBA,SAAOoB,sBAAAC,aAAAC,OAAAV,WAAA;CAAA,MAAAW,IAAAC,EAAA,CAAA;CAKH,MAAAC,OAAavB,eAAe;CAC5B,IAAIU,cAAcc,KAAAA,GAAS,OAChBL;CACV,IAAAM;CAAA,IAAAJ,EAAA,OAAAE,QAAAF,EAAA,OAAAX,aAAAW,EAAA,OAAAD,OAAA;EACaK,KAAAF,KAAIG,cAAerB,SAAQsB,gBAAiB;GAAAC,QAC9CR,SAAA,GAAA,CAAWS;GAAQC,KACtBpB;EACT,CAAC;EAACW,EAAA,KAAAE;EAAAF,EAAA,KAAAX;EAAAW,EAAA,KAAAD;EAAAC,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAHF,MAAAO,QAAcH;CAId,IAAIN,gBAAgBK,KAAAA,KAAaL,gBAAgB,MAAI,OAC1CS;CACV,IAAAG;CAAA,IAAAV,EAAA,OAAAO,OAAA;EAGqBG,KAAA,oBAAA,QAAA,EAAA,UAAOH,MAAa,CAAA;EAAAP,EAAA,KAAAO;EAAAP,EAAA,KAAAU;CAAA,OAAAA,KAAAV,EAAA;CAAA,IAAAW;CAAA,IAAAX,EAAA,OAAAF,eAAAE,EAAA,OAAAU,IAAA;EADtCC,KAAA,qBAAAkB,UAAA,EAAA,UAAA;GACK/B;GAAY;GAACY;EAAoB,EAAA,CAAA;EACnCV,EAAA,KAAAF;EAAAE,EAAA,KAAAU;EAAAV,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,OAFHW;AAEG;;AAKX,SAAOC,UAAAR,IAAA;CAAA,MAAAJ,IAAAC,EAAA,EAAA;CAAA,IAAAH;CAAA,IAAAe;CAAA,IAAAxB;CAAA,IAAAyB;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAlB;CAAA,IAAAC,EAAA,OAAAI,IAAA;EAAmB,CAAA,CAAAL,OAAAe,UAAAhB,aAAAT,WAAAwB,UAAAG,UAAAC,UAAA,GAAAF,SAAAX;EASTJ,EAAA,KAAAI;EAAAJ,EAAA,KAAAF;EAAAE,EAAA,KAAAa;EAAAb,EAAA,KAAAX;EAAAW,EAAA,KAAAc;EAAAd,EAAA,KAAAe;EAAAf,EAAA,KAAAgB;EAAAhB,EAAA,KAAAiB;EAAAjB,EAAA,KAAAD;CAAA,OAAA;EAAAD,cAAAE,EAAA;EAAAa,WAAAb,EAAA;EAAAX,YAAAW,EAAA;EAAAc,WAAAd,EAAA;EAAAe,QAAAf,EAAA;EAAAgB,WAAAhB,EAAA;EAAAiB,WAAAjB,EAAA;EAAAD,QAAAC,EAAA;CAAA;CACb,MAAAkB,mBAAyBrB,sBAAsBC,aAAaC,OAAOV,SAAS;CAI7D,MAAAqB,KAAAX,SAAA;CAAW,IAAAY;CAAA,IAAAX,EAAA,OAAAc,UAAA;EACRH,MAAAQ,SAAUL,WAAWK,SAAS,KAAT,OAAAA,IAAyB;EAACnB,EAAA,KAAAc;EAAAd,EAAA,MAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,IAAAoB;CAAA,IAAApB,EAAA,QAAAa,YAAAb,EAAA,QAAAe,SAAAf,EAAA,QAAAgB,YAAAhB,EAAA,QAAAiB,YAAAjB,EAAA,QAAAkB,oBAAAlB,EAAA,QAAAU,MAAAV,EAAA,QAAAW,IAAA;EAH7DS,KAAA,oBAAC,WAAD;GAAU,GACFL;GACG,OAAAL;GACG,UAAAC;GACGO,aAAAA;GACDL,YAAAA;GACAG,YAAAA;GACAC,YAAAA;EAAQ,CAAA;EACtBjB,EAAA,MAAAa;EAAAb,EAAA,MAAAe;EAAAf,EAAA,MAAAgB;EAAAhB,EAAA,MAAAiB;EAAAjB,EAAA,MAAAkB;EAAAlB,EAAA,MAAAU;EAAAV,EAAA,MAAAW;EAAAX,EAAA,MAAAoB;CAAA,OAAAA,KAAApB,EAAA;CAAA,OARFoB;AAQE;;AAKV,SAAOC,eAAAN,OAAA;CAAA,MAAAf,IAAAC,EAAA,EAAA;CACH,MAAA,EAAAqB,UAAkBP;CAAM,IAAAX;CAAA,IAAAJ,EAAA,OAAAsB,OAAA;EACTlB,KAAAtB,WAAWwC,OAAO,UAAUvC,QAAQ;EAACiB,EAAA,KAAAsB;EAAAtB,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAApD,MAAAV,SAAec;CAAsC,IAAAM;CAAA,IAAAV,EAAA,OAAAsB,OAAA;EACtCZ,KAAA5B,WAAWwC,OAAO,UAAUvC,QAAQ;EAACiB,EAAA,KAAAsB;EAAAtB,EAAA,KAAAU;CAAA,OAAAA,KAAAV,EAAA;CAApD,MAAAT,SAAemB;CAAsC,IAAAC;CAAA,IAAAX,EAAA,OAAAsB,OAAA;EACzCX,KAAA9B,cAAcyC,OAAO,KAAK;EAACtB,EAAA,KAAAsB;EAAAtB,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAvC,MAAAS,MAAYE;CAA4B,IAAAS;CAAA,IAAApB,EAAA,OAAAe,OAAA;EAG5BK,KAAAxC,cAAcmC,KAAK;EAACf,EAAA,KAAAe;EAAAf,EAAA,KAAAoB;CAAA,OAAAA,KAAApB,EAAA;CACjB,MAAAuB,KAAAxC,SAASgC,MAAKhB,KAA2B,IAAjBgB,MAAKhB,QAA7B;CAA0C,IAAAyB;CAAA,IAAAxB,EAAA,OAAAS,KAAA;EAE5Ce,KAAAf,QAAQN,KAAAA,IAAR,EAAAd,WAAiCoB,IAAS,IAA1C,CAA0C;EAACT,EAAA,KAAAS;EAAAT,EAAA,KAAAwB;CAAA,OAAAA,KAAAxB,EAAA;CAAA,IAAAyB;CAAA,IAAAzB,EAAA,QAAAV,QAAA;EAC3CmC,KAAAnC,WAAWa,KAAAA,IAAX,EAAAb,OAAqC,IAArC,CAAqC;EAACU,EAAA,MAAAV;EAAAU,EAAA,MAAAyB;CAAA,OAAAA,KAAAzB,EAAA;CAAA,IAAA0B;CAAA,IAAA1B,EAAA,QAAAT,QAAA;EACtCmC,KAAAnC,WAAWY,KAAAA,IAAX,EAAAZ,OAAqC,IAArC,CAAqC;EAACS,EAAA,MAAAT;EAAAS,EAAA,MAAA0B;CAAA,OAAAA,KAAA1B,EAAA;CAAA,IAAA2B;CAAA,IAAA3B,EAAA,QAAAe,MAAAD,YAAAd,EAAA,QAAAoB,MAAApB,EAAA,QAAAuB,MAAAvB,EAAA,QAAAwB,MAAAxB,EAAA,QAAAyB,MAAAzB,EAAA,QAAA0B,IAAA;EAN/CC,KAAA,oBAAC,WAAD;GAAU,GACFP;GACG,OAAAG;GACG,UAAAR,MAAKD;GAAS,GACnBU;GAA2C,GAC3CC;GAAsC,GACtCC;EAAsC,CAAA;EAC7C1B,EAAA,MAAAe,MAAAD;EAAAd,EAAA,MAAAoB;EAAApB,EAAA,MAAAuB;EAAAvB,EAAA,MAAAwB;EAAAxB,EAAA,MAAAyB;EAAAzB,EAAA,MAAA0B;EAAA1B,EAAA,MAAA2B;CAAA,OAAAA,KAAA3B,EAAA;CAAA,OAPF2B;AAOE"}
|
package/dist/text/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { TextField, TextFieldEntry, type TextFieldProps } from './TextField';
|
|
1
|
+
export { TextField, TextFieldEntry, type TextFieldProps } from './TextField.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { FieldEntryProps, FieldProps } from '../shared/types';
|
|
1
|
+
import type { FieldEntryProps, FieldProps } from '../shared/types.js';
|
|
2
2
|
export interface TextAreaFieldProps extends FieldProps<string> {
|
|
3
3
|
placeholder?: string;
|
|
4
4
|
/** Shows a count of characters against this maximum. It doesn't stop typing. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextAreaField.js","names":["
|
|
1
|
+
{"version":3,"file":"TextAreaField.js","names":["TextArea","getFieldProps","getRuleNumber","getSetting","isNumber","isString","FieldEntryProps","FieldProps","useCountedDescription","TextAreaFieldProps","placeholder","maxLength","rows","textAreaClassName","TextAreaField","t0","$","_c","description","disabled","onChange","props","readOnly","required","value","shownDescription","t1","t2","next","t3","TextAreaFieldEntry","field","max","t4","undefined","t5","t6","_c"],"sources":["../../src/textarea/TextAreaField.tsx"],"sourcesContent":["import { TextArea } from '@panneau/ui';\n\nimport { getFieldProps, getRuleNumber, getSetting, isNumber, isString } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport { useCountedDescription } from '../text/TextField';\n\nexport interface TextAreaFieldProps extends FieldProps<string> {\n placeholder?: string;\n /** Shows a count of characters against this maximum. It doesn't stop typing. */\n maxLength?: number;\n /** Visible lines. Defaults to 4. */\n rows?: number;\n textAreaClassName?: string;\n}\n\n/** A text of several lines. An empty text is `null`. */\nexport function TextAreaField({\n value,\n onChange,\n description,\n maxLength,\n disabled,\n readOnly,\n required,\n ...props\n}: TextAreaFieldProps) {\n const shownDescription = useCountedDescription(description, value, maxLength);\n return (\n <TextArea\n {...props}\n value={value ?? ''}\n onChange={(next) => onChange?.(next === '' ? null : next)}\n description={shownDescription}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `textarea` type: setting `rows`, and a character count from the `max` rule. */\nexport function TextAreaFieldEntry(props: FieldEntryProps) {\n const max = getRuleNumber(props.field, 'max');\n const rows = getSetting(props.field, 'rows', isNumber);\n return (\n <TextAreaField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(max !== undefined ? { maxLength: max } : {})}\n {...(rows !== undefined ? { rows } : {})}\n />\n );\n}\n"],"mappings":";;;;;;;AAgBA,SAAOc,cAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAR;CAAA,IAAAS;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAR,EAAA,OAAAD,IAAA;EAAuB,CAAA,CAAAS,OAAAJ,UAAAF,aAAAP,WAAAQ,UAAAG,UAAAC,UAAA,GAAAF,SAAAN;EASTC,EAAA,KAAAD;EAAAC,EAAA,KAAAE;EAAAF,EAAA,KAAAG;EAAAH,EAAA,KAAAL;EAAAK,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;EAAAL,EAAA,KAAAM;EAAAN,EAAA,KAAAO;EAAAP,EAAA,KAAAQ;CAAA,OAAA;EAAAN,cAAAF,EAAA;EAAAG,WAAAH,EAAA;EAAAL,YAAAK,EAAA;EAAAI,WAAAJ,EAAA;EAAAK,QAAAL,EAAA;EAAAM,WAAAN,EAAA;EAAAO,WAAAP,EAAA;EAAAQ,QAAAR,EAAA;CAAA;CACjB,MAAAS,mBAAyBjB,sBAAsBU,aAAaM,OAAOb,SAAS;CAI7D,MAAAe,KAAAF,SAAA;CAAW,IAAAG;CAAA,IAAAX,EAAA,OAAAI,UAAA;EACRO,MAAAC,SAAUR,WAAWQ,SAAS,KAAT,OAAAA,IAAyB;EAACZ,EAAA,KAAAI;EAAAJ,EAAA,MAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,IAAAa;CAAA,IAAAb,EAAA,QAAAG,YAAAH,EAAA,QAAAK,SAAAL,EAAA,QAAAM,YAAAN,EAAA,QAAAO,YAAAP,EAAA,QAAAS,oBAAAT,EAAA,QAAAU,MAAAV,EAAA,QAAAW,IAAA;EAH7DE,KAAA,oBAAC,UAAD;GAAS,GACDR;GACG,OAAAK;GACG,UAAAC;GACGF,aAAAA;GACDN,YAAAA;GACAG,YAAAA;GACAC,YAAAA;EAAQ,CAAA;EACtBP,EAAA,MAAAG;EAAAH,EAAA,MAAAK;EAAAL,EAAA,MAAAM;EAAAN,EAAA,MAAAO;EAAAP,EAAA,MAAAS;EAAAT,EAAA,MAAAU;EAAAV,EAAA,MAAAW;EAAAX,EAAA,MAAAa;CAAA,OAAAA,KAAAb,EAAA;CAAA,OARFa;AAQE;;AAKV,SAAOC,mBAAAT,OAAA;CAAA,MAAAL,IAAAC,EAAA,EAAA;CAAA,IAAAF;CAAA,IAAAC,EAAA,OAAAK,MAAAU,OAAA;EACShB,KAAAb,cAAcmB,MAAKU,OAAQ,KAAK;EAACf,EAAA,KAAAK,MAAAU;EAAAf,EAAA,KAAAD;CAAA,OAAAA,KAAAC,EAAA;CAA7C,MAAAgB,MAAYjB;CAAkC,IAAAW;CAAA,IAAAV,EAAA,OAAAK,MAAAU,OAAA;EACjCL,KAAAvB,WAAWkB,MAAKU,OAAQ,QAAQ3B,QAAQ;EAACY,EAAA,KAAAK,MAAAU;EAAAf,EAAA,KAAAU;CAAA,OAAAA,KAAAV,EAAA;CAAtD,MAAAJ,OAAac;CAA0C,IAAAC;CAAA,IAAAX,EAAA,OAAAK,OAAA;EAG3CM,KAAA1B,cAAcoB,KAAK;EAACL,EAAA,KAAAK;EAAAL,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CACjB,MAAAa,KAAAxB,SAASgB,MAAKG,KAA2B,IAAjBH,MAAKG,QAA7B;CAA0C,IAAAS;CAAA,IAAAjB,EAAA,OAAAgB,KAAA;EAE5CC,KAAAD,QAAQE,KAAAA,IAAR,EAAAvB,WAAiCqB,IAAS,IAA1C,CAA0C;EAAChB,EAAA,KAAAgB;EAAAhB,EAAA,KAAAiB;CAAA,OAAAA,KAAAjB,EAAA;CAAA,IAAAmB;CAAA,IAAAnB,EAAA,OAAAJ,MAAA;EAC3CuB,KAAAvB,SAASsB,KAAAA,IAAT,EAAAtB,KAAiC,IAAjC,CAAiC;EAACI,EAAA,KAAAJ;EAAAI,EAAA,KAAAmB;CAAA,OAAAA,KAAAnB,EAAA;CAAA,IAAAoB;CAAA,IAAApB,EAAA,QAAAK,MAAAD,YAAAJ,EAAA,QAAAW,MAAAX,EAAA,QAAAa,MAAAb,EAAA,QAAAiB,MAAAjB,EAAA,QAAAmB,IAAA;EAL3CC,KAAA,oBAAC,eAAD;GAAc,GACNT;GACG,OAAAE;GACG,UAAAR,MAAKD;GAAS,GACnBa;GAA2C,GAC3CE;EAAkC,CAAA;EACzCnB,EAAA,MAAAK,MAAAD;EAAAJ,EAAA,MAAAW;EAAAX,EAAA,MAAAa;EAAAb,EAAA,MAAAiB;EAAAjB,EAAA,MAAAmB;EAAAnB,EAAA,MAAAoB;CAAA,OAAAA,KAAApB,EAAA;CAAA,OANFoB;AAME"}
|
package/dist/textarea/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { TextAreaField, TextAreaFieldEntry, type TextAreaFieldProps } from './TextAreaField';
|
|
1
|
+
export { TextAreaField, TextAreaFieldEntry, type TextAreaFieldProps } from './TextAreaField.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/time/TimeField.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { FieldEntryProps, FieldProps } from '../shared/types';
|
|
1
|
+
import type { FieldEntryProps, FieldProps } from '../shared/types.js';
|
|
2
2
|
export interface TimeFieldProps extends FieldProps<string> {
|
|
3
3
|
/** Shows and writes seconds (`09:30:15`). */
|
|
4
4
|
withSeconds?: boolean;
|
package/dist/time/TimeField.js
CHANGED
|
@@ -5,16 +5,70 @@ import { TimeInput } from "@panneau/ui";
|
|
|
5
5
|
import { jsx } from "react/jsx-runtime";
|
|
6
6
|
//#region src/time/TimeField.tsx
|
|
7
7
|
/** A time of day as a string, `09:30` (or `09:30:15` with seconds). */
|
|
8
|
-
function TimeField(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
8
|
+
function TimeField(t0) {
|
|
9
|
+
const $ = c(21);
|
|
10
|
+
let disabled;
|
|
11
|
+
let onChange;
|
|
12
|
+
let props;
|
|
13
|
+
let readOnly;
|
|
14
|
+
let required;
|
|
15
|
+
let t1;
|
|
16
|
+
let value;
|
|
17
|
+
if ($[0] !== t0) {
|
|
18
|
+
({value, onChange, withSeconds: t1, disabled, readOnly, required, ...props} = t0);
|
|
19
|
+
$[0] = t0;
|
|
20
|
+
$[1] = disabled;
|
|
21
|
+
$[2] = onChange;
|
|
22
|
+
$[3] = props;
|
|
23
|
+
$[4] = readOnly;
|
|
24
|
+
$[5] = required;
|
|
25
|
+
$[6] = t1;
|
|
26
|
+
$[7] = value;
|
|
27
|
+
} else {
|
|
28
|
+
disabled = $[1];
|
|
29
|
+
onChange = $[2];
|
|
30
|
+
props = $[3];
|
|
31
|
+
readOnly = $[4];
|
|
32
|
+
required = $[5];
|
|
33
|
+
t1 = $[6];
|
|
34
|
+
value = $[7];
|
|
35
|
+
}
|
|
36
|
+
const withSeconds = t1 === void 0 ? false : t1;
|
|
37
|
+
const t2 = withSeconds ? "second" : "minute";
|
|
38
|
+
let t3;
|
|
39
|
+
if ($[8] !== value) {
|
|
40
|
+
t3 = toTime(value);
|
|
41
|
+
$[8] = value;
|
|
42
|
+
$[9] = t3;
|
|
43
|
+
} else t3 = $[9];
|
|
44
|
+
let t4;
|
|
45
|
+
if ($[10] !== onChange || $[11] !== withSeconds) {
|
|
46
|
+
t4 = (next) => onChange?.(next === null ? null : fromTime(next, withSeconds));
|
|
47
|
+
$[10] = onChange;
|
|
48
|
+
$[11] = withSeconds;
|
|
49
|
+
$[12] = t4;
|
|
50
|
+
} else t4 = $[12];
|
|
51
|
+
let t5;
|
|
52
|
+
if ($[13] !== disabled || $[14] !== props || $[15] !== readOnly || $[16] !== required || $[17] !== t2 || $[18] !== t3 || $[19] !== t4) {
|
|
53
|
+
t5 = /* @__PURE__ */ jsx(TimeInput, {
|
|
54
|
+
...props,
|
|
55
|
+
granularity: t2,
|
|
56
|
+
value: t3,
|
|
57
|
+
onChange: t4,
|
|
58
|
+
isDisabled: disabled,
|
|
59
|
+
isReadOnly: readOnly,
|
|
60
|
+
isRequired: required
|
|
61
|
+
});
|
|
62
|
+
$[13] = disabled;
|
|
63
|
+
$[14] = props;
|
|
64
|
+
$[15] = readOnly;
|
|
65
|
+
$[16] = required;
|
|
66
|
+
$[17] = t2;
|
|
67
|
+
$[18] = t3;
|
|
68
|
+
$[19] = t4;
|
|
69
|
+
$[20] = t5;
|
|
70
|
+
} else t5 = $[20];
|
|
71
|
+
return t5;
|
|
18
72
|
}
|
|
19
73
|
/** The `time` type: setting `withSeconds`. */
|
|
20
74
|
function TimeFieldEntry(props) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeField.js","names":["_c"],"sources":["../../src/time/TimeField.tsx"],"sourcesContent":["import { TimeInput } from '@panneau/ui';\n\nimport { fromTime, toTime } from '../shared/dates';\nimport { getFieldProps, isString } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\n\nexport interface TimeFieldProps extends FieldProps<string> {\n /** Shows and writes seconds (`09:30:15`). */\n withSeconds?: boolean;\n /** Defaults to the locale's. */\n hourCycle?: 12 | 24;\n controlClassName?: string;\n}\n\n/** A time of day as a string, `09:30` (or `09:30:15` with seconds). */\nexport function TimeField({\n value,\n onChange,\n withSeconds = false,\n disabled,\n readOnly,\n required,\n ...props\n}: TimeFieldProps) {\n return (\n <TimeInput\n {...props}\n granularity={withSeconds ? 'second' : 'minute'}\n value={toTime(value)}\n onChange={(next) => onChange?.(next === null ? null : fromTime(next, withSeconds))}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `time` type: setting `withSeconds`. */\nexport function TimeFieldEntry(props: FieldEntryProps) {\n return (\n <TimeField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n withSeconds={props.field.settings?.withSeconds === true}\n />\n );\n}\n"],"mappings":";;;;;;;AAeA,
|
|
1
|
+
{"version":3,"file":"TimeField.js","names":["TimeInput","fromTime","toTime","getFieldProps","isString","FieldEntryProps","FieldProps","TimeFieldProps","withSeconds","hourCycle","controlClassName","TimeField","t0","$","_c","disabled","onChange","props","readOnly","required","t1","value","undefined","t2","t3","t4","next","t5","TimeFieldEntry","field","settings","_c"],"sources":["../../src/time/TimeField.tsx"],"sourcesContent":["import { TimeInput } from '@panneau/ui';\n\nimport { fromTime, toTime } from '../shared/dates';\nimport { getFieldProps, isString } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\n\nexport interface TimeFieldProps extends FieldProps<string> {\n /** Shows and writes seconds (`09:30:15`). */\n withSeconds?: boolean;\n /** Defaults to the locale's. */\n hourCycle?: 12 | 24;\n controlClassName?: string;\n}\n\n/** A time of day as a string, `09:30` (or `09:30:15` with seconds). */\nexport function TimeField({\n value,\n onChange,\n withSeconds = false,\n disabled,\n readOnly,\n required,\n ...props\n}: TimeFieldProps) {\n return (\n <TimeInput\n {...props}\n granularity={withSeconds ? 'second' : 'minute'}\n value={toTime(value)}\n onChange={(next) => onChange?.(next === null ? null : fromTime(next, withSeconds))}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `time` type: setting `withSeconds`. */\nexport function TimeFieldEntry(props: FieldEntryProps) {\n return (\n <TimeField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n withSeconds={props.field.settings?.withSeconds === true}\n />\n );\n}\n"],"mappings":";;;;;;;AAeA,SAAOW,UAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAR,EAAA,OAAAD,IAAA;EAAmB,CAAA,CAAAS,OAAAL,UAAAR,aAAAY,IAAAL,UAAAG,UAAAC,UAAA,GAAAF,SAAAL;EAQTC,EAAA,KAAAD;EAAAC,EAAA,KAAAE;EAAAF,EAAA,KAAAG;EAAAH,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;EAAAL,EAAA,KAAAM;EAAAN,EAAA,KAAAO;EAAAP,EAAA,KAAAQ;CAAA,OAAA;EAAAN,WAAAF,EAAA;EAAAG,WAAAH,EAAA;EAAAI,QAAAJ,EAAA;EAAAK,WAAAL,EAAA;EAAAM,WAAAN,EAAA;EAAAO,KAAAP,EAAA;EAAAQ,QAAAR,EAAA;CAAA;CALb,MAAAL,cAAAY,OAAAE,KAAAA,IAAA,QAAAF;CASqB,MAAAG,KAAAf,cAAA,WAAA;CAAiC,IAAAgB;CAAA,IAAAX,EAAA,OAAAQ,OAAA;EACvCG,KAAAtB,OAAOmB,KAAK;EAACR,EAAA,KAAAQ;EAAAR,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,IAAAY;CAAA,IAAAZ,EAAA,QAAAG,YAAAH,EAAA,QAAAL,aAAA;EACViB,MAAAC,SAAUV,WAAWU,SAAS,OAAT,OAAuBzB,SAASyB,MAAMlB,WAAW,CAAC;EAACK,EAAA,MAAAG;EAAAH,EAAA,MAAAL;EAAAK,EAAA,MAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAAA,IAAAc;CAAA,IAAAd,EAAA,QAAAE,YAAAF,EAAA,QAAAI,SAAAJ,EAAA,QAAAK,YAAAL,EAAA,QAAAM,YAAAN,EAAA,QAAAU,MAAAV,EAAA,QAAAW,MAAAX,EAAA,QAAAY,IAAA;EAJtFE,KAAA,oBAAC,WAAD;GAAU,GACFV;GACS,aAAAM;GACN,OAAAC;GACG,UAAAC;GACEV,YAAAA;GACAG,YAAAA;GACAC,YAAAA;EAAQ,CAAA;EACtBN,EAAA,MAAAE;EAAAF,EAAA,MAAAI;EAAAJ,EAAA,MAAAK;EAAAL,EAAA,MAAAM;EAAAN,EAAA,MAAAU;EAAAV,EAAA,MAAAW;EAAAX,EAAA,MAAAY;EAAAZ,EAAA,MAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAA,OARFc;AAQE;;AAKV,SAAOC,eAAAX,OAAA;CAAA,MAAAJ,IAAAC,EAAA,CAAA;CAAA,IAAAF;CAAA,IAAAC,EAAA,OAAAI,OAAA;EAGSL,KAAAT,cAAcc,KAAK;EAACJ,EAAA,KAAAI;EAAAJ,EAAA,KAAAD;CAAA,OAAAA,KAAAC,EAAA;CACjB,MAAAO,KAAAhB,SAASa,MAAKI,KAA2B,IAAjBJ,MAAKI,QAA7B;CAEM,MAAAE,KAAAN,MAAKY,MAAMC,UAAsBtB,gBAAK;CAAI,IAAAgB;CAAA,IAAAX,EAAA,OAAAI,MAAAD,YAAAH,EAAA,OAAAD,MAAAC,EAAA,OAAAO,MAAAP,EAAA,OAAAU,IAAA;EAJ3DC,KAAA,oBAAC,WAAD;GAAU,GACFZ;GACG,OAAAQ;GACG,UAAAH,MAAKD;GACF,aAAAO;EAA0C,CAAA;EACzDV,EAAA,KAAAI,MAAAD;EAAAH,EAAA,KAAAD;EAAAC,EAAA,KAAAO;EAAAP,EAAA,KAAAU;EAAAV,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,OALFW;AAKE"}
|
package/dist/time/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { TimeField, TimeFieldEntry, type TimeFieldProps } from './TimeField';
|
|
1
|
+
export { TimeField, TimeFieldEntry, type TimeFieldProps } from './TimeField.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { cx } from "../shared/cx.js";
|
|
2
2
|
import { messages } from "../shared/messages.js";
|
|
3
3
|
import FilePicker_module_default from "./FilePicker.module.js";
|
|
4
|
+
import { c } from "react/compiler-runtime";
|
|
4
5
|
import { Button, usePanneauIntl } from "@panneau/ui";
|
|
5
6
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
7
|
import { Upload } from "lucide-react";
|
|
@@ -10,36 +11,118 @@ async function readDrop(items) {
|
|
|
10
11
|
return (await Promise.all(items.map((item) => item.kind === "file" ? item.getFile() : Promise.resolve(null)))).filter((file) => file !== null);
|
|
11
12
|
}
|
|
12
13
|
/** A button that opens the file dialog, in a zone where files can be dropped. */
|
|
13
|
-
function FilePicker(
|
|
14
|
+
function FilePicker(t0) {
|
|
15
|
+
const $ = c(34);
|
|
16
|
+
const { onSelect, accept, multiple: t1, isDisabled: t2, label, className } = t0;
|
|
17
|
+
const multiple = t1 === void 0 ? false : t1;
|
|
18
|
+
const isDisabled = t2 === void 0 ? false : t2;
|
|
14
19
|
const intl = usePanneauIntl();
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
let t3;
|
|
21
|
+
if ($[0] !== className) {
|
|
22
|
+
t3 = cx(FilePicker_module_default.zone, className);
|
|
23
|
+
$[0] = className;
|
|
24
|
+
$[1] = t3;
|
|
25
|
+
} else t3 = $[1];
|
|
26
|
+
let t4;
|
|
27
|
+
if ($[2] !== intl) {
|
|
28
|
+
t4 = intl.formatMessage(messages.dropZone);
|
|
29
|
+
$[2] = intl;
|
|
30
|
+
$[3] = t4;
|
|
31
|
+
} else t4 = $[3];
|
|
32
|
+
let t5;
|
|
33
|
+
if ($[4] !== multiple || $[5] !== onSelect) {
|
|
34
|
+
t5 = (event) => {
|
|
20
35
|
readDrop(event.items).then((files) => {
|
|
21
36
|
if (files.length > 0) onSelect(multiple ? files : files.slice(0, 1));
|
|
22
37
|
});
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
|
|
38
|
+
};
|
|
39
|
+
$[4] = multiple;
|
|
40
|
+
$[5] = onSelect;
|
|
41
|
+
$[6] = t5;
|
|
42
|
+
} else t5 = $[6];
|
|
43
|
+
let t6;
|
|
44
|
+
if ($[7] !== accept) {
|
|
45
|
+
t6 = accept !== null && accept !== void 0 && accept.length > 0 ? { acceptedFileTypes: accept } : {};
|
|
46
|
+
$[7] = accept;
|
|
47
|
+
$[8] = t6;
|
|
48
|
+
} else t6 = $[8];
|
|
49
|
+
let t7;
|
|
50
|
+
if ($[9] !== onSelect) {
|
|
51
|
+
t7 = (list) => {
|
|
52
|
+
const files_0 = list === null ? [] : [...list];
|
|
53
|
+
if (files_0.length > 0) onSelect(files_0);
|
|
54
|
+
};
|
|
55
|
+
$[9] = onSelect;
|
|
56
|
+
$[10] = t7;
|
|
57
|
+
} else t7 = $[10];
|
|
58
|
+
let t8;
|
|
59
|
+
if ($[11] !== intl || $[12] !== label || $[13] !== multiple) {
|
|
60
|
+
t8 = label ?? intl.formatMessage(multiple ? messages.chooseFiles : messages.chooseFile);
|
|
61
|
+
$[11] = intl;
|
|
62
|
+
$[12] = label;
|
|
63
|
+
$[13] = multiple;
|
|
64
|
+
$[14] = t8;
|
|
65
|
+
} else t8 = $[14];
|
|
66
|
+
let t9;
|
|
67
|
+
if ($[15] !== isDisabled || $[16] !== t8) {
|
|
68
|
+
t9 = /* @__PURE__ */ jsx(Button, {
|
|
69
|
+
size: "sm",
|
|
70
|
+
appearance: "outline",
|
|
71
|
+
icon: Upload,
|
|
72
|
+
isDisabled,
|
|
73
|
+
children: t8
|
|
74
|
+
});
|
|
75
|
+
$[15] = isDisabled;
|
|
76
|
+
$[16] = t8;
|
|
77
|
+
$[17] = t9;
|
|
78
|
+
} else t9 = $[17];
|
|
79
|
+
let t10;
|
|
80
|
+
if ($[18] !== multiple || $[19] !== t6 || $[20] !== t7 || $[21] !== t9) {
|
|
81
|
+
t10 = /* @__PURE__ */ jsx(FileTrigger, {
|
|
82
|
+
...t6,
|
|
26
83
|
allowsMultiple: multiple,
|
|
27
|
-
onSelect:
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
84
|
+
onSelect: t7,
|
|
85
|
+
children: t9
|
|
86
|
+
});
|
|
87
|
+
$[18] = multiple;
|
|
88
|
+
$[19] = t6;
|
|
89
|
+
$[20] = t7;
|
|
90
|
+
$[21] = t9;
|
|
91
|
+
$[22] = t10;
|
|
92
|
+
} else t10 = $[22];
|
|
93
|
+
let t11;
|
|
94
|
+
if ($[23] !== intl) {
|
|
95
|
+
t11 = intl.formatMessage(messages.dropHere);
|
|
96
|
+
$[23] = intl;
|
|
97
|
+
$[24] = t11;
|
|
98
|
+
} else t11 = $[24];
|
|
99
|
+
let t12;
|
|
100
|
+
if ($[25] !== t11) {
|
|
101
|
+
t12 = /* @__PURE__ */ jsx("span", {
|
|
39
102
|
className: FilePicker_module_default.hint,
|
|
40
|
-
children:
|
|
41
|
-
})
|
|
42
|
-
|
|
103
|
+
children: t11
|
|
104
|
+
});
|
|
105
|
+
$[25] = t11;
|
|
106
|
+
$[26] = t12;
|
|
107
|
+
} else t12 = $[26];
|
|
108
|
+
let t13;
|
|
109
|
+
if ($[27] !== isDisabled || $[28] !== t10 || $[29] !== t12 || $[30] !== t3 || $[31] !== t4 || $[32] !== t5) {
|
|
110
|
+
t13 = /* @__PURE__ */ jsxs(DropZone, {
|
|
111
|
+
className: t3,
|
|
112
|
+
"aria-label": t4,
|
|
113
|
+
isDisabled,
|
|
114
|
+
onDrop: t5,
|
|
115
|
+
children: [t10, t12]
|
|
116
|
+
});
|
|
117
|
+
$[27] = isDisabled;
|
|
118
|
+
$[28] = t10;
|
|
119
|
+
$[29] = t12;
|
|
120
|
+
$[30] = t3;
|
|
121
|
+
$[31] = t4;
|
|
122
|
+
$[32] = t5;
|
|
123
|
+
$[33] = t13;
|
|
124
|
+
} else t13 = $[33];
|
|
125
|
+
return t13;
|
|
43
126
|
}
|
|
44
127
|
//#endregion
|
|
45
128
|
export { FilePicker };
|