@flamingo-stack/openframe-frontend-core 0.0.849 → 0.0.851

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 (140) hide show
  1. package/dist/build/export-map.json +1 -1
  2. package/dist/chat-protocol/events.d.ts +4 -1
  3. package/dist/chat-protocol/events.d.ts.map +1 -1
  4. package/dist/chat-protocol/index.cjs +90 -40
  5. package/dist/chat-protocol/nats-decoder.d.ts.map +1 -1
  6. package/dist/chat-protocol/nats-decoder.js +5 -1
  7. package/dist/chat-protocol/policy-review.d.ts +18 -0
  8. package/dist/chat-protocol/policy-review.d.ts.map +1 -0
  9. package/dist/chat-protocol/policy-review.js +55 -0
  10. package/dist/{chunk-C3P7IUTU.cjs → chunk-2NGW73T2.cjs} +5 -4
  11. package/dist/{chunk-SHQY4GOE.cjs → chunk-2WZHNMQY.cjs} +67 -67
  12. package/dist/{chunk-R5JPZ6TY.cjs → chunk-5SEJEBAB.cjs} +8 -8
  13. package/dist/{chunk-TX4NTH22.cjs → chunk-B6D4WWKD.cjs} +36 -36
  14. package/dist/{chunk-FXLROQUT.cjs → chunk-CDW6JTAQ.cjs} +442 -459
  15. package/dist/{chunk-5PIR77V5.cjs → chunk-DN227KZH.cjs} +4 -4
  16. package/dist/{chunk-MC3L525K.cjs → chunk-FGSN5UNY.cjs} +3 -3
  17. package/dist/{chunk-ZGEWT3SF.cjs → chunk-HXURNKXI.cjs} +3 -3
  18. package/dist/{chunk-FRG724DU.cjs → chunk-KRTTH3ET.cjs} +4 -4
  19. package/dist/{chunk-YJZ7R3W5.cjs → chunk-KXFIYO4O.cjs} +8 -8
  20. package/dist/{chunk-4YBS4HIO.cjs → chunk-LM7EL3UQ.cjs} +444 -27
  21. package/dist/{chunk-YYHQY3K6.cjs → chunk-NQEPLUUW.cjs} +21 -21
  22. package/dist/{chunk-KXBZCUDW.cjs → chunk-ODMZSAIY.cjs} +36 -36
  23. package/dist/{chunk-36XWCVSM.cjs → chunk-OUP7L3U5.cjs} +50 -50
  24. package/dist/{chunk-5CBI2ZYV.cjs → chunk-PJNEBSP5.cjs} +5 -5
  25. package/dist/{chunk-6AJYGXXS.cjs → chunk-PPCRLSVR.cjs} +11 -11
  26. package/dist/{chunk-SA2NNWIJ.cjs → chunk-QCSA7GIX.cjs} +17 -62
  27. package/dist/{chunk-PV2XQJ2R.cjs → chunk-SPKAXETT.cjs} +42 -42
  28. package/dist/{chunk-IKOL6NJY.cjs → chunk-U4RTWH5D.cjs} +53 -43
  29. package/dist/{chunk-IHY7E4EX.cjs → chunk-UFGPLXH6.cjs} +4 -4
  30. package/dist/{chunk-TEKN6TJ5.cjs → chunk-UQK6J3ZS.cjs} +13 -13
  31. package/dist/{chunk-S3QXLD4X.cjs → chunk-VCFQHPOO.cjs} +37 -3
  32. package/dist/{chunk-Z5UCDEKZ.cjs → chunk-VU6N3NZS.cjs} +6 -6
  33. package/dist/{chunk-ZY34R37A.cjs → chunk-VXIZCUNZ.cjs} +61 -61
  34. package/dist/{chunk-3W4ASAXN.cjs → chunk-WYROOMUZ.cjs} +2 -2
  35. package/dist/{chunk-YLETC7LP.cjs → chunk-ZEPEFKHA.cjs} +893 -973
  36. package/dist/{cloud-tenants-HKUUEUAY.cjs → cloud-tenants-XH6GV4EI.cjs} +12 -13
  37. package/dist/components/case-studies/index.cjs +24 -25
  38. package/dist/components/chat/approval-batch-message.d.ts +5 -0
  39. package/dist/components/chat/approval-batch-message.d.ts.map +1 -1
  40. package/dist/components/chat/approval-batch-message.js +36 -10
  41. package/dist/components/chat/index.cjs +8 -9
  42. package/dist/components/chat/policy-review.d.ts +27 -0
  43. package/dist/components/chat/policy-review.d.ts.map +1 -0
  44. package/dist/components/chat/policy-review.js +67 -0
  45. package/dist/components/chat/stream/message-mutations.d.ts.map +1 -1
  46. package/dist/components/chat/stream/message-mutations.js +4 -1
  47. package/dist/components/chat/tool-execution-display.d.ts.map +1 -1
  48. package/dist/components/chat/tool-execution-display.js +16 -5
  49. package/dist/components/chat/types/message.types.d.ts +40 -2
  50. package/dist/components/chat/types/message.types.d.ts.map +1 -1
  51. package/dist/components/chat/utils/extract-incomplete-message-state.d.ts.map +1 -1
  52. package/dist/components/chat/utils/extract-incomplete-message-state.js +2 -0
  53. package/dist/components/chat/utils/message-segment-accumulator.d.ts.map +1 -1
  54. package/dist/components/chat/utils/message-segment-accumulator.js +3 -0
  55. package/dist/components/chat/utils/process-historical-messages.d.ts +2 -2
  56. package/dist/components/chat/utils/process-historical-messages.d.ts.map +1 -1
  57. package/dist/components/chat/utils/process-historical-messages.js +7 -1
  58. package/dist/components/contact/index.cjs +13 -14
  59. package/dist/components/docs/index.cjs +16 -17
  60. package/dist/components/embeds/embed-viewer-frame.d.ts +2 -0
  61. package/dist/components/embeds/embed-viewer-frame.d.ts.map +1 -1
  62. package/dist/components/embeds/embed-viewer-frame.js +12 -2
  63. package/dist/components/embeds/index.cjs +13 -14
  64. package/dist/components/embeds/pdf-viewer.d.ts.map +1 -1
  65. package/dist/components/embeds/pdf-viewer.js +2 -1
  66. package/dist/components/faq/index.cjs +14 -15
  67. package/dist/components/features/approval-level.d.ts +6 -12
  68. package/dist/components/features/approval-level.d.ts.map +1 -1
  69. package/dist/components/features/approval-level.js +45 -55
  70. package/dist/components/features/index.cjs +17 -15
  71. package/dist/components/features/notifications/approval-request-notification-tile.d.ts.map +1 -1
  72. package/dist/components/features/notifications/approval-request-notification-tile.js +71 -48
  73. package/dist/components/features/notifications/types.d.ts +2 -0
  74. package/dist/components/features/notifications/types.d.ts.map +1 -1
  75. package/dist/components/features/notifications/types.js +3 -1
  76. package/dist/components/features/policy-configuration-panel.d.ts.map +1 -1
  77. package/dist/components/features/policy-configuration-panel.js +75 -64
  78. package/dist/components/features/software/index.d.ts +1 -1
  79. package/dist/components/features/software/index.d.ts.map +1 -1
  80. package/dist/components/features/software/index.js +2 -0
  81. package/dist/components/features/software/software-action-copy.d.ts.map +1 -1
  82. package/dist/components/features/software/software-action-copy.js +6 -12
  83. package/dist/components/features/software/software-action-form.d.ts +7 -1
  84. package/dist/components/features/software/software-action-form.d.ts.map +1 -1
  85. package/dist/components/features/software/software-action-form.js +11 -3
  86. package/dist/components/features/software/update-settings-fields.d.ts +12 -1
  87. package/dist/components/features/software/update-settings-fields.d.ts.map +1 -1
  88. package/dist/components/features/software/update-settings-fields.js +57 -29
  89. package/dist/components/help-center-pages/index.cjs +78 -79
  90. package/dist/components/index.cjs +58 -58
  91. package/dist/components/meeting-scheduler/index.cjs +61 -61
  92. package/dist/components/navigation/index.cjs +15 -16
  93. package/dist/components/onboarding-guides/index.cjs +14 -15
  94. package/dist/components/product-demo/index.cjs +23 -24
  95. package/dist/components/tickets/index.cjs +17 -18
  96. package/dist/components/ui/file-manager/index.cjs +8 -9
  97. package/dist/components/ui/index.cjs +16 -18
  98. package/dist/components/ui/page-actions.d.ts.map +1 -1
  99. package/dist/components/ui/page-actions.js +11 -1
  100. package/dist/components/ui/radio-group.d.ts.map +1 -1
  101. package/dist/components/ui/radio-group.js +8 -2
  102. package/dist/components/ui/tab-selector.d.ts +7 -1
  103. package/dist/components/ui/tab-selector.d.ts.map +1 -1
  104. package/dist/components/ui/tab-selector.js +22 -3
  105. package/dist/{devices-P7M4Z7VP.cjs → devices-7PT6MPJI.cjs} +13 -14
  106. package/dist/{embeddable-chat-322NDFP5.cjs → embeddable-chat-5NY76K7K.cjs} +84 -85
  107. package/dist/index.cjs +24 -24
  108. package/dist/{knowledge-TC7JLOWI.cjs → knowledge-J6N7IEVI.cjs} +13 -14
  109. package/dist/{logs-GPOYCP4B.cjs → logs-D6KQP2BX.cjs} +19 -20
  110. package/dist/{policies-ZUHOUMDD.cjs → policies-J7MCOL3C.cjs} +16 -17
  111. package/dist/{remote-session-NT4NG7EF.cjs → remote-session-PXHA5KFK.cjs} +8 -9
  112. package/dist/{scripts-FOEVDGTH.cjs → scripts-VURXIHVS.cjs} +19 -20
  113. package/dist/{software-update-XGTMNFST.cjs → software-update-6SHUBDIE.cjs} +16 -17
  114. package/dist/{tickets-board-7FLGQEHF.cjs → tickets-board-NLCN7WNX.cjs} +9 -9
  115. package/package.json +1 -1
  116. package/src/chat-protocol/events.ts +4 -1
  117. package/src/chat-protocol/nats-decoder.ts +4 -0
  118. package/src/chat-protocol/policy-review.ts +71 -0
  119. package/src/components/chat/approval-batch-message.tsx +47 -10
  120. package/src/components/chat/policy-review.tsx +90 -0
  121. package/src/components/chat/stream/message-mutations.ts +4 -0
  122. package/src/components/chat/tool-execution-display.tsx +23 -4
  123. package/src/components/chat/types/message.types.ts +42 -2
  124. package/src/components/chat/utils/extract-incomplete-message-state.ts +2 -0
  125. package/src/components/chat/utils/message-segment-accumulator.ts +3 -0
  126. package/src/components/chat/utils/process-historical-messages.ts +14 -3
  127. package/src/components/embeds/embed-viewer-frame.tsx +10 -2
  128. package/src/components/embeds/pdf-viewer.tsx +4 -1
  129. package/src/components/features/approval-level.tsx +74 -78
  130. package/src/components/features/notifications/approval-request-notification-tile.tsx +75 -50
  131. package/src/components/features/notifications/types.ts +4 -0
  132. package/src/components/features/policy-configuration-panel.tsx +100 -83
  133. package/src/components/features/software/index.ts +1 -0
  134. package/src/components/features/software/software-action-copy.ts +19 -12
  135. package/src/components/features/software/software-action-form.tsx +16 -3
  136. package/src/components/features/software/update-settings-fields.tsx +104 -32
  137. package/src/components/ui/page-actions.tsx +19 -2
  138. package/src/components/ui/radio-group.tsx +20 -2
  139. package/src/components/ui/tab-selector.tsx +26 -3
  140. package/dist/chunk-N3MBQRCQ.cjs +0 -41
