@aglyn/aglyn-transfer-ui 1.0.0-beta.230 → 1.0.0-beta.231

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aglyn/aglyn-transfer-ui",
3
- "version": "1.0.0-beta.230",
3
+ "version": "1.0.0-beta.231",
4
4
  "license": "Apache-2.0",
5
5
  "homepage": "https://aglyn.com",
6
6
  "repository": {
@@ -25,8 +25,8 @@
25
25
  "./package.json": "./package.json"
26
26
  },
27
27
  "dependencies": {
28
- "@aglyn/aglyn": "1.0.0-beta.230",
29
- "@aglyn/shared-ui-jsx": "1.0.0-beta.230",
28
+ "@aglyn/aglyn": "1.0.0-beta.231",
29
+ "@aglyn/shared-ui-jsx": "1.0.0-beta.231",
30
30
  "@swc/helpers": "0.5.23"
31
31
  },
32
32
  "peerDependencies": {
@@ -29,6 +29,8 @@ export interface TransferExportDialogProps {
29
29
  label: string;
30
30
  value: unknown;
31
31
  };
32
+ /** A resource preset to open on, over the person's last choice; ignored when the resource has none by that id. */
33
+ preset?: string;
32
34
  /** Saves the file; defaults to a browser download. */
33
35
  download?(result: TransferExportResponse): void;
34
36
  onExported?(result: TransferExportResponse): void;
@@ -82,7 +82,7 @@ const CUSTOM_SELECTION = 'custom';
82
82
  export function TransferExportDialog(props) {
83
83
  var _ref, _filter_value, _props_title, _ref1, _ref2;
84
84
  var _resourcePresets_find;
85
- const { open, onClose, client, resource, selection, filter } = props;
85
+ const { open, onClose, client, resource, selection, filter, preset } = props;
86
86
  const [info, setInfo] = useState(null);
87
87
  const [error, setError] = useState(null);
88
88
  const [presetId, setPresetId] = useState('reimportable');
@@ -127,7 +127,7 @@ export function TransferExportDialog(props) {
127
127
  resource,
128
128
  filter: JSON.parse(filterKey)
129
129
  }).then((loaded)=>{
130
- var _loaded_prefs_presets, _formats_, _ref;
130
+ var _loaded_prefs_presets, _formats_, _ref, _loaded_resourcePresets;
131
131
  var _last_fieldIds;
132
132
  if (!live) return;
133
133
  setError(null);
@@ -143,7 +143,12 @@ export function TransferExportDialog(props) {
143
143
  setFormat(last && formats.includes(last.format) ? last.format : (_formats_ = formats[0]) != null ? _formats_ : 'csv');
144
144
  setBom((_ref = last == null ? void 0 : last.bom) != null ? _ref : false);
145
145
  setScope(selectionCount ? 'selection' : hasFilter ? (last == null ? void 0 : last.scope) === 'all' ? 'all' : 'filter' : 'all');
146
- if (last == null ? void 0 : (_last_fieldIds = last.fieldIds) == null ? void 0 : _last_fieldIds.length) {
146
+ const asked = preset ? ((_loaded_resourcePresets = loaded.resourcePresets) != null ? _loaded_resourcePresets : []).find((entry)=>entry.id === preset) : undefined;
147
+ if (asked) {
148
+ setPresetId(asked.id);
149
+ setFieldIds(resolveTransferPreset(built, asked, loadedHints).fieldIds);
150
+ setUnknown([]);
151
+ } else if (last == null ? void 0 : (_last_fieldIds = last.fieldIds) == null ? void 0 : _last_fieldIds.length) {
147
152
  var _last_presetId;
148
153
  const resolved = resolveTransferFieldSelection(built, last.fieldIds);
149
154
  setPresetId((_last_presetId = last.presetId) != null ? _last_presetId : CUSTOM_SELECTION);
@@ -165,7 +170,8 @@ export function TransferExportDialog(props) {
165
170
  resource,
166
171
  selectionCount,
167
172
  hasFilter,
168
- filterKey
173
+ filterKey,
174
+ preset
169
175
  ]);
170
176
  const choosePreset = (id)=>{
171
177
  var _resourcePresets_find;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../libs/aglyn-transfer-ui/src/lib/transfer-export-dialog.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'use client'\n\n/**\n * Export: every field offered, the person picks which.\n *\n * Presets fill the picker — Re-importable (the default: the Aglyn ID and\n * the match keys first, then every writable field, so the file comes back\n * in and finds its records), Everything, Minimal, the resource's own\n * presets (another product's layout, written under that product's column\n * names) and the presets the person saved. Any change after a preset is a\n * hand-picked list. The scope\n * (the selection, the current filter, or everything), the format and the\n * byte-order mark complete the choice, and the whole choice is remembered\n * through the client for the next export of the same resource.\n */\n\nimport { PLATFORM_BRAND_NAME } from '@aglyn/aglyn/app-utils/platform-brand'\nimport {\n TRANSFER_PRESET_IDS,\n buildTransferFieldCatalog,\n resolveTransferFieldSelection,\n resolveTransferPreset,\n} from '@aglyn/aglyn/data-transfer'\nimport type {\n TransferFieldCatalog,\n TransferFormat,\n TransferPresetHints,\n TransferPresetId,\n TransferSavedPreset,\n} from '@aglyn/aglyn/data-transfer'\nimport {\n Alert,\n Button,\n Checkbox,\n CircularProgress,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n FormControl,\n FormControlLabel,\n FormLabel,\n Radio,\n RadioGroup,\n Stack,\n TextField,\n} from '@mui/material'\nimport { useEffect, useMemo, useState } from 'react'\n\nimport type {\n TransferClient,\n TransferExportResponse,\n TransferExportScope,\n TransferExportScopeKind,\n TransferResourceInfo,\n} from './transfer-client'\nimport { TransferChoiceSelect } from './transfer-choice-select.component'\nimport { TransferFieldPicker } from './transfer-field-picker.component'\nimport { countOf } from './transfer-words'\n\nconst PRESET_WORDS: Readonly<\n Record<TransferPresetId, { label: string; description: string }>\n> = {\n reimportable: {\n label: 'Re-importable',\n description: `The ${PLATFORM_BRAND_NAME} ID, the match keys and every field an import can write.`,\n },\n everything: {\n label: 'Everything',\n description: 'Every field, including computed and system fields.',\n },\n minimal: {\n label: 'Minimal',\n description: `The ${PLATFORM_BRAND_NAME} ID, the match keys and the required fields.`,\n },\n}\n\nconst FORMAT_WORDS: Readonly<Record<TransferFormat, string>> = {\n csv: 'CSV — opens in a spreadsheet',\n json: 'JSON — one array of records',\n ndjson: 'NDJSON — one record per line',\n}\n\nconst CUSTOM_SELECTION = 'custom'\n\n/**\n * The preset a first export opens on: Re-importable, so the file comes back\n * in — or Everything for an export-only resource, whose fields are all\n * read-only and would leave Re-importable holding the ID alone.\n */\nfunction defaultPresetOf(info: TransferResourceInfo): TransferPresetId {\n return info.resource.exportOnly ? 'everything' : 'reimportable'\n}\n\nexport interface TransferExportDialogProps {\n open: boolean\n onClose(): void\n client: TransferClient\n resource: string\n /** The dialog's title; defaults to \"Export <resource label>\". */\n title?: string\n /** The records the person selected, when there is a selection. */\n selection?: readonly string[]\n /** The list's current filter, when one is applied: what the server reads and how to name it. */\n filter?: { label: string; value: unknown }\n /** Saves the file; defaults to a browser download. */\n download?(result: TransferExportResponse): void\n onExported?(result: TransferExportResponse): void\n}\n\n/** The resource's preset hints; without its own, its match keys lead (the Aglyn ID always leads first). */\nfunction presetHintsOf(info: TransferResourceInfo): TransferPresetHints {\n return (\n info.presetHints ?? {\n matchKeyFieldIds: info.matchKeys.map((key) => key.fieldId),\n }\n )\n}\n\n/** A file handed to the browser as a download. */\nexport function downloadTransferFile(fileName: string, body: Blob): void {\n if (typeof URL === 'undefined' || typeof URL.createObjectURL !== 'function')\n return\n const url = URL.createObjectURL(body)\n const anchor = document.createElement('a')\n anchor.href = url\n anchor.download = fileName\n document.body.appendChild(anchor)\n anchor.click()\n anchor.remove()\n setTimeout(() => URL.revokeObjectURL(url), 0)\n}\n\nexport function TransferExportDialog(props: TransferExportDialogProps) {\n const { open, onClose, client, resource, selection, filter } = props\n const [info, setInfo] = useState<TransferResourceInfo | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [presetId, setPresetId] = useState<string>('reimportable')\n const [fieldIds, setFieldIds] = useState<string[]>([])\n const [unknown, setUnknown] = useState<string[]>([])\n const [format, setFormat] = useState<TransferFormat>('csv')\n const [bom, setBom] = useState(false)\n const [scope, setScope] = useState<TransferExportScopeKind>('all')\n const [presets, setPresets] = useState<TransferSavedPreset[]>([])\n const [presetName, setPresetName] = useState('')\n const [busy, setBusy] = useState(false)\n\n const catalog: TransferFieldCatalog | null = useMemo(\n () =>\n info\n ? buildTransferFieldCatalog({\n standard: info.fields,\n groups: info.groups,\n })\n : null,\n [info],\n )\n const selectionCount = selection?.length ?? 0\n const hasFilter = Boolean(filter)\n // The filter's value as text, so a parent re-creating the same filter does not reload the fields.\n const filterKey = filter ? JSON.stringify(filter.value ?? null) : null\n const hints = useMemo(() => (info ? presetHintsOf(info) : {}), [info])\n const resourcePresets = useMemo(() => info?.resourcePresets ?? [], [info])\n /*\n * A resource preset laid out for another product names its own columns;\n * they are written only while that preset is chosen as it stands — the\n * moment the person changes a field, the columns are the fields' labels.\n */\n const headers = resourcePresets.find((preset) => preset.id === presetId)\n ?.headers\n\n useEffect(() => {\n if (!open) return\n let live = true\n client\n .fields(filterKey === null ? { resource } : { resource, filter: JSON.parse(filterKey) as unknown })\n .then((loaded) => {\n if (!live) return\n setError(null)\n const built = buildTransferFieldCatalog({\n standard: loaded.fields,\n groups: loaded.groups,\n })\n const loadedHints = presetHintsOf(loaded)\n const last = loaded.prefs.export\n const formats = loaded.resource.formats\n setInfo(loaded)\n setPresets(loaded.prefs.presets ?? [])\n setFormat(\n last && formats.includes(last.format)\n ? last.format\n : (formats[0] ?? 'csv'),\n )\n setBom(last?.bom ?? false)\n setScope(\n selectionCount\n ? 'selection'\n : hasFilter\n ? last?.scope === 'all'\n ? 'all'\n : 'filter'\n : 'all',\n )\n if (last?.fieldIds?.length) {\n const resolved = resolveTransferFieldSelection(built, last.fieldIds)\n setPresetId(last.presetId ?? CUSTOM_SELECTION)\n setFieldIds(resolved.fieldIds)\n setUnknown(resolved.unknown)\n } else {\n const first = defaultPresetOf(loaded)\n setPresetId(first)\n setFieldIds(resolveTransferPreset(built, first, loadedHints).fieldIds)\n setUnknown([])\n }\n })\n .catch(\n (reason: unknown) =>\n live &&\n setError(\n reason instanceof Error\n ? reason.message\n : 'The fields could not be loaded.',\n ),\n )\n return () => {\n live = false\n }\n }, [open, client, resource, selectionCount, hasFilter, filterKey])\n\n const choosePreset = (id: string) => {\n if (!catalog) return\n setPresetId(id)\n if (id === CUSTOM_SELECTION) return\n const saved =\n resourcePresets.find((preset) => preset.id === id) ??\n presets.find((preset) => preset.id === id)\n const resolved = resolveTransferPreset(\n catalog,\n saved ?? (id as TransferPresetId),\n hints,\n )\n setFieldIds(resolved.fieldIds)\n setUnknown(resolved.unknown)\n }\n\n const savePreset = async () => {\n const label = presetName.trim()\n if (!label || !fieldIds.length) return\n const preset: TransferSavedPreset = {\n id: `preset-${Date.now().toString(36)}`,\n label,\n fieldIds,\n }\n try {\n const saved = await client.savePrefs({\n resource,\n prefs: { presets: [...presets, preset] },\n })\n setPresets(saved.presets)\n setPresetId(preset.id)\n setPresetName('')\n } catch (reason) {\n setError(\n reason instanceof Error\n ? reason.message\n : 'The preset could not be saved.',\n )\n }\n }\n\n const runExport = async () => {\n const exportScope: TransferExportScope =\n scope === 'selection'\n ? { kind: 'selection', ids: [...(selection ?? [])] }\n : scope === 'filter'\n ? { kind: 'filter', filter: filter?.value }\n : { kind: 'all' }\n setBusy(true)\n setError(null)\n try {\n const result = await client.export({\n resource,\n fieldIds,\n scope: exportScope,\n format,\n bom: format === 'csv' && bom,\n ...(headers && format === 'csv' ? { headers: { ...headers } } : {}),\n })\n ;(\n props.download ??\n ((file: TransferExportResponse) =>\n downloadTransferFile(file.fileName, file.body))\n )(result)\n await client.savePrefs({\n resource,\n prefs: {\n export: {\n presetId: presetId === CUSTOM_SELECTION ? null : presetId,\n fieldIds,\n format,\n bom,\n scope,\n },\n },\n })\n props.onExported?.(result)\n onClose()\n } catch (reason) {\n setError(reason instanceof Error ? reason.message : 'The export failed.')\n } finally {\n setBusy(false)\n }\n }\n\n const title =\n props.title ??\n (info ? `Export ${info.resource.label.toLowerCase()}` : 'Export')\n // A file of a resource that is never imported is not \"re-importable\".\n const presetOptions = [\n ...TRANSFER_PRESET_IDS.filter(\n (id) => id !== 'reimportable' || !info?.resource.exportOnly,\n ).map((id) => ({ value: id, ...PRESET_WORDS[id] })),\n ...resourcePresets.map((preset) => ({\n value: preset.id,\n label: preset.label,\n description:\n preset.description ?? countOf(preset.fieldIds.length, 'field'),\n })),\n ...presets.map((preset) => ({\n value: preset.id,\n label: preset.label,\n description: countOf(preset.fieldIds.length, 'field'),\n })),\n {\n value: CUSTOM_SELECTION,\n label: 'Hand-picked',\n description: 'The fields as you chose them below.',\n },\n ]\n\n return (\n <Dialog\n open={open}\n onClose={busy ? undefined : onClose}\n fullWidth\n maxWidth=\"md\"\n aria-labelledby=\"transfer-export-title\"\n >\n <DialogTitle id=\"transfer-export-title\">{title}</DialogTitle>\n <DialogContent dividers>\n {error ? (\n <Alert severity=\"error\" sx={{ mb: 2 }}>\n {error}\n </Alert>\n ) : null}\n {!catalog ? (\n error ? null : (\n <CircularProgress aria-label=\"Loading fields\" />\n )\n ) : (\n <Stack spacing={3}>\n <Stack\n direction={{ xs: 'column', sm: 'row' }}\n spacing={2}\n sx={{ alignItems: { sm: 'flex-start' } }}\n >\n <TransferChoiceSelect\n label=\"Preset\"\n value={presetId}\n options={presetOptions}\n onChange={choosePreset}\n fullWidth\n />\n <Stack direction=\"row\" spacing={1} sx={{ width: '100%' }}>\n <TextField\n size=\"small\"\n fullWidth\n label=\"Save these fields as\"\n value={presetName}\n onChange={(event) => setPresetName(event.target.value)}\n />\n <Button\n onClick={() => void savePreset()}\n disabled={!presetName.trim() || !fieldIds.length}\n >\n Save preset\n </Button>\n </Stack>\n </Stack>\n {unknown.length ? (\n <Alert severity=\"info\">\n {countOf(unknown.length, 'field')} in this choice no longer{' '}\n {unknown.length === 1 ? 'exists' : 'exist'} and\n {unknown.length === 1 ? ' is' : ' are'} left out:{' '}\n {unknown.join(', ')}.\n </Alert>\n ) : null}\n <TransferFieldPicker\n catalog={catalog}\n selected={fieldIds}\n onChange={(next) => {\n setFieldIds(next)\n setPresetId(CUSTOM_SELECTION)\n setUnknown([])\n }}\n />\n <Stack direction={{ xs: 'column', sm: 'row' }} spacing={3}>\n <FormControl>\n <FormLabel id=\"transfer-export-scope\">Records</FormLabel>\n <RadioGroup\n aria-labelledby=\"transfer-export-scope\"\n value={scope}\n onChange={(event) =>\n setScope(event.target.value as TransferExportScopeKind)\n }\n >\n <FormControlLabel\n value=\"selection\"\n disabled={!selection?.length}\n control={<Radio />}\n label={\n selection?.length\n ? `The ${countOf(selection.length, 'selected record')}`\n : 'The selected records (none selected)'\n }\n />\n <FormControlLabel\n value=\"filter\"\n disabled={!filter}\n control={<Radio />}\n label={\n filter\n ? `The current filter: ${filter.label}`\n : 'The current filter (none applied)'\n }\n />\n <FormControlLabel\n value=\"all\"\n control={<Radio />}\n label={`All ${info?.resource.label.toLowerCase() ?? 'records'}`}\n />\n </RadioGroup>\n </FormControl>\n <FormControl>\n <FormLabel id=\"transfer-export-format\">Format</FormLabel>\n <RadioGroup\n aria-labelledby=\"transfer-export-format\"\n value={format}\n onChange={(event) =>\n setFormat(event.target.value as TransferFormat)\n }\n >\n {(info?.resource.formats ?? ['csv']).map((entry) => (\n <FormControlLabel\n key={entry}\n value={entry}\n control={<Radio />}\n label={FORMAT_WORDS[entry]}\n />\n ))}\n </RadioGroup>\n {format === 'csv' ? (\n <FormControlLabel\n control={\n <Checkbox\n checked={bom}\n onChange={(event) => setBom(event.target.checked)}\n />\n }\n label=\"Start with a byte-order mark (for Excel)\"\n />\n ) : null}\n </FormControl>\n </Stack>\n </Stack>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose} disabled={busy}>\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n onClick={() => void runExport()}\n disabled={busy || !catalog || !fieldIds.length}\n >\n {busy ? 'Exporting…' : `Export ${countOf(fieldIds.length, 'field')}`}\n </Button>\n </DialogActions>\n </Dialog>\n )\n}\n\nexport default TransferExportDialog\n"],"names":["PLATFORM_BRAND_NAME","TRANSFER_PRESET_IDS","buildTransferFieldCatalog","resolveTransferFieldSelection","resolveTransferPreset","Alert","Button","Checkbox","CircularProgress","Dialog","DialogActions","DialogContent","DialogTitle","FormControl","FormControlLabel","FormLabel","Radio","RadioGroup","Stack","TextField","useEffect","useMemo","useState","TransferChoiceSelect","TransferFieldPicker","countOf","PRESET_WORDS","reimportable","label","description","everything","minimal","FORMAT_WORDS","csv","json","ndjson","CUSTOM_SELECTION","defaultPresetOf","info","resource","exportOnly","presetHintsOf","presetHints","matchKeyFieldIds","matchKeys","map","key","fieldId","downloadTransferFile","fileName","body","URL","createObjectURL","url","anchor","document","createElement","href","download","appendChild","click","remove","setTimeout","revokeObjectURL","TransferExportDialog","props","filter","resourcePresets","open","onClose","client","selection","setInfo","error","setError","presetId","setPresetId","fieldIds","setFieldIds","unknown","setUnknown","format","setFormat","bom","setBom","scope","setScope","presets","setPresets","presetName","setPresetName","busy","setBusy","catalog","standard","fields","groups","selectionCount","length","hasFilter","Boolean","filterKey","JSON","stringify","value","hints","headers","find","preset","id","live","parse","then","loaded","formats","last","built","loadedHints","prefs","export","includes","resolved","first","catch","reason","Error","message","choosePreset","saved","savePreset","trim","Date","now","toString","savePrefs","runExport","exportScope","kind","ids","result","file","onExported","title","toLowerCase","presetOptions","undefined","fullWidth","maxWidth","aria-labelledby","dividers","severity","sx","mb","aria-label","spacing","direction","xs","sm","alignItems","options","onChange","width","size","event","target","onClick","disabled","join","selected","next","control","entry","checked","variant"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../libs/aglyn-transfer-ui/src/lib/transfer-export-dialog.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'use client'\n\n/**\n * Export: every field offered, the person picks which.\n *\n * Presets fill the picker — Re-importable (the default: the Aglyn ID and\n * the match keys first, then every writable field, so the file comes back\n * in and finds its records), Everything, Minimal, the resource's own\n * presets (another product's layout, written under that product's column\n * names) and the presets the person saved. Any change after a preset is a\n * hand-picked list. The scope\n * (the selection, the current filter, or everything), the format and the\n * byte-order mark complete the choice, and the whole choice is remembered\n * through the client for the next export of the same resource.\n */\n\nimport { PLATFORM_BRAND_NAME } from '@aglyn/aglyn/app-utils/platform-brand'\nimport {\n TRANSFER_PRESET_IDS,\n buildTransferFieldCatalog,\n resolveTransferFieldSelection,\n resolveTransferPreset,\n} from '@aglyn/aglyn/data-transfer'\nimport type {\n TransferFieldCatalog,\n TransferFormat,\n TransferPresetHints,\n TransferPresetId,\n TransferSavedPreset,\n} from '@aglyn/aglyn/data-transfer'\nimport {\n Alert,\n Button,\n Checkbox,\n CircularProgress,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n FormControl,\n FormControlLabel,\n FormLabel,\n Radio,\n RadioGroup,\n Stack,\n TextField,\n} from '@mui/material'\nimport { useEffect, useMemo, useState } from 'react'\n\nimport type {\n TransferClient,\n TransferExportResponse,\n TransferExportScope,\n TransferExportScopeKind,\n TransferResourceInfo,\n} from './transfer-client'\nimport { TransferChoiceSelect } from './transfer-choice-select.component'\nimport { TransferFieldPicker } from './transfer-field-picker.component'\nimport { countOf } from './transfer-words'\n\nconst PRESET_WORDS: Readonly<\n Record<TransferPresetId, { label: string; description: string }>\n> = {\n reimportable: {\n label: 'Re-importable',\n description: `The ${PLATFORM_BRAND_NAME} ID, the match keys and every field an import can write.`,\n },\n everything: {\n label: 'Everything',\n description: 'Every field, including computed and system fields.',\n },\n minimal: {\n label: 'Minimal',\n description: `The ${PLATFORM_BRAND_NAME} ID, the match keys and the required fields.`,\n },\n}\n\nconst FORMAT_WORDS: Readonly<Record<TransferFormat, string>> = {\n csv: 'CSV — opens in a spreadsheet',\n json: 'JSON — one array of records',\n ndjson: 'NDJSON — one record per line',\n}\n\nconst CUSTOM_SELECTION = 'custom'\n\n/**\n * The preset a first export opens on: Re-importable, so the file comes back\n * in — or Everything for an export-only resource, whose fields are all\n * read-only and would leave Re-importable holding the ID alone.\n */\nfunction defaultPresetOf(info: TransferResourceInfo): TransferPresetId {\n return info.resource.exportOnly ? 'everything' : 'reimportable'\n}\n\nexport interface TransferExportDialogProps {\n open: boolean\n onClose(): void\n client: TransferClient\n resource: string\n /** The dialog's title; defaults to \"Export <resource label>\". */\n title?: string\n /** The records the person selected, when there is a selection. */\n selection?: readonly string[]\n /** The list's current filter, when one is applied: what the server reads and how to name it. */\n filter?: { label: string; value: unknown }\n /** A resource preset to open on, over the person's last choice; ignored when the resource has none by that id. */\n preset?: string\n /** Saves the file; defaults to a browser download. */\n download?(result: TransferExportResponse): void\n onExported?(result: TransferExportResponse): void\n}\n\n/** The resource's preset hints; without its own, its match keys lead (the Aglyn ID always leads first). */\nfunction presetHintsOf(info: TransferResourceInfo): TransferPresetHints {\n return (\n info.presetHints ?? {\n matchKeyFieldIds: info.matchKeys.map((key) => key.fieldId),\n }\n )\n}\n\n/** A file handed to the browser as a download. */\nexport function downloadTransferFile(fileName: string, body: Blob): void {\n if (typeof URL === 'undefined' || typeof URL.createObjectURL !== 'function')\n return\n const url = URL.createObjectURL(body)\n const anchor = document.createElement('a')\n anchor.href = url\n anchor.download = fileName\n document.body.appendChild(anchor)\n anchor.click()\n anchor.remove()\n setTimeout(() => URL.revokeObjectURL(url), 0)\n}\n\nexport function TransferExportDialog(props: TransferExportDialogProps) {\n const { open, onClose, client, resource, selection, filter, preset } = props\n const [info, setInfo] = useState<TransferResourceInfo | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [presetId, setPresetId] = useState<string>('reimportable')\n const [fieldIds, setFieldIds] = useState<string[]>([])\n const [unknown, setUnknown] = useState<string[]>([])\n const [format, setFormat] = useState<TransferFormat>('csv')\n const [bom, setBom] = useState(false)\n const [scope, setScope] = useState<TransferExportScopeKind>('all')\n const [presets, setPresets] = useState<TransferSavedPreset[]>([])\n const [presetName, setPresetName] = useState('')\n const [busy, setBusy] = useState(false)\n\n const catalog: TransferFieldCatalog | null = useMemo(\n () =>\n info\n ? buildTransferFieldCatalog({\n standard: info.fields,\n groups: info.groups,\n })\n : null,\n [info],\n )\n const selectionCount = selection?.length ?? 0\n const hasFilter = Boolean(filter)\n // The filter's value as text, so a parent re-creating the same filter does not reload the fields.\n const filterKey = filter ? JSON.stringify(filter.value ?? null) : null\n const hints = useMemo(() => (info ? presetHintsOf(info) : {}), [info])\n const resourcePresets = useMemo(() => info?.resourcePresets ?? [], [info])\n /*\n * A resource preset laid out for another product names its own columns;\n * they are written only while that preset is chosen as it stands — the\n * moment the person changes a field, the columns are the fields' labels.\n */\n const headers = resourcePresets.find((preset) => preset.id === presetId)\n ?.headers\n\n useEffect(() => {\n if (!open) return\n let live = true\n client\n .fields(filterKey === null ? { resource } : { resource, filter: JSON.parse(filterKey) as unknown })\n .then((loaded) => {\n if (!live) return\n setError(null)\n const built = buildTransferFieldCatalog({\n standard: loaded.fields,\n groups: loaded.groups,\n })\n const loadedHints = presetHintsOf(loaded)\n const last = loaded.prefs.export\n const formats = loaded.resource.formats\n setInfo(loaded)\n setPresets(loaded.prefs.presets ?? [])\n setFormat(\n last && formats.includes(last.format)\n ? last.format\n : (formats[0] ?? 'csv'),\n )\n setBom(last?.bom ?? false)\n setScope(\n selectionCount\n ? 'selection'\n : hasFilter\n ? last?.scope === 'all'\n ? 'all'\n : 'filter'\n : 'all',\n )\n const asked = preset ? (loaded.resourcePresets ?? []).find((entry) => entry.id === preset) : undefined\n if (asked) {\n setPresetId(asked.id)\n setFieldIds(resolveTransferPreset(built, asked, loadedHints).fieldIds)\n setUnknown([])\n } else if (last?.fieldIds?.length) {\n const resolved = resolveTransferFieldSelection(built, last.fieldIds)\n setPresetId(last.presetId ?? CUSTOM_SELECTION)\n setFieldIds(resolved.fieldIds)\n setUnknown(resolved.unknown)\n } else {\n const first = defaultPresetOf(loaded)\n setPresetId(first)\n setFieldIds(resolveTransferPreset(built, first, loadedHints).fieldIds)\n setUnknown([])\n }\n })\n .catch(\n (reason: unknown) =>\n live &&\n setError(\n reason instanceof Error\n ? reason.message\n : 'The fields could not be loaded.',\n ),\n )\n return () => {\n live = false\n }\n }, [open, client, resource, selectionCount, hasFilter, filterKey, preset])\n\n const choosePreset = (id: string) => {\n if (!catalog) return\n setPresetId(id)\n if (id === CUSTOM_SELECTION) return\n const saved =\n resourcePresets.find((preset) => preset.id === id) ??\n presets.find((preset) => preset.id === id)\n const resolved = resolveTransferPreset(\n catalog,\n saved ?? (id as TransferPresetId),\n hints,\n )\n setFieldIds(resolved.fieldIds)\n setUnknown(resolved.unknown)\n }\n\n const savePreset = async () => {\n const label = presetName.trim()\n if (!label || !fieldIds.length) return\n const preset: TransferSavedPreset = {\n id: `preset-${Date.now().toString(36)}`,\n label,\n fieldIds,\n }\n try {\n const saved = await client.savePrefs({\n resource,\n prefs: { presets: [...presets, preset] },\n })\n setPresets(saved.presets)\n setPresetId(preset.id)\n setPresetName('')\n } catch (reason) {\n setError(\n reason instanceof Error\n ? reason.message\n : 'The preset could not be saved.',\n )\n }\n }\n\n const runExport = async () => {\n const exportScope: TransferExportScope =\n scope === 'selection'\n ? { kind: 'selection', ids: [...(selection ?? [])] }\n : scope === 'filter'\n ? { kind: 'filter', filter: filter?.value }\n : { kind: 'all' }\n setBusy(true)\n setError(null)\n try {\n const result = await client.export({\n resource,\n fieldIds,\n scope: exportScope,\n format,\n bom: format === 'csv' && bom,\n ...(headers && format === 'csv' ? { headers: { ...headers } } : {}),\n })\n ;(\n props.download ??\n ((file: TransferExportResponse) =>\n downloadTransferFile(file.fileName, file.body))\n )(result)\n await client.savePrefs({\n resource,\n prefs: {\n export: {\n presetId: presetId === CUSTOM_SELECTION ? null : presetId,\n fieldIds,\n format,\n bom,\n scope,\n },\n },\n })\n props.onExported?.(result)\n onClose()\n } catch (reason) {\n setError(reason instanceof Error ? reason.message : 'The export failed.')\n } finally {\n setBusy(false)\n }\n }\n\n const title =\n props.title ??\n (info ? `Export ${info.resource.label.toLowerCase()}` : 'Export')\n // A file of a resource that is never imported is not \"re-importable\".\n const presetOptions = [\n ...TRANSFER_PRESET_IDS.filter(\n (id) => id !== 'reimportable' || !info?.resource.exportOnly,\n ).map((id) => ({ value: id, ...PRESET_WORDS[id] })),\n ...resourcePresets.map((preset) => ({\n value: preset.id,\n label: preset.label,\n description:\n preset.description ?? countOf(preset.fieldIds.length, 'field'),\n })),\n ...presets.map((preset) => ({\n value: preset.id,\n label: preset.label,\n description: countOf(preset.fieldIds.length, 'field'),\n })),\n {\n value: CUSTOM_SELECTION,\n label: 'Hand-picked',\n description: 'The fields as you chose them below.',\n },\n ]\n\n return (\n <Dialog\n open={open}\n onClose={busy ? undefined : onClose}\n fullWidth\n maxWidth=\"md\"\n aria-labelledby=\"transfer-export-title\"\n >\n <DialogTitle id=\"transfer-export-title\">{title}</DialogTitle>\n <DialogContent dividers>\n {error ? (\n <Alert severity=\"error\" sx={{ mb: 2 }}>\n {error}\n </Alert>\n ) : null}\n {!catalog ? (\n error ? null : (\n <CircularProgress aria-label=\"Loading fields\" />\n )\n ) : (\n <Stack spacing={3}>\n <Stack\n direction={{ xs: 'column', sm: 'row' }}\n spacing={2}\n sx={{ alignItems: { sm: 'flex-start' } }}\n >\n <TransferChoiceSelect\n label=\"Preset\"\n value={presetId}\n options={presetOptions}\n onChange={choosePreset}\n fullWidth\n />\n <Stack direction=\"row\" spacing={1} sx={{ width: '100%' }}>\n <TextField\n size=\"small\"\n fullWidth\n label=\"Save these fields as\"\n value={presetName}\n onChange={(event) => setPresetName(event.target.value)}\n />\n <Button\n onClick={() => void savePreset()}\n disabled={!presetName.trim() || !fieldIds.length}\n >\n Save preset\n </Button>\n </Stack>\n </Stack>\n {unknown.length ? (\n <Alert severity=\"info\">\n {countOf(unknown.length, 'field')} in this choice no longer{' '}\n {unknown.length === 1 ? 'exists' : 'exist'} and\n {unknown.length === 1 ? ' is' : ' are'} left out:{' '}\n {unknown.join(', ')}.\n </Alert>\n ) : null}\n <TransferFieldPicker\n catalog={catalog}\n selected={fieldIds}\n onChange={(next) => {\n setFieldIds(next)\n setPresetId(CUSTOM_SELECTION)\n setUnknown([])\n }}\n />\n <Stack direction={{ xs: 'column', sm: 'row' }} spacing={3}>\n <FormControl>\n <FormLabel id=\"transfer-export-scope\">Records</FormLabel>\n <RadioGroup\n aria-labelledby=\"transfer-export-scope\"\n value={scope}\n onChange={(event) =>\n setScope(event.target.value as TransferExportScopeKind)\n }\n >\n <FormControlLabel\n value=\"selection\"\n disabled={!selection?.length}\n control={<Radio />}\n label={\n selection?.length\n ? `The ${countOf(selection.length, 'selected record')}`\n : 'The selected records (none selected)'\n }\n />\n <FormControlLabel\n value=\"filter\"\n disabled={!filter}\n control={<Radio />}\n label={\n filter\n ? `The current filter: ${filter.label}`\n : 'The current filter (none applied)'\n }\n />\n <FormControlLabel\n value=\"all\"\n control={<Radio />}\n label={`All ${info?.resource.label.toLowerCase() ?? 'records'}`}\n />\n </RadioGroup>\n </FormControl>\n <FormControl>\n <FormLabel id=\"transfer-export-format\">Format</FormLabel>\n <RadioGroup\n aria-labelledby=\"transfer-export-format\"\n value={format}\n onChange={(event) =>\n setFormat(event.target.value as TransferFormat)\n }\n >\n {(info?.resource.formats ?? ['csv']).map((entry) => (\n <FormControlLabel\n key={entry}\n value={entry}\n control={<Radio />}\n label={FORMAT_WORDS[entry]}\n />\n ))}\n </RadioGroup>\n {format === 'csv' ? (\n <FormControlLabel\n control={\n <Checkbox\n checked={bom}\n onChange={(event) => setBom(event.target.checked)}\n />\n }\n label=\"Start with a byte-order mark (for Excel)\"\n />\n ) : null}\n </FormControl>\n </Stack>\n </Stack>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose} disabled={busy}>\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n onClick={() => void runExport()}\n disabled={busy || !catalog || !fieldIds.length}\n >\n {busy ? 'Exporting…' : `Export ${countOf(fieldIds.length, 'field')}`}\n </Button>\n </DialogActions>\n </Dialog>\n )\n}\n\nexport default TransferExportDialog\n"],"names":["PLATFORM_BRAND_NAME","TRANSFER_PRESET_IDS","buildTransferFieldCatalog","resolveTransferFieldSelection","resolveTransferPreset","Alert","Button","Checkbox","CircularProgress","Dialog","DialogActions","DialogContent","DialogTitle","FormControl","FormControlLabel","FormLabel","Radio","RadioGroup","Stack","TextField","useEffect","useMemo","useState","TransferChoiceSelect","TransferFieldPicker","countOf","PRESET_WORDS","reimportable","label","description","everything","minimal","FORMAT_WORDS","csv","json","ndjson","CUSTOM_SELECTION","defaultPresetOf","info","resource","exportOnly","presetHintsOf","presetHints","matchKeyFieldIds","matchKeys","map","key","fieldId","downloadTransferFile","fileName","body","URL","createObjectURL","url","anchor","document","createElement","href","download","appendChild","click","remove","setTimeout","revokeObjectURL","TransferExportDialog","props","filter","resourcePresets","open","onClose","client","selection","preset","setInfo","error","setError","presetId","setPresetId","fieldIds","setFieldIds","unknown","setUnknown","format","setFormat","bom","setBom","scope","setScope","presets","setPresets","presetName","setPresetName","busy","setBusy","catalog","standard","fields","groups","selectionCount","length","hasFilter","Boolean","filterKey","JSON","stringify","value","hints","headers","find","id","live","parse","then","loaded","formats","last","built","loadedHints","prefs","export","includes","asked","entry","undefined","resolved","first","catch","reason","Error","message","choosePreset","saved","savePreset","trim","Date","now","toString","savePrefs","runExport","exportScope","kind","ids","result","file","onExported","title","toLowerCase","presetOptions","fullWidth","maxWidth","aria-labelledby","dividers","severity","sx","mb","aria-label","spacing","direction","xs","sm","alignItems","options","onChange","width","size","event","target","onClick","disabled","join","selected","next","control","checked","variant"],"mappings":"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"}