Skip to content

Commit b223072

Browse files
fix(setup): mute a not-running packaged flow's switch and say the scheduled-work policy plainly (#27389)
<!-- claude-projects-attribution: {"github_login":"os-warren"} --> _Requested by **Warren** · [project thread](https://claude.ai/code/project/chan_01U5RdnAAmkSQmZbqh6FtqZ8?thread=cmsg_01U5RdnAAmkSQmZbqh6FtqZ8L5cxFd5VXuXyEz4rkHiJ9G)_ Fixes #27378 Clause-②: no Metadata-protocol: none ## 维护者速读 - 改了什么:Setup › 打包自动化里,开关已开但引擎没有运行的流程,开关的「开」轨道改成灰色;因部署策略不运行定时任务的那一行,徽标换成一句白话「已启用,但此部署不运行计划任务」(十种语言)。 - 为什么改:原来绿色轨道让管理员以为流程在跑,而唯一的解释藏在 Details 里、还点名一个浏览器里改不了的环境变量。 - 风险与回滚:只改外观和文字,开关仍可点、仍写入启用标志,服务端原句仍在 Details 后面;回滚即还原本 PR。 - 先看:`ui/packages/app-shell/src/views/setup/PackagedAutomationPage.tsx`(Activation 单元格那段)、`PackagedAutomationPage.test.tsx` 第 7 节、`ui/packages/i18n/src/locales/en.ts` 新 key。 - 两分钟验证:`pnpm --dir ui exec vitest run packages/app-shell/src/views/setup/PackagedAutomationPage.test.tsx`,预期 31 个用例全绿。 - 需要你做的:无,席位落地。 ## What changes On Setup › Packaged automation, the Activation cell of a flow whose activation flag is on but which the engine has not armed (the row carries an `unboundCause`): - **Muted on-track.** The switch gets `data-[state=checked]:bg-muted-foreground/60`, the same muted fill Studio's Automations pillar uses for an on switch it cannot flip (#27376, merged). `cn()` inside the `Switch` primitive drops the primitive's `data-[state=checked]:bg-primary` for it. Only the colour moves: the switch stays enabled, `checked` stays `row.enabled`, `aria-checked` stays `true`, and toggling still writes the flag (the ruling kept from objectui#13159). - **Plain words for `deployment_policy`.** A row whose `unboundCause` is `deployment_policy` reads "On, but this deployment does not run scheduled work" in place of the badge, as a muted text line rather than a badge, because the badge is `whitespace-nowrap` and the sentence would overflow the 220px column. New key `packagedAutomation.notRunningDeploymentPolicy` in all ten locale packs, as `packagedAutomation.notRunning` is. The server's reason sentence is not rewritten: it stays verbatim behind the Details chip (`ReasonDetails`). - **Unchanged.** Rows with `disabled_subflow`, `missing_trigger` or `binding_failure` keep the outlined "Not running here" badge. Running rows keep "On" on the primary track; off rows keep "Off". - Doc comments in `PackagedAutomationPage.tsx` and `packagedFlows.ts` that said the page reads `unboundCause` "for presence only" / "no cause is told apart" now say which cause is told apart and why. ## Why HotCRM's 18.2.0 browser pass (row 3 of #27356): five scheduled flows each showed a green On switch beside "Not running here", and the only explanation was the platform sentence naming `OS_AUTOMATION_SCHEDULED_WORK_ENABLED`, which an administrator cannot act on from the browser. ## Tests `PackagedAutomationPage.test.tsx` section 7 (the Activation cell), beside the existing pins: - acceptance: a `deployment_policy` row's switch is checked, `aria-checked="true"`, enabled, carries the muted track and not the primary one; the cell reads the plain line and does not contain the variable name; - Details on that row still opens the platform sentence verbatim; - CONTROL: bound, no-trigger and off rows keep the primary track class and "On" / "On" / "Off"; - CONTROL: `binding_failure`, `disabled_subflow` and `missing_trigger` rows keep "Not running here" (one badge class), with a muted track; none is destructive or an alert; - CONTROL: the switch on a not-running row is muted and still toggles and writes `{ enabled: false }`; - the existing re-read-after-toggle pin now expects the plain line for the policy row. Four existing section 7 assertions pinned "Not running here" on a `deployment_policy` row; they now pin the plain line, which is this card's intended change. ## Acceptance notes - The plain line is keyed on the closed `unboundCause` value, never on the reason sentence, which stays rendered and not parsed. - `react-hooks/set-state-in-effect` warns on the page's existing load effect (`setLoadError(null)`); it predates this diff and is untouched. ## Verification All local runs on head `447a335f`, in worktree `objectstack-issue-27378`, after the `@object-ui/app-shell^...` closure build. <details><summary>Tests and ablations</summary> - `pnpm --dir ui exec vitest run --maxWorkers=2` over `PackagedAutomationPage.test.tsx`, `packagedFlows.test.ts`, `PackagedAutomationPage.navContribution.test.tsx`, `i18n all-locales-key-parity.test.ts`, `en-zh-key-parity.test.ts`: Test Files 5 passed (5), Tests 100 passed (100); lock VERDICT command-exit 0. - Ablation 1 (`scripts/ablation-replace.mjs`, anchor the Switch `className` expression replaced by `className={undefined}`): mutation landed (anchor 1 to 0, blob 821b47b to 97d1e96a); 4 failed, 27 passed, including the acceptance test and the controls test. - Ablation 2 (the `deployment_policy` branch condition replaced by `false ?`): mutation landed (blob 821b47b to 3e057618); 4 failed, 27 passed, including the acceptance test. - Restore: `git hash-object` of the page = `git rev-parse HEAD:` blob `821b47b0`, `git diff HEAD` empty. </details> <details><summary>Type-check, lint, gates</summary> - `pnpm --filter @object-ui/app-shell run type-check` exit 0; `pnpm --filter @object-ui/i18n run type-check` exit 0. - `eslint --no-inline-config` on the touched page, test, `packagedFlows.ts`, `en.ts`, `zh.ts`: 0 errors, 1 pre-existing warning (above). - `pnpm --dir ui run check:i18n-keys`, `check:i18n-drift`, `check:i18n-dead-keys`: exit 0. - `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`: 34 commands derived; each run with its exit captured before any pipe, all 34 exit 0; `--ran` reconciliation: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN. `node scripts/check-sdui-manifest.mjs` exit 0, `--self-test` exit 0; `pnpm --dir ui exec vitest run scripts/` Test Files 169 passed, 2 skipped. The type-check lanes and the wide-population families are CI's. - `pnpm check:changeset-fixed` (roster under `.changeset`): exit 0. `pnpm --dir ui run check:new-line-citations`: exit 0. </details> ## Human Minimum - [x] 1. Schemas start as Zod; `packages/spec` holds no runtime logic. (not touched) - [x] 2. Every name I added uses the casing for its kind. - [x] 3. No formatter ran; `pnpm lint` passes. (touched files linted locally; CI runs the full lint) - [x] 4. One issue, one branch off an up-to-date `main`, one pull request. - [x] 5. A change that publishes carries a changeset, and both declaration lines are filled in here and in the changeset. - [x] 6. `packages/spec` touched: its generated artifacts are regenerated and committed. (not touched) - [x] 7. No hand edits to `content/docs/references/`, `packages/*/CHANGELOG.md` or `content/docs/releases/`. - [x] 8. Title, body and comments are in English. (the 维护者速读 block is in Chinese by the os-dev order) - [x] The *Before Submitting* list in CONTRIBUTING.md is done. --- _Generated by [Claude Code](https://claude.ai/code/session_01JQwxbZD1bmtia9yxWboCpN)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent dbf576b commit b223072

14 files changed

Lines changed: 148 additions & 39 deletions

File tree

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
'@object-ui/app-shell': patch
3+
'@object-ui/console': patch
4+
'@object-ui/i18n': patch
5+
---
6+
7+
fix(setup): a packaged flow the deployment does not run no longer shows a green switch, and a scheduled-work policy row says so in plain words
8+
9+
Clause-②: no
10+
Metadata-protocol: none
11+
12+
- **Before.** On Setup › Packaged automation, a flow whose activation flag is on but which the engine has not armed showed the switch's green "on" track beside an outlined "Not running here" badge. An administrator read the green track as "running". When the cause was the deployment's scheduled-work policy, the only explanation was the platform's sentence behind Details, which names an environment variable the administrator cannot set from the browser.
13+
- **Now.** A not-running row's switch draws a muted on-track. A row whose engine cause is `deployment_policy` reads "On, but this deployment does not run scheduled work" in place of the badge, localized in all ten packs (new key `packagedAutomation.notRunningDeploymentPolicy`). The platform's sentence stays verbatim behind Details.
14+
- **Unchanged.** The switch stays enabled, stays checked while the flag is on, and still writes the flag. Rows with the other causes (`disabled_subflow`, `missing_trigger`, `binding_failure`) keep "Not running here". Running rows keep the primary track and "On"; off rows keep "Off".

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

Lines changed: 66 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@
3737
* row the engine reports enabled but unarmed (it carries an
3838
* `unboundCause`) keeps its switch on and reads "Not running here", never
3939
* "On". Bound flows and flows with no trigger read "On" exactly as
40-
* before, and a toggle re-reads what the engine armed.
40+
* before, and a toggle re-reads what the engine armed. Since
41+
* objectstack#27378 such a row's switch draws a muted on-track, and a
42+
* `deployment_policy` row says what that policy is in plain words; the
43+
* platform's sentence stays behind Details.
4144
* 8. **the clone result's next steps** (objectui#13270) — a clone runs
4245
* beside its source, so the result offers to switch the source off
4346
* through the SAME toggle as its row, and links the clone's Studio scope.
@@ -622,6 +625,13 @@ describe('the Activation cell says whether the flow runs', () => {
622625
return cell as HTMLElement;
623626
}
624627

628+
/** The words a `deployment_policy` row reads in place of the badge (objectstack#27378). */
629+
const POLICY_LINE = 'On, but this deployment does not run scheduled work';
630+
/** The muted checked track a not-running row's switch draws (objectstack#27378). */
631+
const MUTED_TRACK = 'data-[state=checked]:bg-muted-foreground/60';
632+
/** The primitive's own checked track, which `cn()` drops when the muted one is passed. */
633+
const PRIMARY_TRACK = 'data-[state=checked]:bg-primary';
634+
625635
/** A packaged schedule flow the deployment's policy left unarmed, flag on. */
626636
function withPolicyRow() {
627637
fixture.runtime = [
@@ -646,11 +656,28 @@ describe('the Activation cell says whether the flow runs', () => {
646656
// The switch keeps the author's flag: on, and still a live control.
647657
const toggle = within(cell).getByRole('switch', { name: 'Activation for Daily digest' });
648658
expect(toggle).toBeChecked();
659+
expect(toggle).toHaveAttribute('aria-checked', 'true');
649660
expect(toggle).toBeEnabled();
650-
// The badge says the flow does not run, and nothing in the cell says "On".
651-
expect(within(cell).getByText('Not running here')).toBeInTheDocument();
661+
// Its on-track is muted, not the primary fill a running flow draws
662+
// (objectstack#27378).
663+
expect(toggle).toHaveClass(MUTED_TRACK);
664+
expect(toggle).not.toHaveClass(PRIMARY_TRACK);
665+
// The cell says in plain words that the deployment does not run scheduled
666+
// work, and names no operator switch; there is no bare "On" badge.
667+
expect(cell.textContent).toBe(POLICY_LINE);
652668
expect(within(cell).queryByText('On')).toBeNull();
653-
expect(cell.textContent).toBe('Not running here');
669+
expect(cell.textContent).not.toContain('OS_AUTOMATION_SCHEDULED_WORK_ENABLED');
670+
expect(within(cell).getByTestId('packaged-flow-activation')).toHaveClass('text-muted-foreground');
671+
});
672+
673+
it('keeps the platform sentence, variable name and all, behind Details on a deployment-policy row', async () => {
674+
withPolicyRow();
675+
await renderPage();
676+
677+
const chip = within(screen.getByTestId('packaged-flow-pkg_digest')).getByRole('button', { name: 'Details' });
678+
fireEvent.click(chip);
679+
const disclosure = await screen.findByRole('dialog', { name: 'Details' });
680+
expect(disclosure.textContent).toBe(POLICY_REASON);
654681
});
655682

656683
it('keeps a bound flow, a flow with no trigger and a disabled flow exactly as before (controls)', async () => {
@@ -659,46 +686,65 @@ describe('the Activation cell says whether the flow runs', () => {
659686
withPolicyRow();
660687
await renderPage();
661688

662-
// Bound to its trigger: "On".
689+
// Bound to its trigger: "On", on the primary track.
663690
expect(activationCell('pkg_notify').textContent).toBe('On');
664691
// No declared trigger, so `bound: false` and no cause: it runs when
665692
// invoked, and is never called "not running".
666693
expect(activationCell('pkg_manual').textContent).toBe('On');
667694
// Switched off: "Off".
668695
expect(activationCell('pkg_escalate').textContent).toBe('Off');
696+
for (const name of ['pkg_notify', 'pkg_manual', 'pkg_escalate']) {
697+
const toggle = within(activationCell(name)).getByRole('switch');
698+
expect(toggle).toHaveClass(PRIMARY_TRACK);
699+
expect(toggle).not.toHaveClass(MUTED_TRACK);
700+
}
669701
// The policy row beside them is the only one that reads otherwise.
670-
expect(activationCell('pkg_digest').textContent).toBe('Not running here');
702+
expect(activationCell('pkg_digest').textContent).toBe(POLICY_LINE);
703+
expect(within(activationCell('pkg_digest')).getByRole('switch')).toHaveClass(MUTED_TRACK);
671704
});
672705

673-
it('reads every unbound cause the same way, and styles none of them as an error', async () => {
706+
it('reads every other unbound cause "Not running here", mutes every not-running track, and styles none as an error', async () => {
674707
withPolicyRow();
708+
const others = [
709+
['pkg_sync', 'Sync accounts', 'binding_failure'],
710+
['pkg_chain', 'Chain step', 'disabled_subflow'],
711+
['pkg_hook', 'Webhook in', 'missing_trigger'],
712+
] as const;
675713
fixture.runtime = [
676714
...fixture.runtime,
677-
{
678-
name: 'pkg_sync',
715+
...others.map(([name, , unboundCause]) => ({
716+
name,
679717
enabled: true,
680718
bound: false,
681719
triggerType: 'record_change',
682720
reason: BINDING_FAILED_REASON,
683-
unboundCause: 'binding_failure',
684-
},
721+
unboundCause,
722+
})),
685723
];
686-
fixture.meta = [...fixture.meta, packagedItem('pkg_sync', 'Sync accounts')];
724+
fixture.meta = [...fixture.meta, ...others.map(([name, label]) => packagedItem(name, label))];
687725
await renderPage();
688726

689-
const policy = within(activationCell('pkg_digest')).getByText('Not running here');
690-
const failure = within(activationCell('pkg_sync')).getByText('Not running here');
691-
// The badge names no cause: the Details chip carries the platform's words.
692-
expect(failure.className).toBe(policy.className);
693-
for (const badge of [policy, failure]) {
694-
expect(badge.className).not.toMatch(/destructive/);
695-
expect(badge).not.toHaveAttribute('role', 'alert');
727+
// Only `deployment_policy` gets its plain line; the other causes keep the
728+
// one badge, which names no cause — the Details chip carries the words.
729+
const badges = others.map(([name]) => within(activationCell(name)).getByText('Not running here'));
730+
for (const badge of badges) expect(badge.className).toBe(badges[0].className);
731+
const policy = within(activationCell('pkg_digest')).getByText(POLICY_LINE);
732+
for (const shown of [policy, ...badges]) {
733+
expect(shown.className).not.toMatch(/destructive/);
734+
expect(shown).not.toHaveAttribute('role', 'alert');
735+
}
736+
for (const name of ['pkg_digest', ...others.map(([n]) => n)]) {
737+
const toggle = within(activationCell(name)).getByRole('switch');
738+
expect(toggle).toBeChecked();
739+
expect(toggle).toHaveClass(MUTED_TRACK);
696740
}
697741
});
698742

699743
it('still writes the flag from a row that is not running', async () => {
700744
withPolicyRow();
701745
await renderPage();
746+
// Muted, and still the live control: the colour is the only change.
747+
expect(screen.getByRole('switch', { name: 'Activation for Daily digest' })).toHaveClass(MUTED_TRACK);
702748

703749
fireEvent.click(screen.getByRole('switch', { name: 'Activation for Daily digest' }));
704750
await waitFor(() => expect(toggleCalls()).toHaveLength(1));
@@ -730,7 +776,7 @@ describe('the Activation cell says whether the flow runs', () => {
730776
await waitFor(() => expect(toggleCalls()).toHaveLength(1));
731777
expect(toggleCalls()[0].body).toEqual({ enabled: true });
732778

733-
await waitFor(() => expect(activationCell('pkg_digest').textContent).toBe('Not running here'));
779+
await waitFor(() => expect(activationCell('pkg_digest').textContent).toBe(POLICY_LINE));
734780
expect(statusReads()).toBe(readsBefore + 1);
735781
expect(screen.getByRole('switch', { name: 'Activation for Daily digest' })).toBeChecked();
736782
});

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

Lines changed: 51 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,13 @@
6868
* (the author may want the flag set for a deployment that does arm it) and the
6969
* badge reads "Not running here", the words Studio's rail uses for the same
7070
* state, instead of an "On" an admin takes for "running". `activationReading`
71-
* in `packagedFlows.ts` is that rule. After a toggle the runtime states are
72-
* read again, because the toggle's answer carries the flag alone and the flip
73-
* can move what the engine armed — this row's trigger, or a caller of it.
71+
* in `packagedFlows.ts` is that rule. Such a row's switch also draws a muted
72+
* on-track, and a `deployment_policy` row reads "On, but this deployment does
73+
* not run scheduled work" in place of the badge (objectstack#27378): the
74+
* platform's sentence names an operator switch the admin cannot reach from
75+
* the browser, so it stays behind Details. After a toggle the runtime states
76+
* are read again, because the toggle's answer carries the flag alone and the
77+
* flip can move what the engine armed — this row's trigger, or a caller of it.
7478
*
7579
* ## Server refusals reach the operator VERBATIM
7680
*
@@ -161,6 +165,14 @@ import { PageHeader } from '../../layout/PageHeader.js';
161165

162166
const JSON_HEADERS = { Accept: 'application/json' } as const;
163167

168+
/**
169+
* The checked track of a switch whose flag is on while the flow does not run
170+
* (objectstack#27378). The same muted fill Studio's Automations pillar draws
171+
* for an on switch it cannot flip; `cn()` in `Switch` lets it replace the
172+
* primitive's `data-[state=checked]:bg-primary`.
173+
*/
174+
const NOT_RUNNING_TRACK = 'data-[state=checked]:bg-muted-foreground/60';
175+
164176
async function readJson(res: Response): Promise<unknown> {
165177
return res.json().catch(() => null);
166178
}
@@ -247,8 +259,9 @@ type ToggleOutcome = { ok: true; enabled: boolean } | { ok: false; message: stri
247259
* it", and a deployment-policy row and a real binding failure arrive in the
248260
* same `enabled: true, bound: false` shape. The structured field beside
249261
* `reason` that could name which of the two a row is now rides the wire
250-
* (`unboundCause`, objectstack#23842); this page reads it for PRESENCE only —
251-
* the Activation badge's "not running" — and still names no cause.
262+
* (`unboundCause`, objectstack#23842). The Activation cell reads it — its
263+
* presence for "not running", and `deployment_policy` for a plain line saying
264+
* what that policy is (objectstack#27378) — and this chip still names no cause.
252265
*
253266
* The disclosure shows the sentence verbatim and whole — not truncated, not
254267
* reworded, not restyled by what it says — muted, and not as an alert. A
@@ -666,23 +679,44 @@ export function PackagedAutomationPage() {
666679
defaultValue: 'Activation for {{label}}',
667680
label: row.label,
668681
})}
682+
// The flag is on but the flow does not run, so the
683+
// on-track is muted rather than primary
684+
// (objectstack#27378): a green track reads as
685+
// "running". Only the colour moves — the thumb,
686+
// `aria-checked` and the toggle stay the flag's.
687+
className={reading === 'not-running' ? NOT_RUNNING_TRACK : undefined}
669688
/>
670689
{/* Whether the flow RUNS, beside the switch that holds
671690
its flag (objectui#13159). "Not running here" is
672691
outlined, not destructive: a deployment policy is not
673692
a defect, and the Details chip carries the platform's
674-
sentence for why. */}
675-
<Badge
676-
data-testid="packaged-flow-activation"
677-
data-reading={reading}
678-
variant={reading === 'on' ? 'default' : reading === 'not-running' ? 'outline' : 'secondary'}
679-
>
680-
{reading === 'on'
681-
? t('packagedAutomation.on', { defaultValue: 'On' })
682-
: reading === 'not-running'
683-
? t('packagedAutomation.notRunning', { defaultValue: 'Not running here' })
684-
: t('packagedAutomation.off', { defaultValue: 'Off' })}
685-
</Badge>
693+
sentence for why. A deployment-policy row says what
694+
that policy is in plain words instead, as a muted
695+
line that wraps in the cell (objectstack#27378): a
696+
badge is a one-line pill. */}
697+
{reading === 'not-running' && row.unboundCause === 'deployment_policy' ? (
698+
<span
699+
data-testid="packaged-flow-activation"
700+
data-reading={reading}
701+
className="text-xs leading-4 text-muted-foreground"
702+
>
703+
{t('packagedAutomation.notRunningDeploymentPolicy', {
704+
defaultValue: 'On, but this deployment does not run scheduled work',
705+
})}
706+
</span>
707+
) : (
708+
<Badge
709+
data-testid="packaged-flow-activation"
710+
data-reading={reading}
711+
variant={reading === 'on' ? 'default' : reading === 'not-running' ? 'outline' : 'secondary'}
712+
>
713+
{reading === 'on'
714+
? t('packagedAutomation.on', { defaultValue: 'On' })
715+
: reading === 'not-running'
716+
? t('packagedAutomation.notRunning', { defaultValue: 'Not running here' })
717+
: t('packagedAutomation.off', { defaultValue: 'Off' })}
718+
</Badge>
719+
)}
686720
</div>
687721
</TableCell>
688722
<TableCell className="align-top text-right">

‎ui/packages/app-shell/src/views/setup/packagedFlows.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,9 @@ export interface PackagedFlowRow {
6363
* row carried a non-empty string one, which the contract sends exactly when
6464
* the flow is enabled, declares a trigger, and that trigger is NOT armed on
6565
* this deployment. Read for its PRESENCE by {@link activationReading}: the
66-
* flow does not run, whichever cause it is (objectui#13159). No cause is
67-
* told apart on this page.
66+
* flow does not run, whichever cause it is (objectui#13159). The page tells
67+
* one cause apart: a `deployment_policy` row says what that policy is in
68+
* plain words (objectstack#27378); every other cause reads alike.
6869
*/
6970
unboundCause?: string;
7071
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5090,6 +5090,7 @@ const ar = {
50905090
on: "مفعل",
50915091
off: "إيقاف",
50925092
notRunning: "لا يعمل هنا",
5093+
notRunningDeploymentPolicy: "مفعل، لكن هذا النشر لا يشغّل المهام المجدولة",
50935094
clone: "استنساخ",
50945095
cloneTitle: "استنساخ تدفق الحزمة",
50955096
cloneBody: "تحتفظ النسخة بالتعريف كاملاً وتتطلب اسم آلة وتسمية جديدين. حرّر النسخة في Studio.",

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4616,6 +4616,7 @@ const de = {
46164616
on: "An",
46174617
off: "Aus",
46184618
notRunning: "Läuft hier nicht",
4619+
notRunningDeploymentPolicy: "An, aber diese Installation führt keine geplanten Aufgaben aus",
46194620
clone: "Klonen",
46204621
cloneTitle: "Paket-Flow klonen",
46214622
cloneBody: "Die Kopie übernimmt die gesamte Definition und benötigt einen neuen Maschinennamen und ein neues Label. Bearbeiten Sie die Kopie im Studio.",

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5385,6 +5385,11 @@ const en = {
53855385
// keeps the flag, this says the flow does not run. The same words as
53865386
// Studio's rail for the same state (`engine.studio.auto.notRunning`).
53875387
notRunning: 'Not running here',
5388+
// The same row when the engine's cause is `deployment_policy` (objectstack#27378):
5389+
// package-authored scheduled work is off on this deployment. Plain words for the
5390+
// admin; the platform's sentence, which names the operator switch, stays behind
5391+
// the Details chip.
5392+
notRunningDeploymentPolicy: 'On, but this deployment does not run scheduled work',
53885393
clone: 'Clone',
53895394
cloneTitle: 'Clone packaged flow',
53905395
cloneBody:

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4734,6 +4734,7 @@ const es = {
47344734
on: "Activado",
47354735
off: "Desactivado",
47364736
notRunning: "No se ejecuta aquí",
4737+
notRunningDeploymentPolicy: "Activado, pero esta implementación no ejecuta tareas programadas",
47374738
clone: "Clonar",
47384739
cloneTitle: "Clonar flujo del paquete",
47394740
cloneBody: "La copia conserva toda la definición y necesita un nombre de máquina y una etiqueta nuevos. Edita la copia en Studio.",

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4730,6 +4730,7 @@ const fr = {
47304730
on: "Activé",
47314731
off: "Désactivé",
47324732
notRunning: "Ne s'exécute pas ici",
4733+
notRunningDeploymentPolicy: "Activé, mais ce déploiement n'exécute pas les tâches planifiées",
47334734
clone: "Cloner",
47344735
cloneTitle: "Cloner le flux du package",
47354736
cloneBody: "La copie reprend toute la définition et exige un nouveau nom machine et un nouveau libellé. Modifiez la copie dans Studio.",

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4617,6 +4617,7 @@ const ja = {
46174617
on: "オン",
46184618
off: "オフ",
46194619
notRunning: "ここでは実行されていません",
4620+
notRunningDeploymentPolicy: "オンですが、このデプロイではスケジュールされた処理を実行しません",
46204621
clone: "クローン",
46214622
cloneTitle: "パッケージフローをクローン",
46224623
cloneBody: "コピーは定義全体を引き継ぎ、新しいマシン名とラベルが必要です。コピーの編集は Studio で行ってください。",

0 commit comments

Comments
 (0)