@@ -60,6 +60,8 @@ export interface ApprovalToolCallMeta {
60
60
  requiresApproval?: boolean;
61
61
  approvalType?: string | null;
62
62
  toolCallArguments?: Record<string, unknown> | null;
63
+ /** The guardrail review, as the wire sends it: normalized into the batch by `approvalMetaToBatchData`. */
64
+ policyReview?: unknown;
63
65
  }
64
66
  /** Approval payload stashed in `notification.meta` for an approval-request notification. */
65
67
  export interface ApprovalNotificationMeta {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/components/features/notifications/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/components/features/notifications/types.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+ import { policyReviewField } from "../../../chat-protocol/policy-review.js";
2
3
  import { APPROVAL_STATUS } from "../../chat/types/index.js";
3
4
  const TICKET_APPROVAL_REQUEST_TYPE = "TICKET_APPROVAL_REQUEST";
4
5
  const MINGO_APPROVAL_REQUEST_TYPE = "MINGO_APPROVAL_REQUEST";
@@ -52,7 +53,8 @@ function approvalMetaToBatchData(approval) {
52
53
  toolType: tc.toolType ?? void 0,
53
54
  requiresApproval: tc.requiresApproval ?? true,
54
55
  approvalType: tc.approvalType ?? null,
55
- toolCallArguments: tc.toolCallArguments ?? null
56
+ toolCallArguments: tc.toolCallArguments ?? null,
57
+ ...policyReviewField(tc.policyReview)
56
58
  }))
57
59
  };
58
60
  }
