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

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.232",
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.232",
29
+ "@aglyn/shared-ui-jsx": "1.0.0-beta.232",
30
30
  "@swc/helpers": "0.5.23"
31
31
  },
32
32
  "peerDependencies": {
@@ -387,6 +387,7 @@ export function PackageImportWizard(props) {
387
387
  spacing: 2,
388
388
  children: [
389
389
  /*#__PURE__*/ _jsxs(Stack, {
390
+ useFlexGap: true,
390
391
  direction: "row",
391
392
  spacing: 2,
392
393
  sx: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../libs/aglyn-transfer-ui/src/lib/package-import-wizard.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 * The site package import wizard (AGL-3534): nothing about an item is\n * decided silently.\n *\n * Upload → Items → Missing items → Changes → Review → Import\n *\n * Items are grouped by kind with their status (new, differs, already on\n * this site, needs something); each takes a decision — add, replace, keep\n * both, skip, or merge for settings and the theme — from the person's own\n * choice, the default they set for its kind of change, or the plan's\n * proposal. A dependency the import would leave pointing at nothing is\n * imported from the file, pointed at an item the site has, removed, or left.\n * Each changed item is shown against this site's copy, rendered side by side\n * and value by value, and a merged item is chosen key by key. The review\n * re-plans with every decision, says whether a plan limit refuses it, and\n * waits for each warning class to be acknowledged. An applied import can be\n * undone from its last step.\n */\n\nimport type { PackageItemDecision } from '@aglyn/aglyn/data-transfer'\nimport { ScrollTable } from '@aglyn/shared-ui-jsx/components/scroll-table.component'\nimport {\n Alert,\n Autocomplete,\n Box,\n Button,\n Chip,\n CircularProgress,\n List,\n ListItemButton,\n ListItemText,\n Stack,\n Step,\n StepButton,\n StepLabel,\n Stepper,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n TextField,\n Typography,\n} from '@mui/material'\nimport { type ChangeEvent, type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nimport { PackageImportUndo } from './package-import-undo.component'\nimport {\n PackageItemDiff,\n type PackageItemRenderers,\n type PackagePreviewHref,\n} from './package-item-diff.component'\nimport type {\n SitePackageApplyAnswer,\n SitePackageCatalog,\n SitePackageClient,\n SitePackageComparison,\n SitePackageDependencyChoice,\n SitePackageMergeChoice,\n SitePackagePlanAnswer,\n SitePackagePlanItem,\n SitePackageUndoAnswer,\n} from './site-package-client'\nimport {\n INITIAL_PACKAGE_BULK_DEFAULTS,\n PACKAGE_BULK_CHOICES,\n PACKAGE_DECISION_WORDS,\n PACKAGE_STATUS_WORDS,\n type PackageBulkDefaults,\n type PackageDependencyPrompt,\n packageAcknowledgements,\n packageDecided,\n packageDecisionCounts,\n packageDecisionOptions,\n packageDecisions,\n packageDependencyAnswer,\n packageDependencyOptions,\n packageDependencyPrompts,\n packageDependencyProblems,\n packageItemTitle,\n} from './site-package-import-state'\nimport { TransferAcknowledgementList } from './transfer-acknowledgement-list.component'\nimport { TransferChoiceSelect } from './transfer-choice-select.component'\nimport { TransferWizardNav } from './transfer-wizard-nav.component'\nimport { countOf } from './transfer-words'\n\nexport type PackageImportStep = 'upload' | 'items' | 'dependencies' | 'changes' | 'review' | 'results'\n\nconst STEPS: ReadonlyArray<{ id: PackageImportStep; label: string }> = [\n { id: 'upload', label: 'Upload' },\n { id: 'items', label: 'Items' },\n { id: 'dependencies', label: 'Missing items' },\n { id: 'changes', label: 'Changes' },\n { id: 'review', label: 'Review' },\n { id: 'results', label: 'Import' },\n]\n\n/** Rows shown per kind before \"Show more\". */\nconst GROUP_PAGE = 50\n\nexport interface PackageImportWizardProps {\n client: SitePackageClient\n /** A URL rendering one side of one item, or `null`; omitted, no rendered diff. */\n previewHref?: PackagePreviewHref\n /**\n * A component per kind that draws one side of an item in place; a kind it\n * names is drawn by it instead of through `previewHref`.\n */\n renderers?: PackageItemRenderers\n /** A file already read: the wizard plans it and opens on Items. */\n initialFile?: { name: string; content: unknown }\n /** Told the import's id once it is applied, so the surface can offer undo later. */\n onImported?(answer: SitePackageApplyAnswer): void\n /** Told when the import is undone from the last step. */\n onUndone?(answer: SitePackageUndoAnswer): void\n /** Called from the last step's Done. */\n onDone?(): void\n}\n\nconst message = (error: unknown) =>\n error instanceof SyntaxError\n ? 'That file is not a site package or backup.'\n : error instanceof Error && error.message\n ? error.message\n : 'Something went wrong. Try again.'\n\nfunction readFileText(file: File): Promise<string> {\n if (typeof file.text === 'function') return file.text()\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(String(reader.result ?? ''))\n reader.onerror = () => reject(reader.error)\n reader.readAsText(file)\n })\n}\n\nconst MATCHED_BY_WORDS: Record<NonNullable<SitePackagePlanItem['matchedBy']>, string> = {\n id: 'by ID',\n slug: 'by address',\n name: 'by name',\n}\n\nexport function PackageImportWizard(props: PackageImportWizardProps) {\n const { client, previewHref, renderers, initialFile, onImported, onUndone, onDone } = props\n const [step, setStep] = useState<PackageImportStep>('upload')\n const [file, setFile] = useState<{ name: string; content: unknown } | null>(null)\n const [answer, setAnswer] = useState<SitePackagePlanAnswer | null>(null)\n const [review, setReview] = useState<SitePackagePlanAnswer | null>(null)\n const [overrides, setOverrides] = useState<Record<string, PackageItemDecision>>({})\n const [bulk, setBulk] = useState<PackageBulkDefaults>(INITIAL_PACKAGE_BULK_DEFAULTS)\n const [dependencyChoices, setDependencyChoices] = useState<Record<string, SitePackageDependencyChoice>>({})\n const [mergeChoices, setMergeChoices] = useState<Record<string, Record<string, SitePackageMergeChoice>>>({})\n const [comparisons, setComparisons] = useState<Record<string, SitePackageComparison>>({})\n const [selected, setSelected] = useState<string | null>(null)\n const [acknowledged, setAcknowledged] = useState<string[]>([])\n const [catalog, setCatalog] = useState<SitePackageCatalog | null>(null)\n const [result, setResult] = useState<SitePackageApplyAnswer | null>(null)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n\n const run = useCallback(async (work: () => Promise<void>) => {\n setBusy(true)\n setError(null)\n try {\n await work()\n } catch (caught) {\n setError(message(caught))\n } finally {\n setBusy(false)\n }\n }, [])\n\n const plan = answer?.plan ?? null\n const byKey = useMemo(() => new Map((plan?.items ?? []).map((item) => [item.key, item])), [plan])\n const titleOf = useCallback((key: string) => {\n const item = byKey.get(key)\n return item ? packageItemTitle(item) : key\n }, [byKey])\n const kindLabel = useCallback(\n (kind: string) => plan?.kinds.find((one) => one.kind === kind)?.label ?? kind,\n [plan],\n )\n\n const { decisions, undecided } = useMemo(\n () => (plan ? packageDecisions(plan, overrides, bulk) : { decisions: {}, undecided: [] }),\n [plan, overrides, bulk],\n )\n const prompts = useMemo(() => (plan ? packageDependencyPrompts(plan, decisions) : []), [plan, decisions])\n // A dependency the file carries is imported from it unless the person says otherwise.\n const effectiveDependencyChoices = useMemo(() => {\n const out: Record<string, SitePackageDependencyChoice> = {}\n for (const prompt of prompts) {\n const choice = dependencyChoices[prompt.key] ?? (prompt.inPackage ? 'import' : undefined)\n if (choice) out[prompt.key] = choice\n }\n return out\n }, [prompts, dependencyChoices])\n const decided = useMemo(\n () => packageDecided(decisions, prompts, effectiveDependencyChoices, mergeChoices),\n [decisions, prompts, effectiveDependencyChoices, mergeChoices],\n )\n\n const planFile = useCallback(\n (next: { name: string; content: unknown }) =>\n run(async () => {\n const planned = await client.plan(next.content)\n setFile(next)\n setAnswer(planned)\n setOverrides({})\n setBulk(INITIAL_PACKAGE_BULK_DEFAULTS)\n setDependencyChoices({})\n setMergeChoices({})\n setComparisons({})\n setSelected(null)\n setStep('items')\n }),\n [client, run],\n )\n\n const started = useRef(false)\n useEffect(() => {\n if (!initialFile || started.current) return\n started.current = true\n void planFile(initialFile)\n }, [initialFile, planFile])\n\n const onFile = async (event: ChangeEvent<HTMLInputElement>) => {\n const chosen = event.target.files?.[0]\n event.target.value = ''\n if (!chosen) return\n await run(async () => {\n const content = JSON.parse(await readFileText(chosen))\n await planFile({ name: chosen.name, content })\n })\n }\n\n const compare = useCallback(\n async (key: string) => {\n if (!file || comparisons[key]) return\n await run(async () => {\n const answered = await client.compare(file.content, [key])\n setComparisons((current) => ({\n ...current,\n ...Object.fromEntries(answered.map((one) => [one.key, one])),\n }))\n })\n },\n [client, file, comparisons, run],\n )\n\n const loadCatalog = useCallback(async () => {\n if (catalog) return\n await run(async () => setCatalog(await client.catalog()))\n }, [catalog, client, run])\n\n const toReview = () =>\n run(async () => {\n if (!file) return\n setReview(await client.plan(file.content, decided))\n setAcknowledged([])\n setStep('review')\n })\n\n const apply = () =>\n run(async () => {\n if (!file) return\n const applied = await client.apply(file.content, decided)\n setResult(applied)\n setStep('results')\n onImported?.(applied)\n })\n\n const changed = useMemo(\n () =>\n (plan?.items ?? []).filter((item) => {\n if (!item.existing) return false\n const decision = decisions[item.key]\n return item.comparison === 'differs' || (decision !== undefined && decision !== 'skip')\n }),\n [plan, decisions],\n )\n\n const goChanges = (key?: string) => {\n const first = key ?? selected ?? changed[0]?.key ?? null\n setSelected(first)\n setStep('changes')\n if (first) void compare(first)\n }\n\n const stepIndex = STEPS.findIndex((one) => one.id === step)\n const locked = step === 'results'\n\n let body: ReactNode = null\n if (step === 'upload') {\n body = (\n <Stack spacing={2}>\n <Typography variant=\"body2\">\n Choose a site package, or a backup downloaded from any of your sites. Nothing is written until you\n import on the last step.\n </Typography>\n <Box>\n <Button variant=\"outlined\" disabled={busy} onClick={() => inputRef.current?.click()}>\n Choose a file\n </Button>\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"application/json,.json\"\n hidden\n aria-label=\"Package file\"\n onChange={(event) => void onFile(event)}\n />\n </Box>\n {file ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {file.name}\n </Typography>\n ) : null}\n {answer ? <TransferWizardNav onNext={() => setStep('items')} busy={busy} /> : null}\n </Stack>\n )\n } else if (step === 'items' && plan && answer) {\n body = (\n <ItemsStep\n fileName={file?.name ?? ''}\n answer={answer}\n decisions={decisions}\n overrides={overrides}\n bulk={bulk}\n busy={busy}\n onBulk={(comparison, decision) => setBulk((current) => ({ ...current, [comparison]: decision }))}\n onDecision={(key, decision) => setOverrides((current) => ({ ...current, [key]: decision }))}\n onCompare={(key) => goChanges(key)}\n blockers={\n undecided.length\n ? [\n `Choose what to do with ${countOf(undecided.length, 'changed item')}: set a default for changed items, or choose for each.`,\n ]\n : []\n }\n onBack={() => setStep('upload')}\n onNext={() => setStep('dependencies')}\n />\n )\n } else if (step === 'dependencies' && plan) {\n body = (\n <DependenciesStep\n prompts={prompts}\n choices={effectiveDependencyChoices}\n catalog={catalog}\n busy={busy}\n titleOf={titleOf}\n kindLabel={kindLabel}\n onNeedCatalog={() => void loadCatalog()}\n onChoice={(key, choice) => setDependencyChoices((current) => ({ ...current, [key]: choice }))}\n onBack={() => setStep('items')}\n onNext={() => goChanges()}\n />\n )\n } else if (step === 'changes' && plan) {\n const item = selected ? byKey.get(selected) : undefined\n const comparison = selected ? comparisons[selected] : undefined\n const decision = item ? (decisions[item.key] ?? null) : null\n body = (\n <Stack spacing={2}>\n {changed.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n Nothing this site holds is changed by the import.\n </Typography>\n ) : (\n <Stack direction={{ xs: 'column', md: 'row' }} spacing={2}>\n <Box sx={{ width: { md: 280 }, flexShrink: 0 }}>\n <List dense aria-label=\"Changed items\" sx={{ maxHeight: 520, overflowY: 'auto' }}>\n {changed.map((one) => {\n const chosen = decisions[one.key]\n return (\n <ListItemButton\n key={one.key}\n selected={one.key === selected}\n onClick={() => {\n setSelected(one.key)\n void compare(one.key)\n }}\n >\n <ListItemText\n primary={packageItemTitle(one)}\n secondary={`${kindLabel(one.kind)} · ${chosen ? PACKAGE_DECISION_WORDS[chosen].label : 'Not chosen'}`}\n />\n </ListItemButton>\n )\n })}\n </List>\n </Box>\n <Box sx={{ flex: 1, minWidth: 0 }}>\n {item ? (\n <Stack spacing={2}>\n <Stack direction=\"row\" spacing={2} sx={{ alignItems: 'center', flexWrap: 'wrap' }}>\n <Typography variant=\"h6\" component=\"h3\">\n {packageItemTitle(item)}\n </Typography>\n <TransferChoiceSelect<PackageItemDecision>\n label=\"Decision\"\n value={decision ?? ''}\n placeholder=\"Choose…\"\n options={packageDecisionOptions(item.choices)}\n onChange={(next) => setOverrides((current) => ({ ...current, [item.key]: next }))}\n />\n </Stack>\n {comparison ? (\n <PackageItemDiff\n item={item}\n comparison={comparison}\n decision={decision}\n {...(previewHref ? { previewHref } : {})}\n {...(renderers ? { renderers } : {})}\n mergeChoices={mergeChoices[item.key] ?? {}}\n onMergeChoice={(key, choice) =>\n setMergeChoices((current) => ({\n ...current,\n [item.key]: { ...(current[item.key] ?? {}), [key]: choice },\n }))\n }\n />\n ) : (\n <CircularProgress size={24} aria-label=\"Comparing\" />\n )}\n </Stack>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\n Choose an item to see what changes.\n </Typography>\n )}\n </Box>\n </Stack>\n )}\n <TransferWizardNav\n busy={busy}\n blockers={\n undecided.length\n ? [`Choose what to do with ${countOf(undecided.length, 'changed item')}.`]\n : []\n }\n onBack={() => setStep('dependencies')}\n onNext={() => void toReview()}\n nextLabel=\"Review\"\n />\n </Stack>\n )\n } else if (step === 'review' && review) {\n const acknowledgements = packageAcknowledgements(review, decisions, titleOf)\n const unacknowledged = acknowledgements.filter(\n (one) => one.required && !acknowledged.includes(one.id),\n ).length\n const counts = packageDecisionCounts(decisions)\n body = (\n <Stack spacing={2}>\n <Box component=\"ul\" sx={{ m: 0, pl: 2.5 }} aria-label=\"What the import does\">\n {counts.map(({ decision, count }) => (\n <Typography component=\"li\" variant=\"body2\" key={decision}>\n {`${PACKAGE_DECISION_WORDS[decision].label}: ${countOf(count, 'item')}`}\n </Typography>\n ))}\n </Box>\n {review.capRefusal ? <Alert severity=\"error\">{review.capRefusal}</Alert> : null}\n <TransferAcknowledgementList\n items={acknowledgements}\n acknowledged={acknowledged}\n disabled={busy}\n onChange={(id, done) =>\n setAcknowledged((current) => (done ? [...current, id] : current.filter((one) => one !== id)))\n }\n />\n <TransferWizardNav\n busy={busy}\n blockers={[\n ...(review.capRefusal ? ['A plan limit refuses this import. Skip some new items, or upgrade.'] : []),\n ...(unacknowledged ? [`Acknowledge ${countOf(unacknowledged, 'warning')} to import.`] : []),\n ]}\n onBack={() => goChanges()}\n onNext={() => void apply()}\n nextLabel=\"Import\"\n />\n </Stack>\n )\n } else if (step === 'results' && result) {\n const counts = Object.entries(result.counts).filter(([, count]) => count > 0)\n body = (\n <Stack spacing={2}>\n <Alert severity=\"success\">\n {`Imported: ${counts\n .map(([decision, count]) =>\n `${PACKAGE_DECISION_WORDS[decision as PackageItemDecision]?.label ?? decision} ${count.toLocaleString()}`,\n )\n .join(', ')} (${countOf(result.written, 'document')} written).`}\n </Alert>\n <PackageImportUndo client={client} importId={result.importId} {...(onUndone ? { onUndone } : {})} />\n <TransferWizardNav onNext={onDone} nextLabel=\"Done\" />\n </Stack>\n )\n }\n\n return (\n <Stack spacing={3}>\n <Box component=\"nav\" aria-label=\"Import steps\" sx={{ overflowX: 'auto' }}>\n <Stepper nonLinear activeStep={stepIndex} alternativeLabel>\n {STEPS.map((one, index) => {\n const reachable = index < stepIndex && !locked && Boolean(answer)\n return (\n <Step key={one.id} completed={index < stepIndex}>\n {reachable ? (\n <StepButton\n onClick={() => (one.id === 'changes' ? goChanges() : setStep(one.id))}\n >\n {one.label}\n </StepButton>\n ) : (\n <StepLabel aria-current={index === stepIndex ? 'step' : undefined}>{one.label}</StepLabel>\n )}\n </Step>\n )\n })}\n </Stepper>\n </Box>\n {error ? (\n <Alert severity=\"error\" onClose={() => setError(null)}>\n {error}\n </Alert>\n ) : null}\n {busy && step !== 'changes' ? <CircularProgress size={24} aria-label=\"Working\" /> : null}\n <Box>{body}</Box>\n </Stack>\n )\n}\n\n/*==========================================\n * ITEMS\n *=========================================*/\n\ninterface ItemsStepProps {\n fileName: string\n answer: SitePackagePlanAnswer\n decisions: Readonly<Record<string, PackageItemDecision>>\n overrides: Readonly<Record<string, PackageItemDecision>>\n bulk: PackageBulkDefaults\n busy: boolean\n blockers: string[]\n onBulk(comparison: keyof PackageBulkDefaults, decision: PackageItemDecision): void\n onDecision(key: string, decision: PackageItemDecision): void\n onCompare(key: string): void\n onBack(): void\n onNext(): void\n}\n\nconst BULK_LABELS: Record<keyof PackageBulkDefaults, string> = {\n new: 'New items',\n differs: 'Changed items',\n identical: 'Items already on this site',\n}\n\nfunction ItemsStep(props: ItemsStepProps) {\n const { answer, decisions, overrides, bulk } = props\n const { plan } = answer\n const [status, setStatus] = useState('all')\n const [kind, setKind] = useState('all')\n const [search, setSearch] = useState('')\n const [shown, setShown] = useState<Record<string, number>>({})\n const needle = search.trim().toLowerCase()\n const visible = plan.items.filter(\n (item) =>\n (status === 'all' || item.status === status) &&\n (kind === 'all' || item.kind === kind) &&\n (!needle ||\n [item.name, item.slug, item.id].some((value) => value?.toLowerCase().includes(needle))),\n )\n const comparisons = (Object.keys(BULK_LABELS) as Array<keyof PackageBulkDefaults>).filter((one) =>\n plan.items.some((item) => item.comparison === one),\n )\n const counts = plan.counts\n\n return (\n <Stack spacing={2}>\n <Typography variant=\"body2\">\n {`${props.fileName ? `${props.fileName}: ` : ''}${countOf(counts.new, 'new item')}, ` +\n `${countOf(counts.differs, 'item')} that differ from this site’s copy, ` +\n `${countOf(counts.identical, 'item')} already on this site` +\n (counts.missingDependency\n ? `, ${countOf(counts.missingDependency, 'item')} that need something neither the file nor this site holds.`\n : '.')}\n </Typography>\n <Stack spacing={1}>\n <Typography variant=\"subtitle2\" component=\"h3\">\n Defaults\n </Typography>\n <Stack direction={{ xs: 'column', sm: 'row' }} spacing={1.5}>\n {comparisons.map((one) => (\n <TransferChoiceSelect<PackageItemDecision>\n key={one}\n label={BULK_LABELS[one]}\n value={bulk[one]}\n placeholder=\"Choose…\"\n options={packageDecisionOptions(PACKAGE_BULK_CHOICES[one])}\n onChange={(decision) => props.onBulk(one, decision)}\n />\n ))}\n </Stack>\n <Typography variant=\"caption\" color=\"text.secondary\">\n A default applies to every item of that kind you have not chosen for, where the item can take it.\n </Typography>\n </Stack>\n <Stack direction={{ xs: 'column', sm: 'row' }} spacing={1.5}>\n <TransferChoiceSelect\n label=\"Show\"\n value={status}\n onChange={setStatus}\n options={[\n { value: 'all', label: `All (${plan.items.length.toLocaleString()})` },\n ...(Object.keys(PACKAGE_STATUS_WORDS) as Array<keyof typeof PACKAGE_STATUS_WORDS>).map((one) => ({\n value: one,\n label: `${PACKAGE_STATUS_WORDS[one].label} (${counts[one].toLocaleString()})`,\n disabled: counts[one] === 0,\n })),\n ]}\n />\n <TransferChoiceSelect\n label=\"Kind\"\n value={kind}\n onChange={setKind}\n options={[\n { value: 'all', label: 'Every kind' },\n ...plan.kinds.map((one) => ({ value: one.kind, label: `${one.label} (${one.count.toLocaleString()})` })),\n ]}\n />\n <TextField\n size=\"small\"\n label=\"Search\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n />\n </Stack>\n {visible.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n No item matches.\n </Typography>\n ) : null}\n {plan.kinds.map((group) => {\n const items = visible.filter((item) => item.kind === group.kind)\n if (!items.length) return null\n const limit = shown[group.kind] ?? GROUP_PAGE\n return (\n <Stack spacing={1} key={group.kind}>\n <Typography variant=\"subtitle1\" component=\"h3\">\n {`${group.label} (${items.length.toLocaleString()})`}\n </Typography>\n <ScrollTable size=\"small\" aria-label={group.label}>\n <TableHead>\n <TableRow>\n <TableCell>Item</TableCell>\n <TableCell>Status</TableCell>\n <TableCell>On this site</TableCell>\n <TableCell>Decision</TableCell>\n <TableCell />\n </TableRow>\n </TableHead>\n <TableBody>\n {items.slice(0, limit).map((item) => {\n const title = packageItemTitle(item)\n const words = PACKAGE_STATUS_WORDS[item.status]\n return (\n <TableRow key={item.key}>\n <TableCell>\n <Typography variant=\"body2\">{title}</Typography>\n {item.slug && item.slug !== title ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {item.slug}\n </Typography>\n ) : null}\n </TableCell>\n <TableCell>\n <Chip size=\"small\" variant=\"outlined\" label={words.label} color={words.color} />\n {item.missing.length ? (\n <Typography variant=\"caption\" color=\"text.secondary\" component=\"div\">\n {`Needs ${item.missing.map((dep) => `${dep.kind} ${dep.id}`).join(', ')}`}\n </Typography>\n ) : null}\n </TableCell>\n <TableCell>\n {item.existing ? (\n <>\n <Typography variant=\"body2\">{packageItemTitle(item.existing)}</Typography>\n {item.matchedBy ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`Matched ${MATCHED_BY_WORDS[item.matchedBy]}`}\n </Typography>\n ) : null}\n </>\n ) : (\n '—'\n )}\n </TableCell>\n <TableCell>\n <TransferChoiceSelect<PackageItemDecision>\n label={`Decision for ${title}`}\n hideLabel\n value={decisions[item.key] ?? ''}\n placeholder=\"Choose…\"\n options={packageDecisionOptions(item.choices)}\n onChange={(decision) => props.onDecision(item.key, decision)}\n {...(overrides[item.key] ? { helperText: 'Your choice' } : {})}\n />\n </TableCell>\n <TableCell>\n {item.existing && item.comparison === 'differs' ? (\n <Button size=\"small\" onClick={() => props.onCompare(item.key)}>\n {`Compare ${title}`}\n </Button>\n ) : null}\n </TableCell>\n </TableRow>\n )\n })}\n </TableBody>\n </ScrollTable>\n {items.length > limit ? (\n <Box>\n <Button\n size=\"small\"\n onClick={() => setShown((current) => ({ ...current, [group.kind]: limit + GROUP_PAGE }))}\n >\n {`Show ${Math.min(GROUP_PAGE, items.length - limit).toLocaleString()} more ${group.label.toLowerCase()}`}\n </Button>\n </Box>\n ) : null}\n </Stack>\n )\n })}\n <TransferWizardNav busy={props.busy} blockers={props.blockers} onBack={props.onBack} onNext={props.onNext} />\n </Stack>\n )\n}\n\n/*==========================================\n * MISSING ITEMS\n *=========================================*/\n\ninterface DependenciesStepProps {\n prompts: readonly PackageDependencyPrompt[]\n choices: Readonly<Record<string, SitePackageDependencyChoice>>\n catalog: SitePackageCatalog | null\n busy: boolean\n titleOf(key: string): string\n kindLabel(kind: string): string\n onNeedCatalog(): void\n onChoice(key: string, choice: SitePackageDependencyChoice): void\n onBack(): void\n onNext(): void\n}\n\nfunction DependenciesStep(props: DependenciesStepProps) {\n const { prompts, choices, catalog, onNeedCatalog } = props\n const mapping = prompts.some((prompt) => typeof choices[prompt.key] === 'object')\n useEffect(() => {\n if (mapping && !catalog) onNeedCatalog()\n }, [mapping, catalog, onNeedCatalog])\n\n return (\n <Stack spacing={2}>\n {prompts.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n Every item you are importing has what it needs.\n </Typography>\n ) : (\n <>\n <Typography variant=\"body2\">\n These items are named by what you are importing, and this site will not hold them. Choose what to\n do about each.\n </Typography>\n <ScrollTable size=\"small\" aria-label=\"Missing items\">\n <TableHead>\n <TableRow>\n <TableCell>Missing item</TableCell>\n <TableCell>Needed by</TableCell>\n <TableCell>What to do</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {prompts.map((prompt) => {\n const name = prompt.inPackage\n ? packageItemTitle(prompt.inPackage)\n : `${props.kindLabel(prompt.kind)}: ${prompt.id}`\n const choice = choices[prompt.key]\n const answer = packageDependencyAnswer(choice)\n const options = (catalog?.manifest.items ?? []).filter((one) => one.kind === prompt.kind)\n const picked =\n typeof choice === 'object' ? (options.find((one) => one.$id === choice.mapTo) ?? null) : null\n return (\n <TableRow key={prompt.key}>\n <TableCell>\n <Typography variant=\"body2\">{name}</Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {prompt.inPackage ? 'In the file, set to skip' : 'Neither in the file nor on this site'}\n </Typography>\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\">\n {prompt.neededBy.slice(0, 3).map(props.titleOf).join(', ')}\n {prompt.neededBy.length > 3 ? ` and ${(prompt.neededBy.length - 3).toLocaleString()} more` : ''}\n </Typography>\n </TableCell>\n <TableCell>\n <Stack spacing={1}>\n <TransferChoiceSelect\n label={`What to do about ${name}`}\n hideLabel\n value={answer}\n placeholder=\"Choose…\"\n options={packageDependencyOptions(prompt)}\n onChange={(next) => props.onChoice(prompt.key, next === 'mapTo' ? { mapTo: '' } : next)}\n {...(answer === 'drop'\n ? { helperText: `Removed from ${countOf(prompt.neededBy.length, 'item')}.` }\n : {})}\n />\n {answer === 'mapTo' ? (\n <Autocomplete\n size=\"small\"\n options={options}\n loading={!catalog}\n value={picked}\n getOptionLabel={(option) => option.name || option.slug || option.$id}\n isOptionEqualToValue={(option, value) => option.$id === value.$id}\n onChange={(_event, value) => props.onChoice(prompt.key, { mapTo: value?.$id ?? '' })}\n renderInput={(params) => (\n <TextField {...params} label={`Use instead of ${name}`} />\n )}\n />\n ) : null}\n </Stack>\n </TableCell>\n </TableRow>\n )\n })}\n </TableBody>\n </ScrollTable>\n </>\n )}\n <TransferWizardNav\n busy={props.busy}\n blockers={packageDependencyProblems(prompts, choices)}\n onBack={props.onBack}\n onNext={props.onNext}\n />\n </Stack>\n )\n}\n\nexport default PackageImportWizard\n"],"names":["ScrollTable","Alert","Autocomplete","Box","Button","Chip","CircularProgress","List","ListItemButton","ListItemText","Stack","Step","StepButton","StepLabel","Stepper","TableBody","TableCell","TableHead","TableRow","TextField","Typography","useCallback","useEffect","useMemo","useRef","useState","PackageImportUndo","PackageItemDiff","INITIAL_PACKAGE_BULK_DEFAULTS","PACKAGE_BULK_CHOICES","PACKAGE_DECISION_WORDS","PACKAGE_STATUS_WORDS","packageAcknowledgements","packageDecided","packageDecisionCounts","packageDecisionOptions","packageDecisions","packageDependencyAnswer","packageDependencyOptions","packageDependencyPrompts","packageDependencyProblems","packageItemTitle","TransferAcknowledgementList","TransferChoiceSelect","TransferWizardNav","countOf","STEPS","id","label","GROUP_PAGE","message","error","SyntaxError","Error","readFileText","file","text","Promise","resolve","reject","reader","FileReader","onload","String","result","onerror","readAsText","MATCHED_BY_WORDS","slug","name","PackageImportWizard","props","client","previewHref","renderers","initialFile","onImported","onUndone","onDone","step","setStep","setFile","answer","setAnswer","review","setReview","overrides","setOverrides","bulk","setBulk","dependencyChoices","setDependencyChoices","mergeChoices","setMergeChoices","comparisons","setComparisons","selected","setSelected","acknowledged","setAcknowledged","catalog","setCatalog","setResult","busy","setBusy","setError","inputRef","run","work","caught","plan","byKey","Map","items","map","item","key","titleOf","get","kindLabel","kind","kinds","find","one","decisions","undecided","prompts","effectiveDependencyChoices","out","prompt","choice","inPackage","undefined","decided","planFile","next","planned","content","started","current","onFile","event","chosen","target","files","value","JSON","parse","compare","answered","Object","fromEntries","loadCatalog","toReview","apply","applied","changed","filter","existing","decision","comparison","goChanges","first","stepIndex","findIndex","locked","body","spacing","variant","disabled","onClick","click","input","ref","type","accept","hidden","aria-label","onChange","color","onNext","ItemsStep","fileName","onBulk","onDecision","onCompare","blockers","length","onBack","DependenciesStep","choices","onNeedCatalog","onChoice","direction","xs","md","sx","width","flexShrink","dense","maxHeight","overflowY","primary","secondary","flex","minWidth","alignItems","flexWrap","component","placeholder","options","onMergeChoice","size","nextLabel","acknowledgements","unacknowledged","required","includes","counts","m","pl","count","capRefusal","severity","done","entries","toLocaleString","join","written","importId","overflowX","nonLinear","activeStep","alternativeLabel","index","reachable","Boolean","completed","aria-current","onClose","BULK_LABELS","new","differs","identical","status","setStatus","setKind","search","setSearch","shown","setShown","needle","trim","toLowerCase","visible","some","keys","missingDependency","sm","group","limit","slice","title","words","missing","dep","matchedBy","hideLabel","helperText","Math","min","mapping","manifest","picked","$id","mapTo","neededBy","loading","getOptionLabel","option","isOptionEqualToValue","_event","renderInput","params"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../libs/aglyn-transfer-ui/src/lib/package-import-wizard.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 * The site package import wizard (AGL-3534): nothing about an item is\n * decided silently.\n *\n * Upload → Items → Missing items → Changes → Review → Import\n *\n * Items are grouped by kind with their status (new, differs, already on\n * this site, needs something); each takes a decision — add, replace, keep\n * both, skip, or merge for settings and the theme — from the person's own\n * choice, the default they set for its kind of change, or the plan's\n * proposal. A dependency the import would leave pointing at nothing is\n * imported from the file, pointed at an item the site has, removed, or left.\n * Each changed item is shown against this site's copy, rendered side by side\n * and value by value, and a merged item is chosen key by key. The review\n * re-plans with every decision, says whether a plan limit refuses it, and\n * waits for each warning class to be acknowledged. An applied import can be\n * undone from its last step.\n */\n\nimport type { PackageItemDecision } from '@aglyn/aglyn/data-transfer'\nimport { ScrollTable } from '@aglyn/shared-ui-jsx/components/scroll-table.component'\nimport {\n Alert,\n Autocomplete,\n Box,\n Button,\n Chip,\n CircularProgress,\n List,\n ListItemButton,\n ListItemText,\n Stack,\n Step,\n StepButton,\n StepLabel,\n Stepper,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n TextField,\n Typography,\n} from '@mui/material'\nimport { type ChangeEvent, type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nimport { PackageImportUndo } from './package-import-undo.component'\nimport {\n PackageItemDiff,\n type PackageItemRenderers,\n type PackagePreviewHref,\n} from './package-item-diff.component'\nimport type {\n SitePackageApplyAnswer,\n SitePackageCatalog,\n SitePackageClient,\n SitePackageComparison,\n SitePackageDependencyChoice,\n SitePackageMergeChoice,\n SitePackagePlanAnswer,\n SitePackagePlanItem,\n SitePackageUndoAnswer,\n} from './site-package-client'\nimport {\n INITIAL_PACKAGE_BULK_DEFAULTS,\n PACKAGE_BULK_CHOICES,\n PACKAGE_DECISION_WORDS,\n PACKAGE_STATUS_WORDS,\n type PackageBulkDefaults,\n type PackageDependencyPrompt,\n packageAcknowledgements,\n packageDecided,\n packageDecisionCounts,\n packageDecisionOptions,\n packageDecisions,\n packageDependencyAnswer,\n packageDependencyOptions,\n packageDependencyPrompts,\n packageDependencyProblems,\n packageItemTitle,\n} from './site-package-import-state'\nimport { TransferAcknowledgementList } from './transfer-acknowledgement-list.component'\nimport { TransferChoiceSelect } from './transfer-choice-select.component'\nimport { TransferWizardNav } from './transfer-wizard-nav.component'\nimport { countOf } from './transfer-words'\n\nexport type PackageImportStep = 'upload' | 'items' | 'dependencies' | 'changes' | 'review' | 'results'\n\nconst STEPS: ReadonlyArray<{ id: PackageImportStep; label: string }> = [\n { id: 'upload', label: 'Upload' },\n { id: 'items', label: 'Items' },\n { id: 'dependencies', label: 'Missing items' },\n { id: 'changes', label: 'Changes' },\n { id: 'review', label: 'Review' },\n { id: 'results', label: 'Import' },\n]\n\n/** Rows shown per kind before \"Show more\". */\nconst GROUP_PAGE = 50\n\nexport interface PackageImportWizardProps {\n client: SitePackageClient\n /** A URL rendering one side of one item, or `null`; omitted, no rendered diff. */\n previewHref?: PackagePreviewHref\n /**\n * A component per kind that draws one side of an item in place; a kind it\n * names is drawn by it instead of through `previewHref`.\n */\n renderers?: PackageItemRenderers\n /** A file already read: the wizard plans it and opens on Items. */\n initialFile?: { name: string; content: unknown }\n /** Told the import's id once it is applied, so the surface can offer undo later. */\n onImported?(answer: SitePackageApplyAnswer): void\n /** Told when the import is undone from the last step. */\n onUndone?(answer: SitePackageUndoAnswer): void\n /** Called from the last step's Done. */\n onDone?(): void\n}\n\nconst message = (error: unknown) =>\n error instanceof SyntaxError\n ? 'That file is not a site package or backup.'\n : error instanceof Error && error.message\n ? error.message\n : 'Something went wrong. Try again.'\n\nfunction readFileText(file: File): Promise<string> {\n if (typeof file.text === 'function') return file.text()\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(String(reader.result ?? ''))\n reader.onerror = () => reject(reader.error)\n reader.readAsText(file)\n })\n}\n\nconst MATCHED_BY_WORDS: Record<NonNullable<SitePackagePlanItem['matchedBy']>, string> = {\n id: 'by ID',\n slug: 'by address',\n name: 'by name',\n}\n\nexport function PackageImportWizard(props: PackageImportWizardProps) {\n const { client, previewHref, renderers, initialFile, onImported, onUndone, onDone } = props\n const [step, setStep] = useState<PackageImportStep>('upload')\n const [file, setFile] = useState<{ name: string; content: unknown } | null>(null)\n const [answer, setAnswer] = useState<SitePackagePlanAnswer | null>(null)\n const [review, setReview] = useState<SitePackagePlanAnswer | null>(null)\n const [overrides, setOverrides] = useState<Record<string, PackageItemDecision>>({})\n const [bulk, setBulk] = useState<PackageBulkDefaults>(INITIAL_PACKAGE_BULK_DEFAULTS)\n const [dependencyChoices, setDependencyChoices] = useState<Record<string, SitePackageDependencyChoice>>({})\n const [mergeChoices, setMergeChoices] = useState<Record<string, Record<string, SitePackageMergeChoice>>>({})\n const [comparisons, setComparisons] = useState<Record<string, SitePackageComparison>>({})\n const [selected, setSelected] = useState<string | null>(null)\n const [acknowledged, setAcknowledged] = useState<string[]>([])\n const [catalog, setCatalog] = useState<SitePackageCatalog | null>(null)\n const [result, setResult] = useState<SitePackageApplyAnswer | null>(null)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n\n const run = useCallback(async (work: () => Promise<void>) => {\n setBusy(true)\n setError(null)\n try {\n await work()\n } catch (caught) {\n setError(message(caught))\n } finally {\n setBusy(false)\n }\n }, [])\n\n const plan = answer?.plan ?? null\n const byKey = useMemo(() => new Map((plan?.items ?? []).map((item) => [item.key, item])), [plan])\n const titleOf = useCallback((key: string) => {\n const item = byKey.get(key)\n return item ? packageItemTitle(item) : key\n }, [byKey])\n const kindLabel = useCallback(\n (kind: string) => plan?.kinds.find((one) => one.kind === kind)?.label ?? kind,\n [plan],\n )\n\n const { decisions, undecided } = useMemo(\n () => (plan ? packageDecisions(plan, overrides, bulk) : { decisions: {}, undecided: [] }),\n [plan, overrides, bulk],\n )\n const prompts = useMemo(() => (plan ? packageDependencyPrompts(plan, decisions) : []), [plan, decisions])\n // A dependency the file carries is imported from it unless the person says otherwise.\n const effectiveDependencyChoices = useMemo(() => {\n const out: Record<string, SitePackageDependencyChoice> = {}\n for (const prompt of prompts) {\n const choice = dependencyChoices[prompt.key] ?? (prompt.inPackage ? 'import' : undefined)\n if (choice) out[prompt.key] = choice\n }\n return out\n }, [prompts, dependencyChoices])\n const decided = useMemo(\n () => packageDecided(decisions, prompts, effectiveDependencyChoices, mergeChoices),\n [decisions, prompts, effectiveDependencyChoices, mergeChoices],\n )\n\n const planFile = useCallback(\n (next: { name: string; content: unknown }) =>\n run(async () => {\n const planned = await client.plan(next.content)\n setFile(next)\n setAnswer(planned)\n setOverrides({})\n setBulk(INITIAL_PACKAGE_BULK_DEFAULTS)\n setDependencyChoices({})\n setMergeChoices({})\n setComparisons({})\n setSelected(null)\n setStep('items')\n }),\n [client, run],\n )\n\n const started = useRef(false)\n useEffect(() => {\n if (!initialFile || started.current) return\n started.current = true\n void planFile(initialFile)\n }, [initialFile, planFile])\n\n const onFile = async (event: ChangeEvent<HTMLInputElement>) => {\n const chosen = event.target.files?.[0]\n event.target.value = ''\n if (!chosen) return\n await run(async () => {\n const content = JSON.parse(await readFileText(chosen))\n await planFile({ name: chosen.name, content })\n })\n }\n\n const compare = useCallback(\n async (key: string) => {\n if (!file || comparisons[key]) return\n await run(async () => {\n const answered = await client.compare(file.content, [key])\n setComparisons((current) => ({\n ...current,\n ...Object.fromEntries(answered.map((one) => [one.key, one])),\n }))\n })\n },\n [client, file, comparisons, run],\n )\n\n const loadCatalog = useCallback(async () => {\n if (catalog) return\n await run(async () => setCatalog(await client.catalog()))\n }, [catalog, client, run])\n\n const toReview = () =>\n run(async () => {\n if (!file) return\n setReview(await client.plan(file.content, decided))\n setAcknowledged([])\n setStep('review')\n })\n\n const apply = () =>\n run(async () => {\n if (!file) return\n const applied = await client.apply(file.content, decided)\n setResult(applied)\n setStep('results')\n onImported?.(applied)\n })\n\n const changed = useMemo(\n () =>\n (plan?.items ?? []).filter((item) => {\n if (!item.existing) return false\n const decision = decisions[item.key]\n return item.comparison === 'differs' || (decision !== undefined && decision !== 'skip')\n }),\n [plan, decisions],\n )\n\n const goChanges = (key?: string) => {\n const first = key ?? selected ?? changed[0]?.key ?? null\n setSelected(first)\n setStep('changes')\n if (first) void compare(first)\n }\n\n const stepIndex = STEPS.findIndex((one) => one.id === step)\n const locked = step === 'results'\n\n let body: ReactNode = null\n if (step === 'upload') {\n body = (\n <Stack spacing={2}>\n <Typography variant=\"body2\">\n Choose a site package, or a backup downloaded from any of your sites. Nothing is written until you\n import on the last step.\n </Typography>\n <Box>\n <Button variant=\"outlined\" disabled={busy} onClick={() => inputRef.current?.click()}>\n Choose a file\n </Button>\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"application/json,.json\"\n hidden\n aria-label=\"Package file\"\n onChange={(event) => void onFile(event)}\n />\n </Box>\n {file ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {file.name}\n </Typography>\n ) : null}\n {answer ? <TransferWizardNav onNext={() => setStep('items')} busy={busy} /> : null}\n </Stack>\n )\n } else if (step === 'items' && plan && answer) {\n body = (\n <ItemsStep\n fileName={file?.name ?? ''}\n answer={answer}\n decisions={decisions}\n overrides={overrides}\n bulk={bulk}\n busy={busy}\n onBulk={(comparison, decision) => setBulk((current) => ({ ...current, [comparison]: decision }))}\n onDecision={(key, decision) => setOverrides((current) => ({ ...current, [key]: decision }))}\n onCompare={(key) => goChanges(key)}\n blockers={\n undecided.length\n ? [\n `Choose what to do with ${countOf(undecided.length, 'changed item')}: set a default for changed items, or choose for each.`,\n ]\n : []\n }\n onBack={() => setStep('upload')}\n onNext={() => setStep('dependencies')}\n />\n )\n } else if (step === 'dependencies' && plan) {\n body = (\n <DependenciesStep\n prompts={prompts}\n choices={effectiveDependencyChoices}\n catalog={catalog}\n busy={busy}\n titleOf={titleOf}\n kindLabel={kindLabel}\n onNeedCatalog={() => void loadCatalog()}\n onChoice={(key, choice) => setDependencyChoices((current) => ({ ...current, [key]: choice }))}\n onBack={() => setStep('items')}\n onNext={() => goChanges()}\n />\n )\n } else if (step === 'changes' && plan) {\n const item = selected ? byKey.get(selected) : undefined\n const comparison = selected ? comparisons[selected] : undefined\n const decision = item ? (decisions[item.key] ?? null) : null\n body = (\n <Stack spacing={2}>\n {changed.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n Nothing this site holds is changed by the import.\n </Typography>\n ) : (\n <Stack direction={{ xs: 'column', md: 'row' }} spacing={2}>\n <Box sx={{ width: { md: 280 }, flexShrink: 0 }}>\n <List dense aria-label=\"Changed items\" sx={{ maxHeight: 520, overflowY: 'auto' }}>\n {changed.map((one) => {\n const chosen = decisions[one.key]\n return (\n <ListItemButton\n key={one.key}\n selected={one.key === selected}\n onClick={() => {\n setSelected(one.key)\n void compare(one.key)\n }}\n >\n <ListItemText\n primary={packageItemTitle(one)}\n secondary={`${kindLabel(one.kind)} · ${chosen ? PACKAGE_DECISION_WORDS[chosen].label : 'Not chosen'}`}\n />\n </ListItemButton>\n )\n })}\n </List>\n </Box>\n <Box sx={{ flex: 1, minWidth: 0 }}>\n {item ? (\n <Stack spacing={2}>\n <Stack useFlexGap direction=\"row\" spacing={2} sx={{ alignItems: 'center', flexWrap: 'wrap' }}>\n <Typography variant=\"h6\" component=\"h3\">\n {packageItemTitle(item)}\n </Typography>\n <TransferChoiceSelect<PackageItemDecision>\n label=\"Decision\"\n value={decision ?? ''}\n placeholder=\"Choose…\"\n options={packageDecisionOptions(item.choices)}\n onChange={(next) => setOverrides((current) => ({ ...current, [item.key]: next }))}\n />\n </Stack>\n {comparison ? (\n <PackageItemDiff\n item={item}\n comparison={comparison}\n decision={decision}\n {...(previewHref ? { previewHref } : {})}\n {...(renderers ? { renderers } : {})}\n mergeChoices={mergeChoices[item.key] ?? {}}\n onMergeChoice={(key, choice) =>\n setMergeChoices((current) => ({\n ...current,\n [item.key]: { ...(current[item.key] ?? {}), [key]: choice },\n }))\n }\n />\n ) : (\n <CircularProgress size={24} aria-label=\"Comparing\" />\n )}\n </Stack>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\n Choose an item to see what changes.\n </Typography>\n )}\n </Box>\n </Stack>\n )}\n <TransferWizardNav\n busy={busy}\n blockers={\n undecided.length\n ? [`Choose what to do with ${countOf(undecided.length, 'changed item')}.`]\n : []\n }\n onBack={() => setStep('dependencies')}\n onNext={() => void toReview()}\n nextLabel=\"Review\"\n />\n </Stack>\n )\n } else if (step === 'review' && review) {\n const acknowledgements = packageAcknowledgements(review, decisions, titleOf)\n const unacknowledged = acknowledgements.filter(\n (one) => one.required && !acknowledged.includes(one.id),\n ).length\n const counts = packageDecisionCounts(decisions)\n body = (\n <Stack spacing={2}>\n <Box component=\"ul\" sx={{ m: 0, pl: 2.5 }} aria-label=\"What the import does\">\n {counts.map(({ decision, count }) => (\n <Typography component=\"li\" variant=\"body2\" key={decision}>\n {`${PACKAGE_DECISION_WORDS[decision].label}: ${countOf(count, 'item')}`}\n </Typography>\n ))}\n </Box>\n {review.capRefusal ? <Alert severity=\"error\">{review.capRefusal}</Alert> : null}\n <TransferAcknowledgementList\n items={acknowledgements}\n acknowledged={acknowledged}\n disabled={busy}\n onChange={(id, done) =>\n setAcknowledged((current) => (done ? [...current, id] : current.filter((one) => one !== id)))\n }\n />\n <TransferWizardNav\n busy={busy}\n blockers={[\n ...(review.capRefusal ? ['A plan limit refuses this import. Skip some new items, or upgrade.'] : []),\n ...(unacknowledged ? [`Acknowledge ${countOf(unacknowledged, 'warning')} to import.`] : []),\n ]}\n onBack={() => goChanges()}\n onNext={() => void apply()}\n nextLabel=\"Import\"\n />\n </Stack>\n )\n } else if (step === 'results' && result) {\n const counts = Object.entries(result.counts).filter(([, count]) => count > 0)\n body = (\n <Stack spacing={2}>\n <Alert severity=\"success\">\n {`Imported: ${counts\n .map(([decision, count]) =>\n `${PACKAGE_DECISION_WORDS[decision as PackageItemDecision]?.label ?? decision} ${count.toLocaleString()}`,\n )\n .join(', ')} (${countOf(result.written, 'document')} written).`}\n </Alert>\n <PackageImportUndo client={client} importId={result.importId} {...(onUndone ? { onUndone } : {})} />\n <TransferWizardNav onNext={onDone} nextLabel=\"Done\" />\n </Stack>\n )\n }\n\n return (\n <Stack spacing={3}>\n <Box component=\"nav\" aria-label=\"Import steps\" sx={{ overflowX: 'auto' }}>\n <Stepper nonLinear activeStep={stepIndex} alternativeLabel>\n {STEPS.map((one, index) => {\n const reachable = index < stepIndex && !locked && Boolean(answer)\n return (\n <Step key={one.id} completed={index < stepIndex}>\n {reachable ? (\n <StepButton\n onClick={() => (one.id === 'changes' ? goChanges() : setStep(one.id))}\n >\n {one.label}\n </StepButton>\n ) : (\n <StepLabel aria-current={index === stepIndex ? 'step' : undefined}>{one.label}</StepLabel>\n )}\n </Step>\n )\n })}\n </Stepper>\n </Box>\n {error ? (\n <Alert severity=\"error\" onClose={() => setError(null)}>\n {error}\n </Alert>\n ) : null}\n {busy && step !== 'changes' ? <CircularProgress size={24} aria-label=\"Working\" /> : null}\n <Box>{body}</Box>\n </Stack>\n )\n}\n\n/*==========================================\n * ITEMS\n *=========================================*/\n\ninterface ItemsStepProps {\n fileName: string\n answer: SitePackagePlanAnswer\n decisions: Readonly<Record<string, PackageItemDecision>>\n overrides: Readonly<Record<string, PackageItemDecision>>\n bulk: PackageBulkDefaults\n busy: boolean\n blockers: string[]\n onBulk(comparison: keyof PackageBulkDefaults, decision: PackageItemDecision): void\n onDecision(key: string, decision: PackageItemDecision): void\n onCompare(key: string): void\n onBack(): void\n onNext(): void\n}\n\nconst BULK_LABELS: Record<keyof PackageBulkDefaults, string> = {\n new: 'New items',\n differs: 'Changed items',\n identical: 'Items already on this site',\n}\n\nfunction ItemsStep(props: ItemsStepProps) {\n const { answer, decisions, overrides, bulk } = props\n const { plan } = answer\n const [status, setStatus] = useState('all')\n const [kind, setKind] = useState('all')\n const [search, setSearch] = useState('')\n const [shown, setShown] = useState<Record<string, number>>({})\n const needle = search.trim().toLowerCase()\n const visible = plan.items.filter(\n (item) =>\n (status === 'all' || item.status === status) &&\n (kind === 'all' || item.kind === kind) &&\n (!needle ||\n [item.name, item.slug, item.id].some((value) => value?.toLowerCase().includes(needle))),\n )\n const comparisons = (Object.keys(BULK_LABELS) as Array<keyof PackageBulkDefaults>).filter((one) =>\n plan.items.some((item) => item.comparison === one),\n )\n const counts = plan.counts\n\n return (\n <Stack spacing={2}>\n <Typography variant=\"body2\">\n {`${props.fileName ? `${props.fileName}: ` : ''}${countOf(counts.new, 'new item')}, ` +\n `${countOf(counts.differs, 'item')} that differ from this site’s copy, ` +\n `${countOf(counts.identical, 'item')} already on this site` +\n (counts.missingDependency\n ? `, ${countOf(counts.missingDependency, 'item')} that need something neither the file nor this site holds.`\n : '.')}\n </Typography>\n <Stack spacing={1}>\n <Typography variant=\"subtitle2\" component=\"h3\">\n Defaults\n </Typography>\n <Stack direction={{ xs: 'column', sm: 'row' }} spacing={1.5}>\n {comparisons.map((one) => (\n <TransferChoiceSelect<PackageItemDecision>\n key={one}\n label={BULK_LABELS[one]}\n value={bulk[one]}\n placeholder=\"Choose…\"\n options={packageDecisionOptions(PACKAGE_BULK_CHOICES[one])}\n onChange={(decision) => props.onBulk(one, decision)}\n />\n ))}\n </Stack>\n <Typography variant=\"caption\" color=\"text.secondary\">\n A default applies to every item of that kind you have not chosen for, where the item can take it.\n </Typography>\n </Stack>\n <Stack direction={{ xs: 'column', sm: 'row' }} spacing={1.5}>\n <TransferChoiceSelect\n label=\"Show\"\n value={status}\n onChange={setStatus}\n options={[\n { value: 'all', label: `All (${plan.items.length.toLocaleString()})` },\n ...(Object.keys(PACKAGE_STATUS_WORDS) as Array<keyof typeof PACKAGE_STATUS_WORDS>).map((one) => ({\n value: one,\n label: `${PACKAGE_STATUS_WORDS[one].label} (${counts[one].toLocaleString()})`,\n disabled: counts[one] === 0,\n })),\n ]}\n />\n <TransferChoiceSelect\n label=\"Kind\"\n value={kind}\n onChange={setKind}\n options={[\n { value: 'all', label: 'Every kind' },\n ...plan.kinds.map((one) => ({ value: one.kind, label: `${one.label} (${one.count.toLocaleString()})` })),\n ]}\n />\n <TextField\n size=\"small\"\n label=\"Search\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n />\n </Stack>\n {visible.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n No item matches.\n </Typography>\n ) : null}\n {plan.kinds.map((group) => {\n const items = visible.filter((item) => item.kind === group.kind)\n if (!items.length) return null\n const limit = shown[group.kind] ?? GROUP_PAGE\n return (\n <Stack spacing={1} key={group.kind}>\n <Typography variant=\"subtitle1\" component=\"h3\">\n {`${group.label} (${items.length.toLocaleString()})`}\n </Typography>\n <ScrollTable size=\"small\" aria-label={group.label}>\n <TableHead>\n <TableRow>\n <TableCell>Item</TableCell>\n <TableCell>Status</TableCell>\n <TableCell>On this site</TableCell>\n <TableCell>Decision</TableCell>\n <TableCell />\n </TableRow>\n </TableHead>\n <TableBody>\n {items.slice(0, limit).map((item) => {\n const title = packageItemTitle(item)\n const words = PACKAGE_STATUS_WORDS[item.status]\n return (\n <TableRow key={item.key}>\n <TableCell>\n <Typography variant=\"body2\">{title}</Typography>\n {item.slug && item.slug !== title ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {item.slug}\n </Typography>\n ) : null}\n </TableCell>\n <TableCell>\n <Chip size=\"small\" variant=\"outlined\" label={words.label} color={words.color} />\n {item.missing.length ? (\n <Typography variant=\"caption\" color=\"text.secondary\" component=\"div\">\n {`Needs ${item.missing.map((dep) => `${dep.kind} ${dep.id}`).join(', ')}`}\n </Typography>\n ) : null}\n </TableCell>\n <TableCell>\n {item.existing ? (\n <>\n <Typography variant=\"body2\">{packageItemTitle(item.existing)}</Typography>\n {item.matchedBy ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`Matched ${MATCHED_BY_WORDS[item.matchedBy]}`}\n </Typography>\n ) : null}\n </>\n ) : (\n '—'\n )}\n </TableCell>\n <TableCell>\n <TransferChoiceSelect<PackageItemDecision>\n label={`Decision for ${title}`}\n hideLabel\n value={decisions[item.key] ?? ''}\n placeholder=\"Choose…\"\n options={packageDecisionOptions(item.choices)}\n onChange={(decision) => props.onDecision(item.key, decision)}\n {...(overrides[item.key] ? { helperText: 'Your choice' } : {})}\n />\n </TableCell>\n <TableCell>\n {item.existing && item.comparison === 'differs' ? (\n <Button size=\"small\" onClick={() => props.onCompare(item.key)}>\n {`Compare ${title}`}\n </Button>\n ) : null}\n </TableCell>\n </TableRow>\n )\n })}\n </TableBody>\n </ScrollTable>\n {items.length > limit ? (\n <Box>\n <Button\n size=\"small\"\n onClick={() => setShown((current) => ({ ...current, [group.kind]: limit + GROUP_PAGE }))}\n >\n {`Show ${Math.min(GROUP_PAGE, items.length - limit).toLocaleString()} more ${group.label.toLowerCase()}`}\n </Button>\n </Box>\n ) : null}\n </Stack>\n )\n })}\n <TransferWizardNav busy={props.busy} blockers={props.blockers} onBack={props.onBack} onNext={props.onNext} />\n </Stack>\n )\n}\n\n/*==========================================\n * MISSING ITEMS\n *=========================================*/\n\ninterface DependenciesStepProps {\n prompts: readonly PackageDependencyPrompt[]\n choices: Readonly<Record<string, SitePackageDependencyChoice>>\n catalog: SitePackageCatalog | null\n busy: boolean\n titleOf(key: string): string\n kindLabel(kind: string): string\n onNeedCatalog(): void\n onChoice(key: string, choice: SitePackageDependencyChoice): void\n onBack(): void\n onNext(): void\n}\n\nfunction DependenciesStep(props: DependenciesStepProps) {\n const { prompts, choices, catalog, onNeedCatalog } = props\n const mapping = prompts.some((prompt) => typeof choices[prompt.key] === 'object')\n useEffect(() => {\n if (mapping && !catalog) onNeedCatalog()\n }, [mapping, catalog, onNeedCatalog])\n\n return (\n <Stack spacing={2}>\n {prompts.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n Every item you are importing has what it needs.\n </Typography>\n ) : (\n <>\n <Typography variant=\"body2\">\n These items are named by what you are importing, and this site will not hold them. Choose what to\n do about each.\n </Typography>\n <ScrollTable size=\"small\" aria-label=\"Missing items\">\n <TableHead>\n <TableRow>\n <TableCell>Missing item</TableCell>\n <TableCell>Needed by</TableCell>\n <TableCell>What to do</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {prompts.map((prompt) => {\n const name = prompt.inPackage\n ? packageItemTitle(prompt.inPackage)\n : `${props.kindLabel(prompt.kind)}: ${prompt.id}`\n const choice = choices[prompt.key]\n const answer = packageDependencyAnswer(choice)\n const options = (catalog?.manifest.items ?? []).filter((one) => one.kind === prompt.kind)\n const picked =\n typeof choice === 'object' ? (options.find((one) => one.$id === choice.mapTo) ?? null) : null\n return (\n <TableRow key={prompt.key}>\n <TableCell>\n <Typography variant=\"body2\">{name}</Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {prompt.inPackage ? 'In the file, set to skip' : 'Neither in the file nor on this site'}\n </Typography>\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\">\n {prompt.neededBy.slice(0, 3).map(props.titleOf).join(', ')}\n {prompt.neededBy.length > 3 ? ` and ${(prompt.neededBy.length - 3).toLocaleString()} more` : ''}\n </Typography>\n </TableCell>\n <TableCell>\n <Stack spacing={1}>\n <TransferChoiceSelect\n label={`What to do about ${name}`}\n hideLabel\n value={answer}\n placeholder=\"Choose…\"\n options={packageDependencyOptions(prompt)}\n onChange={(next) => props.onChoice(prompt.key, next === 'mapTo' ? { mapTo: '' } : next)}\n {...(answer === 'drop'\n ? { helperText: `Removed from ${countOf(prompt.neededBy.length, 'item')}.` }\n : {})}\n />\n {answer === 'mapTo' ? (\n <Autocomplete\n size=\"small\"\n options={options}\n loading={!catalog}\n value={picked}\n getOptionLabel={(option) => option.name || option.slug || option.$id}\n isOptionEqualToValue={(option, value) => option.$id === value.$id}\n onChange={(_event, value) => props.onChoice(prompt.key, { mapTo: value?.$id ?? '' })}\n renderInput={(params) => (\n <TextField {...params} label={`Use instead of ${name}`} />\n )}\n />\n ) : null}\n </Stack>\n </TableCell>\n </TableRow>\n )\n })}\n </TableBody>\n </ScrollTable>\n </>\n )}\n <TransferWizardNav\n busy={props.busy}\n blockers={packageDependencyProblems(prompts, choices)}\n onBack={props.onBack}\n onNext={props.onNext}\n />\n </Stack>\n )\n}\n\nexport default PackageImportWizard\n"],"names":["ScrollTable","Alert","Autocomplete","Box","Button","Chip","CircularProgress","List","ListItemButton","ListItemText","Stack","Step","StepButton","StepLabel","Stepper","TableBody","TableCell","TableHead","TableRow","TextField","Typography","useCallback","useEffect","useMemo","useRef","useState","PackageImportUndo","PackageItemDiff","INITIAL_PACKAGE_BULK_DEFAULTS","PACKAGE_BULK_CHOICES","PACKAGE_DECISION_WORDS","PACKAGE_STATUS_WORDS","packageAcknowledgements","packageDecided","packageDecisionCounts","packageDecisionOptions","packageDecisions","packageDependencyAnswer","packageDependencyOptions","packageDependencyPrompts","packageDependencyProblems","packageItemTitle","TransferAcknowledgementList","TransferChoiceSelect","TransferWizardNav","countOf","STEPS","id","label","GROUP_PAGE","message","error","SyntaxError","Error","readFileText","file","text","Promise","resolve","reject","reader","FileReader","onload","String","result","onerror","readAsText","MATCHED_BY_WORDS","slug","name","PackageImportWizard","props","client","previewHref","renderers","initialFile","onImported","onUndone","onDone","step","setStep","setFile","answer","setAnswer","review","setReview","overrides","setOverrides","bulk","setBulk","dependencyChoices","setDependencyChoices","mergeChoices","setMergeChoices","comparisons","setComparisons","selected","setSelected","acknowledged","setAcknowledged","catalog","setCatalog","setResult","busy","setBusy","setError","inputRef","run","work","caught","plan","byKey","Map","items","map","item","key","titleOf","get","kindLabel","kind","kinds","find","one","decisions","undecided","prompts","effectiveDependencyChoices","out","prompt","choice","inPackage","undefined","decided","planFile","next","planned","content","started","current","onFile","event","chosen","target","files","value","JSON","parse","compare","answered","Object","fromEntries","loadCatalog","toReview","apply","applied","changed","filter","existing","decision","comparison","goChanges","first","stepIndex","findIndex","locked","body","spacing","variant","disabled","onClick","click","input","ref","type","accept","hidden","aria-label","onChange","color","onNext","ItemsStep","fileName","onBulk","onDecision","onCompare","blockers","length","onBack","DependenciesStep","choices","onNeedCatalog","onChoice","direction","xs","md","sx","width","flexShrink","dense","maxHeight","overflowY","primary","secondary","flex","minWidth","useFlexGap","alignItems","flexWrap","component","placeholder","options","onMergeChoice","size","nextLabel","acknowledgements","unacknowledged","required","includes","counts","m","pl","count","capRefusal","severity","done","entries","toLocaleString","join","written","importId","overflowX","nonLinear","activeStep","alternativeLabel","index","reachable","Boolean","completed","aria-current","onClose","BULK_LABELS","new","differs","identical","status","setStatus","setKind","search","setSearch","shown","setShown","needle","trim","toLowerCase","visible","some","keys","missingDependency","sm","group","limit","slice","title","words","missing","dep","matchedBy","hideLabel","helperText","Math","min","mapping","manifest","picked","$id","mapTo","neededBy","loading","getOptionLabel","option","isOptionEqualToValue","_event","renderInput","params"],"mappings":"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"}
@@ -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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"}