@daltonr/pathwrite-angular 0.11.0 → 0.12.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.
package/dist/shell.js CHANGED
@@ -91,6 +91,34 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
91
91
  args: [{ selector: "[pwShellFooter]", standalone: true }]
92
92
  }], ctorParameters: () => [{ type: i0.TemplateRef }] });
93
93
  // ---------------------------------------------------------------------------
94
+ // PathShellCompletionDirective
95
+ // ---------------------------------------------------------------------------
96
+ /**
97
+ * Replaces the default completion panel inside `<pw-shell>` when
98
+ * `snapshot.status === "completed"` (`completionBehaviour: "stayOnFinal"`).
99
+ * The template receives the current `PathSnapshot` as the implicit context.
100
+ *
101
+ * ```html
102
+ * <pw-shell [path]="myPath">
103
+ * <ng-template pwShellCompletion let-s>
104
+ * <my-completion-screen [data]="s.data" />
105
+ * </ng-template>
106
+ * <ng-template pwStep="details"><app-details-form /></ng-template>
107
+ * </pw-shell>
108
+ * ```
109
+ */
110
+ export class PathShellCompletionDirective {
111
+ constructor(templateRef) {
112
+ this.templateRef = templateRef;
113
+ }
114
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PathShellCompletionDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); }
115
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: PathShellCompletionDirective, isStandalone: true, selector: "[pwShellCompletion]", ngImport: i0 }); }
116
+ }
117
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PathShellCompletionDirective, decorators: [{
118
+ type: Directive,
119
+ args: [{ selector: "[pwShellCompletion]", standalone: true }]
120
+ }], ctorParameters: () => [{ type: i0.TemplateRef }] });
121
+ // ---------------------------------------------------------------------------
94
122
  // PathShellComponent
95
123
  // ---------------------------------------------------------------------------
96
124
  /**
@@ -106,7 +134,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
106
134
  */
