@burojs/ui-shadcn 0.9.0 → 0.10.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.
Files changed (108) hide show
  1. package/dist/{bulk-summary-2HLgz7Il.cjs → bulk-summary-Chc61Pyw.cjs} +9 -7
  2. package/dist/bulk-summary-Chc61Pyw.cjs.map +1 -0
  3. package/dist/{bulk-summary-D6A0ua21.js → bulk-summary-DpSQD2Fq.js} +9 -7
  4. package/dist/bulk-summary-DpSQD2Fq.js.map +1 -0
  5. package/dist/{candidates-relation-picker-QvoY2bOQ.js → candidates-relation-picker-DRsHKe6N.js} +3 -3
  6. package/dist/{candidates-relation-picker-QvoY2bOQ.js.map → candidates-relation-picker-DRsHKe6N.js.map} +1 -1
  7. package/dist/{candidates-relation-picker-pEAWKQEY.cjs → candidates-relation-picker-GIxsp7D_.cjs} +3 -3
  8. package/dist/{candidates-relation-picker-pEAWKQEY.cjs.map → candidates-relation-picker-GIxsp7D_.cjs.map} +1 -1
  9. package/dist/{check-confirm-dialog-W-8WOmGh.cjs → check-confirm-dialog-BMSb7wFv.cjs} +17 -9
  10. package/dist/check-confirm-dialog-BMSb7wFv.cjs.map +1 -0
  11. package/dist/{check-confirm-dialog-B-CbJTln.js → check-confirm-dialog-B_u3YVHS.js} +18 -10
  12. package/dist/{check-confirm-dialog-B-CbJTln.js.map → check-confirm-dialog-B_u3YVHS.js.map} +1 -1
  13. package/dist/{filter-builder-04nas3eq.js → filter-builder-DX-xC3Yd.js} +2 -2
  14. package/dist/{filter-builder-04nas3eq.js.map → filter-builder-DX-xC3Yd.js.map} +1 -1
  15. package/dist/{filter-builder-DQX-TMFh.cjs → filter-builder-Dt5E8PSX.cjs} +2 -2
  16. package/dist/{filter-builder-DQX-TMFh.cjs.map → filter-builder-Dt5E8PSX.cjs.map} +1 -1
  17. package/dist/{flow-runtime-DyNIYfUP.cjs → flow-runtime-CQ4wf8co.cjs} +2 -2
  18. package/dist/{flow-runtime-DyNIYfUP.cjs.map → flow-runtime-CQ4wf8co.cjs.map} +1 -1
  19. package/dist/{flow-runtime-BEIyym7d.js → flow-runtime-Q2vD7R3c.js} +2 -2
  20. package/dist/{flow-runtime-BEIyym7d.js.map → flow-runtime-Q2vD7R3c.js.map} +1 -1
  21. package/dist/{flow-screen-DY1Z9PbG.js → flow-screen-B1y2yizP.js} +18 -18
  22. package/dist/flow-screen-B1y2yizP.js.map +1 -0
  23. package/dist/{flow-screen-FE5Xhb3t.cjs → flow-screen-sw2cP70t.cjs} +18 -18
  24. package/dist/flow-screen-sw2cP70t.cjs.map +1 -0
  25. package/dist/index.cjs +2183 -109
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.cts +76 -8
  28. package/dist/index.d.ts +76 -8
  29. package/dist/index.js +2095 -24
  30. package/dist/index.js.map +1 -1
  31. package/dist/{inline-flow-host-yVLo6-sM.cjs → inline-flow-host-CkhoA69R.cjs} +3 -3
  32. package/dist/{inline-flow-host-yVLo6-sM.cjs.map → inline-flow-host-CkhoA69R.cjs.map} +1 -1
  33. package/dist/{inline-flow-host-D6u-RlsV.js → inline-flow-host-DqbXqcPS.js} +3 -3
  34. package/dist/{inline-flow-host-D6u-RlsV.js.map → inline-flow-host-DqbXqcPS.js.map} +1 -1
  35. package/dist/{lazy-relation-picker-dialog-BaORufxQ.js → lazy-relation-picker-dialog-BaIEWLbF.js} +3 -52
  36. package/dist/lazy-relation-picker-dialog-BaIEWLbF.js.map +1 -0
  37. package/dist/{lazy-relation-picker-dialog-C_VlGlDz.cjs → lazy-relation-picker-dialog-CeRzOAi0.cjs} +3 -52
  38. package/dist/lazy-relation-picker-dialog-CeRzOAi0.cjs.map +1 -0
  39. package/dist/{page-flow-route-CyMzUidK.js → page-flow-route-CP7cS7FY.js} +5 -5
  40. package/dist/page-flow-route-CP7cS7FY.js.map +1 -0
  41. package/dist/{page-flow-route-OFx7h7Ja.cjs → page-flow-route-UDx8qvdM.cjs} +9 -9
  42. package/dist/page-flow-route-UDx8qvdM.cjs.map +1 -0
  43. package/dist/{place-node-BZF5Af6x.cjs → place-node-C5ZmuHaN.cjs} +149 -40
  44. package/dist/place-node-C5ZmuHaN.cjs.map +1 -0
  45. package/dist/{place-node-DRjmJGQ_.js → place-node-DwWAigv0.js} +146 -43
  46. package/dist/place-node-DwWAigv0.js.map +1 -0
  47. package/dist/record-trail-store-Cjo9vtod.cjs +126 -0
  48. package/dist/record-trail-store-Cjo9vtod.cjs.map +1 -0
  49. package/dist/record-trail-store-Dn6bVry4.js +91 -0
  50. package/dist/record-trail-store-Dn6bVry4.js.map +1 -0
  51. package/dist/{related-list-cards-xVvgSlu-.cjs → related-list-cards-BypKfm9t.cjs} +3 -3
  52. package/dist/{related-list-cards-xVvgSlu-.cjs.map → related-list-cards-BypKfm9t.cjs.map} +1 -1
  53. package/dist/{related-list-cards-2hLitVkg.js → related-list-cards-Dcmruy09.js} +3 -3
  54. package/dist/{related-list-cards-2hLitVkg.js.map → related-list-cards-Dcmruy09.js.map} +1 -1
  55. package/dist/{related-list-timeline-Dsf5WewG.cjs → related-list-timeline-D-KClgKb.cjs} +4 -4
  56. package/dist/{related-list-timeline-Dsf5WewG.cjs.map → related-list-timeline-D-KClgKb.cjs.map} +1 -1
  57. package/dist/{related-list-timeline-CxJqe6eK.js → related-list-timeline-DZON_qSc.js} +4 -4
  58. package/dist/{related-list-timeline-CxJqe6eK.js.map → related-list-timeline-DZON_qSc.js.map} +1 -1
  59. package/dist/{related-rows-DDhp9axl.cjs → related-rows-DgF05ssi.cjs} +4 -4
  60. package/dist/{related-rows-DDhp9axl.cjs.map → related-rows-DgF05ssi.cjs.map} +1 -1
  61. package/dist/{related-rows-DL6CWsrj.js → related-rows-ETZl5CB9.js} +4 -4
  62. package/dist/{related-rows-DL6CWsrj.js.map → related-rows-ETZl5CB9.js.map} +1 -1
  63. package/dist/{relation-create-_SFuPQGM.cjs → relation-create-B8zngAcA.cjs} +46 -11
  64. package/dist/relation-create-B8zngAcA.cjs.map +1 -0
  65. package/dist/{relation-create-6WicROWA.js → relation-create-CeCWyxIb.js} +47 -12
  66. package/dist/relation-create-CeCWyxIb.js.map +1 -0
  67. package/dist/{relation-many-picker-mGEQDWo2.js → relation-many-picker-CT7nKfE2.js} +4 -4
  68. package/dist/{relation-many-picker-mGEQDWo2.js.map → relation-many-picker-CT7nKfE2.js.map} +1 -1
  69. package/dist/{relation-many-picker-BBNsmkaX.cjs → relation-many-picker-Cq0EHY5I.cjs} +4 -4
  70. package/dist/{relation-many-picker-BBNsmkaX.cjs.map → relation-many-picker-Cq0EHY5I.cjs.map} +1 -1
  71. package/dist/{relation-picker-BbO41cFV.js → relation-picker-CCyuMeGq.js} +6 -6
  72. package/dist/{relation-picker-BbO41cFV.js.map → relation-picker-CCyuMeGq.js.map} +1 -1
  73. package/dist/{relation-picker-jk9D_uwn.cjs → relation-picker-DmwTzgsd.cjs} +6 -6
  74. package/dist/{relation-picker-jk9D_uwn.cjs.map → relation-picker-DmwTzgsd.cjs.map} +1 -1
  75. package/dist/{relation-picker-dialog-BgSG_8bU.js → relation-picker-dialog-CoWKjNv8.js} +4 -4
  76. package/dist/{relation-picker-dialog-BgSG_8bU.js.map → relation-picker-dialog-CoWKjNv8.js.map} +1 -1
  77. package/dist/{relation-picker-dialog-Duqy2r0n.cjs → relation-picker-dialog-mbwyNK43.cjs} +4 -4
  78. package/dist/{relation-picker-dialog-Duqy2r0n.cjs.map → relation-picker-dialog-mbwyNK43.cjs.map} +1 -1
  79. package/dist/{relation-select-C3aV18kT.cjs → relation-select-CguIo2M5.cjs} +2 -2
  80. package/dist/{relation-select-C3aV18kT.cjs.map → relation-select-CguIo2M5.cjs.map} +1 -1
  81. package/dist/{relation-select-CjQT9LpS.js → relation-select-nAYxhopN.js} +2 -2
  82. package/dist/{relation-select-CjQT9LpS.js.map → relation-select-nAYxhopN.js.map} +1 -1
  83. package/dist/{use-dialog-filter-state-lsTJxrB4.cjs → use-dialog-filter-state-CpWblz3C.cjs} +2 -2
  84. package/dist/{use-dialog-filter-state-lsTJxrB4.cjs.map → use-dialog-filter-state-CpWblz3C.cjs.map} +1 -1
  85. package/dist/{use-dialog-filter-state-CJoeY-1j.js → use-dialog-filter-state-ZYxOp5WO.js} +2 -2
  86. package/dist/{use-dialog-filter-state-CJoeY-1j.js.map → use-dialog-filter-state-ZYxOp5WO.js.map} +1 -1
  87. package/dist/{use-record-subtitle-BJ9rnj6F.cjs → use-record-subtitle-B4lTR7pf.cjs} +2 -2
  88. package/dist/{use-record-subtitle-BJ9rnj6F.cjs.map → use-record-subtitle-B4lTR7pf.cjs.map} +1 -1
  89. package/dist/{use-record-subtitle-w3ZhXNlf.js → use-record-subtitle-pWMBqQx9.js} +2 -2
  90. package/dist/{use-record-subtitle-w3ZhXNlf.js.map → use-record-subtitle-pWMBqQx9.js.map} +1 -1
  91. package/package.json +9 -9
  92. package/dist/bulk-summary-2HLgz7Il.cjs.map +0 -1
  93. package/dist/bulk-summary-D6A0ua21.js.map +0 -1
  94. package/dist/check-confirm-dialog-W-8WOmGh.cjs.map +0 -1
  95. package/dist/flow-screen-DY1Z9PbG.js.map +0 -1
  96. package/dist/flow-screen-FE5Xhb3t.cjs.map +0 -1
  97. package/dist/lazy-relation-picker-dialog-BaORufxQ.js.map +0 -1
  98. package/dist/lazy-relation-picker-dialog-C_VlGlDz.cjs.map +0 -1
  99. package/dist/page-flow-route-CyMzUidK.js.map +0 -1
  100. package/dist/page-flow-route-OFx7h7Ja.cjs.map +0 -1
  101. package/dist/place-node-BZF5Af6x.cjs.map +0 -1
  102. package/dist/place-node-DRjmJGQ_.js.map +0 -1
  103. package/dist/relation-create-6WicROWA.js.map +0 -1
  104. package/dist/relation-create-_SFuPQGM.cjs.map +0 -1
  105. package/dist/resource-page-router-CzaNATSp.js +0 -2010
  106. package/dist/resource-page-router-CzaNATSp.js.map +0 -1
  107. package/dist/resource-page-router-dmVIeu5s.cjs +0 -2231
  108. package/dist/resource-page-router-dmVIeu5s.cjs.map +0 -1