@@ -1 +1 @@
1
- {"version":3,"file":"policy-configuration-panel.d.ts","sourceRoot":"","sources":["../../../src/components/features/policy-configuration-panel.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,KAAK,EAIV,6BAA6B,EAC9B,MAAM,yBAAyB,CAAC;AAejC,yGAAyG;AACzG,eAAO,MAAM,8CAA8C,IAAI,CAAC;AAoRhE,eAAO,MAAM,wBAAwB,EAAE,EAAE,CAAC,6BAA6B,CA+DtE,CAAC"}
1
+ {"version":3,"file":"policy-configuration-panel.d.ts","sourceRoot":"","sources":["../../../src/components/features/policy-configuration-panel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,KAAK,EAIV,6BAA6B,EAC9B,MAAM,yBAAyB,CAAC;AAmBjC,yGAAyG;AACzG,eAAO,MAAM,8CAA8C,IAAI,CAAC;AAkShE,eAAO,MAAM,wBAAwB,EAAE,EAAE,CAAC,6BAA6B,CA+DtE,CAAC"}
@@ -1,18 +1,22 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
- import { ChevronDown, Shield } from "lucide-react";
4
3
  import { useState } from "react";
5
4
  import { cn } from "../../utils/cn.js";
6
5
  import { useCollapsible } from "../chat/hooks/use-collapsible.js";
6
+ import { Chevron02DownIcon, ShieldIcon } from "../icons-v2-generated/index.js";
7
7
  import { TextLineSkeleton } from "../loading/unified-skeleton.js";
8
8
  import { ToolIcon } from "../tool-icon.js";
9
9
  import { Button } from "../ui/button/index.js";
10
- import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "../ui/dropdown-menu.js";
10
+ import {
11
+ DropdownMenu,
12
+ DropdownMenuContent,
13
+ DropdownMenuItem,
14
+ DropdownMenuSeparator,
15
+ DropdownMenuTrigger
16
+ } from "../ui/dropdown-menu.js";
11
17
  import { loadingItemProps, useLoadingScope } from "../ui/loading-scope.js";
12
- import { APPROVAL_LEVEL_META, APPROVAL_LEVELS } from "./approval-level.js";
13
- const approvalLevelOptions = APPROVAL_LEVELS.map((value) => ({ value, label: APPROVAL_LEVEL_META[value].label }));
14
- const POLICY_LEVEL_WIDTH = "w-[180px]";
15
- const CATEGORY_LEVEL_WIDTH = "w-[256px]";
18
+ import { APPROVAL_LEVEL_META, APPROVAL_LEVELS, ApprovalLevelView } from "./approval-level.js";
19
+ const CATEGORY_LEVEL_WIDTH = "w-[296px]";
16
20
  const POLICY_CONFIGURATION_PANEL_SKELETON_CATEGORIES = 4;
17
21
  const CATEGORY_HEADER_CLASS = "flex items-center gap-[var(--spacing-system-m)] border-t border-ods-border bg-ods-card py-[var(--spacing-system-s)] pl-[var(--spacing-system-m)] pr-[var(--spacing-system-xsf)] first:border-t-0";
18
22
  const ICON_TILE_SIZE_CLASS = "h-8 w-8 shrink-0 rounded-md";
@@ -22,56 +26,59 @@ const CATEGORY_LEVEL_COLUMN_CLASS = cn(
22
26
  "hidden shrink-0 px-[var(--spacing-system-sf)] py-[var(--spacing-system-xsf)] content-md:block",
23
27
  CATEGORY_LEVEL_WIDTH
24
28
  );
25
- const CHEVRON_CLASS = "h-6 w-6 text-ods-text-primary transition-transform duration-300";
26
- const getApprovalLevelLabel = (level) => APPROVAL_LEVEL_META[level]?.label ?? level;
29
+ const CHEVRON_CLASS = "!h-6 !w-6 text-ods-text-primary transition-transform duration-300";
30
+ const LevelOption = ({ level }) => {
31
+ const { label, Icon, toneClassName } = APPROVAL_LEVEL_META[level];
32
+ return /* @__PURE__ */ jsxs("span", { className: "inline-flex min-w-0 items-center gap-[var(--spacing-system-xsf)]", children: [
33
+ /* @__PURE__ */ jsx(Icon, { size: 24, className: cn("shrink-0", toneClassName), "aria-hidden": true }),
34
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: label })
35
+ ] });
36
+ };
37
+ const LEVEL_MENU_ITEM_CLASS = "p-[var(--spacing-system-sf)] text-h4 [&_svg]:size-4 md:[&_svg]:size-6";
27
38
  const ApprovalLevelDropdown = ({ value, onChange, allowClear = false, triggerClassName, contentClassName, disabled }) => /* @__PURE__ */ jsxs(DropdownMenu, { children: [
28
39
  /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, disabled, children: /* @__PURE__ */ jsx(
29
40
  Button,
30
41
  {
31
42
  variant: "outline",
32
43
  disabled,
33
- rightIcon: /* @__PURE__ */ jsx(ChevronDown, { className: "h-6 w-6 text-ods-text-secondary" }),
44
+ rightIcon: /* @__PURE__ */ jsx(Chevron02DownIcon, { className: "!h-6 !w-6 text-ods-text-secondary" }),
34
45
  className: cn(
35
- "flex h-auto items-center justify-between gap-[var(--spacing-system-xsf)] rounded-md border border-ods-border bg-ods-card !px-[var(--spacing-system-xsf)] py-[var(--spacing-system-xsf)] transition-colors !text-h6 hover:bg-ods-bg-hover",
46
+ "flex h-auto items-center justify-between gap-[var(--spacing-system-xsf)] rounded-md border border-ods-border bg-ods-card !p-[var(--spacing-system-sf)] transition-colors !text-h4 hover:bg-ods-bg-hover",
36
47
  value ? "text-ods-text-primary" : "text-ods-text-secondary",
37
48
  triggerClassName
38
49
  ),
39
- children: value ? getApprovalLevelLabel(value) : "Set Global Permission"
50
+ children: value ? /* @__PURE__ */ jsx(LevelOption, { level: value }) : "Set Global Permission"
40
51
  }
41
52
  ) }),
42
53
  /* @__PURE__ */ jsxs(DropdownMenuContent, { align: "end", className: contentClassName, children: [
43
- allowClear && /* @__PURE__ */ jsx(DropdownMenuItem, { onClick: () => onChange(void 0), className: "text-h6", children: "Clear Global Permission" }),
44
- approvalLevelOptions.map((option) => /* @__PURE__ */ jsx(DropdownMenuItem, { onClick: () => onChange(option.value), className: "text-h6", children: option.label }, option.value))
54
+ APPROVAL_LEVELS.map((level) => /* @__PURE__ */ jsx(DropdownMenuItem, { onClick: () => onChange(level), className: LEVEL_MENU_ITEM_CLASS, children: /* @__PURE__ */ jsx(LevelOption, { level }) }, level)),
55
+ allowClear && /* @__PURE__ */ jsxs(Fragment, { children: [
56
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
57
+ /* @__PURE__ */ jsx(DropdownMenuItem, { onClick: () => onChange(void 0), className: LEVEL_MENU_ITEM_CLASS, children: "Clear Global Permission" })
58
+ ] })
45
59
  ] })
46
60
  ] });
47
61
  const PolicyRow = ({ policy, categoryId, editMode, onPermissionChange }) => {
48
- const handleChange = (level) => {
49
- if (level) onPermissionChange(categoryId, policy.id, level);
50
- };
62
+ const nameId = `policy-${categoryId}-${policy.id}`;
63
+ const level = policy.approvalLevel ? /* @__PURE__ */ jsx(
64
+ ApprovalLevelView,
65
+ {
66
+ value: policy.approvalLevel,
67
+ editable: editMode,
68
+ onChange: (next) => onPermissionChange(categoryId, policy.id, next),
69
+ "aria-labelledby": nameId
70
+ }
71
+ ) : null;
51
72
  return /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-[var(--spacing-system-m)] border-b border-ods-border bg-ods-bg px-[var(--spacing-system-m)] py-[var(--spacing-system-sf)] last:border-b-0 content-md:items-center", children: [
52
- /* @__PURE__ */ jsx("div", { className: ICON_TILE_CLASS, children: /* @__PURE__ */ jsx(ToolIcon, { toolType: policy.toolName, size: 16 }) }),
73
+ /* @__PURE__ */ jsx("div", { className: cn(ICON_TILE_CLASS, "text-ods-text-secondary", editMode && "hidden content-md:flex"), children: /* @__PURE__ */ jsx(ToolIcon, { toolType: policy.toolName, size: 16 }) }),
53
74
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
54
- /* @__PURE__ */ jsx("p", { className: "truncate text-ods-text-primary text-h4", title: policy.name, children: policy.name }),
55
- /* @__PURE__ */ jsx("p", { className: "break-all text-ods-text-secondary text-h6", children: policy.commandPattern }),
56
- editMode ? /* @__PURE__ */ jsx("div", { className: "mt-[var(--spacing-system-xsf)] content-md:hidden", children: /* @__PURE__ */ jsx(
57
- ApprovalLevelDropdown,
58
- {
59
- value: policy.approvalLevel,
60
- onChange: handleChange,
61
- triggerClassName: "w-full",
62
- contentClassName: POLICY_LEVEL_WIDTH
63
- }
64
- ) }) : policy.approvalLevel ? /* @__PURE__ */ jsx("span", { className: "text-ods-text-primary text-h4 content-md:hidden", children: getApprovalLevelLabel(policy.approvalLevel) }) : null
75
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-[var(--spacing-system-sf)]", children: [
76
+ /* @__PURE__ */ jsx("div", { className: "flex min-w-0 flex-1 flex-col", children: /* @__PURE__ */ jsx("p", { id: nameId, className: "truncate text-ods-text-primary text-h4", title: policy.name, children: policy.name }) }),
77
+ editMode && /* @__PURE__ */ jsx("span", { className: "flex shrink-0 text-ods-text-secondary content-md:hidden", children: /* @__PURE__ */ jsx(ToolIcon, { toolType: policy.toolName, size: 16 }) })
78
+ ] }),
79
+ level && /* @__PURE__ */ jsx("div", { className: cn("flex content-md:hidden", editMode && "mt-[var(--spacing-system-sf)]"), children: level })
65
80
  ] }),