107
135
  export class PathShellComponent {
108
136
  constructor() {
109
- /** Initial data merged into the path engine on start. */
137
+ /** Initial data merged into the path engine on start. Used on first visit; overridden by stored snapshot when `restoreKey` is set. */
110
138
  this.initialData = {};
111
139
  /** Start the path automatically on ngOnInit. Set to false to call doStart() manually. */
112
140
  this.autoStart = true;
@@ -127,12 +155,19 @@ export class PathShellComponent {
127
155
  /** When true, calls `validate()` on the facade so all steps show inline errors simultaneously. Useful when this shell is nested inside a step of an outer shell: bind to the outer snapshot's `hasAttemptedNext`. */
128
156
  this.validateWhen = false;
129
157
  /**
130
- * Footer layout mode:
158
+ * Arbitrary services object made available to all step components via
159
+ * `usePathContext<TData, TServices>().services`. Pass API clients, feature
160
+ * flags, or any shared dependency without prop-drilling through each step.
161
+ */
162
+ this.services = null;
163
+ /**
164
+ * Shell layout mode:
131
165
  * - "auto" (default): Uses "form" for single-step top-level paths, "wizard" otherwise.
132
- * - "wizard": Back button on left, Cancel and Submit together on right.
133
- * - "form": Cancel on left, Submit alone on right. Back button never shown.
166
+ * - "wizard": Progress header + Back button on left, Cancel and Submit together on right.
167
+ * - "form": Progress header + Cancel on left, Submit alone on right. Back button never shown.
168
+ * - "tabs": No progress header, no footer. Use for tabbed interfaces with a custom tab bar inside the step body.
134
169
  */
135
- this.footerLayout = "auto";
170
+ this.layout = "auto";
136
171
  /**
137
172
  * Controls whether the shell renders its auto-generated field-error summary box.
138
173
  * - `"summary"` (default): Shell renders the labeled error list below the step body.
@@ -155,14 +190,16 @@ export class PathShellComponent {
155
190
  /** The shell's own component-level injector. Passed to ngTemplateOutlet so that
156
191
  * step components can resolve PathFacade (provided by this shell) via inject(). */
157
192
  this.shellInjector = inject(Injector);
193
+ /** Outer shell's PathFacade — present when this shell is nested inside another pw-shell. */
194
+ this.outerFacade = inject(PathFacade, { skipSelf: true, optional: true });
158
195
  this.started = false;
159
196
  /** Navigation actions passed to custom `pwShellFooter` templates. */
160
197
  this.shellActions = {
161
198
  next: () => this.facade.next(),
162
199
  previous: () => this.facade.previous(),
163
200
  cancel: () => this.facade.cancel(),
164
- goToStep: (id) => this.facade.goToStep(id),
165
- goToStepChecked: (id) => this.facade.goToStepChecked(id),
201
+ goToStep: (id, options) => this.facade.goToStep(id, options),
202
+ goToStepChecked: (id, options) => this.facade.goToStepChecked(id, options),
166
203
  setData: (key, value) => this.facade.setData(key, value),
167
204
  restart: () => this.facade.restart(),
168
205
  retry: () => this.facade.retry(),
@@ -179,14 +216,21 @@ export class PathShellComponent {
179
216
  if (changes['validateWhen'] && this.validateWhen) {
180
217
  this.facade.validate();
181
218
  }
219
+ if (changes['services']) {
220
+ this.facade.services = this.services;
221
+ }
182
222
  }
183
223
  ngOnInit() {
224
+ this.facade.services = this.services;
184
225
  this.facade.events$.pipe(takeUntil(this.destroy$)).subscribe((event) => {
185
226
  this.event.emit(event);
186
227
  if (event.type === "completed")
187
228
  this.complete.emit(event.data);
188
229
  if (event.type === "cancelled")
189
230
  this.cancel.emit(event.data);
231
+ if (this.restoreKey && this.outerFacade && event.type === "stateChanged") {
232
+ this.outerFacade.setData(this.restoreKey, event.snapshot);
233
+ }
190
234
  });
191
235
  if (this.autoStart && !this.engine) {
192
236
  this.doStart();
@@ -200,7 +244,20 @@ export class PathShellComponent {
200
244
  if (!this.path)
201
245
  throw new Error('[pw-shell] [path] is required when no [engine] is provided');
202
246
  this.started = true;
203
- this.facade.start(this.path, this.initialData);
247
+ let startData = this.initialData;
248
+ let restoreStepId;
249
+ if (this.restoreKey && this.outerFacade) {
250
+ const stored = this.outerFacade.snapshot()?.data[this.restoreKey];
251
+ if (stored != null && typeof stored === "object" && "stepId" in stored) {
252
+ startData = stored.data;
253
+ if (stored.stepIndex > 0)
254
+ restoreStepId = stored.stepId;
255
+ }
256
+ }
257
+ this.facade.start(this.path, startData).then(() => {
258
+ if (restoreStepId)
259
+ this.facade.goToStep(restoreStepId);
260
+ });
204
261
  }
205
262
  /**
206
263
  * Restart the active path from step 1 with the original `initialData`,
@@ -222,14 +279,16 @@ export class PathShellComponent {
222
279
  warningEntries(s) {
223
280
  return Object.entries(s.fieldWarnings);
224
281
  }
225
- /** Resolves "auto" footerLayout based on snapshot. Single-step top-level → "form", otherwise → "wizard". */
226
- getResolvedFooterLayout(s) {
227
- return this.footerLayout === "auto"
282
+ get effectiveHideProgress() { return this.hideProgress || this.layout === "tabs"; }
283
+ get effectiveHideFooter() { return this.hideFooter || this.layout === "tabs"; }
284
+ /** Resolves "auto"/"tabs" layout to "wizard" or "form" for footer button arrangement. */
285
+ getResolvedLayout(s) {
286
+ return this.layout === "auto" || this.layout === "tabs"
228
287
  ? (s.stepCount === 1 && s.nestingLevel === 0 ? "form" : "wizard")
229
- : this.footerLayout;
288
+ : this.layout;
230
289
  }
231
290
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PathShellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
232
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PathShellComponent, isStandalone: true, selector: "pw-shell", inputs: { path: "path", engine: "engine", initialData: "initialData", autoStart: "autoStart", backLabel: "backLabel", nextLabel: "nextLabel", completeLabel: "completeLabel", loadingLabel: "loadingLabel", cancelLabel: "cancelLabel", hideCancel: "hideCancel", hideProgress: "hideProgress", hideFooter: "hideFooter", validateWhen: "validateWhen", footerLayout: "footerLayout", validationDisplay: "validationDisplay", progressLayout: "progressLayout" }, outputs: { complete: "complete", cancel: "cancel", event: "event" }, providers: [PathFacade], queries: [{ propertyName: "customHeader", first: true, predicate: PathShellHeaderDirective, descendants: true }, { propertyName: "customFooter", first: true, predicate: PathShellFooterDirective, descendants: true }, { propertyName: "stepDirectives", predicate: PathStepDirective }], usesOnChanges: true, ngImport: i0, template: `
291
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PathShellComponent, isStandalone: true, selector: "pw-shell", inputs: { path: "path", engine: "engine", initialData: "initialData", restoreKey: "restoreKey", autoStart: "autoStart", backLabel: "backLabel", nextLabel: "nextLabel", completeLabel: "completeLabel", loadingLabel: "loadingLabel", cancelLabel: "cancelLabel", hideCancel: "hideCancel", hideProgress: "hideProgress", hideFooter: "hideFooter", validateWhen: "validateWhen", services: "services", layout: "layout", validationDisplay: "validationDisplay", progressLayout: "progressLayout" }, outputs: { complete: "complete", cancel: "cancel", event: "event" }, providers: [PathFacade], queries: [{ propertyName: "customHeader", first: true, predicate: PathShellHeaderDirective, descendants: true }, { propertyName: "customFooter", first: true, predicate: PathShellFooterDirective, descendants: true }, { propertyName: "customCompletion", first: true, predicate: PathShellCompletionDirective, descendants: true }, { propertyName: "stepDirectives", predicate: PathStepDirective }], usesOnChanges: true, ngImport: i0, template: `
233
292
  <!-- Empty state -->
234
293
  <div class="pw-shell" *ngIf="!(facade.state$ | async)">
235
294
  <div class="pw-shell__empty" *ngIf="!started">
@@ -241,7 +300,7 @@ export class PathShellComponent {
241
300
  <!-- Active path -->
242
301
  <div class="pw-shell" [ngClass]="progressLayout !== 'merged' ? 'pw-shell--progress-' + progressLayout : ''" *ngIf="facade.state$ | async as s">
243
302
  <!-- Root progress — persistent top-level bar visible during sub-paths -->
244
- <div class="pw-shell__root-progress" *ngIf="!hideProgress && s.rootProgress && progressLayout !== 'activeOnly'">
303
+ <div class="pw-shell__root-progress" *ngIf="!effectiveHideProgress && s.rootProgress && progressLayout !== 'activeOnly'">
245
304
  <div class="pw-shell__steps">
246
305
  <div
247
306
  *ngFor="let step of s.rootProgress!.steps; let i = index"
@@ -262,7 +321,7 @@ export class PathShellComponent {
262
321
  <ng-container *ngTemplateOutlet="customHeader.templateRef; context: { $implicit: s }"></ng-container>
263
322
  </ng-container>
264
323
  <ng-template #defaultHeader>
265
- <div class="pw-shell__header" *ngIf="!hideProgress && (s.stepCount > 1 || s.nestingLevel > 0) && progressLayout !== 'rootOnly'">
324
+ <div class="pw-shell__header" *ngIf="!effectiveHideProgress && (s.stepCount > 1 || s.nestingLevel > 0) && progressLayout !== 'rootOnly'">
266
325
  <div class="pw-shell__steps">
267
326
  <div
268
327
  *ngFor="let step of s.steps; let i = index"
@@ -279,75 +338,91 @@ export class PathShellComponent {
279
338
  </div>
280
339
  </ng-template>
281
340
 
282
- <!-- Bodystep content -->
283
- <div class="pw-shell__body">
284
- <ng-container *ngFor="let stepDir of stepDirectives">
285
- <!-- Match by formId first (inner step of a StepChoice), then stepId -->
286
- <ng-container *ngIf="stepDir.stepId === (s.formId ?? s.stepId)">
287
- <ng-container *ngTemplateOutlet="stepDir.templateRef; injector: shellInjector"></ng-container>
288
- </ng-container>
341
+ <!-- Completion panel shown when path finishes with stayOnFinal -->
342
+ <ng-container *ngIf="s.status === 'completed'; else activeContent">
343
+ <ng-container *ngIf="customCompletion; else defaultCompletion">
344
+ <ng-container *ngTemplateOutlet="customCompletion.templateRef; context: { $implicit: s }"></ng-container>
289
345
  </ng-container>
290
- </div>
346
+ <ng-template #defaultCompletion>
347
+ <div class="pw-shell__completion">
348
+ <p class="pw-shell__completion-message">All done.</p>
349
+ <button type="button" class="pw-shell__completion-restart" (click)="facade.restart()">Start over</button>
350
+ </div>
351
+ </ng-template>
352
+ </ng-container>
353
+
354
+ <!-- Active step content -->
355
+ <ng-template #activeContent>
356
+ <!-- Body — step content -->
357
+ <div class="pw-shell__body">
358
+ <ng-container *ngFor="let stepDir of stepDirectives">
359
+ <!-- Match by formId first (inner step of a StepChoice), then stepId -->
360
+ <ng-container *ngIf="stepDir.stepId === (s.formId ?? s.stepId)">
361
+ <ng-container *ngTemplateOutlet="stepDir.templateRef; injector: shellInjector"></ng-container>
362
+ </ng-container>
363
+ </ng-container>
364
+ </div>
291
365
 
292
- <!-- Validation messages — suppressed when validationDisplay="inline" -->
293
- <ul class="pw-shell__validation" *ngIf="validationDisplay !== 'inline' && (s.hasAttemptedNext || s.hasValidated) && fieldEntries(s).length > 0">
294
- <li *ngFor="let entry of fieldEntries(s)" class="pw-shell__validation-item">
295
- <span *ngIf="entry[0] !== '_'" class="pw-shell__validation-label">{{ formatFieldKey(entry[0]) }}</span>{{ entry[1] }}
296
- </li>
297
- </ul>
366
+ <!-- Validation messages — suppressed when validationDisplay="inline" -->
367
+ <ul class="pw-shell__validation" *ngIf="validationDisplay !== 'inline' && (s.hasAttemptedNext || s.hasValidated) && fieldEntries(s).length > 0">
368
+ <li *ngFor="let entry of fieldEntries(s)" class="pw-shell__validation-item">
369
+ <span *ngIf="entry[0] !== '_'" class="pw-shell__validation-label">{{ formatFieldKey(entry[0]) }}</span>{{ entry[1] }}
370
+ </li>
371
+ </ul>
298
372
 
299
- <!-- Warning messages — non-blocking, shown immediately (no hasAttemptedNext gate) -->
300
- <ul class="pw-shell__warnings" *ngIf="validationDisplay !== 'inline' && warningEntries(s).length > 0">
301
- <li *ngFor="let entry of warningEntries(s)" class="pw-shell__warnings-item">
302
- <span *ngIf="entry[0] !== '_'" class="pw-shell__warnings-label">{{ formatFieldKey(entry[0]) }}</span>{{ entry[1] }}
303
- </li>
304
- </ul>
373
+ <!-- Warning messages — non-blocking, shown immediately (no hasAttemptedNext gate) -->
374
+ <ul class="pw-shell__warnings" *ngIf="validationDisplay !== 'inline' && warningEntries(s).length > 0">
375
+ <li *ngFor="let entry of warningEntries(s)" class="pw-shell__warnings-item">
376
+ <span *ngIf="entry[0] !== '_'" class="pw-shell__warnings-label">{{ formatFieldKey(entry[0]) }}</span>{{ entry[1] }}
377
+ </li>
378
+ </ul>
305
379
 
306
- <!-- Blocking error — guard returned { allowed: false, reason } -->
307
- <p class="pw-shell__blocking-error"
308
- *ngIf="validationDisplay !== 'inline' && (s.hasAttemptedNext || s.hasValidated) && s.blockingError">
309
- {{ s.blockingError }}
310
- </p>
380
+ <!-- Blocking error — guard returned { allowed: false, reason } -->
381
+ <p class="pw-shell__blocking-error"
382
+ *ngIf="validationDisplay !== 'inline' && (s.hasAttemptedNext || s.hasValidated) && s.blockingError">
383
+ {{ s.blockingError }}
384
+ </p>
311
385
 
312
- <!-- Error panel — replaces footer when an async operation has failed -->
313
- <div class="pw-shell__error" *ngIf="s.status === 'error' && s.error; else footerOrCustom">
314
- <div class="pw-shell__error-title">{{ s.error!.retryCount >= 2 ? 'Still having trouble.' : 'Something went wrong.' }}</div>
315
- <div class="pw-shell__error-message">{{ errorPhaseMessage(s.error!.phase) }}{{ s.error!.message ? ' ' + s.error!.message : '' }}</div>
316
- <div class="pw-shell__error-actions">
317
- <button
318
- *ngIf="s.error!.retryCount < 2"
319
- type="button"
320
- class="pw-shell__btn pw-shell__btn--retry"
321
- (click)="facade.retry()"
322
- >Try again</button>
323
- <button
324
- *ngIf="s.hasPersistence"
325
- type="button"
326
- [class]="'pw-shell__btn ' + (s.error!.retryCount >= 2 ? 'pw-shell__btn--retry' : 'pw-shell__btn--suspend')"
327
- (click)="facade.suspend()"
328
- >Save and come back later</button>
329
- <button
330
- *ngIf="s.error!.retryCount >= 2 && !s.hasPersistence"
331
- type="button"
332
- class="pw-shell__btn pw-shell__btn--retry"
333
- (click)="facade.retry()"
334
- >Try again</button>
386
+ <!-- Error panel — replaces footer when an async operation has failed -->
387
+ <div class="pw-shell__error" *ngIf="s.status === 'error' && s.error; else footerOrCustom">
388
+ <div class="pw-shell__error-title">{{ s.error!.retryCount >= 2 ? 'Still having trouble.' : 'Something went wrong.' }}</div>
389
+ <div class="pw-shell__error-message">{{ errorPhaseMessage(s.error!.phase) }}{{ s.error!.message ? ' ' + s.error!.message : '' }}</div>
390
+ <div class="pw-shell__error-actions">
391
+ <button
392
+ *ngIf="s.error!.retryCount < 2"
393
+ type="button"
394
+ class="pw-shell__btn pw-shell__btn--retry"
395
+ (click)="facade.retry()"
396
+ >Try again</button>
397
+ <button
398
+ *ngIf="s.hasPersistence"
399
+ type="button"
400
+ [class]="'pw-shell__btn ' + (s.error!.retryCount >= 2 ? 'pw-shell__btn--retry' : 'pw-shell__btn--suspend')"
401
+ (click)="facade.suspend()"
402
+ >Save and come back later</button>
403
+ <button
404
+ *ngIf="s.error!.retryCount >= 2 && !s.hasPersistence"
405
+ type="button"
406
+ class="pw-shell__btn pw-shell__btn--retry"
407
+ (click)="facade.retry()"
408
+ >Try again</button>
409
+ </div>
335
410
  </div>
336
- </div>
337
- <!-- Footer — custom or default navigation buttons -->
338
- <ng-template #footerOrCustom>
339
- <ng-container *ngIf="!hideFooter">
340
- <ng-container *ngIf="customFooter; else defaultFooter">
341
- <ng-container *ngTemplateOutlet="customFooter.templateRef; context: { $implicit: s, actions: shellActions }"></ng-container>
411
+ <!-- Footer — custom or default navigation buttons -->
412
+ <ng-template #footerOrCustom>
413
+ <ng-container *ngIf="!effectiveHideFooter">
414
+ <ng-container *ngIf="customFooter; else defaultFooter">
415
+ <ng-container *ngTemplateOutlet="customFooter.templateRef; context: { $implicit: s, actions: shellActions }"></ng-container>
416
+ </ng-container>
342
417
  </ng-container>
343
- </ng-container>
418
+ </ng-template>
344
419
  </ng-template>
345
420
  <ng-template #defaultFooter>
346
421
  <div class="pw-shell__footer">
347
422
  <div class="pw-shell__footer-left">
348
423
  <!-- Form mode: Cancel on the left -->
349
424
  <button
350
- *ngIf="getResolvedFooterLayout(s) === 'form' && !hideCancel"
425
+ *ngIf="getResolvedLayout(s) === 'form' && !hideCancel"
351
426
  type="button"
352
427
  class="pw-shell__btn pw-shell__btn--cancel"
353
428
  [disabled]="s.status !== 'idle'"
@@ -355,7 +430,7 @@ export class PathShellComponent {
355
430
  >{{ cancelLabel }}</button>
356
431
  <!-- Wizard mode: Back on the left -->
357
432
  <button
358
- *ngIf="getResolvedFooterLayout(s) === 'wizard' && !s.isFirstStep"
433
+ *ngIf="getResolvedLayout(s) === 'wizard' && !s.isFirstStep"
359
434
  type="button"
360
435
  class="pw-shell__btn pw-shell__btn--back"
361
436
  [disabled]="s.status !== 'idle' || !s.canMovePrevious"
@@ -365,7 +440,7 @@ export class PathShellComponent {
365
440
  <div class="pw-shell__footer-right">
366
441
  <!-- Wizard mode: Cancel on the right -->
367
442
  <button
368
- *ngIf="getResolvedFooterLayout(s) === 'wizard' && !hideCancel"
443
+ *ngIf="getResolvedLayout(s) === 'wizard' && !hideCancel"
369
444
  type="button"
370
445
  class="pw-shell__btn pw-shell__btn--cancel"
371
446
  [disabled]="s.status !== 'idle'"
@@ -405,7 +480,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
405
480
  <!-- Active path -->
406
481
  <div class="pw-shell" [ngClass]="progressLayout !== 'merged' ? 'pw-shell--progress-' + progressLayout : ''" *ngIf="facade.state$ | async as s">
407
482
  <!-- Root progress — persistent top-level bar visible during sub-paths -->
408
- <div class="pw-shell__root-progress" *ngIf="!hideProgress && s.rootProgress && progressLayout !== 'activeOnly'">
483
+ <div class="pw-shell__root-progress" *ngIf="!effectiveHideProgress && s.rootProgress && progressLayout !== 'activeOnly'">
409
484
  <div class="pw-shell__steps">
410
485
  <div
411
486
  *ngFor="let step of s.rootProgress!.steps; let i = index"
@@ -426,7 +501,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
426
501
  <ng-container *ngTemplateOutlet="customHeader.templateRef; context: { $implicit: s }"></ng-container>
427
502
  </ng-container>
428
503
  <ng-template #defaultHeader>
429
- <div class="pw-shell__header" *ngIf="!hideProgress && (s.stepCount > 1 || s.nestingLevel > 0) && progressLayout !== 'rootOnly'">
504
+ <div class="pw-shell__header" *ngIf="!effectiveHideProgress && (s.stepCount > 1 || s.nestingLevel > 0) && progressLayout !== 'rootOnly'">
430
505
  <div class="pw-shell__steps">
431
506
  <div
432
507
  *ngFor="let step of s.steps; let i = index"
@@ -443,75 +518,91 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
443
518
  </div>
444
519
  </ng-template>
445
520
 
446
- <!-- Bodystep content -->
447
- <div class="pw-shell__body">
448
- <ng-container *ngFor="let stepDir of stepDirectives">
449
- <!-- Match by formId first (inner step of a StepChoice), then stepId -->
450
- <ng-container *ngIf="stepDir.stepId === (s.formId ?? s.stepId)">
451
- <ng-container *ngTemplateOutlet="stepDir.templateRef; injector: shellInjector"></ng-container>
452
- </ng-container>
521
+ <!-- Completion panel shown when path finishes with stayOnFinal -->
522
+ <ng-container *ngIf="s.status === 'completed'; else activeContent">
523
+ <ng-container *ngIf="customCompletion; else defaultCompletion">
524
+ <ng-container *ngTemplateOutlet="customCompletion.templateRef; context: { $implicit: s }"></ng-container>
453
525
  </ng-container>
454
- </div>
526
+ <ng-template #defaultCompletion>
527
+ <div class="pw-shell__completion">
528
+ <p class="pw-shell__completion-message">All done.</p>
529
+ <button type="button" class="pw-shell__completion-restart" (click)="facade.restart()">Start over</button>
530
+ </div>
531
+ </ng-template>
532
+ </ng-container>
455
533
 
456
- <!-- Validation messages suppressed when validationDisplay="inline" -->
457
- <ul class="pw-shell__validation" *ngIf="validationDisplay !== 'inline' && (s.hasAttemptedNext || s.hasValidated) && fieldEntries(s).length > 0">
458
- <li *ngFor="let entry of fieldEntries(s)" class="pw-shell__validation-item">
459
- <span *ngIf="entry[0] !== '_'" class="pw-shell__validation-label">{{ formatFieldKey(entry[0]) }}</span>{{ entry[1] }}
460
- </li>
461
- </ul>
534
+ <!-- Active step content -->
535
+ <ng-template #activeContent>
536
+ <!-- Body step content -->
537
+ <div class="pw-shell__body">
538
+ <ng-container *ngFor="let stepDir of stepDirectives">
539
+ <!-- Match by formId first (inner step of a StepChoice), then stepId -->
540
+ <ng-container *ngIf="stepDir.stepId === (s.formId ?? s.stepId)">
541
+ <ng-container *ngTemplateOutlet="stepDir.templateRef; injector: shellInjector"></ng-container>
542
+ </ng-container>
543
+ </ng-container>
544
+ </div>
545
+
546
+ <!-- Validation messages — suppressed when validationDisplay="inline" -->
547
+ <ul class="pw-shell__validation" *ngIf="validationDisplay !== 'inline' && (s.hasAttemptedNext || s.hasValidated) && fieldEntries(s).length > 0">
548
+ <li *ngFor="let entry of fieldEntries(s)" class="pw-shell__validation-item">
549
+ <span *ngIf="entry[0] !== '_'" class="pw-shell__validation-label">{{ formatFieldKey(entry[0]) }}</span>{{ entry[1] }}
550
+ </li>
551
+ </ul>
462
552
 
463
- <!-- Warning messages — non-blocking, shown immediately (no hasAttemptedNext gate) -->
464
- <ul class="pw-shell__warnings" *ngIf="validationDisplay !== 'inline' && warningEntries(s).length > 0">
465
- <li *ngFor="let entry of warningEntries(s)" class="pw-shell__warnings-item">
466
- <span *ngIf="entry[0] !== '_'" class="pw-shell__warnings-label">{{ formatFieldKey(entry[0]) }}</span>{{ entry[1] }}
467
- </li>
468
- </ul>
553
+ <!-- Warning messages — non-blocking, shown immediately (no hasAttemptedNext gate) -->
554
+ <ul class="pw-shell__warnings" *ngIf="validationDisplay !== 'inline' && warningEntries(s).length > 0">
555
+ <li *ngFor="let entry of warningEntries(s)" class="pw-shell__warnings-item">
556
+ <span *ngIf="entry[0] !== '_'" class="pw-shell__warnings-label">{{ formatFieldKey(entry[0]) }}</span>{{ entry[1] }}
557
+ </li>
558
+ </ul>
469
559
 
470
- <!-- Blocking error — guard returned { allowed: false, reason } -->
471
- <p class="pw-shell__blocking-error"
472
- *ngIf="validationDisplay !== 'inline' && (s.hasAttemptedNext || s.hasValidated) && s.blockingError">
473
- {{ s.blockingError }}
474
- </p>
560
+ <!-- Blocking error — guard returned { allowed: false, reason } -->
561
+ <p class="pw-shell__blocking-error"
562
+ *ngIf="validationDisplay !== 'inline' && (s.hasAttemptedNext || s.hasValidated) && s.blockingError">
563
+ {{ s.blockingError }}
564
+ </p>
475
565
 
476
- <!-- Error panel — replaces footer when an async operation has failed -->
477
- <div class="pw-shell__error" *ngIf="s.status === 'error' && s.error; else footerOrCustom">
478
- <div class="pw-shell__error-title">{{ s.error!.retryCount >= 2 ? 'Still having trouble.' : 'Something went wrong.' }}</div>
479
- <div class="pw-shell__error-message">{{ errorPhaseMessage(s.error!.phase) }}{{ s.error!.message ? ' ' + s.error!.message : '' }}</div>
480
- <div class="pw-shell__error-actions">
481
- <button
482
- *ngIf="s.error!.retryCount < 2"
483
- type="button"
484
- class="pw-shell__btn pw-shell__btn--retry"
485
- (click)="facade.retry()"
486
- >Try again</button>
487
- <button
488
- *ngIf="s.hasPersistence"
489
- type="button"
490
- [class]="'pw-shell__btn ' + (s.error!.retryCount >= 2 ? 'pw-shell__btn--retry' : 'pw-shell__btn--suspend')"
491
- (click)="facade.suspend()"
492
- >Save and come back later</button>
493
- <button
494
- *ngIf="s.error!.retryCount >= 2 && !s.hasPersistence"
495
- type="button"
496
- class="pw-shell__btn pw-shell__btn--retry"
497
- (click)="facade.retry()"
498
- >Try again</button>
566
+ <!-- Error panel — replaces footer when an async operation has failed -->
567
+ <div class="pw-shell__error" *ngIf="s.status === 'error' && s.error; else footerOrCustom">
568
+ <div class="pw-shell__error-title">{{ s.error!.retryCount >= 2 ? 'Still having trouble.' : 'Something went wrong.' }}</div>
569
+ <div class="pw-shell__error-message">{{ errorPhaseMessage(s.error!.phase) }}{{ s.error!.message ? ' ' + s.error!.message : '' }}</div>
570
+ <div class="pw-shell__error-actions">
571
+ <button
572
+ *ngIf="s.error!.retryCount < 2"
573
+ type="button"
574
+ class="pw-shell__btn pw-shell__btn--retry"
575
+ (click)="facade.retry()"
576
+ >Try again</button>
577
+ <button
578
+ *ngIf="s.hasPersistence"
579
+ type="button"
580
+ [class]="'pw-shell__btn ' + (s.error!.retryCount >= 2 ? 'pw-shell__btn--retry' : 'pw-shell__btn--suspend')"
581
+ (click)="facade.suspend()"
582
+ >Save and come back later</button>
583
+ <button
584
+ *ngIf="s.error!.retryCount >= 2 && !s.hasPersistence"
585
+ type="button"
586
+ class="pw-shell__btn pw-shell__btn--retry"
587
+ (click)="facade.retry()"
588
+ >Try again</button>
589
+ </div>
499
590
  </div>
500
- </div>
501
- <!-- Footer — custom or default navigation buttons -->
502
- <ng-template #footerOrCustom>
503
- <ng-container *ngIf="!hideFooter">
504
- <ng-container *ngIf="customFooter; else defaultFooter">
505
- <ng-container *ngTemplateOutlet="customFooter.templateRef; context: { $implicit: s, actions: shellActions }"></ng-container>
591
+ <!-- Footer — custom or default navigation buttons -->
592
+ <ng-template #footerOrCustom>
593
+ <ng-container *ngIf="!effectiveHideFooter">
594
+ <ng-container *ngIf="customFooter; else defaultFooter">
595
+ <ng-container *ngTemplateOutlet="customFooter.templateRef; context: { $implicit: s, actions: shellActions }"></ng-container>
596
+ </ng-container>
506
597
  </ng-container>
507
- </ng-container>
598
+ </ng-template>
508
599
  </ng-template>
509
600
  <ng-template #defaultFooter>
510
601
  <div class="pw-shell__footer">
511
602
  <div class="pw-shell__footer-left">
512
603
  <!-- Form mode: Cancel on the left -->
513
604
  <button
514
- *ngIf="getResolvedFooterLayout(s) === 'form' && !hideCancel"
605
+ *ngIf="getResolvedLayout(s) === 'form' && !hideCancel"
515
606
  type="button"
516
607
  class="pw-shell__btn pw-shell__btn--cancel"
517
608
  [disabled]="s.status !== 'idle'"
@@ -519,7 +610,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
519
610
  >{{ cancelLabel }}</button>
520
611
  <!-- Wizard mode: Back on the left -->
521
612
  <button
522
- *ngIf="getResolvedFooterLayout(s) === 'wizard' && !s.isFirstStep"
613
+ *ngIf="getResolvedLayout(s) === 'wizard' && !s.isFirstStep"
523
614
  type="button"
524
615
  class="pw-shell__btn pw-shell__btn--back"
525
616
  [disabled]="s.status !== 'idle' || !s.canMovePrevious"
@@ -529,7 +620,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
529
620
  <div class="pw-shell__footer-right">
530
621
  <!-- Wizard mode: Cancel on the right -->
531
622
  <button
532
- *ngIf="getResolvedFooterLayout(s) === 'wizard' && !hideCancel"
623
+ *ngIf="getResolvedLayout(s) === 'wizard' && !hideCancel"
533
624
  type="button"
534
625
  class="pw-shell__btn pw-shell__btn--cancel"
535
626
  [disabled]="s.status !== 'idle'"
@@ -555,6 +646,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
555
646
  type: Input
556
647
  }], initialData: [{
557
648
  type: Input
649
+ }], restoreKey: [{
650
+ type: Input
558
651
  }], autoStart: [{
559
652
  type: Input
560
653
  }], backLabel: [{
@@ -575,7 +668,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
575
668
  type: Input
576
669
  }], validateWhen: [{
577
670
  type: Input
578
- }], footerLayout: [{
671
+ }], services: [{
672
+ type: Input
673
+ }], layout: [{
579
674
  type: Input
580
675
  }], validationDisplay: [{
581
676
  type: Input
@@ -596,5 +691,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
596
691
  }], customFooter: [{
597
692
  type: ContentChild,
598
693
  args: [PathShellFooterDirective]
694
+ }], customCompletion: [{
695
+ type: ContentChild,
696
+ args: [PathShellCompletionDirective]
599
697
  }] } });
600
698
  //# sourceMappingURL=shell.js.map
package/dist/shell.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"shell.js","sourceRoot":"","sources":["../src/shell.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../src/shell.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@daltonr/pathwrite-angular",
3
- "version": "0.11.0",
3
+ "version": "0.12.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Angular adapter for @daltonr/pathwrite-core — RxJS observables, signal-friendly, with optional <pw-shell> default UI.",
@@ -61,7 +61,7 @@
61
61
  "@angular/compiler-cli": "^17.3.12"
62
62
  },
63
63
  "dependencies": {
64
- "@daltonr/pathwrite-core": "^0.11.0"
64
+ "@daltonr/pathwrite-core": "^0.12.0"
65
65
  },
66
66
  "publishConfig": {
67
67
  "access": "public"