diff --git a/.claude/skills/duplo-extension-dev/SKILL.md b/.claude/skills/duplo-extension-dev/SKILL.md index 549533d..df1c6b4 100644 --- a/.claude/skills/duplo-extension-dev/SKILL.md +++ b/.claude/skills/duplo-extension-dev/SKILL.md @@ -162,7 +162,7 @@ required/optional), a **Result** field table (name · type), the **provisioning **detail view's shape** — the **lifecycle phases** this resource goes through (label + the status/result field that drives each; [19-detail-page](reference/19-detail-page.md) → "Deriving phases") and the **Result tabs** (Overview at minimum; name each further tab; [17-custom-result-views](reference/17-custom-result-views.md)) — and a short -**user-experience** walkthrough: left-nav placement, the add form, the list, the detail page, and what provisioning +**user-experience** walkthrough: left-nav placement, the add form (with the AI-use disclosure in Agent mode), the list, the detail page, and what provisioning does end-to-end. Do this per resource for multi-resource extensions. **Where the answers come from / how to ask:** @@ -209,7 +209,7 @@ Adapt inside `extensions//` — rename `HelloWorld`→`` consistentl `extensions/-` (== manifest `restSegment`; a bare leaf 404s).** Rename every FE `Hello`/`hw` identifier (files, classes, selectors, routes, and a **unique** `federation.config.js` `name`) per the rename table in [02](reference/02-authoring-guide.md#frontend). List = `searchable-datatable` with the filter + workspace-refresh - wiring; Add/Edit = `panel-form-accordion` + `form-field`; Detail = the **Template-G shell the scaffold already + wiring; Add/Edit = `panel-form-accordion` + `form-field`; **Agent mode: every Add/Edit form ends with ``** (ISO 42001; the scaffold carries it, [14](reference/14-forms-and-wizards.md#ai-use-disclosure-agent-mode)); Detail = the **Template-G shell the scaffold already carries** — keep `shared/` as copied and **rewrite the two things that are the resource's own**: the `phases()` computed (your lifecycle ladder, per mode) and the Result strip's Overview tiles + any further tabs ([19](reference/19-detail-page.md), [17](reference/17-custom-result-views.md)). The federation `shared` block stays a @@ -233,11 +233,11 @@ status", the "Needs your input" phase) exists **only in Agent mode** ([19](refer 3. add an `IDuploExtension` whose `Configure` calls `builder.Services.AddHostedService<Worker>();` — hot-load starts the worker directly; `Configure` is what the boot-time replay uses ([10](reference/10-sdk-api.md) Gotchas). 4. **delete** the `skills/` dir and ship **no** `skills`/`skillMappings` in the manifest. - 5. **FE:** remove the ticket UI, drop the "Needs your input" phase, compute the Worker ladder from `workerState` + 5. **FE:** remove the ticket UI and the `` (Agent-only), drop the "Needs your input" phase, compute the Worker ladder from `workerState` (copy `samples/worker-compute`'s `phases()`), remove `track()`/`ticketName()` and the list-row "Track Provisioning" item, label the add button **"Create"** (not "Provision"). - **Agent**: keep `skills/provision-*/SKILL.md` (+ `provision.sh`, write to the OWN route) and the manifest - `skills` + `skillMappings`; keep the ticket UI. **Deprovision seam (if it creates real infra):** the platform reuses the + `skills` + `skillMappings`; keep the ticket UI and the `` on every Add/Edit form. **Deprovision seam (if it creates real infra):** the platform reuses the SAME ticket and sends the generic teardown message — there is **no separate deprovision skill mapping**, so the provision `SKILL.md` needs a **Deprovision** section + an idempotent `deprovision.sh`, or a second skill in the same `skillNames` ([11](reference/11-deprovisioning.md)). Once your skill POSTs `DeProvisioned`, the platform hard-deletes diff --git a/.claude/skills/duplo-extension-dev/reference/02-authoring-guide.md b/.claude/skills/duplo-extension-dev/reference/02-authoring-guide.md index c0b9bb3..c58e275 100644 --- a/.claude/skills/duplo-extension-dev/reference/02-authoring-guide.md +++ b/.claude/skills/duplo-extension-dev/reference/02-authoring-guide.md @@ -259,12 +259,12 @@ a plain `npm install` just works from a fresh clone. Two schemes coexist: - **The samples** share one copy at repo-root `packages/`, since they never leave this repo: ```json - "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.2.0.tgz", + "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.4.0.tgz", ``` - **The skill template** (`templates/helloworld/frontend/`) keeps its **own** copy under `vendor/`, because it gets copied out to `extensions//` or a provisioning workdir and must stay self-contained: ```json - "@duplocloud-internal/ng-common-lib": "file:vendor/duplocloud-internal-ng-common-lib-0.2.0.tgz", + "@duplocloud-internal/ng-common-lib": "file:vendor/duplocloud-internal-ng-common-lib-0.4.0.tgz", ``` Scaffolding from the template carries the tarball and the specifier with it — keep both when you copy. diff --git a/.claude/skills/duplo-extension-dev/reference/14-forms-and-wizards.md b/.claude/skills/duplo-extension-dev/reference/14-forms-and-wizards.md index 2238eeb..fc2af7d 100644 --- a/.claude/skills/duplo-extension-dev/reference/14-forms-and-wizards.md +++ b/.claude/skills/duplo-extension-dev/reference/14-forms-and-wizards.md @@ -19,6 +19,20 @@ Import `SharedFormsModule` and use: The single-page create form is the `panel-form-accordion` 3-column layout — see [02-authoring-guide](02-authoring-guide.md) and `samples/helloworld`. +## AI-use disclosure (Agent mode) + +DuploCloud is ISO 42001 certified: a form whose submit hands work to an AI agent (Agent mode — the resource maps a +skill in `manifest.skillMappings`) must say so at the point of use. Every Agent-mode Add/Edit form renders the +library's `` (import `AiDisclosureComponent` from `@duplocloud-internal/ng-common-lib`): + +- **Single-page form** — last element inside `.form-container`, under the Cancel/Provision row (see `samples/helloworld`). +- **Wizard** — pass `[aiDisclosure]="true"` to the copied `wizard-stepper`; it renders under the footer on every step. +- **Modal form** — inside `.modal-footer`, above the buttons. + +It renders "This platform uses AI. See documentation for more details."; a deployment can change the text and link in +its config (`text.aiDisclosure`, `links.aiDisclosure`). Don't hardcode the wording or set `defaultText`. Worker, +Passthrough and No-provision forms do **not** carry it. + ## Multi-step wizards — there is NO library stepper The library ships **no stepper/wizard component**, and the host's own multi-step forms (AppService, etc.) hand-roll @@ -121,6 +135,8 @@ prototype: omits a step defeats confirm-before-provision. - **Contextual error fallback**: `extractErrorMessage(err) || 'Could not create the .'` — name the action that failed. +- **AI-use disclosure** — Agent-mode wizards pass `[aiDisclosure]="true"` to the stepper + ([above](#ai-use-disclosure-agent-mode)). ## Dynamic fields from a remote schema diff --git a/.claude/skills/duplo-extension-dev/reference/19-detail-page.md b/.claude/skills/duplo-extension-dev/reference/19-detail-page.md index 56d2a4a..e9bf35a 100644 --- a/.claude/skills/duplo-extension-dev/reference/19-detail-page.md +++ b/.claude/skills/duplo-extension-dev/reference/19-detail-page.md @@ -122,7 +122,7 @@ Deployed phase does exactly this. ### Ladders by provisioning mode — and the ticket UI that goes with them Only **Agent** mode has a provisioning ticket. So only Agent-mode views render the header **Ask agent** -button, the rail's **Track status** (`[trackable]="true"`) and a **"Needs your input"** phase; they also +button, the rail's **Track status** (`[trackable]="true"`) and a **"Needs your input"** phase; their Add/Edit forms carry the `` ([14](14-forms-and-wizards.md#ai-use-disclosure-agent-mode)); they also keep `track()`/`ticketName()` and the list-row "Track Provisioning" item. Worker, Passthrough and No-provision views omit all of those, use the ladders below, and label the add button **"Create"** (not "Provision"). Opt-in Ask AI sessions ([16-ask-ai](16-ask-ai.md)) are user-created and work in diff --git a/.claude/skills/duplo-extension-dev/reference/20-ui-library.md b/.claude/skills/duplo-extension-dev/reference/20-ui-library.md index 04255eb..88a79cc 100644 --- a/.claude/skills/duplo-extension-dev/reference/20-ui-library.md +++ b/.claude/skills/duplo-extension-dev/reference/20-ui-library.md @@ -4,7 +4,7 @@ Everything the platform UI library exports, what each piece is for, how to impor inside an extension remote. Check here before hand-rolling a table, form control, viewer or modal — the platform almost certainly ships it already, and using it is what makes your pages match the suite. -Written against **0.3.0**. The source of truth is `portal/common-lib/public-api.ts` in duplo-ui; exact +Written against **0.4.0**. The source of truth is `portal/common-lib/public-api.ts` in duplo-ui; exact signatures are in the installed package — see [Checking an exact API](#checking-an-exact-api). ## Rules @@ -32,6 +32,7 @@ signatures are in the installed package — see [Checking an exact API](#checkin | Row actions beyond Add / Edit | `searchable-datatable` `[extraActions]` | [table slots](#table-slots-filters-actions-alert) | | A short child list inside a detail tab | `app-expandable-list` | [expandable list](#expandable-list) | | A form field, validator or error summary | `SharedFormsModule` | [14-forms-and-wizards](14-forms-and-wizards.md) | +| The AI-use disclosure on an Agent-mode form | `app-ai-disclosure` | [14-forms-and-wizards](14-forms-and-wizards.md#ai-use-disclosure-agent-mode) | | The real reason an API call failed | `extractErrorMessage`, `[form-group-errors]` | [15-error-handling](15-error-handling.md) | | A delete / deprovision confirmation | `DeleteConfirmationModalService.openGeneric` | [confirm dialogs](#confirm-dialogs) | | A yes/no confirmation | `ConfirmationModalService.openWithMessage` | [confirm dialogs](#confirm-dialogs) | diff --git a/.claude/skills/duplo-extension-dev/templates/helloworld/frontend/package-lock.json b/.claude/skills/duplo-extension-dev/templates/helloworld/frontend/package-lock.json index 25c8ccd..2849807 100644 --- a/.claude/skills/duplo-extension-dev/templates/helloworld/frontend/package-lock.json +++ b/.claude/skills/duplo-extension-dev/templates/helloworld/frontend/package-lock.json @@ -17,7 +17,7 @@ "@angular/material": "^22.1.0", "@angular/platform-browser": "^22.1.0", "@angular/router": "^22.1.0", - "@duplocloud-internal/ng-common-lib": "file:vendor/duplocloud-internal-ng-common-lib-0.3.0.tgz", + "@duplocloud-internal/ng-common-lib": "file:vendor/duplocloud-internal-ng-common-lib-0.4.0.tgz", "@ng-bootstrap/ng-bootstrap": "^21.0.0", "@ng-select/ng-select": "^23.5.1", "@ngbracket/ngx-layout": "^22.0.1", @@ -1893,9 +1893,9 @@ } }, "node_modules/@duplocloud-internal/ng-common-lib": { - "version": "0.3.0", - "resolved": "file:vendor/duplocloud-internal-ng-common-lib-0.3.0.tgz", - "integrity": "sha512-bJHET6Rxn07EExil8KomZu3ZkpXYixtccCm5GDDOLzM+Z8ajHtZVlskUlb51MlcihGYEl09dVJgCXRaHaYIPig==", + "version": "0.4.0", + "resolved": "file:vendor/duplocloud-internal-ng-common-lib-0.4.0.tgz", + "integrity": "sha512-eSTVe/CXrskZcFBO28lkuI0oHSr5PzAqy05/aIH6gaUMnkZxLuO0/4ZfpczOu1/enPXT4lU2vI9Ss4GsIAilng==", "bundleDependencies": [ "ng-block-ui" ], diff --git a/.claude/skills/duplo-extension-dev/templates/helloworld/frontend/package.json b/.claude/skills/duplo-extension-dev/templates/helloworld/frontend/package.json index 997ae88..2108d00 100644 --- a/.claude/skills/duplo-extension-dev/templates/helloworld/frontend/package.json +++ b/.claude/skills/duplo-extension-dev/templates/helloworld/frontend/package.json @@ -25,7 +25,7 @@ "@angular/material": "^22.1.0", "@angular/platform-browser": "^22.1.0", "@angular/router": "^22.1.0", - "@duplocloud-internal/ng-common-lib": "file:vendor/duplocloud-internal-ng-common-lib-0.3.0.tgz", + "@duplocloud-internal/ng-common-lib": "file:vendor/duplocloud-internal-ng-common-lib-0.4.0.tgz", "@ng-bootstrap/ng-bootstrap": "^21.0.0", "@ng-select/ng-select": "^23.5.1", "@ngbracket/ngx-layout": "^22.0.1", diff --git a/.claude/skills/duplo-extension-dev/templates/helloworld/frontend/src/app/add/add-hello.component.ts b/.claude/skills/duplo-extension-dev/templates/helloworld/frontend/src/app/add/add-hello.component.ts index 5067cd2..8706305 100644 --- a/.claude/skills/duplo-extension-dev/templates/helloworld/frontend/src/app/add/add-hello.component.ts +++ b/.claude/skills/duplo-extension-dev/templates/helloworld/frontend/src/app/add/add-hello.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit, inject, signal, viewChild } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { FormGroupErrorsComponent, SharedFormsModule } from '@duplocloud-internal/ng-common-lib'; +import { AiDisclosureComponent, FormGroupErrorsComponent, SharedFormsModule } from '@duplocloud-internal/ng-common-lib'; import { HelloService } from '../hello.service'; // Add/Edit form in the platform's 3-column `panel-form-accordion` layout: title+description (left), inputs @@ -16,7 +16,7 @@ import { HelloService } from '../hello.service'; // SharedFormsModule re-exports FormsModule plus form-field and every validation directive used here. @Component({ selector: 'hw-add', - imports: [SharedFormsModule], + imports: [SharedFormsModule, AiDisclosureComponent], styles: [` :host { display: block; } .panel-form-accordion { background: #fff; padding: 1.25rem 0 1rem 1.5rem; } @@ -73,6 +73,8 @@ import { HelloService } from '../hello.service'; {{ isEdit ? 'Save' : 'Provision' }} + + } diff --git a/.claude/skills/duplo-extension-dev/templates/helloworld/frontend/vendor/duplocloud-internal-ng-common-lib-0.3.0.tgz b/.claude/skills/duplo-extension-dev/templates/helloworld/frontend/vendor/duplocloud-internal-ng-common-lib-0.3.0.tgz deleted file mode 100644 index 32ecf3d..0000000 Binary files a/.claude/skills/duplo-extension-dev/templates/helloworld/frontend/vendor/duplocloud-internal-ng-common-lib-0.3.0.tgz and /dev/null differ diff --git a/.claude/skills/duplo-extension-dev/templates/helloworld/frontend/vendor/duplocloud-internal-ng-common-lib-0.4.0.tgz b/.claude/skills/duplo-extension-dev/templates/helloworld/frontend/vendor/duplocloud-internal-ng-common-lib-0.4.0.tgz new file mode 100644 index 0000000..7fe8927 Binary files /dev/null and b/.claude/skills/duplo-extension-dev/templates/helloworld/frontend/vendor/duplocloud-internal-ng-common-lib-0.4.0.tgz differ diff --git a/docs/UPGRADING-ng-common-lib.md b/docs/UPGRADING-ng-common-lib.md index 90b9470..de81f53 100644 --- a/docs/UPGRADING-ng-common-lib.md +++ b/docs/UPGRADING-ng-common-lib.md @@ -1,7 +1,7 @@ # Upgrading an extension's UI library: the vendored `@duplocloud-internal/ng-common-lib` tarball For extensions built from this dev-kit (or from the `duplo-extension-dev` skill template) that vendor the UI -library as a tarball. The current line is 0.2.0 (Angular 22); the notes below contrast it with the 0.1.x line. +library as a tarball. The current line is 0.4.0 (Angular 22); the notes below contrast it with the 0.1.x line. > **This is not a drop-in upgrade.** 0.2.0 is compiled against **Angular 22** and ships as ESM > (`fesm2022`, `"type": "module"`); its peer range is `@angular/core@^22.1.0`. It is meant to be consumed by diff --git a/packages/duplocloud-internal-ng-common-lib-0.3.0.tgz b/packages/duplocloud-internal-ng-common-lib-0.3.0.tgz deleted file mode 100644 index 32ecf3d..0000000 Binary files a/packages/duplocloud-internal-ng-common-lib-0.3.0.tgz and /dev/null differ diff --git a/packages/duplocloud-internal-ng-common-lib-0.4.0.tgz b/packages/duplocloud-internal-ng-common-lib-0.4.0.tgz new file mode 100644 index 0000000..7fe8927 Binary files /dev/null and b/packages/duplocloud-internal-ng-common-lib-0.4.0.tgz differ diff --git a/samples/helloworld/frontend/package-lock.json b/samples/helloworld/frontend/package-lock.json index 794b6e2..031f645 100644 --- a/samples/helloworld/frontend/package-lock.json +++ b/samples/helloworld/frontend/package-lock.json @@ -17,7 +17,7 @@ "@angular/material": "^22.1.0", "@angular/platform-browser": "^22.1.0", "@angular/router": "^22.1.0", - "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.3.0.tgz", + "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.4.0.tgz", "@ng-bootstrap/ng-bootstrap": "^21.0.0", "@ng-select/ng-select": "^23.5.1", "@ngbracket/ngx-layout": "^22.0.1", @@ -1893,9 +1893,9 @@ } }, "node_modules/@duplocloud-internal/ng-common-lib": { - "version": "0.3.0", - "resolved": "file:../../../packages/duplocloud-internal-ng-common-lib-0.3.0.tgz", - "integrity": "sha512-bJHET6Rxn07EExil8KomZu3ZkpXYixtccCm5GDDOLzM+Z8ajHtZVlskUlb51MlcihGYEl09dVJgCXRaHaYIPig==", + "version": "0.4.0", + "resolved": "file:../../../packages/duplocloud-internal-ng-common-lib-0.4.0.tgz", + "integrity": "sha512-eSTVe/CXrskZcFBO28lkuI0oHSr5PzAqy05/aIH6gaUMnkZxLuO0/4ZfpczOu1/enPXT4lU2vI9Ss4GsIAilng==", "bundleDependencies": [ "ng-block-ui" ], diff --git a/samples/helloworld/frontend/package.json b/samples/helloworld/frontend/package.json index 9ba2bf5..fcb6fc6 100644 --- a/samples/helloworld/frontend/package.json +++ b/samples/helloworld/frontend/package.json @@ -25,7 +25,7 @@ "@angular/material": "^22.1.0", "@angular/platform-browser": "^22.1.0", "@angular/router": "^22.1.0", - "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.3.0.tgz", + "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.4.0.tgz", "@ng-bootstrap/ng-bootstrap": "^21.0.0", "@ng-select/ng-select": "^23.5.1", "@ngbracket/ngx-layout": "^22.0.1", diff --git a/samples/helloworld/frontend/src/app/add/add-hello.component.ts b/samples/helloworld/frontend/src/app/add/add-hello.component.ts index 1cd597c..fc5aa28 100644 --- a/samples/helloworld/frontend/src/app/add/add-hello.component.ts +++ b/samples/helloworld/frontend/src/app/add/add-hello.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit, inject, signal, viewChild } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { FormGroupErrorsComponent, SharedFormsModule } from '@duplocloud-internal/ng-common-lib'; +import { AiDisclosureComponent, FormGroupErrorsComponent, SharedFormsModule } from '@duplocloud-internal/ng-common-lib'; import { HelloService } from '../hello.service'; // Add/Edit form in the platform's 3-column `panel-form-accordion` layout: title+description (left), inputs @@ -16,7 +16,7 @@ import { HelloService } from '../hello.service'; // SharedFormsModule re-exports FormsModule plus form-field and every validation directive used here. @Component({ selector: 'hw-add', - imports: [SharedFormsModule], + imports: [SharedFormsModule, AiDisclosureComponent], styles: [` :host { display: block; } .panel-form-accordion { background: #fff; padding: 1.25rem 0 1rem 1.5rem; } @@ -73,6 +73,8 @@ import { HelloService } from '../hello.service'; {{ isEdit ? 'Save' : 'Provision' }} + + } diff --git a/samples/network-stack/frontend/package-lock.json b/samples/network-stack/frontend/package-lock.json index a6d02c2..2d2b47e 100644 --- a/samples/network-stack/frontend/package-lock.json +++ b/samples/network-stack/frontend/package-lock.json @@ -17,7 +17,7 @@ "@angular/material": "^22.1.0", "@angular/platform-browser": "^22.1.0", "@angular/router": "^22.1.0", - "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.3.0.tgz", + "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.4.0.tgz", "@ng-bootstrap/ng-bootstrap": "^21.0.0", "@ng-select/ng-select": "^23.5.1", "@ngbracket/ngx-layout": "^22.0.1", @@ -1893,9 +1893,9 @@ } }, "node_modules/@duplocloud-internal/ng-common-lib": { - "version": "0.3.0", - "resolved": "file:../../../packages/duplocloud-internal-ng-common-lib-0.3.0.tgz", - "integrity": "sha512-bJHET6Rxn07EExil8KomZu3ZkpXYixtccCm5GDDOLzM+Z8ajHtZVlskUlb51MlcihGYEl09dVJgCXRaHaYIPig==", + "version": "0.4.0", + "resolved": "file:../../../packages/duplocloud-internal-ng-common-lib-0.4.0.tgz", + "integrity": "sha512-eSTVe/CXrskZcFBO28lkuI0oHSr5PzAqy05/aIH6gaUMnkZxLuO0/4ZfpczOu1/enPXT4lU2vI9Ss4GsIAilng==", "bundleDependencies": [ "ng-block-ui" ], diff --git a/samples/network-stack/frontend/package.json b/samples/network-stack/frontend/package.json index 7936475..c4537a3 100644 --- a/samples/network-stack/frontend/package.json +++ b/samples/network-stack/frontend/package.json @@ -25,7 +25,7 @@ "@angular/material": "^22.1.0", "@angular/platform-browser": "^22.1.0", "@angular/router": "^22.1.0", - "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.3.0.tgz", + "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.4.0.tgz", "@ng-bootstrap/ng-bootstrap": "^21.0.0", "@ng-select/ng-select": "^23.5.1", "@ngbracket/ngx-layout": "^22.0.1", diff --git a/samples/network-stack/frontend/src/app/add/add-network-stack.component.ts b/samples/network-stack/frontend/src/app/add/add-network-stack.component.ts index 140ff19..0b57892 100644 --- a/samples/network-stack/frontend/src/app/add/add-network-stack.component.ts +++ b/samples/network-stack/frontend/src/app/add/add-network-stack.component.ts @@ -30,6 +30,7 @@ import { WizardStep, WizardStepperComponent } from '../wizard/wizard-stepper.com
+ @if (aiDisclosure()) { + + } `, }) @@ -115,6 +120,8 @@ export class WizardStepperComponent { readonly nextDisabled = input(false); readonly saving = input(false); readonly finishLabel = input('Create'); + /** Agent-mode forms only (ISO 42001); the stepper is shared with Worker-mode extensions. */ + readonly aiDisclosure = input(false); readonly error = input(''); /** Page heading rendered inside the card (never wrap the stepper in another card to fake one). */ readonly title = input(''); diff --git a/samples/parent-child/frontend/package-lock.json b/samples/parent-child/frontend/package-lock.json index bb84011..1f5168f 100644 --- a/samples/parent-child/frontend/package-lock.json +++ b/samples/parent-child/frontend/package-lock.json @@ -17,7 +17,7 @@ "@angular/material": "^22.1.0", "@angular/platform-browser": "^22.1.0", "@angular/router": "^22.1.0", - "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.3.0.tgz", + "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.4.0.tgz", "@ng-bootstrap/ng-bootstrap": "^21.0.0", "@ng-select/ng-select": "^23.5.1", "@ngbracket/ngx-layout": "^22.0.1", @@ -1893,9 +1893,9 @@ } }, "node_modules/@duplocloud-internal/ng-common-lib": { - "version": "0.3.0", - "resolved": "file:../../../packages/duplocloud-internal-ng-common-lib-0.3.0.tgz", - "integrity": "sha512-bJHET6Rxn07EExil8KomZu3ZkpXYixtccCm5GDDOLzM+Z8ajHtZVlskUlb51MlcihGYEl09dVJgCXRaHaYIPig==", + "version": "0.4.0", + "resolved": "file:../../../packages/duplocloud-internal-ng-common-lib-0.4.0.tgz", + "integrity": "sha512-eSTVe/CXrskZcFBO28lkuI0oHSr5PzAqy05/aIH6gaUMnkZxLuO0/4ZfpczOu1/enPXT4lU2vI9Ss4GsIAilng==", "bundleDependencies": [ "ng-block-ui" ], diff --git a/samples/parent-child/frontend/package.json b/samples/parent-child/frontend/package.json index 4d0e8c1..49cded6 100644 --- a/samples/parent-child/frontend/package.json +++ b/samples/parent-child/frontend/package.json @@ -25,7 +25,7 @@ "@angular/material": "^22.1.0", "@angular/platform-browser": "^22.1.0", "@angular/router": "^22.1.0", - "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.3.0.tgz", + "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.4.0.tgz", "@ng-bootstrap/ng-bootstrap": "^21.0.0", "@ng-select/ng-select": "^23.5.1", "@ngbracket/ngx-layout": "^22.0.1", diff --git a/samples/parent-child/frontend/src/app/children/add-child.component.ts b/samples/parent-child/frontend/src/app/children/add-child.component.ts index 5f7180e..21664ac 100644 --- a/samples/parent-child/frontend/src/app/children/add-child.component.ts +++ b/samples/parent-child/frontend/src/app/children/add-child.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit, inject, signal, viewChild } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { FormGroupErrorsComponent, SharedFormsModule } from '@duplocloud-internal/ng-common-lib'; +import { AiDisclosureComponent, FormGroupErrorsComponent, SharedFormsModule } from '@duplocloud-internal/ng-common-lib'; import { HelloChild, ParentChildService } from '../parentchild.service'; // Create/Edit form in the platform 3-column `panel-form-accordion` layout. parentId comes from the nested @@ -9,7 +9,7 @@ import { HelloChild, ParentChildService } from '../parentchild.service'; // prefill repainting under the OnPush default). @Component({ selector: 'pc-add-child', - imports: [SharedFormsModule], + imports: [SharedFormsModule, AiDisclosureComponent], styles: [` :host { display: block; } .panel-form-accordion { background: #fff; padding: 1.25rem 0 1rem 1.5rem; } @@ -55,6 +55,8 @@ import { HelloChild, ParentChildService } from '../parentchild.service'; {{ isEdit ? 'Save' : 'Provision' }} + + } diff --git a/samples/parent-child/frontend/src/app/parents/add-parent.component.ts b/samples/parent-child/frontend/src/app/parents/add-parent.component.ts index 4f940ca..3daa0a6 100644 --- a/samples/parent-child/frontend/src/app/parents/add-parent.component.ts +++ b/samples/parent-child/frontend/src/app/parents/add-parent.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit, inject, signal, viewChild } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { FormGroupErrorsComponent, SharedFormsModule } from '@duplocloud-internal/ng-common-lib'; +import { AiDisclosureComponent, FormGroupErrorsComponent, SharedFormsModule } from '@duplocloud-internal/ng-common-lib'; import { HelloParent, ParentChildService } from '../parentchild.service'; // Create/Edit form in the platform 3-column `panel-form-accordion` layout (title | inputs | help). The @@ -10,7 +10,7 @@ import { HelloParent, ParentChildService } from '../parentchild.service'; // assign to a signal, and signals keep async prefills repainting under the OnPush default). @Component({ selector: 'pc-add-parent', - imports: [SharedFormsModule], + imports: [SharedFormsModule, AiDisclosureComponent], styles: [` :host { display: block; } .panel-form-accordion { background: #fff; padding: 1.25rem 0 1rem 1.5rem; } @@ -56,6 +56,8 @@ import { HelloParent, ParentChildService } from '../parentchild.service'; {{ isEdit ? 'Save' : 'Provision' }} + + } diff --git a/samples/passthrough-configmap/frontend/package-lock.json b/samples/passthrough-configmap/frontend/package-lock.json index 837f47c..4319eea 100644 --- a/samples/passthrough-configmap/frontend/package-lock.json +++ b/samples/passthrough-configmap/frontend/package-lock.json @@ -17,7 +17,7 @@ "@angular/material": "^22.1.0", "@angular/platform-browser": "^22.1.0", "@angular/router": "^22.1.0", - "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.3.0.tgz", + "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.4.0.tgz", "@ng-bootstrap/ng-bootstrap": "^21.0.0", "@ng-select/ng-select": "^23.5.1", "@ngbracket/ngx-layout": "^22.0.1", @@ -1893,9 +1893,9 @@ } }, "node_modules/@duplocloud-internal/ng-common-lib": { - "version": "0.3.0", - "resolved": "file:../../../packages/duplocloud-internal-ng-common-lib-0.3.0.tgz", - "integrity": "sha512-bJHET6Rxn07EExil8KomZu3ZkpXYixtccCm5GDDOLzM+Z8ajHtZVlskUlb51MlcihGYEl09dVJgCXRaHaYIPig==", + "version": "0.4.0", + "resolved": "file:../../../packages/duplocloud-internal-ng-common-lib-0.4.0.tgz", + "integrity": "sha512-eSTVe/CXrskZcFBO28lkuI0oHSr5PzAqy05/aIH6gaUMnkZxLuO0/4ZfpczOu1/enPXT4lU2vI9Ss4GsIAilng==", "bundleDependencies": [ "ng-block-ui" ], diff --git a/samples/passthrough-configmap/frontend/package.json b/samples/passthrough-configmap/frontend/package.json index 3e5b9e9..16814b1 100644 --- a/samples/passthrough-configmap/frontend/package.json +++ b/samples/passthrough-configmap/frontend/package.json @@ -25,7 +25,7 @@ "@angular/material": "^22.1.0", "@angular/platform-browser": "^22.1.0", "@angular/router": "^22.1.0", - "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.3.0.tgz", + "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.4.0.tgz", "@ng-bootstrap/ng-bootstrap": "^21.0.0", "@ng-select/ng-select": "^23.5.1", "@ngbracket/ngx-layout": "^22.0.1", diff --git a/samples/worker-appstack/frontend/package-lock.json b/samples/worker-appstack/frontend/package-lock.json index ee93081..0f4a3c5 100644 --- a/samples/worker-appstack/frontend/package-lock.json +++ b/samples/worker-appstack/frontend/package-lock.json @@ -17,7 +17,7 @@ "@angular/material": "^22.1.0", "@angular/platform-browser": "^22.1.0", "@angular/router": "^22.1.0", - "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.3.0.tgz", + "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.4.0.tgz", "@ng-bootstrap/ng-bootstrap": "^21.0.0", "@ng-select/ng-select": "^23.5.1", "@ngbracket/ngx-layout": "^22.0.1", @@ -1893,9 +1893,9 @@ } }, "node_modules/@duplocloud-internal/ng-common-lib": { - "version": "0.3.0", - "resolved": "file:../../../packages/duplocloud-internal-ng-common-lib-0.3.0.tgz", - "integrity": "sha512-bJHET6Rxn07EExil8KomZu3ZkpXYixtccCm5GDDOLzM+Z8ajHtZVlskUlb51MlcihGYEl09dVJgCXRaHaYIPig==", + "version": "0.4.0", + "resolved": "file:../../../packages/duplocloud-internal-ng-common-lib-0.4.0.tgz", + "integrity": "sha512-eSTVe/CXrskZcFBO28lkuI0oHSr5PzAqy05/aIH6gaUMnkZxLuO0/4ZfpczOu1/enPXT4lU2vI9Ss4GsIAilng==", "bundleDependencies": [ "ng-block-ui" ], diff --git a/samples/worker-appstack/frontend/package.json b/samples/worker-appstack/frontend/package.json index 05e043a..dc204dd 100644 --- a/samples/worker-appstack/frontend/package.json +++ b/samples/worker-appstack/frontend/package.json @@ -25,7 +25,7 @@ "@angular/material": "^22.1.0", "@angular/platform-browser": "^22.1.0", "@angular/router": "^22.1.0", - "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.3.0.tgz", + "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.4.0.tgz", "@ng-bootstrap/ng-bootstrap": "^21.0.0", "@ng-select/ng-select": "^23.5.1", "@ngbracket/ngx-layout": "^22.0.1", diff --git a/samples/worker-compute/frontend/package-lock.json b/samples/worker-compute/frontend/package-lock.json index 10f0d68..7fdb928 100644 --- a/samples/worker-compute/frontend/package-lock.json +++ b/samples/worker-compute/frontend/package-lock.json @@ -17,7 +17,7 @@ "@angular/material": "^22.1.0", "@angular/platform-browser": "^22.1.0", "@angular/router": "^22.1.0", - "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.3.0.tgz", + "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.4.0.tgz", "@ng-bootstrap/ng-bootstrap": "^21.0.0", "@ng-select/ng-select": "^23.5.1", "@ngbracket/ngx-layout": "^22.0.1", @@ -1893,9 +1893,9 @@ } }, "node_modules/@duplocloud-internal/ng-common-lib": { - "version": "0.3.0", - "resolved": "file:../../../packages/duplocloud-internal-ng-common-lib-0.3.0.tgz", - "integrity": "sha512-bJHET6Rxn07EExil8KomZu3ZkpXYixtccCm5GDDOLzM+Z8ajHtZVlskUlb51MlcihGYEl09dVJgCXRaHaYIPig==", + "version": "0.4.0", + "resolved": "file:../../../packages/duplocloud-internal-ng-common-lib-0.4.0.tgz", + "integrity": "sha512-eSTVe/CXrskZcFBO28lkuI0oHSr5PzAqy05/aIH6gaUMnkZxLuO0/4ZfpczOu1/enPXT4lU2vI9Ss4GsIAilng==", "bundleDependencies": [ "ng-block-ui" ], diff --git a/samples/worker-compute/frontend/package.json b/samples/worker-compute/frontend/package.json index 4427c4c..2575a36 100644 --- a/samples/worker-compute/frontend/package.json +++ b/samples/worker-compute/frontend/package.json @@ -25,7 +25,7 @@ "@angular/material": "^22.1.0", "@angular/platform-browser": "^22.1.0", "@angular/router": "^22.1.0", - "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.3.0.tgz", + "@duplocloud-internal/ng-common-lib": "file:../../../packages/duplocloud-internal-ng-common-lib-0.4.0.tgz", "@ng-bootstrap/ng-bootstrap": "^21.0.0", "@ng-select/ng-select": "^23.5.1", "@ngbracket/ngx-layout": "^22.0.1",