@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.
- package/dist/esm/.native.tsbuildinfo +1 -0
- package/dist/esm/components/actions/action-bar.d.ts.map +1 -1
- package/dist/esm/components/actions/action-bar.js +5 -2
- package/dist/esm/components/actions/action-bar.js.map +1 -1
- package/dist/esm/components/ai-elements/chat/suggestion.d.ts.map +1 -1
- package/dist/esm/components/ai-elements/chat/suggestion.js +8 -1
- package/dist/esm/components/ai-elements/chat/suggestion.js.map +1 -1
- package/dist/esm/components/ai-elements/decision/approval.d.ts +108 -13
- package/dist/esm/components/ai-elements/decision/approval.d.ts.map +1 -1
- package/dist/esm/components/ai-elements/decision/approval.js +60 -10
- package/dist/esm/components/ai-elements/decision/approval.js.map +1 -1
- package/dist/esm/components/ai-elements/graph/graph-runtime.d.ts +3 -1
- package/dist/esm/components/ai-elements/graph/graph-runtime.d.ts.map +1 -1
- package/dist/esm/components/ai-elements/graph/graph-runtime.js +3 -1
- package/dist/esm/components/ai-elements/graph/graph-runtime.js.map +1 -1
- package/dist/esm/components/app/app-layout-main-container.d.ts +9 -0
- package/dist/esm/components/app/app-layout-main-container.d.ts.map +1 -1
- package/dist/esm/components/app/app-layout-main-container.js +17 -23
- package/dist/esm/components/app/app-layout-main-container.js.map +1 -1
- package/dist/esm/components/app/app-layout-main-container.labels.d.ts.map +1 -1
- package/dist/esm/components/app/app-layout-main-container.labels.js +27 -0
- package/dist/esm/components/app/app-layout-main-container.labels.js.map +1 -1
- package/dist/esm/components/billing/billing-plan-change-preview.d.ts.map +1 -1
- package/dist/esm/components/billing/billing-plan-change-preview.js +5 -2
- package/dist/esm/components/billing/billing-plan-change-preview.js.map +1 -1
- package/dist/esm/components/billing/billing-plan-change-preview.labels.d.ts.map +1 -1
- package/dist/esm/components/billing/billing-plan-change-preview.labels.js +3 -0
- package/dist/esm/components/billing/billing-plan-change-preview.labels.js.map +1 -1
- package/dist/esm/components/billing/billing-pricing-table.d.ts +1 -1
- package/dist/esm/components/billing/billing-pricing-table.d.ts.map +1 -1
- package/dist/esm/components/billing/billing-pricing-table.js +8 -4
- package/dist/esm/components/billing/billing-pricing-table.js.map +1 -1
- package/dist/esm/components/billing/billing-pricing-table.labels.d.ts.map +1 -1
- package/dist/esm/components/billing/billing-pricing-table.labels.js +7 -1
- package/dist/esm/components/billing/billing-pricing-table.labels.js.map +1 -1
- package/dist/esm/components/billing/billing-usage-dashboard.d.ts.map +1 -1
- package/dist/esm/components/billing/billing-usage-dashboard.js +6 -3
- package/dist/esm/components/billing/billing-usage-dashboard.js.map +1 -1
- package/dist/esm/components/billing/billing-usage-dashboard.labels.d.ts.map +1 -1
- package/dist/esm/components/billing/billing-usage-dashboard.labels.js +2 -1
- package/dist/esm/components/billing/billing-usage-dashboard.labels.js.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-enum.d.ts.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-enum.js +18 -4
- package/dist/esm/components/data-display/formatters/display-field-enum.js.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-file.d.ts.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-file.js +13 -14
- package/dist/esm/components/data-display/formatters/display-field-file.js.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-file.labels.d.ts.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-file.labels.js +1 -0
- package/dist/esm/components/data-display/formatters/display-field-file.labels.js.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-number.d.ts.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-number.js +6 -1
- package/dist/esm/components/data-display/formatters/display-field-number.js.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-number.labels.d.ts.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-number.labels.js +5 -2
- package/dist/esm/components/data-display/formatters/display-field-number.labels.js.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-string.d.ts +1 -1
- package/dist/esm/components/data-display/formatters/display-field-string.d.ts.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-string.js +51 -12
- package/dist/esm/components/data-display/formatters/display-field-string.js.map +1 -1
- package/dist/esm/components/data-display/untrusted-html-content.d.ts +55 -0
- package/dist/esm/components/data-display/untrusted-html-content.d.ts.map +1 -0
- package/dist/esm/components/data-display/untrusted-html-content.js +67 -0
- package/dist/esm/components/data-display/untrusted-html-content.js.map +1 -0
- package/dist/esm/components/form/chromes/form-primitive.labels.d.ts.map +1 -1
- package/dist/esm/components/form/chromes/form-primitive.labels.js +9 -0
- package/dist/esm/components/form/chromes/form-primitive.labels.js.map +1 -1
- package/dist/esm/components/form/combobox.d.ts.map +1 -1
- package/dist/esm/components/form/combobox.js +10 -10
- package/dist/esm/components/form/combobox.js.map +1 -1
- package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.adapter.d.ts +42 -0
- package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.adapter.d.ts.map +1 -0
- package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.adapter.js +120 -0
- package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.adapter.js.map +1 -0
- package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.d.ts +16 -0
- package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.d.ts.map +1 -0
- package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.js +8 -0
- package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.js.map +1 -0
- package/dist/esm/components/navigation/app-level/activity-bar.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/activity-bar.js +2 -2
- package/dist/esm/components/navigation/app-level/activity-bar.js.map +1 -1
- package/dist/esm/components/navigation/app-level/menu-user-org.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/menu-user-org.js +10 -4
- package/dist/esm/components/navigation/app-level/menu-user-org.js.map +1 -1
- package/dist/esm/components/navigation/app-level/menu-user-org.labels.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/menu-user-org.labels.js +7 -0
- package/dist/esm/components/navigation/app-level/menu-user-org.labels.js.map +1 -1
- package/dist/esm/components/navigation/app-level/menubar.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/menubar.js +6 -6
- package/dist/esm/components/navigation/app-level/menubar.js.map +1 -1
- package/dist/esm/components/navigation/app-level/navigation-back.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/navigation-back.js +27 -9
- package/dist/esm/components/navigation/app-level/navigation-back.js.map +1 -1
- package/dist/esm/components/navigation/app-level/sidebar.js +3 -3
- package/dist/esm/components/navigation/app-level/sidebar.js.map +1 -1
- package/dist/esm/components/navigation/app-level/status-bar.js +2 -2
- package/dist/esm/components/navigation/app-level/status-bar.js.map +1 -1
- package/dist/esm/components/navigation/app-level/toolbar.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/toolbar.js +2 -2
- package/dist/esm/components/navigation/app-level/toolbar.js.map +1 -1
- package/dist/esm/components/navigation/app-level/utility-panel.js +2 -2
- package/dist/esm/components/navigation/app-level/utility-panel.js.map +1 -1
- package/dist/esm/components/navigation/breadcrumb.js +1 -1
- package/dist/esm/components/navigation/breadcrumb.js.map +1 -1
- package/dist/esm/components/sections/stepper.d.ts.map +1 -1
- package/dist/esm/components/sections/stepper.js +5 -3
- package/dist/esm/components/sections/stepper.js.map +1 -1
- package/dist/esm/config/preset-navigation.d.ts.map +1 -1
- package/dist/esm/config/preset-navigation.js +23 -2
- package/dist/esm/config/preset-navigation.js.map +1 -1
- package/dist/esm/config/resources/agent-work.resource-presets.d.ts +4 -0
- package/dist/esm/config/resources/agent-work.resource-presets.d.ts.map +1 -0
- package/dist/esm/config/resources/agent-work.resource-presets.js +115 -0
- package/dist/esm/config/resources/agent-work.resource-presets.js.map +1 -0
- package/dist/esm/config/resources/api-key-rotation-window.d.ts +22 -0
- package/dist/esm/config/resources/api-key-rotation-window.d.ts.map +1 -0
- package/dist/esm/config/resources/api-key-rotation-window.js +45 -0
- package/dist/esm/config/resources/api-key-rotation-window.js.map +1 -0
- package/dist/esm/config/resources/application.resource-presets.d.ts.map +1 -1
- package/dist/esm/config/resources/application.resource-presets.js +147 -61
- package/dist/esm/config/resources/application.resource-presets.js.map +1 -1
- package/dist/esm/config/resources/billing.resource-presets.d.ts +4 -3
- package/dist/esm/config/resources/billing.resource-presets.d.ts.map +1 -1
- package/dist/esm/config/resources/billing.resource-presets.js +240 -111
- package/dist/esm/config/resources/billing.resource-presets.js.map +1 -1
- package/dist/esm/config/resources/conversation-threads.resource-presets.d.ts +4 -0
- package/dist/esm/config/resources/conversation-threads.resource-presets.d.ts.map +1 -0
- package/dist/esm/config/resources/conversation-threads.resource-presets.js +105 -0
- package/dist/esm/config/resources/conversation-threads.resource-presets.js.map +1 -0
- package/dist/esm/config/resources/guidance.resource-presets.d.ts.map +1 -1
- package/dist/esm/config/resources/guidance.resource-presets.js +18 -11
- package/dist/esm/config/resources/guidance.resource-presets.js.map +1 -1
- package/dist/esm/config/resources/identity.resource-presets.d.ts +0 -13
- package/dist/esm/config/resources/identity.resource-presets.d.ts.map +1 -1
- package/dist/esm/config/resources/identity.resource-presets.js +48 -16
- package/dist/esm/config/resources/identity.resource-presets.js.map +1 -1
- package/dist/esm/config/resources/inbound-deliveries.resource-presets.d.ts +6 -0
- package/dist/esm/config/resources/inbound-deliveries.resource-presets.d.ts.map +1 -0
- package/dist/esm/config/resources/inbound-deliveries.resource-presets.js +112 -0
- package/dist/esm/config/resources/inbound-deliveries.resource-presets.js.map +1 -0
- package/dist/esm/config/resources/inbound-email.resource-presets.d.ts +4 -0
- package/dist/esm/config/resources/inbound-email.resource-presets.d.ts.map +1 -0
- package/dist/esm/config/resources/inbound-email.resource-presets.js +182 -0
- package/dist/esm/config/resources/inbound-email.resource-presets.js.map +1 -0
- package/dist/esm/config/resources/index.d.ts.map +1 -1
- package/dist/esm/config/resources/index.js +9 -2
- package/dist/esm/config/resources/index.js.map +1 -1
- package/dist/esm/config/resources/legal-holds.resource-presets.d.ts +4 -0
- package/dist/esm/config/resources/legal-holds.resource-presets.d.ts.map +1 -0
- package/dist/esm/config/resources/legal-holds.resource-presets.js +76 -0
- package/dist/esm/config/resources/legal-holds.resource-presets.js.map +1 -0
- package/dist/esm/config/resources/organizations.resource-presets.d.ts.map +1 -1
- package/dist/esm/config/resources/organizations.resource-presets.js +139 -36
- package/dist/esm/config/resources/organizations.resource-presets.js.map +1 -1
- package/dist/esm/config/resources/resource.config.utils.d.ts +20 -0
- package/dist/esm/config/resources/resource.config.utils.d.ts.map +1 -1
- package/dist/esm/config/resources/resource.config.utils.js +20 -0
- package/dist/esm/config/resources/resource.config.utils.js.map +1 -1
- package/dist/esm/config/resources/retention-enforcement.resource-presets.d.ts +5 -0
- package/dist/esm/config/resources/retention-enforcement.resource-presets.d.ts.map +1 -0
- package/dist/esm/config/resources/retention-enforcement.resource-presets.js +74 -0
- package/dist/esm/config/resources/retention-enforcement.resource-presets.js.map +1 -0
- package/dist/esm/config/resources/security.resource-presets.d.ts +3 -1
- package/dist/esm/config/resources/security.resource-presets.d.ts.map +1 -1
- package/dist/esm/config/resources/security.resource-presets.js +563 -133
- package/dist/esm/config/resources/security.resource-presets.js.map +1 -1
- package/dist/esm/config/resources/service-providers.resource-presets.d.ts +4 -0
- package/dist/esm/config/resources/service-providers.resource-presets.d.ts.map +1 -0
- package/dist/esm/config/resources/service-providers.resource-presets.js +321 -0
- package/dist/esm/config/resources/service-providers.resource-presets.js.map +1 -0
- package/dist/esm/config/resources/webhooks.resource-presets.d.ts +4 -3
- package/dist/esm/config/resources/webhooks.resource-presets.d.ts.map +1 -1
- package/dist/esm/config/resources/webhooks.resource-presets.js +76 -25
- package/dist/esm/config/resources/webhooks.resource-presets.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/registration/register-common-enums.d.ts.map +1 -1
- package/dist/esm/registration/register-common-enums.js +15 -0
- package/dist/esm/registration/register-common-enums.js.map +1 -1
- package/dist/esm/registration/register-provider-components.d.ts.map +1 -1
- package/dist/esm/registration/register-provider-components.js +6 -0
- package/dist/esm/registration/register-provider-components.js.map +1 -1
- package/dist/esm/themes/dense.theme.d.ts.map +1 -1
- package/dist/esm/themes/dense.theme.js +22 -2
- package/dist/esm/themes/dense.theme.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- 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;
|
|
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;
|
|
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
|
|
71
|
-
//
|
|
72
|
-
//
|
|
73
|
-
//
|
|
74
|
-
//
|
|
75
|
-
refs: { sections: [
|
|
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
|
|
78
|
-
|
|
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
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
162
|
-
//
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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" })
|
|
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" })
|
|
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
|
-
|
|
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()],
|