@@ -1,15 +1,15 @@
1
1
  const require_use_theme = require("./use-theme-DFlpXils.cjs");
2
2
  const require_toaster = require("./toaster-BbByOytP.cjs");
3
- const require_check_confirm_dialog = require("./check-confirm-dialog-W-8WOmGh.cjs");
3
+ const require_check_confirm_dialog = require("./check-confirm-dialog-BMSb7wFv.cjs");
4
4
  const require_button = require("./button-BxnnE28H.cjs");
5
5
  const require_input = require("./input-BI0czGyI.cjs");
6
6
  const require_dialog = require("./dialog-vmMdfUWs.cjs");
7
- const require_relation_create = require("./relation-create-_SFuPQGM.cjs");
7
+ const require_relation_create = require("./relation-create-B8zngAcA.cjs");
8
8
  const require_skeleton = require("./skeleton-_1gP7wan.cjs");
9
- const require_filter_builder = require("./filter-builder-DQX-TMFh.cjs");
9
+ const require_filter_builder = require("./filter-builder-Dt5E8PSX.cjs");
10
10
  const require_label = require("./label-w6JYf2cF.cjs");
11
- const require_lazy_relation_picker_dialog = require("./lazy-relation-picker-dialog-C_VlGlDz.cjs");
12
- const require_relation_select = require("./relation-select-C3aV18kT.cjs");
11
+ const require_lazy_relation_picker_dialog = require("./lazy-relation-picker-dialog-CeRzOAi0.cjs");
12
+ const require_relation_select = require("./relation-select-CguIo2M5.cjs");
13
13
  let _burojs_core = require("@burojs/core");
