@wertzui/ngx-restworld-client 7.2.0 → 8.0.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.
Files changed (96) hide show
  1. package/esm2020/lib/components/restworld-file/restworld-file.component.mjs +57 -0
  2. package/esm2020/lib/components/restworld-form/restworld-form.component.mjs +188 -0
  3. package/esm2020/lib/components/restworld-id-navigation/restworld-id-navigation.component.mjs +65 -0
  4. package/esm2020/lib/components/restworld-image/restworld-image.component.mjs +164 -0
  5. package/esm2020/lib/components/restworld-inputs/restworld-inputs.mjs +306 -0
  6. package/esm2020/lib/components/restworld-label/restworld-label.component.mjs +24 -0
  7. package/esm2020/lib/components/restworld-menu-button/restworld-menu-button.component.mjs +40 -0
  8. package/esm2020/lib/components/restworld-table/restworld-table.component.mjs +157 -0
  9. package/esm2020/lib/components/restworld-validation-errors/restworld-validation-errors.component.mjs +21 -0
  10. package/esm2020/lib/models/o-data.mjs +2 -0
  11. package/esm2020/lib/models/restworld-image.mjs +2 -0
  12. package/esm2020/lib/models/restworld-options.mjs +2 -2
  13. package/esm2020/lib/models/special-properties.mjs +6 -0
  14. package/esm2020/lib/models/templating.mjs +2 -0
  15. package/esm2020/lib/restworld-client.module.mjs +83 -25
  16. package/esm2020/lib/services/o-data.service.mjs +6 -3
  17. package/esm2020/lib/services/restworld-client-collection.mjs +7 -7
  18. package/esm2020/lib/services/restworld-client.mjs +40 -29
  19. package/esm2020/lib/services/settings.service.mjs +5 -5
  20. package/esm2020/lib/views/restworld-edit-view/restworld-edit-view.component.mjs +24 -255
  21. package/esm2020/lib/views/restworld-list-view/restworld-list-view.component.mjs +49 -101
  22. package/esm2020/public-api.mjs +17 -6
  23. package/fesm2015/wertzui-ngx-restworld-client.mjs +1373 -1017
  24. package/fesm2015/wertzui-ngx-restworld-client.mjs.map +1 -1
  25. package/fesm2020/wertzui-ngx-restworld-client.mjs +1322 -978
  26. package/fesm2020/wertzui-ngx-restworld-client.mjs.map +1 -1
  27. package/index.d.ts +1 -0
  28. package/lib/components/restworld-avatar/restworld-avatar.component.d.ts +1 -0
  29. package/lib/components/restworld-avatar/restworld-avatar.component.d.ts.map +1 -0
  30. package/lib/{views/restworld-file-view/restworld-file-view.component.d.ts → components/restworld-file/restworld-file.component.d.ts} +4 -3
  31. package/lib/components/restworld-file/restworld-file.component.d.ts.map +1 -0
  32. package/lib/components/restworld-form/restworld-form.component.d.ts +53 -0
  33. package/lib/components/restworld-form/restworld-form.component.d.ts.map +1 -0
  34. package/lib/components/restworld-id-navigation/restworld-id-navigation.component.d.ts +27 -0
  35. package/lib/components/restworld-id-navigation/restworld-id-navigation.component.d.ts.map +1 -0
  36. package/lib/components/restworld-image/restworld-image.component.d.ts +62 -0
  37. package/lib/components/restworld-image/restworld-image.component.d.ts.map +1 -0
  38. package/lib/components/restworld-inputs/restworld-inputs.d.ts +146 -0
  39. package/lib/components/restworld-inputs/restworld-inputs.d.ts.map +1 -0
  40. package/lib/components/restworld-label/restworld-label.component.d.ts +14 -0
  41. package/lib/components/restworld-label/restworld-label.component.d.ts.map +1 -0
  42. package/lib/components/restworld-menu-button/restworld-menu-button.component.d.ts +12 -0
  43. package/lib/components/restworld-menu-button/restworld-menu-button.component.d.ts.map +1 -0
  44. package/lib/components/restworld-table/restworld-table.component.d.ts +54 -0
  45. package/lib/components/restworld-table/restworld-table.component.d.ts.map +1 -0
  46. package/lib/components/restworld-validation-errors/restworld-validation-errors.component.d.ts +15 -0
  47. package/lib/components/restworld-validation-errors/restworld-validation-errors.component.d.ts.map +1 -0
  48. package/lib/constants/link-names.d.ts +1 -0
  49. package/lib/constants/link-names.d.ts.map +1 -0
  50. package/lib/models/api-url.d.ts +1 -0
  51. package/lib/models/api-url.d.ts.map +1 -0
  52. package/lib/models/client-settings.d.ts +1 -0
  53. package/lib/models/client-settings.d.ts.map +1 -0
  54. package/lib/models/o-data.d.ts +7 -0
  55. package/lib/models/o-data.d.ts.map +1 -0
  56. package/lib/models/problem-details.d.ts +1 -0
  57. package/lib/models/problem-details.d.ts.map +1 -0
  58. package/lib/models/restworld-image.d.ts +28 -0
  59. package/lib/models/restworld-image.d.ts.map +1 -0
  60. package/lib/models/restworld-options.d.ts +2 -1
  61. package/lib/models/restworld-options.d.ts.map +1 -0
  62. package/lib/models/special-properties.d.ts +9 -0
  63. package/lib/models/special-properties.d.ts.map +1 -0
  64. package/lib/models/templating.d.ts +8 -0
  65. package/lib/models/templating.d.ts.map +1 -0
  66. package/lib/pipes/as.pipe.d.ts +1 -0
  67. package/lib/pipes/as.pipe.d.ts.map +1 -0
  68. package/lib/pipes/safe-url.pipe.d.ts +1 -0
  69. package/lib/pipes/safe-url.pipe.d.ts.map +1 -0
  70. package/lib/restworld-client.module.d.ts +45 -37
  71. package/lib/restworld-client.module.d.ts.map +1 -0
  72. package/lib/services/avatar-generator.d.ts +1 -0
  73. package/lib/services/avatar-generator.d.ts.map +1 -0
  74. package/lib/services/form.service.d.ts +1 -0
  75. package/lib/services/form.service.d.ts.map +1 -0
  76. package/lib/services/o-data.service.d.ts +1 -0
  77. package/lib/services/o-data.service.d.ts.map +1 -0
  78. package/lib/services/restworld-client-collection.d.ts +9 -8
  79. package/lib/services/restworld-client-collection.d.ts.map +1 -0
  80. package/lib/services/restworld-client.d.ts +12 -4
  81. package/lib/services/restworld-client.d.ts.map +1 -0
  82. package/lib/services/settings.service.d.ts +3 -2
  83. package/lib/services/settings.service.d.ts.map +1 -0
  84. package/lib/views/restworld-edit-view/restworld-edit-view.component.d.ts +16 -68
  85. package/lib/views/restworld-edit-view/restworld-edit-view.component.d.ts.map +1 -0
  86. package/lib/views/restworld-list-view/restworld-list-view.component.d.ts +25 -41
  87. package/lib/views/restworld-list-view/restworld-list-view.component.d.ts.map +1 -0
  88. package/package.json +6 -6
  89. package/public-api.d.ts +17 -5
  90. package/public-api.d.ts.map +1 -0
  91. package/wertzui-ngx-restworld-client.d.ts.map +1 -0
  92. package/esm2020/lib/views/restworld-edit-form/restworld-edit-form.component.mjs +0 -233
  93. package/esm2020/lib/views/restworld-file-view/restworld-file-view.component.mjs +0 -57
  94. package/esm2020/lib/views/restworld-image-view/restworld-image-view.component.mjs +0 -139
  95. package/lib/views/restworld-edit-form/restworld-edit-form.component.d.ts +0 -74
  96. package/lib/views/restworld-image-view/restworld-image-view.component.d.ts +0 -57
