@burojs/ui-shadcn 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{bulk-summary-CrEij5vq.cjs → bulk-summary-2HLgz7Il.cjs} +31 -5
- package/dist/bulk-summary-2HLgz7Il.cjs.map +1 -0
- package/dist/{bulk-summary-BWSAS7k2.js → bulk-summary-D6A0ua21.js} +32 -6
- package/dist/bulk-summary-D6A0ua21.js.map +1 -0
- package/dist/{candidates-relation-picker-y5M6_oe4.cjs → candidates-relation-picker-C47mF260.cjs} +3 -3
- package/dist/{candidates-relation-picker-y5M6_oe4.cjs.map → candidates-relation-picker-C47mF260.cjs.map} +1 -1
- package/dist/{candidates-relation-picker-CS_JZ4Fd.js → candidates-relation-picker-CGXItMN0.js} +3 -3
- package/dist/{candidates-relation-picker-CS_JZ4Fd.js.map → candidates-relation-picker-CGXItMN0.js.map} +1 -1
- package/dist/{check-confirm-dialog-C-NHgMST.cjs → check-confirm-dialog-BT04Mieo.cjs} +13 -6
- package/dist/check-confirm-dialog-BT04Mieo.cjs.map +1 -0
- package/dist/{check-confirm-dialog-2j0gOd7x.js → check-confirm-dialog-CtiRzOAt.js} +14 -7
- package/dist/{check-confirm-dialog-2j0gOd7x.js.map → check-confirm-dialog-CtiRzOAt.js.map} +1 -1
- package/dist/{filter-builder-DFu0JP-1.cjs → filter-builder-ByGhxLf_.cjs} +127 -63
- package/dist/filter-builder-ByGhxLf_.cjs.map +1 -0
- package/dist/{filter-builder-DaWHUZuV.js → filter-builder-z3Axzf9Y.js} +114 -56
- package/dist/filter-builder-z3Axzf9Y.js.map +1 -0
- package/dist/{flow-runtime-BpmrIUb6.cjs → flow-runtime-BVFjMU5-.cjs} +6 -3
- package/dist/{flow-runtime-BpmrIUb6.cjs.map → flow-runtime-BVFjMU5-.cjs.map} +1 -1
- package/dist/{flow-runtime-DyqTmK3H.js → flow-runtime-DrUWyTS0.js} +6 -3
- package/dist/{flow-runtime-DyqTmK3H.js.map → flow-runtime-DrUWyTS0.js.map} +1 -1
- package/dist/{flow-screen-DCdli6Ha.js → flow-screen-3fk6J33y.js} +6 -4
- package/dist/flow-screen-3fk6J33y.js.map +1 -0
- package/dist/{flow-screen-Bcz9NF2V.cjs → flow-screen-6y5E_HT6.cjs} +5 -3
- package/dist/flow-screen-6y5E_HT6.cjs.map +1 -0
- package/dist/index.cjs +518 -107
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +187 -86
- package/dist/index.d.ts +187 -86
- package/dist/index.js +519 -108
- package/dist/index.js.map +1 -1
- package/dist/{inline-flow-host-3vw7LzzD.cjs → inline-flow-host-C4KmZIYE.cjs} +3 -3
- package/dist/{inline-flow-host-3vw7LzzD.cjs.map → inline-flow-host-C4KmZIYE.cjs.map} +1 -1
- package/dist/{inline-flow-host-C0rI9B7f.js → inline-flow-host-YnnvWjdU.js} +3 -3
- package/dist/{inline-flow-host-C0rI9B7f.js.map → inline-flow-host-YnnvWjdU.js.map} +1 -1
- package/dist/{lazy-relation-picker-dialog-Bt8lrEIu.cjs → lazy-relation-picker-dialog-BAKBRn3V.cjs} +2 -2
- package/dist/{lazy-relation-picker-dialog-Bt8lrEIu.cjs.map → lazy-relation-picker-dialog-BAKBRn3V.cjs.map} +1 -1
- package/dist/{lazy-relation-picker-dialog-CAScLPb2.js → lazy-relation-picker-dialog-DN4bvQfg.js} +2 -2
- package/dist/{lazy-relation-picker-dialog-CAScLPb2.js.map → lazy-relation-picker-dialog-DN4bvQfg.js.map} +1 -1
- package/dist/{page-flow-route-BHUEpn0I.js → page-flow-route-CtEfqAvU.js} +5 -6
- package/dist/page-flow-route-CtEfqAvU.js.map +1 -0
- package/dist/{page-flow-route-DS8IVTVH.cjs → page-flow-route-DEjAxHe3.cjs} +6 -7
- package/dist/page-flow-route-DEjAxHe3.cjs.map +1 -0
- package/dist/{place-node-CfzQvh4Y.js → place-node-BdxT-30h.js} +149 -108
- package/dist/place-node-BdxT-30h.js.map +1 -0
- package/dist/{place-node-CNb3w-c7.cjs → place-node-Bhl8B3fF.cjs} +163 -134
- package/dist/place-node-Bhl8B3fF.cjs.map +1 -0
- package/dist/{related-list-cards-CelMxl4q.cjs → related-list-cards-Bc_vfCE_.cjs} +3 -3
- package/dist/{related-list-cards-CelMxl4q.cjs.map → related-list-cards-Bc_vfCE_.cjs.map} +1 -1
- package/dist/{related-list-cards-BIqqY69Y.js → related-list-cards-BvkD5OcC.js} +3 -3
- package/dist/{related-list-cards-BIqqY69Y.js.map → related-list-cards-BvkD5OcC.js.map} +1 -1
- package/dist/related-list-timeline-DCrwN9oO.js +167 -0
- package/dist/related-list-timeline-DCrwN9oO.js.map +1 -0
- package/dist/related-list-timeline-k0DtnxTs.cjs +167 -0
- package/dist/related-list-timeline-k0DtnxTs.cjs.map +1 -0
- package/dist/{related-rows-MPnLCmPF.cjs → related-rows-BW9Jr07T.cjs} +3 -3
- package/dist/{related-rows-MPnLCmPF.cjs.map → related-rows-BW9Jr07T.cjs.map} +1 -1
- package/dist/{related-rows--uP2iKQC.js → related-rows-CPE-9FFr.js} +3 -3
- package/dist/{related-rows--uP2iKQC.js.map → related-rows-CPE-9FFr.js.map} +1 -1
- package/dist/{relation-many-picker-BJhaEqxz.js → relation-many-picker-BlrGRwMV.js} +10 -5
- package/dist/relation-many-picker-BlrGRwMV.js.map +1 -0
- package/dist/{relation-many-picker-DzuGJpEl.cjs → relation-many-picker-Br-zBHxT.cjs} +10 -5
- package/dist/relation-many-picker-Br-zBHxT.cjs.map +1 -0
- package/dist/{relation-picker-DaIMzf2H.cjs → relation-picker-ADjxI_TI.cjs} +11 -6
- package/dist/relation-picker-ADjxI_TI.cjs.map +1 -0
- package/dist/{relation-picker-dialog-DoEY8EkH.js → relation-picker-dialog-CyKliBkN.js} +2 -2
- package/dist/{relation-picker-dialog-DoEY8EkH.js.map → relation-picker-dialog-CyKliBkN.js.map} +1 -1
- package/dist/{relation-picker-dialog-9Vg5vvR1.cjs → relation-picker-dialog-DimVQF9Y.cjs} +2 -2
- package/dist/{relation-picker-dialog-9Vg5vvR1.cjs.map → relation-picker-dialog-DimVQF9Y.cjs.map} +1 -1
- package/dist/{relation-picker-D-tBBZW_.js → relation-picker-x7P5HKie.js} +11 -6
- package/dist/relation-picker-x7P5HKie.js.map +1 -0
- package/dist/{resource-page-router-Diw6S6TK.js → resource-page-router-BRpUnhay.js} +144 -17
- package/dist/resource-page-router-BRpUnhay.js.map +1 -0
- package/dist/{resource-page-router-C_kGW2o_.cjs → resource-page-router-qEd2xb55.cjs} +158 -19
- package/dist/resource-page-router-qEd2xb55.cjs.map +1 -0
- package/dist/use-record-subtitle-bfwIoUme.cjs +70 -0
- package/dist/use-record-subtitle-bfwIoUme.cjs.map +1 -0
- package/dist/use-record-subtitle-gIaCGgbI.js +53 -0
- package/dist/use-record-subtitle-gIaCGgbI.js.map +1 -0
- package/package.json +9 -9
- package/dist/bulk-summary-BWSAS7k2.js.map +0 -1
- package/dist/bulk-summary-CrEij5vq.cjs.map +0 -1
- package/dist/check-confirm-dialog-C-NHgMST.cjs.map +0 -1
- package/dist/filter-builder-DFu0JP-1.cjs.map +0 -1
- package/dist/filter-builder-DaWHUZuV.js.map +0 -1
- package/dist/flow-screen-Bcz9NF2V.cjs.map +0 -1
- package/dist/flow-screen-DCdli6Ha.js.map +0 -1
- package/dist/page-flow-route-BHUEpn0I.js.map +0 -1
- package/dist/page-flow-route-DS8IVTVH.cjs.map +0 -1
- package/dist/place-node-CNb3w-c7.cjs.map +0 -1
- package/dist/place-node-CfzQvh4Y.js.map +0 -1
- package/dist/related-list-timeline-CRh7xwLD.js +0 -141
- package/dist/related-list-timeline-CRh7xwLD.js.map +0 -1
- package/dist/related-list-timeline-DsLdi8sv.cjs +0 -141
- package/dist/related-list-timeline-DsLdi8sv.cjs.map +0 -1
- package/dist/relation-many-picker-BJhaEqxz.js.map +0 -1
- package/dist/relation-many-picker-DzuGJpEl.cjs.map +0 -1
- package/dist/relation-picker-D-tBBZW_.js.map +0 -1
- package/dist/relation-picker-DaIMzf2H.cjs.map +0 -1
- package/dist/resource-page-router-C_kGW2o_.cjs.map +0 -1
- package/dist/resource-page-router-Diw6S6TK.js.map +0 -1
|
@@ -47,7 +47,27 @@ function FlowBulkSummary({ resource, actionName, label, total, progress, texts }
|
|
|
47
47
|
};
|
|
48
48
|
const textOf = (error, fallback) => (error === void 0 ? void 0 : (0, _burojs_react.specificErrorText)(error, textCaps, place) ?? (0, _burojs_react.kindErrorText)(error.kind, textCaps, place)) ?? fallback();
|
|
49
49
|
const neutral = () => t("flow.rejected.validation", { defaultValue: "Not accepted. Nothing was saved." });
|
|
50
|
-
const
|
|
50
|
+
const gone = progress.rejected.filter((entry) => entry.reason === "gone");
|
|
51
|
+
const byCheck = new Map();
|
|
52
|
+
for (const entry of progress.rejected) {
|
|
53
|
+
if (entry.reason !== "check" || entry.check === void 0) continue;
|
|
54
|
+
const own = `checks.${entry.check}`;
|
|
55
|
+
const title = entry.message ?? (caps.has(own) ? caps.t(own) : entry.check);
|
|
56
|
+
const group = byCheck.get(entry.check);
|
|
57
|
+
if (group === void 0) byCheck.set(entry.check, {
|
|
58
|
+
check: entry.check,
|
|
59
|
+
title,
|
|
60
|
+
ids: [entry.id]
|
|
61
|
+
});
|
|
62
|
+
else group.ids.push(entry.id);
|
|
63
|
+
}
|
|
64
|
+
const checkGroups = [...byCheck.values()].map(({ check, title, ids }) => ({
|
|
65
|
+
key: `check:${check}`,
|
|
66
|
+
title,
|
|
67
|
+
lines: [{ ids }]
|
|
68
|
+
}));
|
|
69
|
+
const ownGone = `resources.${resource}.actions.${actionName}.rereadGone`;
|
|
70
|
+
const goneTitle = caps.has(ownGone) ? caps.t(ownGone) : (0, _burojs_core.declaredText)("flow", { texts }, "rereadGone") ?? t("flow.bulkGone", { defaultValue: "No longer available" });
|
|
51
71
|
const notApplied = [...progress.rejected.filter((entry) => entry.reason === "server").map((entry) => ({
|
|
52
72
|
id: entry.id,
|
|
53
73
|
text: textOf(entry.error, neutral)
|
|
@@ -60,10 +80,16 @@ function FlowBulkSummary({ resource, actionName, label, total, progress, texts }
|
|
|
60
80
|
text: textOf(entry.error, () => entry.error?.applied === "partial" ? t("flow.unknownPartial", { defaultValue: "Part of this may have been applied. Nothing was resent." }) : t("flow.unknown", { defaultValue: "It may have been applied. Nothing was resent." }))
|
|
61
81
|
}));
|
|
62
82
|
const groups = [
|
|
83
|
+
...checkGroups,
|
|
84
|
+
{
|
|
85
|
+
key: "gone",
|
|
86
|
+
title: goneTitle,
|
|
87
|
+
lines: [{ ids: gone.map((entry) => entry.id) }]
|
|
88
|
+
},
|
|
63
89
|
{
|
|
64
|
-
key: "
|
|
65
|
-
title: t("flow.
|
|
66
|
-
lines: [{ ids:
|
|
90
|
+
key: "reread-skipped",
|
|
91
|
+
title: t("flow.bulkSentWithoutReread", { defaultValue: "Sent without a current record" }),
|
|
92
|
+
lines: [{ ids: progress.rereadSkipped.filter((entry) => entry.policy === "warn").map((entry) => entry.id) }]
|
|
67
93
|
},
|
|
68
94
|
{
|
|
69
95
|
key: "not-applied",
|
|
@@ -140,4 +166,4 @@ function FlowBulkSummary({ resource, actionName, label, total, progress, texts }
|
|
|
140
166
|
//#endregion
|
|
141
167
|
exports.FlowBulkSummary = FlowBulkSummary;
|
|
142
168
|
|
|
143
|
-
//# sourceMappingURL=bulk-summary-
|
|
169
|
+
//# sourceMappingURL=bulk-summary-2HLgz7Il.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk-summary-2HLgz7Il.cjs","names":["useOptionalT","useI18nCaps","useForgetEachAttempt","useState","useTestIds","specificErrorText","kindErrorText","declaredText","BULK_SUMMARY_IDS","Button"],"sources":["../src/flows/bulk-summary.tsx"],"sourcesContent":["'use client';\nimport { BULK_SUMMARY_IDS, type BulkProgress, type DataError, declaredText } from '@burojs/core';\nimport {\n type ErrorTextPlace,\n kindErrorText,\n specificErrorText,\n useI18nCaps,\n useOptionalT,\n useTestIds,\n} from '@burojs/react';\nimport { useForgetEachAttempt } from '@burojs/react/flows';\nimport { type ReactElement, useState } from 'react';\nimport { Button } from '../primitives/button.js';\n\nexport interface FlowBulkSummaryProps {\n readonly resource: string;\n readonly actionName: string;\n /** The action's label. */\n readonly label: string;\n /** How many ids the run was given. */\n readonly total: number;\n readonly progress: BulkProgress;\n /** The action's declared texts (`texts.validation`, `texts.rejected`): the resolver's action place. */\n readonly texts?: unknown;\n}\n\n/** One line of a group: the ids that read the same text; `text` absent for a group without lines. */\ninterface SummaryLine {\n readonly text?: string;\n readonly ids: readonly string[];\n}\n\ninterface SummaryGroup {\n readonly key: string;\n readonly title: string;\n readonly lines: readonly SummaryLine[];\n}\n\n/** The ids by their text, in the order each text first appears. */\nfunction linesByText(entries: readonly { readonly id: string; readonly text: string }[]) {\n const lines = new Map<string, string[]>();\n for (const { id, text } of entries) {\n const ids = lines.get(text);\n if (ids === undefined) lines.set(text, [id]);\n else ids.push(id);\n }\n return [...lines].map(([text, ids]): SummaryLine => ({ text, ids }));\n}\n\n/**\n * A bulk flow's summary (P4 spec 4.16, T1 spec 4.17): the count that succeeded of the ids given\n * (the flow's own `resources.<r>.actions.<name>.summary`, `{{count}}` of `{{total}}`, else the\n * framework's count text), then one group per other outcome with its count and up to\n * `BULK_SUMMARY_IDS` ids per line. The ids the server answered for are grouped first by\n * `applied` — not applied (refused or failed) and may have been applied (unknown) — and then by\n * the text each one's error resolves to (spec 4.15, with the action as the place), so\n * \"3 records: Already linked\" and \"2 records: Not allowed\" are separate lines. A row a check\n * rejected is grouped under that check's resolved text (`checks.<id>`), a row that was gone under\n * the flow's `texts.rereadGone` else \"No longer available\", and a row sent without a re-read\n * (`rereadSkipped` under `warn`, even when every row succeeded) under its own group (REF-135 §2.3).\n * Unresolved from an earlier run and not attempted keep their own groups.\n * Every text resolves at render, so a language switch re-renders it.\n */\nexport function FlowBulkSummary({\n resource,\n actionName,\n label,\n total,\n progress,\n texts,\n}: FlowBulkSummaryProps): ReactElement {\n const t = useOptionalT();\n const caps = useI18nCaps(resource);\n // An id the run left unknown, or found unresolved, has its exit here (P4-C review I3): the user\n // checked the record, and the id's attempt is forgotten — the next run sends it again.\n const forget = useForgetEachAttempt({ resource, action: actionName });\n const [forgotten, setForgotten] = useState<ReadonlySet<string>>(() => new Set());\n const forgetText = t('flow.forget', { defaultValue: \"I've checked — forget it\" });\n const tid = useTestIds();\n const testid = tid.bulkSummary(resource, actionName);\n const own = `resources.${resource}.actions.${actionName}.summary`;\n const count = progress.success.length;\n const heading = caps.has(own, { count })\n ? caps.t(own, { params: { total }, count })\n : `${label}: ${t('flow.bulkSummary', { defaultValue: `${count} processed`, params: { total }, count })} / ${total}`;\n // A bulk flow is a resource's action: its texts live under `resources.<r>.actions.<name>`.\n const place: ErrorTextPlace = {\n action: { prefix: `resources.${resource}.actions.${actionName}`, texts },\n };\n const textCaps = { has: (key: string) => caps.has(key), t: caps.t };\n // Steps 1 to 5 of spec 4.15; the fallback is the outcome's own sentence.\n const textOf = (error: DataError | undefined, fallback: () => string): string =>\n (error === undefined\n ? undefined\n : (specificErrorText(error, textCaps, place) ??\n kindErrorText(error.kind, textCaps, place))) ?? fallback();\n const neutral = () =>\n t('flow.rejected.validation', { defaultValue: 'Not accepted. Nothing was saved.' });\n const gone = progress.rejected.filter((entry) => entry.reason === 'gone');\n // One group per check, in the order each first appears, headed by the first entry's text. The machine resolved the\n // text (bundle entry, the check's declared `texts`, the framework's sentence); an entry without\n // it reads the check's `checks.<id>` bundle entry, else names the check.\n const byCheck = new Map<string, { check: string; title: string; ids: string[] }>();\n for (const entry of progress.rejected) {\n if (entry.reason !== 'check' || entry.check === undefined) continue;\n const own = `checks.${entry.check}`;\n const title = entry.message ?? (caps.has(own) ? caps.t(own) : entry.check);\n const group = byCheck.get(entry.check);\n if (group === undefined)\n byCheck.set(entry.check, { check: entry.check, title, ids: [entry.id] });\n else group.ids.push(entry.id);\n }\n const checkGroups = [...byCheck.values()].map(\n ({ check, title, ids }): SummaryGroup => ({ key: `check:${check}`, title, lines: [{ ids }] }),\n );\n const ownGone = `resources.${resource}.actions.${actionName}.rereadGone`;\n const goneTitle = caps.has(ownGone)\n ? caps.t(ownGone)\n : (declaredText('flow', { texts }, 'rereadGone') ??\n t('flow.bulkGone', { defaultValue: 'No longer available' }));\n const notApplied = [\n ...progress.rejected\n .filter((entry) => entry.reason === 'server')\n .map((entry) => ({ id: entry.id, text: textOf(entry.error, neutral) })),\n ...progress.failed.map((entry) => ({\n id: entry.id,\n text: textOf(entry.error, () =>\n entry.reason === 'reread'\n ? t('flow.couldNotReread', {\n defaultValue: \"Couldn't re-read the record. Nothing was sent.\",\n })\n : t('flow.failed', {\n defaultValue: 'The request could not be sent. Nothing was saved.',\n }),\n ),\n })),\n ];\n const unknown = progress.unknown\n .filter((entry) => !forgotten.has(entry.id))\n .map((entry) => ({\n id: entry.id,\n text: textOf(entry.error, () =>\n entry.error?.applied === 'partial'\n ? t('flow.unknownPartial', {\n defaultValue: 'Part of this may have been applied. Nothing was resent.',\n })\n : t('flow.unknown', { defaultValue: 'It may have been applied. Nothing was resent.' }),\n ),\n }));\n const groups: readonly SummaryGroup[] = [\n ...checkGroups,\n { key: 'gone', title: goneTitle, lines: [{ ids: gone.map((entry) => entry.id) }] },\n {\n key: 'reread-skipped',\n title: t('flow.bulkSentWithoutReread', { defaultValue: 'Sent without a current record' }),\n lines: [\n {\n ids: progress.rereadSkipped\n .filter((entry) => entry.policy === 'warn')\n .map((entry) => entry.id),\n },\n ],\n },\n {\n key: 'not-applied',\n title: t('flow.bulkNotApplied', { defaultValue: 'Not applied' }),\n lines: linesByText(notApplied),\n },\n {\n key: 'unknown',\n title: t('flow.bulkMayHaveBeenApplied', { defaultValue: 'May have been applied' }),\n lines: linesByText(unknown),\n },\n {\n key: 'unresolved',\n title: t('flow.bulkUnresolved', {\n defaultValue: 'Skipped: an earlier request for it may have been applied.',\n }),\n lines: [{ ids: progress.unresolved.filter((id) => !forgotten.has(id)) }],\n },\n {\n key: 'not-attempted',\n title: t('flow.bulkNotAttempted', { defaultValue: 'Not attempted.' }),\n lines: [{ ids: progress.notAttempted }],\n },\n ];\n const sizeOf = (group: SummaryGroup) =>\n group.lines.reduce((sum, line) => sum + line.ids.length, 0);\n return (\n <div data-testid={testid} className=\"flex flex-col gap-3 text-sm\">\n <p data-testid={`${testid}:heading`} className=\"font-medium\">\n {heading}\n </p>\n {groups\n .filter((group) => sizeOf(group) > 0)\n .map((group) => (\n <section key={group.key} data-testid={`${testid}:${group.key}`}>\n <h3 className=\"font-medium\">\n {group.title}{' '}\n <span data-testid={`${testid}:${group.key}:count`} className=\"tabular-nums\">\n ({sizeOf(group)})\n </span>\n </h3>\n {group.lines.map((line, index) => (\n <div\n key={line.text ?? index}\n data-testid={line.text === undefined ? undefined : `${testid}:${group.key}:line`}\n >\n {line.text === undefined ? null : (\n <p>\n {t('flow.bulkLine', {\n defaultValue: `${line.ids.length}: ${line.text}`,\n params: { message: line.text },\n count: line.ids.length,\n })}\n </p>\n )}\n <ul className=\"flex flex-wrap gap-1 text-muted-foreground\">\n {line.ids.slice(0, BULK_SUMMARY_IDS).map((id) => (\n <li\n key={id}\n data-testid={`${testid}:${group.key}:${id}`}\n className=\"flex items-center gap-1\"\n >\n {id}\n {group.key === 'unknown' || group.key === 'unresolved' ? (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 px-1.5 text-xs\"\n data-testid={`${testid}:forget:${id}`}\n onClick={() =>\n void forget(id).then(() =>\n setForgotten((previous) => new Set([...previous, id])),\n )\n }\n >\n {forgetText}\n </Button>\n ) : null}\n </li>\n ))}\n {line.ids.length > BULK_SUMMARY_IDS ? (\n <li>+{line.ids.length - BULK_SUMMARY_IDS}</li>\n ) : null}\n </ul>\n </div>\n ))}\n </section>\n ))}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as Button } from "./button-MWVeZaqj.js";
|
|
2
|
-
import { BULK_SUMMARY_IDS } from "@burojs/core";
|
|
2
|
+
import { BULK_SUMMARY_IDS, declaredText } from "@burojs/core";
|
|
3
3
|
import { kindErrorText, specificErrorText, useI18nCaps, useOptionalT, useTestIds } from "@burojs/react";
|
|
4
4
|
import { useState } from "react";
|
|
5
5
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -47,7 +47,27 @@ function FlowBulkSummary({ resource, actionName, label, total, progress, texts }
|
|
|
47
47
|
};
|
|
48
48
|
const textOf = (error, fallback) => (error === void 0 ? void 0 : specificErrorText(error, textCaps, place) ?? kindErrorText(error.kind, textCaps, place)) ?? fallback();
|
|
49
49
|
const neutral = () => t("flow.rejected.validation", { defaultValue: "Not accepted. Nothing was saved." });
|
|
50
|
-
const
|
|
50
|
+
const gone = progress.rejected.filter((entry) => entry.reason === "gone");
|
|
51
|
+
const byCheck = new Map();
|
|
52
|
+
for (const entry of progress.rejected) {
|
|
53
|
+
if (entry.reason !== "check" || entry.check === void 0) continue;
|
|
54
|
+
const own = `checks.${entry.check}`;
|
|
55
|
+
const title = entry.message ?? (caps.has(own) ? caps.t(own) : entry.check);
|
|
56
|
+
const group = byCheck.get(entry.check);
|
|
57
|
+
if (group === void 0) byCheck.set(entry.check, {
|
|
58
|
+
check: entry.check,
|
|
59
|
+
title,
|
|
60
|
+
ids: [entry.id]
|
|
61
|
+
});
|
|
62
|
+
else group.ids.push(entry.id);
|
|
63
|
+
}
|
|
64
|
+
const checkGroups = [...byCheck.values()].map(({ check, title, ids }) => ({
|
|
65
|
+
key: `check:${check}`,
|
|
66
|
+
title,
|
|
67
|
+
lines: [{ ids }]
|
|
68
|
+
}));
|
|
69
|
+
const ownGone = `resources.${resource}.actions.${actionName}.rereadGone`;
|
|
70
|
+
const goneTitle = caps.has(ownGone) ? caps.t(ownGone) : declaredText("flow", { texts }, "rereadGone") ?? t("flow.bulkGone", { defaultValue: "No longer available" });
|
|
51
71
|
const notApplied = [...progress.rejected.filter((entry) => entry.reason === "server").map((entry) => ({
|
|
52
72
|
id: entry.id,
|
|
53
73
|
text: textOf(entry.error, neutral)
|
|
@@ -60,10 +80,16 @@ function FlowBulkSummary({ resource, actionName, label, total, progress, texts }
|
|
|
60
80
|
text: textOf(entry.error, () => entry.error?.applied === "partial" ? t("flow.unknownPartial", { defaultValue: "Part of this may have been applied. Nothing was resent." }) : t("flow.unknown", { defaultValue: "It may have been applied. Nothing was resent." }))
|
|
61
81
|
}));
|
|
62
82
|
const groups = [
|
|
83
|
+
...checkGroups,
|
|
84
|
+
{
|
|
85
|
+
key: "gone",
|
|
86
|
+
title: goneTitle,
|
|
87
|
+
lines: [{ ids: gone.map((entry) => entry.id) }]
|
|
88
|
+
},
|
|
63
89
|
{
|
|
64
|
-
key: "
|
|
65
|
-
title: t("flow.
|
|
66
|
-
lines: [{ ids:
|
|
90
|
+
key: "reread-skipped",
|
|
91
|
+
title: t("flow.bulkSentWithoutReread", { defaultValue: "Sent without a current record" }),
|
|
92
|
+
lines: [{ ids: progress.rereadSkipped.filter((entry) => entry.policy === "warn").map((entry) => entry.id) }]
|
|
67
93
|
},
|
|
68
94
|
{
|
|
69
95
|
key: "not-applied",
|
|
@@ -140,4 +166,4 @@ function FlowBulkSummary({ resource, actionName, label, total, progress, texts }
|
|
|
140
166
|
//#endregion
|
|
141
167
|
export { FlowBulkSummary };
|
|
142
168
|
|
|
143
|
-
//# sourceMappingURL=bulk-summary-
|
|
169
|
+
//# sourceMappingURL=bulk-summary-D6A0ua21.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk-summary-D6A0ua21.js","names":[],"sources":["../src/flows/bulk-summary.tsx"],"sourcesContent":["'use client';\nimport { BULK_SUMMARY_IDS, type BulkProgress, type DataError, declaredText } from '@burojs/core';\nimport {\n type ErrorTextPlace,\n kindErrorText,\n specificErrorText,\n useI18nCaps,\n useOptionalT,\n useTestIds,\n} from '@burojs/react';\nimport { useForgetEachAttempt } from '@burojs/react/flows';\nimport { type ReactElement, useState } from 'react';\nimport { Button } from '../primitives/button.js';\n\nexport interface FlowBulkSummaryProps {\n readonly resource: string;\n readonly actionName: string;\n /** The action's label. */\n readonly label: string;\n /** How many ids the run was given. */\n readonly total: number;\n readonly progress: BulkProgress;\n /** The action's declared texts (`texts.validation`, `texts.rejected`): the resolver's action place. */\n readonly texts?: unknown;\n}\n\n/** One line of a group: the ids that read the same text; `text` absent for a group without lines. */\ninterface SummaryLine {\n readonly text?: string;\n readonly ids: readonly string[];\n}\n\ninterface SummaryGroup {\n readonly key: string;\n readonly title: string;\n readonly lines: readonly SummaryLine[];\n}\n\n/** The ids by their text, in the order each text first appears. */\nfunction linesByText(entries: readonly { readonly id: string; readonly text: string }[]) {\n const lines = new Map<string, string[]>();\n for (const { id, text } of entries) {\n const ids = lines.get(text);\n if (ids === undefined) lines.set(text, [id]);\n else ids.push(id);\n }\n return [...lines].map(([text, ids]): SummaryLine => ({ text, ids }));\n}\n\n/**\n * A bulk flow's summary (P4 spec 4.16, T1 spec 4.17): the count that succeeded of the ids given\n * (the flow's own `resources.<r>.actions.<name>.summary`, `{{count}}` of `{{total}}`, else the\n * framework's count text), then one group per other outcome with its count and up to\n * `BULK_SUMMARY_IDS` ids per line. The ids the server answered for are grouped first by\n * `applied` — not applied (refused or failed) and may have been applied (unknown) — and then by\n * the text each one's error resolves to (spec 4.15, with the action as the place), so\n * \"3 records: Already linked\" and \"2 records: Not allowed\" are separate lines. A row a check\n * rejected is grouped under that check's resolved text (`checks.<id>`), a row that was gone under\n * the flow's `texts.rereadGone` else \"No longer available\", and a row sent without a re-read\n * (`rereadSkipped` under `warn`, even when every row succeeded) under its own group (REF-135 §2.3).\n * Unresolved from an earlier run and not attempted keep their own groups.\n * Every text resolves at render, so a language switch re-renders it.\n */\nexport function FlowBulkSummary({\n resource,\n actionName,\n label,\n total,\n progress,\n texts,\n}: FlowBulkSummaryProps): ReactElement {\n const t = useOptionalT();\n const caps = useI18nCaps(resource);\n // An id the run left unknown, or found unresolved, has its exit here (P4-C review I3): the user\n // checked the record, and the id's attempt is forgotten — the next run sends it again.\n const forget = useForgetEachAttempt({ resource, action: actionName });\n const [forgotten, setForgotten] = useState<ReadonlySet<string>>(() => new Set());\n const forgetText = t('flow.forget', { defaultValue: \"I've checked — forget it\" });\n const tid = useTestIds();\n const testid = tid.bulkSummary(resource, actionName);\n const own = `resources.${resource}.actions.${actionName}.summary`;\n const count = progress.success.length;\n const heading = caps.has(own, { count })\n ? caps.t(own, { params: { total }, count })\n : `${label}: ${t('flow.bulkSummary', { defaultValue: `${count} processed`, params: { total }, count })} / ${total}`;\n // A bulk flow is a resource's action: its texts live under `resources.<r>.actions.<name>`.\n const place: ErrorTextPlace = {\n action: { prefix: `resources.${resource}.actions.${actionName}`, texts },\n };\n const textCaps = { has: (key: string) => caps.has(key), t: caps.t };\n // Steps 1 to 5 of spec 4.15; the fallback is the outcome's own sentence.\n const textOf = (error: DataError | undefined, fallback: () => string): string =>\n (error === undefined\n ? undefined\n : (specificErrorText(error, textCaps, place) ??\n kindErrorText(error.kind, textCaps, place))) ?? fallback();\n const neutral = () =>\n t('flow.rejected.validation', { defaultValue: 'Not accepted. Nothing was saved.' });\n const gone = progress.rejected.filter((entry) => entry.reason === 'gone');\n // One group per check, in the order each first appears, headed by the first entry's text. The machine resolved the\n // text (bundle entry, the check's declared `texts`, the framework's sentence); an entry without\n // it reads the check's `checks.<id>` bundle entry, else names the check.\n const byCheck = new Map<string, { check: string; title: string; ids: string[] }>();\n for (const entry of progress.rejected) {\n if (entry.reason !== 'check' || entry.check === undefined) continue;\n const own = `checks.${entry.check}`;\n const title = entry.message ?? (caps.has(own) ? caps.t(own) : entry.check);\n const group = byCheck.get(entry.check);\n if (group === undefined)\n byCheck.set(entry.check, { check: entry.check, title, ids: [entry.id] });\n else group.ids.push(entry.id);\n }\n const checkGroups = [...byCheck.values()].map(\n ({ check, title, ids }): SummaryGroup => ({ key: `check:${check}`, title, lines: [{ ids }] }),\n );\n const ownGone = `resources.${resource}.actions.${actionName}.rereadGone`;\n const goneTitle = caps.has(ownGone)\n ? caps.t(ownGone)\n : (declaredText('flow', { texts }, 'rereadGone') ??\n t('flow.bulkGone', { defaultValue: 'No longer available' }));\n const notApplied = [\n ...progress.rejected\n .filter((entry) => entry.reason === 'server')\n .map((entry) => ({ id: entry.id, text: textOf(entry.error, neutral) })),\n ...progress.failed.map((entry) => ({\n id: entry.id,\n text: textOf(entry.error, () =>\n entry.reason === 'reread'\n ? t('flow.couldNotReread', {\n defaultValue: \"Couldn't re-read the record. Nothing was sent.\",\n })\n : t('flow.failed', {\n defaultValue: 'The request could not be sent. Nothing was saved.',\n }),\n ),\n })),\n ];\n const unknown = progress.unknown\n .filter((entry) => !forgotten.has(entry.id))\n .map((entry) => ({\n id: entry.id,\n text: textOf(entry.error, () =>\n entry.error?.applied === 'partial'\n ? t('flow.unknownPartial', {\n defaultValue: 'Part of this may have been applied. Nothing was resent.',\n })\n : t('flow.unknown', { defaultValue: 'It may have been applied. Nothing was resent.' }),\n ),\n }));\n const groups: readonly SummaryGroup[] = [\n ...checkGroups,\n { key: 'gone', title: goneTitle, lines: [{ ids: gone.map((entry) => entry.id) }] },\n {\n key: 'reread-skipped',\n title: t('flow.bulkSentWithoutReread', { defaultValue: 'Sent without a current record' }),\n lines: [\n {\n ids: progress.rereadSkipped\n .filter((entry) => entry.policy === 'warn')\n .map((entry) => entry.id),\n },\n ],\n },\n {\n key: 'not-applied',\n title: t('flow.bulkNotApplied', { defaultValue: 'Not applied' }),\n lines: linesByText(notApplied),\n },\n {\n key: 'unknown',\n title: t('flow.bulkMayHaveBeenApplied', { defaultValue: 'May have been applied' }),\n lines: linesByText(unknown),\n },\n {\n key: 'unresolved',\n title: t('flow.bulkUnresolved', {\n defaultValue: 'Skipped: an earlier request for it may have been applied.',\n }),\n lines: [{ ids: progress.unresolved.filter((id) => !forgotten.has(id)) }],\n },\n {\n key: 'not-attempted',\n title: t('flow.bulkNotAttempted', { defaultValue: 'Not attempted.' }),\n lines: [{ ids: progress.notAttempted }],\n },\n ];\n const sizeOf = (group: SummaryGroup) =>\n group.lines.reduce((sum, line) => sum + line.ids.length, 0);\n return (\n <div data-testid={testid} className=\"flex flex-col gap-3 text-sm\">\n <p data-testid={`${testid}:heading`} className=\"font-medium\">\n {heading}\n </p>\n {groups\n .filter((group) => sizeOf(group) > 0)\n .map((group) => (\n <section key={group.key} data-testid={`${testid}:${group.key}`}>\n <h3 className=\"font-medium\">\n {group.title}{' '}\n <span data-testid={`${testid}:${group.key}:count`} className=\"tabular-nums\">\n ({sizeOf(group)})\n </span>\n </h3>\n {group.lines.map((line, index) => (\n <div\n key={line.text ?? index}\n data-testid={line.text === undefined ? undefined : `${testid}:${group.key}:line`}\n >\n {line.text === undefined ? null : (\n <p>\n {t('flow.bulkLine', {\n defaultValue: `${line.ids.length}: ${line.text}`,\n params: { message: line.text },\n count: line.ids.length,\n })}\n </p>\n )}\n <ul className=\"flex flex-wrap gap-1 text-muted-foreground\">\n {line.ids.slice(0, BULK_SUMMARY_IDS).map((id) => (\n <li\n key={id}\n data-testid={`${testid}:${group.key}:${id}`}\n className=\"flex items-center gap-1\"\n >\n {id}\n {group.key === 'unknown' || group.key === 'unresolved' ? (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 px-1.5 text-xs\"\n data-testid={`${testid}:forget:${id}`}\n onClick={() =>\n void forget(id).then(() =>\n setForgotten((previous) => new Set([...previous, id])),\n )\n }\n >\n {forgetText}\n </Button>\n ) : null}\n </li>\n ))}\n {line.ids.length > BULK_SUMMARY_IDS ? (\n <li>+{line.ids.length - BULK_SUMMARY_IDS}</li>\n ) : null}\n </ul>\n </div>\n ))}\n </section>\n ))}\n </div>\n );\n}\n"],"mappings":"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"}
|
package/dist/{candidates-relation-picker-y5M6_oe4.cjs → candidates-relation-picker-C47mF260.cjs}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const require_lazy_relation_picker_dialog = require("./lazy-relation-picker-dialog-
|
|
2
|
-
const require_relation_picker = require("./relation-picker-
|
|
1
|
+
const require_lazy_relation_picker_dialog = require("./lazy-relation-picker-dialog-BAKBRn3V.cjs");
|
|
2
|
+
const require_relation_picker = require("./relation-picker-ADjxI_TI.cjs");
|
|
3
3
|
let _burojs_core = require("@burojs/core");
|
|
4
4
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
5
5
|
//#region src/fields/candidates-relation-picker.tsx
|
|
@@ -28,4 +28,4 @@ function CandidatesRelationPicker(props) {
|
|
|
28
28
|
//#endregion
|
|
29
29
|
exports.CandidatesRelationPicker = CandidatesRelationPicker;
|
|
30
30
|
|
|
31
|
-
//# sourceMappingURL=candidates-relation-picker-
|
|
31
|
+
//# sourceMappingURL=candidates-relation-picker-C47mF260.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"candidates-relation-picker-
|
|
1
|
+
{"version":3,"file":"candidates-relation-picker-C47mF260.cjs","names":["resourceKey","useCandidateSelection","FieldRelationPicker"],"sources":["../src/fields/candidates-relation-picker.tsx"],"sourcesContent":["import { type RelationCandidate, type ResourceRefInput, resourceKey } from '@burojs/core';\nimport type * as React from 'react';\nimport { useCandidateSelection } from './candidates-gate.js';\nimport { FieldRelationPicker } from './relation-picker.js';\nimport type { FieldInputProps } from './registry.js';\n\n/** The select of a field that declares `candidates`: the gate and the filters it resolves. */\nexport function CandidatesRelationPicker(props: FieldInputProps): React.ReactElement {\n const { name, field, metaSources, resource, fixedFilters } = props;\n const meta = field?.meta as { to?: ResourceRefInput; candidates?: unknown };\n const to = resourceKey(meta.to as ResourceRefInput);\n const selection = useCandidateSelection({\n to,\n candidates: meta.candidates as readonly RelationCandidate[],\n sources: metaSources,\n resource: resource ?? '',\n fieldName: field?.name ?? name,\n fixedFilters,\n });\n return (\n <FieldRelationPicker\n props={props}\n to={to}\n extra={{\n fixedFilters: selection.fixedFilters,\n ...(selection.gate === undefined ? {} : { candidatesGate: selection.gate }),\n ...(selection.rowFits === undefined ? {} : { rowFits: selection.rowFits }),\n }}\n />\n );\n}\n"],"mappings":";;;;;AAOA,SAAgB,yBAAyB,OAA4C;CACnF,MAAM,EAAE,MAAM,OAAO,aAAa,UAAU,iBAAiB;CAC7D,MAAM,OAAO,OAAO;CACpB,MAAM,MAAA,GAAKA,aAAAA,YAAAA,CAAY,KAAK,EAAsB;CAClD,MAAM,YAAYC,oCAAAA,sBAAsB;EACtC;EACA,YAAY,KAAK;EACjB,SAAS;EACT,UAAU,YAAY;EACtB,WAAW,OAAO,QAAQ;EAC1B;CACF,CAAC;CACD,QACE,GAAA,kBAAA,IAAA,CAACC,wBAAAA,qBAAD;EACS;EACH;EACJ,OAAO;GACL,cAAc,UAAU;GACxB,GAAI,UAAU,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,gBAAgB,UAAU,KAAK;GACzE,GAAI,UAAU,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,UAAU,QAAQ;EAC1E;CACD,CAAA;AAEL"}
|
package/dist/{candidates-relation-picker-CS_JZ4Fd.js → candidates-relation-picker-CGXItMN0.js}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { n as useCandidateSelection } from "./lazy-relation-picker-dialog-
|
|
2
|
-
import { t as FieldRelationPicker } from "./relation-picker-
|
|
1
|
+
import { n as useCandidateSelection } from "./lazy-relation-picker-dialog-DN4bvQfg.js";
|
|
2
|
+
import { t as FieldRelationPicker } from "./relation-picker-x7P5HKie.js";
|
|
3
3
|
import { resourceKey } from "@burojs/core";
|
|
4
4
|
import { jsx } from "react/jsx-runtime";
|
|
5
5
|
//#region src/fields/candidates-relation-picker.tsx
|
|
@@ -28,4 +28,4 @@ function CandidatesRelationPicker(props) {
|
|
|
28
28
|
//#endregion
|
|
29
29
|
export { CandidatesRelationPicker };
|
|
30
30
|
|
|
31
|
-
//# sourceMappingURL=candidates-relation-picker-
|
|
31
|
+
//# sourceMappingURL=candidates-relation-picker-CGXItMN0.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"candidates-relation-picker-
|
|
1
|
+
{"version":3,"file":"candidates-relation-picker-CGXItMN0.js","names":[],"sources":["../src/fields/candidates-relation-picker.tsx"],"sourcesContent":["import { type RelationCandidate, type ResourceRefInput, resourceKey } from '@burojs/core';\nimport type * as React from 'react';\nimport { useCandidateSelection } from './candidates-gate.js';\nimport { FieldRelationPicker } from './relation-picker.js';\nimport type { FieldInputProps } from './registry.js';\n\n/** The select of a field that declares `candidates`: the gate and the filters it resolves. */\nexport function CandidatesRelationPicker(props: FieldInputProps): React.ReactElement {\n const { name, field, metaSources, resource, fixedFilters } = props;\n const meta = field?.meta as { to?: ResourceRefInput; candidates?: unknown };\n const to = resourceKey(meta.to as ResourceRefInput);\n const selection = useCandidateSelection({\n to,\n candidates: meta.candidates as readonly RelationCandidate[],\n sources: metaSources,\n resource: resource ?? '',\n fieldName: field?.name ?? name,\n fixedFilters,\n });\n return (\n <FieldRelationPicker\n props={props}\n to={to}\n extra={{\n fixedFilters: selection.fixedFilters,\n ...(selection.gate === undefined ? {} : { candidatesGate: selection.gate }),\n ...(selection.rowFits === undefined ? {} : { rowFits: selection.rowFits }),\n }}\n />\n );\n}\n"],"mappings":";;;;;AAOA,SAAgB,yBAAyB,OAA4C;CACnF,MAAM,EAAE,MAAM,OAAO,aAAa,UAAU,iBAAiB;CAC7D,MAAM,OAAO,OAAO;CACpB,MAAM,KAAK,YAAY,KAAK,EAAsB;CAClD,MAAM,YAAY,sBAAsB;EACtC;EACA,YAAY,KAAK;EACjB,SAAS;EACT,UAAU,YAAY;EACtB,WAAW,OAAO,QAAQ;EAC1B;CACF,CAAC;CACD,OACE,IAAC,qBAAD;EACS;EACH;EACJ,OAAO;GACL,cAAc,UAAU;GACxB,GAAI,UAAU,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,gBAAgB,UAAU,KAAK;GACzE,GAAI,UAAU,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,UAAU,QAAQ;EAC1E;CACD,CAAA;AAEL"}
|
|
@@ -492,11 +492,11 @@ function retrying(importer) {
|
|
|
492
492
|
return loading;
|
|
493
493
|
};
|
|
494
494
|
}
|
|
495
|
-
const loadFlowRuntime = retrying(() => Promise.resolve().then(() => require("./flow-runtime-
|
|
496
|
-
const loadFlowScreen = retrying(() => Promise.resolve().then(() => require("./flow-screen-
|
|
497
|
-
const loadPageFlowRoute = retrying(() => Promise.resolve().then(() => require("./page-flow-route-
|
|
498
|
-
const loadInlineFlowHost = retrying(() => Promise.resolve().then(() => require("./inline-flow-host-
|
|
499
|
-
const loadBulkSummary = retrying(() => Promise.resolve().then(() => require("./bulk-summary-
|
|
495
|
+
const loadFlowRuntime = retrying(() => Promise.resolve().then(() => require("./flow-runtime-BVFjMU5-.cjs")));
|
|
496
|
+
const loadFlowScreen = retrying(() => Promise.resolve().then(() => require("./flow-screen-6y5E_HT6.cjs")));
|
|
497
|
+
const loadPageFlowRoute = retrying(() => Promise.resolve().then(() => require("./page-flow-route-DEjAxHe3.cjs")));
|
|
498
|
+
const loadInlineFlowHost = retrying(() => Promise.resolve().then(() => require("./inline-flow-host-C4KmZIYE.cjs")));
|
|
499
|
+
const loadBulkSummary = retrying(() => Promise.resolve().then(() => require("./bulk-summary-2HLgz7Il.cjs")));
|
|
500
500
|
function preloadFlowRuntime() {
|
|
501
501
|
loadFlowRuntime().catch(() => void 0);
|
|
502
502
|
}
|
|
@@ -1404,6 +1404,13 @@ function issueText(issue, t, caps, resource) {
|
|
|
1404
1404
|
params
|
|
1405
1405
|
});
|
|
1406
1406
|
if (declared !== void 0) return declared;
|
|
1407
|
+
if (issue.check?.constraint !== void 0) {
|
|
1408
|
+
const text = (0, _burojs_core.constraintText)(issue.check.constraint, String(params?.limit ?? ""));
|
|
1409
|
+
return t(text.key, {
|
|
1410
|
+
defaultValue: text.defaultValue,
|
|
1411
|
+
params
|
|
1412
|
+
});
|
|
1413
|
+
}
|
|
1407
1414
|
const name = String(params?.name ?? checkId);
|
|
1408
1415
|
return t(_burojs_core.FRAMEWORK_TEXT_KEYS.checkFailed, {
|
|
1409
1416
|
defaultValue: (0, _burojs_core.checkFailedDefault)(name),
|
|
@@ -1905,4 +1912,4 @@ Object.defineProperty(exports, "useToBrowserHref", {
|
|
|
1905
1912
|
}
|
|
1906
1913
|
});
|
|
1907
1914
|
|
|
1908
|
-
//# sourceMappingURL=check-confirm-dialog-
|
|
1915
|
+
//# sourceMappingURL=check-confirm-dialog-BT04Mieo.cjs.map
|