14
14
  let _burojs_react = require("@burojs/react");
15
15
  let _tabler_icons_react = require("@tabler/icons-react");
@@ -1463,14 +1463,15 @@ function useExportRunWatcher() {
1463
1463
  //#endregion
1464
1464
  //#region src/actions/action-overflow.tsx
1465
1465
  const RowActionsCollapseContext = (0, react.createContext)(false);
1466
- function ActionOverflow({ resource: resourceInput, record, surface, className, hideFlows, collapse, sources }) {
1466
+ function ActionOverflow({ resource: resourceInput, record, surface, className, hideFlows, hideActions, collapse, sources }) {
1467
1467
  const resource = (0, _burojs_core.routeResourceKey)(resourceInput);
1468
1468
  const chromeT = (0, _burojs_react.useChromeT)();
1469
1469
  const tid = (0, _burojs_react.useTestIds)();
1470
1470
  const recordKey = String((0, _burojs_react.recordKeyOf)((0, _burojs_react.useApp)().registry.get(resource), record) ?? "");
1471
1471
  const collapsedRows = (0, react.useContext)(RowActionsCollapseContext);
1472
1472
  const [flowFor, setFlowFor] = (0, react.useState)(null);
1473
- const actions = useShownItemActions(resource, record, surface, hideFlows, sources);
1473
+ const shown = useShownItemActions(resource, record, surface, hideFlows, sources);
1474
+ const actions = hideActions === void 0 ? shown : shown.filter((a) => !hideActions(a.name));
1474
1475
  if (actions.length === 0) return null;
1475
1476
  const isRow = surface === "row";
1476
1477
  const folded = isRow && (collapse ?? collapsedRows);
@@ -3059,6 +3060,22 @@ function actionsColumnSize(items) {
3059
3060
  const strip = controls * ROW_ACTION_CONTROL_PX + (controls - 1) * ROW_ACTION_GAP_PX + ACTIONS_CELL_PADDING_PX;
3060
3061
  return Math.max(ACTIONS_COL_MIN_PX, strip);
3061
3062
  }
3063
+ const isNamedEntry = (value) => typeof value === "object" && value !== null;
3064
+ function offered(items, offers) {
3065
+ return offers === void 0 || items === void 0 ? items : items.filter((action) => offers(action.name));
3066
+ }
3067
+ function rowFlowsOf(def, offers) {
3068
+ if (!def) return [];
3069
+ const items = offered(def.actions?.item, offers) ?? [];
3070
+ const out = [];
3071
+ for (const placement of (0, _burojs_core.planItemActions)(items, "row")) {
3072
+ if (items.find((entry) => entry.name === placement.name)?.kind !== "flow") continue;
3073
+ try {
3074
+ out.push((0, _burojs_core.compileFlow)(def, placement.name));
3075
+ } catch {}
3076
+ }
3077
+ return out;
3078
+ }
3062
3079
  const ALIGN_CLASS = {
3063
3080
  start: "text-start",
3064
3081
  center: "text-center",
@@ -3125,25 +3142,72 @@ function ResourceList({ resource: resourceInput, data, total, page = 1, pageSize
3125
3142
  ]);
3126
3143
  const skeletonColumnKeys = accessPending ? declaredColumnKeys : visibleColumnKeys;
3127
3144
  const rows = (0, react.useMemo)(() => data ?? [], [data]);
3128
- const rowFlows = (0, react.useMemo)(() => {
3129
- if (!def) return [];
3130
- const items = def.actions?.item ?? [];
3131
- const out = [];
3132
- for (const placement of (0, _burojs_core.planItemActions)(items, "row")) {
3133
- if (items.find((entry) => entry.name === placement.name)?.kind !== "flow") continue;
3134
- try {
3135
- out.push((0, _burojs_core.compileFlow)(def, placement.name));
3136
- } catch {}
3145
+ const collectionRows = (0, _burojs_react.useCollectionRows)(resource);
3146
+ const rowKinds = (0, react.useMemo)(() => collectionRows === void 0 ? void 0 : rows.map((row) => collectionRows(row)), [collectionRows, rows]);
3147
+ const rowOffers = (0, react.useMemo)(() => {
3148
+ const fact = (0, _burojs_core.memberFactOf)(def);
3149
+ if (fact?.collection === void 0 || def?.rowActions !== "base") return void 0;
3150
+ const declared = app.registry.bases.get(fact.ref)?.actions?.item;
3151
+ const names = new Set(["edit", "delete"]);
3152
+ if (Array.isArray(declared)) {
3153
+ for (const entry of declared) if (isNamedEntry(entry) && typeof entry.name === "string") names.add(entry.name);
3137
3154
  }
3138
- return out;
3139
- }, [def]);
3140
- const pageIds = (0, react.useMemo)(() => rows.map((row) => String(row.id)), [rows]);
3141
- const rowBatch = (0, _burojs_react.useFlowRowBatch)(resource, pageIds, rowFlows);
3142
- const rowBatchState = rowBatch.state;
3143
- const flowRowBatch = (0, react.useMemo)(() => ({
3155
+ return (name) => names.has(name);
3156
+ }, [def, app]);
3157
+ const hideRowAction = (0, react.useMemo)(() => rowOffers === void 0 ? void 0 : (name) => !rowOffers(name), [rowOffers]);
3158
+ const flowsByDef = (0, react.useMemo)(() => {
3159
+ const cache = new WeakMap();
3160
+ return (target) => {
3161
+ if (target === void 0) return [];
3162
+ let flows = cache.get(target);
3163
+ if (flows === void 0) {
3164
+ flows = rowFlowsOf(target, rowOffers);
3165
+ cache.set(target, flows);
3166
+ }
3167
+ return flows;
3168
+ };
3169
+ }, [rowOffers]);
3170
+ const batchGroups = (0, react.useMemo)(() => {
3171
+ if (rowKinds === void 0) return [{
3172
+ resource,
3173
+ ids: rows.map((row) => String(row.id)),
3174
+ flows: flowsByDef(def)
3175
+ }];
3176
+ const idsByMember = new Map();
3177
+ rowKinds.forEach((kind, index) => {
3178
+ if (!("member" in kind)) return;
3179
+ const ids = idsByMember.get(kind.member) ?? [];
3180
+ ids.push(String(rows[index]?.id));
3181
+ idsByMember.set(kind.member, ids);
3182
+ });
3183
+ return [...idsByMember].map(([member, ids]) => ({
3184
+ resource: member,
3185
+ ids,
3186
+ flows: flowsByDef(app.registry.get(member)),
3187
+ list: resource
3188
+ }));
3189
+ }, [
3190
+ rowKinds,
3191
+ rows,
3144
3192
  resource,
3145
- state: rowBatchState
3146
- }), [resource, rowBatchState]);
3193
+ def,
3194
+ flowsByDef,
3195
+ app
3196
+ ]);
3197
+ const rowBatch = (0, _burojs_react.useFlowRowBatches)(batchGroups);
3198
+ const rowBatchState = rowBatch.state;
3199
+ const flowRowBatch = (0, react.useMemo)(() => ({ state: rowBatchState }), [rowBatchState]);
3200
+ const actionsWidth = (0, react.useMemo)(() => {
3201
+ if (rowKinds === void 0) return actionsColumnSize(def?.actions?.item);
3202
+ let widest = ACTIONS_COL_MIN_PX;
3203
+ for (const member of new Set(rowKinds.flatMap((kind) => "member" in kind ? [kind.member] : []))) widest = Math.max(widest, actionsColumnSize(offered(app.registry.get(member)?.actions?.item, rowOffers)));
3204
+ return widest;
3205
+ }, [
3206
+ rowKinds,
3207
+ def,
3208
+ app,
3209
+ rowOffers
3210
+ ]);
3147
3211
  const knownTotal = typeof total === "number";
3148
3212
  const totalPages = knownTotal ? Math.max(1, Math.ceil(total / pageSize)) : void 0;
3149
3213
  const pageIsFull = rows.length >= pageSize;
@@ -3391,7 +3455,7 @@ function ResourceList({ resource: resourceInput, data, total, page = 1, pageSize
3391
3455
  id: ACTIONS_COL_ID,
3392
3456
  enableSorting: false,
3393
3457
  enableResizing: false,
3394
- size: narrow || typeof rowActions === "function" ? 44 : actionsColumnSize(def?.actions?.item),
3458
+ size: narrow || typeof rowActions === "function" ? 44 : actionsWidth,
3395
3459
  enableHiding: false,
3396
3460
  header: () => (0, react_jsx_runtime.jsx)("span", {
3397
3461
  className: "sr-only",
@@ -3402,11 +3466,22 @@ function ResourceList({ resource: resourceInput, data, total, page = 1, pageSize
3402
3466
  noRowNav: true,
3403
3467
  noClip: true
3404
3468
  },
3405
- cell: ({ row }) => typeof rowActions === "function" ? rowActions(row.original) : (0, react_jsx_runtime.jsx)(ActionOverflow, {
3406
- resource,
3407
- record: row.original,
3408
- surface: "row"
3409
- })
3469
+ cell: ({ row }) => {
3470
+ if (typeof rowActions === "function") return rowActions(row.original);
3471
+ if (collectionRows === void 0) return (0, react_jsx_runtime.jsx)(ActionOverflow, {
3472
+ resource,
3473
+ record: row.original,
3474
+ surface: "row"
3475
+ });
3476
+ const kind = collectionRows(row.original);
3477
+ if (!("member" in kind)) return null;
3478
+ return (0, react_jsx_runtime.jsx)(ActionOverflow, {
3479
+ resource: kind.member,
3480
+ record: row.original,
3481
+ surface: "row",
3482
+ ...hideRowAction === void 0 ? {} : { hideActions: hideRowAction }
3483
+ });
3484
+ }
3410
3485
  });
3411
3486
  return cols;
3412
3487
  }, [
@@ -3423,6 +3498,9 @@ function ResourceList({ resource: resourceInput, data, total, page = 1, pageSize
3423
3498
  i18nCaps,
3424
3499
  rowLinkKey,
3425
3500
  narrow,
3501
+ actionsWidth,
3502
+ collectionRows,
3503
+ hideRowAction,
3426
3504
  columnUiOf
3427
3505
  ]);
3428
3506
  const handleSelectionChange = (updater) => {
@@ -3611,7 +3689,7 @@ function ResourceList({ resource: resourceInput, data, total, page = 1, pageSize
3611
3689
  value: flowRowBatch,
3612
3690
  children: (0, react_jsx_runtime.jsxs)(RowActionsCollapseContext.Provider, {
3613
3691
  value: narrow,
3614
- children: [rowBatch.reader, (0, react_jsx_runtime.jsxs)("div", {
3692
+ children: [rowBatch.readers, (0, react_jsx_runtime.jsxs)("div", {
3615
3693
  ref: listRoot,
3616
3694
  className: require_use_theme.cn("space-y-4", className),
3617
3695
  children: [
@@ -4971,10 +5049,12 @@ function BulkSummary(props) {
4971
5049
  children: (0, react_jsx_runtime.jsx)(Summary, { ...props })
4972
5050
  });
4973
5051
  }
4974
- function BulkFlowButton({ resource, actionName, ids, onSelectionChange }) {
5052
+ function BulkFlowButton({ resource, actionName, ids, records, onSelectionChange }) {
4975
5053
  const app = (0, _burojs_react.useApp)();
4976
5054
  const tid = (0, _burojs_react.useTestIds)();
4977
5055
  const t = (0, _burojs_react.useOptionalT)();
5056
+ const caps = (0, _burojs_react.useI18nCaps)();
5057
+ const gate = (0, _burojs_react.useAvailabilityGate)();
4978
5058
  const control = (0, _burojs_react.useFlowRowResolver)(resource)(actionName, void 0);
4979
5059
  const chrome = require_check_confirm_dialog.useFlowChrome(resource, actionName);
4980
5060
  const def = app.registry.get(resource);
@@ -4993,11 +5073,31 @@ function BulkFlowButton({ resource, actionName, ids, onSelectionChange }) {
4993
5073
  if (control.state === "absent") return null;
4994
5074
  const variant = chrome.destructive ? "destructive" : "outline";
4995
5075
  const overLimit = each && ids.length > _burojs_core.BULK_EACH_LIMIT;
4996
- if (overLimit || control.state === "disabled") return (0, react_jsx_runtime.jsx)(require_check_confirm_dialog.DisabledAction, {
5076
+ let membersUndecided = false;
5077
+ const selection = def === void 0 ? void 0 : (0, _burojs_react.collectionBulkState)({
5078
+ registry: app.registry,
5079
+ collection: def,
5080
+ action: actionName,
5081
+ ids,
5082
+ records: records ?? [],
5083
+ available: (member, action) => {
5084
+ const state = gate(member, action).state;
5085
+ if (state === "undecided") membersUndecided = true;
5086
+ return state === "available";
5087
+ }
5088
+ });
5089
+ const refused = membersUndecided || selection?.state !== "disabled" ? void 0 : selection.members.length > 0 ? t("collection.bulkUnavailable", {
5090
+ defaultValue: "Not available for {{types}}.",
5091
+ params: { types: selection.members.map((member) => (0, _burojs_core.resolveResourceLabel)(caps, member, "single", app.registry.get(member))).join(", ") }
5092
+ }) : t("collection.bulkUnknownRows", {
5093
+ defaultValue: "{{count}} selected records are not loaded.",
5094
+ count: selection.missing
5095
+ });
5096
+ if (overLimit || control.state === "disabled" || refused !== void 0) return (0, react_jsx_runtime.jsx)(require_check_confirm_dialog.DisabledAction, {
4997
5097
  reason: overLimit ? t("flow.bulkLimit", {
4998
5098
  defaultValue: `Select at most ${_burojs_core.BULK_EACH_LIMIT}.`,
4999
5099
  count: _burojs_core.BULK_EACH_LIMIT
5000
- }) : control.reason,
5100
+ }) : control.state === "disabled" ? control.reason : refused,
5001
5101
  label: chrome.label,
5002
5102
  icon: chrome.icon,
5003
5103
  testid,
@@ -5007,7 +5107,7 @@ function BulkFlowButton({ resource, actionName, ids, onSelectionChange }) {
5007
5107
  actionName,
5008
5108
  surface: "bulk"
5009
5109
  });
5010
- const busy = control.state === "undecided" || control.state === "pending" || running;
5110
+ const busy = control.state === "undecided" || control.state === "pending" || membersUndecided || running;
5011
5111
  const finish = (result, progress) => {
5012
5112
  setRunning(false);
5013
5113
  if (progress === void 0) return;
@@ -5069,7 +5169,8 @@ function BulkFlowButton({ resource, actionName, ids, onSelectionChange }) {
5069
5169
  label: chrome.labelText,
5070
5170
  total: summary.total,
5071
5171
  progress: summary.progress,
5072
- texts: compiled?.flow.texts
5172
+ texts: compiled?.flow.texts,
5173
+ ...compiled === void 0 ? {} : { prefixes: compiled.textKeys.prefixes }
5073
5174
  }),
5074
5175
  (0, react_jsx_runtime.jsx)(require_dialog.DialogFooter, { children: (0, react_jsx_runtime.jsx)(require_button.Button, {
5075
5176
  type: "button",
@@ -5135,6 +5236,7 @@ function BulkActionToolbar({ resource: resourceInput, table, selectedRecords, se
5135
5236
  resource,
5136
5237
  actionName: action.name,
5137
5238
  ids,
5239
+ records,
5138
5240
  onSelectionChange: (next) => {
5139
5241
  if (onSelectionChange !== void 0) onSelectionChange(next);
5140
5242
  else if (next.length === 0) handleClear();
@@ -6133,6 +6235,7 @@ function BuroPeekFrame({ slots }) {
6133
6235
  //#endregion
6134
6236
  //#region src/record/frame-context.ts
6135
6237
  const FrameChromeContext = (0, react.createContext)(null);
6238
+ const ItemActionsOffContext = (0, react.createContext)(false);
6136
6239
  function useFrameChrome() {
6137
6240
  const chrome = (0, react.useContext)(FrameChromeContext);
6138
6241
  if (chrome === null) throw new Error("[burojs] useRecordFrame() must be called inside <RecordScreen>");
@@ -6170,7 +6273,7 @@ function RecordActionsView() {
6170
6273
  const { extraActions } = useFrameChrome();
6171
6274
  const id = useFrameId();
6172
6275
  const holder = (0, _burojs_react.useScreenState)()?.inline;
6173
- if (mode === "create" || record === void 0 || id === void 0) return null;
6276
+ if ((0, react.useContext)(ItemActionsOffContext) || mode === "create" || record === void 0 || id === void 0) return null;
6174
6277
  const row = (0, _burojs_react.withRecordKeys)((0, _burojs_react.policyRecordOf)(controller) ?? record, { id });
6175
6278
  holder?.declare(inlineFlowNames(controller.screen, controller.plan));
6176
6279
  return (0, react_jsx_runtime.jsxs)("div", {
@@ -6770,8 +6873,8 @@ function declaresDisplay(field) {
6770
6873
  return field !== void 0 && (0, _burojs_core.resolveSurfaceUi)(field, "column").use !== void 0;
6771
6874
  }
6772
6875
  const NO_INITIAL_FILTERS = Object.freeze({});
6773
- const RelatedCards = (0, react.lazy)(async () => ({ default: (await Promise.resolve().then(() => require("./related-list-cards-xVvgSlu-.cjs"))).RelatedCards }));
6774
- const RelatedTimeline = (0, react.lazy)(async () => ({ default: (await Promise.resolve().then(() => require("./related-list-timeline-Dsf5WewG.cjs"))).RelatedTimeline }));
6876
+ const RelatedCards = (0, react.lazy)(async () => ({ default: (await Promise.resolve().then(() => require("./related-list-cards-BypKfm9t.cjs"))).RelatedCards }));
6877
+ const RelatedTimeline = (0, react.lazy)(async () => ({ default: (await Promise.resolve().then(() => require("./related-list-timeline-D-KClgKb.cjs"))).RelatedTimeline }));
6775
6878
  function discriminatorOptionLabel(field, value) {
6776
6879
  const text = (0, _burojs_core.fieldOptionText)(field, value);
6777
6880
  if (text !== void 0) return text;
@@ -8740,6 +8843,12 @@ Object.defineProperty(exports, "HeaderTypeNotice", {
8740
8843
  return HeaderTypeNotice;
8741
8844
  }
8742
8845
  });
8846
+ Object.defineProperty(exports, "ItemActionsOffContext", {
8847
+ enumerable: true,
8848
+ get: function() {
8849
+ return ItemActionsOffContext;
8850
+ }
8851
+ });
8743
8852
  Object.defineProperty(exports, "ListBody", {
8744
8853
  enumerable: true,
8745
8854
  get: function() {
@@ -9131,4 +9240,4 @@ Object.defineProperty(exports, "viewOf", {
9131
9240
  }
9132
9241
  });
9133
9242
 
9134
- //# sourceMappingURL=place-node-BZF5Af6x.cjs.map
9243
+ //# sourceMappingURL=place-node-C5ZmuHaN.cjs.map