Skip to content
This repository was archived by the owner on Oct 26, 2026. It is now read-only.

Commit 8a8bcf3

Browse files
fix(app-shell): packaged flow rows keep their height; the platform reason opens from a neutral chip (objectui#12609) (#12647)
Fixes #12609 Clause-②: yes Setup › Packaged automation: a flow row that carries the runtime's `reason` sentence no longer grows to several lines. The sentence opens, verbatim and in full, from a neutral **Details** chip on the flow name's line. This is the card as triage narrowed it (comment 6210990723): target 3 only, the half that classifies nothing. ## What changed - `packages/app-shell/src/views/setup/PackagedAutomationPage.tsx` - The paragraph element that rendered `row.reason` inside the flow cell is gone. - A new local component, `ReasonDetails`, draws a small outline chip (an Info icon and the word "Details") inline after the flow's label. The chip opens a popover that shows the sentence whole and muted, with no alert role. - The chip renders only when the row carries a non-empty string `reason`. That rule is the existing one in `joinPackagedFlows`, unchanged. The chip's label, icon and classes are the same on every row, and nothing reads, matches or compares the sentence. - A popover, not a tooltip: the sentence runs to several lines and can name an operator switch the admin needs to copy. A popover opens on click, tap and keyboard, and stays open to be read and selected. - Rows without a reason render the same markup as before. - `packages/i18n/src/locales/*.ts`: one new key, `packagedAutomation.reasonDetails`, in all ten packs. Each pack uses the word it already uses for "Details" elsewhere. - `.changeset/12609-packaged-flow-reason-chip.md`: a patch for `@object-ui/app-shell` and `@object-ui/i18n`, with the Clause-② paragraph (one pack key added; no export or prop changes). ## Governing text `@objectstack/spec` `FlowRuntimeState.reason`, verbatim: "A free-form sentence, deliberately — the shape the two surfaces that already carry this reason use. Consumers RENDER it; ⛔ do not parse it." This PR adds no regex, `includes` or match on the reason, and the chip's wording names no cause. ## Tests `PackagedAutomationPage.test.tsx`, section 6 (the platform reason for an unbound flow), reworked: - **A deployment-policy row and a binding-failure row.** The row holds no paragraph element and none of the sentence. Its "Details" chip opens a dialog-role disclosure whose text is exactly the sentence: muted, with no alert. - **The chip does not classify.** The policy row's chip and the binding-failure row's chip have the same text ("Details") and the same classes. - **Rows without a reason have no chip and the same text as before.** This covers a bound row, a disabled row, an older backend's bare row and a non-string reason. `pnpm exec vitest run --maxWorkers=2 packages/app-shell/src/views/setup/PackagedAutomationPage.test.tsx`: 15 passed (15). ### Ablation (each red proven, then restored) Each mutation went through objectstack's `scripts/ablation-replace.mjs` in wrap mode. The anchor must hit, and the tool checks on-disk counts and blob hashes. Restore is proven by blob == HEAD and an empty `git diff HEAD`. The test imports the page from `src/`, so no build sits between the mutation and the run. | Mutation | Red tests | |---|---| | A: the reason paragraph put back in the row, chip kept | policy row, binding-failure row: 2 failed, 13 passed (the row's paragraph count was 1, not 0) | | B: the chip removed | policy row, binding-failure row, does-not-classify: 3 failed, 12 passed | | C: the chip drawn on every row | no-reason rows, non-string reason: 2 failed, 13 passed | | D: the chip's label chosen from the sentence's words | policy row, does-not-classify: 2 failed, 13 passed | Mutation A's first attempt was refused by the tool before anything ran. Its replacement contained the anchor, so the anchor count could not drop. It was re-anchored and re-run, and the counts above come from the run whose mutation landed. ## Local gates, all on `ad380ce` objectui is hand-derived from its own `package.json` and `.github/workflows/ci.yml`. Each exit code was captured before any pipe. CI runs the full farm. - `pnpm exec turbo run build --filter='@object-ui/app-shell^...' --concurrency=2` (upstream closure of app-shell, which contains i18n's): exit 0, 28 tasks successful (28) - `pnpm --filter @object-ui/i18n type-check` and `pnpm --filter @object-ui/app-shell type-check`: exit 0. app-shell's `tsconfig.test.json` includes `src/**/*.test.tsx`, so the test file is compiled. - `pnpm exec vitest run --maxWorkers=2 packages/app-shell/src/views/setup/ packages/i18n/`: exit 0, 88 files passed, 1387 tests passed, 13 skipped - `pnpm check:i18n-keys`, `check:i18n-drift` (1 key added, 0 values changed), `check:i18n-dead-keys` (the new key is not listed): exit 0 - `pnpm check:changeset-claims`, `pnpm changeset:check`, `node scripts/check-changeset-presence.mjs`: exit 0 - `pnpm check:test-path-roots`, `pnpm check:spec-symbols`, `pnpm check:new-line-citations` (0 new): exit 0 - `pnpm exec eslint --no-inline-config` on the 12 changed `.ts` and `.tsx` files: exit 0, no output ## Acceptance notes - **The switch is unchanged.** It still shows the row's `enabled` field, so a flow that deployment policy keeps unarmed still reads On. Showing the effective state needs the structured discriminator that objectstack-ai/objectstack#23842 adds, and this PR does not touch the switch. - **Card targets 1 and 2 are not here.** The chip that names the deployment policy and the once-banner both need that discriminator. Per triage, the console half of those is filed once the field is in a published `@objectstack/spec`. - **Acceptance 2, the screenshot at 1280 px in light and dark: NOT MEASURED in this run.** A reader needs four things: - a backend with packaged time-triggered flows and `OS_AUTOMATION_SCHEDULED_WORK_ENABLED` unset, so those rows carry the policy sentence; - a console started from this branch, on its own port, pointed at that backend; - the page `/apps/com.objectstack.setup/component/automation/packaged`; - a click on a row's Details chip, to read the popover. - **Row height in pixels: NOT MEASURED.** No browser ran here. What the tests pin is structural: the row holds no paragraph, and the chip sits inline in the label's line (`leading-4` text, a one-pixel border, no vertical padding). Rows without a reason were already two lines tall (the label above the machine name), in cells with the table primitive's `p-4` padding. So the claim this PR makes is "a reason row is as tall as any other row", not a pixel figure; the screenshot reading above should take the figure. - **Card acceptance 3, `pnpm --filter @object-ui/app-shell test`:** the whole-package run is left to CI. Locally, the setup directory and the whole i18n package ran, as listed above. - **Docs:** no page under `content/docs/` describes how this page shows the reason, so no doc changed. - **Overlap:** objectui#12606 (another seat, in flight) owns the header row of Setup component pages. This PR touches only this file's flow rows and its module docblock, and the later lander merges `main`. --- _Generated by [Claude Code](https://claude.ai/code/session_011K9g23W67dy2zwnyzaoB6o)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent ca7a4c3 commit 8a8bcf3

13 files changed

Lines changed: 166 additions & 41 deletions

File tree

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
---
2+
'@object-ui/app-shell': patch
3+
'@object-ui/i18n': patch
4+
---
5+
6+
Setup › Packaged automation keeps a flow row to the table's height when the platform says why the flow is not armed (objectui#12609).
7+
8+
The runtime's `reason` sentence for an enabled flow that is not armed used to render as a paragraph under the flow's name, so every such row grew to several lines and the table stopped scanning as a table. The sentence now opens from a small "Details" chip on the name's line, in a popover that shows it whole and unedited, in muted text. A row without a reason shows no chip and renders as before.
9+
10+
The chip does not say what the reason is. Its label is the same on every row that carries a reason, whatever the sentence says, because the contract says the field is rendered and never parsed, and a deployment-policy row and a binding failure arrive in the same shape. The activation switch still shows the flow's `enabled` field, as before.
11+
12+
**Clause-②: yes (widening)**: `@object-ui/i18n`'s ten locale packs gain one key, `packagedAutomation.reasonDetails`. No export, prop or other key changes on either package.

‎packages/app-shell/src/views/setup/PackagedAutomationPage.test.tsx‎

Lines changed: 68 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
/**
44
* Setup › Packaged automation (ADR-0126 §7.4) — behaviour.
55
*
6-
* Five properties, in the order the page exercises them:
6+
* Six properties, in the order the page exercises them:
77
*
88
* 1. **scope** — the list is packaged flows only. The rule itself lives in
99
* `packagedFlows.ts` and is measured directly in `packagedFlows.test.ts`;
@@ -29,6 +29,9 @@
2929
* platform's sentence for why the flow is not armed. It is shown VERBATIM
3030
* and muted, never as an alert, whether it names the deployment policy or
3131
* a real binding failure; a row without one renders exactly as before.
32+
* Since objectui#12609 the sentence is not in the row at all: it opens
33+
* from a neutral chip on the name's line, the same chip whatever the
34+
* sentence says, so the row keeps the table's height.
3235
*/
3336

3437
import '@testing-library/jest-dom/vitest';
@@ -469,54 +472,85 @@ describe('the platform reason for an unbound flow', () => {
469472
return cell;
470473
}
471474

475+
/** The neutral reason chip of ONE named row, or `null` when it has none. */
476+
function chipIn(flowName: string): HTMLElement | null {
477+
return within(screen.getByTestId(`packaged-flow-${flowName}`)).queryByRole('button', {
478+
name: 'Details',
479+
});
480+
}
481+
482+
/** Open a row's chip and return the disclosure it opened. */
483+
async function openReason(flowName: string): Promise<HTMLElement> {
484+
const chip = chipIn(flowName);
485+
if (!chip) throw new Error(`no reason chip on ${flowName}`);
486+
fireEvent.click(chip);
487+
return screen.findByRole('dialog', { name: 'Details' });
488+
}
489+
490+
/** Add one unarmed packaged flow, carrying `reason`, to the fixture. */
491+
function withReasonRow(name: string, label: string, triggerType: string, reason: string) {
492+
fixture.runtime = [...fixture.runtime, { name, enabled: true, bound: false, triggerType, reason }];
493+
fixture.meta = [...fixture.meta, packagedItem(name, label)];
494+
}
495+
472496
/**
473-
* The one assertion every reason row owes: the platform's sentence is in its
474-
* row, whole and unedited, in muted text — and nothing in the row is an alert
475-
* or destructive-styled.
497+
* What every reason row owes (objectui#9217, objectui#12609). The ROW holds
498+
* no paragraph and none of the sentence, so it keeps the table's height. Its
499+
* chip opens a disclosure holding the platform's sentence and nothing else:
500+
* whole, unedited and muted. Nothing in the row or the disclosure is an
501+
* alert or destructive-styled.
476502
*/
477-
function expectMutedVerbatim(flowName: string, sentence: string) {
503+
async function expectBehindChipVerbatim(flowName: string, sentence: string) {
478504
const row = screen.getByTestId(`packaged-flow-${flowName}`);
479-
const shown = within(row).getByText(sentence);
505+
expect(row.querySelectorAll('p')).toHaveLength(0);
506+
expect(row.textContent).not.toContain(sentence);
507+
expect(within(row).queryAllByRole('alert')).toHaveLength(0);
508+
expect(row.querySelectorAll('.text-destructive')).toHaveLength(0);
509+
510+
const disclosure = await openReason(flowName);
511+
expect(disclosure.textContent).toBe(sentence);
512+
const shown = within(disclosure).getByText(sentence);
480513
expect(shown.textContent).toBe(sentence);
481514
expect(shown).toHaveClass('text-muted-foreground');
482515
expect(shown).not.toHaveClass('text-destructive');
483-
expect(within(row).queryAllByRole('alert')).toHaveLength(0);
484-
expect(row.querySelectorAll('.text-destructive')).toHaveLength(0);
516+
expect(within(disclosure).queryAllByRole('alert')).toHaveLength(0);
485517
}
486518

487-
it('shows a deployment-policy row with the platform sentence, muted, and not as a binding failure', async () => {
488-
fixture.runtime = [
489-
...fixture.runtime,
490-
{ name: 'pkg_digest', enabled: true, bound: false, triggerType: 'schedule', reason: POLICY_REASON },
491-
];
492-
fixture.meta = [...fixture.meta, packagedItem('pkg_digest', 'Daily digest')];
519+
it('keeps a deployment-policy row to its name line; the sentence opens from the chip, whole and muted', async () => {
520+
withReasonRow('pkg_digest', 'Daily digest', 'schedule', POLICY_REASON);
493521
await renderPage();
494522

495-
expectMutedVerbatim('pkg_digest', POLICY_REASON);
523+
await expectBehindChipVerbatim('pkg_digest', POLICY_REASON);
496524
// The page adds no failure wording of its own around the policy sentence.
497525
expect(screen.getByTestId('packaged-flow-pkg_digest').textContent).not.toMatch(/binding failed/i);
498526
// The flow's activation is still shown as the engine reports it.
499527
expect(screen.getByRole('switch', { name: 'Activation for Daily digest' })).toBeChecked();
500528
});
501529

502-
it('shows a real binding failure in the platform words too, muted (acceptance ②)', async () => {
503-
fixture.runtime = [
504-
...fixture.runtime,
505-
{
506-
name: 'pkg_sync',
507-
enabled: true,
508-
bound: false,
509-
triggerType: 'record_change',
510-
reason: BINDING_FAILED_REASON,
511-
},
512-
];
513-
fixture.meta = [...fixture.meta, packagedItem('pkg_sync', 'Sync accounts')];
530+
it('puts a real binding failure behind the same chip, in the platform words too (acceptance ②)', async () => {
531+
withReasonRow('pkg_sync', 'Sync accounts', 'record_change', BINDING_FAILED_REASON);
532+
await renderPage();
533+
534+
await expectBehindChipVerbatim('pkg_sync', BINDING_FAILED_REASON);
535+
});
536+
537+
it('draws one chip that does not classify: a policy row and a binding failure show the same one', async () => {
538+
withReasonRow('pkg_digest', 'Daily digest', 'schedule', POLICY_REASON);
539+
withReasonRow('pkg_sync', 'Sync accounts', 'record_change', BINDING_FAILED_REASON);
514540
await renderPage();
515541

516-
expectMutedVerbatim('pkg_sync', BINDING_FAILED_REASON);
542+
const policy = chipIn('pkg_digest');
543+
const failure = chipIn('pkg_sync');
544+
expect(policy).not.toBeNull();
545+
expect(failure).not.toBeNull();
546+
// The chip's words and look follow "this row has a reason", never what the
547+
// reason says: the two rows' chips are indistinguishable.
548+
expect(policy!.textContent).toBe('Details');
549+
expect(failure!.textContent).toBe(policy!.textContent);
550+
expect(failure!.className).toBe(policy!.className);
517551
});
518552

519-
it('renders a row without a reason exactly as before, older backends included', async () => {
553+
it('renders a row without a reason exactly as before, with no chip, older backends included', async () => {
520554
// `pkg_notify` (bound) and `pkg_escalate` (disabled) come from the default
521555
// fixture and carry no reason; `pkg_legacy` is an older backend's bare row.
522556
fixture.runtime = [...fixture.runtime, { name: 'pkg_legacy' }];
@@ -526,6 +560,9 @@ describe('the platform reason for an unbound flow', () => {
526560
expect(flowCell('pkg_notify').textContent).toBe('Notify ownerpkg_notify');
527561
expect(flowCell('pkg_escalate').textContent).toBe('Escalate casepkg_escalate');
528562
expect(flowCell('pkg_legacy').textContent).toBe('Legacy flowpkg_legacy');
563+
for (const name of ['pkg_notify', 'pkg_escalate', 'pkg_legacy']) {
564+
expect(chipIn(name)).toBeNull();
565+
}
529566
});
530567

531568
it('ignores a reason that is not a string', async () => {
@@ -543,5 +580,7 @@ describe('the platform reason for an unbound flow', () => {
543580

544581
expect(flowCell('pkg_numeric').textContent).toBe('Numeric reasonpkg_numeric');
545582
expect(flowCell('pkg_object').textContent).toBe('Object reasonpkg_object');
583+
expect(chipIn('pkg_numeric')).toBeNull();
584+
expect(chipIn('pkg_object')).toBeNull();
546585
});
547586
});

‎packages/app-shell/src/views/setup/PackagedAutomationPage.tsx‎

Lines changed: 71 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,10 @@
3737
* `_status` carries both: §7.4 scopes it to what the activation ledger knows.
3838
* The Studio rail is where a flow's binding is diagnosed.
3939
* The one exception is an unbound row's `reason`: the platform's own sentence
40-
* for why the flow is not armed, shown verbatim and muted under its name
41-
* (objectui#9217) — never parsed, never styled as an error.
40+
* for why the flow is not armed (objectui#9217), shown verbatim and muted in a
41+
* disclosure behind a neutral chip after the flow's name (objectui#12609), so
42+
* a row that carries one keeps the table's row height — never parsed, never
43+
* styled as an error. `ReasonDetails` below carries the chip's rules.
4244
*
4345
* ## Server refusals reach the operator VERBATIM
4446
*
@@ -73,7 +75,7 @@
7375
*/
7476

7577
import * as React from 'react';
76-
import { RefreshCw } from 'lucide-react';
78+
import { Info, RefreshCw } from 'lucide-react';
7779
import {
7880
Badge,
7981
Button,
@@ -88,6 +90,9 @@ import {
8890
EmptyTitle,
8991
Input,
9092
Label,
93+
Popover,
94+
PopoverContent,
95+
PopoverTrigger,
9196
Skeleton,
9297
Switch,
9398
Table,
@@ -170,6 +175,60 @@ interface CloneDraft {
170175
busy: boolean;
171176
}
172177

178+
/* -------------------------------------------------------------------------- */
179+
/* The reason disclosure */
180+
/* -------------------------------------------------------------------------- */
181+
182+
/**
183+
* The chip an unarmed flow row's `reason` opens from (objectui#12609).
184+
*
185+
* The sentence used to render as a paragraph under the flow's name, which grew
186+
* every row that carried one to several lines and stopped the table scanning
187+
* as a table. It now sits behind this chip, inline on the name's line, so a
188+
* row with a reason is as tall as a row without one.
189+
*
190+
* ⛔ The chip does NOT classify. Its label is the same generic word on every
191+
* row that carries a reason, and whether it renders follows only "the runtime
192+
* row sent a non-empty string `reason`" — never what the sentence says. The
193+
* contract's own words on the field are "Consumers RENDER it; ⛔ do not parse
194+
* it", and a deployment-policy row and a real binding failure arrive in the
195+
* same `enabled: true, bound: false` shape. A chip that named which of the two
196+
* a row is needs a structured field beside `reason` (objectstack#23842); until
197+
* the wire carries one, nothing here names a cause.
198+
*
199+
* The disclosure shows the sentence verbatim and whole — not truncated, not
200+
* reworded, not restyled by what it says — muted, and not as an alert. A
201+
* popover rather than a tooltip: the sentence runs to several lines and can
202+
* name an operator switch the admin needs to copy, so it opens on click, tap
203+
* or keyboard and stays open to be read and selected.
204+
*/
205+
function ReasonDetails({ reason }: { reason: string }) {
206+
const { t } = useObjectTranslation();
207+
const label = t('packagedAutomation.reasonDetails', { defaultValue: 'Details' });
208+
return (
209+
<Popover>
210+
<PopoverTrigger asChild>
211+
<button
212+
type="button"
213+
data-testid="packaged-flow-reason-chip"
214+
className="ml-2 inline-flex items-center gap-1 rounded-md border border-border px-1.5 align-middle text-xs font-normal leading-4 text-muted-foreground transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
215+
>
216+
<Info className="h-3 w-3 shrink-0" aria-hidden="true" />
217+
{label}
218+
</button>
219+
</PopoverTrigger>
220+
<PopoverContent align="start" aria-label={label} className="w-96 max-w-[90vw]">
221+
<p
222+
data-testid="packaged-flow-reason"
223+
className="whitespace-normal break-words text-sm text-muted-foreground"
224+
>
225+
{reason}
226+
</p>
227+
</PopoverContent>
228+
</Popover>
229+
);
230+
}
231+
173232
/* -------------------------------------------------------------------------- */
174233
/* Page */
175234
/* -------------------------------------------------------------------------- */
@@ -422,16 +481,16 @@ export function PackagedAutomationPage() {
422481
return (
423482
<TableRow key={row.name} data-testid={`packaged-flow-${row.name}`}>
424483
<TableCell className="align-top">
425-
<div className="font-medium">{row.label}</div>
484+
<div className="font-medium">
485+
{row.label}
486+
{/* The PLATFORM's sentence for why the engine has not
487+
armed this flow (objectui#9217), behind a chip on the
488+
name's own line so the row keeps its height
489+
(objectui#12609). Present only when a reason was
490+
sent; the chip reads the same whatever it says. */}
491+
{row.reason && <ReasonDetails reason={row.reason} />}
492+
</div>
426493
<code className="font-mono text-xs text-muted-foreground">{row.name}</code>
427-
{row.reason && (
428-
// The PLATFORM's sentence for why the engine has not
429-
// armed this flow, verbatim. Muted and NOT an alert: a
430-
// deployment-policy refusal names its operator switch in
431-
// its own words, a binding failure says so in its own,
432-
// and neither is re-styled or read here (objectui#9217).
433-
<p className="mt-2 max-w-prose text-sm text-muted-foreground">{row.reason}</p>
434-
)}
435494
{refusal && (
436495
// VERBATIM server refusal, next to the control that
437496
// caused it. `role="alert"` so it is announced.

‎packages/i18n/src/locales/ar.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4542,6 +4542,7 @@ const ar = {
45424542
toggleFailed: "تعذّر تغيير التفعيل.",
45434543
cloneFailedHttp: "تعذّر استنساخ هذا التدفق (HTTP {{status}}).",
45444544
cloneFailed: "تعذّر استنساخ هذا التدفق.",
4545+
reasonDetails: "التفاصيل",
45454546
actionsSubtitle: "إجراءات تأتي مع الحزم المثبّتة. أوقف أحدها في هذا النشر فيتوقف عن العمل في كل مكان يُعرض فيه. ويبقى بإمكانك إنشاء إجراء خاص بك إلى جانبه في Studio.",
45464547
colAction: "الإجراء",
45474548
colObject: "الكائن",

‎packages/i18n/src/locales/de.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4158,6 +4158,7 @@ const de = {
41584158
toggleFailed: "Aktivierung konnte nicht geändert werden.",
41594159
cloneFailedHttp: "Dieser Flow konnte nicht geklont werden (HTTP {{status}}).",
41604160
cloneFailed: "Dieser Flow konnte nicht geklont werden.",
4161+
reasonDetails: "Details",
41614162
actionsSubtitle: "Aktionen aus installierten Paketen. Schalten Sie eine für diese Installation ab, und sie läuft überall dort nicht mehr, wo sie angeboten wird. Eine eigene Aktion daneben zu erstellen, bleibt Ihnen im Studio offen.",
41624163
colAction: "Aktion",
41634164
colObject: "Objekt",

‎packages/i18n/src/locales/en.ts‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4883,6 +4883,12 @@ const en = {
48834883
toggleFailed: 'Could not change activation.',
48844884
cloneFailedHttp: 'Could not clone this flow (HTTP {{status}}).',
48854885
cloneFailed: 'Could not clone this flow.',
4886+
// The chip an unarmed flow row's platform sentence opens from
4887+
// (objectui#12609). ⛔ Generic on purpose: the same word on every row that
4888+
// carries a sentence, whatever the sentence says. The sentence itself is
4889+
// the server's and is never kept in a pack; a label naming its cause would
4890+
// be the console classifying a field the contract says not to parse.
4891+
reasonDetails: 'Details',
48864892

48874893
// ── Packaged ACTIONS section (ADR-0126 §8 item 2, ruling 3) ────────────
48884894
// ⛔ No clone key here on purpose: the action-clone half is unchartered,

‎packages/i18n/src/locales/es.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4251,6 +4251,7 @@ const es = {
42514251
toggleFailed: "No se pudo cambiar la activación.",
42524252
cloneFailedHttp: "No se pudo clonar este flujo (HTTP {{status}}).",
42534253
cloneFailed: "No se pudo clonar este flujo.",
4254+
reasonDetails: "Detalles",
42544255
actionsSubtitle: "Acciones incluidas en los paquetes instalados. Desactiva una en esta implementación y dejará de ejecutarse en todos los lugares donde se ofrece. Crear tu propia acción junto a ella sigue estando disponible en Studio.",
42554256
colAction: "Acción",
42564257
colObject: "Objeto",

‎packages/i18n/src/locales/fr.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4248,6 +4248,7 @@ const fr = {
42484248
toggleFailed: "Impossible de modifier l'activation.",
42494249
cloneFailedHttp: "Impossible de cloner ce flux (HTTP {{status}}).",
42504250
cloneFailed: "Impossible de cloner ce flux.",
4251+
reasonDetails: "Détails",
42514252
actionsSubtitle: "Actions fournies par les packages installés. Désactivez-en une pour ce déploiement et elle cesse de s'exécuter partout où elle est proposée. Vous pouvez toujours créer votre propre action à côté, dans Studio.",
42524253
colAction: "Action",
42534254
colObject: "Objet",

‎packages/i18n/src/locales/ja.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4159,6 +4159,7 @@ const ja = {
41594159
toggleFailed: "有効状態を変更できませんでした。",
41604160
cloneFailedHttp: "このフローをクローンできませんでした (HTTP {{status}})。",
41614161
cloneFailed: "このフローをクローンできませんでした。",
4162+
reasonDetails: "詳細",
41624163
actionsSubtitle: "インストール済みパッケージが提供するアクションです。このデプロイでオフにすると、提供されているすべての場所で実行されなくなります。自分のアクションを別途 Studio で作成することは引き続き可能です。",
41634164
colAction: "アクション",
41644165
colObject: "オブジェクト",

‎packages/i18n/src/locales/ko.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4156,6 +4156,7 @@ const ko = {
41564156
toggleFailed: "활성화 상태를 변경하지 못했습니다.",
41574157
cloneFailedHttp: "이 플로우를 복제하지 못했습니다 (HTTP {{status}}).",
41584158
cloneFailed: "이 플로우를 복제하지 못했습니다.",
4159+
reasonDetails: "세부 정보",
41594160
actionsSubtitle: "설치된 패키지가 제공하는 액션입니다. 이 배포에서 끄면 액션이 제공되는 모든 곳에서 실행되지 않습니다. Studio에서 직접 액션을 따로 작성하는 것은 계속 가능합니다.",
41604161
colAction: "액션",
41614162
colObject: "오브젝트",

0 commit comments

Comments
 (0)