@daltonr/pathwrite-angular 0.10.1 → 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;
@@ -122,13 +150,24 @@ export class PathShellComponent {
122
150
  this.hideCancel = false;
123
151
  /** Hide the step progress indicator in the header. Also hidden automatically when the path has only one step. */
124
152
  this.hideProgress = false;
153
+ /** Hide the footer (navigation buttons). The error panel is still shown on async failure regardless of this input. */
154
+ this.hideFooter = false;
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`. */
156
+ this.validateWhen = false;
157
+ /**
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;
125
163
  /**
126
- * Footer layout mode:
164
+ * Shell layout mode:
127
165
  * - "auto" (default): Uses "form" for single-step top-level paths, "wizard" otherwise.
128
- * - "wizard": Back button on left, Cancel and Submit together on right.
129
- * - "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.
130
169
  */
131
- this.footerLayout = "auto";
170
+ this.layout = "auto";
132
171
  /**
133
172
  * Controls whether the shell renders its auto-generated field-error summary box.
134
173
  * - `"summary"` (default): Shell renders the labeled error list below the step body.
@@ -151,14 +190,16 @@ export class PathShellComponent {
151
190
  /** The shell's own component-level injector. Passed to ngTemplateOutlet so that
152
191
  * step components can resolve PathFacade (provided by this shell) via inject(). */
153
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 });
154
195
  this.started = false;
155
196
  /** Navigation actions passed to custom `pwShellFooter` templates. */
156
197
  this.shellActions = {
157
198
  next: () => this.facade.next(),
158
199
  previous: () => this.facade.previous(),
159
200
  cancel: () => this.facade.cancel(),
160
- goToStep: (id) => this.facade.goToStep(id),
161
- goToStepChecked: (id) => this.facade.goToStepChecked(id),
201
+ goToStep: (id, options) => this.facade.goToStep(id, options),
202
+ goToStepChecked: (id, options) => this.facade.goToStepChecked(id, options),
162
203
  setData: (key, value) => this.facade.setData(key, value),
163
204
  restart: () => this.facade.restart(),
164
205
  retry: () => this.facade.retry(),
@@ -172,14 +213,24 @@ export class PathShellComponent {
172
213
  if (changes['engine'] && this.engine) {
173
214
  this.facade.adoptEngine(this.engine);
174
215
  }
216
+ if (changes['validateWhen'] && this.validateWhen) {
217
+ this.facade.validate();
218
+ }
219
+ if (changes['services']) {
220
+ this.facade.services = this.services;
221
+ }
175
222
  }
176
223
  ngOnInit() {
224
+ this.facade.services = this.services;
177
225
  this.facade.events$.pipe(takeUntil(this.destroy$)).subscribe((event) => {
178
226
  this.event.emit(event);
179
227
  if (event.type === "completed")
180
228
  this.complete.emit(event.data);
181
229
  if (event.type === "cancelled")
182
230
  this.cancel.emit(event.data);
231
+ if (this.restoreKey && this.outerFacade && event.type === "stateChanged") {
232
+ this.outerFacade.setData(this.restoreKey, event.snapshot);
233
+ }
183
234
  });
184
235
  if (this.autoStart && !this.engine) {
185
236
  this.doStart();
@@ -193,7 +244,20 @@ export class PathShellComponent {
193
244
  if (!this.path)
194
245
  throw new Error('[pw-shell] [path] is required when no [engine] is provided');
195
246
  this.started = true;
196
- 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
+ });
197
261
  }
198
262
  /**
199
263
  * Restart the active path from step 1 with the original `initialData`,
@@ -215,14 +279,16 @@ export class PathShellComponent {
215
279
  warningEntries(s) {
216
280
  return Object.entries(s.fieldWarnings);
217
281
  }
218
- /** Resolves "auto" footerLayout based on snapshot. Single-step top-level → "form", otherwise → "wizard". */
219
- getResolvedFooterLayout(s) {
220
- 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"
221
287
  ? (s.stepCount === 1 && s.nestingLevel === 0 ? "form" : "wizard")
222
- : this.footerLayout;
288
+ : this.layout;
223
289
  }
224
290
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PathShellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
225
- 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", 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: `
226
292
  <!-- Empty state -->
227
293
  <div class="pw-shell" *ngIf="!(facade.state$ | async)">
228
294
  <div class="pw-shell__empty" *ngIf="!started">
@@ -234,7 +300,7 @@ export class PathShellComponent {
234
300
  <!-- Active path -->
235
301
  <div class="pw-shell" [ngClass]="progressLayout !== 'merged' ? 'pw-shell--progress-' + progressLayout : ''" *ngIf="facade.state$ | async as s">
236
302
  <!-- Root progress — persistent top-level bar visible during sub-paths -->
237
- <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'">
238
304
  <div class="pw-shell__steps">
239
305
  <div
240
306
  *ngFor="let step of s.rootProgress!.steps; let i = index"
@@ -255,7 +321,7 @@ export class PathShellComponent {
255
321
  <ng-container *ngTemplateOutlet="customHeader.templateRef; context: { $implicit: s }"></ng-container>
256
322
  </ng-container>
257
323
  <ng-template #defaultHeader>
258
- <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'">
259
325
  <div class="pw-shell__steps">
260
326
  <div
261
327
  *ngFor="let step of s.steps; let i = index"
@@ -272,73 +338,91 @@ export class PathShellComponent {
272
338
  </div>
273
339
  </ng-template>
274
340
 
275
- <!-- Bodystep content -->
276
- <div class="pw-shell__body">
277
- <ng-container *ngFor="let stepDir of stepDirectives">
278
- <!-- Match by formId first (inner step of a StepChoice), then stepId -->
279
- <ng-container *ngIf="stepDir.stepId === (s.formId ?? s.stepId)">
280
- <ng-container *ngTemplateOutlet="stepDir.templateRef; injector: shellInjector"></ng-container>
281
- </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>
282
345
  </ng-container>
283
- </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>
284
353
 
285
- <!-- Validation messages suppressed when validationDisplay="inline" -->
286
- <ul class="pw-shell__validation" *ngIf="validationDisplay !== 'inline' && s.hasAttemptedNext && fieldEntries(s).length > 0">
287
- <li *ngFor="let entry of fieldEntries(s)" class="pw-shell__validation-item">
288
- <span *ngIf="entry[0] !== '_'" class="pw-shell__validation-label">{{ formatFieldKey(entry[0]) }}</span>{{ entry[1] }}
289
- </li>
290
- </ul>
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
- <!-- Warning messages — non-blocking, shown immediately (no hasAttemptedNext gate) -->
293
- <ul class="pw-shell__warnings" *ngIf="validationDisplay !== 'inline' && warningEntries(s).length > 0">
294
- <li *ngFor="let entry of warningEntries(s)" class="pw-shell__warnings-item">
295
- <span *ngIf="entry[0] !== '_'" class="pw-shell__warnings-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
- <!-- Blocking errorguard returned { allowed: false, reason } -->
300
- <p class="pw-shell__blocking-error"
301
- *ngIf="validationDisplay !== 'inline' && s.hasAttemptedNext && s.blockingError">
302
- {{ s.blockingError }}
303
- </p>
373
+ <!-- Warning messagesnon-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>
304
379
 
305
- <!-- Error panelreplaces footer when an async operation has failed -->
306
- <div class="pw-shell__error" *ngIf="s.status === 'error' && s.error; else footerOrCustom">
307
- <div class="pw-shell__error-title">{{ s.error!.retryCount >= 2 ? 'Still having trouble.' : 'Something went wrong.' }}</div>
308
- <div class="pw-shell__error-message">{{ errorPhaseMessage(s.error!.phase) }}{{ s.error!.message ? ' ' + s.error!.message : '' }}</div>
309
- <div class="pw-shell__error-actions">
310
- <button
311
- *ngIf="s.error!.retryCount < 2"
312
- type="button"
313
- class="pw-shell__btn pw-shell__btn--retry"
314
- (click)="facade.retry()"
315
- >Try again</button>
316
- <button
317
- *ngIf="s.hasPersistence"
318
- type="button"
319
- [class]="'pw-shell__btn ' + (s.error!.retryCount >= 2 ? 'pw-shell__btn--retry' : 'pw-shell__btn--suspend')"
320
- (click)="facade.suspend()"
321
- >Save and come back later</button>
322
- <button
323
- *ngIf="s.error!.retryCount >= 2 && !s.hasPersistence"
324
- type="button"
325
- class="pw-shell__btn pw-shell__btn--retry"
326
- (click)="facade.retry()"
327
- >Try again</button>
380
+ <!-- Blocking errorguard 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>
385
+
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>
328
410
  </div>
329
- </div>
330
- <!-- Footer — custom or default navigation buttons -->
331
- <ng-template #footerOrCustom>
332
- <ng-container *ngIf="customFooter; else defaultFooter">
333
- <ng-container *ngTemplateOutlet="customFooter.templateRef; context: { $implicit: s, actions: shellActions }"></ng-container>
334
- </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>
417
+ </ng-container>
418
+ </ng-template>
335
419
  </ng-template>
336
420
  <ng-template #defaultFooter>
337
421
  <div class="pw-shell__footer">
338
422
  <div class="pw-shell__footer-left">
339
423
  <!-- Form mode: Cancel on the left -->
340
424
  <button
341
- *ngIf="getResolvedFooterLayout(s) === 'form' && !hideCancel"
425
+ *ngIf="getResolvedLayout(s) === 'form' && !hideCancel"
342
426
  type="button"
343
427
  class="pw-shell__btn pw-shell__btn--cancel"
344
428
  [disabled]="s.status !== 'idle'"
@@ -346,7 +430,7 @@ export class PathShellComponent {
346
430
  >{{ cancelLabel }}</button>
347
431
  <!-- Wizard mode: Back on the left -->
348
432
  <button
349
- *ngIf="getResolvedFooterLayout(s) === 'wizard' && !s.isFirstStep"
433
+ *ngIf="getResolvedLayout(s) === 'wizard' && !s.isFirstStep"
350
434
  type="button"
351
435
  class="pw-shell__btn pw-shell__btn--back"
352
436
  [disabled]="s.status !== 'idle' || !s.canMovePrevious"
@@ -356,7 +440,7 @@ export class PathShellComponent {
356
440
  <div class="pw-shell__footer-right">
357
441
  <!-- Wizard mode: Cancel on the right -->
358
442
  <button
359
- *ngIf="getResolvedFooterLayout(s) === 'wizard' && !hideCancel"
443
+ *ngIf="getResolvedLayout(s) === 'wizard' && !hideCancel"
360
444
  type="button"
361
445
  class="pw-shell__btn pw-shell__btn--cancel"
362
446
  [disabled]="s.status !== 'idle'"
@@ -396,7 +480,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
396
480
  <!-- Active path -->
397
481
  <div class="pw-shell" [ngClass]="progressLayout !== 'merged' ? 'pw-shell--progress-' + progressLayout : ''" *ngIf="facade.state$ | async as s">
398
482
  <!-- Root progress — persistent top-level bar visible during sub-paths -->
399
- <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'">
400
484
  <div class="pw-shell__steps">
401
485
  <div
402
486
  *ngFor="let step of s.rootProgress!.steps; let i = index"
@@ -417,7 +501,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
417
501
  <ng-container *ngTemplateOutlet="customHeader.templateRef; context: { $implicit: s }"></ng-container>
418
502
  </ng-container>
419
503
  <ng-template #defaultHeader>
420
- <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'">
421
505
  <div class="pw-shell__steps">
422
506
  <div
423
507
  *ngFor="let step of s.steps; let i = index"
@@ -434,73 +518,91 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
434
518
  </div>
435
519
  </ng-template>
436
520
 
437
- <!-- Bodystep content -->
438
- <div class="pw-shell__body">
439
- <ng-container *ngFor="let stepDir of stepDirectives">
440
- <!-- Match by formId first (inner step of a StepChoice), then stepId -->
441
- <ng-container *ngIf="stepDir.stepId === (s.formId ?? s.stepId)">
442
- <ng-container *ngTemplateOutlet="stepDir.templateRef; injector: shellInjector"></ng-container>
443
- </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>
444
525
  </ng-container>
445
- </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>
533
+
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>
446
545
 
447
- <!-- Validation messages — suppressed when validationDisplay="inline" -->
448
- <ul class="pw-shell__validation" *ngIf="validationDisplay !== 'inline' && s.hasAttemptedNext && fieldEntries(s).length > 0">
449
- <li *ngFor="let entry of fieldEntries(s)" class="pw-shell__validation-item">
450
- <span *ngIf="entry[0] !== '_'" class="pw-shell__validation-label">{{ formatFieldKey(entry[0]) }}</span>{{ entry[1] }}
451
- </li>
452
- </ul>
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>
453
552
 
454
- <!-- Warning messages — non-blocking, shown immediately (no hasAttemptedNext gate) -->
455
- <ul class="pw-shell__warnings" *ngIf="validationDisplay !== 'inline' && warningEntries(s).length > 0">
456
- <li *ngFor="let entry of warningEntries(s)" class="pw-shell__warnings-item">
457
- <span *ngIf="entry[0] !== '_'" class="pw-shell__warnings-label">{{ formatFieldKey(entry[0]) }}</span>{{ entry[1] }}
458
- </li>
459
- </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>
460
559
 
461
- <!-- Blocking error — guard returned { allowed: false, reason } -->
462
- <p class="pw-shell__blocking-error"
463
- *ngIf="validationDisplay !== 'inline' && s.hasAttemptedNext && s.blockingError">
464
- {{ s.blockingError }}
465
- </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>
466
565
 
467
- <!-- Error panel — replaces footer when an async operation has failed -->
468
- <div class="pw-shell__error" *ngIf="s.status === 'error' && s.error; else footerOrCustom">
469
- <div class="pw-shell__error-title">{{ s.error!.retryCount >= 2 ? 'Still having trouble.' : 'Something went wrong.' }}</div>
470
- <div class="pw-shell__error-message">{{ errorPhaseMessage(s.error!.phase) }}{{ s.error!.message ? ' ' + s.error!.message : '' }}</div>
471
- <div class="pw-shell__error-actions">
472
- <button
473
- *ngIf="s.error!.retryCount < 2"
474
- type="button"
475
- class="pw-shell__btn pw-shell__btn--retry"
476
- (click)="facade.retry()"
477
- >Try again</button>
478
- <button
479
- *ngIf="s.hasPersistence"
480
- type="button"
481
- [class]="'pw-shell__btn ' + (s.error!.retryCount >= 2 ? 'pw-shell__btn--retry' : 'pw-shell__btn--suspend')"
482
- (click)="facade.suspend()"
483
- >Save and come back later</button>
484
- <button
485
- *ngIf="s.error!.retryCount >= 2 && !s.hasPersistence"
486
- type="button"
487
- class="pw-shell__btn pw-shell__btn--retry"
488
- (click)="facade.retry()"
489
- >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>
490
590
  </div>
491
- </div>
492
- <!-- Footer — custom or default navigation buttons -->
493
- <ng-template #footerOrCustom>
494
- <ng-container *ngIf="customFooter; else defaultFooter">
495
- <ng-container *ngTemplateOutlet="customFooter.templateRef; context: { $implicit: s, actions: shellActions }"></ng-container>
496
- </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>
597
+ </ng-container>
598
+ </ng-template>
497
599
  </ng-template>
498
600
  <ng-template #defaultFooter>
499
601
  <div class="pw-shell__footer">
500
602
  <div class="pw-shell__footer-left">
501
603
  <!-- Form mode: Cancel on the left -->
502
604
  <button
503
- *ngIf="getResolvedFooterLayout(s) === 'form' && !hideCancel"
605
+ *ngIf="getResolvedLayout(s) === 'form' && !hideCancel"
504
606
  type="button"
505
607
  class="pw-shell__btn pw-shell__btn--cancel"
506
608
  [disabled]="s.status !== 'idle'"
@@ -508,7 +610,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
508
610
  >{{ cancelLabel }}</button>
509
611
  <!-- Wizard mode: Back on the left -->
510
612
  <button
511
- *ngIf="getResolvedFooterLayout(s) === 'wizard' && !s.isFirstStep"
613
+ *ngIf="getResolvedLayout(s) === 'wizard' && !s.isFirstStep"
512
614
  type="button"
513
615
  class="pw-shell__btn pw-shell__btn--back"
514
616
  [disabled]="s.status !== 'idle' || !s.canMovePrevious"
@@ -518,7 +620,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
518
620
  <div class="pw-shell__footer-right">
519
621
  <!-- Wizard mode: Cancel on the right -->
520
622
  <button
521
- *ngIf="getResolvedFooterLayout(s) === 'wizard' && !hideCancel"
623
+ *ngIf="getResolvedLayout(s) === 'wizard' && !hideCancel"
522
624
  type="button"
523
625
  class="pw-shell__btn pw-shell__btn--cancel"
524
626
  [disabled]="s.status !== 'idle'"
@@ -544,6 +646,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
544
646
  type: Input
545
647
  }], initialData: [{
546
648
  type: Input
649
+ }], restoreKey: [{
650
+ type: Input
547
651
  }], autoStart: [{
548
652
  type: Input
549
653
  }], backLabel: [{
@@ -560,7 +664,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
560
664
  type: Input
561
665
  }], hideProgress: [{
562
666
  type: Input
563
- }], footerLayout: [{
667
+ }], hideFooter: [{
668
+ type: Input
669
+ }], validateWhen: [{
670
+ type: Input
671
+ }], services: [{
672
+ type: Input
673
+ }], layout: [{
564
674
  type: Input
565
675
  }], validationDisplay: [{
566
676
  type: Input
@@ -581,5 +691,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
581
691
  }], customFooter: [{
582
692
  type: ContentChild,
583
693
  args: [PathShellFooterDirective]
694
+ }], customCompletion: [{
695
+ type: ContentChild,
696
+ args: [PathShellCompletionDirective]
584
697
  }] } });
585
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.10.1",
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.10.1"
64
+ "@daltonr/pathwrite-core": "^0.12.0"
65
65
  },
66
66
  "publishConfig": {
67
67
  "access": "public"