@alfadocs/ui-kit-debug 1.69.0 → 1.70.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/dist/_chunks/workflow-webhook-action-D6K7Jgc2.js +832 -0
  2. package/dist/_chunks/workflow-webhook-action-D6K7Jgc2.js.map +1 -0
  3. package/dist/agent-catalog.json +12 -2
  4. package/dist/agent-i18n/en.json +2 -1
  5. package/dist/i18n/locales/ar.d.ts +13 -1
  6. package/dist/i18n/locales/ar.d.ts.map +1 -1
  7. package/dist/i18n/locales/ar.js +13 -1
  8. package/dist/i18n/locales/ar.js.map +1 -1
  9. package/dist/i18n/locales/de.d.ts +13 -1
  10. package/dist/i18n/locales/de.d.ts.map +1 -1
  11. package/dist/i18n/locales/de.js +13 -1
  12. package/dist/i18n/locales/de.js.map +1 -1
  13. package/dist/i18n/locales/el.d.ts +13 -1
  14. package/dist/i18n/locales/el.d.ts.map +1 -1
  15. package/dist/i18n/locales/el.js +13 -1
  16. package/dist/i18n/locales/el.js.map +1 -1
  17. package/dist/i18n/locales/en.d.ts +13 -1
  18. package/dist/i18n/locales/en.d.ts.map +1 -1
  19. package/dist/i18n/locales/en.js +13 -1
  20. package/dist/i18n/locales/en.js.map +1 -1
  21. package/dist/i18n/locales/es.d.ts +13 -1
  22. package/dist/i18n/locales/es.d.ts.map +1 -1
  23. package/dist/i18n/locales/es.js +13 -1
  24. package/dist/i18n/locales/es.js.map +1 -1
  25. package/dist/i18n/locales/fr.d.ts +13 -1
  26. package/dist/i18n/locales/fr.d.ts.map +1 -1
  27. package/dist/i18n/locales/fr.js +13 -1
  28. package/dist/i18n/locales/fr.js.map +1 -1
  29. package/dist/i18n/locales/hi.d.ts +13 -1
  30. package/dist/i18n/locales/hi.d.ts.map +1 -1
  31. package/dist/i18n/locales/hi.js +13 -1
  32. package/dist/i18n/locales/hi.js.map +1 -1
  33. package/dist/i18n/locales/it.d.ts +13 -1
  34. package/dist/i18n/locales/it.d.ts.map +1 -1
  35. package/dist/i18n/locales/it.js +13 -1
  36. package/dist/i18n/locales/it.js.map +1 -1
  37. package/dist/i18n/locales/ja.d.ts +13 -1
  38. package/dist/i18n/locales/ja.d.ts.map +1 -1
  39. package/dist/i18n/locales/ja.js +13 -1
  40. package/dist/i18n/locales/ja.js.map +1 -1
  41. package/dist/i18n/locales/nl.d.ts +13 -1
  42. package/dist/i18n/locales/nl.d.ts.map +1 -1
  43. package/dist/i18n/locales/nl.js +13 -1
  44. package/dist/i18n/locales/nl.js.map +1 -1
  45. package/dist/i18n/locales/pl.d.ts +13 -1
  46. package/dist/i18n/locales/pl.d.ts.map +1 -1
  47. package/dist/i18n/locales/pl.js +13 -1
  48. package/dist/i18n/locales/pl.js.map +1 -1
  49. package/dist/i18n/locales/pt.d.ts +13 -1
  50. package/dist/i18n/locales/pt.d.ts.map +1 -1
  51. package/dist/i18n/locales/pt.js +13 -1
  52. package/dist/i18n/locales/pt.js.map +1 -1
  53. package/dist/i18n/locales/ro.d.ts +13 -1
  54. package/dist/i18n/locales/ro.d.ts.map +1 -1
  55. package/dist/i18n/locales/ro.js +13 -1
  56. package/dist/i18n/locales/ro.js.map +1 -1
  57. package/dist/i18n/locales/ru.d.ts +13 -1
  58. package/dist/i18n/locales/ru.d.ts.map +1 -1
  59. package/dist/i18n/locales/ru.js +13 -1
  60. package/dist/i18n/locales/ru.js.map +1 -1
  61. package/dist/i18n/locales/sq.d.ts +13 -1
  62. package/dist/i18n/locales/sq.d.ts.map +1 -1
  63. package/dist/i18n/locales/sq.js +13 -1
  64. package/dist/i18n/locales/sq.js.map +1 -1
  65. package/dist/i18n/locales/sv.d.ts +13 -1
  66. package/dist/i18n/locales/sv.d.ts.map +1 -1
  67. package/dist/i18n/locales/sv.js +13 -1
  68. package/dist/i18n/locales/sv.js.map +1 -1
  69. package/dist/i18n/locales/tr.d.ts +13 -1
  70. package/dist/i18n/locales/tr.d.ts.map +1 -1
  71. package/dist/i18n/locales/tr.js +13 -1
  72. package/dist/i18n/locales/tr.js.map +1 -1
  73. package/dist/i18n/locales/zh.d.ts +13 -1
  74. package/dist/i18n/locales/zh.d.ts.map +1 -1
  75. package/dist/i18n/locales/zh.js +13 -1
  76. package/dist/i18n/locales/zh.js.map +1 -1
  77. package/dist/index.js +1 -1
  78. package/dist/locales/ar.json +13 -1
  79. package/dist/locales/de.json +13 -1
  80. package/dist/locales/el.json +13 -1
  81. package/dist/locales/en.json +13 -1
  82. package/dist/locales/es.json +13 -1
  83. package/dist/locales/fr.json +13 -1
  84. package/dist/locales/hi.json +13 -1
  85. package/dist/locales/it.json +13 -1
  86. package/dist/locales/ja.json +13 -1
  87. package/dist/locales/nl.json +13 -1
  88. package/dist/locales/pl.json +13 -1
  89. package/dist/locales/pt.json +13 -1
  90. package/dist/locales/ro.json +13 -1
  91. package/dist/locales/ru.json +13 -1
  92. package/dist/locales/sq.json +13 -1
  93. package/dist/locales/sv.json +13 -1
  94. package/dist/locales/tr.json +13 -1
  95. package/dist/locales/zh.json +13 -1
  96. package/dist/patterns/workflow-webhook-action/index.d.ts +1 -1
  97. package/dist/patterns/workflow-webhook-action/index.d.ts.map +1 -1
  98. package/dist/patterns/workflow-webhook-action/index.js +1 -1
  99. package/dist/patterns/workflow-webhook-action/workflow-webhook-action.d.ts +29 -3
  100. package/dist/patterns/workflow-webhook-action/workflow-webhook-action.d.ts.map +1 -1
  101. package/package.json +1 -1
  102. package/dist/_chunks/workflow-webhook-action-Ct8tFYi7.js +0 -691
  103. package/dist/_chunks/workflow-webhook-action-Ct8tFYi7.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-webhook-action-D6K7Jgc2.js","sources":["../../node_modules/lucide-react/dist/esm/icons/key-round.mjs","../../src/patterns/workflow-webhook-action/workflow-webhook-action.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\",\n key: \"1s6t7t\"\n }\n ],\n [\"circle\", { cx: \"16.5\", cy: \"7.5\", r: \".5\", fill: \"currentColor\", key: \"w0ekpg\" }]\n];\nconst KeyRound = createLucideIcon(\"key-round\", __iconNode);\n\nexport { __iconNode, KeyRound as default };\n//# sourceMappingURL=key-round.mjs.map\n","/* -------------------------------------------------------------------- */\n/* WorkflowWebhookAction — the fields of a workflow's webhook step. */\n/* */\n/* The step sends a signed message to another app, such as Link, each */\n/* time a patient reaches it. The fields ask for what most practices */\n/* need, the address and the secret, and keep the extra parameters in */\n/* an Advanced section that stays closed until it is used. */\n/* */\n/* It renders fields, not a form: the host keeps its own form, title */\n/* and Save button around it. Given `fieldNames`, the inputs post to the */\n/* host's own names, so a server form needs no change. */\n/* -------------------------------------------------------------------- */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { cva } from 'class-variance-authority';\nimport { Check, CircleAlert, Copy, KeyRound, Send } from 'lucide-react';\nimport { CodeBlock } from '../../components/_shared/code-block';\nimport { Accordion } from '../../components/accordion';\nimport { Alert } from '../../components/alert';\nimport { Badge } from '../../components/badge';\nimport { Button, IconButton } from '../../components/button';\nimport { Card } from '../../components/card';\nimport { Checkbox } from '../../components/checkbox';\nimport { FieldArray } from '../../components/field-array';\nimport { FormField } from '../../components/form-field';\nimport { PasswordInput } from '../../components/password-input';\nimport { TextInput } from '../../components/text-input';\nimport { TokenInsertMenu } from '../../components/token-insert-menu';\nimport { useCopyToClipboard } from '../../hooks/use-copy-to-clipboard';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\n/** The fields of the step, in the order they appear. */\nexport const WORKFLOW_WEBHOOK_ACTION_FIELDS = [\n 'url',\n 'secret',\n 'legalBasisConfirmed',\n 'parameters',\n] as const;\n\nexport type WorkflowWebhookActionField =\n (typeof WORKFLOW_WEBHOOK_ACTION_FIELDS)[number];\n\n/** One parameter value as the platform stores it: a flat scalar. */\nexport type WorkflowWebhookParameterValue = string | number | boolean | null;\n\n/** What the step holds now. Mirrors the platform's\n * `SendHttpRequestWorkflowActionDto`. */\nexport interface WorkflowWebhookActionValues {\n /** Where the message goes: platform `url`. */\n url: string;\n /**\n * A new signing secret: platform `secret`, stored encrypted as\n * `encryptedSecret`. Empty means \"keep the saved one\". The server never\n * sends a saved secret back.\n */\n secret: string;\n /** The extra parameters: platform `parameters`, a flat map of scalars. */\n parameters: Record<string, WorkflowWebhookParameterValue>;\n /** The consent box: platform `legalBasisConfirmed`. */\n legalBasisConfirmed: boolean;\n}\n\n/** Values to show when the fields open. There is no secret here, on\n * purpose: a saved secret is never sent back to the browser. */\nexport type WorkflowWebhookActionInitialValues = Partial<\n Omit<WorkflowWebhookActionValues, 'secret'>\n>;\n\n/** Messages from the server, already translated, one per field. */\nexport type WorkflowWebhookActionErrors = Partial<\n Record<WorkflowWebhookActionField, string>\n>;\n\n/** The host's own form field names, for a native form post. */\nexport type WorkflowWebhookActionFieldNames = Record<\n WorkflowWebhookActionField,\n string\n>;\n\n/** A variable the user can insert into a parameter value. */\nexport interface WorkflowWebhookActionPlaceholder {\n /** The code the server replaces, such as `[[NOME]]`. */\n value: string;\n /** What the user reads, translated, such as \"First name\". */\n label: string;\n}\n\n/**\n * What a test message got back, as the host's server saw it.\n * `answered`: the app replied with this HTTP status. `unreachable`: no\n * reply at all (the address does not resolve, refuses, times out or has\n * no valid certificate). `message` replaces the fields' own words, already\n * translated, when the server knows better.\n */\nexport type WorkflowWebhookTestResult =\n | { outcome: 'answered'; status: number; message?: string }\n | { outcome: 'unreachable'; message?: string };\n\nexport interface WorkflowWebhookActionProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'children' | 'onChange'\n> {\n /**\n * Host content above the fields, such as the plan notice (\"Included in\n * the trial and the Elite plans\"). Nothing in it is posted.\n */\n children?: ReactNode;\n /**\n * Values to show when the fields open. Read once. Parameters keep the\n * order and the names they are given; a number beyond\n * `Number.MAX_SAFE_INTEGER` has already lost precision by the time it\n * arrives here.\n */\n initialValues?: WorkflowWebhookActionInitialValues;\n /**\n * True when the step already has a secret. The secret field is then\n * optional: left empty, the saved secret stays.\n */\n hasSavedSecret?: boolean;\n /**\n * Messages from the server, already translated. A field's message shows\n * until the user changes that field; when the fields open with\n * messages, focus goes to the first one. A message on `parameters`\n * opens the Advanced section.\n *\n * A React host keeps `errors` in state: each new object is a new answer\n * from the server, shown even when its words match the last one.\n */\n errors?: WorkflowWebhookActionErrors;\n /**\n * For a native form post: the host's own field names. The parameters\n * post as one JSON object, or an empty string when there are none. The\n * consent box posts `1` when ticked and nothing when not. The fields\n * must sit inside the host's `<form>`.\n */\n fieldNames?: WorkflowWebhookActionFieldNames;\n /**\n * The variables the user can insert into a parameter value, listed in\n * Advanced with a copy button each. Default: the three the platform\n * replaces in a webhook step (salutation, first name, last name), with\n * the kit's own labels. An empty list hides the menu and the list.\n */\n placeholders?: ReadonlyArray<WorkflowWebhookActionPlaceholder>;\n /**\n * Shows \"Send test\". Called with the values when the user asks for a\n * test, once the address and the secret pass their checks; the host's\n * server sends a sample message (invented IDs, no patient data, marked\n * as a test) signed with that secret, or with the saved one when\n * `secret` is empty, and resolves with what came back. A rejected\n * promise reads as \"the test could not be sent\". Without it, no button.\n */\n onSendTest?: (\n values: WorkflowWebhookActionValues,\n ) => Promise<WorkflowWebhookTestResult>;\n /** For React hosts: called with the values after each change. */\n onValueChange?: (values: WorkflowWebhookActionValues) => void;\n /**\n * How the \"What Alfadocs sends\" card lays out the message body and its\n * headers. `two-column` (default): side by side once the fields are\n * 720px wide; narrower, as on a phone, one above the other.\n * `one-column`: always one above the other, for a narrow card or a side\n * panel.\n */\n layout?: 'two-column' | 'one-column';\n}\n\n/* -------------------------------------------------------------------- */\n/* Styles */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva(\n 'ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-lg)] ds:text-start ds:text-[var(--foreground)]',\n);\n\n// Two columns: the fields side by side, read left to right.\n// Side by side when wide: two to a row, or three for the variables so\n// none of the three sits alone.\nconst fieldsGridVariants = cva(\n 'ds:m-0 ds:grid ds:gap-x-[var(--spacing-xl)] ds:gap-y-[var(--spacing-md)]',\n {\n variants: {\n columns: {\n 1: 'ds:grid-cols-1',\n 2: 'ds:grid-cols-2',\n 3: 'ds:grid-cols-3',\n },\n },\n defaultVariants: { columns: 1 },\n },\n);\n\nconst referenceSectionVariants = cva(\n 'ds:flex ds:min-w-0 ds:flex-col ds:gap-[var(--spacing-sm)]',\n);\n\nconst sectionHeadingVariants = cva('type-title-item ds:text-foreground');\n\nconst fieldNameVariants = cva(\n 'ds:min-w-0 ds:rounded-[var(--radius-sm)] ds:bg-[var(--muted)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:font-mono type-body-sm ds:text-foreground ds:[overflow-wrap:anywhere]',\n);\n\nconst helpVariants = cva('type-body-sm ds:text-muted-foreground');\n\nconst errorVariants = cva(\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-body-sm ds:text-destructive',\n);\n\nconst parameterRowVariants = cva(\n 'ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-sm)] ds:sm:grid-cols-2',\n);\n\n/* -------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------- */\n\n/** The platform posts only to an address that starts with exactly this:\n * `ResolveSafeDestinationService::isHttpsUrl`. */\nconst HTTPS = 'https://';\n\n/** The platform's limit on the address (`SendHttpRequestWorkflowActionType`). */\nconst URL_MAX_LENGTH = 2048;\n\n/** From this width the fields every message carries sit two to a row:\n * room for two readable descriptions. The pattern's own width, not the\n * window's, so it fits whatever space the host gives. */\nconst TWO_COLUMN_MIN_WIDTH = 720;\n\n/** The variables the platform replaces in a parameter value, the same in\n * every language: `GetPlaceholdersForContextService`, webhook context. */\nconst PLATFORM_VARIABLES = {\n salutation: '[[TITOLO]]',\n firstName: '[[NOME]]',\n lastName: '[[COGNOME]]',\n} as const;\n\n/* The example message. Its shape is the platform's\n * (`SendHttpRequestService`, `HmacSignature`); every value is invented. */\nconst EXAMPLE_IDEMPOTENCY_KEY = 'wf12-e345-a67';\nconst EXAMPLE_BODY = {\n sentAt: '2026-10-12T09:00:00+02:00',\n idempotencyKey: EXAMPLE_IDEMPOTENCY_KEY,\n practiceId: 1234,\n workflowId: 12,\n workflowActionId: 67,\n workflowEnrollmentId: 345,\n patientId: 5678,\n};\nconst EXAMPLE_HEADERS = [\n 'Content-Type: application/json',\n `X-AlfaDocs-Idempotency-Key: ${EXAMPLE_IDEMPOTENCY_KEY}`,\n 'X-AlfaDocs-Request-Timestamp: 1791788400000',\n 'X-AlfaDocs-Signature: sha256=9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08',\n].join('\\n');\n\ninterface ParameterRow {\n /** Opaque and stable for the row's life: never the name or value. */\n key: string;\n name: string;\n value: string;\n /** What the row arrived with, kept so a saved parameter posts back\n * exactly as it was: a number or boolean as one, not as text. */\n original?: { name: string; value: WorkflowWebhookParameterValue };\n}\n\nconst textOf = (value: WorkflowWebhookParameterValue): string =>\n value === null ? '' : String(value);\n\nconst isUntouched = (row: ParameterRow): boolean =>\n row.original !== undefined &&\n row.name === row.original.name &&\n row.value === textOf(row.original.value);\n\n/**\n * The rows as the server stores them, in the user's order. Names are kept\n * as typed. A new row without a name is left out: the checks stop a\n * submit before that can lose a value.\n */\nconst parameterEntries = (\n rows: ReadonlyArray<ParameterRow>,\n): Array<[string, WorkflowWebhookParameterValue]> =>\n rows.flatMap((row): Array<[string, WorkflowWebhookParameterValue]> => {\n if (row.original !== undefined && isUntouched(row)) {\n return [[row.original.name, row.original.value]];\n }\n if (row.name.trim() === '') return [];\n return [[row.name, row.value]];\n });\n\n/** One JSON object, written by hand so the order is the user's: a plain\n * object would move number-like names to the front. */\nconst parametersJsonOf = (\n entries: ReadonlyArray<[string, WorkflowWebhookParameterValue]>,\n): string =>\n entries.length === 0\n ? ''\n : `{${entries\n .map(\n ([name, value]) => `${JSON.stringify(name)}:${JSON.stringify(value)}`,\n )\n .join(',')}}`;\n\n/** 32 random bytes as hex: 64 characters the receiving app can store. */\nconst generateSecret = (): string => {\n const bytes = new Uint8Array(32);\n globalThis.crypto.getRandomValues(bytes);\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join(\n '',\n );\n};\n\ntype FocusTarget =\n | {\n kind:\n | 'url'\n | 'secret'\n | 'legal'\n | 'copy'\n | 'add'\n | 'parametersError'\n | 'sendTest';\n }\n | { kind: 'parameter'; key: string };\n\n/** Where focus goes when the fields open with the server's messages. */\nconst firstServerMessage = (\n errors: WorkflowWebhookActionErrors | undefined,\n): FocusTarget | null => {\n if (errors?.url) return { kind: 'url' };\n if (errors?.secret) return { kind: 'secret' };\n if (errors?.legalBasisConfirmed) return { kind: 'legal' };\n if (errors?.parameters) return { kind: 'parametersError' };\n return null;\n};\n\ninterface SentFieldProps {\n /** The field or header name, as the receiving app reads it. */\n name: string;\n /** What it holds, in plain words. */\n description: string;\n /** Told whether the copy worked, so the fields can say so. */\n onCopied: (copied: boolean) => void;\n}\n\n/** One field every message carries: its name to copy, then its meaning.\n * Renders a `<dl>` group, so it sits inside a `<dl>`. */\nfunction SentField({ name, description, onCopied }: SentFieldProps) {\n const { t } = useTranslation('ui');\n // \"Copy [[NOME]]\" alone does not say what it is: the meaning describes it.\n const descriptionId = useId();\n const { status, copy } = useCopyToClipboard();\n const copied = status === 'copied';\n const failed = status === 'error';\n return (\n <div className=\"ds:flex ds:min-w-0 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <dt className=\"ds:flex ds:min-w-0 ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n <code dir=\"ltr\" className={fieldNameVariants()}>\n {name}\n </code>\n <IconButton\n icon={copied ? <Check /> : failed ? <CircleAlert /> : <Copy />}\n size=\"sm\"\n intent=\"ghost\"\n aria-label={t('keyValuePair.copy', { label: name })}\n aria-describedby={descriptionId}\n data-action=\"copy-field\"\n data-copied={copied ? 'true' : undefined}\n onClick={() => void copy(name).then(onCopied)}\n />\n {/* Seen, not heard: the fields announce the copy once. */}\n {copied ? (\n <span aria-hidden=\"true\" className=\"type-body-sm ds:text-success\">\n {t('copyField.copied')}\n </span>\n ) : failed ? (\n <span aria-hidden=\"true\" className=\"type-body-sm ds:text-destructive\">\n {t('copyField.copyFailed')}\n </span>\n ) : null}\n </dt>\n <dd\n id={descriptionId}\n className=\"ds:m-0 type-body-sm ds:text-muted-foreground\"\n >\n {description}\n </dd>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\n/**\n * The fields of a workflow's webhook step. Mount it inside the host's\n * form, between the page title and the Save button.\n */\nexport const WorkflowWebhookAction = forwardRef<\n HTMLDivElement,\n WorkflowWebhookActionProps\n>(\n (\n {\n children,\n initialValues,\n hasSavedSecret = false,\n errors,\n fieldNames,\n placeholders,\n onSendTest,\n onValueChange,\n layout = 'two-column',\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n\n // Every message's fields, in the order the receiving app most likely\n // needs them: the body the platform's `SendHttpRequestService` builds.\n const sentFields: ReadonlyArray<readonly [string, string]> = [\n ['patientId', t('workflowWebhookAction.sent.patientId')],\n ['practiceId', t('workflowWebhookAction.sent.practiceId')],\n ['workflowId', t('workflowWebhookAction.sent.workflowId')],\n ['workflowActionId', t('workflowWebhookAction.sent.workflowActionId')],\n [\n 'workflowEnrollmentId',\n t('workflowWebhookAction.sent.workflowEnrollmentId'),\n ],\n ['sentAt', t('workflowWebhookAction.sent.sentAt')],\n ['idempotencyKey', t('workflowWebhookAction.sent.idempotencyKey')],\n ['parameters', t('workflowWebhookAction.sent.parameters')],\n ];\n // Every message's headers: the platform's `HmacSignature` and sender.\n const sentHeaders: ReadonlyArray<readonly [string, string]> = [\n ['X-AlfaDocs-Signature', t('workflowWebhookAction.headers.signature')],\n [\n 'X-AlfaDocs-Request-Timestamp',\n t('workflowWebhookAction.headers.timestamp'),\n ],\n [\n 'X-AlfaDocs-Idempotency-Key',\n t('workflowWebhookAction.headers.idempotency'),\n ],\n ];\n const legalErrorId = useId();\n const bodyLabelId = useId();\n const headersLabelId = useId();\n const variablesLabelId = useId();\n const testHelpId = useId();\n\n // The variables a value may carry: the host's, or the platform's three.\n const variables: ReadonlyArray<WorkflowWebhookActionPlaceholder> =\n placeholders ?? [\n {\n value: PLATFORM_VARIABLES.salutation,\n label: t('workflowWebhookAction.variableSalutation'),\n },\n {\n value: PLATFORM_VARIABLES.firstName,\n label: t('workflowWebhookAction.variableFirstName'),\n },\n {\n value: PLATFORM_VARIABLES.lastName,\n label: t('workflowWebhookAction.variableLastName'),\n },\n ];\n\n /* ------------------------------ State ----------------------------- */\n\n const keyCounter = useRef(0);\n const nextKey = () => {\n keyCounter.current += 1;\n return `parameter-${keyCounter.current}`;\n };\n\n const [url, setUrl] = useState(() => initialValues?.url ?? '');\n const [secret, setSecret] = useState('');\n // True from a generated secret until the user changes it: the field\n // then says to copy it into the app now.\n const [generated, setGenerated] = useState(false);\n const [rows, setRows] = useState<ParameterRow[]>(() =>\n Object.entries(initialValues?.parameters ?? {}).map(([name, value]) => {\n keyCounter.current += 1;\n return {\n key: `parameter-${keyCounter.current}`,\n name,\n value: textOf(value),\n original: { name, value },\n };\n }),\n );\n const [legal, setLegal] = useState(\n () => initialValues?.legalBasisConfirmed ?? false,\n );\n const [advancedOpen, setAdvancedOpen] = useState(\n () =>\n Object.keys(initialValues?.parameters ?? {}).length > 0 ||\n Boolean(errors?.parameters),\n );\n\n // A field the user has left, and whether a submit has been tried. A\n // message shows once either is true.\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n const [submitted, setSubmitted] = useState(false);\n const [serverErrors, setServerErrors] =\n useState<WorkflowWebhookActionErrors>(() => errors ?? {});\n const [announcement, setAnnouncement] = useState('');\n // The server has answered with messages: focus goes to the first, and\n // the rest stay quiet, as after a refused submit.\n // A test stopped at a field: focus reads its message, the rest stay\n // quiet, as after a refused submit.\n const [testChecked, setTestChecked] = useState(false);\n const [answered, setAnswered] = useState(() =>\n Object.values(errors ?? {}).some(Boolean),\n );\n\n // A new `errors` object is a new answer from the server.\n const lastErrors = useRef(errors);\n useEffect(() => {\n if (errors === lastErrors.current) return;\n lastErrors.current = errors;\n setServerErrors(errors ?? {});\n if (errors?.parameters) setAdvancedOpen(true);\n setAnswered(Object.values(errors ?? {}).some(Boolean));\n setFocusRequest(firstServerMessage(errors));\n }, [errors]);\n\n const leave = (field: string) =>\n setTouched((previous) =>\n previous[field] ? previous : { ...previous, [field]: true },\n );\n // The server's message was about the old value.\n const forget = (field: WorkflowWebhookActionField) =>\n setServerErrors((previous) =>\n previous[field] ? { ...previous, [field]: undefined } : previous,\n );\n\n /* ---------------------------- Refs -------------------------------- */\n\n const rootRef = useRef<HTMLDivElement | null>(null);\n const urlInput = useRef<HTMLInputElement>(null);\n const secretInput = useRef<HTMLInputElement>(null);\n const copyButton = useRef<HTMLButtonElement>(null);\n const sendTestButton = useRef<HTMLButtonElement>(null);\n const parametersError = useRef<HTMLDivElement>(null);\n const legalBox = useRef<HTMLButtonElement>(null);\n const liveRegion = useRef<HTMLSpanElement>(null);\n const nameInputs = useRef(new Map<string, HTMLInputElement>());\n const valueInputs = useRef(new Map<string, HTMLInputElement>());\n // Values the user has been in. An input keeps its caret when it loses\n // focus, so a detail goes where the user left off; a value never\n // visited gets it at the end.\n const visitedValues = useRef(new Set<string>());\n // Where the caret goes after an insert, once the new value is drawn.\n const pendingCaret = useRef<{ key: string; position: number } | null>(null);\n useEffect(() => {\n const pending = pendingCaret.current;\n if (!pending) return;\n pendingCaret.current = null;\n valueInputs.current\n .get(pending.key)\n ?.setSelectionRange(pending.position, pending.position);\n });\n\n // Measured before the first paint, so the layout never jumps.\n const [fitsTwoColumns, setFitsTwoColumns] = useState(false);\n useIsomorphicLayoutEffect(() => {\n const node = rootRef.current;\n if (!node) return;\n const measure = () =>\n setFitsTwoColumns(\n node.getBoundingClientRect().width >= TWO_COLUMN_MIN_WIDTH,\n );\n measure();\n if (typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(measure);\n observer.observe(node);\n return () => observer.disconnect();\n }, []);\n\n const twoColumns = layout === 'two-column' && fitsTwoColumns;\n\n const setRootRef = useCallback(\n (node: HTMLDivElement | null) => {\n rootRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref],\n );\n\n /**\n * Says something to a screen reader. Cleared first, so the same words\n * twice are read twice. While a menu is open the rest of the page is\n * hidden from screen readers, so the words wait until it has closed.\n */\n const announce = (message: string) => {\n setAnnouncement('');\n let frames = 0;\n const speak = () => {\n const hidden = liveRegion.current?.closest('[aria-hidden=\"true\"]');\n if (hidden && frames < 60) {\n frames += 1;\n window.requestAnimationFrame(speak);\n return;\n }\n setAnnouncement(message);\n };\n window.requestAnimationFrame(speak);\n };\n\n /* ---------------------------- Validation -------------------------- */\n\n const urlProblem = (): string | undefined => {\n const value = url.trim();\n if (value === '') return t('workflowWebhookAction.urlRequired');\n let parsed: URL;\n try {\n parsed = new URL(value);\n } catch {\n return t('workflowWebhookAction.urlInvalid');\n }\n if (!value.startsWith(HTTPS)) return t('workflowWebhookAction.urlHttps');\n if (parsed.hostname === '') return t('workflowWebhookAction.urlInvalid');\n if (parsed.username !== '' || parsed.password !== '') {\n return t('workflowWebhookAction.urlCredentials');\n }\n return undefined;\n };\n\n const secretProblem = (): string | undefined =>\n secret.trim() === '' && !hasSavedSecret\n ? t('workflowWebhookAction.secretRequired')\n : undefined;\n\n /** Per row key: a value with no name, or a name used twice. A saved\n * parameter left as it was is never stopped. */\n const rowProblems = (): Map<string, string> => {\n const problems = new Map<string, string>();\n // Every name the post would carry, whatever its row's position: a\n // later saved parameter must stop an edit above it taking its name.\n const counts = new Map<string, number>();\n for (const row of rows) {\n const name = isUntouched(row)\n ? row.name\n : row.name.trim() === ''\n ? null\n : row.name;\n if (name !== null) counts.set(name, (counts.get(name) ?? 0) + 1);\n }\n for (const row of rows) {\n // A saved parameter left as it was is never stopped; the row the\n // user changed is the one to fix.\n if (isUntouched(row)) continue;\n if (row.name.trim() === '') {\n if (row.value !== '')\n problems.set(\n row.key,\n t('workflowWebhookAction.parameterNameRequired'),\n );\n continue;\n }\n if ((counts.get(row.name) ?? 0) > 1)\n problems.set(\n row.key,\n t('workflowWebhookAction.parameterNameDuplicate'),\n );\n }\n return problems;\n };\n\n const legalProblem = (): string | undefined =>\n legal ? undefined : t('workflowWebhookAction.legalBasisRequired');\n\n const due = (field: string) => submitted || touched[field] === true;\n const rowsWithProblems = rowProblems();\n\n const urlError =\n serverErrors.url ?? (due('url') ? urlProblem() : undefined);\n const secretError =\n serverErrors.secret ?? (due('secret') ? secretProblem() : undefined);\n const legalError =\n serverErrors.legalBasisConfirmed ??\n (submitted ? legalProblem() : undefined);\n const rowError = (key: string) =>\n due(`parameter:${key}`) ? rowsWithProblems.get(key) : undefined;\n // After a refused submit focus lands on the first problem, which reads\n // its own message; the others stay quiet rather than all speaking at\n // once. Each is still read when its field has focus.\n const announceErrors = !submitted && !answered && !testChecked;\n\n /** The first field a submit must stop at, in the order they appear. */\n const firstProblem = (): FocusTarget | undefined => {\n if (urlProblem()) return { kind: 'url' };\n if (secretProblem()) return { kind: 'secret' };\n if (legalProblem()) return { kind: 'legal' };\n const row = rows.find((candidate) => rowsWithProblems.has(candidate.key));\n return row ? { kind: 'parameter', key: row.key } : undefined;\n };\n const firstProblemRef = useRef(firstProblem);\n firstProblemRef.current = firstProblem;\n\n /* ------------------------------ Focus ----------------------------- */\n\n // A new object for each request, so asking twice moves focus twice. The\n // effect runs after the change is drawn: a new row, an opened section.\n // A page the server rendered after a refused save opens on its first\n // message.\n const [focusRequest, setFocusRequest] = useState<FocusTarget | null>(() =>\n firstServerMessage(errors),\n );\n useEffect(() => {\n if (!focusRequest) return;\n const target: HTMLElement | null | undefined = (() => {\n switch (focusRequest.kind) {\n case 'url':\n return urlInput.current;\n case 'secret':\n return secretInput.current;\n case 'legal':\n return legalBox.current;\n case 'sendTest':\n return sendTestButton.current;\n case 'copy':\n return copyButton.current;\n case 'parametersError':\n return parametersError.current;\n case 'add':\n return rootRef.current?.querySelector<HTMLElement>(\n '[data-slot=\"parameters\"] [data-component=\"field-array\"] > button',\n );\n case 'parameter':\n return nameInputs.current.get(focusRequest.key);\n }\n })();\n target?.focus();\n }, [focusRequest]);\n\n /* ------------------------------ Submit ---------------------------- */\n\n // The host owns the form. Its submit is stopped here while a field has\n // a problem, and focus goes to the first one. A React host's own\n // submit handler should return early when `event.defaultPrevented`.\n // A script that calls `form.submit()` skips this check; the server's\n // own checks still apply.\n useEffect(() => {\n const form = rootRef.current?.closest('form');\n if (!form) return;\n const onSubmit = (event: SubmitEvent) => {\n const first = firstProblemRef.current();\n if (!first) return;\n event.preventDefault();\n setSubmitted(true);\n if (first.kind === 'parameter') setAdvancedOpen(true);\n setFocusRequest({ ...first });\n };\n form.addEventListener('submit', onSubmit);\n return () => form.removeEventListener('submit', onSubmit);\n }, []);\n\n /* ---------------------------- Host sync --------------------------- */\n\n const entries = parameterEntries(rows);\n const parametersJson = parametersJsonOf(entries);\n\n const onValueChangeRef = useRef(onValueChange);\n onValueChangeRef.current = onValueChange;\n // `rows` changes identity on every keystroke; the JSON says when the\n // parameters really changed.\n const entriesRef = useRef(entries);\n entriesRef.current = entries;\n const mounted = useRef(false);\n useEffect(() => {\n if (!mounted.current) {\n mounted.current = true;\n return;\n }\n onValueChangeRef.current?.({\n url,\n secret,\n parameters: Object.fromEntries(entriesRef.current),\n legalBasisConfirmed: legal,\n });\n }, [url, secret, parametersJson, legal]);\n\n /* ----------------------------- Secret ----------------------------- */\n\n // The secret lives in one password field, which keeps it out of the\n // page's markup: never in a `value` attribute, never in a hidden input\n // a copied page or a session recording could read.\n const {\n status: copyStatus,\n copiedValue,\n copy,\n reset: resetCopy,\n } = useCopyToClipboard();\n // \"Copied\" only for the secret in the field now: a new one is not yet\n // in the receiving app.\n const secretCopied = copyStatus === 'copied' && copiedValue === secret;\n const secretCopyFailed = copyStatus === 'error';\n\n const generateNewSecret = () => {\n resetCopy();\n setSecret(generateSecret());\n setGenerated(true);\n forget('secret');\n announce(t('workflowWebhookAction.secretGenerated'));\n setFocusRequest({ kind: 'copy' });\n };\n\n /* ---------------------------- Send test --------------------------- */\n\n type TestState =\n | { kind: 'idle' | 'sending' | 'failed' }\n | { kind: 'done'; result: WorkflowWebhookTestResult };\n const [test, setTest] = useState<TestState>({ kind: 'idle' });\n // A newer test, or a change to what was tested, makes an older answer\n // stale: it is dropped when it arrives.\n const testRun = useRef(0);\n\n const sendTest = async () => {\n if (!onSendTest) return;\n // The two fields a test needs, checked as a save checks them.\n const problem = urlProblem() ? 'url' : secretProblem() ? 'secret' : null;\n if (problem) {\n leave('url');\n leave('secret');\n setTestChecked(true);\n setFocusRequest({ kind: problem });\n return;\n }\n testRun.current += 1;\n const run = testRun.current;\n setTest({ kind: 'sending' });\n try {\n const result = await onSendTest({\n url: url.trim(),\n secret: secretInput.current?.value ?? secret,\n parameters: Object.fromEntries(entries),\n legalBasisConfirmed: legal,\n });\n if (run === testRun.current) finishTest({ kind: 'done', result });\n } catch {\n if (run === testRun.current) finishTest({ kind: 'failed' });\n }\n };\n\n // The answer is said once through the fields' own live region: a\n // result that arrives already filled in is not reliably read. Focus\n // goes back to the button when it was lost while it was busy.\n const finishTest = (next: TestState) => {\n setTest(next);\n const outcome = describeTest(next);\n if (outcome) announce(outcome.text);\n const active = document.activeElement;\n if (!active || active === document.body) {\n setFocusRequest({ kind: 'sendTest' });\n }\n };\n\n // What was tested has changed: the answer no longer applies.\n const testedText = `${url}\\n${secret}\\n${parametersJson}`;\n const lastTestedText = useRef(testedText);\n useEffect(() => {\n if (testedText === lastTestedText.current) return;\n lastTestedText.current = testedText;\n testRun.current += 1;\n setTest((previous) =>\n previous.kind === 'idle' ? previous : { kind: 'idle' },\n );\n }, [testedText]);\n\n /** The answer in words, and whether it is good news. */\n const describeTest = (\n state: TestState,\n ): { ok: boolean; text: string } | null => {\n if (state.kind === 'failed') {\n return { ok: false, text: t('workflowWebhookAction.testFailed') };\n }\n if (state.kind !== 'done') return null;\n const { result } = state;\n const ok =\n result.outcome === 'answered' &&\n result.status >= 200 &&\n result.status < 300;\n if (result.message) return { ok, text: result.message };\n if (result.outcome === 'unreachable') {\n return { ok, text: t('workflowWebhookAction.testUnreachable') };\n }\n if (ok) {\n return {\n ok,\n text: t('workflowWebhookAction.testSent', { status: result.status }),\n };\n }\n return {\n ok,\n text:\n result.status === 401 || result.status === 403\n ? t('workflowWebhookAction.testCheckSecret', {\n status: result.status,\n })\n : t('workflowWebhookAction.testRejected', {\n status: result.status,\n }),\n };\n };\n\n const copySecret = async () => {\n const ok = await copy(secretInput.current?.value ?? secret);\n announce(ok ? t('copyField.copySuccess') : t('copyField.copyFailed'));\n };\n\n /* --------------------------- Parameters --------------------------- */\n\n const updateRow = (key: string, patch: Partial<ParameterRow>) => {\n setRows((previous) =>\n previous.map((row) => (row.key === key ? { ...row, ...patch } : row)),\n );\n forget('parameters');\n };\n\n const addRow = () => {\n const key = nextKey();\n setRows((previous) => [...previous, { key, name: '', value: '' }]);\n setFocusRequest({ kind: 'parameter', key });\n };\n\n const removeRow = (index: number) => {\n const next = rows.filter((_, position) => position !== index);\n const removed = rows[index];\n if (removed) {\n nameInputs.current.delete(removed.key);\n valueInputs.current.delete(removed.key);\n visitedValues.current.delete(removed.key);\n }\n setRows(next);\n forget('parameters');\n const neighbour = next[index] ?? next[index - 1];\n setFocusRequest(\n neighbour ? { kind: 'parameter', key: neighbour.key } : { kind: 'add' },\n );\n };\n\n const insertPlaceholder = (row: ParameterRow, token: string) => {\n const input = valueInputs.current.get(row.key);\n const visited = input !== undefined && visitedValues.current.has(row.key);\n const start = visited\n ? (input.selectionStart ?? row.value.length)\n : row.value.length;\n const end = visited ? (input.selectionEnd ?? start) : start;\n const value = row.value.slice(0, start) + token + row.value.slice(end);\n pendingCaret.current = { key: row.key, position: start + token.length };\n updateRow(row.key, { value });\n const label = variables.find((item) => item.value === token)?.label;\n announce(\n t('workflowWebhookAction.placeholderInserted', {\n detail: label ?? token,\n }),\n );\n };\n\n /* ------------------------------ Render ---------------------------- */\n\n const announceCopy = (copied: boolean) =>\n announce(copied ? t('copyField.copySuccess') : t('copyField.copyFailed'));\n\n /** The fields of one part of the message, each with its name to copy. */\n const renderFields = (\n labelId: string,\n items: ReadonlyArray<readonly [string, string]>,\n wideColumns: 2 | 3 = 2,\n ) => (\n <dl\n aria-labelledby={labelId}\n className={fieldsGridVariants({\n columns: twoColumns ? wideColumns : 1,\n })}\n >\n {items.map(([name, description]) => (\n <SentField\n key={name}\n name={name}\n description={description}\n onCopied={announceCopy}\n />\n ))}\n </dl>\n );\n\n // The example body carries the user's own parameters, as sent.\n const exampleBody = JSON.stringify(\n { ...EXAMPLE_BODY, parameters: Object.fromEntries(entries) },\n null,\n 2,\n );\n\n /** What every message carries, for whoever sets up the receiving app:\n * each part with an example to copy, then each field to copy. */\n const reference = (\n <div\n data-columns={twoColumns ? 2 : 1}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xl)]\"\n >\n <div className={referenceSectionVariants()}>\n <h4 id={bodyLabelId} className={sectionHeadingVariants()}>\n {t('workflowWebhookAction.bodyHeading')}\n </h4>\n <p className={helpVariants()}>\n {t('workflowWebhookAction.sentDescription')}\n </p>\n <CodeBlock\n language=\"json\"\n code={exampleBody}\n copyLabel={t('workflowWebhookAction.copyBody')}\n />\n {renderFields(bodyLabelId, sentFields)}\n </div>\n\n <div className={referenceSectionVariants()}>\n <h4 id={headersLabelId} className={sectionHeadingVariants()}>\n {t('workflowWebhookAction.headersHeading')}\n </h4>\n <p className={helpVariants()}>\n {t('workflowWebhookAction.headersDescription')}\n </p>\n <CodeBlock\n language=\"http\"\n code={EXAMPLE_HEADERS}\n copyLabel={t('workflowWebhookAction.copyHeaders')}\n />\n {renderFields(headersLabelId, sentHeaders)}\n </div>\n </div>\n );\n\n const native = fieldNames !== undefined;\n const secretDescription = generated\n ? t('workflowWebhookAction.generatedNotice')\n : hasSavedSecret\n ? t('workflowWebhookAction.secretSavedDescription')\n : t('workflowWebhookAction.secretDescription');\n\n return (\n <div\n ref={setRootRef}\n {...rest}\n data-component=\"workflow-webhook-action\"\n data-layout={twoColumns ? 'two-column' : 'one-column'}\n className={rootVariants({ className })}\n >\n {children ? (\n <div\n data-slot=\"host-content\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n {children}\n </div>\n ) : null}\n\n <p className={helpVariants()}>{t('workflowWebhookAction.intro')}</p>\n\n <FormField\n label={t('workflowWebhookAction.url')}\n description={t('workflowWebhookAction.urlDescription')}\n required\n error={urlError}\n announceError={announceErrors}\n data-field=\"url\"\n >\n {/* Text, not `type=\"url\"`: the browser's own check would stop\n the host's form with its own message before ours. An address\n reads left to right in every language. */}\n <TextInput\n ref={urlInput}\n name={native ? fieldNames.url : undefined}\n dir=\"ltr\"\n inputMode=\"url\"\n autoComplete=\"off\"\n spellCheck={false}\n maxLength={URL_MAX_LENGTH}\n placeholder=\"https://\"\n value={url}\n onChange={(event) => {\n setUrl(event.target.value);\n forget('url');\n }}\n onBlur={(event) => {\n if (event.target.value !== '') leave('url');\n }}\n />\n </FormField>\n\n <div\n data-field=\"secret\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n <FormField\n label={t('workflowWebhookAction.secret')}\n description={secretDescription}\n {...(hasSavedSecret ? { optional: true } : { required: true })}\n error={secretError}\n announceError={announceErrors}\n >\n <PasswordInput\n ref={secretInput}\n // PasswordInput names itself \"password\" when given no name.\n name={native ? fieldNames.secret : ''}\n dir=\"ltr\"\n autoComplete=\"new-password\"\n spellCheck={false}\n value={secret}\n onChange={(event) => {\n setSecret(event.target.value);\n setGenerated(false);\n resetCopy();\n forget('secret');\n }}\n onBlur={(event) => {\n if (event.target.value !== '') leave('secret');\n }}\n />\n </FormField>\n <div className=\"ds:flex ds:flex-wrap ds:gap-[var(--spacing-xs)]\">\n <Button\n type=\"button\"\n intent=\"outline\"\n size=\"sm\"\n startIcon={<KeyRound />}\n data-action=\"generate-secret\"\n onClick={generateNewSecret}\n >\n {t('workflowWebhookAction.generate')}\n </Button>\n <Button\n ref={copyButton}\n type=\"button\"\n intent=\"outline\"\n size=\"sm\"\n disabled={secret === ''}\n startIcon={\n secretCopied ? (\n <Check />\n ) : secretCopyFailed ? (\n <CircleAlert />\n ) : (\n <Copy />\n )\n }\n data-action=\"copy-secret\"\n data-copied={secretCopied ? 'true' : undefined}\n onClick={() => void copySecret()}\n >\n {secretCopied\n ? t('copyField.copied')\n : secretCopyFailed\n ? t('copyField.copyFailed')\n : t('workflowWebhookAction.copySecret')}\n </Button>\n </div>\n </div>\n\n {onSendTest ? (\n <div\n data-slot=\"send-test\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n <p id={testHelpId} className={helpVariants()}>\n {t('workflowWebhookAction.testDescription')}\n </p>\n <Button\n ref={sendTestButton}\n type=\"button\"\n intent=\"outline\"\n size=\"sm\"\n startIcon={<Send />}\n loading={test.kind === 'sending'}\n aria-describedby={testHelpId}\n className=\"ds:self-start\"\n data-action=\"send-test\"\n onClick={() => void sendTest()}\n >\n {t('workflowWebhookAction.sendTest')}\n </Button>\n {(() => {\n const outcome = describeTest(test);\n return outcome ? (\n <Alert\n variant={outcome.ok ? 'success' : 'error'}\n announce=\"off\"\n data-slot=\"test-result\"\n data-test-ok={outcome.ok ? 'true' : 'false'}\n >\n <Alert.Description>{outcome.text}</Alert.Description>\n </Alert>\n ) : null;\n })()}\n </div>\n ) : null}\n\n <div\n data-field=\"legalBasisConfirmed\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n <Checkbox\n ref={legalBox}\n name={native ? fieldNames.legalBasisConfirmed : undefined}\n value=\"1\"\n checked={legal}\n onCheckedChange={(next) => {\n setLegal(next === true);\n forget('legalBasisConfirmed');\n }}\n aria-required=\"true\"\n aria-invalid={legalError ? true : undefined}\n aria-describedby={legalError ? legalErrorId : undefined}\n label={t('workflowWebhookAction.legalBasis')}\n />\n {legalError ? (\n <p\n id={legalErrorId}\n role={announceErrors ? 'alert' : undefined}\n data-slot=\"error\"\n className={errorVariants()}\n >\n <CircleAlert\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:shrink-0\"\n />\n <span>{legalError}</span>\n </p>\n ) : null}\n </div>\n\n {/* Outside the section: closed, its content is not in the page,\n and the parameters must still be posted. */}\n {native ? (\n <input\n type=\"hidden\"\n name={fieldNames.parameters}\n value={parametersJson}\n />\n ) : null}\n\n <div data-field=\"parameters\" data-slot=\"parameters\">\n {/* The elevated card, like the host page's own card. */}\n <Card variant=\"elevated\">\n <Accordion\n type=\"single\"\n collapsible\n value={advancedOpen ? 'advanced' : ''}\n onValueChange={(value: string) =>\n setAdvancedOpen(value === 'advanced')\n }\n >\n <Accordion.Item value=\"advanced\">\n <Accordion.Trigger data-action=\"toggle-advanced\">\n <span className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span>{t('workflowWebhookAction.advanced')}</span>\n {entries.length > 0 ? (\n <Badge variant=\"neutral\" size=\"md\">\n {t('workflowWebhookAction.parameterCount', {\n total: entries.length,\n })}\n </Badge>\n ) : null}\n </span>\n </Accordion.Trigger>\n <Accordion.Content>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]\">\n <p className={helpVariants()}>\n {t('workflowWebhookAction.advancedDescription')}\n </p>\n\n {serverErrors.parameters ? (\n <div\n ref={parametersError}\n tabIndex={-1}\n data-slot=\"error\"\n className=\"ds:outline-none\"\n >\n <Alert variant=\"error\" announce=\"off\">\n <Alert.Description>\n {serverErrors.parameters}\n </Alert.Description>\n </Alert>\n </div>\n ) : null}\n\n <FieldArray\n legend={t('workflowWebhookAction.parametersLegend')}\n items={rows}\n addLabel={t('workflowWebhookAction.addParameter')}\n removeItemLabel={(index) =>\n t('workflowWebhookAction.removeParameter', {\n number: index + 1,\n })\n }\n onAdd={addRow}\n onRemove={removeRow}\n renderItem={(row, index) => (\n <div\n data-parameter-id={row.key}\n className={parameterRowVariants()}\n >\n <FormField\n label={t('workflowWebhookAction.parameterName')}\n error={rowError(row.key)}\n announceError={announceErrors}\n >\n <TextInput\n ref={(node) => {\n if (node) nameInputs.current.set(row.key, node);\n }}\n aria-label={t(\n 'workflowWebhookAction.parameterNameOf',\n { number: index + 1 },\n )}\n dir=\"auto\"\n autoComplete=\"off\"\n spellCheck={false}\n value={row.name}\n onChange={(event) =>\n updateRow(row.key, { name: event.target.value })\n }\n onBlur={() => leave(`parameter:${row.key}`)}\n />\n </FormField>\n <FormField\n label={t('workflowWebhookAction.parameterValue')}\n >\n <TextInput\n ref={(node) => {\n if (node)\n valueInputs.current.set(row.key, node);\n }}\n aria-label={t(\n 'workflowWebhookAction.parameterValueOf',\n { number: index + 1 },\n )}\n dir=\"auto\"\n autoComplete=\"off\"\n value={row.value}\n onChange={(event) =>\n updateRow(row.key, {\n value: event.target.value,\n })\n }\n onFocus={() => visitedValues.current.add(row.key)}\n />\n </FormField>\n {variables.length > 0 ? (\n <div className=\"ds:sm:col-span-2\">\n <TokenInsertMenu\n tokens={variables.map((item) => ({\n value: item.value,\n label: item.label,\n }))}\n triggerLabel={t(\n 'workflowWebhookAction.insertDetail',\n )}\n onInsert={(token) =>\n insertPlaceholder(row, token)\n }\n />\n </div>\n ) : null}\n </div>\n )}\n />\n\n {variables.length > 0 ? (\n <div className={referenceSectionVariants()}>\n <h4\n id={variablesLabelId}\n className={sectionHeadingVariants()}\n >\n {t('workflowWebhookAction.variablesHeading')}\n </h4>\n <p className={helpVariants()}>\n {t('workflowWebhookAction.variablesDescription')}\n </p>\n {renderFields(\n variablesLabelId,\n variables.map(\n (item) => [item.value, item.label] as const,\n ),\n 3,\n )}\n </div>\n ) : null}\n </div>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion>\n </Card>\n </div>\n\n {/* A card of its own: for whoever sets up the receiving app, so\n closed until asked for. */}\n <div data-slot=\"reference\">\n <Card variant=\"elevated\">\n <Accordion type=\"single\" collapsible>\n <Accordion.Item value=\"reference\">\n <Accordion.Trigger data-action=\"toggle-reference\">\n <span>{t('workflowWebhookAction.sentHeading')}</span>\n </Accordion.Trigger>\n <Accordion.Content>{reference}</Accordion.Content>\n </Accordion.Item>\n </Accordion>\n </Card>\n </div>\n\n {/* Generating, copying and inserting change what is on screen\n without a focus change a screen reader would notice. */}\n <span\n ref={liveRegion}\n role=\"status\"\n aria-live=\"polite\"\n className=\"ds:sr-only\"\n >\n {announcement}\n </span>\n </div>\n );\n },\n);\nWorkflowWebhookAction.displayName = 'WorkflowWebhookAction';\n"],"names":["__iconNode","KeyRound","createLucideIcon","WORKFLOW_WEBHOOK_ACTION_FIELDS","rootVariants","cva","fieldsGridVariants","referenceSectionVariants","sectionHeadingVariants","fieldNameVariants","helpVariants","errorVariants","parameterRowVariants","HTTPS","URL_MAX_LENGTH","TWO_COLUMN_MIN_WIDTH","PLATFORM_VARIABLES","EXAMPLE_IDEMPOTENCY_KEY","EXAMPLE_BODY","EXAMPLE_HEADERS","textOf","value","isUntouched","row","parameterEntries","rows","parametersJsonOf","entries","name","generateSecret","bytes","byte","firstServerMessage","errors","SentField","description","onCopied","t","useTranslation","descriptionId","useId","status","copy","useCopyToClipboard","copied","failed","jsxs","jsx","IconButton","Check","CircleAlert","Copy","WorkflowWebhookAction","forwardRef","children","initialValues","hasSavedSecret","fieldNames","placeholders","onSendTest","onValueChange","layout","className","rest","ref","sentFields","sentHeaders","legalErrorId","bodyLabelId","headersLabelId","variablesLabelId","testHelpId","variables","keyCounter","useRef","nextKey","url","setUrl","useState","secret","setSecret","generated","setGenerated","setRows","legal","setLegal","advancedOpen","setAdvancedOpen","touched","setTouched","submitted","setSubmitted","serverErrors","setServerErrors","announcement","setAnnouncement","testChecked","setTestChecked","answered","setAnswered","lastErrors","useEffect","setFocusRequest","leave","field","previous","forget","rootRef","urlInput","secretInput","copyButton","sendTestButton","parametersError","legalBox","liveRegion","nameInputs","valueInputs","visitedValues","pendingCaret","pending","_a","fitsTwoColumns","setFitsTwoColumns","useIsomorphicLayoutEffect","node","measure","observer","twoColumns","setRootRef","useCallback","announce","message","frames","speak","urlProblem","parsed","secretProblem","rowProblems","problems","counts","legalProblem","due","rowsWithProblems","urlError","secretError","legalError","rowError","key","announceErrors","firstProblem","candidate","firstProblemRef","focusRequest","target","form","onSubmit","event","first","parametersJson","onValueChangeRef","entriesRef","mounted","copyStatus","copiedValue","resetCopy","secretCopied","secretCopyFailed","generateNewSecret","test","setTest","testRun","sendTest","problem","run","result","finishTest","next","outcome","describeTest","active","testedText","lastTestedText","state","ok","copySecret","updateRow","patch","addRow","removeRow","index","_","position","removed","neighbour","insertPlaceholder","token","input","visited","start","end","label","item","announceCopy","renderFields","labelId","items","wideColumns","exampleBody","reference","CodeBlock","native","secretDescription","FormField","TextInput","PasswordInput","Button","Send","Alert","Checkbox","Card","Accordion","Badge","FieldArray","TokenInsertMenu"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "packageVersion": "1.69.0",
3
+ "packageVersion": "1.70.0",
4
4
  "components": [
5
5
  {
6
6
  "kind": "component",
@@ -24138,11 +24138,21 @@
24138
24138
  {
24139
24139
  "name": "edit_parameters",
24140
24140
  "safety": "write",
24141
- "description": "Open the Advanced section (`data-action=\"toggle-advanced\"`) and add, change or remove extra parameters, each a name and a value. Most receiving apps, Link included, need none. A value may contain patient-detail codes from the insert menu; the server replaces them when it sends.",
24141
+ "description": "Open the Advanced section (`data-action=\"toggle-advanced\"`) and add, change or remove extra parameters, each a name and a value. Most receiving apps, Link included, need none. A value may contain variables, inserted from each row's \"Insert variable\" menu or copied from the list under the rows (`data-action=\"copy-field\"`); the server replaces them with the patient's details when it sends.",
24142
24142
  "descriptionKey": "ui.agent.workflowWebhookAction.workflows.editParameters",
24143
24143
  "uiActions": [],
24144
24144
  "apiActions": []
24145
24145
  },
24146
+ {
24147
+ "name": "send_test",
24148
+ "safety": "write",
24149
+ "description": "Send one sample message to the address (`data-action=\"send-test\"`, present only when the host supports it): sample IDs, no patient data, signed with the secret. The address and secret are checked first. The answer is in `data-slot=\"test-result\"`, with `data-test-ok=\"true\"` when the app answered 2xx.",
24150
+ "descriptionKey": "ui.agent.workflowWebhookAction.workflows.sendTest",
24151
+ "uiActions": [],
24152
+ "apiActions": [
24153
+ "workflowAction.sendTest"
24154
+ ]
24155
+ },
24146
24156
  {
24147
24157
  "name": "read_message_shape",
24148
24158
  "safety": "read",
@@ -2158,7 +2158,8 @@
2158
2158
  "workflows": {
2159
2159
  "readStep": "Read the webhook step and what is wrong with it. Each field sits in a wrapper with `data-field` (`url`, `secret`, `legalBasisConfirmed`, `parameters`). A field with a problem has `aria-invalid=\"true\"` on its control and its message in a `data-slot=\"error\"` element inside the wrapper. Parameter rows carry `data-parameter-id`, an opaque row id. The `secret` wrapper is write-only for agents: read whether it has a problem, never its value, and never repeat a secret.",
2160
2160
  "generateSecret": "Generate a random signing secret into the password field (`data-action=\"generate-secret\"`; again to replace it) and copy it to the clipboard (`data-action=\"copy-secret\"`, which shows `data-copied=\"true\"` once done) so the person can paste it into the receiving app. The secret never appears in the page markup. Nothing is saved until the host form is submitted.",
2161
- "editParameters": "Open the Advanced section (`data-action=\"toggle-advanced\"`) and add, change or remove extra parameters, each a name and a value. Most receiving apps, Link included, need none. A value may contain patient-detail codes from the insert menu; the server replaces them when it sends.",
2161
+ "editParameters": "Open the Advanced section (`data-action=\"toggle-advanced\"`) and add, change or remove extra parameters, each a name and a value. Most receiving apps, Link included, need none. A value may contain variables, inserted from each row's \"Insert variable\" menu or copied from the list under the rows (`data-action=\"copy-field\"`); the server replaces them with the patient's details when it sends.",
2162
+ "sendTest": "Send one sample message to the address (`data-action=\"send-test\"`, present only when the host supports it): sample IDs, no patient data, signed with the secret. The address and secret are checked first. The answer is in `data-slot=\"test-result\"`, with `data-test-ok=\"true\"` when the app answered 2xx.",
2162
2163
  "readMessageShape": "Open \"What Alfadocs sends\" (`data-action=\"toggle-reference\"`) to read what every message carries: an example body and example headers, each in a code block with its own copy button, then each field and header with its meaning. `data-action=\"copy-field\"` copies one field name and shows `data-copied=\"true\"` once done. The example values are invented; the shape is the platform's.",
2163
2164
  "saveStep": "Save through the host's own form and button. The fields stop the submit while the address, the secret, the consent box or a parameter name has a problem, and move focus to the first one. The person ticks the consent box themselves: it confirms the practice has a legal basis to share patient data."
2164
2165
  }
@@ -5646,6 +5646,13 @@ export declare const arUi: {
5646
5646
  readonly secretSavedDescription: "هناك سر محفوظ بالفعل. اترك هذا الحقل فارغاً للإبقاء عليه.";
5647
5647
  readonly secretRequired: "أدخل سر التوقيع أو أنشئه.";
5648
5648
  readonly generate: "إنشاء سر";
5649
+ readonly testDescription: "أرسل اختباراً للتحقق من العنوان والسر. يستخدم معرّفات نموذجية ولا يتضمن أي بيانات مريض.";
5650
+ readonly sendTest: "إرسال اختبار";
5651
+ readonly testSent: "تم إرسال الاختبار. ردّ التطبيق بالرمز {{status}}.";
5652
+ readonly testCheckSecret: "ردّ التطبيق بالرمز {{status}}. تحقق من أن السر هو نفسه الموجود في التطبيق.";
5653
+ readonly testRejected: "ردّ التطبيق بالرمز {{status}}. تحقق من العنوان ومن إعدادات التطبيق.";
5654
+ readonly testUnreachable: "تعذّر الوصول إلى العنوان. تحقق من أنه صحيح وعام.";
5655
+ readonly testFailed: "تعذّر إرسال الاختبار. حاول مرة أخرى.";
5649
5656
  readonly generatedNotice: "انسخ هذا السر إلى التطبيق الآن. بعد الحفظ، يُبقيه Alfadocs مخفياً.";
5650
5657
  readonly secretGenerated: "تم إنشاء سر جديد. انسخه إلى التطبيق.";
5651
5658
  readonly legalBasis: "أؤكد أن العيادة لديها أساس قانوني لمشاركة بيانات المرضى مع الجهة المستلمة على هذا العنوان.";
@@ -5660,10 +5667,15 @@ export declare const arUi: {
5660
5667
  readonly parameterValueOf: "القيمة في المعلمة {{number}}";
5661
5668
  readonly addParameter: "إضافة معلمة";
5662
5669
  readonly removeParameter: "إزالة المعلمة {{number}}";
5663
- readonly insertDetail: "إدراج بيانات المريض";
5670
+ readonly insertDetail: "إدراج متغير";
5664
5671
  readonly placeholderInserted: "تم الإدراج: {{detail}}";
5665
5672
  readonly parameterNameRequired: "أدخل اسماً لهذه القيمة.";
5666
5673
  readonly parameterNameDuplicate: "هذا الاسم مستخدم بالفعل. استخدم كل اسم مرة واحدة.";
5674
+ readonly variablesHeading: "المتغيرات التي يمكنك استخدامها في قيمة";
5675
+ readonly variablesDescription: "يستبدل Alfadocs كل متغير ببيانات المريض عند الإرسال.";
5676
+ readonly variableSalutation: "اللقب";
5677
+ readonly variableFirstName: "الاسم الأول";
5678
+ readonly variableLastName: "اسم العائلة";
5667
5679
  readonly sentHeading: "ما يرسله Alfadocs";
5668
5680
  readonly sentDescription: "تحمل كل رسالة هذه الحقول. يتضمن المثال معلماتك الإضافية.";
5669
5681
  readonly sent: {
@@ -1 +1 @@
1
- {"version":3,"file":"ar.d.ts","sourceRoot":"","sources":["../../../src/i18n/locales/ar.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0tLP,CAAC"}
1
+ {"version":3,"file":"ar.d.ts","sourceRoot":"","sources":["../../../src/i18n/locales/ar.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0uLP,CAAC"}
@@ -5606,6 +5606,13 @@ const e = {
5606
5606
  secretSavedDescription: "هناك سر محفوظ بالفعل. اترك هذا الحقل فارغاً للإبقاء عليه.",
5607
5607
  secretRequired: "أدخل سر التوقيع أو أنشئه.",
5608
5608
  generate: "إنشاء سر",
5609
+ testDescription: "أرسل اختباراً للتحقق من العنوان والسر. يستخدم معرّفات نموذجية ولا يتضمن أي بيانات مريض.",
5610
+ sendTest: "إرسال اختبار",
5611
+ testSent: "تم إرسال الاختبار. ردّ التطبيق بالرمز {{status}}.",
5612
+ testCheckSecret: "ردّ التطبيق بالرمز {{status}}. تحقق من أن السر هو نفسه الموجود في التطبيق.",
5613
+ testRejected: "ردّ التطبيق بالرمز {{status}}. تحقق من العنوان ومن إعدادات التطبيق.",
5614
+ testUnreachable: "تعذّر الوصول إلى العنوان. تحقق من أنه صحيح وعام.",
5615
+ testFailed: "تعذّر إرسال الاختبار. حاول مرة أخرى.",
5609
5616
  generatedNotice: "انسخ هذا السر إلى التطبيق الآن. بعد الحفظ، يُبقيه Alfadocs مخفياً.",
5610
5617
  secretGenerated: "تم إنشاء سر جديد. انسخه إلى التطبيق.",
5611
5618
  legalBasis: "أؤكد أن العيادة لديها أساس قانوني لمشاركة بيانات المرضى مع الجهة المستلمة على هذا العنوان.",
@@ -5620,10 +5627,15 @@ const e = {
5620
5627
  parameterValueOf: "القيمة في المعلمة {{number}}",
5621
5628
  addParameter: "إضافة معلمة",
5622
5629
  removeParameter: "إزالة المعلمة {{number}}",
5623
- insertDetail: "إدراج بيانات المريض",
5630
+ insertDetail: "إدراج متغير",
5624
5631
  placeholderInserted: "تم الإدراج: {{detail}}",
5625
5632
  parameterNameRequired: "أدخل اسماً لهذه القيمة.",
5626
5633
  parameterNameDuplicate: "هذا الاسم مستخدم بالفعل. استخدم كل اسم مرة واحدة.",
5634
+ variablesHeading: "المتغيرات التي يمكنك استخدامها في قيمة",
5635
+ variablesDescription: "يستبدل Alfadocs كل متغير ببيانات المريض عند الإرسال.",
5636
+ variableSalutation: "اللقب",
5637
+ variableFirstName: "الاسم الأول",
5638
+ variableLastName: "اسم العائلة",
5627
5639
  sentHeading: "ما يرسله Alfadocs",
5628
5640
  sentDescription: "تحمل كل رسالة هذه الحقول. يتضمن المثال معلماتك الإضافية.",
5629
5641
  sent: {