@@ -0,0 +1,57 @@
1
+ import { Component, forwardRef, Input, ViewChildren } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { FileUpload } from 'primeng/fileupload';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ import * as i2 from "primeng/tooltip";
7
+ import * as i3 from "primeng/button";
8
+ import * as i4 from "primeng/fileupload";
9
+ import * as i5 from "../../pipes/safe-url.pipe";
10
+ export class RestWorldFileComponent {
11
+ constructor() {
12
+ this.disabled = false;
13
+ }
14
+ writeValue(obj) {
15
+ this.uri = obj;
16
+ }
17
+ registerOnChange(fn) {
18
+ this.onChange = fn;
19
+ }
20
+ registerOnTouched() {
21
+ // not needed for this component, but needed to implement the interface
22
+ }
23
+ setDisabledState(isDisabled) {
24
+ this.disabled = isDisabled;
25
+ }
26
+ fileChanged(event) {
27
+ const file = event.files[0];
28
+ const reader = new FileReader();
29
+ reader.onload = () => {
30
+ this.uri = reader.result;
31
+ this.onChange?.(this.uri);
32
+ };
33
+ reader.readAsDataURL(file);
34
+ }
35
+ }
36
+ RestWorldFileComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: RestWorldFileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
37
+ RestWorldFileComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.3", type: RestWorldFileComponent, selector: "rw-file", inputs: { accept: "accept", fileName: "fileName" }, providers: [{
38
+ provide: NG_VALUE_ACCESSOR,
39
+ useExisting: forwardRef(() => RestWorldFileComponent),
40
+ multi: true
41
+ }], viewQueries: [{ propertyName: "fileUploads", predicate: FileUpload, descendants: true }], ngImport: i0, template: "<div class=\"flex align-items-center\">\r\n <p-button *ngIf=\"!uri\" [disabled]=\"true\" icon=\"pi pi-download\" class=\"mr-1\" pTooltip=\"No file present\"></p-button>\r\n <a *ngIf=\"uri\" [href]=\"uri | safeUrl\" [download]=\"fileName || 'download'\" class=\"mr-1\" pButton pTooltip=\"Download file\" icon=\"pi pi-download\"></a>\r\n <p-fileUpload chooseIcon=\"pi-upload fas fa-upload\" pTooltip=\"Upload new file\" mode=\"basic\" [auto]=\"true\" [accept]=\"accept || ''\" [customUpload]=\"true\" (uploadHandler)=\"fileChanged($event)\"></p-fileUpload>\r\n</div>\r\n", styles: ["a{text-decoration:none}a.p-button-icon-only span.p-button-label{height:1rem!important}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "fitContent", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i3.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass", "ariaLabel"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i4.FileUpload, selector: "p-fileUpload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "uploadStyleClass", "cancelStyleClass", "removeStyleClass", "chooseStyleClass", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler", "onImageError"] }, { kind: "pipe", type: i5.SafeUrlPipe, name: "safeUrl" }] });
42
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: RestWorldFileComponent, decorators: [{
43
+ type: Component,
44
+ args: [{ selector: 'rw-file', providers: [{
45
+ provide: NG_VALUE_ACCESSOR,
46
+ useExisting: forwardRef(() => RestWorldFileComponent),
47
+ multi: true
48
+ }], template: "<div class=\"flex align-items-center\">\r\n <p-button *ngIf=\"!uri\" [disabled]=\"true\" icon=\"pi pi-download\" class=\"mr-1\" pTooltip=\"No file present\"></p-button>\r\n <a *ngIf=\"uri\" [href]=\"uri | safeUrl\" [download]=\"fileName || 'download'\" class=\"mr-1\" pButton pTooltip=\"Download file\" icon=\"pi pi-download\"></a>\r\n <p-fileUpload chooseIcon=\"pi-upload fas fa-upload\" pTooltip=\"Upload new file\" mode=\"basic\" [auto]=\"true\" [accept]=\"accept || ''\" [customUpload]=\"true\" (uploadHandler)=\"fileChanged($event)\"></p-fileUpload>\r\n</div>\r\n", styles: ["a{text-decoration:none}a.p-button-icon-only span.p-button-label{height:1rem!important}\n"] }]
49
+ }], propDecorators: { accept: [{
50
+ type: Input
51
+ }], fileName: [{
52
+ type: Input
53
+ }], fileUploads: [{
54
+ type: ViewChildren,
55
+ args: [FileUpload]
56
+ }] } });
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdHdvcmxkLWZpbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJlc3R3b3JsZC1jbGllbnQvc3JjL2xpYi9jb21wb25lbnRzL3Jlc3R3b3JsZC1maWxlL3Jlc3R3b3JsZC1maWxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZXN0d29ybGQtY2xpZW50L3NyYy9saWIvY29tcG9uZW50cy9yZXN0d29ybGQtZmlsZS9yZXN0d29ybGQtZmlsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQWEsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RGLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7QUFZaEQsTUFBTSxPQUFPLHNCQUFzQjtJQVZuQztRQXFCUyxhQUFRLEdBQUcsS0FBSyxDQUFDO0tBMEJ6QjtJQXZCQyxVQUFVLENBQUMsR0FBWTtRQUNyQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNqQixDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsRUFBYTtRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBQ0QsaUJBQWlCO1FBQ2YsdUVBQXVFO0lBQ3pFLENBQUM7SUFDRCxnQkFBZ0IsQ0FBRSxVQUFtQjtRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUM3QixDQUFDO0lBRU0sV0FBVyxDQUFDLEtBQXdCO1FBQ3pDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNoQyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtZQUNuQixJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFnQixDQUFDO1lBQ25DLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDO1FBRUYsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDOzttSEFwQ1Usc0JBQXNCO3VHQUF0QixzQkFBc0Isc0ZBTnRCLENBQUM7WUFDVixPQUFPLEVBQUUsaUJBQWlCO1lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsc0JBQXNCLENBQUM7WUFDckQsS0FBSyxFQUFFLElBQUk7U0FDWixDQUFDLDBEQVVZLFVBQVUsZ0RDdEIxQiw2akJBS0E7MkZEU2Esc0JBQXNCO2tCQVZsQyxTQUFTOytCQUNFLFNBQVMsYUFHUixDQUFDOzRCQUNWLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHVCQUF1QixDQUFDOzRCQUNyRCxLQUFLLEVBQUUsSUFBSTt5QkFDWixDQUFDOzhCQUtLLE1BQU07c0JBRFosS0FBSztnQkFJQyxRQUFRO3NCQURkLEtBQUs7Z0JBSU4sV0FBVztzQkFEVixZQUFZO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGZvcndhcmRSZWYsIElucHV0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEZpbGVVcGxvYWQgfSBmcm9tICdwcmltZW5nL2ZpbGV1cGxvYWQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdydy1maWxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcmVzdHdvcmxkLWZpbGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3Jlc3R3b3JsZC1maWxlLmNvbXBvbmVudC5jc3MnXSxcclxuICBwcm92aWRlcnM6IFt7XHJcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFJlc3RXb3JsZEZpbGVDb21wb25lbnQpLFxyXG4gICAgbXVsdGk6IHRydWVcclxuICB9XVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVzdFdvcmxkRmlsZUNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuICBwcml2YXRlIG9uQ2hhbmdlPzogRnVuY3Rpb247XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgYWNjZXB0Pzogc3RyaW5nO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBmaWxlTmFtZT86IHN0cmluZztcclxuXHJcbiAgQFZpZXdDaGlsZHJlbihGaWxlVXBsb2FkKVxyXG4gIGZpbGVVcGxvYWRzPzogUXVlcnlMaXN0PEZpbGVVcGxvYWQ+O1xyXG5cclxuICBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcclxuICBwdWJsaWMgdXJpPzogc3RyaW5nO1xyXG5cclxuICB3cml0ZVZhbHVlKG9iaj86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy51cmkgPSBvYmo7XHJcbiAgfVxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm4/OiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuICByZWdpc3Rlck9uVG91Y2hlZCgpOiB2b2lkIHtcclxuICAgIC8vIG5vdCBuZWVkZWQgZm9yIHRoaXMgY29tcG9uZW50LCBidXQgbmVlZGVkIHRvIGltcGxlbWVudCB0aGUgaW50ZXJmYWNlXHJcbiAgfVxyXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGZpbGVDaGFuZ2VkKGV2ZW50OiB7IGZpbGVzOiBGaWxlW10gfSk6IHZvaWQge1xyXG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LmZpbGVzWzBdO1xyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgIHRoaXMudXJpID0gcmVhZGVyLnJlc3VsdCBhcyBzdHJpbmc7XHJcbiAgICAgIHRoaXMub25DaGFuZ2U/Lih0aGlzLnVyaSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICA8cC1idXR0b24gKm5nSWY9XCIhdXJpXCIgW2Rpc2FibGVkXT1cInRydWVcIiBpY29uPVwicGkgcGktZG93bmxvYWRcIiBjbGFzcz1cIm1yLTFcIiBwVG9vbHRpcD1cIk5vIGZpbGUgcHJlc2VudFwiPjwvcC1idXR0b24+XHJcbiAgPGEgKm5nSWY9XCJ1cmlcIiBbaHJlZl09XCJ1cmkgfCBzYWZlVXJsXCIgW2Rvd25sb2FkXT1cImZpbGVOYW1lIHx8ICdkb3dubG9hZCdcIiBjbGFzcz1cIm1yLTFcIiBwQnV0dG9uIHBUb29sdGlwPVwiRG93bmxvYWQgZmlsZVwiIGljb249XCJwaSBwaS1kb3dubG9hZFwiPjwvYT5cclxuICA8cC1maWxlVXBsb2FkIGNob29zZUljb249XCJwaS11cGxvYWQgZmFzIGZhLXVwbG9hZFwiIHBUb29sdGlwPVwiVXBsb2FkIG5ldyBmaWxlXCIgbW9kZT1cImJhc2ljXCIgW2F1dG9dPVwidHJ1ZVwiIFthY2NlcHRdPVwiYWNjZXB0IHx8ICcnXCIgW2N1c3RvbVVwbG9hZF09XCJ0cnVlXCIgKHVwbG9hZEhhbmRsZXIpPVwiZmlsZUNoYW5nZWQoJGV2ZW50KVwiPjwvcC1maWxlVXBsb2FkPlxyXG48L2Rpdj5cclxuIl19
@@ -0,0 +1,188 @@
1
+ import { Component, ContentChild, EventEmitter, Input, Output } from '@angular/core';
2
+ import { UntypedFormArray, UntypedFormGroup } from '@angular/forms';
3
+ import { ProblemDetails } from '../../models/problem-details';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../../services/restworld-client-collection";
6
+ import * as i2 from "primeng/api";
7
+ import * as i3 from "../../services/form.service";
8
+ import * as i4 from "@angular/common";
9
+ import * as i5 from "@angular/forms";
10
+ import * as i6 from "primeng/button";
11
+ import * as i7 from "primeng/progressspinner";
12
+ import * as i8 from "primeng/ripple";
13
+ import * as i9 from "../restworld-inputs/restworld-inputs";
14
+ /**
15
+ * A form with Save, Reload and Delete buttons.
16
+ * If you do not want buttons, use RestWorldFormTemplateComponent <rw-form-template>.
17
+ * You can also provide your own buttons by passing in a template.
18
+ */
19
+ export class RestWorldFormComponent {
20
+ constructor(_clients, _confirmationService, _messageService, _formService) {
21
+ this._clients = _clients;
22
+ this._confirmationService = _confirmationService;
23
+ this._messageService = _messageService;
24
+ this._formService = _formService;
25
+ this.allowSubmit = true;
26
+ this.allowDelete = true;
27
+ this.allowReload = true;
28
+ this.showSubmit = true;
29
+ this.showDelete = true;
30
+ this.showReload = true;
31
+ this.afterDelete = new EventEmitter();
32
+ this.afterSubmit = new EventEmitter();
33
+ this._isLoading = false;
34
+ }
35
+ get isLoading() {
36
+ return this._isLoading;
37
+ }
38
+ get formGroup() {
39
+ return this._formGroup;
40
+ }
41
+ get canSubmit() {
42
+ return this.allowSubmit &&
43
+ this.template.target !== undefined &&
44
+ !this.isLoading;
45
+ }
46
+ get canDelete() {
47
+ return this.allowDelete &&
48
+ this.template.target !== undefined &&
49
+ this.template.method == "PUT" &&
50
+ !this.isLoading;
51
+ }
52
+ get canReload() {
53
+ return this.allowReload &&
54
+ this.template.target !== undefined &&
55
+ this.template.title !== undefined &&
56
+ this.template.properties.some(p => p.name === "id" && p.value !== undefined && p.value !== null && p.value !== 0) &&
57
+ !this.isLoading;
58
+ }
59
+ ngOnInit() {
60
+ this._formGroup = this._formService.createFormGroupFromTemplate(this.template);
61
+ }
62
+ async reload() {
63
+ if (!this.canReload)
64
+ return;
65
+ this._isLoading = true;
66
+ try {
67
+ const response = await this.getClient().getForm(this.template.target);
68
+ if (!response.ok || ProblemDetails.isProblemDetails(response.body) || !response.body) {
69
+ this._messageService.add({ severity: 'error', summary: 'Error', detail: 'Error while loading the resource from the API.', data: response, sticky: true });
70
+ }
71
+ else {
72
+ this.template = response.body.getTemplateByTitle(this.template.title);
73
+ this._formGroup = this._formService.createFormGroupFromTemplate(this.template);
74
+ }
75
+ }
76
+ catch (e) {
77
+ this._messageService.add({ severity: 'error', summary: 'Error', detail: `An unknown error occurred. ${JSON.stringify(e)}`, sticky: true });
78
+ console.log(e);
79
+ }
80
+ this._isLoading = false;
81
+ }
82
+ showDeleteConfirmatioModal() {
83
+ this._confirmationService.confirm({
84
+ message: 'Do you really want to delete this resource?',
85
+ header: 'Confirm delete',
86
+ icon: 'far fa-trash-alt',
87
+ accept: () => this.delete()
88
+ });
89
+ }
90
+ async submit() {
91
+ if (!this.canSubmit)
92
+ return;
93
+ this._isLoading = true;
94
+ try {
95
+ const response = await this.getClient().submit(this.template, this.formGroup.value);
96
+ if (!response.ok) {
97
+ let summary = 'Error';
98
+ let detail = 'Error while saving the resource.';
99
+ if (ProblemDetails.isProblemDetails(response.body)) {
100
+ const problemDetails = response.body;
101
+ summary = problemDetails.title || summary;
102
+ detail = problemDetails.detail || detail;
103
+ // display validation errors
104
+ if (problemDetails['errors']) {
105
+ for (const [key, errorsForKey] of Object.entries(problemDetails['errors'])) {
106
+ const path = key.split(/\.|\[/).map(e => e.replace("]", ""));
107
+ // The path might start with a $, indicating the root.
108
+ if (path.length > 0 && path[0] === '$')
109
+ path.shift();
110
+ const formControl = path.reduce(RestWorldFormComponent.getSubControl, this.formGroup);
111
+ formControl.setErrors({ ...formControl.errors, ...{ remote: errorsForKey } });
112
+ formControl.markAsTouched();
113
+ }
114
+ }
115
+ }
116
+ this._messageService.add({ severity: 'error', summary: summary, detail: detail, data: response, sticky: true });
117
+ }
118
+ else {
119
+ const templateBeforeSubmit = this.template;
120
+ const responseResource = response.body;
121
+ const templateAfterSubmit = responseResource.getTemplateByTitle(this.template.title);
122
+ this._messageService.add({ severity: 'success', summary: 'Saved', detail: 'The resource has been saved.' });
123
+ this.afterSubmit.emit({ old: templateBeforeSubmit, new: templateAfterSubmit });
124
+ }
125
+ }
126
+ catch (e) {
127
+ this._messageService.add({ severity: 'error', summary: 'Error', detail: `An unknown error occurred. ${JSON.stringify(e)}`, sticky: true });
128
+ console.log(e);
129
+ }
130
+ this._isLoading = false;
131
+ }
132
+ async delete() {
133
+ if (!this.canDelete)
134
+ return;
135
+ if (this.formGroup === undefined)
136
+ throw new Error("formGroup cannot be undefined.");
137
+ await this.getClient().deleteByTemplateAndForm(this.template, this.formGroup);
138
+ this._messageService.add({ severity: 'success', summary: 'Deleted', detail: 'The resource has been deleted.' });
139
+ this.afterDelete.emit();
140
+ }
141
+ static getSubControl(control, pathElement) {
142
+ if (pathElement === "")
143
+ return control;
144
+ if (control instanceof UntypedFormGroup)
145
+ return control.controls[pathElement];
146
+ if (control instanceof UntypedFormArray) {
147
+ const index = Number.parseInt(pathElement);
148
+ if (Number.isInteger(index))
149
+ return control.controls[index];
150
+ }
151
+ return control;
152
+ }
153
+ getClient() {
154
+ return this._clients.getClient(this.apiName);
155
+ }
156
+ }
157
+ RestWorldFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: RestWorldFormComponent, deps: [{ token: i1.RestWorldClientCollection }, { token: i2.ConfirmationService }, { token: i2.MessageService }, { token: i3.FormService }], target: i0.ɵɵFactoryTarget.Component });
158
+ RestWorldFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.3", type: RestWorldFormComponent, selector: "rw-form", inputs: { template: "template", apiName: "apiName", rel: "rel", allowSubmit: "allowSubmit", allowDelete: "allowDelete", allowReload: "allowReload", showSubmit: "showSubmit", showDelete: "showDelete", showReload: "showReload" }, outputs: { afterDelete: "afterDelete", afterSubmit: "afterSubmit" }, queries: [{ propertyName: "buttonsRef", first: true, predicate: ["buttons"], descendants: true }], ngImport: i0, template: "<form *ngIf=\"formGroup !== undefined && template !== undefined\" [formGroup]=\"formGroup\" (ngSubmit)=\"submit()\">\n <div class=\"blockable-container\">\n <div class=\"blockable-element\">\n <rw-input-template [template]=\"template\" [apiName]=\"apiName\"></rw-input-template>\n </div>\n <div class=\"blockable-overlay\" *ngIf=\"isLoading\">\n <p-progressSpinner></p-progressSpinner>\n </div>\n </div>\n\n <div class=\"grid\">\n <div class=\"col\">\n <div class=\"flex justify-content-end w-full\">\n <ng-template #defaultButtons>\n <button pButton pRipple type=\"submit\" label=\"Save\" icon=\"far fa-save\" class=\"mx-2 p-button-success\"\n [disabled]=\"!canSubmit\"></button>\n <button pButton pRipple type=\"button\" label=\"Reload\" icon=\"fas fa-redo\" class=\"mx-2 p-button-info\"\n (click)=\"reload()\" [disabled]=\"!canReload\"></button>\n <button pButton pRipple type=\"button\" label=\"Delete\" icon=\"far fa-trash-alt\"\n class=\"ml-2 p-button-danger\" (click)=\"showDeleteConfirmatioModal()\"\n [disabled]=\"!canDelete\"></button>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"buttonsRef || defaultButtons\"></ng-container>\n </div>\n </div>\n </div>\n</form>\n", styles: [".blockable-container{display:grid;place-items:center;grid-template-areas:\"inner\"}.blockable-element{grid-area:inner;width:100%}.blockable-overlay{grid-area:inner;height:100%;width:100%;background-color:#0006;display:flex;align-items:center;justify-content:center;z-index:1}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i6.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i7.ProgressSpinner, selector: "p-progressSpinner", inputs: ["style", "styleClass", "strokeWidth", "fill", "animationDuration"] }, { kind: "directive", type: i8.Ripple, selector: "[pRipple]" }, { kind: "component", type: i9.RestWorldInputTemplateComponent, selector: "rw-input-template", inputs: ["apiName", "template"] }] });
159
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: RestWorldFormComponent, decorators: [{
160
+ type: Component,
161
+ args: [{ selector: 'rw-form', template: "<form *ngIf=\"formGroup !== undefined && template !== undefined\" [formGroup]=\"formGroup\" (ngSubmit)=\"submit()\">\n <div class=\"blockable-container\">\n <div class=\"blockable-element\">\n <rw-input-template [template]=\"template\" [apiName]=\"apiName\"></rw-input-template>\n </div>\n <div class=\"blockable-overlay\" *ngIf=\"isLoading\">\n <p-progressSpinner></p-progressSpinner>\n </div>\n </div>\n\n <div class=\"grid\">\n <div class=\"col\">\n <div class=\"flex justify-content-end w-full\">\n <ng-template #defaultButtons>\n <button pButton pRipple type=\"submit\" label=\"Save\" icon=\"far fa-save\" class=\"mx-2 p-button-success\"\n [disabled]=\"!canSubmit\"></button>\n <button pButton pRipple type=\"button\" label=\"Reload\" icon=\"fas fa-redo\" class=\"mx-2 p-button-info\"\n (click)=\"reload()\" [disabled]=\"!canReload\"></button>\n <button pButton pRipple type=\"button\" label=\"Delete\" icon=\"far fa-trash-alt\"\n class=\"ml-2 p-button-danger\" (click)=\"showDeleteConfirmatioModal()\"\n [disabled]=\"!canDelete\"></button>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"buttonsRef || defaultButtons\"></ng-container>\n </div>\n </div>\n </div>\n</form>\n", styles: [".blockable-container{display:grid;place-items:center;grid-template-areas:\"inner\"}.blockable-element{grid-area:inner;width:100%}.blockable-overlay{grid-area:inner;height:100%;width:100%;background-color:#0006;display:flex;align-items:center;justify-content:center;z-index:1}\n"] }]
162
+ }], ctorParameters: function () { return [{ type: i1.RestWorldClientCollection }, { type: i2.ConfirmationService }, { type: i2.MessageService }, { type: i3.FormService }]; }, propDecorators: { template: [{
163
+ type: Input
164
+ }], apiName: [{
165
+ type: Input
166
+ }], rel: [{
167
+ type: Input
168
+ }], allowSubmit: [{
169
+ type: Input
170
+ }], allowDelete: [{
171
+ type: Input
172
+ }], allowReload: [{
173
+ type: Input
174
+ }], showSubmit: [{
175
+ type: Input
176
+ }], showDelete: [{
177
+ type: Input
178
+ }], showReload: [{
179
+ type: Input
180
+ }], afterDelete: [{
181
+ type: Output
182
+ }], afterSubmit: [{
183
+ type: Output
184
+ }], buttonsRef: [{
185
+ type: ContentChild,
186
+ args: ['buttons', { static: false }]
187
+ }] } });
188
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdHdvcmxkLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJlc3R3b3JsZC1jbGllbnQvc3JjL2xpYi9jb21wb25lbnRzL3Jlc3R3b3JsZC1mb3JtL3Jlc3R3b3JsZC1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZXN0d29ybGQtY2xpZW50L3NyYy9saWIvY29tcG9uZW50cy9yZXN0d29ybGQtZm9ybS9yZXN0d29ybGQtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBZSxNQUFNLGVBQWUsQ0FBQztBQUMxRyxPQUFPLEVBQThCLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJaEcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7Ozs7OztBQUs5RDs7OztHQUlHO0FBTUgsTUFBTSxPQUFPLHNCQUFzQjtJQW9FakMsWUFDbUIsUUFBbUMsRUFDbkMsb0JBQXlDLEVBQ3pDLGVBQStCLEVBQy9CLFlBQXlCO1FBSHpCLGFBQVEsR0FBUixRQUFRLENBQTJCO1FBQ25DLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBcUI7UUFDekMsb0JBQWUsR0FBZixlQUFlLENBQWdCO1FBQy9CLGlCQUFZLEdBQVosWUFBWSxDQUFhO1FBN0Q1QyxnQkFBVyxHQUFHLElBQUksQ0FBQztRQUduQixnQkFBVyxHQUFHLElBQUksQ0FBQztRQUduQixnQkFBVyxHQUFHLElBQUksQ0FBQztRQUduQixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBR2xCLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFHbEIsZUFBVSxHQUFHLElBQUksQ0FBQztRQUdsQixnQkFBVyxHQUFH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IEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtR3JvdXAsIFVudHlwZWRGb3JtQXJyYXksIFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgRm9ybXNSZXNvdXJjZSwgVGVtcGxhdGUgfSBmcm9tICdAd2VydHp1aS9uZ3gtaGFsLWNsaWVudCc7XG5pbXBvcnQgeyBDb25maXJtYXRpb25TZXJ2aWNlLCBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IFByb2JsZW1EZXRhaWxzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3Byb2JsZW0tZGV0YWlscyc7XG5pbXBvcnQgeyBGb3JtU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Zvcm0uc2VydmljZSc7XG5pbXBvcnQgeyBSZXN0V29ybGRDbGllbnQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXN0d29ybGQtY2xpZW50JztcbmltcG9ydCB7IFJlc3RXb3JsZENsaWVudENvbGxlY3Rpb24gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXN0d29ybGQtY2xpZW50LWNvbGxlY3Rpb24nO1xuXG4vKipcbiAqIEEgZm9ybSB3aXRoIFNhdmUsIFJlbG9hZCBhbmQgRGVsZXRlIGJ1dHRvbnMuXG4gKiBJZiB5b3UgZG8gbm90IHdhbnQgYnV0dG9ucywgdXNlIFJlc3RXb3JsZEZvcm1UZW1wbGF0ZUNvbXBvbmVudCA8cnctZm9ybS10ZW1wbGF0ZT4uXG4gKiBZb3UgY2FuIGFsc28gcHJvdmlkZSB5b3VyIG93biBidXR0b25zIGJ5IHBhc3NpbmcgaW4gYSB0ZW1wbGF0ZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnctZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXN0d29ybGQtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Jlc3R3b3JsZC1mb3JtLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBSZXN0V29ybGRGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0e1xuICBASW5wdXQoKVxuICB0ZW1wbGF0ZSE6IFRlbXBsYXRlO1xuXG4gIEBJbnB1dCgpXG4gIGFwaU5hbWUhOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcmVsITogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGFsbG93U3VibWl0ID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBhbGxvd0RlbGV0ZSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgYWxsb3dSZWxvYWQgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHNob3dTdWJtaXQgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHNob3dEZWxldGUgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHNob3dSZWxvYWQgPSB0cnVlO1xuXG4gIEBPdXRwdXQoKVxuICBhZnRlckRlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBAT3V0cHV0KClcbiAgYWZ0ZXJTdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPHtvbGQ6IFRlbXBsYXRlLCBuZXc6IFRlbXBsYXRlfT4oKTtcblxuICBAQ29udGVudENoaWxkKCdidXR0b25zJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGJ1dHRvbnNSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBwcml2YXRlIF9pc0xvYWRpbmcgPSBmYWxzZTtcbiAgcHVibGljIGdldCBpc0xvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzTG9hZGluZztcbiAgfVxuXG4gIHByaXZhdGUgX2Zvcm1Hcm91cD86IEZvcm1Hcm91cDx7dGltZXN0YW1wOiBBYnN0cmFjdENvbnRyb2w8c3RyaW5nPn0+O1xuICBwdWJsaWMgZ2V0IGZvcm1Hcm91cCgpOiBGb3JtR3JvdXA8e3RpbWVzdGFtcDogQWJzdHJhY3RDb250cm9sPHN0cmluZz59PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1Hcm91cDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY2FuU3VibWl0KCkgOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hbGxvd1N1Ym1pdCAmJlxuICAgICAgdGhpcy50ZW1wbGF0ZS50YXJnZXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgIXRoaXMuaXNMb2FkaW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBjYW5EZWxldGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWxsb3dEZWxldGUgJiZcbiAgICAgIHRoaXMudGVtcGxhdGUudGFyZ2V0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMudGVtcGxhdGUubWV0aG9kID09IFwiUFVUXCIgJiZcbiAgICAgICF0aGlzLmlzTG9hZGluZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY2FuUmVsb2FkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFsbG93UmVsb2FkICYmXG4gICAgICB0aGlzLnRlbXBsYXRlLnRhcmdldCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLnRlbXBsYXRlLnRpdGxlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMudGVtcGxhdGUucHJvcGVydGllcy5zb21lKHAgPT4gcC5uYW1lID09PSBcImlkXCIgJiYgcC52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHAudmFsdWUgIT09IG51bGwgJiYgcC52YWx1ZSAhPT0gMCkgJiZcbiAgICAgICF0aGlzLmlzTG9hZGluZztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NsaWVudHM6IFJlc3RXb3JsZENsaWVudENvbGxlY3Rpb24sXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29uZmlybWF0aW9uU2VydmljZTogQ29uZmlybWF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZm9ybVNlcnZpY2U6IEZvcm1TZXJ2aWNlKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9mb3JtR3JvdXAgPSB0aGlzLl9mb3JtU2VydmljZS5jcmVhdGVGb3JtR3JvdXBGcm9tVGVtcGxhdGUodGhpcy50ZW1wbGF0ZSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jYW5SZWxvYWQpXG4gICAgICByZXR1cm47XG5cbiAgICB0aGlzLl9pc0xvYWRpbmcgPSB0cnVlO1xuXG4gICAgdHJ5XG4gICAge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpLmdldEZvcm0odGhpcy50ZW1wbGF0ZS50YXJnZXQhKTtcbiAgICAgIGlmICghcmVzcG9uc2Uub2sgfHwgUHJvYmxlbURldGFpbHMuaXNQcm9ibGVtRGV0YWlscyhyZXNwb25zZS5ib2R5KSB8fCAhcmVzcG9uc2UuYm9keSkge1xuICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0Vycm9yJywgZGV0YWlsOiAnRXJyb3Igd2hpbGUgbG9hZGluZyB0aGUgcmVzb3VyY2UgZnJvbSB0aGUgQVBJLicsIGRhdGE6IHJlc3BvbnNlLCBzdGlja3k6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHJlc3BvbnNlLmJvZHkuZ2V0VGVtcGxhdGVCeVRpdGxlKHRoaXMudGVtcGxhdGUudGl0bGUhKTtcbiAgICAgICAgdGhpcy5fZm9ybUdyb3VwID0gdGhpcy5fZm9ybVNlcnZpY2UuY3JlYXRlRm9ybUdyb3VwRnJvbVRlbXBsYXRlKHRoaXMudGVtcGxhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdFcnJvcicsIGRldGFpbDogYEFuIHVua25vd24gZXJyb3Igb2NjdXJyZWQuICR7SlNPTi5zdHJpbmdpZnkoZSl9YCwgc3RpY2t5OiB0cnVlIH0pO1xuICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgfVxuXG4gICAgdGhpcy5faXNMb2FkaW5nID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgc2hvd0RlbGV0ZUNvbmZpcm1hdGlvTW9kYWwoKSB7XG4gICAgdGhpcy5fY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgIG1lc3NhZ2U6ICdEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgcmVzb3VyY2U/JyxcbiAgICAgIGhlYWRlcjogJ0NvbmZpcm0gZGVsZXRlJyxcbiAgICAgIGljb246ICdmYXIgZmEtdHJhc2gtYWx0JyxcbiAgICAgIGFjY2VwdDogKCkgPT4gdGhpcy5kZWxldGUoKVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN1Ym1pdCgpIHtcbiAgICBpZighdGhpcy5jYW5TdWJtaXQpXG4gICAgICByZXR1cm47XG5cbiAgICB0aGlzLl9pc0xvYWRpbmcgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKS5zdWJtaXQodGhpcy50ZW1wbGF0ZSwgdGhpcy5mb3JtR3JvdXAhLnZhbHVlKTtcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICBsZXQgc3VtbWFyeSA9ICdFcnJvcic7XG4gICAgICAgIGxldCBkZXRhaWwgPSAnRXJyb3Igd2hpbGUgc2F2aW5nIHRoZSByZXNvdXJjZS4nO1xuICAgICAgICBpZiAoUHJvYmxlbURldGFpbHMuaXNQcm9ibGVtRGV0YWlscyhyZXNwb25zZS5ib2R5KSkge1xuICAgICAgICAgIGNvbnN0IHByb2JsZW1EZXRhaWxzID0gcmVzcG9uc2UuYm9keSBhcyBQcm9ibGVtRGV0YWlscztcbiAgICAgICAgICBzdW1tYXJ5ID0gcHJvYmxlbURldGFpbHMudGl0bGUgfHwgc3VtbWFyeTtcbiAgICAgICAgICBkZXRhaWwgPSBwcm9ibGVtRGV0YWlscy5kZXRhaWwgfHwgZGV0YWlsO1xuICAgICAgICAgIC8vIGRpc3BsYXkgdmFsaWRhdGlvbiBlcnJvcnNcbiAgICAgICAgICBpZiAocHJvYmxlbURldGFpbHNbJ2Vycm9ycyddIGFzIHt9KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVycm9yc0ZvcktleV0gb2YgT2JqZWN0LmVudHJpZXMocHJvYmxlbURldGFpbHNbJ2Vycm9ycyddIGFzIHt9KSkge1xuICAgICAgICAgICAgICBjb25zdCBwYXRoID0ga2V5LnNwbGl0KC9cXC58XFxbLykubWFwKGUgPT4gZS5yZXBsYWNlKFwiXVwiLCBcIlwiKSk7XG4gICAgICAgICAgICAgIC8vIFRoZSBwYXRoIG1pZ2h0IHN0YXJ0IHdpdGggYSAkLCBpbmRpY2F0aW5nIHRoZSByb290LlxuICAgICAgICAgICAgICBpZiAocGF0aC5sZW5ndGggPiAwICYmIHBhdGhbMF0gPT09ICckJylcbiAgICAgICAgICAgICAgICBwYXRoLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gcGF0aC5yZWR1Y2U8QWJzdHJhY3RDb250cm9sPihSZXN0V29ybGRGb3JtQ29tcG9uZW50LmdldFN1YkNvbnRyb2wsIHRoaXMuZm9ybUdyb3VwISk7XG4gICAgICAgICAgICAgIGZvcm1Db250cm9sLnNldEVycm9ycyh7IC4uLmZvcm1Db250cm9sLmVycm9ycywgLi4ueyByZW1vdGU6IGVycm9yc0ZvcktleSB9IH0pO1xuICAgICAgICAgICAgICBmb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6IHN1bW1hcnksIGRldGFpbDogZGV0YWlsLCBkYXRhOiByZXNwb25zZSwgc3RpY2t5OiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlQmVmb3JlU3VibWl0ID0gdGhpcy50ZW1wbGF0ZTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VSZXNvdXJjZSA9IChyZXNwb25zZS5ib2R5IGFzIEZvcm1zUmVzb3VyY2UpO1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZUFmdGVyU3VibWl0ID0gcmVzcG9uc2VSZXNvdXJjZS5nZXRUZW1wbGF0ZUJ5VGl0bGUodGhpcy50ZW1wbGF0ZS50aXRsZSEpO1xuXG4gICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnc3VjY2VzcycsIHN1bW1hcnk6ICdTYXZlZCcsIGRldGFpbDogJ1RoZSByZXNvdXJjZSBoYXMgYmVlbiBzYXZlZC4nIH0pO1xuXG4gICAgICAgIHRoaXMuYWZ0ZXJTdWJtaXQuZW1pdCh7b2xkOiB0ZW1wbGF0ZUJlZm9yZVN1Ym1pdCwgbmV3OiB0ZW1wbGF0ZUFmdGVyU3VibWl0fSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0Vycm9yJywgZGV0YWlsOiBgQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZC4gJHtKU09OLnN0cmluZ2lmeShlKX1gLCBzdGlja3k6IHRydWUgfSk7XG4gICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9pc0xvYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZWxldGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmNhbkRlbGV0ZSlcbiAgICAgIHJldHVybjtcblxuICAgIGlmICh0aGlzLmZvcm1Hcm91cCA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZm9ybUdyb3VwIGNhbm5vdCBiZSB1bmRlZmluZWQuXCIpO1xuXG4gICAgYXdhaXQgdGhpcy5nZXRDbGllbnQoKS5kZWxldGVCeVRlbXBsYXRlQW5kRm9ybSh0aGlzLnRlbXBsYXRlLCB0aGlzLmZvcm1Hcm91cCk7XG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ0RlbGV0ZWQnLCBkZXRhaWw6ICdUaGUgcmVzb3VyY2UgaGFzIGJlZW4gZGVsZXRlZC4nIH0pXG5cbiAgICB0aGlzLmFmdGVyRGVsZXRlLmVtaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldFN1YkNvbnRyb2woY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBwYXRoRWxlbWVudDogc3RyaW5nKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICBpZiAocGF0aEVsZW1lbnQgPT09IFwiXCIpXG4gICAgICByZXR1cm4gY29udHJvbDtcblxuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Hcm91cClcbiAgICAgIHJldHVybiBjb250cm9sLmNvbnRyb2xzW3BhdGhFbGVtZW50XTtcblxuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVW50eXBlZEZvcm1BcnJheSkge1xuICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIucGFyc2VJbnQocGF0aEVsZW1lbnQpO1xuICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoaW5kZXgpKVxuICAgICAgICByZXR1cm4gY29udHJvbC5jb250cm9sc1tpbmRleF07XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRyb2w7XG4gIH1cblxuICBwcml2YXRlIGdldENsaWVudCgpOiBSZXN0V29ybGRDbGllbnQge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnRzLmdldENsaWVudCh0aGlzLmFwaU5hbWUpO1xuICB9XG59XG4iLCI8Zm9ybSAqbmdJZj1cImZvcm1Hcm91cCAhPT0gdW5kZWZpbmVkICYmIHRlbXBsYXRlICE9PSB1bmRlZmluZWRcIiBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiIChuZ1N1Ym1pdCk9XCJzdWJtaXQoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJibG9ja2FibGUtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJibG9ja2FibGUtZWxlbWVudFwiPlxuICAgICAgICAgICAgPHJ3LWlucHV0LXRlbXBsYXRlIFt0ZW1wbGF0ZV09XCJ0ZW1wbGF0ZVwiIFthcGlOYW1lXT1cImFwaU5hbWVcIj48L3J3LWlucHV0LXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJsb2NrYWJsZS1vdmVybGF5XCIgKm5nSWY9XCJpc0xvYWRpbmdcIj5cbiAgICAgICAgICAgIDxwLXByb2dyZXNzU3Bpbm5lcj48L3AtcHJvZ3Jlc3NTcGlubmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJncmlkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0QnV0dG9ucz5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cInN1Ym1pdFwiIGxhYmVsPVwiU2F2ZVwiIGljb249XCJmYXIgZmEtc2F2ZVwiIGNsYXNzPVwibXgtMiBwLWJ1dHRvbi1zdWNjZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuU3VibWl0XCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBsYWJlbD1cIlJlbG9hZFwiIGljb249XCJmYXMgZmEtcmVkb1wiIGNsYXNzPVwibXgtMiBwLWJ1dHRvbi1pbmZvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZWxvYWQoKVwiIFtkaXNhYmxlZF09XCIhY2FuUmVsb2FkXCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBsYWJlbD1cIkRlbGV0ZVwiIGljb249XCJmYXIgZmEtdHJhc2gtYWx0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWwtMiBwLWJ1dHRvbi1kYW5nZXJcIiAoY2xpY2spPVwic2hvd0RlbGV0ZUNvbmZpcm1hdGlvTW9kYWwoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNhbkRlbGV0ZVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ1dHRvbnNSZWYgfHwgZGVmYXVsdEJ1dHRvbnNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZm9ybT5cbiJdfQ==
@@ -0,0 +1,65 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { FormControl, FormGroup, Validators } from '@angular/forms';
3
+ import { ProblemDetails } from '../../models/problem-details';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../../services/restworld-client-collection";
6
+ import * as i2 from "primeng/api";
7
+ import * as i3 from "@angular/router";
8
+ import * as i4 from "@angular/forms";
9
+ import * as i5 from "primeng/inputnumber";
10
+ import * as i6 from "primeng/button";
11
+ import * as i7 from "primeng/ripple";
12
+ export class RestWorldIdNavigationComponent {
13
+ constructor(_clients, _messageService, _router, _route) {
14
+ this._clients = _clients;
15
+ this._messageService = _messageService;
16
+ this._router = _router;
17
+ this._route = _route;
18
+ this.idNavigationForm = new FormGroup({
19
+ id: new FormControl(null, Validators.compose([Validators.min(1), Validators.max(Number.MAX_SAFE_INTEGER)]))
20
+ });
21
+ }
22
+ async navigateById() {
23
+ if (!this.rel)
24
+ throw new Error('The "rel" must be set through the uri of this page for the ID navigation to work.');
25
+ if (!this.idNavigationForm.valid) {
26
+ this._messageService.add({ detail: 'You must enter a valid ID to naviage to.', severity: 'error' });
27
+ return;
28
+ }
29
+ var idToNavigateTo = this.idNavigationForm.controls.id.value;
30
+ var client = this.getClient();
31
+ var response = await client.getList(this.rel, { $filter: `id eq ${idToNavigateTo}` });
32
+ if (!response.ok || ProblemDetails.isProblemDetails(response.body) || !response.body) {
33
+ this._messageService.add({ severity: 'error', summary: 'Error', detail: 'Error while loading the resources from the API.', data: response });
34
+ return;
35
+ }
36
+ var resource = response.body?._embedded?.items?.[0];
37
+ if (!resource) {
38
+ this._messageService.add({ severity: 'error', summary: 'Error', detail: 'No resource found with the specified ID.' });
39
+ return;
40
+ }
41
+ if (this.urlPrefix !== undefined)
42
+ await this._router.navigate([this.urlPrefix, resource._links.self[0].href]);
43
+ else
44
+ await this._router.navigate(["..", resource._links.self[0].href], { relativeTo: this._route });
45
+ this.idNavigationForm.reset();
46
+ }
47
+ getClient() {
48
+ if (!this.apiName)
49
+ throw new Error('Cannot get a client, because the apiName is not set.');
50
+ return this._clients.getClient(this.apiName);
51
+ }
52
+ }
53
+ RestWorldIdNavigationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: RestWorldIdNavigationComponent, deps: [{ token: i1.RestWorldClientCollection }, { token: i2.MessageService }, { token: i3.Router }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
54
+ RestWorldIdNavigationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.3", type: RestWorldIdNavigationComponent, selector: "rw-id-navigation", inputs: { apiName: "apiName", rel: "rel", urlPrefix: "urlPrefix" }, ngImport: i0, template: "<form [formGroup]=\"idNavigationForm\" (ngSubmit)=\"navigateById()\" class=\"mr-3\">\n <div class=\"p-inputgroup\">\n <p-inputNumber formControlName=\"id\" placeholder=\"Navigate by ID\"></p-inputNumber>\n <button type=\"submit\" pButton pRipple icon=\"fa-solid fa-arrow-right\"></button>\n </div>\n</form>\n", styles: [""], dependencies: [{ kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "directive", type: i6.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "directive", type: i7.Ripple, selector: "[pRipple]" }] });
55
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: RestWorldIdNavigationComponent, decorators: [{
56
+ type: Component,
57
+ args: [{ selector: 'rw-id-navigation', template: "<form [formGroup]=\"idNavigationForm\" (ngSubmit)=\"navigateById()\" class=\"mr-3\">\n <div class=\"p-inputgroup\">\n <p-inputNumber formControlName=\"id\" placeholder=\"Navigate by ID\"></p-inputNumber>\n <button type=\"submit\" pButton pRipple icon=\"fa-solid fa-arrow-right\"></button>\n </div>\n</form>\n" }]
58
+ }], ctorParameters: function () { return [{ type: i1.RestWorldClientCollection }, { type: i2.MessageService }, { type: i3.Router }, { type: i3.ActivatedRoute }]; }, propDecorators: { apiName: [{
59
+ type: Input
60
+ }], rel: [{
61
+ type: Input
62
+ }], urlPrefix: [{
63
+ type: Input
64
+ }] } });
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdHdvcmxkLWlkLW5hdmlnYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJlc3R3b3JsZC1jbGllbnQvc3JjL2xpYi9jb21wb25lbnRzL3Jlc3R3b3JsZC1pZC1uYXZpZ2F0aW9uL3Jlc3R3b3JsZC1pZC1uYXZpZ2F0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZXN0d29ybGQtY2xpZW50L3NyYy9saWIvY29tcG9uZW50cy9yZXN0d29ybGQtaWQtbmF2aWdhdGlvbi9yZXN0d29ybGQtaWQtbmF2aWdhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7Ozs7OztBQVk5RCxNQUFNLE9BQU8sOEJBQThCO0lBcUJ6QyxZQUNtQixRQUFtQyxFQUNuQyxlQUErQixFQUMvQixPQUFlLEVBQ2YsTUFBc0I7UUFIdEIsYUFBUSxHQUFSLFFBQVEsQ0FBMkI7UUFDbkMsb0JBQWUsR0FBZixlQUFlLENBQWdCO1FBQy9CLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQVZsQyxxQkFBZ0IsR0FBRyxJQUFJLFNBQVMsQ0FFcEM7WUFDRCxFQUFFLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzVHLENBQUMsQ0FBQztJQU9ILENBQUM7SUFFTSxLQUFLLENBQUMsWUFBWTtRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7WUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLG1GQUFtRixDQUFDLENBQUM7UUFFdkcsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsMENBQTBDLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDcEcsT0FBTztTQUNSO1FBQ0QsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBRTdELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUU5QixJQUFJLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQVcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxTQUFTLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNoRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxjQUFjLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtZQUNwRixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsaURBQWlELEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDN0ksT0FBTztTQUNSO1FBRUQsSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNiLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSwwQ0FBMEMsRUFBRSxDQUFDLENBQUM7WUFDdEgsT0FBTztTQUNSO1FBRUQsSUFBRyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVM7WUFDN0IsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzs7WUFFNUUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQztRQUVoRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVPLFNBQVM7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFFMUUsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0MsQ0FBQzs7MkhBakVVLDhCQUE4QjsrR0FBOUIsOEJBQThCLDRIQ2QzQyw4VEFNQTsyRkRRYSw4QkFBOEI7a0JBTDFDLFNBQVM7K0JBQ0Usa0JBQWtCOytMQU9yQixPQUFPO3NCQURiLEtBQUs7Z0JBSUMsR0FBRztzQkFEVCxLQUFLO2dCQVFDLFNBQVM7c0JBRGYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBQcm9ibGVtRGV0YWlscyB9IGZyb20gJy4uLy4uL21vZGVscy9wcm9ibGVtLWRldGFpbHMnO1xuaW1wb3J0IHsgUmVzb3VyY2UgfSBmcm9tICdAd2VydHp1aS9uZ3gtaGFsLWNsaWVudCc7XG5pbXBvcnQgeyBSZXN0V29ybGRDbGllbnQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXN0d29ybGQtY2xpZW50JztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBSZXN0V29ybGRDbGllbnRDb2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVzdHdvcmxkLWNsaWVudC1jb2xsZWN0aW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnctaWQtbmF2aWdhdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXN0d29ybGQtaWQtbmF2aWdhdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Jlc3R3b3JsZC1pZC1uYXZpZ2F0aW9uLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBSZXN0V29ybGRJZE5hdmlnYXRpb25Db21wb25lbnQge1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhcGlOYW1lPzogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyByZWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgcHJlZml4IHRvIHVzZSBmb3IgdGhlIFVSTCB0aGF0IHNpIHJldHVybmVkIGZyb20gdGhlIGJhY2tlbmQuXG4gICAqIElmIG5vbmUgaXMgcHJvdmlkZWQsIGEgcmVsYXRpdmUgbmF2aWdhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCB3aGljaCBtZWFucyB0aGF0IHRoZSBsYXN0IHBhcnQgb2YgdGhlIGN1cnJlbnQgVVJMIGlzIHJlcGxhY2VkIHdpdGggdGhlIG9uZSBmcm9tIHRoZSBiYWNrZW5kLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHVybFByZWZpeD86IHN0cmluZztcblxuICBwdWJsaWMgaWROYXZpZ2F0aW9uRm9ybSA9IG5ldyBGb3JtR3JvdXA8e1xuICAgIGlkOiBGb3JtQ29udHJvbDxudW1iZXIgfCBudWxsPlxuICB9Pih7XG4gICAgaWQ6IG5ldyBGb3JtQ29udHJvbChudWxsLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMubWluKDEpLCBWYWxpZGF0b3JzLm1heChOdW1iZXIuTUFYX1NBRkVfSU5URUdFUildKSlcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2xpZW50czogUmVzdFdvcmxkQ2xpZW50Q29sbGVjdGlvbixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcm91dGU6IEFjdGl2YXRlZFJvdXRlKSB7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbmF2aWdhdGVCeUlkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5yZWwpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBcInJlbFwiIG11c3QgYmUgc2V0IHRocm91Z2ggdGhlIHVyaSBvZiB0aGlzIHBhZ2UgZm9yIHRoZSBJRCBuYXZpZ2F0aW9uIHRvIHdvcmsuJyk7XG5cbiAgICBpZiAoIXRoaXMuaWROYXZpZ2F0aW9uRm9ybS52YWxpZCkge1xuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuYWRkKHsgZGV0YWlsOiAnWW91IG11c3QgZW50ZXIgYSB2YWxpZCBJRCB0byBuYXZpYWdlIHRvLicsIHNldmVyaXR5OiAnZXJyb3InIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaWRUb05hdmlnYXRlVG8gPSB0aGlzLmlkTmF2aWdhdGlvbkZvcm0uY29udHJvbHMuaWQudmFsdWU7XG5cbiAgICB2YXIgY2xpZW50ID0gdGhpcy5nZXRDbGllbnQoKTtcblxuICAgIHZhciByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXRMaXN0PFJlc291cmNlPih0aGlzLnJlbCwgeyAkZmlsdGVyOiBgaWQgZXEgJHtpZFRvTmF2aWdhdGVUb31gIH0pO1xuICAgIGlmICghcmVzcG9uc2Uub2sgfHwgUHJvYmxlbURldGFpbHMuaXNQcm9ibGVtRGV0YWlscyhyZXNwb25zZS5ib2R5KSB8fCAhcmVzcG9uc2UuYm9keSkge1xuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdFcnJvcicsIGRldGFpbDogJ0Vycm9yIHdoaWxlIGxvYWRpbmcgdGhlIHJlc291cmNlcyBmcm9tIHRoZSBBUEkuJywgZGF0YTogcmVzcG9uc2UgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHJlc291cmNlID0gcmVzcG9uc2UuYm9keT8uX2VtYmVkZGVkPy5pdGVtcz8uWzBdO1xuICAgIGlmICghcmVzb3VyY2UpIHtcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnRXJyb3InLCBkZXRhaWw6ICdObyByZXNvdXJjZSBmb3VuZCB3aXRoIHRoZSBzcGVjaWZpZWQgSUQuJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZih0aGlzLnVybFByZWZpeCAhPT0gdW5kZWZpbmVkKVxuICAgICAgYXdhaXQgdGhpcy5fcm91dGVyLm5hdmlnYXRlKFt0aGlzLnVybFByZWZpeCwgcmVzb3VyY2UuX2xpbmtzLnNlbGZbMF0uaHJlZl0pO1xuICAgIGVsc2VcbiAgICAgIGF3YWl0IHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbXCIuLlwiLCByZXNvdXJjZS5fbGlua3Muc2VsZlswXS5ocmVmXSwgeyByZWxhdGl2ZVRvOiB0aGlzLl9yb3V0ZX0pO1xuXG4gICAgdGhpcy5pZE5hdmlnYXRpb25Gb3JtLnJlc2V0KCk7XG4gIH1cblxuICBwcml2YXRlIGdldENsaWVudCgpOiBSZXN0V29ybGRDbGllbnQge1xuICAgIGlmICghdGhpcy5hcGlOYW1lKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ2V0IGEgY2xpZW50LCBiZWNhdXNlIHRoZSBhcGlOYW1lIGlzIG5vdCBzZXQuJyk7XG5cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50cy5nZXRDbGllbnQodGhpcy5hcGlOYW1lKTtcbiAgfVxufVxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJpZE5hdmlnYXRpb25Gb3JtXCIgKG5nU3VibWl0KT1cIm5hdmlnYXRlQnlJZCgpXCIgY2xhc3M9XCJtci0zXCI+XG4gIDxkaXYgY2xhc3M9XCJwLWlucHV0Z3JvdXBcIj5cbiAgICA8cC1pbnB1dE51bWJlciBmb3JtQ29udHJvbE5hbWU9XCJpZFwiIHBsYWNlaG9sZGVyPVwiTmF2aWdhdGUgYnkgSURcIj48L3AtaW5wdXROdW1iZXI+XG4gICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgcEJ1dHRvbiBwUmlwcGxlIGljb249XCJmYS1zb2xpZCBmYS1hcnJvdy1yaWdodFwiPjwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZm9ybT5cbiJdfQ==