@wildo-ai/presets-components 1.1.5 → 1.1.7

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 (189) hide show
  1. package/dist/esm/.native.tsbuildinfo +1 -0
  2. package/dist/esm/components/actions/action-bar.d.ts.map +1 -1
  3. package/dist/esm/components/actions/action-bar.js +5 -2
  4. package/dist/esm/components/actions/action-bar.js.map +1 -1
  5. package/dist/esm/components/ai-elements/chat/suggestion.d.ts.map +1 -1
  6. package/dist/esm/components/ai-elements/chat/suggestion.js +8 -1
  7. package/dist/esm/components/ai-elements/chat/suggestion.js.map +1 -1
  8. package/dist/esm/components/ai-elements/decision/approval.d.ts +108 -13
  9. package/dist/esm/components/ai-elements/decision/approval.d.ts.map +1 -1
  10. package/dist/esm/components/ai-elements/decision/approval.js +60 -10
  11. package/dist/esm/components/ai-elements/decision/approval.js.map +1 -1
  12. package/dist/esm/components/ai-elements/graph/graph-runtime.d.ts +3 -1
  13. package/dist/esm/components/ai-elements/graph/graph-runtime.d.ts.map +1 -1
  14. package/dist/esm/components/ai-elements/graph/graph-runtime.js +3 -1
  15. package/dist/esm/components/ai-elements/graph/graph-runtime.js.map +1 -1
  16. package/dist/esm/components/app/app-layout-main-container.d.ts +9 -0
  17. package/dist/esm/components/app/app-layout-main-container.d.ts.map +1 -1
  18. package/dist/esm/components/app/app-layout-main-container.js +17 -23
  19. package/dist/esm/components/app/app-layout-main-container.js.map +1 -1
  20. package/dist/esm/components/app/app-layout-main-container.labels.d.ts.map +1 -1
  21. package/dist/esm/components/app/app-layout-main-container.labels.js +27 -0
  22. package/dist/esm/components/app/app-layout-main-container.labels.js.map +1 -1
  23. package/dist/esm/components/billing/billing-plan-change-preview.d.ts.map +1 -1
  24. package/dist/esm/components/billing/billing-plan-change-preview.js +5 -2
  25. package/dist/esm/components/billing/billing-plan-change-preview.js.map +1 -1
  26. package/dist/esm/components/billing/billing-plan-change-preview.labels.d.ts.map +1 -1
  27. package/dist/esm/components/billing/billing-plan-change-preview.labels.js +3 -0
  28. package/dist/esm/components/billing/billing-plan-change-preview.labels.js.map +1 -1
  29. package/dist/esm/components/billing/billing-pricing-table.d.ts +1 -1
  30. package/dist/esm/components/billing/billing-pricing-table.d.ts.map +1 -1
  31. package/dist/esm/components/billing/billing-pricing-table.js +8 -4
  32. package/dist/esm/components/billing/billing-pricing-table.js.map +1 -1
  33. package/dist/esm/components/billing/billing-pricing-table.labels.d.ts.map +1 -1
  34. package/dist/esm/components/billing/billing-pricing-table.labels.js +7 -1
  35. package/dist/esm/components/billing/billing-pricing-table.labels.js.map +1 -1
  36. package/dist/esm/components/billing/billing-usage-dashboard.d.ts.map +1 -1
  37. package/dist/esm/components/billing/billing-usage-dashboard.js +6 -3
  38. package/dist/esm/components/billing/billing-usage-dashboard.js.map +1 -1
  39. package/dist/esm/components/billing/billing-usage-dashboard.labels.d.ts.map +1 -1
  40. package/dist/esm/components/billing/billing-usage-dashboard.labels.js +2 -1
  41. package/dist/esm/components/billing/billing-usage-dashboard.labels.js.map +1 -1
  42. package/dist/esm/components/data-display/formatters/display-field-enum.d.ts.map +1 -1
  43. package/dist/esm/components/data-display/formatters/display-field-enum.js +18 -4
  44. package/dist/esm/components/data-display/formatters/display-field-enum.js.map +1 -1
  45. package/dist/esm/components/data-display/formatters/display-field-file.d.ts.map +1 -1
  46. package/dist/esm/components/data-display/formatters/display-field-file.js +13 -14
  47. package/dist/esm/components/data-display/formatters/display-field-file.js.map +1 -1
  48. package/dist/esm/components/data-display/formatters/display-field-file.labels.d.ts.map +1 -1
  49. package/dist/esm/components/data-display/formatters/display-field-file.labels.js +1 -0
  50. package/dist/esm/components/data-display/formatters/display-field-file.labels.js.map +1 -1
  51. package/dist/esm/components/data-display/formatters/display-field-number.d.ts.map +1 -1
  52. package/dist/esm/components/data-display/formatters/display-field-number.js +6 -1
  53. package/dist/esm/components/data-display/formatters/display-field-number.js.map +1 -1
  54. package/dist/esm/components/data-display/formatters/display-field-number.labels.d.ts.map +1 -1
  55. package/dist/esm/components/data-display/formatters/display-field-number.labels.js +5 -2
  56. package/dist/esm/components/data-display/formatters/display-field-number.labels.js.map +1 -1
  57. package/dist/esm/components/data-display/formatters/display-field-string.d.ts +1 -1
  58. package/dist/esm/components/data-display/formatters/display-field-string.d.ts.map +1 -1
  59. package/dist/esm/components/data-display/formatters/display-field-string.js +51 -12
  60. package/dist/esm/components/data-display/formatters/display-field-string.js.map +1 -1
  61. package/dist/esm/components/data-display/untrusted-html-content.d.ts +55 -0
  62. package/dist/esm/components/data-display/untrusted-html-content.d.ts.map +1 -0
  63. package/dist/esm/components/data-display/untrusted-html-content.js +67 -0
  64. package/dist/esm/components/data-display/untrusted-html-content.js.map +1 -0
  65. package/dist/esm/components/form/chromes/form-primitive.labels.d.ts.map +1 -1
  66. package/dist/esm/components/form/chromes/form-primitive.labels.js +9 -0
  67. package/dist/esm/components/form/chromes/form-primitive.labels.js.map +1 -1
  68. package/dist/esm/components/form/combobox.d.ts.map +1 -1
  69. package/dist/esm/components/form/combobox.js +10 -10
  70. package/dist/esm/components/form/combobox.js.map +1 -1
  71. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.adapter.d.ts +42 -0
  72. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.adapter.d.ts.map +1 -0
  73. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.adapter.js +120 -0
  74. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.adapter.js.map +1 -0
  75. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.d.ts +16 -0
  76. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.d.ts.map +1 -0
  77. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.js +8 -0
  78. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.js.map +1 -0
  79. package/dist/esm/components/navigation/app-level/activity-bar.d.ts.map +1 -1
  80. package/dist/esm/components/navigation/app-level/activity-bar.js +2 -2
  81. package/dist/esm/components/navigation/app-level/activity-bar.js.map +1 -1
  82. package/dist/esm/components/navigation/app-level/menu-user-org.d.ts.map +1 -1
  83. package/dist/esm/components/navigation/app-level/menu-user-org.js +10 -4
  84. package/dist/esm/components/navigation/app-level/menu-user-org.js.map +1 -1
  85. package/dist/esm/components/navigation/app-level/menu-user-org.labels.d.ts.map +1 -1
  86. package/dist/esm/components/navigation/app-level/menu-user-org.labels.js +7 -0
  87. package/dist/esm/components/navigation/app-level/menu-user-org.labels.js.map +1 -1
  88. package/dist/esm/components/navigation/app-level/menubar.d.ts.map +1 -1
  89. package/dist/esm/components/navigation/app-level/menubar.js +6 -6
  90. package/dist/esm/components/navigation/app-level/menubar.js.map +1 -1
  91. package/dist/esm/components/navigation/app-level/navigation-back.d.ts.map +1 -1
  92. package/dist/esm/components/navigation/app-level/navigation-back.js +27 -9
  93. package/dist/esm/components/navigation/app-level/navigation-back.js.map +1 -1
  94. package/dist/esm/components/navigation/app-level/sidebar.js +3 -3
  95. package/dist/esm/components/navigation/app-level/sidebar.js.map +1 -1
  96. package/dist/esm/components/navigation/app-level/status-bar.js +2 -2
  97. package/dist/esm/components/navigation/app-level/status-bar.js.map +1 -1
  98. package/dist/esm/components/navigation/app-level/toolbar.d.ts.map +1 -1
  99. package/dist/esm/components/navigation/app-level/toolbar.js +2 -2
  100. package/dist/esm/components/navigation/app-level/toolbar.js.map +1 -1
  101. package/dist/esm/components/navigation/app-level/utility-panel.js +2 -2
  102. package/dist/esm/components/navigation/app-level/utility-panel.js.map +1 -1
  103. package/dist/esm/components/navigation/breadcrumb.js +1 -1
  104. package/dist/esm/components/navigation/breadcrumb.js.map +1 -1
  105. package/dist/esm/components/sections/stepper.d.ts.map +1 -1
  106. package/dist/esm/components/sections/stepper.js +5 -3
  107. package/dist/esm/components/sections/stepper.js.map +1 -1
  108. package/dist/esm/config/preset-navigation.d.ts.map +1 -1
  109. package/dist/esm/config/preset-navigation.js +23 -2
  110. package/dist/esm/config/preset-navigation.js.map +1 -1
  111. package/dist/esm/config/resources/agent-work.resource-presets.d.ts +4 -0
  112. package/dist/esm/config/resources/agent-work.resource-presets.d.ts.map +1 -0
  113. package/dist/esm/config/resources/agent-work.resource-presets.js +115 -0
  114. package/dist/esm/config/resources/agent-work.resource-presets.js.map +1 -0
  115. package/dist/esm/config/resources/api-key-rotation-window.d.ts +22 -0
  116. package/dist/esm/config/resources/api-key-rotation-window.d.ts.map +1 -0
  117. package/dist/esm/config/resources/api-key-rotation-window.js +45 -0
  118. package/dist/esm/config/resources/api-key-rotation-window.js.map +1 -0
  119. package/dist/esm/config/resources/application.resource-presets.d.ts.map +1 -1
  120. package/dist/esm/config/resources/application.resource-presets.js +147 -61
  121. package/dist/esm/config/resources/application.resource-presets.js.map +1 -1
  122. package/dist/esm/config/resources/billing.resource-presets.d.ts +4 -3
  123. package/dist/esm/config/resources/billing.resource-presets.d.ts.map +1 -1
  124. package/dist/esm/config/resources/billing.resource-presets.js +240 -111
  125. package/dist/esm/config/resources/billing.resource-presets.js.map +1 -1
  126. package/dist/esm/config/resources/conversation-threads.resource-presets.d.ts +4 -0
  127. package/dist/esm/config/resources/conversation-threads.resource-presets.d.ts.map +1 -0
  128. package/dist/esm/config/resources/conversation-threads.resource-presets.js +105 -0
  129. package/dist/esm/config/resources/conversation-threads.resource-presets.js.map +1 -0
  130. package/dist/esm/config/resources/guidance.resource-presets.d.ts.map +1 -1
  131. package/dist/esm/config/resources/guidance.resource-presets.js +18 -11
  132. package/dist/esm/config/resources/guidance.resource-presets.js.map +1 -1
  133. package/dist/esm/config/resources/identity.resource-presets.d.ts +0 -13
  134. package/dist/esm/config/resources/identity.resource-presets.d.ts.map +1 -1
  135. package/dist/esm/config/resources/identity.resource-presets.js +48 -16
  136. package/dist/esm/config/resources/identity.resource-presets.js.map +1 -1
  137. package/dist/esm/config/resources/inbound-deliveries.resource-presets.d.ts +6 -0
  138. package/dist/esm/config/resources/inbound-deliveries.resource-presets.d.ts.map +1 -0
  139. package/dist/esm/config/resources/inbound-deliveries.resource-presets.js +112 -0
  140. package/dist/esm/config/resources/inbound-deliveries.resource-presets.js.map +1 -0
  141. package/dist/esm/config/resources/inbound-email.resource-presets.d.ts +4 -0
  142. package/dist/esm/config/resources/inbound-email.resource-presets.d.ts.map +1 -0
  143. package/dist/esm/config/resources/inbound-email.resource-presets.js +182 -0
  144. package/dist/esm/config/resources/inbound-email.resource-presets.js.map +1 -0
  145. package/dist/esm/config/resources/index.d.ts.map +1 -1
  146. package/dist/esm/config/resources/index.js +9 -2
  147. package/dist/esm/config/resources/index.js.map +1 -1
  148. package/dist/esm/config/resources/legal-holds.resource-presets.d.ts +4 -0
  149. package/dist/esm/config/resources/legal-holds.resource-presets.d.ts.map +1 -0
  150. package/dist/esm/config/resources/legal-holds.resource-presets.js +76 -0
  151. package/dist/esm/config/resources/legal-holds.resource-presets.js.map +1 -0
  152. package/dist/esm/config/resources/organizations.resource-presets.d.ts.map +1 -1
  153. package/dist/esm/config/resources/organizations.resource-presets.js +139 -36
  154. package/dist/esm/config/resources/organizations.resource-presets.js.map +1 -1
  155. package/dist/esm/config/resources/resource.config.utils.d.ts +20 -0
  156. package/dist/esm/config/resources/resource.config.utils.d.ts.map +1 -1
  157. package/dist/esm/config/resources/resource.config.utils.js +20 -0
  158. package/dist/esm/config/resources/resource.config.utils.js.map +1 -1
  159. package/dist/esm/config/resources/retention-enforcement.resource-presets.d.ts +5 -0
  160. package/dist/esm/config/resources/retention-enforcement.resource-presets.d.ts.map +1 -0
  161. package/dist/esm/config/resources/retention-enforcement.resource-presets.js +74 -0
  162. package/dist/esm/config/resources/retention-enforcement.resource-presets.js.map +1 -0
  163. package/dist/esm/config/resources/security.resource-presets.d.ts +3 -1
  164. package/dist/esm/config/resources/security.resource-presets.d.ts.map +1 -1
  165. package/dist/esm/config/resources/security.resource-presets.js +563 -133
  166. package/dist/esm/config/resources/security.resource-presets.js.map +1 -1
  167. package/dist/esm/config/resources/service-providers.resource-presets.d.ts +4 -0
  168. package/dist/esm/config/resources/service-providers.resource-presets.d.ts.map +1 -0
  169. package/dist/esm/config/resources/service-providers.resource-presets.js +321 -0
  170. package/dist/esm/config/resources/service-providers.resource-presets.js.map +1 -0
  171. package/dist/esm/config/resources/webhooks.resource-presets.d.ts +4 -3
  172. package/dist/esm/config/resources/webhooks.resource-presets.d.ts.map +1 -1
  173. package/dist/esm/config/resources/webhooks.resource-presets.js +76 -25
  174. package/dist/esm/config/resources/webhooks.resource-presets.js.map +1 -1
  175. package/dist/esm/index.d.ts +1 -0
  176. package/dist/esm/index.d.ts.map +1 -1
  177. package/dist/esm/index.js +1 -0
  178. package/dist/esm/index.js.map +1 -1
  179. package/dist/esm/registration/register-common-enums.d.ts.map +1 -1
  180. package/dist/esm/registration/register-common-enums.js +15 -0
  181. package/dist/esm/registration/register-common-enums.js.map +1 -1
  182. package/dist/esm/registration/register-provider-components.d.ts.map +1 -1
  183. package/dist/esm/registration/register-provider-components.js +6 -0
  184. package/dist/esm/registration/register-provider-components.js.map +1 -1
  185. package/dist/esm/themes/dense.theme.d.ts.map +1 -1
  186. package/dist/esm/themes/dense.theme.js +22 -2
  187. package/dist/esm/themes/dense.theme.js.map +1 -1
  188. package/dist/tsconfig.build.tsbuildinfo +1 -1
  189. package/package.json +8 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbound-email.resource-presets.js","sourceRoot":"","sources":["../../../../../src/config/resources/inbound-email.resource-presets.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Receiving email (#1600) — domain setup, client mailboxes, and the messages themselves.\n *\n * - `organizationEmailDomains` (organization settings, ORG_ADMIN): a status quick-filter list of the organization's\n * domains. `claim` from the collection toolbar answers the TXT record to publish; its value is `.isEphemeral()` on\n * the claim response, so the reveal dialog shows it once and nothing can read it again. Each domain opens in the\n * companion drawer with the name the TXT record goes on and the records the provider asks to be published.\n * `verify_ownership`, `verify` and `remove` are row actions, shown only where their `enabledCondition` admits them.\n * Surfaced by the `email-domains` Settings Hub destination.\n * - `clientMailboxes` (organization settings of the CLIENT, ORG_ADMIN): the addresses on a firm's domain whose mail\n * lands in this organization, created from the toolbar and deleted per row. Surfaced by `client-mailboxes`.\n * - `inboundEmails` (read-only, ORG_MEMBER): the organization's received mail, grouped by day, each message in the\n * drawer — who sent it and how well they are known, the body, the stored attachments and the withheld ones.\n * Addressable, so an application places it in its own navigation; it is correspondence, not a setting.\n *\n * `inboundAddressTombstones` has no preset on purpose: every operation is repository-only or internal, nothing\n * renders it, and — like reply tokens — a slug of a deleted organization is not something anyone reads in the product.\n *\n * No sections, wizard steps or groups: each detail is one flat list of facts under a header carrying the status, like\n * the other delivery logs, so these resources document no structural layout slots.\n */\nimport React from 'react';\nimport type { ResourceOperationFrontendConfig, ResourceUIBehavior } from '@wildo-ai/saas-frontend-lib';\nimport {\n ActionVisibility,\n DisplayField,\n DisplayLayout,\n ResourceHeaderTitle,\n SummaryLayout,\n SummaryMeta,\n resourceUIBehavior,\n} from '@wildo-ai/saas-frontend-lib';\nimport {\n ArrayObjectItemLayout,\n BadgeSemanticVariant,\n DisplayChromeMode,\n EditChromeMode,\n EnumDisplayMode,\n ShowWhenOperator,\n StringDisplayMode,\n} from '@wildo-ai/zod-decorators';\nimport { AtSign, Globe, Inbox, MailPlus, RefreshCw, SearchCheck, Trash2 } from 'lucide-react';\nimport {\n ClientMailboxSchema,\n CoreResourceOperation as Op,\n CoreResourceType as R,\n InboundEmailSchema,\n InboundEmailStatus,\n InboundSenderAssurance,\n OrganizationEmailDomainSchema,\n OrganizationEmailDomainStatus,\n OrganizationEmailDomains_Operations,\n clientMailboxesResourceConfiguration_InitializationFactory as clientMailboxesFactory,\n inboundEmailsResourceConfiguration_InitializationFactory as inboundEmailsFactory,\n organizationEmailDomainsResourceConfiguration_InitializationFactory as emailDomainsFactory,\n} from '@wildo-ai/saas-models';\nimport { addressable, notAddressable } from './resource.config.utils';\n\nconst CHROME = {\n display: DisplayChromeMode.SETTINGS_ROW,\n summary: DisplayChromeMode.HIDDEN,\n edit: EditChromeMode.SETTINGS_ROW,\n} as const;\n\nconst hideWhenEmpty = { display: { hideWhenEmpty: true } } as const;\nconst labelledOnCard = { summaryOverride: { chromeMode: DisplayChromeMode.INLINE } } as const;\nconst machineIdentifier = { display: { displayMode: StringDisplayMode.IDENTIFIER, hideWhenEmpty: true } } as const;\n\n/** A verb on one row, shown only where its `enabledCondition` admits it. */\nconst rowAction = (iconOverride: ResourceOperationFrontendConfig['iconOverride']) =>\n notAddressable({ iconOverride, actionVisibility: ActionVisibility.WHEN_AVAILABLE });\n\n/** The record's name (the title) with its status beside it. Shared by the domain and the message. */\nfunction StatusHeader(): React.JSX.Element {\n return (\n <div className=\"flex min-w-0 flex-wrap items-center gap-field\">\n <ResourceHeaderTitle />\n <DisplayField name=\"status\" hideLabel hideDescription className=\"w-auto\" />\n </div>\n );\n}\n\n// ── organizationEmailDomains ────────────────────────────────────────────────────────────────────\n\n/*\n * What the domain is for, then what the administrator must publish: the name the ownership TXT record goes on (its\n * value was shown once, by `claim`), and the records the provider reported once ownership was proven. Then who holds\n * it and when it was last found verified. `nonceHash` is not laid out: a hash of the value helps nobody publish it.\n */\nfunction EmailDomainDisplayTemplate(): React.JSX.Element {\n return (\n <DisplayLayout>\n <DisplayField name=\"capabilities\" />\n <DisplayField name=\"ownershipChallenge.txtName\" />\n <DisplayField name=\"dnsRecords\" />\n <DisplayField name=\"providerRef\" />\n <DisplayField name=\"ownershipVerifiedAt\" />\n <DisplayField name=\"lastVerifiedAt\" />\n <DisplayField name=\"createdAt\" />\n </DisplayLayout>\n );\n}\n\n/* A domain card: the domain (the title), its status, and when it was last found verified. */\nfunction EmailDomainSummaryTemplate(): React.JSX.Element {\n return (\n <SummaryLayout>\n <SummaryMeta>\n <DisplayField name=\"status\" />\n <DisplayField name=\"lastVerifiedAt\" />\n </SummaryMeta>\n </SummaryLayout>\n );\n}\n\n// ── clientMailboxes ─────────────────────────────────────────────────────────────────────────────\n\n/* The address (the title), then the client it routes to, the domain it is on and the relationship that authorizes it. */\nfunction ClientMailboxDisplayTemplate(): React.JSX.Element {\n return (\n <DisplayLayout>\n <DisplayField name=\"clientOrganizationId\" />\n <DisplayField name=\"emailDomainId\" />\n <DisplayField name=\"serviceProviderRelationshipId\" />\n <DisplayField name=\"createdAt\" />\n </DisplayLayout>\n );\n}\n\nfunction ClientMailboxSummaryTemplate(): React.JSX.Element {\n return (\n <SummaryLayout>\n <SummaryMeta>\n <DisplayField name=\"createdAt\" />\n </SummaryMeta>\n </SummaryLayout>\n );\n}\n\n// ── inboundEmails ───────────────────────────────────────────────────────────────────────────────\n\n/*\n * One message, read in the order a reader asks it: who sent it and how well the sender is known (the channel's\n * derived assurance, then the provider's SPF / DKIM / DMARC results it rests on), who else it went to and which of\n * this organization's addresses received it, when; then what it says; then its files — the attachments that were\n * stored, and the ones withheld with the reason. A message rejected over a limit names the limit.\n *\n * The HTML body renders through `StringDisplayMode.UNTRUSTED_HTML`: a sandboxed frame that runs nothing and fetches\n * nothing, as a mail client renders received mail (a remote image would be a read receipt carrying the reader's\n * address). It is the reading surface whenever the message has an HTML part; the plain-text part shows only when it\n * does not (#1912).\n */\nfunction InboundEmailDisplayTemplate(): React.JSX.Element {\n return (\n <DisplayLayout>\n <DisplayField name=\"fromAddress\" />\n <DisplayField name=\"fromName\" />\n <DisplayField name=\"senderAssurance\" />\n <DisplayField name=\"authentication\" />\n <DisplayField name=\"to\" />\n <DisplayField name=\"cc\" />\n <DisplayField name=\"replyTo\" />\n <DisplayField name=\"receivedFor\" />\n <DisplayField name=\"routeKind\" />\n <DisplayField name=\"receivedAt\" />\n <DisplayField name=\"textBody\" />\n <DisplayField name=\"htmlBody\" />\n <DisplayField name=\"textTruncated\" />\n <DisplayField name=\"attachmentFiles\" />\n <DisplayField name=\"withheldAttachments\" />\n <DisplayField name=\"rawMimeFile\" />\n <DisplayField name=\"limitExceeded\" />\n </DisplayLayout>\n );\n}\n\n/* A message card in a list grouped by the day it was received: the subject (the title), its status, the sender, the route. */\nfunction InboundEmailSummaryTemplate(): React.JSX.Element {\n return (\n <SummaryLayout>\n <SummaryMeta>\n <DisplayField name=\"status\" />\n <DisplayField name=\"fromAddress\" />\n <DisplayField name=\"routeKind\" />\n <DisplayField name=\"receivedAt\" />\n </SummaryMeta>\n </SummaryLayout>\n );\n}\n\nexport function buildInboundEmailMainPresets(): Partial<ResourceUIBehavior> {\n return {\n [R.ORGANIZATION_EMAIL_DOMAINS]: resourceUIBehavior(emailDomainsFactory, OrganizationEmailDomainSchema, ({ schemaShape }) => ({\n icon: Globe,\n getFrontendResourceLabel: ({ currentObject }) => currentObject.domain,\n layout: {\n defaultChromeMode: CHROME,\n header: StatusHeader,\n display: EmailDomainDisplayTemplate,\n summary: EmailDomainSummaryTemplate,\n },\n fields: {\n status: schemaShape.status.enumUI({\n display: { displayMode: EnumDisplayMode.BADGE, showDescription: false },\n values: {\n [OrganizationEmailDomainStatus.OWNERSHIP_PENDING]: { color: BadgeSemanticVariant.WARNING },\n [OrganizationEmailDomainStatus.PROVIDER_PENDING]: { color: BadgeSemanticVariant.INFO },\n [OrganizationEmailDomainStatus.VERIFIED]: { color: BadgeSemanticVariant.SUCCESS },\n [OrganizationEmailDomainStatus.FAILED]: { color: BadgeSemanticVariant.DESTRUCTIVE },\n // Mail stops routing and sending on a suspended domain until its records are found again.\n [OrganizationEmailDomainStatus.SUSPENDED]: { color: BadgeSemanticVariant.DESTRUCTIVE },\n },\n }),\n // Each DNS record is a small fixed tuple (purpose, type, name, value, priority, status): one row apiece.\n dnsRecords: schemaShape.dnsRecords.arrayUI({ display: { hideWhenEmpty: true }, objectItemLayout: ArrayObjectItemLayout.ROW }),\n providerRef: schemaShape.providerRef.stringUI(machineIdentifier),\n ownershipVerifiedAt: schemaShape.ownershipVerifiedAt.dateUI(hideWhenEmpty),\n lastVerifiedAt: schemaShape.lastVerifiedAt.dateUI({ display: { hideWhenEmpty: true }, ...labelledOnCard }),\n },\n views: [\n [Op.LIST, addressable({ collectionDisplayConfig: { quickFilterField: 'status' } })],\n // Row click → the domain in the companion drawer: the TXT name and the provider's records to publish.\n [Op.READ, notAddressable()],\n // From the collection toolbar; answers the TXT record to publish, revealed once.\n [OrganizationEmailDomains_Operations.CLAIM, notAddressable({ iconOverride: Globe })],\n // Only while OWNERSHIP_PENDING.\n [OrganizationEmailDomains_Operations.VERIFY_OWNERSHIP, rowAction(SearchCheck)],\n // Once ownership is proven; the provider verifies asynchronously, so it may be asked again.\n [OrganizationEmailDomains_Operations.VERIFY, rowAction(RefreshCw)],\n [OrganizationEmailDomains_Operations.REMOVE, rowAction(Trash2)],\n ],\n })),\n\n [R.CLIENT_MAILBOXES]: resourceUIBehavior(clientMailboxesFactory, ClientMailboxSchema, ({ schemaShape }) => ({\n icon: AtSign,\n getFrontendResourceLabel: ({ currentObject }) => currentObject.address,\n layout: {\n defaultChromeMode: CHROME,\n display: ClientMailboxDisplayTemplate,\n summary: ClientMailboxSummaryTemplate,\n },\n fields: {\n // The firm owns the mailbox and its domain; the client and the relationship row are another organization's\n // records, which there is no label to resolve to from here.\n emailDomainId: schemaShape.emailDomainId.stringUI(machineIdentifier),\n serviceProviderRelationshipId: schemaShape.serviceProviderRelationshipId.stringUI(machineIdentifier),\n clientOrganizationId: schemaShape.clientOrganizationId.stringUI(machineIdentifier),\n createdAt: schemaShape.createdAt.dateUI(labelledOnCard),\n },\n views: [\n [Op.LIST, addressable()],\n [Op.READ, notAddressable()],\n // From the collection toolbar, with its three-field form.\n [Op.CREATE, notAddressable({ iconOverride: MailPlus })],\n [Op.DELETE, rowAction(Trash2)],\n ],\n })),\n\n [R.INBOUND_EMAILS]: resourceUIBehavior(inboundEmailsFactory, InboundEmailSchema, ({ schemaShape }) => ({\n icon: Inbox,\n // Named by its subject, in the sender's words; a message with none is named by who sent it.\n getFrontendResourceLabel: ({ currentObject }) => currentObject.subject || currentObject.fromAddress,\n layout: {\n defaultChromeMode: CHROME,\n header: StatusHeader,\n display: InboundEmailDisplayTemplate,\n summary: InboundEmailSummaryTemplate,\n },\n fields: {\n status: schemaShape.status.enumUI({\n display: { displayMode: EnumDisplayMode.BADGE, showDescription: false },\n values: {\n [InboundEmailStatus.AWAITING_ATTACHMENT_SCAN]: { color: BadgeSemanticVariant.INFO },\n [InboundEmailStatus.DISPATCHED]: { color: BadgeSemanticVariant.SUCCESS },\n [InboundEmailStatus.STORED_BELOW_MINIMUM]: { color: BadgeSemanticVariant.WARNING },\n [InboundEmailStatus.REJECTED_LIMIT]: { color: BadgeSemanticVariant.DESTRUCTIVE },\n },\n }),\n senderAssurance: schemaShape.senderAssurance.enumUI({\n display: { displayMode: EnumDisplayMode.BADGE, hideWhenEmpty: true },\n values: {\n [InboundSenderAssurance.UNVERIFIED]: { color: BadgeSemanticVariant.WARNING },\n [InboundSenderAssurance.SOURCE_SIGNED]: { color: BadgeSemanticVariant.INFO },\n [InboundSenderAssurance.DOMAIN_ALIGNED]: { color: BadgeSemanticVariant.INFO },\n [InboundSenderAssurance.KNOWN_CONTACT]: { color: BadgeSemanticVariant.SUCCESS },\n [InboundSenderAssurance.THREAD_TOKEN_BOUND]: { color: BadgeSemanticVariant.SUCCESS },\n },\n }),\n routeKind: schemaShape.routeKind.enumUI({ display: { displayMode: EnumDisplayMode.TEXT }, ...labelledOnCard }),\n limitExceeded: schemaShape.limitExceeded.enumUI({ display: { displayMode: EnumDisplayMode.TEXT, hideWhenEmpty: true } }),\n fromName: schemaShape.fromName.stringUI(hideWhenEmpty),\n replyTo: schemaShape.replyTo.stringUI(hideWhenEmpty),\n to: schemaShape.to.arrayUI({ display: { hideWhenEmpty: true }, objectItemLayout: ArrayObjectItemLayout.ROW }),\n cc: schemaShape.cc.arrayUI({ display: { hideWhenEmpty: true }, objectItemLayout: ArrayObjectItemLayout.ROW }),\n // The text part is the reading surface only for a message that has no HTML part.\n textBody: schemaShape.textBody\n .stringUI({ display: { displayMode: StringDisplayMode.MULTILINE, hideWhenEmpty: true } })\n .showWhen({ conditions: { field: 'htmlBody', operator: ShowWhenOperator.NOT_EXISTS } }),\n // A stranger's HTML, rendered as a mail client renders it: sandboxed, nothing runs, nothing remote loads (#1912).\n htmlBody: schemaShape.htmlBody.stringUI({ display: { displayMode: StringDisplayMode.UNTRUSTED_HTML, hideWhenEmpty: true } }),\n attachments: schemaShape.attachments.arrayUI({ display: { hideWhenEmpty: true }, objectItemLayout: ArrayObjectItemLayout.ROW }),\n withheldAttachments: schemaShape.withheldAttachments.arrayUI({ display: { hideWhenEmpty: true }, objectItemLayout: ArrayObjectItemLayout.ROW }),\n },\n views: [\n // Newest first, grouped by the day received; the status tabs separate what was dispatched from what was not.\n [Op.LIST, addressable({ collectionDisplayConfig: { quickFilterField: 'status', temporalGroupField: 'receivedAt' } })],\n // Row click → the message in the companion drawer.\n [Op.READ, notAddressable()],\n ],\n })),\n };\n}\n\nexport const inboundEmailMainPresets = buildInboundEmailMainPresets();\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/config/resources/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAatE,yEAAyE;AACzE,eAAO,MAAM,2BAA2B,EAAE,kBAQzC,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,4BAA4B,EAAE,kBAQ1C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,2BAA2B,EAAE,kBAEzC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/config/resources/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAoBtE,yEAAyE;AACzE,eAAO,MAAM,2BAA2B,EAAE,kBAczC,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,4BAA4B,EAAE,kBAU1C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,2BAA2B,EAAE,kBAEzC,CAAC"}
@@ -18,14 +18,21 @@ import { applicationAdminPresets, applicationMainPresets } from './application.r
18
18
  import { securityAdminPresets, securityMainPresets } from './security.resource-presets.js';
19
19
  import { billingAdminPresets, billingMainPresets } from './billing.resource-presets.js';
20
20
  import { webhooksAdminPresets, webhooksMainPresets } from './webhooks.resource-presets.js';
21
+ import { inboundDeliveriesAdminPresets, inboundDeliveriesMainPresets } from './inbound-deliveries.resource-presets.js';
22
+ import { retentionEnforcementAdminPresets } from './retention-enforcement.resource-presets.js';
23
+ import { serviceProvidersMainPresets } from './service-providers.resource-presets.js';
24
+ import { legalHoldsMainPresets } from './legal-holds.resource-presets.js';
25
+ import { agentWorkMainPresets } from './agent-work.resource-presets.js';
26
+ import { conversationThreadsMainPresets } from './conversation-threads.resource-presets.js';
27
+ import { inboundEmailMainPresets } from './inbound-email.resource-presets.js';
21
28
  import { guidanceAdminPresets, guidanceMainPresets, guidancePlatformPresets } from './guidance.resource-presets.js';
22
29
  function mergePresets(...partials) {
23
30
  return Object.assign({}, ...partials);
24
31
  }
25
32
  /** Complete resource frontend configuration for the main application. */
26
- export const RESOURCES_FRONTEND_MAIN_APP = mergePresets(identityMainPresets, organizationsMainPresets, applicationMainPresets, securityMainPresets, billingMainPresets, webhooksMainPresets, guidanceMainPresets);
33
+ export const RESOURCES_FRONTEND_MAIN_APP = mergePresets(identityMainPresets, organizationsMainPresets, applicationMainPresets, securityMainPresets, billingMainPresets, webhooksMainPresets, inboundDeliveriesMainPresets, serviceProvidersMainPresets, legalHoldsMainPresets, agentWorkMainPresets, conversationThreadsMainPresets, inboundEmailMainPresets, guidanceMainPresets);
27
34
  /** Complete resource frontend configuration for the admin application. */
28
- export const RESOURCES_FRONTEND_ADMIN_APP = mergePresets(identityAdminPresets, organizationsAdminPresets, applicationAdminPresets, securityAdminPresets, billingAdminPresets, webhooksAdminPresets, guidanceAdminPresets);
35
+ export const RESOURCES_FRONTEND_ADMIN_APP = mergePresets(identityAdminPresets, organizationsAdminPresets, applicationAdminPresets, securityAdminPresets, billingAdminPresets, webhooksAdminPresets, inboundDeliveriesAdminPresets, retentionEnforcementAdminPresets, guidanceAdminPresets);
29
36
  /**
30
37
  * Complete resource frontend configuration for the platform layer (companion, internal tooling).
31
38
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/config/resources/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACxF,OAAO,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AACvG,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACxF,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEjH,SAAS,YAAY,CAAC,GAAG,QAAuC;IAC9D,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAuB,CAAC;AAC9D,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,MAAM,2BAA2B,GAAuB,YAAY,CACzE,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,CACpB,CAAC;AAEF,0EAA0E;AAC1E,MAAM,CAAC,MAAM,4BAA4B,GAAuB,YAAY,CAC1E,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,CACrB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAuB,YAAY,CACzE,uBAAuB,CACxB,CAAC","sourcesContent":["/**\n * Resource frontend presets — domain-oriented aggregation\n *\n * Three application scopes:\n * - **MAIN_APP** — end-user facing, role-filtered at runtime\n * - **ADMIN_APP** — app administrator / platform operator\n * - **PLATFORM** — Wildo platform layer (companion, internal tooling, CLI)\n *\n * Each domain file exports `buildXxxMainPresets`, `buildXxxAdminPresets`, and/or\n * `buildXxxPlatformPresets` depending on where its resources belong.\n *\n * **Canonical layout + template pattern:** `billing.resource-presets.tsx` (inline arrow\n * templates, `defaultChromeMode`, `useFormTemplateContext` / `useDisplayTemplateContext`).\n */\n\nimport type { ResourceUIBehavior } from '@wildo-ai/saas-frontend-lib';\nimport { identityAdminPresets, identityMainPresets } from './identity.resource-presets';\nimport { organizationsAdminPresets, organizationsMainPresets } from './organizations.resource-presets';\nimport { applicationAdminPresets, applicationMainPresets } from './application.resource-presets';\nimport { securityAdminPresets, securityMainPresets } from './security.resource-presets';\nimport { billingAdminPresets, billingMainPresets } from './billing.resource-presets';\nimport { webhooksAdminPresets, webhooksMainPresets } from './webhooks.resource-presets';\nimport { guidanceAdminPresets, guidanceMainPresets, guidancePlatformPresets } from './guidance.resource-presets';\n\nfunction mergePresets(...partials: Partial<ResourceUIBehavior>[]): ResourceUIBehavior {\n return Object.assign({}, ...partials) as ResourceUIBehavior;\n}\n\n/** Complete resource frontend configuration for the main application. */\nexport const RESOURCES_FRONTEND_MAIN_APP: ResourceUIBehavior = mergePresets(\n identityMainPresets,\n organizationsMainPresets,\n applicationMainPresets,\n securityMainPresets,\n billingMainPresets,\n webhooksMainPresets,\n guidanceMainPresets,\n);\n\n/** Complete resource frontend configuration for the admin application. */\nexport const RESOURCES_FRONTEND_ADMIN_APP: ResourceUIBehavior = mergePresets(\n identityAdminPresets,\n organizationsAdminPresets,\n applicationAdminPresets,\n securityAdminPresets,\n billingAdminPresets,\n webhooksAdminPresets,\n guidanceAdminPresets,\n);\n\n/**\n * Complete resource frontend configuration for the platform layer (companion, internal tooling).\n *\n * ## There is deliberately no `jobExecutions` / `jobPayloadStorage` preset — decided 2026-09-08 (#469)\n *\n * One used to exist: a per-status colour map and per-field display modes for both resources. It\n * rendered nowhere and never could — every operation on both is `REPOSITORY_ONLY`, so no route and\n * no generated screen can reach them — and its existence made the absence of a job browser look\n * like an oversight rather than a decision. It was deleted rather than wired.\n *\n * So an operator does NOT get \"what happened to this job\" from inside the product. That is the\n * accepted cost. Where to look instead:\n *\n * - **A parked or dead-lettered job** is a BROKER-level concern; inspect and replay it with the\n * broker's own tooling. See the note on `QueueBackendService`.\n * - **A worker that outran its shutdown grace period** is an ORCHESTRATOR-level concern; see the\n * note on `WorkerShutdownManagerBackendService`.\n *\n * If that ever bites, the option to revisit FIRST is the middle one that was not taken: queue depth\n * in the health signal and a recorded event on a grace-period overrun, WITHOUT a job-execution read\n * surface — it catches fleet-level problems without exposing job payloads, which may carry personal\n * data. Restoring display behaviour is the last step, not the first.\n */\nexport const RESOURCES_FRONTEND_PLATFORM: ResourceUIBehavior = mergePresets(\n guidancePlatformPresets,\n);\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/config/resources/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACxF,OAAO,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AACvG,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACxF,OAAO,EAAE,6BAA6B,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACpH,OAAO,EAAE,gCAAgC,EAAE,MAAM,0CAA0C,CAAC;AAC5F,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,8BAA8B,EAAE,MAAM,yCAAyC,CAAC;AACzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEjH,SAAS,YAAY,CAAC,GAAG,QAAuC;IAC9D,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAuB,CAAC;AAC9D,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,MAAM,2BAA2B,GAAuB,YAAY,CACzE,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,4BAA4B,EAC5B,2BAA2B,EAC3B,qBAAqB,EACrB,oBAAoB,EACpB,8BAA8B,EAC9B,uBAAuB,EACvB,mBAAmB,CACpB,CAAC;AAEF,0EAA0E;AAC1E,MAAM,CAAC,MAAM,4BAA4B,GAAuB,YAAY,CAC1E,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,6BAA6B,EAC7B,gCAAgC,EAChC,oBAAoB,CACrB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAuB,YAAY,CACzE,uBAAuB,CACxB,CAAC","sourcesContent":["/**\n * Resource frontend presets — domain-oriented aggregation\n *\n * Three application scopes:\n * - **MAIN_APP** — end-user facing, role-filtered at runtime\n * - **ADMIN_APP** — app administrator / platform operator\n * - **PLATFORM** — Wildo platform layer (companion, internal tooling, CLI)\n *\n * Each domain file exports `buildXxxMainPresets`, `buildXxxAdminPresets`, and/or\n * `buildXxxPlatformPresets` depending on where its resources belong.\n *\n * **Canonical layout + template pattern:** `billing.resource-presets.tsx` (inline arrow\n * templates, `defaultChromeMode`, `useFormTemplateContext` / `useDisplayTemplateContext`).\n */\n\nimport type { ResourceUIBehavior } from '@wildo-ai/saas-frontend-lib';\nimport { identityAdminPresets, identityMainPresets } from './identity.resource-presets';\nimport { organizationsAdminPresets, organizationsMainPresets } from './organizations.resource-presets';\nimport { applicationAdminPresets, applicationMainPresets } from './application.resource-presets';\nimport { securityAdminPresets, securityMainPresets } from './security.resource-presets';\nimport { billingAdminPresets, billingMainPresets } from './billing.resource-presets';\nimport { webhooksAdminPresets, webhooksMainPresets } from './webhooks.resource-presets';\nimport { inboundDeliveriesAdminPresets, inboundDeliveriesMainPresets } from './inbound-deliveries.resource-presets';\nimport { retentionEnforcementAdminPresets } from './retention-enforcement.resource-presets';\nimport { serviceProvidersMainPresets } from './service-providers.resource-presets';\nimport { legalHoldsMainPresets } from './legal-holds.resource-presets';\nimport { agentWorkMainPresets } from './agent-work.resource-presets';\nimport { conversationThreadsMainPresets } from './conversation-threads.resource-presets';\nimport { inboundEmailMainPresets } from './inbound-email.resource-presets';\nimport { guidanceAdminPresets, guidanceMainPresets, guidancePlatformPresets } from './guidance.resource-presets';\n\nfunction mergePresets(...partials: Partial<ResourceUIBehavior>[]): ResourceUIBehavior {\n return Object.assign({}, ...partials) as ResourceUIBehavior;\n}\n\n/** Complete resource frontend configuration for the main application. */\nexport const RESOURCES_FRONTEND_MAIN_APP: ResourceUIBehavior = mergePresets(\n identityMainPresets,\n organizationsMainPresets,\n applicationMainPresets,\n securityMainPresets,\n billingMainPresets,\n webhooksMainPresets,\n inboundDeliveriesMainPresets,\n serviceProvidersMainPresets,\n legalHoldsMainPresets,\n agentWorkMainPresets,\n conversationThreadsMainPresets,\n inboundEmailMainPresets,\n guidanceMainPresets,\n);\n\n/** Complete resource frontend configuration for the admin application. */\nexport const RESOURCES_FRONTEND_ADMIN_APP: ResourceUIBehavior = mergePresets(\n identityAdminPresets,\n organizationsAdminPresets,\n applicationAdminPresets,\n securityAdminPresets,\n billingAdminPresets,\n webhooksAdminPresets,\n inboundDeliveriesAdminPresets,\n retentionEnforcementAdminPresets,\n guidanceAdminPresets,\n);\n\n/**\n * Complete resource frontend configuration for the platform layer (companion, internal tooling).\n *\n * ## There is deliberately no `jobExecutions` / `jobPayloadStorage` preset — decided 2026-09-08 (#469)\n *\n * One used to exist: a per-status colour map and per-field display modes for both resources. It\n * rendered nowhere and never could — every operation on both is `REPOSITORY_ONLY`, so no route and\n * no generated screen can reach them — and its existence made the absence of a job browser look\n * like an oversight rather than a decision. It was deleted rather than wired.\n *\n * So an operator does NOT get \"what happened to this job\" from inside the product. That is the\n * accepted cost. Where to look instead:\n *\n * - **A parked or dead-lettered job** is a BROKER-level concern; inspect and replay it with the\n * broker's own tooling. See the note on `QueueBackendService`.\n * - **A worker that outran its shutdown grace period** is an ORCHESTRATOR-level concern; see the\n * note on `WorkerShutdownManagerBackendService`.\n *\n * If that ever bites, the option to revisit FIRST is the middle one that was not taken: queue depth\n * in the health signal and a recorded event on a grace-period overrun, WITHOUT a job-execution read\n * surface — it catches fleet-level problems without exposing job payloads, which may carry personal\n * data. Restoring display behaviour is the last step, not the first.\n */\nexport const RESOURCES_FRONTEND_PLATFORM: ResourceUIBehavior = mergePresets(\n guidancePlatformPresets,\n);\n"]}
@@ -0,0 +1,4 @@
1
+ import type { ResourceUIBehavior } from '@wildo-ai/saas-frontend-lib';
2
+ export declare function buildLegalHoldsMainPresets(): Partial<ResourceUIBehavior>;
3
+ export declare const legalHoldsMainPresets: Partial<ResourceUIBehavior>;
4
+ //# sourceMappingURL=legal-holds.resource-presets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legal-holds.resource-presets.d.ts","sourceRoot":"","sources":["../../../../../src/config/resources/legal-holds.resource-presets.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAmC,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAgFvG,wBAAgB,0BAA0B,IAAI,OAAO,CAAC,kBAAkB,CAAC,CA4CxE;AAED,eAAO,MAAM,qBAAqB,6BAA+B,CAAC"}
@@ -0,0 +1,76 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ActionVisibility, CollectionDisplayMode, DisplayField, DisplayLayout, ResourceHeaderTitle, SummaryLayout, SummaryMeta, resourceUIBehavior, } from '@wildo-ai/saas-frontend-lib';
3
+ import { BadgeSemanticVariant, DisplayChromeMode, EditChromeMode, EnumDisplayMode, ForeignKeyDisplayMode } from '@wildo-ai/zod-decorators';
4
+ import { Gavel, LockOpen, ShieldAlert } from 'lucide-react';
5
+ import { CoreResourceType as R, CoreResourceOperation as Op, LegalHoldSchema, LegalHoldStatus, LegalHolds_Operations, legalHoldsResourceConfiguration_InitializationFactory as legalHoldsFactory, } from '@wildo-ai/saas-models';
6
+ import { addressable, notAddressable, ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE } from './resource.config.utils.js';
7
+ const CHROME = {
8
+ display: DisplayChromeMode.SETTINGS_ROW,
9
+ summary: DisplayChromeMode.HIDDEN,
10
+ edit: EditChromeMode.SETTINGS_ROW,
11
+ };
12
+ const hideWhenEmpty = { display: { hideWhenEmpty: true } };
13
+ /** The hold's ground (the title) and its status beside it. */
14
+ function StatusHeader() {
15
+ return (_jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-field", children: [_jsx(ResourceHeaderTitle, {}), _jsx(DisplayField, { name: "status", hideLabel: true, hideDescription: true, className: "w-auto" })] }));
16
+ }
17
+ /*
18
+ * What is held and why, then who placed it and when, then — once it happened — who released it and why. The
19
+ * selectors of the other scope kinds are empty and hide.
20
+ */
21
+ function LegalHoldDisplayTemplate() {
22
+ return (_jsxs(DisplayLayout, { children: [_jsx(DisplayField, { name: "scopeKind" }), _jsx(DisplayField, { name: "resourceType" }), _jsx(DisplayField, { name: "rowIds" }), _jsx(DisplayField, { name: "subjectUserId" }), _jsx(DisplayField, { name: "justification" }), _jsx(DisplayField, { name: "placementTier" }), _jsx(DisplayField, { name: "placedByUserId" }), _jsx(DisplayField, { name: "placedAt" }), _jsx(DisplayField, { name: "releasedByUserId" }), _jsx(DisplayField, { name: "releasedAt" }), _jsx(DisplayField, { name: "releaseReason" })] }));
23
+ }
24
+ /* A card: the ground (the title), the status, what it covers and since when. */
25
+ function LegalHoldSummaryTemplate() {
26
+ return (_jsx(SummaryLayout, { children: _jsxs(SummaryMeta, { children: [_jsx(DisplayField, { name: "status" }), _jsx(DisplayField, { name: "scopeKind" }), _jsx(DisplayField, { name: "placedAt" })] }) }));
27
+ }
28
+ /** Release shows on a row only where its `enabledCondition` admits it — an active hold of the caller's tier. */
29
+ const rowAction = (iconOverride) => notAddressable({ iconOverride, actionVisibility: ActionVisibility.WHEN_AVAILABLE });
30
+ export function buildLegalHoldsMainPresets() {
31
+ return {
32
+ [R.LEGAL_HOLDS]: resourceUIBehavior(legalHoldsFactory, LegalHoldSchema, ({ schemaShape }) => ({
33
+ icon: Gavel,
34
+ // A hold is named by its matter, in the placer's words — the one line that says which case it serves.
35
+ getFrontendResourceLabel: ({ currentObject }) => currentObject.justification || currentObject._id,
36
+ layout: {
37
+ defaultChromeMode: CHROME,
38
+ header: StatusHeader,
39
+ display: LegalHoldDisplayTemplate,
40
+ summary: LegalHoldSummaryTemplate,
41
+ },
42
+ fields: {
43
+ status: schemaShape.status.enumUI({
44
+ display: { displayMode: EnumDisplayMode.BADGE, showDescription: false },
45
+ values: {
46
+ [LegalHoldStatus.ACTIVE]: { color: BadgeSemanticVariant.WARNING },
47
+ [LegalHoldStatus.RELEASED]: { color: BadgeSemanticVariant.SECONDARY },
48
+ },
49
+ }),
50
+ resourceType: schemaShape.resourceType.stringUI(hideWhenEmpty),
51
+ rowIds: schemaShape.rowIds.arrayUI(hideWhenEmpty),
52
+ subjectUserId: schemaShape.subjectUserId.foreignKeyUI({ display: { mode: ForeignKeyDisplayMode.LABEL, hideWhenEmpty: true } }),
53
+ placedByUserId: schemaShape.placedByUserId.foreignKeyUI({ display: { mode: ForeignKeyDisplayMode.LABEL } }),
54
+ releasedByUserId: schemaShape.releasedByUserId.foreignKeyUI({ display: { mode: ForeignKeyDisplayMode.LABEL, hideWhenEmpty: true } }),
55
+ releasedAt: schemaShape.releasedAt.dateUI(hideWhenEmpty),
56
+ releaseReason: schemaShape.releaseReason.stringUI(hideWhenEmpty),
57
+ },
58
+ views: [
59
+ [Op.LIST, addressable({
60
+ collectionDisplayConfig: {
61
+ displayMode: CollectionDisplayMode.TABLE,
62
+ userSwitchableDisplayMode: true,
63
+ quickFilterField: 'status',
64
+ },
65
+ })],
66
+ [Op.READ, notAddressable()],
67
+ [Op.COUNT, notAddressable()],
68
+ [LegalHolds_Operations.PLACE, notAddressable({ iconOverride: ShieldAlert })],
69
+ // A hold has no core UPDATE, so RELEASE (update-like, with a reason form) can never have an RMM (#1812 review).
70
+ [LegalHolds_Operations.RELEASE, { ...rowAction(LockOpen), ...ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE }],
71
+ ],
72
+ })),
73
+ };
74
+ }
75
+ export const legalHoldsMainPresets = buildLegalHoldsMainPresets();
76
+ //# sourceMappingURL=legal-holds.resource-presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legal-holds.resource-presets.js","sourceRoot":"","sources":["../../../../../src/config/resources/legal-holds.resource-presets.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Legal holds (#1634) — the organization's record of preservation duties, in its settings.\n *\n * A status quick-filter list (active holds first matter; released ones are the evidence trail), each hold in the\n * companion drawer as one flat list of facts under a header carrying its status, `place` from the collection\n * toolbar and `release` as a row action that appears only where the hold is active and was placed by the\n * caller's tier. There is no form on the row: a hold is never edited, it is placed and released.\n *\n * Surfaced by the `organization-legal-holds` Settings Hub destination (ORG_OWNER). An application super-\n * administrator reaches a tenant's holds through the same screen only with a usable platform access grant.\n */\nimport React from 'react';\nimport type { ResourceOperationFrontendConfig, ResourceUIBehavior } from '@wildo-ai/saas-frontend-lib';\nimport {\n ActionVisibility,\n CollectionDisplayMode,\n DisplayField,\n DisplayLayout,\n ResourceHeaderTitle,\n SummaryLayout,\n SummaryMeta,\n resourceUIBehavior,\n} from '@wildo-ai/saas-frontend-lib';\nimport { BadgeSemanticVariant, DisplayChromeMode, EditChromeMode, EnumDisplayMode, ForeignKeyDisplayMode } from '@wildo-ai/zod-decorators';\nimport { Gavel, LockOpen, ShieldAlert } from 'lucide-react';\nimport {\n CoreResourceType as R,\n CoreResourceOperation as Op,\n LegalHoldSchema,\n LegalHoldStatus,\n LegalHolds_Operations,\n legalHoldsResourceConfiguration_InitializationFactory as legalHoldsFactory,\n} from '@wildo-ai/saas-models';\nimport { addressable, notAddressable, ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE } from './resource.config.utils';\n\nconst CHROME = {\n display: DisplayChromeMode.SETTINGS_ROW,\n summary: DisplayChromeMode.HIDDEN,\n edit: EditChromeMode.SETTINGS_ROW,\n} as const;\n\nconst hideWhenEmpty = { display: { hideWhenEmpty: true } } as const;\n\n/** The hold's ground (the title) and its status beside it. */\nfunction StatusHeader(): React.JSX.Element {\n return (\n <div className=\"flex min-w-0 flex-wrap items-center gap-field\">\n <ResourceHeaderTitle />\n <DisplayField name=\"status\" hideLabel hideDescription className=\"w-auto\" />\n </div>\n );\n}\n\n/*\n * What is held and why, then who placed it and when, then — once it happened — who released it and why. The\n * selectors of the other scope kinds are empty and hide.\n */\nfunction LegalHoldDisplayTemplate(): React.JSX.Element {\n return (\n <DisplayLayout>\n <DisplayField name=\"scopeKind\" />\n <DisplayField name=\"resourceType\" />\n <DisplayField name=\"rowIds\" />\n <DisplayField name=\"subjectUserId\" />\n <DisplayField name=\"justification\" />\n <DisplayField name=\"placementTier\" />\n <DisplayField name=\"placedByUserId\" />\n <DisplayField name=\"placedAt\" />\n <DisplayField name=\"releasedByUserId\" />\n <DisplayField name=\"releasedAt\" />\n <DisplayField name=\"releaseReason\" />\n </DisplayLayout>\n );\n}\n\n/* A card: the ground (the title), the status, what it covers and since when. */\nfunction LegalHoldSummaryTemplate(): React.JSX.Element {\n return (\n <SummaryLayout>\n <SummaryMeta>\n <DisplayField name=\"status\" />\n <DisplayField name=\"scopeKind\" />\n <DisplayField name=\"placedAt\" />\n </SummaryMeta>\n </SummaryLayout>\n );\n}\n\n/** Release shows on a row only where its `enabledCondition` admits it — an active hold of the caller's tier. */\nconst rowAction = (iconOverride: ResourceOperationFrontendConfig['iconOverride']) =>\n notAddressable({ iconOverride, actionVisibility: ActionVisibility.WHEN_AVAILABLE });\n\nexport function buildLegalHoldsMainPresets(): Partial<ResourceUIBehavior> {\n return {\n [R.LEGAL_HOLDS]: resourceUIBehavior(legalHoldsFactory, LegalHoldSchema, ({ schemaShape }) => ({\n icon: Gavel,\n // A hold is named by its matter, in the placer's words — the one line that says which case it serves.\n getFrontendResourceLabel: ({ currentObject }) => currentObject.justification || currentObject._id,\n layout: {\n defaultChromeMode: CHROME,\n header: StatusHeader,\n display: LegalHoldDisplayTemplate,\n summary: LegalHoldSummaryTemplate,\n },\n fields: {\n status: schemaShape.status.enumUI({\n display: { displayMode: EnumDisplayMode.BADGE, showDescription: false },\n values: {\n [LegalHoldStatus.ACTIVE]: { color: BadgeSemanticVariant.WARNING },\n [LegalHoldStatus.RELEASED]: { color: BadgeSemanticVariant.SECONDARY },\n },\n }),\n resourceType: schemaShape.resourceType.stringUI(hideWhenEmpty),\n rowIds: schemaShape.rowIds.arrayUI(hideWhenEmpty),\n subjectUserId: schemaShape.subjectUserId.foreignKeyUI({ display: { mode: ForeignKeyDisplayMode.LABEL, hideWhenEmpty: true } }),\n placedByUserId: schemaShape.placedByUserId.foreignKeyUI({ display: { mode: ForeignKeyDisplayMode.LABEL } }),\n releasedByUserId: schemaShape.releasedByUserId.foreignKeyUI({ display: { mode: ForeignKeyDisplayMode.LABEL, hideWhenEmpty: true } }),\n releasedAt: schemaShape.releasedAt.dateUI(hideWhenEmpty),\n releaseReason: schemaShape.releaseReason.stringUI(hideWhenEmpty),\n },\n views: [\n [Op.LIST, addressable({\n collectionDisplayConfig: {\n displayMode: CollectionDisplayMode.TABLE,\n userSwitchableDisplayMode: true,\n quickFilterField: 'status',\n },\n })],\n [Op.READ, notAddressable()],\n [Op.COUNT, notAddressable()],\n [LegalHolds_Operations.PLACE, notAddressable({ iconOverride: ShieldAlert })],\n // A hold has no core UPDATE, so RELEASE (update-like, with a reason form) can never have an RMM (#1812 review).\n [LegalHolds_Operations.RELEASE, { ...rowAction(LockOpen), ...ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE }],\n ],\n })),\n };\n}\n\nexport const legalHoldsMainPresets = buildLegalHoldsMainPresets();\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"organizations.resource-presets.d.ts","sourceRoot":"","sources":["../../../../../src/config/resources/organizations.resource-presets.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAmC,MAAM,6BAA6B,CAAC;AAiIvG,wBAAgB,6BAA6B,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAilB3E;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkC7G;AAED,eAAO,MAAM,wBAAwB,6BAAkC,CAAC;AACxE,eAAO,MAAM,yBAAyB,6BAA2D,CAAC;AAElG,eAAO,MAAM,sCAAsC,gGAA6C,CAAC;AACjG,eAAO,MAAM,uCAAuC,gGAA8C,CAAC;AACnG,eAAO,MAAM,uCAAuC,gGAAkD,CAAC;AACvG,eAAO,MAAM,yCAAyC,gGAAoD,CAAC;AAC3G,eAAO,MAAM,0CAA0C,gGAAqD,CAAC;AAC7G,eAAO,MAAM,+CAA+C,gGAA0D,CAAC;AACvH,eAAO,MAAM,6CAA6C,gGAAwD,CAAC;AACnH,eAAO,MAAM,0CAA0C,gGAAqD,CAAC;AAC7G,eAAO,MAAM,2CAA2C,gGAAsD,CAAC"}
1
+ {"version":3,"file":"organizations.resource-presets.d.ts","sourceRoot":"","sources":["../../../../../src/config/resources/organizations.resource-presets.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAmC,MAAM,6BAA6B,CAAC;AAoIvG,wBAAgB,6BAA6B,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAmrB3E;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAsC7G;AAED,eAAO,MAAM,wBAAwB,6BAAkC,CAAC;AACxE,eAAO,MAAM,yBAAyB,6BAA2D,CAAC;AAElG,eAAO,MAAM,sCAAsC,gGAA6C,CAAC;AACjG,eAAO,MAAM,uCAAuC,gGAA8C,CAAC;AACnG,eAAO,MAAM,uCAAuC,gGAAkD,CAAC;AACvG,eAAO,MAAM,yCAAyC,gGAAoD,CAAC;AAC3G,eAAO,MAAM,0CAA0C,gGAAqD,CAAC;AAC7G,eAAO,MAAM,+CAA+C,gGAA0D,CAAC;AACvH,eAAO,MAAM,6CAA6C,gGAAwD,CAAC;AACnH,eAAO,MAAM,0CAA0C,gGAAqD,CAAC;AAC7G,eAAO,MAAM,2CAA2C,gGAAsD,CAAC"}
@@ -1,9 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { resourceUIBehavior, resourceUIBehaviorFrom, StandardIconReference, ActionVisibility, useApplication, ResourceLayoutInlineEditDefault, CollectionDisplayMode, } from '@wildo-ai/saas-frontend-lib';
3
- import { DisplayField, DisplayLayout, FormField, FormLayout, ObjectScope, RelatedResourceSections, Section, SummaryLayout, SummaryFlow, SummaryMeta, SummaryTitle, } from '@wildo-ai/saas-frontend-lib';
3
+ import { DisplayField, DisplayLayout, FormField, FormLayout, ObjectScope, RelatedResourceSections, ResourceHeaderTitle, Section, SummaryLayout, SummaryFlow, SummaryMeta, SummaryTitle, } from '@wildo-ai/saas-frontend-lib';
4
4
  import { BadgeSemanticVariant, DisplayChromeMode, EditChromeMode, EnumDisplayMode, SectionMode } from '@wildo-ai/zod-decorators';
5
- import { Archive, ArchiveRestore, Ban, CirclePause, GitBranch, Landmark, Move, Paintbrush, Power, RotateCcw, Send, ToggleLeft, ToggleRight, Trash2, UserPlus, } from 'lucide-react';
6
- import { CoreResourceType as R, CoreResourceOperation as Op, ExternalIdentitySource, OrganizationStatus, OrganizationMemberStatus, OrganizationUnit_Operations, OrganizationMembers_Operations, OrganizationProfile_Operations, Organization_Lifecycle_Operations, OrganizationFeatures_Operations, organizationResourceConfiguration_InitializationFactory as orgFactory, organizationUnitResourceConfiguration_InitializationFactory as orgUnitFactory, organizationMembersResourceConfiguration_InitializationFactory as orgMembersFactory, organizationProfileResourceConfiguration_InitializationFactory as orgProfileFactory, organizationNotificationsResourceConfiguration_InitializationFactory as orgNotificationsFactory, organizationPreferencesResourceConfiguration_InitializationFactory as orgPreferencesFactory, organizationFeaturesResourceConfiguration_InitializationFactory as orgFeaturesFactory, OrganizationSchema, OrganizationUnitSchema, OrganizationMemberSchema, OrganizationProfileSchema, OrganizationNotificationsSchema, OrganizationPreferencesSchema, ScopeFeaturesWithOverridesSchema, } from '@wildo-ai/saas-models';
5
+ import { Archive, ArchiveRestore, BadgeCheck, Ban, CirclePause, GitBranch, Landmark, Move, Paintbrush, Power, RotateCcw, Send, ToggleLeft, ToggleRight, Trash2, UserPlus, } from 'lucide-react';
6
+ import { CoreResourceType as R, CoreResourceOperation as Op, ExternalIdentitySource, OrganizationStatus, OrganizationMemberStatus, OrganizationUnitStatus, OrganizationUnit_Operations, OrganizationMembers_Operations, OrganizationProfile_Operations, Organization_Lifecycle_Operations, OrganizationFeatures_Operations, organizationResourceConfiguration_InitializationFactory as orgFactory, organizationUnitResourceConfiguration_InitializationFactory as orgUnitFactory, organizationMembersResourceConfiguration_InitializationFactory as orgMembersFactory, organizationProfileResourceConfiguration_InitializationFactory as orgProfileFactory, organizationNotificationsResourceConfiguration_InitializationFactory as orgNotificationsFactory, organizationPreferencesResourceConfiguration_InitializationFactory as orgPreferencesFactory, organizationFeaturesResourceConfiguration_InitializationFactory as orgFeaturesFactory, OrganizationSchema, OrganizationUnitSchema, OrganizationMemberSchema, OrganizationProfileSchema, OrganizationNotificationsSchema, OrganizationPreferencesSchema, ScopeFeaturesWithOverridesSchema, } from '@wildo-ai/saas-models';
7
7
  import { addressable, notAddressable, apiOnly } from './resource.config.utils.js';
8
8
  /**
9
9
  * Organizations — Resource frontend presets
@@ -67,15 +67,16 @@ export function buildOrganizationsMainPresets() {
67
67
  [R.ORGANIZATIONS]: resourceUIBehavior(orgFactory, OrganizationSchema, ({ schema, schemaShape, opsVariantResolver }) => ({
68
68
  icon: StandardIconReference.ORGANIZATION,
69
69
  layout: {
70
- // NO section refs on the display side. The pane is one flat list of rows, so it names no
71
- // slot: a `<Section>` is a THREE-PLACE obligation — the JSX name, this manifest, and a
72
- // documented slot in the resource specification — and what it buys is a heading. "Overview"
73
- // over the only group on a page is a heading that says nothing the page does not.
74
- // `overview` survives for the EDIT form, which still groups.
75
- refs: { sections: ['overview'] },
70
+ // NO section refs, on either surface. A `<Section>` is a THREE-PLACE obligation — the JSX
71
+ // name, this manifest, and a documented slot in the resource specification — and what it
72
+ // buys is a heading. The read pane is one flat list of rows, and the edit form holds two
73
+ // writable fields (`name`, `slug`: `status` and `type` are `excludeFromUpdate`), so an
74
+ // "Overview" card over either was a heading over the only group on the page.
75
+ refs: { sections: [] },
76
76
  // Settings-page chrome: shown in the Settings Hub (General). Read + edit render as
77
- // label-left / value-right rows; the list/summary stays compact.
78
- defaultChromeMode: { display: DisplayChromeMode.SETTINGS_ROW, summary: DisplayChromeMode.INLINE, edit: EditChromeMode.SETTINGS_ROW },
77
+ // label-left / value-right rows. A card (the admin directory, a reference popover) shows
78
+ // bare values: the status badge and the type say what they are without a label.
79
+ defaultChromeMode: { display: DisplayChromeMode.SETTINGS_ROW, summary: DisplayChromeMode.HIDDEN, edit: EditChromeMode.SETTINGS_ROW },
79
80
  // Organization general settings. A settings pane is a list of decisions an operator came to TAKE, so its
80
81
  // writable fields are offered in place rather than behind a whole-pane edit mode. The set is
81
82
  // DERIVED (not primary key, not excludeFromUpdate, not hidden, not opted out), so a field
@@ -87,9 +88,21 @@ export function buildOrganizationsMainPresets() {
87
88
  // on a settings row, which is read one at a time to decide something, it is an answer that
88
89
  // refuses to answer.
89
90
  defaultEmptyValue: 'placeholder',
90
- display: () => (_jsxs(DisplayLayout, { children: [_jsx(DisplayField, { name: "slug" }), _jsx(DisplayField, { name: "status" }), _jsx(DisplayField, { name: "type" }), _jsx(DisplayField, { name: "createdAt" }), _jsx(RelatedResourceSections, { config: { mode: SectionMode.TABS }, targets: [] })] })),
91
- summary: () => (_jsxs(SummaryLayout, { children: [_jsx(SummaryTitle, { name: "name" }), _jsxs(SummaryMeta, { children: [_jsx(DisplayField, { name: "slug" }), _jsx(DisplayField, { name: "status" }), _jsx(DisplayField, { name: "type" }), _jsx(DisplayField, { name: "createdAt" })] })] })),
92
- edit: () => (_jsx(FormLayout, { children: _jsxs(Section, { name: "overview", appearance: SectionMode.CARD, children: [_jsx(FormField, { name: "name" }), _jsx(FormField, { name: "slug" }), _jsx(FormField, { name: "status" }), _jsx(DeclaredOrganizationTypeFormField, {})] }) })),
91
+ // The identity line: the organization's name, and its status beside it — the one fact about
92
+ // a tenant a reader needs before anything else (a suspended or marked tenant reads
93
+ // differently from a live one). Neither is repeated in the body.
94
+ header: () => (_jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-field", children: [_jsx(ResourceHeaderTitle, {}), _jsx(DisplayField, { name: "status", hideLabel: true, hideDescription: true, className: "w-auto" })] })),
95
+ display: () => (_jsxs(DisplayLayout, { children: [_jsx(DisplayField, { name: "slug" }), _jsx(DisplayField, { name: "type" }), _jsx(DisplayField, { name: "createdAt" }), _jsx(RelatedResourceSections, { config: { mode: SectionMode.TABS }, targets: [] })] })),
96
+ // The card names the organization and says what state it is in and what kind it is — the two
97
+ // facts that tell one tenant from another in a directory. The slug restates the name in URL
98
+ // form, and the creation date answers a question nobody scanning a directory is asking; both
99
+ // stay on the read pane.
100
+ summary: () => (_jsxs(SummaryLayout, { children: [_jsx(SummaryTitle, { name: "name" }), _jsxs(SummaryMeta, { children: [_jsx(DisplayField, { name: "status" }), _jsx(DisplayField, { name: "type" })] })] })),
101
+ // No section: see `refs`. `name` first and focused — it is the field an administrator opens
102
+ // this form to change. `status` and the declared type are creation-time inputs (the admin
103
+ // CREATE form); both are `excludeFromUpdate`, so the edit form skips them and asks for the
104
+ // name and slug alone.
105
+ edit: () => (_jsxs(FormLayout, { children: [_jsx(FormField, { name: "name", autoFocus: true }), _jsx(FormField, { name: "slug" }), _jsx(FormField, { name: "status" }), _jsx(DeclaredOrganizationTypeFormField, {})] })),
93
106
  },
94
107
  fields: {
95
108
  status: schemaShape.status.enumUI({
@@ -128,19 +141,61 @@ export function buildOrganizationsMainPresets() {
128
141
  icon: GitBranch,
129
142
  getFrontendResourceLabel: ({ currentObject }) => currentObject.name,
130
143
  layout: {
131
- refs: { sections: ['identity', 'hierarchy'] },
132
- display: () => (_jsxs(DisplayLayout, { children: [_jsxs(Section, { name: "identity", appearance: SectionMode.CARD, children: [_jsx(DisplayField, { name: "name" }), _jsx(DisplayField, { name: "code" }), _jsx(DisplayField, { name: "type" }), _jsx(DisplayField, { name: "status" }), _jsx(DisplayField, { name: "externalSource" }), _jsx(DisplayField, { name: "externalId" })] }), _jsxs(Section, { name: "hierarchy", children: [_jsx(DisplayField, { name: "parentUnitId" }), _jsx(DisplayField, { name: "path" }), _jsx(DisplayField, { name: "inheritanceType" })] }), _jsx(RelatedResourceSections, { config: { mode: SectionMode.TABS }, targets: [R.ORGANIZATION_UNITS] })] })),
133
- summary: () => (_jsxs(SummaryLayout, { children: [_jsx(SummaryTitle, { name: "name" }), _jsxs(SummaryMeta, { children: [_jsx(DisplayField, { name: "type" }), _jsx(DisplayField, { name: "status" }), _jsx(DisplayField, { name: "externalSource" })] })] })),
134
- edit: () => (_jsxs(FormLayout, { children: [_jsxs(Section, { name: "identity", appearance: SectionMode.CARD, children: [_jsx(FormField, { name: "name" }), _jsx(FormField, { name: "code" }), _jsx(FormField, { name: "type" }), _jsx(FormField, { name: "status" })] }), _jsxs(Section, { name: "hierarchy", children: [_jsx(FormField, { name: "parentUnitId" }), _jsx(FormField, { name: "inheritanceType" })] })] })),
144
+ // NO section refs, on either surface. The read pane holds at most five rows once the name and
145
+ // the two state badges moved to the header, and the form at most six fields: an "Identity"
146
+ // heading over the unit's own facts named the page, and a "Hierarchy" heading over two rows
147
+ // (one of which a root unit does not have, and one the edit form cannot write) was a heading
148
+ // over a single row as often as not.
149
+ refs: { sections: [] },
150
+ // Read rows are SETTINGS_ROW (label start, value end); cards show bare values; the form stacks
151
+ // label over control, because a unit is AUTHORED — named and placed — not toggled.
152
+ defaultChromeMode: { display: DisplayChromeMode.SETTINGS_ROW, summary: DisplayChromeMode.HIDDEN, edit: EditChromeMode.STACKED },
153
+ // The identity line: the unit's name, its status, and — for a unit a SCIM directory created —
154
+ // that directory's badge (#1392). A directory-owned unit is reconciled by the directory, so a
155
+ // rename made here is reverted without an error; the badge beside the name is where a reader
156
+ // learns that before trying. It hides itself on a hand-authored unit.
157
+ header: () => (_jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-field", children: [_jsx(ResourceHeaderTitle, {}), _jsx(DisplayField, { name: "status", hideLabel: true, hideDescription: true, className: "w-auto" }), _jsx(DisplayField, { name: "externalSource", hideLabel: true, hideDescription: true, className: "w-auto" })] })),
158
+ /*
159
+ * One column of facts, each once. `name`, `status` and `externalSource` are the header's.
160
+ * `path` is not shown: it is the materialized chain of ancestor ids the tree is queried by — the
161
+ * same fact `parentUnitId` states by name, spelled as identifiers. Every optional row hides when
162
+ * empty, so a root unit with no code or type reads as its parent-less, inheritance-only self.
163
+ */
164
+ display: () => (_jsxs(DisplayLayout, { children: [_jsx(DisplayField, { name: "code" }), _jsx(DisplayField, { name: "type" }), _jsx(DisplayField, { name: "parentUnitId" }), _jsx(DisplayField, { name: "inheritanceType" }), _jsx(DisplayField, { name: "externalId" }), _jsx(RelatedResourceSections, { config: { mode: SectionMode.TABS }, targets: [R.ORGANIZATION_UNITS] })] })),
165
+ // A card: the unit's name, then its state and kind as bare values. The directory badge says
166
+ // "SCIM", which needs no label; "Active" and "Team" read as what they are.
167
+ summary: () => (_jsxs(SummaryLayout, { children: [_jsx(SummaryTitle, { name: "name" }), _jsxs(SummaryMeta, { children: [_jsx(DisplayField, { name: "status" }), _jsx(DisplayField, { name: "type" }), _jsx(DisplayField, { name: "externalSource" })] })] })),
168
+ /*
169
+ * The name first and focused; the two short identifying fields share a row where the form is
170
+ * wide enough. `parentUnitId` is `excludeFromUpdate` — re-parenting is the MOVE operation's — so
171
+ * it appears on the create form only, and the edit form skips it.
172
+ */
173
+ edit: () => (_jsxs(FormLayout, { children: [_jsx(FormField, { name: "name", autoFocus: true }), _jsx("div", { className: "@container", children: _jsxs("div", { className: "grid grid-cols-1 gap-group @md:grid-cols-2", children: [_jsx(FormField, { name: "code" }), _jsx(FormField, { name: "type" })] }) }), _jsx(FormField, { name: "status" }), _jsx(FormField, { name: "parentUnitId" }), _jsx(FormField, { name: "inheritanceType" })] })),
135
174
  },
136
175
  fields: {
176
+ // A badge, because it is the unit's STATE — read at a glance beside its name. The per-value
177
+ // sentence stays on the form, where it distinguishes the choices.
178
+ status: schemaShape.status.enumUI({
179
+ display: { displayMode: EnumDisplayMode.BADGE, showDescription: false },
180
+ edit: { showDescription: true },
181
+ values: {
182
+ [OrganizationUnitStatus.ACTIVE]: { color: BadgeSemanticVariant.SUCCESS },
183
+ [OrganizationUnitStatus.INACTIVE]: { color: BadgeSemanticVariant.SECONDARY },
184
+ [OrganizationUnitStatus.ARCHIVED]: { color: BadgeSemanticVariant.OUTLINE },
185
+ [OrganizationUnitStatus.SUSPENDED]: { color: BadgeSemanticVariant.DESTRUCTIVE },
186
+ },
187
+ }),
137
188
  // A badge, because it is a STATE of the row the reader needs at a glance in a list — the
138
189
  // one fact that explains why a rename does not stick. Empty for a hand-authored unit.
139
190
  externalSource: schemaShape.externalSource.enumUI({
140
191
  display: { displayMode: EnumDisplayMode.BADGE, hideWhenEmpty: true },
141
192
  values: { [ExternalIdentitySource.SCIM]: { color: BadgeSemanticVariant.INFO } },
142
193
  }),
143
- // The directory's own identifier for the group, so an administrator can find it there.
194
+ // Optional facts: a dash under each said nothing, and on most units most of them are unset.
195
+ code: schemaShape.code.stringUI({ display: { hideWhenEmpty: true } }),
196
+ type: schemaShape.type.enumUI({ display: { hideWhenEmpty: true } }),
197
+ // A root unit hangs directly under the organization; "no parent" is what the absence means.
198
+ parentUnitId: schemaShape.parentUnitId.foreignKeyUI({ display: { hideWhenEmpty: true } }),
144
199
  externalId: schemaShape.externalId.stringUI({ display: { hideWhenEmpty: true } }),
145
200
  },
146
201
  views: [
@@ -158,14 +213,43 @@ export function buildOrganizationsMainPresets() {
158
213
  [R.ORGANIZATION_MEMBERS]: resourceUIBehavior(orgMembersFactory, OrganizationMemberSchema, ({ schema, schemaShape, opsVariantResolver }) => ({
159
214
  icon: StandardIconReference.TEAM,
160
215
  layout: {
161
- refs: { sections: ['overview', 'membership'] },
162
- // Settings-page chrome (Settings Hub → Members): label-left / value-right rows.
163
- defaultChromeMode: { display: DisplayChromeMode.SETTINGS_ROW, summary: DisplayChromeMode.INLINE, edit: EditChromeMode.SETTINGS_ROW },
164
- display: () => (_jsxs(DisplayLayout, { children: [_jsxs(Section, { name: "overview", appearance: SectionMode.CARD, children: [_jsx(DisplayField, { name: "userTitle" }), _jsx(DisplayField, { name: "status" }), _jsx(DisplayField, { name: "roles" })] }), _jsx(Section, { name: "membership", children: _jsx(DisplayField, { name: "createdAt" }) })] })),
165
- summary: () => (_jsxs(SummaryLayout, { children: [_jsx(SummaryTitle, { name: "userTitle" }), _jsxs(SummaryMeta, { children: [_jsx(DisplayField, { name: "roles" }), _jsx(DisplayField, { name: "status" })] })] })),
166
- edit: () => (_jsx(FormLayout, { children: _jsxs(Section, { name: "overview", appearance: SectionMode.CARD, children: [_jsx(FormField, { name: "userEmail" }), _jsx(FormField, { name: "userTitle" }), _jsx(FormField, { name: "status" }), _jsx(FormField, { name: "roles" })] }) })),
216
+ // NO section refs, on either surface. The read pane was an "Overview" card of three rows and a
217
+ // "Membership" section holding `createdAt` alone — a heading over the page and a heading over
218
+ // one row. The invite form is one group of at most four fields. Neither heading distinguished
219
+ // anything.
220
+ refs: { sections: [] },
221
+ // Settings-page chrome (Settings Hub → Members): label-left / value-right rows on read and on
222
+ // the invite/edit form; bare values on a card, where the badge and the role speak for themselves.
223
+ defaultChromeMode: { display: DisplayChromeMode.SETTINGS_ROW, summary: DisplayChromeMode.HIDDEN, edit: EditChromeMode.SETTINGS_ROW },
224
+ // The identity line: the member's name, and their status beside it — invited, active,
225
+ // suspended is the first thing an administrator opening a member needs. Neither is a body row.
226
+ header: () => (_jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-field", children: [_jsx(ResourceHeaderTitle, {}), _jsx(DisplayField, { name: "status", hideLabel: true, hideDescription: true, className: "w-auto" })] })),
227
+ /*
228
+ * The membership's own facts, once each: the roles it confers, the member's job title when one
229
+ * was given, the firm a service provider's expert came through (#1597, "via {Firm}"), and when
230
+ * the membership began. Unit assignments are not a field here (D-B5): they are
231
+ * ORGANIZATION_UNIT_MEMBERS rows, composed below the rows as that resource's own tab.
232
+ */
233
+ display: () => (_jsxs(DisplayLayout, { children: [_jsx(DisplayField, { name: "roles" }), _jsx(DisplayField, { name: "userTitle" }), _jsx(DisplayField, { name: "providerOrganizationName" }), _jsx(DisplayField, { name: "createdAt" })] })),
234
+ // A card (the member list in card mode, a reference popover): the member's name — the resolved
235
+ // label, forwarded from their profile — then status, roles and the firm, bare. It used to title
236
+ // the card with `userTitle`, a job title most members never set, so most cards had no title.
237
+ summary: () => (_jsxs(SummaryLayout, { children: [_jsx(SummaryTitle, {}), _jsxs(SummaryMeta, { children: [_jsx(DisplayField, { name: "status" }), _jsx(DisplayField, { name: "roles" }), _jsx(DisplayField, { name: "providerOrganizationName" })] })] })),
238
+ edit: () => (_jsxs(FormLayout, { children: [_jsx(FormField, { name: "userEmail", autoFocus: true }), _jsx(FormField, { name: "roles" }), _jsx(FormField, { name: "userTitle" }), _jsx(FormField, { name: "status" })] })),
167
239
  },
168
240
  fields: {
241
+ providerOrganizationName: schemaShape.providerOrganizationName.stringUI({ display: { hideWhenEmpty: true } }),
242
+ // Most members have no job title; a row of "—" under every one of them said nothing.
243
+ userTitle: schemaShape.userTitle.stringUI({ display: { hideWhenEmpty: true } }),
244
+ /*
245
+ * Two raw identifiers, hidden from DISPLAY so they stop being table columns. Both are summary
246
+ * fields for the backend's sake (the provider membership's live filter reads them), and the
247
+ * member TABLE derives its columns from summary fields — so every tenant's directory carried
248
+ * two always-empty columns — one of them headed "Provider organization", like the name column
249
+ * beside it — holding ids nobody can read. `providerOrganizationName` is the readable form of the same fact and stays.
250
+ */
251
+ serviceProviderRelationshipId: schemaShape.serviceProviderRelationshipId.isHidden({ display: true }),
252
+ providerOrganizationId: schemaShape.providerOrganizationId.isHidden({ display: true }),
169
253
  status: schemaShape.status.enumUI({
170
254
  // No description on the READ surface: the badge already IS the answer, and the per-value
171
255
  // sentence under it is a paragraph explaining a word the reader has just read — the
@@ -181,13 +265,19 @@ export function buildOrganizationsMainPresets() {
181
265
  },
182
266
  }),
183
267
  },
184
- // A membership has no inherent name — its identity is the related user.
185
- // `instanceLabel` is a server-resolved virtual field that forwards the
186
- // user's name live from `USER_PROFILES` (see `forwardedLabel` on
187
- // `OrganizationMemberSchema`), so the label is a plain, synchronous field
188
- // ref — never stale, tenant-safe, no async frontend resolver. `userTitle`
189
- // is the distinct authored job title and stays its own FIELD.
190
- getFrontendResourceLabel: ['instanceLabel'],
268
+ /*
269
+ * A membership has no inherent name — its identity is the related user. `instanceLabel` is a
270
+ * server-resolved virtual field that forwards the user's name live from `USER_PROFILES` (see
271
+ * `forwardedLabel` on `OrganizationMemberSchema`); `userTitle` is the distinct authored job title
272
+ * and stays its own FIELD.
273
+ *
274
+ * `userEmail` is the second choice because the virtual label is projected on the SUMMARY DTO
275
+ * only: the READ that the page header and a foreign-key reference fetch carries no
276
+ * `instanceLabel`, and the header then fell back to "<userId> ORG_MEMBER INACTIVE" — the raw
277
+ * summary fields. The email is on the row itself, and it is the same fallback `forwardedLabel`
278
+ * applies server-side when a profile has no name.
279
+ */
280
+ getFrontendResourceLabel: ({ currentObject }) => currentObject.instanceLabel || currentObject.userEmail || '',
191
281
  views: [
192
282
  [Op.COUNT, notAddressable()],
193
283
  // CREATE is the org-admin INVITE entry point (it mints the invitee's pending
@@ -232,12 +322,12 @@ export function buildOrganizationsMainPresets() {
232
322
  getFrontendResourceLabel: ({ currentObject }) => currentObject.displayName || `Organization ${currentObject.organizationId}`,
233
323
  layout: {
234
324
  refs: { sections: ['company', 'classification', 'location', 'branding', 'social'] },
235
- display: () => (_jsxs(DisplayLayout, { children: [_jsxs(Section, { name: "company", appearance: SectionMode.CARD, children: [_jsx(DisplayField, { name: "displayName" }), _jsx(DisplayField, { name: "domain" }), _jsx(DisplayField, { name: "website" }), _jsx(DisplayField, { name: "phone" }), _jsx(DisplayField, { name: "description" })] }), _jsxs(Section, { name: "classification", children: [_jsx(DisplayField, { name: "industry" }), _jsx(DisplayField, { name: "size" }), _jsx(DisplayField, { name: "founded" }), _jsx(DisplayField, { name: "timezone" })] }), _jsx(Section, { name: "location", children: _jsx(DisplayField, { name: "address" }) }), _jsx(Section, { name: "branding", children: _jsxs(ObjectScope, { name: "branding", children: [_jsx(DisplayField, { name: "logo" }), _jsx(DisplayField, { name: "favicon" }), _jsx(DisplayField, { name: "primaryColor" }), _jsx(DisplayField, { name: "secondaryColor" }), _jsx(DisplayField, { name: "customDomain" })] }) }), _jsx(Section, { name: "social", children: _jsxs(ObjectScope, { name: "socialLinks", children: [_jsx(DisplayField, { name: "linkedin" }), _jsx(DisplayField, { name: "twitter" }), _jsx(DisplayField, { name: "facebook" }), _jsx(DisplayField, { name: "github" })] }) })] })),
325
+ display: () => (_jsxs(DisplayLayout, { children: [_jsxs(Section, { name: "company", appearance: SectionMode.CARD, children: [_jsx(DisplayField, { name: "displayName" }), _jsx(DisplayField, { name: "domain" }), _jsx(DisplayField, { name: "website" }), _jsx(DisplayField, { name: "phone" }), _jsx(DisplayField, { name: "description" })] }), _jsxs(Section, { name: "classification", children: [_jsx(DisplayField, { name: "industry" }), _jsx(DisplayField, { name: "size" }), _jsx(DisplayField, { name: "founded" }), _jsx(DisplayField, { name: "timezone" })] }), _jsx(Section, { name: "location", children: _jsx(DisplayField, { name: "address" }) }), _jsx(Section, { name: "branding", children: _jsxs(ObjectScope, { name: "branding", children: [_jsx(DisplayField, { name: "logo" }), _jsx(DisplayField, { name: "favicon" }), _jsx(DisplayField, { name: "primaryColor" }), _jsx(DisplayField, { name: "secondaryColor" })] }) }), _jsx(Section, { name: "social", children: _jsxs(ObjectScope, { name: "socialLinks", children: [_jsx(DisplayField, { name: "linkedin" }), _jsx(DisplayField, { name: "twitter" }), _jsx(DisplayField, { name: "facebook" }), _jsx(DisplayField, { name: "github" })] }) })] })),
236
326
  summary: () => (
237
327
  // The card's LABEL already opens with `displayName`, so rendering it again as the only
238
328
  // field said one thing twice. It is the TITLE of this card, not a row beneath one.
239
329
  _jsx(SummaryLayout, { children: _jsx(SummaryTitle, { name: "displayName" }) })),
240
- edit: () => (_jsxs(FormLayout, { children: [_jsxs(Section, { name: "company", appearance: SectionMode.CARD, children: [_jsx(FormField, { name: "displayName" }), _jsx(FormField, { name: "domain" }), _jsx(FormField, { name: "website" }), _jsx(FormField, { name: "phone" }), _jsx(FormField, { name: "description" })] }), _jsxs(Section, { name: "classification", children: [_jsx(FormField, { name: "industry" }), _jsx(FormField, { name: "size" }), _jsx(FormField, { name: "founded" }), _jsx(FormField, { name: "timezone" })] }), _jsx(Section, { name: "location", children: _jsx(FormField, { name: "address" }) }), _jsx(Section, { name: "branding", children: _jsxs(ObjectScope, { name: "branding", children: [_jsx(FormField, { name: "logo" }), _jsx(FormField, { name: "favicon" }), _jsx(FormField, { name: "primaryColor" }), _jsx(FormField, { name: "secondaryColor" }), _jsx(FormField, { name: "customDomain" })] }) }), _jsx(Section, { name: "social", children: _jsxs(ObjectScope, { name: "socialLinks", children: [_jsx(FormField, { name: "linkedin" }), _jsx(FormField, { name: "twitter" }), _jsx(FormField, { name: "facebook" }), _jsx(FormField, { name: "github" })] }) })] })),
330
+ edit: () => (_jsxs(FormLayout, { children: [_jsxs(Section, { name: "company", appearance: SectionMode.CARD, children: [_jsx(FormField, { name: "displayName" }), _jsx(FormField, { name: "domain" }), _jsx(FormField, { name: "website" }), _jsx(FormField, { name: "phone" }), _jsx(FormField, { name: "description" })] }), _jsxs(Section, { name: "classification", children: [_jsx(FormField, { name: "industry" }), _jsx(FormField, { name: "size" }), _jsx(FormField, { name: "founded" }), _jsx(FormField, { name: "timezone" })] }), _jsx(Section, { name: "location", children: _jsx(FormField, { name: "address" }) }), _jsx(Section, { name: "branding", children: _jsxs(ObjectScope, { name: "branding", children: [_jsx(FormField, { name: "logo" }), _jsx(FormField, { name: "favicon" }), _jsx(FormField, { name: "primaryColor" }), _jsx(FormField, { name: "secondaryColor" })] }) }), _jsx(Section, { name: "social", children: _jsxs(ObjectScope, { name: "socialLinks", children: [_jsx(FormField, { name: "linkedin" }), _jsx(FormField, { name: "twitter" }), _jsx(FormField, { name: "facebook" }), _jsx(FormField, { name: "github" })] }) })] })),
241
331
  },
242
332
  views: [
243
333
  [Op.READ, notAddressable()],
@@ -272,11 +362,20 @@ export function buildOrganizationsMainPresets() {
272
362
  ],
273
363
  })),
274
364
  [R.ORGANIZATION_FEATURES]: resourceUIBehavior(orgFeaturesFactory, ScopeFeaturesWithOverridesSchema, ({ schema, schemaShape, opsVariantResolver }) => ({
365
+ // The header showed the registry's missing-icon placeholder: nothing had ever named one.
366
+ icon: BadgeCheck,
275
367
  layout: {
276
368
  refs: { sections: ['overview', 'overrides'] },
277
- display: () => (_jsxs(DisplayLayout, { children: [_jsxs(Section, { name: "overview", appearance: SectionMode.CARD, children: [_jsx(DisplayField, { name: "features" }), _jsx(DisplayField, { name: "limits" })] }), _jsx(Section, { name: "overrides", children: _jsxs(ObjectScope, { name: "manualOverrides", children: [_jsx(DisplayField, { name: "addedFeatures" }), _jsx(DisplayField, { name: "removedFeatures" }), _jsx(DisplayField, { name: "limitOverrides" })] }) })] })),
369
+ // Settings-page chrome (Settings Hub → Entitlements): label-left / value-right rows on read,
370
+ // bare values on a card. The form STACKS, because every field it edits is a list or a map
371
+ // of entries, which needs the full width a settings row gives to its label.
372
+ defaultChromeMode: { display: DisplayChromeMode.SETTINGS_ROW, summary: DisplayChromeMode.HIDDEN, edit: EditChromeMode.STACKED },
373
+ // An override list with nothing in it IS the answer on this pane — "no feature was granted or
374
+ // withdrawn by hand" — so it says "None yet" rather than an em dash that reads as missing data.
375
+ defaultEmptyValue: 'placeholder',
376
+ display: () => (_jsxs(DisplayLayout, { children: [_jsxs(Section, { name: "overview", appearance: SectionMode.CARD, hideTitle: true, hideDescription: true, children: [_jsx(DisplayField, { name: "features" }), _jsx(DisplayField, { name: "limits" })] }), _jsx(Section, { name: "overrides", hideDescription: true, children: _jsxs(ObjectScope, { name: "manualOverrides", children: [_jsx(DisplayField, { name: "addedFeatures" }), _jsx(DisplayField, { name: "removedFeatures" }), _jsx(DisplayField, { name: "limitOverrides" })] }) })] })),
278
377
  summary: () => (_jsxs(SummaryLayout, { children: [_jsx(DisplayField, { name: "features" }), _jsx(DisplayField, { name: "limits" })] })),
279
- edit: () => (_jsxs(FormLayout, { children: [_jsxs(Section, { name: "overview", appearance: SectionMode.CARD, children: [_jsx(FormField, { name: "features" }), _jsx(FormField, { name: "limits" })] }), _jsx(Section, { name: "overrides", children: _jsxs(ObjectScope, { name: "manualOverrides", children: [_jsx(FormField, { name: "addedFeatures" }), _jsx(FormField, { name: "removedFeatures" }), _jsx(FormField, { name: "limitOverrides" })] }) })] })),
378
+ edit: () => (_jsxs(FormLayout, { children: [_jsxs(Section, { name: "overview", appearance: SectionMode.CARD, hideDescription: true, children: [_jsx(FormField, { name: "features" }), _jsx(FormField, { name: "limits" })] }), _jsx(Section, { name: "overrides", children: _jsxs(ObjectScope, { name: "manualOverrides", children: [_jsx(FormField, { name: "addedFeatures" }), _jsx(FormField, { name: "removedFeatures" }), _jsx(FormField, { name: "limitOverrides" })] }) })] })),
280
379
  },
281
380
  views: [
282
381
  [Op.READ, notAddressable()],
@@ -295,6 +394,10 @@ export function buildOrganizationsAdminPresets(main) {
295
394
  layout: base.layout,
296
395
  fields: base.fields,
297
396
  views: [
397
+ // The tenant's own views first, so the operator entries below override where they share a key. In an
398
+ // application composing both lanes this entry replaces the main one, and the organization's own General pane
399
+ // runs the DEFAULT READ — which only an `admin`-keyed READ left without a view (#1812).
400
+ ...(base.views ?? []),
298
401
  [opsVariantResolver(Op.READ, 'admin'), notAddressable()],
299
402
  [Op.LIST, notAddressable()],
300
403
  [Op.SEARCH, notAddressable()],