66
- /* @__PURE__ */ jsx("div", { className: "hidden shrink-0 content-md:block", children: editMode ? /* @__PURE__ */ jsx(
67
- ApprovalLevelDropdown,
68
- {
69
- value: policy.approvalLevel,
70
- onChange: handleChange,
71
- triggerClassName: POLICY_LEVEL_WIDTH,
72
- contentClassName: POLICY_LEVEL_WIDTH
73
- }
74
- ) : /* @__PURE__ */ jsx("div", { className: cn("px-[var(--spacing-system-sf)] py-[var(--spacing-system-xsf)]", POLICY_LEVEL_WIDTH), children: policy.approvalLevel && /* @__PURE__ */ jsx("span", { className: "text-ods-text-primary text-h4", children: getApprovalLevelLabel(policy.approvalLevel) }) }) })
81
+ level && /* @__PURE__ */ jsx("div", { className: "hidden shrink-0 items-center content-md:flex", children: level })
75
82
  ] });
76
83
  };
77
84
  const LOADING_CATEGORY = { id: "", name: "", policies: [] };
@@ -95,29 +102,22 @@ const CategorySection = ({
95
102
  "div",
96
103
  {
97
104
  ...loadingItemProps(props),
98
- className: cn(CATEGORY_HEADER_CLASS, !loading && "cursor-pointer transition-colors hover:bg-ods-bg-hover"),
105
+ className: cn(
106
+ CATEGORY_HEADER_CLASS,
107
+ !loading && "cursor-pointer transition-colors hover:bg-ods-bg-hover [&:has([data-bulk-level]:hover)]:bg-ods-card"
108
+ ),
99
109
  onClick: loading ? void 0 : () => onToggle(category.id),
100
110
  children: [
101
- /* @__PURE__ */ jsx("div", { className: ICON_TILE_CLASS, children: /* @__PURE__ */ jsx("div", { className: "text-ods-text-secondary", children: category.icon ?? /* @__PURE__ */ jsx(Shield, { className: "h-4 w-4" }) }) }),
111
+ /* @__PURE__ */ jsx("div", { className: ICON_TILE_CLASS, children: /* @__PURE__ */ jsx("div", { className: "text-ods-text-secondary", children: category.icon ?? /* @__PURE__ */ jsx(ShieldIcon, { size: 16 }) }) }),
102
112
  /* @__PURE__ */ jsxs("div", { className: CATEGORY_TEXT_CLASS, children: [
103
113
  category.name ? /* @__PURE__ */ jsx("p", { className: "truncate text-ods-text-primary text-h4", title: category.name, children: category.name }) : /* @__PURE__ */ jsx(TextLineSkeleton, { type: "h4", className: "w-40 max-w-full" }),
104
114
  loading ? /* @__PURE__ */ jsx(TextLineSkeleton, { type: "h6", className: "w-24" }) : /* @__PURE__ */ jsxs("p", { className: "text-ods-text-secondary text-h6", children: [
105
115
  category.policies.length,
106
- " Configurations"
107
- ] }),
108
- editMode && /* @__PURE__ */ jsx("div", { className: "mt-[var(--spacing-system-xsf)] content-md:hidden", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsx(
109
- ApprovalLevelDropdown,
110
- {
111
- value: bulkLevel,
112
- onChange: handleBulkChange,
113
- allowClear: true,
114
- triggerClassName: "w-full",
115
- contentClassName: CATEGORY_LEVEL_WIDTH,
116
- disabled: loading
117
- }
118
- ) })
116
+ " ",
117
+ category.policies.length === 1 ? "Configuration" : "Configurations"
118
+ ] })
119
119
  ] }),
120
- editMode ? /* @__PURE__ */ jsx("div", { className: "hidden shrink-0 content-md:block", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsx(
120
+ editMode ? /* @__PURE__ */ jsx("div", { "data-bulk-level": true, className: "hidden shrink-0 content-md:block", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsx(
121
121
  ApprovalLevelDropdown,
122
122
  {
123
123
  value: bulkLevel,
@@ -138,8 +138,12 @@ const CategorySection = ({
138
138
  e.stopPropagation();
139
139
  onToggle(category.id);
140
140
  },
141
- leftIcon: /* @__PURE__ */ jsx(ChevronDown, { className: cn(CHEVRON_CLASS, isExpanded && "rotate-180") }),
142
- className: "h-auto w-auto shrink-0 rounded-md",
141
+ leftIcon: /* @__PURE__ */ jsx(Chevron02DownIcon, { className: cn(CHEVRON_CLASS, isExpanded && "rotate-180") }),
142
+ className: cn(
143
+ "h-auto w-auto shrink-0 rounded-md !p-[var(--spacing-system-xsf)] content-md:!p-[var(--spacing-system-sf)]",
144
+ // The row is the hover; the chevron adds none of its own.
145
+ "hover:bg-transparent active:bg-transparent"
146
+ ),
143
147
  "aria-label": isExpanded ? "Collapse" : "Expand"
144
148
  }
145
149
  )
@@ -157,16 +161,23 @@ const CategorySection = ({
157
161
  visibility: isExpanded ? "visible" : "hidden"
158
162
  },
159
163
  className: isExpanded ? "opacity-100" : "opacity-0",
160
- children: /* @__PURE__ */ jsx("div", { ref: innerRef, className: "px-[var(--spacing-system-mf)] pb-[var(--spacing-system-mf)] pt-0", children: /* @__PURE__ */ jsx("div", { className: "overflow-hidden rounded-md border border-ods-border", children: (loading ? [] : category.policies).map((policy) => /* @__PURE__ */ jsx(
161
- PolicyRow,
164
+ children: /* @__PURE__ */ jsx(
165
+ "div",
162
166
  {
163
- policy,
164
- categoryId: category.id,
165
- editMode,
166
- onPermissionChange: onPolicyPermissionChange
167
- },
168
- policy.id
169
- )) }) })
167
+ ref: innerRef,
168
+ className: "border-t border-ods-border px-[var(--spacing-system-mf)] pb-[var(--spacing-system-mf)] pt-[var(--spacing-system-mf)]",
169
+ children: /* @__PURE__ */ jsx("div", { className: "overflow-hidden rounded-md border border-ods-border", children: (loading ? [] : category.policies).map((policy) => /* @__PURE__ */ jsx(
170
+ PolicyRow,
171
+ {
172
+ policy,
173
+ categoryId: category.id,
174
+ editMode,
175
+ onPermissionChange: onPolicyPermissionChange
176
+ },
177
+ policy.id
178
+ )) })
179
+ }
180
+ )
170
181
  }
171
182
  )
172
183
  ] });
@@ -5,5 +5,5 @@ export { SOFTWARE_ACTION_COPY, SOFTWARE_ACTION_DETAIL_TITLE, type SoftwareAction
5
5
  export { SoftwareActionForm, type SoftwareActionFormProps, type SoftwareActionFormValues, type SoftwareDeviceScope, type SoftwareRunMode, } from './software-action-form';
6
6
  export { newSoftwareRow, type SelectedPackage, type SoftwareRow } from './software-row';
7
7
  export { type PackageSearchSlotProps, SoftwareRowFields, type SoftwareRowFieldsProps } from './software-row-fields';
8
- export { DEFAULT_SOFTWARE_UPDATE_POLICY, DEFAULT_SOFTWARE_UPDATE_SETTINGS, SOFTWARE_UPDATE_COUNTDOWN_OPTIONS, SOFTWARE_UPDATE_DEADLINE_OPTIONS, type SoftwareUpdateMode, type SoftwareUpdatePolicy, SoftwareUpdateSettingsFields, type SoftwareUpdateSettingsFieldsProps, type SoftwareUpdateSettingsValues, } from './update-settings-fields';
8
+ export { DEFAULT_SOFTWARE_UPDATE_POLICY, DEFAULT_SOFTWARE_UPDATE_SETTINGS, defaultSoftwareUpdateSettings, SOFTWARE_UPDATE_COUNTDOWN_OPTIONS, SOFTWARE_UPDATE_DEADLINE_OPTIONS, type SoftwareUpdateMode, type SoftwareUpdatePolicy, SoftwareUpdateSettingsFields, type SoftwareUpdateSettingsFieldsProps, type SoftwareUpdateSettingsValues, } from './update-settings-fields';
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/features/software/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,GAC7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,6BAA6B,GAC9B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,sBAAsB,EACtB,KAAK,2BAA2B,EAChC,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,GAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,oBAAoB,EACpB,4BAA4B,EAC5B,KAAK,kBAAkB,EACvB,kBAAkB,EAClB,KAAK,kBAAkB,GACxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,kBAAkB,EAClB,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,eAAe,GACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACxF,OAAO,EAAE,KAAK,sBAAsB,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpH,OAAO,EACL,8BAA8B,EAC9B,gCAAgC,EAChC,iCAAiC,EACjC,gCAAgC,EAChC,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,4BAA4B,EAC5B,KAAK,iCAAiC,EACtC,KAAK,4BAA4B,GAClC,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/features/software/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,GAC7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,6BAA6B,GAC9B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,sBAAsB,EACtB,KAAK,2BAA2B,EAChC,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,GAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,oBAAoB,EACpB,4BAA4B,EAC5B,KAAK,kBAAkB,EACvB,kBAAkB,EAClB,KAAK,kBAAkB,GACxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,kBAAkB,EAClB,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,eAAe,GACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACxF,OAAO,EAAE,KAAK,sBAAsB,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpH,OAAO,EACL,8BAA8B,EAC9B,gCAAgC,EAChC,6BAA6B,EAC7B,iCAAiC,EACjC,gCAAgC,EAChC,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,4BAA4B,EAC5B,KAAK,iCAAiC,EACtC,KAAK,4BAA4B,GAClC,MAAM,0BAA0B,CAAC"}
@@ -27,6 +27,7 @@ import { SoftwareRowFields } from "./software-row-fields.js";
27
27
  import {
28
28
  DEFAULT_SOFTWARE_UPDATE_POLICY,
29
29
  DEFAULT_SOFTWARE_UPDATE_SETTINGS,
30
+ defaultSoftwareUpdateSettings,
30
31
  SOFTWARE_UPDATE_COUNTDOWN_OPTIONS,
31
32
  SOFTWARE_UPDATE_DEADLINE_OPTIONS,
32
33
  SoftwareUpdateSettingsFields
@@ -50,6 +51,7 @@ export {
50
51
  SoftwareRowFields,
51
52
  SoftwareScheduleFields,
52
53
  SoftwareUpdateSettingsFields,
54
+ defaultSoftwareUpdateSettings,
53
55
  newSoftwareRow,
54
56
  packageManagerLabel,
55
57
  softwareActionCopy
@@ -1 +1 @@
1
- {"version":3,"file":"software-action-copy.d.ts","sourceRoot":"","sources":["../../../../src/components/features/software/software-action-copy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEtD,gDAAgD;AAChD,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEtD,MAAM,WAAW,kBAAkB;IACjC,2FAA2F;IAC3F,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,8FAA8F;AAC9F,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,kBAAkB,EAAE,kBAAkB,CAuC/E,CAAC;AAEF,kHAAkH;AAClH,eAAO,MAAM,4BAA4B,4BAA4B,CAAC;AAEtE,+GAA+G;AAC/G,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAEjF"}
1
+ {"version":3,"file":"software-action-copy.d.ts","sourceRoot":"","sources":["../../../../src/components/features/software/software-action-copy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEtD,gDAAgD;AAChD,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEtD,MAAM,WAAW,kBAAkB;IACjC,2FAA2F;IAC3F,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAiBD,8FAA8F;AAC9F,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,kBAAkB,EAAE,kBAAkB,CA+B/E,CAAC;AAEF,kHAAkH;AAClH,eAAO,MAAM,4BAA4B,4BAA4B,CAAC;AAEtE,+GAA+G;AAC/G,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAEjF"}
@@ -1,4 +1,6 @@
1
1
  "use client";
2
+ const nowDescription = (noun) => `The ${noun} starts now on online devices, and on the others when they come online.`;
3
+ const scheduleDescription = (noun) => `The ${noun} runs at the scheduled time. Devices offline then get it when they come back online, within 7 days.`;
2
4
  const SOFTWARE_ACTION_COPY = {
3
5
  INSTALL: {
4
6
  verb: "Install",
@@ -6,12 +8,8 @@ const SOFTWARE_ACTION_COPY = {
6
8
  runLabel: "Run Installation",
7
9
  scheduleLabel: "Schedule Install",
8
10
  modes: [
9
- { value: "now", label: "Install Now", description: "The install starts immediately." },
10
- {
11
- value: "schedule",
12
- label: "Schedule Install",
13
- description: "The install runs automatically at the scheduled time."
14
- }
11
+ { value: "now", label: "Install Now", description: nowDescription("install") },
12
+ { value: "schedule", label: "Schedule Install", description: scheduleDescription("install") }
15
13
  ],
16
14
  started: "Installation started",
17
15
  scheduled: "Installation scheduled",
@@ -25,12 +23,8 @@ const SOFTWARE_ACTION_COPY = {
25
23
  runLabel: "Run Update",
26
24
  scheduleLabel: "Schedule Update",
27
25
  modes: [
28
- { value: "now", label: "Update Now", description: "The update starts immediately." },
29
- {
30
- value: "schedule",
31
- label: "Schedule Update",
32
- description: "The update runs automatically at the scheduled time."
33
- }
26
+ { value: "now", label: "Update Now", description: nowDescription("update") },
27
+ { value: "schedule", label: "Schedule Update", description: scheduleDescription("update") }
34
28
  ],
35
29
  started: "Update started",
36
30
  scheduled: "Update scheduled",
@@ -62,6 +62,12 @@ export interface SoftwareActionFormProps<TRef extends string = string> {
62
62
  * settings yet never shows choices that go nowhere; the host that submits `updateSettings` passes true.
63
63
  */
64
64
  showUpdateSettings?: boolean;
65
+ /**
66
+ * "Update Settings" offer Wait & notify and the countdowns, which need the devices to notify the user. Default false:
67
+ * Wait (with an optional deadline that closes the app without warning) or Force Update, opening on Force Update, and
68
+ * no countdown.
69
+ */
70
+ updateUserNotifications?: boolean;
65
71
  /** The "Device Selection" heading over the picker. Default true; a host that titles the picker itself passes false. */
66
72
  showDeviceHeading?: boolean;
67
73
  className?: string;
@@ -75,5 +81,5 @@ export interface SoftwareActionFormProps<TRef extends string = string> {
75
81
  * catalog and picking devices are the host's queries, so both are slots: the
76
82
  * product passes its data-bound field and picker, a fixture passes static ones.
77
83
  */
78
- export declare function SoftwareActionForm<TRef extends string = string>({ action, onBack, showHeader, onSubmit, submitDisabled, submitting, timing, initialValues, renderPackageSearch, renderDevicePicker, addRows, runModeLayout, showUpdateSettings, showDeviceHeading, className, }: SoftwareActionFormProps<TRef>): import("react").JSX.Element;
84
+ export declare function SoftwareActionForm<TRef extends string = string>({ action, onBack, showHeader, onSubmit, submitDisabled, submitting, timing, initialValues, renderPackageSearch, renderDevicePicker, addRows, runModeLayout, showUpdateSettings, updateUserNotifications, showDeviceHeading, className, }: SoftwareActionFormProps<TRef>): import("react").JSX.Element;
79
85
  //# sourceMappingURL=software-action-form.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"software-action-form.d.ts","sourceRoot":"","sources":["../../../../src/components/features/software/software-action-form.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAKjD,OAAO,EAA0B,KAAK,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,KAAK,sBAAsB,EAAqB,MAAM,uBAAuB,CAAC;AACvF,OAAO,EAGL,KAAK,4BAA4B,EAClC,MAAM,0BAA0B,CAAC;AAElC,qDAAqD;AACrD,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,UAAU,CAAC;AAEjD,6FAA6F;AAC7F,MAAM,WAAW,wBAAwB,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM;IACpE,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,IAAI,CAAC;IACpB,kHAAkH;IAClH,cAAc,CAAC,EAAE,4BAA4B,CAAC;CAC/C;AAED,yFAAyF;AACzF,MAAM,WAAW,mBAAmB;IAClC,4EAA4E;IAC5E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM;IACnE,MAAM,EAAE,kBAAkB,CAAC;IAC3B,gHAAgH;IAChH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4EAA4E;IAC5E,QAAQ,EAAE,CAAC,MAAM,EAAE,wBAAwB,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IAC3D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,MAAM,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACrC,uGAAuG;IACvG,aAAa,EAAE,OAAO,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,GAAG;QAAE,aAAa,EAAE,IAAI,CAAA;KAAE,CAAC;IACjF,6CAA6C;IAC7C,mBAAmB,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,SAAS,CAAC;IAClE,iEAAiE;IACjE,kBAAkB,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,SAAS,CAAC;IAC9D,qGAAqG;IACrG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,aAAa,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IACrC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,uHAAuH;IACvH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,EAAE,EAC/D,MAAM,EACN,MAAM,EACN,UAAiB,EACjB,QAAQ,EACR,cAAsB,EACtB,UAAkB,EAClB,MAAM,EACN,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,OAAc,EACd,aAAyB,EACzB,kBAA0B,EAC1B,iBAAwB,EACxB,SAAuE,GACxE,EAAE,uBAAuB,CAAC,IAAI,CAAC,+BAsH/B"}
1
+ {"version":3,"file":"software-action-form.d.ts","sourceRoot":"","sources":["../../../../src/components/features/software/software-action-form.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAKjD,OAAO,EAA0B,KAAK,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,KAAK,sBAAsB,EAAqB,MAAM,uBAAuB,CAAC;AACvF,OAAO,EAGL,KAAK,4BAA4B,EAClC,MAAM,0BAA0B,CAAC;AAElC,qDAAqD;AACrD,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,UAAU,CAAC;AAEjD,6FAA6F;AAC7F,MAAM,WAAW,wBAAwB,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM;IACpE,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,IAAI,CAAC;IACpB,kHAAkH;IAClH,cAAc,CAAC,EAAE,4BAA4B,CAAC;CAC/C;AAED,yFAAyF;AACzF,MAAM,WAAW,mBAAmB;IAClC,4EAA4E;IAC5E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM;IACnE,MAAM,EAAE,kBAAkB,CAAC;IAC3B,gHAAgH;IAChH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4EAA4E;IAC5E,QAAQ,EAAE,CAAC,MAAM,EAAE,wBAAwB,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IAC3D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,MAAM,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACrC,uGAAuG;IACvG,aAAa,EAAE,OAAO,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,GAAG;QAAE,aAAa,EAAE,IAAI,CAAA;KAAE,CAAC;IACjF,6CAA6C;IAC7C,mBAAmB,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,SAAS,CAAC;IAClE,iEAAiE;IACjE,kBAAkB,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,SAAS,CAAC;IAC9D,qGAAqG;IACrG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,aAAa,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IACrC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,uHAAuH;IACvH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,EAAE,EAC/D,MAAM,EACN,MAAM,EACN,UAAiB,EACjB,QAAQ,EACR,cAAsB,EACtB,UAAkB,EAClB,MAAM,EACN,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,OAAc,EACd,aAAyB,EACzB,kBAA0B,EAC1B,uBAA+B,EAC/B,iBAAwB,EACxB,SAAuE,GACxE,EAAE,uBAAuB,CAAC,IAAI,CAAC,+BA4H/B"}
@@ -10,7 +10,7 @@ import { SOFTWARE_ACTION_COPY } from "./software-action-copy.js";
10
10
  import { newSoftwareRow } from "./software-row.js";
11
11
  import { SoftwareRowFields } from "./software-row-fields.js";
12
12
  import {
13
- DEFAULT_SOFTWARE_UPDATE_SETTINGS,
13
+ defaultSoftwareUpdateSettings,
14
14
  SoftwareUpdateSettingsFields
15
15
  } from "./update-settings-fields.js";
16
16
  const INITIAL_ROWS = () => [newSoftwareRow("row-0")];
@@ -28,6 +28,7 @@ function SoftwareActionForm({
28
28
  addRows = true,
29
29
  runModeLayout = "stacked",
30
30
  showUpdateSettings = false,
31
+ updateUserNotifications = false,
31
32
  showDeviceHeading = true,
32
33
  className = "px-[var(--spacing-system-l)] pb-[var(--spacing-system-l)]"
33
34
  }) {
@@ -38,7 +39,7 @@ function SoftwareActionForm({
38
39
  const [time, setTime] = useState(initialValues.time ?? "");
39
40
  const [timeReference, setTimeReference] = useState(initialValues.timeReference);
40
41
  const [updateSettings, setUpdateSettings] = useState(
41
- () => initialValues.updateSettings ?? DEFAULT_SOFTWARE_UPDATE_SETTINGS
42
+ () => initialValues.updateSettings ?? defaultSoftwareUpdateSettings(updateUserNotifications)
42
43
  );
43
44
  const withUpdateSettings = action === "UPDATE" && showUpdateSettings;
44
45
  const osTypesKey = [...new Set(rows.map((row) => PACKAGE_MANAGER_OS[row.packageManager]))].sort().join(",");
@@ -128,7 +129,14 @@ function SoftwareActionForm({
128
129
  runModeField,
129
130
  scheduleFields
130
131
  ] }),
131
- withUpdateSettings && /* @__PURE__ */ jsx(SoftwareUpdateSettingsFields, { value: updateSettings, onChange: setUpdateSettings }),
132
+ withUpdateSettings && /* @__PURE__ */ jsx(
133
+ SoftwareUpdateSettingsFields,
134
+ {
135
+ value: updateSettings,
136
+ onChange: setUpdateSettings,
137
+ userNotifications: updateUserNotifications
138
+ }
139
+ ),
132
140
  showDeviceHeading && /* @__PURE__ */ jsx("h2", { className: "pt-[var(--spacing-system-l)] text-ods-text-primary text-h2", children: "Device Selection" }),
133
141
  renderDevicePicker({ osTypes: osTypesKey.split(","), osTypesKey })
134
142
  ]
@@ -30,14 +30,25 @@ export declare const SOFTWARE_UPDATE_COUNTDOWN_OPTIONS: ReadonlyArray<{
30
30
  /** Wait & notify, a countdown 7 days after the first try, 5 minutes long: what the server applies when sent none. */
31
31
  export declare const DEFAULT_SOFTWARE_UPDATE_POLICY: SoftwareUpdatePolicy;
32
32
  export declare const DEFAULT_SOFTWARE_UPDATE_SETTINGS: SoftwareUpdateSettingsValues;
33
+ /**
34
+ * What the form opens with. With user notifications, the server's own defaults. Without them, Force Update: an app is
35
+ * never closed unannounced a week later, and nobody is promised a prompt that cannot be shown.
36
+ */
37
+ export declare function defaultSoftwareUpdateSettings(userNotifications: boolean): SoftwareUpdateSettingsValues;
33
38
  export interface SoftwareUpdateSettingsFieldsProps {
34
39
  value: SoftwareUpdateSettingsValues;
35
40
  onChange: (value: SoftwareUpdateSettingsValues) => void;
41
+ /**
42
+ * The devices can notify the user: Wait & notify, its countdown after the deadline and the countdowns. Default false,
43
+ * as today, when the client has no notifications: Wait (until the user closes the app, or a deadline closes it without
44
+ * warning) or Force Update, and no countdown.
45
+ */
46
+ userNotifications?: boolean;
36
47
  }
37
48
  /**
38
49
  * Update Software's "Update Settings" (design 988:21462, the separate auto-update
39
50
  * rules 1034:8173): what happens on a device where the app is running, and
40
51
  * whether later releases are installed the same way.
41
52
  */
42
- export declare function SoftwareUpdateSettingsFields({ value, onChange }: SoftwareUpdateSettingsFieldsProps): import("react").JSX.Element;
53
+ export declare function SoftwareUpdateSettingsFields({ value, onChange, userNotifications, }: SoftwareUpdateSettingsFieldsProps): import("react").JSX.Element;
43
54
  //# sourceMappingURL=update-settings-fields.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-settings-fields.d.ts","sourceRoot":"","sources":["../../../../src/components/features/software/update-settings-fields.tsx"],"names":[],"mappings":"AAgBA,gEAAgE;AAChE,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,OAAO,CAAC;AAElD,yFAAyF;AACzF,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,kBAAkB,CAAC;IACzB,2GAA2G;IAC3G,eAAe,EAAE,OAAO,CAAC;IACzB,0EAA0E;IAC1E,eAAe,EAAE,MAAM,CAAC;IACxB,sGAAsG;IACtG,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,uGAAuG;AACvG,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,oBAAoB,CAAC;IAC7B,oGAAoG;IACpG,UAAU,EAAE,OAAO,CAAC;IACpB,qGAAqG;IACrG,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE,oBAAoB,CAAC;CACxC;AAKD,eAAO,MAAM,gCAAgC,EAAE,aAAa,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAM9F,CAAC;AAEF,eAAO,MAAM,iCAAiC,EAAE,aAAa,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAK/F,CAAC;AAEF,qHAAqH;AACrH,eAAO,MAAM,8BAA8B,EAAE,oBAK5C,CAAC;AAEF,eAAO,MAAM,gCAAgC,EAAE,4BAK9C,CAAC;AAqHF,MAAM,WAAW,iCAAiC;IAChD,KAAK,EAAE,4BAA4B,CAAC;IACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,4BAA4B,KAAK,IAAI,CAAC;CACzD;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,iCAAiC,+BAqElG"}
1
+ {"version":3,"file":"update-settings-fields.d.ts","sourceRoot":"","sources":["../../../../src/components/features/software/update-settings-fields.tsx"],"names":[],"mappings":"AAcA,gEAAgE;AAChE,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,OAAO,CAAC;AAElD,yFAAyF;AACzF,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,kBAAkB,CAAC;IACzB,2GAA2G;IAC3G,eAAe,EAAE,OAAO,CAAC;IACzB,0EAA0E;IAC1E,eAAe,EAAE,MAAM,CAAC;IACxB,sGAAsG;IACtG,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,uGAAuG;AACvG,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,oBAAoB,CAAC;IAC7B,oGAAoG;IACpG,UAAU,EAAE,OAAO,CAAC;IACpB,qGAAqG;IACrG,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE,oBAAoB,CAAC;CACxC;AAKD,eAAO,MAAM,gCAAgC,EAAE,aAAa,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAM9F,CAAC;AAEF,eAAO,MAAM,iCAAiC,EAAE,aAAa,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAK/F,CAAC;AAEF,qHAAqH;AACrH,eAAO,MAAM,8BAA8B,EAAE,oBAK5C,CAAC;AAEF,eAAO,MAAM,gCAAgC,EAAE,4BAK9C,CAAC;AASF;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,iBAAiB,EAAE,OAAO,GAAG,4BAA4B,CAGtG;AAkLD,MAAM,WAAW,iCAAiC;IAChD,KAAK,EAAE,4BAA4B,CAAC;IACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,4BAA4B,KAAK,IAAI,CAAC;IACxD;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,EAC3C,KAAK,EACL,QAAQ,EACR,iBAAyB,GAC1B,EAAE,iCAAiC,+BAwDnC"}
@@ -1,8 +1,6 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
- import { InfoCircleIcon } from "../../icons-v2-generated/index.js";
4
3
  import {
5
- Alert,
6
4
  CheckboxBlock,
7
5
  Label,
8
6
  RadioGroupBlock,
@@ -39,22 +37,57 @@ const DEFAULT_SOFTWARE_UPDATE_SETTINGS = {
39
37
  sameForAutoUpdate: true,
40
38
  autoUpdatePolicy: DEFAULT_SOFTWARE_UPDATE_POLICY
41
39
  };
42
- const MODE_OPTIONS = [
43
- {
40
+ const FORCE_UPDATE_POLICY = {
41
+ ...DEFAULT_SOFTWARE_UPDATE_POLICY,
42
+ mode: "FORCE",
43
+ deadlineEnabled: false
44
+ };
45
+ function defaultSoftwareUpdateSettings(userNotifications) {
46
+ if (userNotifications) return DEFAULT_SOFTWARE_UPDATE_SETTINGS;
47
+ return { ...DEFAULT_SOFTWARE_UPDATE_SETTINGS, policy: FORCE_UPDATE_POLICY, autoUpdatePolicy: FORCE_UPDATE_POLICY };
48
+ }
49
+ function closeDelay(countdownSeconds) {
50
+ const option = SOFTWARE_UPDATE_COUNTDOWN_OPTIONS.find((candidate) => candidate.seconds === countdownSeconds);
51
+ if (option) return option.label;
52
+ const minutes = Math.max(1, Math.round(countdownSeconds / 60));
53
+ return minutes === 1 ? "1 minute" : `${minutes} minutes`;
54
+ }
55
+ const NOTIFIED_COPY = {
56
+ wait: {
44
57
  value: "WAIT",
45
58
  label: "Wait & notify",
46
59
  description: "The user gets Update now or Ask Later. If they close the app, it updates then."
47
60
  },
48
- {
61
+ force: {
49
62
  value: "FORCE",
50
63
  label: "Force Update",
51
64
  description: "The user gets a short countdown, then the app closes and updates."
65
+ },
66
+ deadline: {
67
+ label: "Countdown after the deadline",
68
+ description: "If the update still isn\u2019t installed by the deadline, the user gets a countdown and then it installs."
52
69
  }
53
- ];
70
+ };
71
+ function silentCopy(countdownSeconds) {
72
+ const delay = closeDelay(countdownSeconds);
73
+ return {
74
+ wait: { value: "WAIT", label: "Wait", description: "The update waits until the user closes the app." },
75
+ force: {
76
+ value: "FORCE",
77
+ label: "Force Update",
78
+ description: `The app is closed without warning ${delay} later, then updated.`
79
+ },
80
+ deadline: {
81
+ label: "Close the app after a deadline",
82
+ description: `If the app is still open by the deadline, it is closed without warning ${delay} later, then updated.`
83
+ }
84
+ };
85
+ }
54
86
  const SAME_SETTINGS_DESCRIPTION = {
55
87
  WAIT: 'Auto-updates follow "If the app is running" above. Uncheck to set them separately.',
56
88
  FORCE: "Later releases will also be force-updated."
57
89
  };
90
+ const AUTO_UPDATE_DESCRIPTION = "After this update, OpenFrame installs each new version from Winget or Brew on the selected devices. Leaving it off does not turn off auto-update that is already on there.";
58
91
  const groupLabelClass = "text-h5 text-ods-text-secondary";
59
92
  function SecondsSelect({
60
93
  label,
@@ -74,11 +107,13 @@ function UpdatePolicyFields({
74
107
  name,
75
108
  label,
76
109
  policy,
110
+ userNotifications,
77
111
  onChange
78
112
  }) {
113
+ const copy = userNotifications ? NOTIFIED_COPY : silentCopy(policy.countdownSeconds);
79
114
  const waits = policy.mode === "WAIT";
80
115
  const deadline = waits && policy.deadlineEnabled;
81
- const countdown = /* @__PURE__ */ jsx(
116
+ const countdown = userNotifications && /* @__PURE__ */ jsx(
82
117
  SecondsSelect,
83
118
  {
84
119
  label: "Countdown",
@@ -98,7 +133,7 @@ function UpdatePolicyFields({
98
133
  variant: "grouped",
99
134
  value: policy.mode,
100
135
  onValueChange: (mode) => onChange({ ...policy, mode }),
101
- options: MODE_OPTIONS,
136
+ options: [copy.wait, copy.force],
102
137
  itemClassName: "py-[var(--spacing-system-sf)]"
103
138
  }
104
139
  )
@@ -110,8 +145,8 @@ function UpdatePolicyFields({
110
145
  id: `${name}-deadline`,
111
146
  checked: policy.deadlineEnabled,
112
147
  onCheckedChange: (deadlineEnabled) => onChange({ ...policy, deadlineEnabled }),
113
- label: "Countdown after the deadline",
114
- description: "If the update still isn\u2019t installed by the deadline, the user gets a countdown and then it installs."
148
+ label: copy.deadline.label,
149
+ description: copy.deadline.description
115
150
  }
116
151
  ),
117
152
  deadline && /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-[var(--spacing-system-lf)] content-md:grid-cols-3 content-md:items-start", children: [
@@ -126,10 +161,14 @@ function UpdatePolicyFields({
126
161
  ),
127
162
  countdown
128
163
  ] })
129
- ] }) : /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 gap-[var(--spacing-system-lf)] content-md:grid-cols-3", children: countdown })
164
+ ] }) : userNotifications && /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 gap-[var(--spacing-system-lf)] content-md:grid-cols-3", children: countdown })
130
165
  ] });
131
166
  }
132
- function SoftwareUpdateSettingsFields({ value, onChange }) {
167
+ function SoftwareUpdateSettingsFields({
168
+ value,
169
+ onChange,
170
+ userNotifications = false
171
+ }) {
133
172
  return /* @__PURE__ */ jsxs("section", { "aria-labelledby": "software-update-settings", className: "flex flex-col gap-[var(--spacing-system-l)]", children: [
134
173
  /* @__PURE__ */ jsx("h2", { id: "software-update-settings", className: "pt-[var(--spacing-system-l)] text-ods-text-primary text-h2", children: "Update Settings" }),
135
174
  /* @__PURE__ */ jsx(
@@ -138,6 +177,7 @@ function SoftwareUpdateSettingsFields({ value, onChange }) {
138
177
  name: "updatePolicy",
139
178
  label: "If the app is running",
140
179
  policy: value.policy,
180
+ userNotifications,
141
181
  onChange: (policy) => onChange({ ...value, policy })
142
182
  }
143
183
  ),
@@ -151,7 +191,7 @@ function SoftwareUpdateSettingsFields({ value, onChange }) {
151
191
  checked: value.autoUpdate,
152
192
  onCheckedChange: (autoUpdate) => onChange({ ...value, autoUpdate }),
153
193
  label: "Keep it auto-updated",
154
- description: "After this update, OpenFrame installs each new version from Winget or Brew on the selected devices. When off, only this update runs."
194
+ description: AUTO_UPDATE_DESCRIPTION
155
195
  }
156
196
  ),
157
197
  value.autoUpdate && /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -171,26 +211,13 @@ function SoftwareUpdateSettingsFields({ value, onChange }) {
171
211
  name: "autoUpdatePolicy",
172
212
  label: "For auto-updates",
173
213
  policy: value.autoUpdatePolicy,
214
+ userNotifications,
174
215
  onChange: (autoUpdatePolicy) => onChange({ ...value, autoUpdatePolicy })
175
216
  }
176
217
  ) })
177
218
  ] })
178
219
  ] })
179
- ] }),
180
- value.autoUpdate && /* @__PURE__ */ jsxs(
181
- Alert,
182
- {
183
- role: "note",
184
- className: "flex items-center gap-[var(--spacing-system-m)] rounded-[6px] border-ods-border bg-ods-card p-[var(--spacing-system-m)]",
185
- children: [
186
- /* @__PURE__ */ jsx("span", { className: "shrink-0 text-ods-text-secondary", children: /* @__PURE__ */ jsx(InfoCircleIcon, { size: 24, color: "currentColor" }) }),
187
- /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-[var(--spacing-system-xxs)]", children: [
188
- /* @__PURE__ */ jsx("p", { className: "text-ods-text-primary text-h3", children: "Apps installed by hand get reinstalled" }),
189
- /* @__PURE__ */ jsx("p", { className: "text-ods-text-secondary text-h6", children: "On the first update, OpenFrame reinstalls them with Winget or Brew so it can keep them updated." })
190
- ] })
191
- ]
192
- }
193
- )
220
+ ] })
194
221
  ] });
195
222
  }
196
223
  export {
@@ -198,5 +225,6 @@ export {
198
225
  DEFAULT_SOFTWARE_UPDATE_SETTINGS,
199
226
  SOFTWARE_UPDATE_COUNTDOWN_OPTIONS,
200
227
  SOFTWARE_UPDATE_DEADLINE_OPTIONS,
201
- SoftwareUpdateSettingsFields
228
+ SoftwareUpdateSettingsFields,
229
+ defaultSoftwareUpdateSettings
202
230
  };