@panneau/fields 5.0.0-alpha.18 → 5.0.0-alpha.19
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 +23 -0
- package/dist/address/AddressField.js +3 -3
- package/dist/compound/Compound.css +26 -0
- package/dist/compound/Compound.module.js +16 -0
- package/dist/compound/Compound.module.js.map +1 -0
- package/dist/compound/compound.d.ts +56 -0
- package/dist/compound/compound.d.ts.map +1 -0
- package/dist/compound/compound.js +186 -0
- package/dist/compound/compound.js.map +1 -0
- package/dist/country/CountryField.js +1 -1
- package/dist/credits/CreditsField.d.ts +15 -0
- package/dist/credits/CreditsField.d.ts.map +1 -0
- package/dist/credits/CreditsField.js +58 -0
- package/dist/credits/CreditsField.js.map +1 -0
- package/dist/credits/credits.d.ts +18 -0
- package/dist/credits/credits.d.ts.map +1 -0
- package/dist/credits/credits.js +33 -0
- package/dist/credits/credits.js.map +1 -0
- package/dist/credits/index.d.ts +5 -0
- package/dist/credits/index.d.ts.map +1 -0
- package/dist/credits/index.js +3 -0
- package/dist/embed/EmbedField.js +2 -2
- package/dist/file/FileField.js +3 -3
- package/dist/group/GroupField.d.ts +7 -1
- package/dist/group/GroupField.d.ts.map +1 -1
- package/dist/group/GroupField.js +60 -68
- package/dist/group/GroupField.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/json/JsonField.js +1 -1
- package/dist/link/LinkField.js +3 -3
- package/dist/localized/LocalizedField.js +3 -3
- package/dist/location/LocationField.js +3 -3
- package/dist/location/LocationMap.js +1 -1
- package/dist/money/MoneyField.js +1 -1
- package/dist/relation/RelationField.js +3 -3
- package/dist/repeater/RepeaterField.d.ts +12 -1
- package/dist/repeater/RepeaterField.d.ts.map +1 -1
- package/dist/repeater/RepeaterField.js +53 -49
- package/dist/repeater/RepeaterField.js.map +1 -1
- package/dist/sessions/SessionsField.d.ts +15 -0
- package/dist/sessions/SessionsField.d.ts.map +1 -0
- package/dist/sessions/SessionsField.js +49 -0
- package/dist/sessions/SessionsField.js.map +1 -0
- package/dist/sessions/index.d.ts +4 -0
- package/dist/sessions/index.d.ts.map +1 -0
- package/dist/sessions/index.js +1 -0
- package/dist/shared/CodeComboBox.js +1 -1
- package/dist/shared/DefinitionField.d.ts +3 -2
- package/dist/shared/DefinitionField.d.ts.map +1 -1
- package/dist/shared/DefinitionField.js +8 -4
- package/dist/shared/DefinitionField.js.map +1 -1
- package/dist/shared/builtIn.js +2 -2
- package/dist/shared/context.js +1 -1
- package/dist/slug/SlugField.js +3 -3
- package/dist/tel/TelField.js +1 -1
- package/dist/text/TextField.js +2 -2
- package/dist/upload/FilePicker.js +1 -1
- package/dist/upload/UploadList.js +1 -1
- package/dist/url/UrlField.js +1 -1
- package/package.json +14 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RepeaterField.js","names":["ArrowDown","ArrowUp","Plus","Trash2","useId","BlockType","Field","Button","Fieldset","IconButton","Menu","MenuItem","MenuTrigger","usePanneauIntl","NestedField","cx","getFieldProps","getRuleNumber","messages","FieldEntryProps","FieldProps","styles","RepeaterItem","Record","RepeaterFieldProps","fields","types","path","min","max","itemClassName","defaults","Object","fromEntries","flatMap","field","default","undefined","name","RepeaterField","t0","$","_c","t1","value","onChange","onBlur","label","description","errors","disabled","readOnly","required","t2","className","labelClassName","descriptionClassName","errorsClassName","t3","intl","id","base","t4","items","editable","canAdd","length","canRemove","t5","next","set","t6","from","to","next_0","moved","splice","move","t7","type","add","t8","map","item","index","type_0","find","candidate","itemFields","number","titleId","header","title","formatMessage","tools","moveUp","moveDown","removeItem","filter","_","i","body","next_1","current","i_0","empty","noItems","t9","footer","key","type_1","_temp","t10","type_2","RepeaterFieldEntry","props","Array","isArray","_temp2","_c","styles"],"sources":["../../src/repeater/RepeaterField.tsx"],"sourcesContent":["import { ArrowDown, ArrowUp, Plus, Trash2 } from 'lucide-react';\nimport { useId } from 'react';\n\nimport type { BlockType, Field } from '@panneau/protocol';\nimport {\n Button,\n Fieldset,\n IconButton,\n Menu,\n MenuItem,\n MenuTrigger,\n usePanneauIntl,\n} from '@panneau/ui';\n\nimport { NestedField } from '../shared/DefinitionField';\nimport { cx } from '../shared/cx';\nimport { getFieldProps, getRuleNumber } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './RepeaterField.module.css';\n\n/** An item of a repeater. Typed blocks have their type in `type`. */\nexport type RepeaterItem = Record<string, unknown>;\n\nexport interface RepeaterFieldProps extends FieldProps<RepeaterItem[]> {\n /** The fields of each item. */\n fields?: readonly Field[];\n /** Typed blocks: each item has a `type`, and the fields of that type. */\n types?: readonly BlockType[];\n /** Dot path of the list, the prefix of its fields' paths (`blocks.2.body`). Defaults to `name`. */\n path?: string;\n /** Fewest items: items can't be removed below it. */\n min?: number;\n /** Most items: no item can be added above it. */\n max?: number;\n itemClassName?: string;\n}\n\nfunction defaults(fields: readonly Field[]): RepeaterItem {\n return Object.fromEntries(\n fields.flatMap((field) =>\n field.default !== undefined ? [[field.name, field.default]] : [],\n ),\n );\n}\n\n/**\n * A list of items, each with the same fields, or typed blocks with the fields of their type. Items\n * can be added, moved and removed. Each field renders at the path `<list>.<index>.<field>`. An\n * empty list is `null`.\n */\nexport function RepeaterField({\n fields = [],\n types,\n path,\n name,\n value,\n onChange,\n onBlur,\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n min = 0,\n max,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n itemClassName,\n}: RepeaterFieldProps) {\n const intl = usePanneauIntl();\n const id = useId();\n const base = path ?? name ?? '';\n const items = value ?? [];\n const editable = disabled !== true && readOnly !== true;\n const canAdd = editable && (max === undefined || items.length < max);\n const canRemove = editable && items.length > min;\n const set = (next: RepeaterItem[]) => onChange?.(next.length > 0 ? next : null);\n const move = (from: number, to: number) => {\n const next = [...items];\n const [moved] = next.splice(from, 1);\n if (moved !== undefined) {\n next.splice(to, 0, moved);\n set(next);\n }\n };\n const add = (type?: BlockType) =>\n set([\n ...items,\n type !== undefined ? { type: type.id, ...defaults(type.fields) } : defaults(fields),\n ]);\n\n return (\n <Fieldset\n legend={label}\n description={description}\n errors={errors}\n isRequired={required}\n className={className}\n legendClassName={labelClassName}\n descriptionClassName={descriptionClassName}\n errorsClassName={errorsClassName}\n >\n {items.length > 0 ? (\n <ol className={styles.items}>\n {items.map((item, index) => {\n const type =\n types !== undefined\n ? types.find((candidate) => candidate.id === item.type)\n : undefined;\n const itemFields = types !== undefined ? (type?.fields ?? []) : fields;\n const number = index + 1;\n const titleId = `${id}-${index}`;\n return (\n <li\n key={index}\n className={cx(styles.item, itemClassName)}\n aria-labelledby={titleId}\n >\n <div className={styles.header}>\n <span id={titleId} className={styles.title}>\n <span className={styles.index}>{number}</span>\n {type?.label ??\n (typeof item.type === 'string'\n ? item.type\n : intl.formatMessage(messages.item, {\n index: number,\n }))}\n </span>\n {editable ? (\n <span className={styles.tools}>\n <IconButton\n icon={ArrowUp}\n size=\"sm\"\n label={intl.formatMessage(messages.moveUp, {\n index: number,\n })}\n isDisabled={index === 0}\n onPress={() => move(index, index - 1)}\n />\n <IconButton\n icon={ArrowDown}\n size=\"sm\"\n label={intl.formatMessage(messages.moveDown, {\n index: number,\n })}\n isDisabled={index === items.length - 1}\n onPress={() => move(index, index + 1)}\n />\n <IconButton\n icon={Trash2}\n size=\"sm\"\n label={intl.formatMessage(messages.removeItem, {\n index: number,\n })}\n isDisabled={!canRemove}\n onPress={() =>\n set(items.filter((_, i) => i !== index))\n }\n />\n </span>\n ) : null}\n </div>\n <div className={styles.body}>\n {itemFields.map((field) => (\n <NestedField\n key={field.name}\n field={field}\n path={`${base}.${index}.${field.name}`}\n value={item[field.name]}\n onChange={(next) =>\n set(\n items.map((current, i) =>\n i === index\n ? { ...current, [field.name]: next }\n : current,\n ),\n )\n }\n {...(onBlur !== undefined ? { onBlur } : {})}\n parentValue={item}\n {...(disabled !== undefined ? { disabled } : {})}\n {...(readOnly !== undefined ? { readOnly } : {})}\n />\n ))}\n </div>\n </li>\n );\n })}\n </ol>\n ) : (\n <p className={styles.empty}>{intl.formatMessage(messages.noItems)}</p>\n )}\n {editable ? (\n <div className={styles.footer}>\n {types !== undefined ? (\n <MenuTrigger>\n <Button size=\"sm\" icon={Plus} isDisabled={!canAdd}>\n {intl.formatMessage(messages.add)}\n </Button>\n <Menu\n aria-label={intl.formatMessage(messages.add)}\n onAction={(key) => add(types.find((type) => type.id === key))}\n >\n {types.map((type) => (\n <MenuItem key={type.id} id={type.id}>\n {type.label}\n </MenuItem>\n ))}\n </Menu>\n </MenuTrigger>\n ) : (\n <Button size=\"sm\" icon={Plus} isDisabled={!canAdd} onPress={() => add()}>\n {intl.formatMessage(messages.add)}\n </Button>\n )}\n </div>\n ) : null}\n </Fieldset>\n );\n}\n\n/**\n * The `repeater` type: `fields`, or `types` for typed blocks, with `min` and `max` items from its\n * rules.\n */\nexport function RepeaterFieldEntry(props: FieldEntryProps) {\n const { field, value } = props;\n const min = getRuleNumber(field, 'min');\n const max = getRuleNumber(field, 'max');\n return (\n <RepeaterField\n {...getFieldProps(props)}\n path={props.path}\n {...(field.types !== undefined\n ? { types: field.types }\n : { fields: field.fields ?? [] })}\n value={\n Array.isArray(value)\n ? value.filter(\n (item): item is RepeaterItem =>\n item !== null && typeof item === 'object' && !Array.isArray(item),\n )\n : null\n }\n onChange={props.onChange}\n {...(min !== undefined ? { min } : {})}\n {...(max !== undefined ? { max } : {})}\n />\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RepeaterField.js","names":["ArrowDown","ArrowUp","Plus","Trash2","ReactNode","useId","BlockType","Field","Button","Fieldset","IconButton","Menu","MenuItem","MenuTrigger","usePanneauIntl","NestedField","cx","getFieldProps","getRuleNumber","messages","FieldEntryProps","FieldProps","styles","RepeaterItem","Record","RepeaterFieldProps","fields","types","path","min","max","itemTitle","item","index","renderFields","parts","Readonly","itemClassName","defaults","Object","fromEntries","flatMap","field","default","undefined","name","RepeaterField","t0","$","_c","t1","value","onChange","onBlur","label","description","errors","disabled","readOnly","required","t2","className","labelClassName","descriptionClassName","errorsClassName","t3","intl","id","base","t4","items","editable","canAdd","length","canRemove","t5","next","set","t6","from","to","next_0","moved","splice","move","t7","type","add","t8","map","type_0","find","candidate","itemFields","number","titleId","summary","renderField","next_1","current","i","header","title","formatMessage","tools","moveUp","moveDown","removeItem","filter","_","i_0","body","field_0","empty","noItems","t9","footer","key","type_1","_temp","t10","type_2","RepeaterFieldEntry","props","Array","isArray","_temp2","_c","styles"],"sources":["../../src/repeater/RepeaterField.tsx"],"sourcesContent":["import { ArrowDown, ArrowUp, Plus, Trash2 } from 'lucide-react';\nimport { type ReactNode, useId } from 'react';\n\nimport type { BlockType, Field } from '@panneau/protocol';\nimport {\n Button,\n Fieldset,\n IconButton,\n Menu,\n MenuItem,\n MenuTrigger,\n usePanneauIntl,\n} from '@panneau/ui';\n\nimport { NestedField } from '../shared/DefinitionField';\nimport { cx } from '../shared/cx';\nimport { getFieldProps, getRuleNumber } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './RepeaterField.module.css';\n\n/** An item of a repeater. Typed blocks have their type in `type`. */\nexport type RepeaterItem = Record<string, unknown>;\n\nexport interface RepeaterFieldProps extends FieldProps<RepeaterItem[]> {\n /** The fields of each item. */\n fields?: readonly Field[];\n /** Typed blocks: each item has a `type`, and the fields of that type. */\n types?: readonly BlockType[];\n /** Dot path of the list, the prefix of its fields' paths (`blocks.2.body`). Defaults to `name`. */\n path?: string;\n /** Fewest items: items can't be removed below it. */\n min?: number;\n /** Most items: no item can be added above it. */\n max?: number;\n /**\n * The title of an item, after its number: a summary of its values (decision 0065). Without\n * one, or when it gives `null`, the label of its type, or \"Item 2\".\n */\n itemTitle?: (item: RepeaterItem, index: number) => string | null;\n /**\n * Lays out the rendered fields of an item, by name, instead of one under the other: the\n * layout of a compound field (decision 0065).\n */\n renderFields?: (parts: Readonly<Record<string, ReactNode>>, item: RepeaterItem) => ReactNode;\n itemClassName?: string;\n}\n\nfunction defaults(fields: readonly Field[]): RepeaterItem {\n return Object.fromEntries(\n fields.flatMap((field) =>\n field.default !== undefined ? [[field.name, field.default]] : [],\n ),\n );\n}\n\n/**\n * A list of items, each with the same fields, or typed blocks with the fields of their type. Items\n * can be added, moved and removed. Each field renders at the path `<list>.<index>.<field>`. An\n * empty list is `null`.\n */\nexport function RepeaterField({\n fields = [],\n types,\n path,\n name,\n value,\n onChange,\n onBlur,\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n min = 0,\n max,\n itemTitle,\n renderFields,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n itemClassName,\n}: RepeaterFieldProps) {\n const intl = usePanneauIntl();\n const id = useId();\n const base = path ?? name ?? '';\n const items = value ?? [];\n const editable = disabled !== true && readOnly !== true;\n const canAdd = editable && (max === undefined || items.length < max);\n const canRemove = editable && items.length > min;\n const set = (next: RepeaterItem[]) => onChange?.(next.length > 0 ? next : null);\n const move = (from: number, to: number) => {\n const next = [...items];\n const [moved] = next.splice(from, 1);\n if (moved !== undefined) {\n next.splice(to, 0, moved);\n set(next);\n }\n };\n const add = (type?: BlockType) =>\n set([\n ...items,\n type !== undefined ? { type: type.id, ...defaults(type.fields) } : defaults(fields),\n ]);\n\n return (\n <Fieldset\n legend={label}\n description={description}\n errors={errors}\n isRequired={required}\n className={className}\n legendClassName={labelClassName}\n descriptionClassName={descriptionClassName}\n errorsClassName={errorsClassName}\n >\n {items.length > 0 ? (\n <ol className={styles.items}>\n {items.map((item, index) => {\n const type =\n types !== undefined\n ? types.find((candidate) => candidate.id === item.type)\n : undefined;\n const itemFields = types !== undefined ? (type?.fields ?? []) : fields;\n const number = index + 1;\n const titleId = `${id}-${index}`;\n const summary = itemTitle?.(item, index) ?? null;\n const renderField = (field: Field) => (\n <NestedField\n key={field.name}\n field={field}\n path={`${base}.${index}.${field.name}`}\n value={item[field.name]}\n onChange={(next) =>\n set(\n items.map((current, i) =>\n i === index\n ? { ...current, [field.name]: next }\n : current,\n ),\n )\n }\n {...(onBlur !== undefined ? { onBlur } : {})}\n parentValue={item}\n {...(disabled !== undefined ? { disabled } : {})}\n {...(readOnly !== undefined ? { readOnly } : {})}\n />\n );\n return (\n <li\n key={index}\n className={cx(styles.item, itemClassName)}\n aria-labelledby={titleId}\n >\n <div className={styles.header}>\n <span id={titleId} className={styles.title}>\n <span className={styles.index}>{number}</span>\n {summary ??\n type?.label ??\n (typeof item.type === 'string'\n ? item.type\n : intl.formatMessage(messages.item, {\n index: number,\n }))}\n </span>\n {editable ? (\n <span className={styles.tools}>\n <IconButton\n icon={ArrowUp}\n size=\"sm\"\n label={intl.formatMessage(messages.moveUp, {\n index: number,\n })}\n isDisabled={index === 0}\n onPress={() => move(index, index - 1)}\n />\n <IconButton\n icon={ArrowDown}\n size=\"sm\"\n label={intl.formatMessage(messages.moveDown, {\n index: number,\n })}\n isDisabled={index === items.length - 1}\n onPress={() => move(index, index + 1)}\n />\n <IconButton\n icon={Trash2}\n size=\"sm\"\n label={intl.formatMessage(messages.removeItem, {\n index: number,\n })}\n isDisabled={!canRemove}\n onPress={() =>\n set(items.filter((_, i) => i !== index))\n }\n />\n </span>\n ) : null}\n </div>\n <div className={styles.body}>\n {renderFields !== undefined\n ? renderFields(\n Object.fromEntries(\n itemFields.map((field) => [\n field.name,\n renderField(field),\n ]),\n ),\n item,\n )\n : itemFields.map(renderField)}\n </div>\n </li>\n );\n })}\n </ol>\n ) : (\n <p className={styles.empty}>{intl.formatMessage(messages.noItems)}</p>\n )}\n {editable ? (\n <div className={styles.footer}>\n {types !== undefined ? (\n <MenuTrigger>\n <Button size=\"sm\" icon={Plus} isDisabled={!canAdd}>\n {intl.formatMessage(messages.add)}\n </Button>\n <Menu\n aria-label={intl.formatMessage(messages.add)}\n onAction={(key) => add(types.find((type) => type.id === key))}\n >\n {types.map((type) => (\n <MenuItem key={type.id} id={type.id}>\n {type.label}\n </MenuItem>\n ))}\n </Menu>\n </MenuTrigger>\n ) : (\n <Button size=\"sm\" icon={Plus} isDisabled={!canAdd} onPress={() => add()}>\n {intl.formatMessage(messages.add)}\n </Button>\n )}\n </div>\n ) : null}\n </Fieldset>\n );\n}\n\n/**\n * The `repeater` type: `fields`, or `types` for typed blocks, with `min` and `max` items from its\n * rules.\n */\nexport function RepeaterFieldEntry(props: FieldEntryProps) {\n const { field, value } = props;\n const min = getRuleNumber(field, 'min');\n const max = getRuleNumber(field, 'max');\n return (\n <RepeaterField\n {...getFieldProps(props)}\n path={props.path}\n {...(field.types !== undefined\n ? { types: field.types }\n : { fields: field.fields ?? [] })}\n value={\n Array.isArray(value)\n ? value.filter(\n (item): item is RepeaterItem =>\n item !== null && typeof item === 'object' && !Array.isArray(item),\n )\n : null\n }\n onChange={props.onChange}\n {...(min !== undefined ? { min } : {})}\n {...(max !== undefined ? { max } : {})}\n />\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type CompoundFieldEntry } from '../compound/compound.js';
|
|
2
|
+
/**
|
|
3
|
+
* The `sessions` type (decision 0065): a compound field whose items are the `dates` of a session
|
|
4
|
+
* (a `daterange`) and its `venue` (a relation). The definition gives the sub-fields: those of a
|
|
5
|
+
* site (a price, a link to the tickets) come after these.
|
|
6
|
+
*/
|
|
7
|
+
export declare const SessionsFieldEntry: CompoundFieldEntry;
|
|
8
|
+
/** The `sessions` type, as a `@panneau/core` plugin. */
|
|
9
|
+
export declare const sessionsPlugin: {
|
|
10
|
+
id: string;
|
|
11
|
+
fields: {
|
|
12
|
+
sessions: CompoundFieldEntry;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=SessionsField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionsField.d.ts","sourceRoot":"","sources":["../../src/sessions/SessionsField.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,kBAAkB,EAAkC,MAAM,sBAAsB,CAAC;AAM/F;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,kBA+B/B,CAAC;AAEH,wDAAwD;AACxD,eAAO,MAAM,cAAc;;;;;CAG1B,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { formatDateRange, getDateRangeSettings } from "../daterange/range.js";
|
|
2
|
+
import { toReferences } from "../shared/relation.js";
|
|
3
|
+
import { defineCompoundField, restParts } from "../compound/compound.js";
|
|
4
|
+
import Compound_module_default from "../compound/Compound.module.js";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
//#region src/sessions/SessionsField.tsx
|
|
7
|
+
var PLACED = ["dates", "venue"];
|
|
8
|
+
/**
|
|
9
|
+
* The `sessions` type (decision 0065): a compound field whose items are the `dates` of a session
|
|
10
|
+
* (a `daterange`) and its `venue` (a relation). The definition gives the sub-fields: those of a
|
|
11
|
+
* site (a price, a link to the tickets) come after these.
|
|
12
|
+
*/
|
|
13
|
+
var SessionsFieldEntry = defineCompoundField({
|
|
14
|
+
layout: ({ parts }) => /* @__PURE__ */ jsxs("div", {
|
|
15
|
+
className: Compound_module_default.stack,
|
|
16
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
17
|
+
className: Compound_module_default.row,
|
|
18
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
19
|
+
className: `${Compound_module_default.part} ${Compound_module_default.wide}`,
|
|
20
|
+
children: parts.dates
|
|
21
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
22
|
+
className: Compound_module_default.part,
|
|
23
|
+
children: parts.venue
|
|
24
|
+
})]
|
|
25
|
+
}), restParts(parts, PLACED).length > 0 ? /* @__PURE__ */ jsx("div", {
|
|
26
|
+
className: Compound_module_default.row,
|
|
27
|
+
children: restParts(parts, PLACED).map((part, index) => /* @__PURE__ */ jsx("div", {
|
|
28
|
+
className: Compound_module_default.part,
|
|
29
|
+
children: part
|
|
30
|
+
}, index))
|
|
31
|
+
}) : null]
|
|
32
|
+
}),
|
|
33
|
+
summarize: (session, { field, locale }) => {
|
|
34
|
+
const dates = field.fields?.find((part) => part.name === "dates");
|
|
35
|
+
const range = formatDateRange(session.dates, locale, getDateRangeSettings(dates?.settings).timeZone);
|
|
36
|
+
const venue = toReferences(session.venue)[0]?.label;
|
|
37
|
+
const texts = [range?.text, venue].filter((text) => text !== void 0 && text !== "");
|
|
38
|
+
return texts.length > 0 ? texts.join(" · ") : null;
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
/** The `sessions` type, as a `@panneau/core` plugin. */
|
|
42
|
+
var sessionsPlugin = {
|
|
43
|
+
id: "panneau.sessions",
|
|
44
|
+
fields: { sessions: SessionsFieldEntry }
|
|
45
|
+
};
|
|
46
|
+
//#endregion
|
|
47
|
+
export { SessionsFieldEntry, sessionsPlugin };
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=SessionsField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionsField.js","names":["styles","CompoundFieldEntry","defineCompoundField","restParts","formatDateRange","getDateRangeSettings","toReferences","PLACED","SessionsFieldEntry","layout","parts","stack","row","part","wide","dates","venue","length","map","index","summarize","session","field","locale","fields","find","name","range","settings","timeZone","label","texts","text","filter","undefined","join","sessionsPlugin","id","sessions","styles"],"sources":["../../src/sessions/SessionsField.tsx"],"sourcesContent":["import styles from '../compound/Compound.module.css';\nimport { type CompoundFieldEntry, defineCompoundField, restParts } from '../compound/compound';\nimport { formatDateRange, getDateRangeSettings } from '../daterange/range';\nimport { toReferences } from '../shared/relation';\n\nconst PLACED = ['dates', 'venue'];\n\n/**\n * The `sessions` type (decision 0065): a compound field whose items are the `dates` of a session\n * (a `daterange`) and its `venue` (a relation). The definition gives the sub-fields: those of a\n * site (a price, a link to the tickets) come after these.\n */\nexport const SessionsFieldEntry: CompoundFieldEntry = defineCompoundField({\n layout: ({ parts }) => (\n <div className={styles.stack}>\n <div className={styles.row}>\n <div className={`${styles.part} ${styles.wide}`}>{parts.dates}</div>\n <div className={styles.part}>{parts.venue}</div>\n </div>\n {restParts(parts, PLACED).length > 0 ? (\n <div className={styles.row}>\n {restParts(parts, PLACED).map((part, index) => (\n <div key={index} className={styles.part}>\n {part}\n </div>\n ))}\n </div>\n ) : null}\n </div>\n ),\n summarize: (session, { field, locale }) => {\n const dates = field.fields?.find((part) => part.name === 'dates');\n const range = formatDateRange(\n session.dates,\n locale,\n getDateRangeSettings(dates?.settings).timeZone,\n );\n const venue = toReferences(session.venue)[0]?.label;\n const texts = [range?.text, venue].filter(\n (text): text is string => text !== undefined && text !== '',\n );\n return texts.length > 0 ? texts.join(' · ') : null;\n },\n});\n\n/** The `sessions` type, as a `@panneau/core` plugin. */\nexport const sessionsPlugin = {\n id: 'panneau.sessions',\n fields: { sessions: SessionsFieldEntry },\n};\n"],"mappings":";;;;;;AAKA,IAAMO,SAAS,CAAC,SAAS,OAAO;;;;;;AAOhC,IAAaC,qBAAyCN,oBAAoB;CACtEO,SAAS,EAAEC,YACP,qBAAC,OAAD;EAAK,WAAWV,wBAAOW;EAAvB,UAAA,CACI,qBAAC,OAAD;GAAK,WAAWX,wBAAOY;GAAvB,UAAA,CACI,oBAAC,OAAD;IAAK,WAAW,GAAGZ,wBAAOa,KAAI,GAAIb,wBAAOc;IAASJ,UAAAA,MAAMK;GAAW,CAAA,GACnE,oBAAC,OAAD;IAAK,WAAWf,wBAAOa;IAAOH,UAAAA,MAAMM;GAAW,CAAA,CAC9C;EACJb,CAAAA,GAAAA,UAAUO,OAAOH,MAAM,CAAC,CAACU,SAAS,IAC/B,oBAAC,OAAD;GAAK,WAAWjB,wBAAOY;GAClBT,UAAAA,UAAUO,OAAOH,MAAM,CAAC,CAACW,KAAKL,MAAMM,UACjC,oBAAC,OAAD;IAAiB,WAAWnB,wBAAOa;IAC9BA,UAAAA;GACA,GAFKM,KAEL,CACR;EACA,CAAA,IACL,IACH;;CAETC,YAAYC,SAAS,EAAEC,OAAOC,aAAa;EACvC,MAAMR,QAAQO,MAAME,QAAQC,MAAMZ,SAASA,KAAKa,SAAS,OAAO;EAChE,MAAMC,QAAQvB,gBACViB,QAAQN,OACRQ,QACAlB,qBAAqBU,OAAOa,QAAQ,CAAC,CAACC,QAC1C;EACA,MAAMb,QAAQV,aAAae,QAAQL,KAAK,CAAC,CAAC,EAAE,EAAEc;EAC9C,MAAMC,QAAQ,CAACJ,OAAOK,MAAMhB,KAAK,CAAC,CAACiB,QAC9BD,SAAyBA,SAASE,KAAAA,KAAaF,SAAS,EAC7D;EACA,OAAOD,MAAMd,SAAS,IAAIc,MAAMI,KAAK,KAAK,IAAI;CAClD;AACJ,CAAC;;AAGD,IAAaC,iBAAiB;CAC1BC,IAAI;CACJb,QAAQ,EAAEc,UAAU9B,mBAAmB;AAC3C"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { SessionsFieldEntry, sessionsPlugin } from './SessionsField.js';
|
|
2
|
+
export type { CompoundFieldEntry, CompoundSummary, CompoundSummaryContext, } from '../compound/compound.js';
|
|
3
|
+
export type { FieldEntry, FieldEntryProps } from '../shared/types.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sessions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACrE,YAAY,EACR,kBAAkB,EAClB,eAAe,EACf,sBAAsB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { SessionsFieldEntry, sessionsPlugin } from "./SessionsField.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { c } from "react/compiler-runtime";
|
|
2
|
-
import { useState } from "react";
|
|
3
2
|
import { ComboBox } from "@panneau/ui";
|
|
4
3
|
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
import { useState } from "react";
|
|
5
5
|
//#region src/shared/CodeComboBox.tsx
|
|
6
6
|
/** Lower case, without accents: `Québec` matches `quebec`. */
|
|
7
7
|
function normalize(text) {
|
|
@@ -29,8 +29,9 @@ export interface NestedFieldProps {
|
|
|
29
29
|
export declare function NestedField({ field, path, value, onChange, onBlur, errors, parentValue, locale, hideLabel, disabled, readOnly, className, }: NestedFieldProps): import("react").JSX.Element | null;
|
|
30
30
|
/**
|
|
31
31
|
* Renders a field of the definition with the entry of its type: from the fields context, or a
|
|
32
|
-
* built-in one. A localized field renders an input per locale. A
|
|
33
|
-
*
|
|
32
|
+
* built-in one. A localized field renders an input per locale. A compound field without an entry
|
|
33
|
+
* (decision 0065) renders as a group, or as a repeater with `multiple`. Another type without an
|
|
34
|
+
* entry renders a placeholder that names the missing plugin.
|
|
34
35
|
*/
|
|
35
36
|
export declare function DefinitionField(props: FieldEntryProps): import("react").JSX.Element;
|
|
36
37
|
//# sourceMappingURL=DefinitionField.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefinitionField.d.ts","sourceRoot":"","sources":["../../src/shared/DefinitionField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"DefinitionField.d.ts","sourceRoot":"","sources":["../../src/shared/DefinitionField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAY/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,KAAK,CAAC;IACb,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,4EAA4E;IAC5E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gGAAgG;IAChG,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EACxB,KAAK,EACL,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,MAAM,EACN,MAAM,EACN,WAAW,EACX,MAAM,EACN,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,SAAS,GACZ,EAAE,gBAAgB,sCAkClB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,+BAgBrD"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { GroupFieldEntry } from "../group/GroupField.js";
|
|
1
2
|
import { getParentPath, useFieldsContext } from "./context.js";
|
|
2
3
|
import { LocalizedFieldEntry } from "../localized/LocalizedField.js";
|
|
3
4
|
import { MissingFieldEntry } from "../missing/MissingField.js";
|
|
5
|
+
import { RepeaterFieldEntry } from "../repeater/RepeaterField.js";
|
|
4
6
|
import { builtInFields } from "./builtIn.js";
|
|
5
7
|
import { c } from "react/compiler-runtime";
|
|
6
|
-
import { evaluateCondition } from "@panneau/protocol/runtime";
|
|
8
|
+
import { evaluateCondition, getNestedShape } from "@panneau/protocol/runtime";
|
|
7
9
|
import { jsx } from "react/jsx-runtime";
|
|
8
10
|
//#region src/shared/DefinitionField.tsx
|
|
9
11
|
/**
|
|
@@ -136,8 +138,9 @@ function NestedField(t0) {
|
|
|
136
138
|
}
|
|
137
139
|
/**
|
|
138
140
|
* Renders a field of the definition with the entry of its type: from the fields context, or a
|
|
139
|
-
* built-in one. A localized field renders an input per locale. A
|
|
140
|
-
*
|
|
141
|
+
* built-in one. A localized field renders an input per locale. A compound field without an entry
|
|
142
|
+
* (decision 0065) renders as a group, or as a repeater with `multiple`. Another type without an
|
|
143
|
+
* entry renders a placeholder that names the missing plugin.
|
|
141
144
|
*/
|
|
142
145
|
function _temp() {}
|
|
143
146
|
function DefinitionField(props) {
|
|
@@ -153,7 +156,8 @@ function DefinitionField(props) {
|
|
|
153
156
|
} else t0 = $[1];
|
|
154
157
|
return t0;
|
|
155
158
|
}
|
|
156
|
-
const
|
|
159
|
+
const shape = getNestedShape(field);
|
|
160
|
+
const Entry = components[field.type] ?? builtInFields[field.type] ?? (shape === "repeater" ? RepeaterFieldEntry : shape === "group" ? GroupFieldEntry : MissingFieldEntry);
|
|
157
161
|
let t0;
|
|
158
162
|
if ($[2] !== Entry || $[3] !== props) {
|
|
159
163
|
t0 = /* @__PURE__ */ jsx(Entry, { ...props });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefinitionField.js","names":["Field","evaluateCondition","LocalizedFieldEntry","MissingFieldEntry","builtInFields","getParentPath","useFieldsContext","FieldEntryProps","NestedFieldProps","field","path","value","onChange","onBlur","errors","parentValue","locale","hideLabel","disabled","readOnly","className","NestedField","t0","$","_c","binding","Binding","t1","undefined","t2","t3","t4","t5","t6","shared","t7","t8","bound","t9","visibleWhen","_temp","t10","DefinitionField","props","components","localized","Entry","type","_c"],"sources":["../../src/shared/DefinitionField.tsx"],"sourcesContent":["import type { Field } from '@panneau/protocol';\nimport { evaluateCondition } from '@panneau/protocol/runtime';\n\n// Groups, repeaters and localized values render nested fields, which render through\n// `DefinitionField`: the modules import each other, which is fine since they only use each other\n// while rendering.\nimport { LocalizedFieldEntry } from '../localized/LocalizedField';\nimport { MissingFieldEntry } from '../missing/MissingField';\nimport { builtInFields } from './builtIn';\nimport { getParentPath, useFieldsContext } from './context';\nimport type { FieldEntryProps } from './types';\n\nexport interface NestedFieldProps {\n field: Field;\n /** Dot path of the field's value. */\n path: string;\n /** The value, without a binding. */\n value?: unknown;\n /** Sets the value, without a binding. */\n onChange?: (value: unknown) => void;\n onBlur?: () => void;\n errors?: readonly string[];\n /** The object the field belongs to, for conditions and generated values. */\n parentValue?: unknown;\n /** The locale of the value, in a localized field. */\n locale?: string;\n /** Renders the field without a visible label, named by its label for assistive technologies. */\n hideLabel?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n className?: string;\n}\n\n/**\n * A field inside another one (a group, a block, a localized value), or at the top of a form.\n * With a binding in context, the binding gives its value and decides whether it shows. Without\n * one, it uses `value` and `onChange`, and hides itself when its `visibleWhen` condition on the\n * parent value is false.\n */\nexport function NestedField({\n field,\n path,\n value,\n onChange,\n onBlur,\n errors,\n parentValue,\n locale,\n hideLabel,\n disabled,\n readOnly,\n className,\n}: NestedFieldProps) {\n const { binding: Binding } = useFieldsContext();\n const shared = {\n field,\n path,\n parentValue,\n ...(locale !== undefined ? { locale } : {}),\n ...(hideLabel !== undefined ? { hideLabel } : {}),\n ...(disabled !== undefined ? { disabled } : {}),\n ...(readOnly !== undefined ? { readOnly } : {}),\n ...(className !== undefined ? { className } : {}),\n };\n if (Binding !== null) {\n return (\n <Binding\n field={field}\n path={path}\n parentPath={getParentPath(path)}\n render={(bound) => <DefinitionField {...shared} {...bound} />}\n />\n );\n }\n if (field.visibleWhen !== undefined && !evaluateCondition(field.visibleWhen, parentValue)) {\n return null;\n }\n return (\n <DefinitionField\n {...shared}\n value={value}\n onChange={onChange ?? (() => undefined)}\n {...(onBlur !== undefined ? { onBlur } : {})}\n {...(errors !== undefined ? { errors } : {})}\n />\n );\n}\n\n/**\n * Renders a field of the definition with the entry of its type: from the fields context, or a\n * built-in one. A localized field renders an input per locale. A
|
|
1
|
+
{"version":3,"file":"DefinitionField.js","names":["Field","evaluateCondition","getNestedShape","GroupFieldEntry","LocalizedFieldEntry","MissingFieldEntry","RepeaterFieldEntry","builtInFields","getParentPath","useFieldsContext","FieldEntryProps","NestedFieldProps","field","path","value","onChange","onBlur","errors","parentValue","locale","hideLabel","disabled","readOnly","className","NestedField","t0","$","_c","binding","Binding","t1","undefined","t2","t3","t4","t5","t6","shared","t7","t8","bound","t9","visibleWhen","_temp","t10","DefinitionField","props","components","localized","shape","Entry","type","_c"],"sources":["../../src/shared/DefinitionField.tsx"],"sourcesContent":["import type { Field } from '@panneau/protocol';\nimport { evaluateCondition, getNestedShape } from '@panneau/protocol/runtime';\n\n// Groups, repeaters and localized values render nested fields, which render through\n// `DefinitionField`: the modules import each other, which is fine since they only use each other\n// while rendering.\nimport { GroupFieldEntry } from '../group/GroupField';\nimport { LocalizedFieldEntry } from '../localized/LocalizedField';\nimport { MissingFieldEntry } from '../missing/MissingField';\nimport { RepeaterFieldEntry } from '../repeater/RepeaterField';\nimport { builtInFields } from './builtIn';\nimport { getParentPath, useFieldsContext } from './context';\nimport type { FieldEntryProps } from './types';\n\nexport interface NestedFieldProps {\n field: Field;\n /** Dot path of the field's value. */\n path: string;\n /** The value, without a binding. */\n value?: unknown;\n /** Sets the value, without a binding. */\n onChange?: (value: unknown) => void;\n onBlur?: () => void;\n errors?: readonly string[];\n /** The object the field belongs to, for conditions and generated values. */\n parentValue?: unknown;\n /** The locale of the value, in a localized field. */\n locale?: string;\n /** Renders the field without a visible label, named by its label for assistive technologies. */\n hideLabel?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n className?: string;\n}\n\n/**\n * A field inside another one (a group, a block, a localized value), or at the top of a form.\n * With a binding in context, the binding gives its value and decides whether it shows. Without\n * one, it uses `value` and `onChange`, and hides itself when its `visibleWhen` condition on the\n * parent value is false.\n */\nexport function NestedField({\n field,\n path,\n value,\n onChange,\n onBlur,\n errors,\n parentValue,\n locale,\n hideLabel,\n disabled,\n readOnly,\n className,\n}: NestedFieldProps) {\n const { binding: Binding } = useFieldsContext();\n const shared = {\n field,\n path,\n parentValue,\n ...(locale !== undefined ? { locale } : {}),\n ...(hideLabel !== undefined ? { hideLabel } : {}),\n ...(disabled !== undefined ? { disabled } : {}),\n ...(readOnly !== undefined ? { readOnly } : {}),\n ...(className !== undefined ? { className } : {}),\n };\n if (Binding !== null) {\n return (\n <Binding\n field={field}\n path={path}\n parentPath={getParentPath(path)}\n render={(bound) => <DefinitionField {...shared} {...bound} />}\n />\n );\n }\n if (field.visibleWhen !== undefined && !evaluateCondition(field.visibleWhen, parentValue)) {\n return null;\n }\n return (\n <DefinitionField\n {...shared}\n value={value}\n onChange={onChange ?? (() => undefined)}\n {...(onBlur !== undefined ? { onBlur } : {})}\n {...(errors !== undefined ? { errors } : {})}\n />\n );\n}\n\n/**\n * Renders a field of the definition with the entry of its type: from the fields context, or a\n * built-in one. A localized field renders an input per locale. A compound field without an entry\n * (decision 0065) renders as a group, or as a repeater with `multiple`. Another type without an\n * entry renders a placeholder that names the missing plugin.\n */\nexport function DefinitionField(props: FieldEntryProps) {\n const { components } = useFieldsContext();\n const { field } = props;\n if (field.localized === true) {\n return <LocalizedFieldEntry {...props} />;\n }\n const shape = getNestedShape(field);\n const Entry =\n components[field.type] ??\n builtInFields[field.type] ??\n (shape === 'repeater'\n ? RepeaterFieldEntry\n : shape === 'group'\n ? GroupFieldEntry\n : MissingFieldEntry);\n return <Entry {...props} />;\n}\n"],"mappings":"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"}
|
package/dist/shared/builtIn.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { GroupFieldEntry } from "../group/GroupField.js";
|
|
2
|
+
import { RepeaterFieldEntry } from "../repeater/RepeaterField.js";
|
|
1
3
|
import { CountryFieldEntry } from "../country/CountryField.js";
|
|
2
4
|
import { LocationFieldEntry } from "../location/LocationField.js";
|
|
3
5
|
import { TextFieldEntry } from "../text/TextField.js";
|
|
@@ -12,7 +14,6 @@ import { DurationFieldEntry } from "../duration/DurationField.js";
|
|
|
12
14
|
import { EmailFieldEntry } from "../email/EmailField.js";
|
|
13
15
|
import { EmbedFieldEntry } from "../embed/EmbedField.js";
|
|
14
16
|
import { FileFieldEntry } from "../file/FileField.js";
|
|
15
|
-
import { GroupFieldEntry } from "../group/GroupField.js";
|
|
16
17
|
import { JsonFieldEntry } from "../json/JsonField.js";
|
|
17
18
|
import { TelFieldEntry } from "../tel/TelField.js";
|
|
18
19
|
import { UrlFieldEntry } from "../url/UrlField.js";
|
|
@@ -21,7 +22,6 @@ import { MoneyFieldEntry } from "../money/MoneyField.js";
|
|
|
21
22
|
import { NumberFieldEntry } from "../number/NumberField.js";
|
|
22
23
|
import { RangeFieldEntry } from "../range/RangeField.js";
|
|
23
24
|
import { RelationFieldEntry } from "../relation/RelationField.js";
|
|
24
|
-
import { RepeaterFieldEntry } from "../repeater/RepeaterField.js";
|
|
25
25
|
import { SelectFieldEntry } from "../select/SelectField.js";
|
|
26
26
|
import { SlugFieldEntry } from "../slug/SlugField.js";
|
|
27
27
|
import { TagsFieldEntry } from "../tags/TagsField.js";
|
package/dist/shared/context.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { c } from "react/compiler-runtime";
|
|
2
|
-
import { createContext, use } from "react";
|
|
3
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, use } from "react";
|
|
4
4
|
//#region src/shared/context.tsx
|
|
5
5
|
var FieldsContext = createContext({
|
|
6
6
|
components: {},
|
package/dist/slug/SlugField.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { useFieldsContext } from "../shared/context.js";
|
|
2
1
|
import { getFieldProps, getSetting, isString } from "../shared/entry.js";
|
|
2
|
+
import { useFieldsContext } from "../shared/context.js";
|
|
3
3
|
import { messages } from "../shared/messages.js";
|
|
4
4
|
import { TextField } from "../text/TextField.js";
|
|
5
5
|
import SlugField_module_default from "./SlugField.module.js";
|
|
6
6
|
import { c } from "react/compiler-runtime";
|
|
7
|
-
import { WandSparkles } from "lucide-react";
|
|
8
|
-
import { useEffect, useRef, useState } from "react";
|
|
9
7
|
import { Button, IconButton, usePanneauIntl } from "@panneau/ui";
|
|
10
8
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
import { WandSparkles } from "lucide-react";
|
|
10
|
+
import { useEffect, useRef, useState } from "react";
|
|
11
11
|
//#region src/slug/SlugField.tsx
|
|
12
12
|
var suggestionMessage = messages.useSuggestion;
|
|
13
13
|
/**
|
package/dist/tel/TelField.js
CHANGED
|
@@ -5,9 +5,9 @@ import { TextField } from "../text/TextField.js";
|
|
|
5
5
|
import TelField_module_default from "./TelField.module.js";
|
|
6
6
|
import { formatPhoneInput, getCallingCode, getPhoneCountries, joinExtension, parsePhone, readExtension, readPhone, splitExtension } from "./phone.js";
|
|
7
7
|
import { c } from "react/compiler-runtime";
|
|
8
|
-
import { useState } from "react";
|
|
9
8
|
import { Select, usePanneauIntl } from "@panneau/ui";
|
|
10
9
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
+
import { useState } from "react";
|
|
11
11
|
//#region src/tel/TelField.tsx
|
|
12
12
|
/** Characters that aren't part of a number: an extension typed after it (`x123`, `ext. 123`). */
|
|
13
13
|
var NOT_A_NUMBER = /[^\d\s()+.-]/;
|
package/dist/text/TextField.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { getFieldProps, getRuleNumber, getSetting, isBoolean, isString } from "../shared/entry.js";
|
|
2
2
|
import { messages } from "../shared/messages.js";
|
|
3
3
|
import { c } from "react/compiler-runtime";
|
|
4
|
-
import { Eye, EyeOff } from "lucide-react";
|
|
5
|
-
import { useState } from "react";
|
|
6
4
|
import { IconButton, TextInput, usePanneauIntl } from "@panneau/ui";
|
|
7
5
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { Eye, EyeOff } from "lucide-react";
|
|
7
|
+
import { useState } from "react";
|
|
8
8
|
//#region src/text/TextField.tsx
|
|
9
9
|
/** The description of a text field, with its character count. */
|
|
10
10
|
function useCountedDescription(description, value, maxLength) {
|
|
@@ -2,9 +2,9 @@ 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
4
|
import { c } from "react/compiler-runtime";
|
|
5
|
-
import { Upload } from "lucide-react";
|
|
6
5
|
import { Button, usePanneauIntl } from "@panneau/ui";
|
|
7
6
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
import { Upload } from "lucide-react";
|
|
8
8
|
import { DropZone, FileTrigger } from "react-aria-components";
|
|
9
9
|
//#region src/upload/FilePicker.tsx
|
|
10
10
|
async function readDrop(items) {
|
|
@@ -3,9 +3,9 @@ import { messages } from "../shared/messages.js";
|
|
|
3
3
|
import UploadList_module_default from "./UploadList.module.js";
|
|
4
4
|
import { formatSize } from "./files.js";
|
|
5
5
|
import { c } from "react/compiler-runtime";
|
|
6
|
-
import { Pause, Play, RotateCcw, X } from "lucide-react";
|
|
7
6
|
import { IconButton, usePanneauIntl } from "@panneau/ui";
|
|
8
7
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
import { Pause, Play, RotateCcw, X } from "lucide-react";
|
|
9
9
|
import { ProgressBar } from "react-aria-components";
|
|
10
10
|
//#region src/upload/UploadList.tsx
|
|
11
11
|
/**
|
package/dist/url/UrlField.js
CHANGED
|
@@ -3,9 +3,9 @@ import { messages } from "../shared/messages.js";
|
|
|
3
3
|
import { TextField } from "../text/TextField.js";
|
|
4
4
|
import UrlField_module_default from "./UrlField.module.js";
|
|
5
5
|
import { c } from "react/compiler-runtime";
|
|
6
|
-
import { ExternalLink } from "lucide-react";
|
|
7
6
|
import { Icon, usePanneauIntl } from "@panneau/ui";
|
|
8
7
|
import { jsx } from "react/jsx-runtime";
|
|
8
|
+
import { ExternalLink } from "lucide-react";
|
|
9
9
|
//#region src/url/UrlField.tsx
|
|
10
10
|
var SCHEME = /^[a-z][a-z0-9+.-]*:/i;
|
|
11
11
|
/** Adds a scheme to a URL that has none, and isn't a path or an anchor. */
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@panneau/fields",
|
|
3
|
-
"version": "5.0.0-alpha.
|
|
3
|
+
"version": "5.0.0-alpha.19",
|
|
4
4
|
"description": "Controlled field components of Panneau for the protocol's built-in field types, one subpath per field, and uploads to storage (Uppy 6 in its own entry point).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -138,6 +138,16 @@
|
|
|
138
138
|
"types": "./dist/money/index.d.ts",
|
|
139
139
|
"default": "./dist/money/index.js"
|
|
140
140
|
},
|
|
141
|
+
"./credits": {
|
|
142
|
+
"@panneau/source": "./src/credits/index.ts",
|
|
143
|
+
"types": "./dist/credits/index.d.ts",
|
|
144
|
+
"default": "./dist/credits/index.js"
|
|
145
|
+
},
|
|
146
|
+
"./sessions": {
|
|
147
|
+
"@panneau/source": "./src/sessions/index.ts",
|
|
148
|
+
"types": "./dist/sessions/index.d.ts",
|
|
149
|
+
"default": "./dist/sessions/index.js"
|
|
150
|
+
},
|
|
141
151
|
"./location": {
|
|
142
152
|
"@panneau/source": "./src/location/index.ts",
|
|
143
153
|
"types": "./dist/location/index.d.ts",
|
|
@@ -208,9 +218,9 @@
|
|
|
208
218
|
},
|
|
209
219
|
"dependencies": {
|
|
210
220
|
"@internationalized/date": "^3.12.4",
|
|
211
|
-
"@panneau/intl": "5.0.0-alpha.
|
|
212
|
-
"@panneau/protocol": "5.0.0-alpha.
|
|
213
|
-
"@panneau/ui": "5.0.0-alpha.
|
|
221
|
+
"@panneau/intl": "5.0.0-alpha.19",
|
|
222
|
+
"@panneau/protocol": "5.0.0-alpha.19",
|
|
223
|
+
"@panneau/ui": "5.0.0-alpha.19",
|
|
214
224
|
"leaflet": "^1.9.4",
|
|
215
225
|
"libphonenumber-js": "^1.13.15",
|
|
216
226
|
"lucide-react": "^1.57.0"
|