@huntsman-cancer-institute/crud 17.7.5 → 17.8.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.
@@ -237,7 +237,7 @@ export class CrudComponent {
237
237
  <i class="fas fa-times fa-lg"></i>
238
238
  </button>
239
239
  </form>
240
- `, isInline: true, styles: [".crud-input{width:100%}.crud-input:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.crud-input:last-child{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.ng-invalid{background-color:#ff646440}.phi{box-shadow:#c70 1px 1px 1px inset;border-color:orange}::ng-deep .hci-dropdown{min-width:20%}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "popoverContext", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: i5.NativeSelectComponent, selector: "hci-native-select", inputs: ["class", "name", "label", "url", "entries", "required", "idKey", "displayKey", "disabled", "sortKey", "sortNumeric", "filterKey", "filter"] }, { kind: "component", type: i6.BusyComponent, selector: "hci-busy", inputs: ["busy", "busySubjects", "getBusySubjects", "parentSelector", "rootClass", "icon", "iconSize", "showIcon", "mxAuto", "myAuto", "text", "template", "config"] }] }); }
240
+ `, isInline: true, styles: [".crud-input{width:100%}.crud-input:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.crud-input:last-child{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.ng-invalid{background-color:#ff646440}.phi{box-shadow:#c70 1px 1px 1px inset;border-color:orange}::ng-deep .hci-dropdown{min-width:20%}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "popoverContext", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: i5.NativeSelectComponent, selector: "hci-native-select", inputs: ["class", "name", "label", "url", "entries", "required", "idKey", "displayKey", "disabled", "sortKey", "sortNumeric", "filterKey", "id", "filter"] }, { kind: "component", type: i6.BusyComponent, selector: "hci-busy", inputs: ["busy", "busySubjects", "getBusySubjects", "parentSelector", "rootClass", "icon", "iconSize", "showIcon", "mxAuto", "myAuto", "text", "template", "config"] }] }); }
241
241
  }
242
242
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CrudComponent, decorators: [{
243
243
  type: Component,
@@ -478,7 +478,7 @@ class CrudComponent {
478
478
  <i class="fas fa-times fa-lg"></i>
479
479
  </button>
480
480
  </form>
481
- `, isInline: true, styles: [".crud-input{width:100%}.crud-input:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.crud-input:last-child{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.ng-invalid{background-color:#ff646440}.phi{box-shadow:#c70 1px 1px 1px inset;border-color:orange}::ng-deep .hci-dropdown{min-width:20%}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "popoverContext", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: i5.NativeSelectComponent, selector: "hci-native-select", inputs: ["class", "name", "label", "url", "entries", "required", "idKey", "displayKey", "disabled", "sortKey", "sortNumeric", "filterKey", "filter"] }, { kind: "component", type: i6.BusyComponent, selector: "hci-busy", inputs: ["busy", "busySubjects", "getBusySubjects", "parentSelector", "rootClass", "icon", "iconSize", "showIcon", "mxAuto", "myAuto", "text", "template", "config"] }] }); }
481
+ `, isInline: true, styles: [".crud-input{width:100%}.crud-input:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.crud-input:last-child{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.ng-invalid{background-color:#ff646440}.phi{box-shadow:#c70 1px 1px 1px inset;border-color:orange}::ng-deep .hci-dropdown{min-width:20%}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "popoverContext", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: i5.NativeSelectComponent, selector: "hci-native-select", inputs: ["class", "name", "label", "url", "entries", "required", "idKey", "displayKey", "disabled", "sortKey", "sortNumeric", "filterKey", "id", "filter"] }, { kind: "component", type: i6.BusyComponent, selector: "hci-busy", inputs: ["busy", "busySubjects", "getBusySubjects", "parentSelector", "rootClass", "icon", "iconSize", "showIcon", "mxAuto", "myAuto", "text", "template", "config"] }] }); }
482
482
  }
483
483
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CrudComponent, decorators: [{
484
484
  type: Component,
@@ -1 +1 @@
1
- {"version":3,"file":"huntsman-cancer-institute-crud.mjs","sources":["../../../projects/crud/src/services/crud.service.ts","../../../projects/crud/src/components/crud.component.ts","../../../projects/crud/src/pipes/field-viewable.pipe.ts","../../../projects/crud/src/components/crud-container.component.ts","../../../projects/crud/src/crud.module.ts","../../../projects/crud/src/huntsman-cancer-institute-crud.ts"],"sourcesContent":["import {Inject, Injectable, InjectionToken} from \"@angular/core\";\r\nimport {HttpClient, HttpParams, HttpResponse} from \"@angular/common/http\";\r\n\r\nimport {BehaviorSubject, Observable, of} from \"rxjs\";\r\nimport {finalize} from \"rxjs/operators\";\r\n\r\nimport {HciDataDto, HciGridDto, HciPostWrapperDto} from \"@huntsman-cancer-institute/hci-ng-grid-dto\";\r\n\r\nexport let CRUD_ENDPOINT = new InjectionToken<string>(\"crudEndpoint\");\r\n\r\n/**\r\n * This service manages communication with the crud api.\r\n * The typical api endpoint would be \"/app-name/api/crud\".\r\n *\r\n * TODO: A call that would return the response as well as the data.\r\n */\r\n@Injectable()\r\nexport class CrudService {\r\n\r\n metadataMap: Map<string, Object> = new Map<string, Object>();\r\n\r\n constructor(private http: HttpClient, @Inject(CRUD_ENDPOINT) private crudEndpoint: string) {}\r\n\r\n public getMetadata(className: string): Observable<Object> {\r\n if (this.metadataMap.get(className)) {\r\n return of(this.metadataMap.get(className));\r\n }\r\n\r\n let o: Observable<Object> = this.http.get<Object>(this.crudEndpoint + className + \"/metadata\");\r\n o.subscribe((metadata: any) => {\r\n this.metadataMap.set(className, metadata);\r\n });\r\n return o;\r\n }\r\n\r\n /**\r\n * Makes the http request and returns an observable for it.\r\n *\r\n * @param {string} className\r\n * @param {HciPostWrapperDto} dto\r\n * @param {string} query\r\n * @returns {Observable<HciDataDto>}\r\n */\r\n public getAll(className: string, dto: HciPostWrapperDto = undefined, query: string = undefined): Observable<HciDataDto> {\r\n let params: HttpParams = new HttpParams();\r\n if (query) {\r\n params = params.set(\"query\", query);\r\n }\r\n\r\n if (dto) {\r\n return this.http.post<HciDataDto>(this.crudEndpoint + className + \"/info\", dto, {params: params});\r\n } else {\r\n return this.http.get<HciDataDto>(this.crudEndpoint + className, {params: params});\r\n }\r\n }\r\n\r\n /**\r\n * Return a loading subject and require a callback to deal with setting data when the response comes back.\r\n *\r\n * @param {string} className The name of the entity or DTO.\r\n * @param {HciPostWrapperDto} dto Default to undefined.\r\n * @param {string} query Default to undefined.\r\n * @param {(data: HciDataDto) => any} onResponse Only required function.\r\n * @param {(error) => any} onError Optional\r\n * @param {() => any} onFinalize Optional\r\n * @returns {BehaviorSubject<boolean>}\r\n */\r\n public getAllLoading(className: string,\r\n dto: HciPostWrapperDto = undefined,\r\n query: string = undefined,\r\n onResponse: (data: HciDataDto) => any,\r\n onError?: (error) => any,\r\n onFinalize?: () => any): BehaviorSubject<boolean> {\r\n let loading: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);\r\n\r\n let params: HttpParams = new HttpParams();\r\n if (query) {\r\n params = params.set(\"query\", query);\r\n }\r\n\r\n if (dto) {\r\n this.http.post<HciDataDto>(this.crudEndpoint + className + \"/info\", dto, {params: params})\r\n .pipe(finalize(() => {\r\n if (onFinalize) {\r\n onFinalize();\r\n }\r\n }))\r\n .subscribe((data: HciDataDto) => {\r\n loading.next(false);\r\n onResponse(data);\r\n },\r\n (error) => {\r\n if (onError) {\r\n onError(error);\r\n }\r\n });\r\n } else {\r\n this.http.get<HciDataDto>(this.crudEndpoint + className, {params: params})\r\n .pipe(finalize(() => {\r\n if (onFinalize) {\r\n onFinalize();\r\n }\r\n }))\r\n .subscribe((data: HciDataDto) => {\r\n loading.next(false);\r\n onResponse(data);\r\n },\r\n (error) => {\r\n if (onError) {\r\n onError(error);\r\n }\r\n });\r\n }\r\n\r\n return loading;\r\n }\r\n\r\n /**\r\n * Get a single instance of an entity based on the id.\r\n *\r\n * @param {string} className\r\n * @param {number} id\r\n * @returns {Observable<Object>}\r\n */\r\n public get(className: string, id: number): Observable<Object> {\r\n return this.http.get<Object>(this.crudEndpoint + className + \"/\" + id);\r\n }\r\n\r\n /**\r\n * Return the loading subject for the request. Callback required to get the entity response.\r\n *\r\n * @param {string} className\r\n * @param {number} id\r\n * @param {(data: Object) => any} onResponse\r\n * @param {(error) => any} onError\r\n * @param {() => any} onFinalize\r\n * @returns {BehaviorSubject<boolean>}\r\n */\r\n public getLoading(className: string,\r\n id: number,\r\n onResponse: (data: Object) => any,\r\n onError?: (error) => any,\r\n onFinalize?: () => any): BehaviorSubject<boolean> {\r\n let loading: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);\r\n\r\n this.http.get<Object>(this.crudEndpoint + className + \"/\" + id).subscribe((data: Object) => {\r\n loading.next(false);\r\n onResponse(data);\r\n },\r\n (error) => {\r\n onError(error);\r\n },\r\n () => {\r\n onFinalize();\r\n });\r\n\r\n return loading;\r\n }\r\n\r\n /**\r\n * Post a new entity. One without an id. Return that entity.\r\n *\r\n * @param {string} className\r\n * @param data\r\n * @returns {Observable<Object>}\r\n */\r\n public post(className: string, data: any): Observable<Object> {\r\n return this.http.post<Object>(this.crudEndpoint + className, data);\r\n }\r\n\r\n /**\r\n * Return a loading subject. Post a new entity without an id. Use the callback to get the entity response.\r\n *\r\n * @param {string} className\r\n * @param data\r\n * @param {(data: Object) => any} onResponse\r\n * @param {(error) => any} onError\r\n * @param {() => any} onFinalize\r\n * @returns {BehaviorSubject<boolean>}\r\n */\r\n public postLoading(className: string,\r\n data: any,\r\n onResponse: (data: Object) => any,\r\n onError?: (error) => any,\r\n onFinalize?: () => any): BehaviorSubject<boolean> {\r\n let loading: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);\r\n\r\n this.http.post<Object>(this.crudEndpoint + className, data).subscribe((data: Object) => {\r\n loading.next(false);\r\n onResponse(data);\r\n },\r\n (error) => {\r\n onError(error);\r\n },\r\n () => {\r\n onFinalize();\r\n });\r\n\r\n return loading;\r\n }\r\n\r\n /**\r\n * Put an existing entity with an id. Return the updated entity.\r\n *\r\n * @param {string} className\r\n * @param {number} id\r\n * @param data\r\n * @returns {Observable<Object>}\r\n */\r\n public put(className: string, id: number, data: any): Observable<Object> {\r\n return this.http.put<Object>(this.crudEndpoint + className + \"/\" + id, data);\r\n }\r\n\r\n /**\r\n * Return the loading subject. Put an existing entity with an id. In the callback return the updated entity.\r\n *\r\n * @param {string} className\r\n * @param {number} id\r\n * @param data\r\n * @param {(data: Object) => any} onResponse\r\n * @param {(error) => any} onError\r\n * @param {() => any} onFinalize\r\n * @returns {BehaviorSubject<boolean>}\r\n */\r\n public putLoading(className: string,\r\n id: number, data: any,\r\n onResponse: (data: Object) => any,\r\n onError?: (error) => any,\r\n onFinalize?: () => any): BehaviorSubject<boolean> {\r\n let loading: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);\r\n\r\n this.http.put<Object>(this.crudEndpoint + className + \"/\" + id, data).subscribe((data: Object) => {\r\n loading.next(false);\r\n onResponse(data);\r\n },\r\n (error) => {\r\n onError(error);\r\n },\r\n () => {\r\n onFinalize();\r\n });\r\n\r\n return loading;\r\n }\r\n\r\n /**\r\n * Delete the entity by its id, return the response with no body.\r\n *\r\n * @param {string} className\r\n * @param {number} id\r\n * @returns {Observable<Object>}\r\n */\r\n public delete(className: string, id: number): Observable<HttpResponse<any>> {\r\n return this.http.delete<Object>(this.crudEndpoint + className + \"/\" + id, { observe: \"response\" });\r\n }\r\n\r\n /**\r\n * Return the loading subject. Delete the entity by id, use the callback to get the response with no body.\r\n *\r\n * @param {string} className\r\n * @param {number} id\r\n * @param {(data: Object) => any} onResponse\r\n * @param {(error) => any} onError\r\n * @param {() => any} onFinalize\r\n * @returns {BehaviorSubject<boolean>}\r\n */\r\n public deleteLoading(className: string,\r\n id: number,\r\n onResponse: (response: HttpResponse<any>) => any,\r\n onError?: (error) => any,\r\n onFinalize?: () => any): BehaviorSubject<boolean> {\r\n let loading: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);\r\n\r\n this.http.delete<Object>(this.crudEndpoint + className + \"/\" + id, { observe: \"response\" }).subscribe((response: HttpResponse<any>) => {\r\n loading.next(false);\r\n onResponse(response);\r\n },\r\n (error) => {\r\n onError(error);\r\n },\r\n () => {\r\n onFinalize();\r\n });\r\n\r\n return loading;\r\n }\r\n}\r\n","import {\r\n AfterViewInit, ChangeDetectorRef, Component, HostBinding, Input, isDevMode,\r\n ViewChild, OnDestroy\r\n} from \"@angular/core\";\r\nimport {NgForm} from \"@angular/forms\";\r\n\r\nimport { Observable, Subscription } from \"rxjs\";\r\nimport {finalize} from \"rxjs/operators\";\r\n\r\nimport {CrudService} from \"../services/crud.service\";\r\n\r\n/**\r\n * This is a generic component that is designed to work with the crud api. The component builds itself based on the\r\n * metadata. This component could be independent so it has its own form and can interact with the crud api on its own.\r\n *\r\n * \"id\": false,\r\n * \"field\": \"idNameType\",\r\n * \"type\": \"Long\",\r\n * \"notNull\": true,\r\n * \"min\": null,\r\n * \"max\": null,\r\n * \"dictionaryClassName\": \"hci.ri.core.subject.model.NameType\",\r\n * \"phi\": false\r\n *\r\n * @since 10.0.0\r\n */\r\n@Component({\r\n selector: \"hci-crud\",\r\n template: `\r\n <form #crudForm=\"ngForm\"\r\n class=\"d-flex flex-nowrap flex-row flex-grow-1\">\r\n <div class=\"d-flex flex-nowrap flex-column flex-grow-1\">\r\n <hci-busy [busy]=\"[busy]\" [showIcon]=\"false\"></hci-busy>\r\n <ng-container *ngFor=\"let fieldArray of fields\">\r\n <div class=\"d-flex flex-nowrap mb-1\">\r\n <ng-container *ngFor=\"let field of fieldArray\">\r\n <input *ngIf=\"field.metadata.type === 'String'\" attr.aria-label=\"hci-ng-crud-input-string-{{field.metadata.field}}\"\r\n [(ngModel)]=\"field.data\"\r\n type=\"text\"\r\n [id]=\"field.metadata.field\"\r\n [name]=\"field.metadata.field\"\r\n [disabled]=\"!editable\"\r\n [placeholder]=\"field.metadata.field\"\r\n [minLength]=\"field.metadata.min\"\r\n [maxLength]=\"field.metadata.max\"\r\n [required]=\"field.metadata.notNull\"\r\n class=\"crud-input\"\r\n [ngStyle]=\"field.styles\"\r\n [class.phi]=\"field.metadata.phi\" />\r\n <input *ngIf=\"!field.metadata.dictionaryClassName && (field.metadata.type === 'Integer' || field.metadata.type === 'Long')\"\r\n [(ngModel)]=\"field.data\" attr.aria-label=\"hci-ng-crud-input-number-{{field.metadata.field}}\"\r\n type=\"number\"\r\n [id]=\"field.metadata.field\"\r\n [name]=\"field.metadata.field\"\r\n [disabled]=\"!editable\"\r\n [placeholder]=\"field.metadata.field\"\r\n [minLength]=\"field.metadata.min\"\r\n [maxLength]=\"field.metadata.max\"\r\n [required]=\"field.metadata.notNull\"\r\n class=\"crud-input\"\r\n [ngStyle]=\"field.styles\"\r\n [class.phi]=\"field.metadata.phi\" />\r\n <hci-native-select *ngIf=\"field.metadata.dictionaryClassName\"\r\n [(ngModel)]=\"field.data\"\r\n [id]=\"field.metadata.field\"\r\n [name]=\"field.metadata.field\"\r\n [url]=\"field.metadata.dictionaryClassName\"\r\n [required]=\"field.metadata.required\"\r\n class=\"crud-input\"\r\n [ngStyle]=\"field.styles\">\r\n </hci-native-select>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <button *ngIf=\"saveable && !crudForm.form.dirty\"\r\n (click)=\"save()\"\r\n class=\"btn btn-icon ms-1\"\r\n [disabled]=\"true\">\r\n <i class=\"far fa-circle fa-lg\"></i>\r\n </button>\r\n <button *ngIf=\"saveable && crudForm.form.dirty && crudForm.form.valid && !warning\"\r\n (click)=\"save()\"\r\n class=\"btn btn-icon btn-green ms-1\">\r\n <span *ngIf=\"!busy\">\r\n <i class=\"fas fa-check fa-lg\"></i>\r\n </span>\r\n <span *ngIf=\"busy\">\r\n <i class=\"fas fa-spinner fa-lg fa-spin\"></i>\r\n </span>\r\n </button>\r\n <button *ngIf=\"saveable && warning\"\r\n [ngbPopover]=\"warning\"\r\n triggers=\"mouseenter:mouseleave\"\r\n popoverClass=\"warn\"\r\n (click)=\"save()\"\r\n class=\"btn btn-icon btn-red ms-1\">\r\n <i class=\"fas fa-exclamation-circle fa-lg\"></i>\r\n </button>\r\n <button *ngIf=\"saveable && crudForm.form.dirty && !crudForm.form.valid && !warning\"\r\n [disabled]=\"true\">\r\n class=\"btn btn-icon btn-red ms-1\">\r\n <i class=\"fas fa-times fa-lg\"></i>\r\n </button>\r\n </form>\r\n `,\r\n styles: [`\r\n\r\n .crud-input {\r\n width: 100%;\r\n }\r\n\r\n .crud-input:first-child {\r\n border-top-left-radius: 0.25rem;\r\n border-bottom-left-radius: 0.25rem;\r\n }\r\n\r\n .crud-input:last-child {\r\n border-top-right-radius: 0.25rem;\r\n border-bottom-right-radius: 0.25rem;\r\n }\r\n\r\n .ng-invalid {\r\n background-color: rgba(255, 100, 100, 0.25);\r\n }\r\n\r\n .phi {\r\n box-shadow: #cc7700 1px 1px 1px inset;\r\n border-color: orange;\r\n }\r\n\r\n ::ng-deep .hci-dropdown {\r\n min-width: 20%;\r\n }\r\n\r\n `]\r\n})\r\nexport class CrudComponent implements AfterViewInit, OnDestroy {\r\n\r\n @HostBinding(\"class\") classList: string = \"d-flex flex-nowrap\";\r\n\r\n @Input() saveable: boolean = true;\r\n @Input() editable: boolean = true;\r\n @Input() className: string;\r\n @Input(\"fields\") displayFields: string[] = [];\r\n @Input() ids: any[];\r\n @Input() data: any = {};\r\n @Input() styles: any[];\r\n\r\n @ViewChild(\"crudForm\", {static: true}) form: NgForm;\r\n\r\n id: string;\r\n metadata: any = {};\r\n fields: any[];\r\n busy: boolean = false;\r\n warning: string;\r\n\r\n metadataSubscription: Subscription;\r\n\r\n constructor(private crudService: CrudService,\r\n private changeDetectorRef: ChangeDetectorRef) {}\r\n\r\n ngAfterViewInit(): void {\r\n this.metadataSubscription = this.crudService.getMetadata(this.className).subscribe((metadata: any) => {\r\n this.fields = [];\r\n\r\n for (let displayFieldArray of this.displayFields) {\r\n let fieldArray: any[] = [];\r\n\r\n for (let displayField of displayFieldArray) {\r\n for (let metadataField of metadata.fields) {\r\n if (displayField === metadataField.field) {\r\n let field: any = {\r\n data: undefined,\r\n metadata: metadataField,\r\n styles: undefined\r\n };\r\n\r\n if (this.styles) {\r\n for (let fieldStyle of this.styles) {\r\n if (displayField === fieldStyle.field) {\r\n field.styles = fieldStyle.styles;\r\n }\r\n }\r\n }\r\n\r\n fieldArray.push(field);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n this.fields.push(fieldArray);\r\n }\r\n\r\n for (let metadataField of metadata.fields) {\r\n if (metadataField.id) {\r\n this.id = metadataField.field;\r\n break;\r\n }\r\n }\r\n\r\n this.metadata = metadata;\r\n\r\n this.refreshData();\r\n this.changeDetectorRef.detectChanges();\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.metadataSubscription.unsubscribe();\r\n }\r\n\r\n /**\r\n * Push the data from the bound inputs to the data representing this crud class.\r\n */\r\n createData(): void {\r\n if (!this.data) {\r\n this.data = {};\r\n }\r\n\r\n if (this.ids) {\r\n for (let id of this.ids) {\r\n this.data[id.key] = id.value;\r\n }\r\n }\r\n\r\n for (let fieldArray of this.fields) {\r\n for (let field of fieldArray) {\r\n this.data[field.metadata.field] = field.data;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * If data exists, set it and refresh the bound data.\r\n *\r\n * @param data\r\n */\r\n setData(data: any): void {\r\n if (isDevMode()) {\r\n console.debug(\"CrudComponent.setData: \" + this.className);\r\n console.debug(data);\r\n }\r\n\r\n if (data !== undefined) {\r\n this.data = data;\r\n this.refreshData();\r\n } else {\r\n this.data = {};\r\n }\r\n }\r\n\r\n /**\r\n * Pushes the data to the fields for binding to the form inputs.\r\n */\r\n refreshData(): void {\r\n if (this.data && this.fields) {\r\n for (let fieldArray of this.fields) {\r\n for (let field of fieldArray) {\r\n field.data = this.data[field.metadata.field];\r\n }\r\n }\r\n\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n }\r\n\r\n /**\r\n * Gets a save request and refreshes the data upon a successful call.\r\n */\r\n save(): void {\r\n this.busy = true;\r\n this.warning = undefined;\r\n\r\n this.getSaveRequest()\r\n .pipe(finalize(() => {\r\n this.busy = false;\r\n }))\r\n .subscribe((data: Object) => {\r\n this.setData(data);\r\n this.form.form.markAsPristine();\r\n },\r\n (error) => {\r\n this.warning = error;\r\n console.error(\"CrudComponent.save: \" + this.className + \": \" + error);\r\n });\r\n }\r\n\r\n /**\r\n * Return an observable from the crud post or put. This is used such that the crud container can manage the request\r\n * for this component.\r\n *\r\n * @returns {Observable<Object>}\r\n */\r\n getSaveRequest(): Observable<Object> {\r\n this.createData();\r\n\r\n if (this.data[this.id]) {\r\n return this.crudService.put(this.className, this.data[this.id], this.data);\r\n } else {\r\n return this.crudService.post(this.className, this.data);\r\n }\r\n }\r\n}\r\n","import {Pipe} from \"@angular/core\";\r\n\r\n@Pipe({\r\n name: \"fieldViewable\",\r\n pure: true\r\n})\r\nexport class FieldViewablePipe {\r\n\r\n transform(list: any[]): any {\r\n return list.filter((item: any) => {\r\n return item.viewable;\r\n });\r\n }\r\n}\r\n","import {ChangeDetectorRef, Component, HostBinding, Input, isDevMode, QueryList, ViewChildren} from \"@angular/core\";\r\n\r\nimport {CrudService} from \"../services/crud.service\";\r\nimport {CrudComponent} from \"./crud.component\";\r\nimport {Observable} from \"rxjs/Observable\";\r\nimport {forkJoin} from \"rxjs/Observable/forkJoin\";\r\n\r\n/**\r\n * This is a generic component that is designed to work with the crud api. The component builds itself based on the\r\n * metadata. It ties together multiple crud components. For example, Subject or StudySubject may have names, phone\r\n * numbers, or addresses associated with it. Each one corresponding to its own CRUD rest endpoint.\r\n *\r\n * @since 10.0.0\r\n */\r\n@Component({\r\n selector: \"hci-crud-container\",\r\n template: `\r\n <ng-container *ngFor=\"let crudGroup of crudGroups\" class=\"crud-group\">\r\n <div *ngIf=\"crudGroup.mode === 'singular'\"\r\n class=\"d-flex crud-group p-2\">\r\n <h4 style=\"flex: 0 0 15%;\">{{crudGroup.display}}</h4>\r\n <hci-crud [className]=\"crudGroup.className\"\r\n [fields]=\"crudGroup.displayFields\"\r\n [styles]=\"crudGroup.styles\"\r\n [ids]=\"ids\"\r\n [data]=\"crudGroup.data\"\r\n [saveable]=\"saveable\"\r\n style=\"flex: 1 1 85%;\"></hci-crud>\r\n </div>\r\n </ng-container>\r\n `,\r\n styles: [`\r\n \r\n .crud-group {\r\n background-color: #cfecfc;\r\n margin-bottom: 1rem;\r\n border-radius: 0.5rem;\r\n border: #3d7a99 1px solid;\r\n }\r\n \r\n `]\r\n})\r\nexport class CrudContainerComponent {\r\n\r\n @HostBinding(\"class\") classList: string = \"d-flex flex-column\";\r\n\r\n @Input() data: any;\r\n @Input() saveable: boolean = true;\r\n @Input() crudGroups: any[];\r\n @Input() ids: any[];\r\n\r\n @ViewChildren(CrudComponent) crudComponents: QueryList<CrudComponent>;\r\n\r\n constructor(private crudService: CrudService,\r\n private changeDetectorRef: ChangeDetectorRef) {}\r\n\r\n setData(data: any): void {\r\n if (isDevMode()) {\r\n console.debug(\"CrudContainerComponent.setData\");\r\n console.debug(data);\r\n }\r\n\r\n this.data = data;\r\n\r\n this.crudComponents.forEach((crud: CrudComponent) => {\r\n for (let crudGroup of this.crudGroups) {\r\n if (crudGroup.className === crud.className && crudGroup.dataField) {\r\n crud.setData(this.data[crudGroup.dataField]);\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n\r\n save(): void {\r\n this.crudComponents.forEach((crud: CrudComponent) => {\r\n crud.save();\r\n });\r\n }\r\n\r\n saveJoin(): Observable<any> {\r\n let requests: Observable<any>[] = [];\r\n\r\n this.crudComponents.forEach((crud: CrudComponent) => {\r\n requests.push(crud.getSaveRequest());\r\n });\r\n\r\n return forkJoin(requests);\r\n }\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {ModuleWithProviders, NgModule} from \"@angular/core\";\r\nimport {CommonModule} from \"@angular/common\";\r\nimport {FormsModule} from \"@angular/forms\";\r\n\r\nimport {NgbModule} from \"@ng-bootstrap/ng-bootstrap\";\r\n\r\nimport {SelectModule} from \"@huntsman-cancer-institute/input\";\r\nimport {MiscModule} from \"@huntsman-cancer-institute/misc\";\r\n\r\nimport {CRUD_ENDPOINT, CrudService} from \"./services/crud.service\";\r\nimport {CrudComponent} from \"./components/crud.component\";\r\nimport {FieldViewablePipe} from \"./pipes/field-viewable.pipe\";\r\nimport {CrudContainerComponent} from \"./components/crud-container.component\";\r\n\r\n/**\r\n * The module providing the crud service.\r\n *\r\n * @since 9.0.0\r\n */\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n NgbModule,\r\n SelectModule,\r\n MiscModule\r\n ],\r\n declarations: [\r\n CrudContainerComponent,\r\n CrudComponent,\r\n FieldViewablePipe\r\n ],\r\n exports: [\r\n CrudContainerComponent,\r\n CrudComponent,\r\n FieldViewablePipe\r\n ]\r\n})\r\nexport class CrudModule {\r\n static forRoot(config: any): ModuleWithProviders<CrudModule> {\r\n return {\r\n providers: [\r\n {provide: CRUD_ENDPOINT, useValue: config.crudEndpoint},\r\n CrudService\r\n ],\r\n ngModule: CrudModule\r\n };\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.CrudService","i3.CrudComponent"],"mappings":"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"}
1
+ {"version":3,"file":"huntsman-cancer-institute-crud.mjs","sources":["../../../projects/crud/src/services/crud.service.ts","../../../projects/crud/src/components/crud.component.ts","../../../projects/crud/src/pipes/field-viewable.pipe.ts","../../../projects/crud/src/components/crud-container.component.ts","../../../projects/crud/src/crud.module.ts","../../../projects/crud/src/huntsman-cancer-institute-crud.ts"],"sourcesContent":["import {Inject, Injectable, InjectionToken} from \"@angular/core\";\r\nimport {HttpClient, HttpParams, HttpResponse} from \"@angular/common/http\";\r\n\r\nimport {BehaviorSubject, Observable, of} from \"rxjs\";\r\nimport {finalize} from \"rxjs/operators\";\r\n\r\nimport {HciDataDto, HciGridDto, HciPostWrapperDto} from \"@huntsman-cancer-institute/hci-ng-grid-dto\";\r\n\r\nexport let CRUD_ENDPOINT = new InjectionToken<string>(\"crudEndpoint\");\r\n\r\n/**\r\n * This service manages communication with the crud api.\r\n * The typical api endpoint would be \"/app-name/api/crud\".\r\n *\r\n * TODO: A call that would return the response as well as the data.\r\n */\r\n@Injectable()\r\nexport class CrudService {\r\n\r\n metadataMap: Map<string, Object> = new Map<string, Object>();\r\n\r\n constructor(private http: HttpClient, @Inject(CRUD_ENDPOINT) private crudEndpoint: string) {}\r\n\r\n public getMetadata(className: string): Observable<Object> {\r\n if (this.metadataMap.get(className)) {\r\n return of(this.metadataMap.get(className));\r\n }\r\n\r\n let o: Observable<Object> = this.http.get<Object>(this.crudEndpoint + className + \"/metadata\");\r\n o.subscribe((metadata: any) => {\r\n this.metadataMap.set(className, metadata);\r\n });\r\n return o;\r\n }\r\n\r\n /**\r\n * Makes the http request and returns an observable for it.\r\n *\r\n * @param {string} className\r\n * @param {HciPostWrapperDto} dto\r\n * @param {string} query\r\n * @returns {Observable<HciDataDto>}\r\n */\r\n public getAll(className: string, dto: HciPostWrapperDto = undefined, query: string = undefined): Observable<HciDataDto> {\r\n let params: HttpParams = new HttpParams();\r\n if (query) {\r\n params = params.set(\"query\", query);\r\n }\r\n\r\n if (dto) {\r\n return this.http.post<HciDataDto>(this.crudEndpoint + className + \"/info\", dto, {params: params});\r\n } else {\r\n return this.http.get<HciDataDto>(this.crudEndpoint + className, {params: params});\r\n }\r\n }\r\n\r\n /**\r\n * Return a loading subject and require a callback to deal with setting data when the response comes back.\r\n *\r\n * @param {string} className The name of the entity or DTO.\r\n * @param {HciPostWrapperDto} dto Default to undefined.\r\n * @param {string} query Default to undefined.\r\n * @param {(data: HciDataDto) => any} onResponse Only required function.\r\n * @param {(error) => any} onError Optional\r\n * @param {() => any} onFinalize Optional\r\n * @returns {BehaviorSubject<boolean>}\r\n */\r\n public getAllLoading(className: string,\r\n dto: HciPostWrapperDto = undefined,\r\n query: string = undefined,\r\n onResponse: (data: HciDataDto) => any,\r\n onError?: (error) => any,\r\n onFinalize?: () => any): BehaviorSubject<boolean> {\r\n let loading: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);\r\n\r\n let params: HttpParams = new HttpParams();\r\n if (query) {\r\n params = params.set(\"query\", query);\r\n }\r\n\r\n if (dto) {\r\n this.http.post<HciDataDto>(this.crudEndpoint + className + \"/info\", dto, {params: params})\r\n .pipe(finalize(() => {\r\n if (onFinalize) {\r\n onFinalize();\r\n }\r\n }))\r\n .subscribe((data: HciDataDto) => {\r\n loading.next(false);\r\n onResponse(data);\r\n },\r\n (error) => {\r\n if (onError) {\r\n onError(error);\r\n }\r\n });\r\n } else {\r\n this.http.get<HciDataDto>(this.crudEndpoint + className, {params: params})\r\n .pipe(finalize(() => {\r\n if (onFinalize) {\r\n onFinalize();\r\n }\r\n }))\r\n .subscribe((data: HciDataDto) => {\r\n loading.next(false);\r\n onResponse(data);\r\n },\r\n (error) => {\r\n if (onError) {\r\n onError(error);\r\n }\r\n });\r\n }\r\n\r\n return loading;\r\n }\r\n\r\n /**\r\n * Get a single instance of an entity based on the id.\r\n *\r\n * @param {string} className\r\n * @param {number} id\r\n * @returns {Observable<Object>}\r\n */\r\n public get(className: string, id: number): Observable<Object> {\r\n return this.http.get<Object>(this.crudEndpoint + className + \"/\" + id);\r\n }\r\n\r\n /**\r\n * Return the loading subject for the request. Callback required to get the entity response.\r\n *\r\n * @param {string} className\r\n * @param {number} id\r\n * @param {(data: Object) => any} onResponse\r\n * @param {(error) => any} onError\r\n * @param {() => any} onFinalize\r\n * @returns {BehaviorSubject<boolean>}\r\n */\r\n public getLoading(className: string,\r\n id: number,\r\n onResponse: (data: Object) => any,\r\n onError?: (error) => any,\r\n onFinalize?: () => any): BehaviorSubject<boolean> {\r\n let loading: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);\r\n\r\n this.http.get<Object>(this.crudEndpoint + className + \"/\" + id).subscribe((data: Object) => {\r\n loading.next(false);\r\n onResponse(data);\r\n },\r\n (error) => {\r\n onError(error);\r\n },\r\n () => {\r\n onFinalize();\r\n });\r\n\r\n return loading;\r\n }\r\n\r\n /**\r\n * Post a new entity. One without an id. Return that entity.\r\n *\r\n * @param {string} className\r\n * @param data\r\n * @returns {Observable<Object>}\r\n */\r\n public post(className: string, data: any): Observable<Object> {\r\n return this.http.post<Object>(this.crudEndpoint + className, data);\r\n }\r\n\r\n /**\r\n * Return a loading subject. Post a new entity without an id. Use the callback to get the entity response.\r\n *\r\n * @param {string} className\r\n * @param data\r\n * @param {(data: Object) => any} onResponse\r\n * @param {(error) => any} onError\r\n * @param {() => any} onFinalize\r\n * @returns {BehaviorSubject<boolean>}\r\n */\r\n public postLoading(className: string,\r\n data: any,\r\n onResponse: (data: Object) => any,\r\n onError?: (error) => any,\r\n onFinalize?: () => any): BehaviorSubject<boolean> {\r\n let loading: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);\r\n\r\n this.http.post<Object>(this.crudEndpoint + className, data).subscribe((data: Object) => {\r\n loading.next(false);\r\n onResponse(data);\r\n },\r\n (error) => {\r\n onError(error);\r\n },\r\n () => {\r\n onFinalize();\r\n });\r\n\r\n return loading;\r\n }\r\n\r\n /**\r\n * Put an existing entity with an id. Return the updated entity.\r\n *\r\n * @param {string} className\r\n * @param {number} id\r\n * @param data\r\n * @returns {Observable<Object>}\r\n */\r\n public put(className: string, id: number, data: any): Observable<Object> {\r\n return this.http.put<Object>(this.crudEndpoint + className + \"/\" + id, data);\r\n }\r\n\r\n /**\r\n * Return the loading subject. Put an existing entity with an id. In the callback return the updated entity.\r\n *\r\n * @param {string} className\r\n * @param {number} id\r\n * @param data\r\n * @param {(data: Object) => any} onResponse\r\n * @param {(error) => any} onError\r\n * @param {() => any} onFinalize\r\n * @returns {BehaviorSubject<boolean>}\r\n */\r\n public putLoading(className: string,\r\n id: number, data: any,\r\n onResponse: (data: Object) => any,\r\n onError?: (error) => any,\r\n onFinalize?: () => any): BehaviorSubject<boolean> {\r\n let loading: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);\r\n\r\n this.http.put<Object>(this.crudEndpoint + className + \"/\" + id, data).subscribe((data: Object) => {\r\n loading.next(false);\r\n onResponse(data);\r\n },\r\n (error) => {\r\n onError(error);\r\n },\r\n () => {\r\n onFinalize();\r\n });\r\n\r\n return loading;\r\n }\r\n\r\n /**\r\n * Delete the entity by its id, return the response with no body.\r\n *\r\n * @param {string} className\r\n * @param {number} id\r\n * @returns {Observable<Object>}\r\n */\r\n public delete(className: string, id: number): Observable<HttpResponse<any>> {\r\n return this.http.delete<Object>(this.crudEndpoint + className + \"/\" + id, { observe: \"response\" });\r\n }\r\n\r\n /**\r\n * Return the loading subject. Delete the entity by id, use the callback to get the response with no body.\r\n *\r\n * @param {string} className\r\n * @param {number} id\r\n * @param {(data: Object) => any} onResponse\r\n * @param {(error) => any} onError\r\n * @param {() => any} onFinalize\r\n * @returns {BehaviorSubject<boolean>}\r\n */\r\n public deleteLoading(className: string,\r\n id: number,\r\n onResponse: (response: HttpResponse<any>) => any,\r\n onError?: (error) => any,\r\n onFinalize?: () => any): BehaviorSubject<boolean> {\r\n let loading: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);\r\n\r\n this.http.delete<Object>(this.crudEndpoint + className + \"/\" + id, { observe: \"response\" }).subscribe((response: HttpResponse<any>) => {\r\n loading.next(false);\r\n onResponse(response);\r\n },\r\n (error) => {\r\n onError(error);\r\n },\r\n () => {\r\n onFinalize();\r\n });\r\n\r\n return loading;\r\n }\r\n}\r\n","import {\r\n AfterViewInit, ChangeDetectorRef, Component, HostBinding, Input, isDevMode,\r\n ViewChild, OnDestroy\r\n} from \"@angular/core\";\r\nimport {NgForm} from \"@angular/forms\";\r\n\r\nimport { Observable, Subscription } from \"rxjs\";\r\nimport {finalize} from \"rxjs/operators\";\r\n\r\nimport {CrudService} from \"../services/crud.service\";\r\n\r\n/**\r\n * This is a generic component that is designed to work with the crud api. The component builds itself based on the\r\n * metadata. This component could be independent so it has its own form and can interact with the crud api on its own.\r\n *\r\n * \"id\": false,\r\n * \"field\": \"idNameType\",\r\n * \"type\": \"Long\",\r\n * \"notNull\": true,\r\n * \"min\": null,\r\n * \"max\": null,\r\n * \"dictionaryClassName\": \"hci.ri.core.subject.model.NameType\",\r\n * \"phi\": false\r\n *\r\n * @since 10.0.0\r\n */\r\n@Component({\r\n selector: \"hci-crud\",\r\n template: `\r\n <form #crudForm=\"ngForm\"\r\n class=\"d-flex flex-nowrap flex-row flex-grow-1\">\r\n <div class=\"d-flex flex-nowrap flex-column flex-grow-1\">\r\n <hci-busy [busy]=\"[busy]\" [showIcon]=\"false\"></hci-busy>\r\n <ng-container *ngFor=\"let fieldArray of fields\">\r\n <div class=\"d-flex flex-nowrap mb-1\">\r\n <ng-container *ngFor=\"let field of fieldArray\">\r\n <input *ngIf=\"field.metadata.type === 'String'\" attr.aria-label=\"hci-ng-crud-input-string-{{field.metadata.field}}\"\r\n [(ngModel)]=\"field.data\"\r\n type=\"text\"\r\n [id]=\"field.metadata.field\"\r\n [name]=\"field.metadata.field\"\r\n [disabled]=\"!editable\"\r\n [placeholder]=\"field.metadata.field\"\r\n [minLength]=\"field.metadata.min\"\r\n [maxLength]=\"field.metadata.max\"\r\n [required]=\"field.metadata.notNull\"\r\n class=\"crud-input\"\r\n [ngStyle]=\"field.styles\"\r\n [class.phi]=\"field.metadata.phi\" />\r\n <input *ngIf=\"!field.metadata.dictionaryClassName && (field.metadata.type === 'Integer' || field.metadata.type === 'Long')\"\r\n [(ngModel)]=\"field.data\" attr.aria-label=\"hci-ng-crud-input-number-{{field.metadata.field}}\"\r\n type=\"number\"\r\n [id]=\"field.metadata.field\"\r\n [name]=\"field.metadata.field\"\r\n [disabled]=\"!editable\"\r\n [placeholder]=\"field.metadata.field\"\r\n [minLength]=\"field.metadata.min\"\r\n [maxLength]=\"field.metadata.max\"\r\n [required]=\"field.metadata.notNull\"\r\n class=\"crud-input\"\r\n [ngStyle]=\"field.styles\"\r\n [class.phi]=\"field.metadata.phi\" />\r\n <hci-native-select *ngIf=\"field.metadata.dictionaryClassName\"\r\n [(ngModel)]=\"field.data\"\r\n [id]=\"field.metadata.field\"\r\n [name]=\"field.metadata.field\"\r\n [url]=\"field.metadata.dictionaryClassName\"\r\n [required]=\"field.metadata.required\"\r\n class=\"crud-input\"\r\n [ngStyle]=\"field.styles\">\r\n </hci-native-select>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <button *ngIf=\"saveable && !crudForm.form.dirty\"\r\n (click)=\"save()\"\r\n class=\"btn btn-icon ms-1\"\r\n [disabled]=\"true\">\r\n <i class=\"far fa-circle fa-lg\"></i>\r\n </button>\r\n <button *ngIf=\"saveable && crudForm.form.dirty && crudForm.form.valid && !warning\"\r\n (click)=\"save()\"\r\n class=\"btn btn-icon btn-green ms-1\">\r\n <span *ngIf=\"!busy\">\r\n <i class=\"fas fa-check fa-lg\"></i>\r\n </span>\r\n <span *ngIf=\"busy\">\r\n <i class=\"fas fa-spinner fa-lg fa-spin\"></i>\r\n </span>\r\n </button>\r\n <button *ngIf=\"saveable && warning\"\r\n [ngbPopover]=\"warning\"\r\n triggers=\"mouseenter:mouseleave\"\r\n popoverClass=\"warn\"\r\n (click)=\"save()\"\r\n class=\"btn btn-icon btn-red ms-1\">\r\n <i class=\"fas fa-exclamation-circle fa-lg\"></i>\r\n </button>\r\n <button *ngIf=\"saveable && crudForm.form.dirty && !crudForm.form.valid && !warning\"\r\n [disabled]=\"true\">\r\n class=\"btn btn-icon btn-red ms-1\">\r\n <i class=\"fas fa-times fa-lg\"></i>\r\n </button>\r\n </form>\r\n `,\r\n styles: [`\r\n\r\n .crud-input {\r\n width: 100%;\r\n }\r\n\r\n .crud-input:first-child {\r\n border-top-left-radius: 0.25rem;\r\n border-bottom-left-radius: 0.25rem;\r\n }\r\n\r\n .crud-input:last-child {\r\n border-top-right-radius: 0.25rem;\r\n border-bottom-right-radius: 0.25rem;\r\n }\r\n\r\n .ng-invalid {\r\n background-color: rgba(255, 100, 100, 0.25);\r\n }\r\n\r\n .phi {\r\n box-shadow: #cc7700 1px 1px 1px inset;\r\n border-color: orange;\r\n }\r\n\r\n ::ng-deep .hci-dropdown {\r\n min-width: 20%;\r\n }\r\n\r\n `]\r\n})\r\nexport class CrudComponent implements AfterViewInit, OnDestroy {\r\n\r\n @HostBinding(\"class\") classList: string = \"d-flex flex-nowrap\";\r\n\r\n @Input() saveable: boolean = true;\r\n @Input() editable: boolean = true;\r\n @Input() className: string;\r\n @Input(\"fields\") displayFields: string[] = [];\r\n @Input() ids: any[];\r\n @Input() data: any = {};\r\n @Input() styles: any[];\r\n\r\n @ViewChild(\"crudForm\", {static: true}) form: NgForm;\r\n\r\n id: string;\r\n metadata: any = {};\r\n fields: any[];\r\n busy: boolean = false;\r\n warning: string;\r\n\r\n metadataSubscription: Subscription;\r\n\r\n constructor(private crudService: CrudService,\r\n private changeDetectorRef: ChangeDetectorRef) {}\r\n\r\n ngAfterViewInit(): void {\r\n this.metadataSubscription = this.crudService.getMetadata(this.className).subscribe((metadata: any) => {\r\n this.fields = [];\r\n\r\n for (let displayFieldArray of this.displayFields) {\r\n let fieldArray: any[] = [];\r\n\r\n for (let displayField of displayFieldArray) {\r\n for (let metadataField of metadata.fields) {\r\n if (displayField === metadataField.field) {\r\n let field: any = {\r\n data: undefined,\r\n metadata: metadataField,\r\n styles: undefined\r\n };\r\n\r\n if (this.styles) {\r\n for (let fieldStyle of this.styles) {\r\n if (displayField === fieldStyle.field) {\r\n field.styles = fieldStyle.styles;\r\n }\r\n }\r\n }\r\n\r\n fieldArray.push(field);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n this.fields.push(fieldArray);\r\n }\r\n\r\n for (let metadataField of metadata.fields) {\r\n if (metadataField.id) {\r\n this.id = metadataField.field;\r\n break;\r\n }\r\n }\r\n\r\n this.metadata = metadata;\r\n\r\n this.refreshData();\r\n this.changeDetectorRef.detectChanges();\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.metadataSubscription.unsubscribe();\r\n }\r\n\r\n /**\r\n * Push the data from the bound inputs to the data representing this crud class.\r\n */\r\n createData(): void {\r\n if (!this.data) {\r\n this.data = {};\r\n }\r\n\r\n if (this.ids) {\r\n for (let id of this.ids) {\r\n this.data[id.key] = id.value;\r\n }\r\n }\r\n\r\n for (let fieldArray of this.fields) {\r\n for (let field of fieldArray) {\r\n this.data[field.metadata.field] = field.data;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * If data exists, set it and refresh the bound data.\r\n *\r\n * @param data\r\n */\r\n setData(data: any): void {\r\n if (isDevMode()) {\r\n console.debug(\"CrudComponent.setData: \" + this.className);\r\n console.debug(data);\r\n }\r\n\r\n if (data !== undefined) {\r\n this.data = data;\r\n this.refreshData();\r\n } else {\r\n this.data = {};\r\n }\r\n }\r\n\r\n /**\r\n * Pushes the data to the fields for binding to the form inputs.\r\n */\r\n refreshData(): void {\r\n if (this.data && this.fields) {\r\n for (let fieldArray of this.fields) {\r\n for (let field of fieldArray) {\r\n field.data = this.data[field.metadata.field];\r\n }\r\n }\r\n\r\n this.changeDetectorRef.detectChanges();\r\n }\r\n }\r\n\r\n /**\r\n * Gets a save request and refreshes the data upon a successful call.\r\n */\r\n save(): void {\r\n this.busy = true;\r\n this.warning = undefined;\r\n\r\n this.getSaveRequest()\r\n .pipe(finalize(() => {\r\n this.busy = false;\r\n }))\r\n .subscribe((data: Object) => {\r\n this.setData(data);\r\n this.form.form.markAsPristine();\r\n },\r\n (error) => {\r\n this.warning = error;\r\n console.error(\"CrudComponent.save: \" + this.className + \": \" + error);\r\n });\r\n }\r\n\r\n /**\r\n * Return an observable from the crud post or put. This is used such that the crud container can manage the request\r\n * for this component.\r\n *\r\n * @returns {Observable<Object>}\r\n */\r\n getSaveRequest(): Observable<Object> {\r\n this.createData();\r\n\r\n if (this.data[this.id]) {\r\n return this.crudService.put(this.className, this.data[this.id], this.data);\r\n } else {\r\n return this.crudService.post(this.className, this.data);\r\n }\r\n }\r\n}\r\n","import {Pipe} from \"@angular/core\";\r\n\r\n@Pipe({\r\n name: \"fieldViewable\",\r\n pure: true\r\n})\r\nexport class FieldViewablePipe {\r\n\r\n transform(list: any[]): any {\r\n return list.filter((item: any) => {\r\n return item.viewable;\r\n });\r\n }\r\n}\r\n","import {ChangeDetectorRef, Component, HostBinding, Input, isDevMode, QueryList, ViewChildren} from \"@angular/core\";\r\n\r\nimport {CrudService} from \"../services/crud.service\";\r\nimport {CrudComponent} from \"./crud.component\";\r\nimport {Observable} from \"rxjs/Observable\";\r\nimport {forkJoin} from \"rxjs/Observable/forkJoin\";\r\n\r\n/**\r\n * This is a generic component that is designed to work with the crud api. The component builds itself based on the\r\n * metadata. It ties together multiple crud components. For example, Subject or StudySubject may have names, phone\r\n * numbers, or addresses associated with it. Each one corresponding to its own CRUD rest endpoint.\r\n *\r\n * @since 10.0.0\r\n */\r\n@Component({\r\n selector: \"hci-crud-container\",\r\n template: `\r\n <ng-container *ngFor=\"let crudGroup of crudGroups\" class=\"crud-group\">\r\n <div *ngIf=\"crudGroup.mode === 'singular'\"\r\n class=\"d-flex crud-group p-2\">\r\n <h4 style=\"flex: 0 0 15%;\">{{crudGroup.display}}</h4>\r\n <hci-crud [className]=\"crudGroup.className\"\r\n [fields]=\"crudGroup.displayFields\"\r\n [styles]=\"crudGroup.styles\"\r\n [ids]=\"ids\"\r\n [data]=\"crudGroup.data\"\r\n [saveable]=\"saveable\"\r\n style=\"flex: 1 1 85%;\"></hci-crud>\r\n </div>\r\n </ng-container>\r\n `,\r\n styles: [`\r\n \r\n .crud-group {\r\n background-color: #cfecfc;\r\n margin-bottom: 1rem;\r\n border-radius: 0.5rem;\r\n border: #3d7a99 1px solid;\r\n }\r\n \r\n `]\r\n})\r\nexport class CrudContainerComponent {\r\n\r\n @HostBinding(\"class\") classList: string = \"d-flex flex-column\";\r\n\r\n @Input() data: any;\r\n @Input() saveable: boolean = true;\r\n @Input() crudGroups: any[];\r\n @Input() ids: any[];\r\n\r\n @ViewChildren(CrudComponent) crudComponents: QueryList<CrudComponent>;\r\n\r\n constructor(private crudService: CrudService,\r\n private changeDetectorRef: ChangeDetectorRef) {}\r\n\r\n setData(data: any): void {\r\n if (isDevMode()) {\r\n console.debug(\"CrudContainerComponent.setData\");\r\n console.debug(data);\r\n }\r\n\r\n this.data = data;\r\n\r\n this.crudComponents.forEach((crud: CrudComponent) => {\r\n for (let crudGroup of this.crudGroups) {\r\n if (crudGroup.className === crud.className && crudGroup.dataField) {\r\n crud.setData(this.data[crudGroup.dataField]);\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n\r\n save(): void {\r\n this.crudComponents.forEach((crud: CrudComponent) => {\r\n crud.save();\r\n });\r\n }\r\n\r\n saveJoin(): Observable<any> {\r\n let requests: Observable<any>[] = [];\r\n\r\n this.crudComponents.forEach((crud: CrudComponent) => {\r\n requests.push(crud.getSaveRequest());\r\n });\r\n\r\n return forkJoin(requests);\r\n }\r\n}\r\n","/*\r\n * Copyright (c) 2016 Huntsman Cancer Institute at the University of Utah, Confidential and Proprietary\r\n */\r\nimport {ModuleWithProviders, NgModule} from \"@angular/core\";\r\nimport {CommonModule} from \"@angular/common\";\r\nimport {FormsModule} from \"@angular/forms\";\r\n\r\nimport {NgbModule} from \"@ng-bootstrap/ng-bootstrap\";\r\n\r\nimport {SelectModule} from \"@huntsman-cancer-institute/input\";\r\nimport {MiscModule} from \"@huntsman-cancer-institute/misc\";\r\n\r\nimport {CRUD_ENDPOINT, CrudService} from \"./services/crud.service\";\r\nimport {CrudComponent} from \"./components/crud.component\";\r\nimport {FieldViewablePipe} from \"./pipes/field-viewable.pipe\";\r\nimport {CrudContainerComponent} from \"./components/crud-container.component\";\r\n\r\n/**\r\n * The module providing the crud service.\r\n *\r\n * @since 9.0.0\r\n */\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n NgbModule,\r\n SelectModule,\r\n MiscModule\r\n ],\r\n declarations: [\r\n CrudContainerComponent,\r\n CrudComponent,\r\n FieldViewablePipe\r\n ],\r\n exports: [\r\n CrudContainerComponent,\r\n CrudComponent,\r\n FieldViewablePipe\r\n ]\r\n})\r\nexport class CrudModule {\r\n static forRoot(config: any): ModuleWithProviders<CrudModule> {\r\n return {\r\n providers: [\r\n {provide: CRUD_ENDPOINT, useValue: config.crudEndpoint},\r\n CrudService\r\n ],\r\n ngModule: CrudModule\r\n };\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.CrudService","i3.CrudComponent"],"mappings":";;;;;;;;;;;;;;;;;;IAQW,aAAa,GAAG,IAAI,cAAc,CAAS,cAAc,EAAE;AAEtE;;;;;AAKG;MAEU,WAAW,CAAA;IAItB,WAAoB,CAAA,IAAgB,EAAiC,YAAoB,EAAA;QAArE,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAY;QAAiC,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAQ;AAFzF,QAAA,IAAA,CAAA,WAAW,GAAwB,IAAI,GAAG,EAAkB,CAAC;KAEgC;AAEtF,IAAA,WAAW,CAAC,SAAiB,EAAA;QAClC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;YACnC,OAAO,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;SAC5C;AAED,QAAA,IAAI,CAAC,GAAuB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAS,IAAI,CAAC,YAAY,GAAG,SAAS,GAAG,WAAW,CAAC,CAAC;AAC/F,QAAA,CAAC,CAAC,SAAS,CAAC,CAAC,QAAa,KAAI;YAC5B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC5C,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,CAAC,CAAC;KACV;AAED;;;;;;;AAOG;AACI,IAAA,MAAM,CAAC,SAAiB,EAAE,MAAyB,SAAS,EAAE,QAAgB,SAAS,EAAA;AAC5F,QAAA,IAAI,MAAM,GAAe,IAAI,UAAU,EAAE,CAAC;QAC1C,IAAI,KAAK,EAAE;YACT,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;SACrC;QAED,IAAI,GAAG,EAAE;YACP,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAa,IAAI,CAAC,YAAY,GAAG,SAAS,GAAG,OAAO,EAAE,GAAG,EAAE,EAAC,MAAM,EAAE,MAAM,EAAC,CAAC,CAAC;SACnG;aAAM;AACL,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAa,IAAI,CAAC,YAAY,GAAG,SAAS,EAAE,EAAC,MAAM,EAAE,MAAM,EAAC,CAAC,CAAC;SACnF;KACF;AAED;;;;;;;;;;AAUG;AACI,IAAA,aAAa,CAAC,SAAiB,EACjB,GAAA,GAAyB,SAAS,EAClC,KAAgB,GAAA,SAAS,EACzB,UAAqC,EACrC,OAAwB,EACxB,UAAsB,EAAA;AACzC,QAAA,IAAI,OAAO,GAA6B,IAAI,eAAe,CAAU,IAAI,CAAC,CAAC;AAE3E,QAAA,IAAI,MAAM,GAAe,IAAI,UAAU,EAAE,CAAC;QAC1C,IAAI,KAAK,EAAE;YACT,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;SACrC;QAED,IAAI,GAAG,EAAE;YACP,IAAI,CAAC,IAAI,CAAC,IAAI,CAAa,IAAI,CAAC,YAAY,GAAG,SAAS,GAAG,OAAO,EAAE,GAAG,EAAE,EAAC,MAAM,EAAE,MAAM,EAAC,CAAC;AACvF,iBAAA,IAAI,CAAC,QAAQ,CAAC,MAAK;gBAClB,IAAI,UAAU,EAAE;AACd,oBAAA,UAAU,EAAE,CAAC;iBACd;AACH,aAAC,CAAC,CAAC;AACF,iBAAA,SAAS,CAAC,CAAC,IAAgB,KAAI;AAC9B,gBAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpB,UAAU,CAAC,IAAI,CAAC,CAAC;AACnB,aAAC,EACD,CAAC,KAAK,KAAI;gBACR,IAAI,OAAO,EAAE;oBACX,OAAO,CAAC,KAAK,CAAC,CAAC;iBAChB;AACH,aAAC,CAAC,CAAC;SACN;aAAM;AACL,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAa,IAAI,CAAC,YAAY,GAAG,SAAS,EAAE,EAAC,MAAM,EAAE,MAAM,EAAC,CAAC;AACvE,iBAAA,IAAI,CAAC,QAAQ,CAAC,MAAK;gBAClB,IAAI,UAAU,EAAE;AACd,oBAAA,UAAU,EAAE,CAAC;iBACd;AACH,aAAC,CAAC,CAAC;AACF,iBAAA,SAAS,CAAC,CAAC,IAAgB,KAAI;AAC5B,gBAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpB,UAAU,CAAC,IAAI,CAAC,CAAC;AACnB,aAAC,EACD,CAAC,KAAK,KAAI;gBACR,IAAI,OAAO,EAAE;oBACX,OAAO,CAAC,KAAK,CAAC,CAAC;iBAChB;AACH,aAAC,CAAC,CAAC;SACR;AAED,QAAA,OAAO,OAAO,CAAC;KAChB;AAED;;;;;;AAMG;IACI,GAAG,CAAC,SAAiB,EAAE,EAAU,EAAA;AACtC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAS,IAAI,CAAC,YAAY,GAAG,SAAS,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC;KACxE;AAED;;;;;;;;;AASG;IACI,UAAU,CAAC,SAAiB,EACjB,EAAU,EACV,UAAiC,EACjC,OAAwB,EACxB,UAAsB,EAAA;AACtC,QAAA,IAAI,OAAO,GAA6B,IAAI,eAAe,CAAU,IAAI,CAAC,CAAC;QAE3E,IAAI,CAAC,IAAI,CAAC,GAAG,CAAS,IAAI,CAAC,YAAY,GAAG,SAAS,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,IAAY,KAAI;AACzF,YAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,UAAU,CAAC,IAAI,CAAC,CAAC;AACnB,SAAC,EACD,CAAC,KAAK,KAAI;YACR,OAAO,CAAC,KAAK,CAAC,CAAC;SAChB,EACD,MAAK;AACH,YAAA,UAAU,EAAE,CAAC;AACf,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,OAAO,CAAC;KAChB;AAED;;;;;;AAMG;IACI,IAAI,CAAC,SAAiB,EAAE,IAAS,EAAA;AACtC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAS,IAAI,CAAC,YAAY,GAAG,SAAS,EAAE,IAAI,CAAC,CAAC;KACpE;AAED;;;;;;;;;AASG;IACI,WAAW,CAAC,SAAiB,EACjB,IAAS,EACT,UAAiC,EACjC,OAAwB,EACxB,UAAsB,EAAA;AACvC,QAAA,IAAI,OAAO,GAA6B,IAAI,eAAe,CAAU,IAAI,CAAC,CAAC;AAE3E,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAS,IAAI,CAAC,YAAY,GAAG,SAAS,EAAE,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,IAAY,KAAI;AACrF,YAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,UAAU,CAAC,IAAI,CAAC,CAAC;AACnB,SAAC,EACD,CAAC,KAAK,KAAI;YACR,OAAO,CAAC,KAAK,CAAC,CAAC;SAChB,EACD,MAAK;AACH,YAAA,UAAU,EAAE,CAAC;AACf,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,OAAO,CAAC;KAChB;AAED;;;;;;;AAOG;AACI,IAAA,GAAG,CAAC,SAAiB,EAAE,EAAU,EAAE,IAAS,EAAA;AACjD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAS,IAAI,CAAC,YAAY,GAAG,SAAS,GAAG,GAAG,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;KAC9E;AAED;;;;;;;;;;AAUG;IACI,UAAU,CAAC,SAAiB,EACjB,EAAU,EAAE,IAAS,EACrB,UAAiC,EACjC,OAAwB,EACxB,UAAsB,EAAA;AACtC,QAAA,IAAI,OAAO,GAA6B,IAAI,eAAe,CAAU,IAAI,CAAC,CAAC;QAE3E,IAAI,CAAC,IAAI,CAAC,GAAG,CAAS,IAAI,CAAC,YAAY,GAAG,SAAS,GAAG,GAAG,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,IAAY,KAAI;AAC/F,YAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,UAAU,CAAC,IAAI,CAAC,CAAC;AACnB,SAAC,EACD,CAAC,KAAK,KAAI;YACR,OAAO,CAAC,KAAK,CAAC,CAAC;SAChB,EACD,MAAK;AACH,YAAA,UAAU,EAAE,CAAC;AACf,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,OAAO,CAAC;KAChB;AAED;;;;;;AAMG;IACI,MAAM,CAAC,SAAiB,EAAE,EAAU,EAAA;QACzC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAS,IAAI,CAAC,YAAY,GAAG,SAAS,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;KACpG;AAED;;;;;;;;;AASG;IACI,aAAa,CAAC,SAAiB,EACjB,EAAU,EACV,UAAgD,EAChD,OAAwB,EACxB,UAAsB,EAAA;AACzC,QAAA,IAAI,OAAO,GAA6B,IAAI,eAAe,CAAU,IAAI,CAAC,CAAC;QAE3E,IAAI,CAAC,IAAI,CAAC,MAAM,CAAS,IAAI,CAAC,YAAY,GAAG,SAAS,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,QAA2B,KAAI;AACpI,YAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,UAAU,CAAC,QAAQ,CAAC,CAAC;AACvB,SAAC,EACD,CAAC,KAAK,KAAI;YACR,OAAO,CAAC,KAAK,CAAC,CAAC;SAChB,EACD,MAAK;AACH,YAAA,UAAU,EAAE,CAAC;AACf,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,OAAO,CAAC;KAChB;AA5QU,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,4CAIwB,aAAa,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;kHAJhD,WAAW,EAAA,CAAA,CAAA,EAAA;;2FAAX,WAAW,EAAA,UAAA,EAAA,CAAA;kBADvB,UAAU;;0BAK8B,MAAM;2BAAC,aAAa,CAAA;;;ACV7D;;;;;;;;;;;;;;AAcG;MAgHU,aAAa,CAAA;IAsBxB,WAAoB,CAAA,WAAwB,EACxB,iBAAoC,EAAA;QADpC,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QACxB,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB,CAAmB;QArBlC,IAAS,CAAA,SAAA,GAAW,oBAAoB,CAAC;QAEtD,IAAQ,CAAA,QAAA,GAAY,IAAI,CAAC;QACzB,IAAQ,CAAA,QAAA,GAAY,IAAI,CAAC;QAEjB,IAAa,CAAA,aAAA,GAAa,EAAE,CAAC;QAErC,IAAI,CAAA,IAAA,GAAQ,EAAE,CAAC;QAMxB,IAAQ,CAAA,QAAA,GAAQ,EAAE,CAAC;QAEnB,IAAI,CAAA,IAAA,GAAY,KAAK,CAAC;KAMsC;IAE5D,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,QAAa,KAAI;AACnG,YAAA,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;AAEjB,YAAA,KAAK,IAAI,iBAAiB,IAAI,IAAI,CAAC,aAAa,EAAE;gBAChD,IAAI,UAAU,GAAU,EAAE,CAAC;AAE3B,gBAAA,KAAK,IAAI,YAAY,IAAI,iBAAiB,EAAE;AAC1C,oBAAA,KAAK,IAAI,aAAa,IAAI,QAAQ,CAAC,MAAM,EAAE;AACzC,wBAAA,IAAI,YAAY,KAAK,aAAa,CAAC,KAAK,EAAE;AACxC,4BAAA,IAAI,KAAK,GAAQ;AACf,gCAAA,IAAI,EAAE,SAAS;AACf,gCAAA,QAAQ,EAAE,aAAa;AACvB,gCAAA,MAAM,EAAE,SAAS;6BAClB,CAAC;AAEF,4BAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,gCAAA,KAAK,IAAI,UAAU,IAAI,IAAI,CAAC,MAAM,EAAE;AAClC,oCAAA,IAAI,YAAY,KAAK,UAAU,CAAC,KAAK,EAAE;AACrC,wCAAA,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;qCAClC;iCACF;6BACF;AAED,4BAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;4BACvB,MAAM;yBACP;qBACF;iBACF;AAED,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;aAC9B;AAED,YAAA,KAAK,IAAI,aAAa,IAAI,QAAQ,CAAC,MAAM,EAAE;AACzC,gBAAA,IAAI,aAAa,CAAC,EAAE,EAAE;AACpB,oBAAA,IAAI,CAAC,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC;oBAC9B,MAAM;iBACP;aACF;AAED,YAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAEzB,IAAI,CAAC,WAAW,EAAE,CAAC;AACnB,YAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC;AACzC,SAAC,CAAC,CAAC;KACJ;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,CAAC;KACzC;AAED;;AAEG;IACH,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACd,YAAA,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;SAChB;AAED,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE;AACZ,YAAA,KAAK,IAAI,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE;gBACvB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;aAC9B;SACF;AAED,QAAA,KAAK,IAAI,UAAU,IAAI,IAAI,CAAC,MAAM,EAAE;AAClC,YAAA,KAAK,IAAI,KAAK,IAAI,UAAU,EAAE;AAC5B,gBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;aAC9C;SACF;KACF;AAED;;;;AAIG;AACH,IAAA,OAAO,CAAC,IAAS,EAAA;QACf,IAAI,SAAS,EAAE,EAAE;YACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;AAC1D,YAAA,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SACrB;AAED,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AACtB,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,WAAW,EAAE,CAAC;SACpB;aAAM;AACL,YAAA,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;SAChB;KACF;AAED;;AAEG;IACH,WAAW,GAAA;QACT,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;AAC5B,YAAA,KAAK,IAAI,UAAU,IAAI,IAAI,CAAC,MAAM,EAAE;AAClC,gBAAA,KAAK,IAAI,KAAK,IAAI,UAAU,EAAE;AAC5B,oBAAA,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;iBAC9C;aACF;AAED,YAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC;SACxC;KACF;AAED;;AAEG;IACH,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACjB,QAAA,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QAEzB,IAAI,CAAC,cAAc,EAAE;AAClB,aAAA,IAAI,CAAC,QAAQ,CAAC,MAAK;AAClB,YAAA,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;AACpB,SAAC,CAAC,CAAC;AACF,aAAA,SAAS,CAAC,CAAC,IAAY,KAAI;AAC1B,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACnB,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;AAClC,SAAC,EACD,CAAC,KAAK,KAAI;AACR,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;AACrB,YAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC;AACxE,SAAC,CAAC,CAAC;KACN;AAED;;;;;AAKG;IACH,cAAc,GAAA;QACZ,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;YACtB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;SAC5E;aAAM;AACL,YAAA,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;SACzD;KACF;8GAtKU,aAAa,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAb,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,EA7Gd,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,CAAA,QAAA,EAAA,eAAA,CAAA,EAAA,GAAA,EAAA,KAAA,EAAA,IAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,MAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6ET,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,kVAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,cAAA,EAAA,WAAA,EAAA,eAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,UAAA,EAAA,OAAA,EAAA,YAAA,EAAA,UAAA,EAAA,SAAA,EAAA,aAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,MAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,UAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FAgCU,aAAa,EAAA,UAAA,EAAA,CAAA;kBA/GzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,EACV,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6ET,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,kVAAA,CAAA,EAAA,CAAA;6GAkCqB,SAAS,EAAA,CAAA;sBAA9B,WAAW;uBAAC,OAAO,CAAA;gBAEX,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBACG,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBACG,SAAS,EAAA,CAAA;sBAAjB,KAAK;gBACW,aAAa,EAAA,CAAA;sBAA7B,KAAK;uBAAC,QAAQ,CAAA;gBACN,GAAG,EAAA,CAAA;sBAAX,KAAK;gBACG,IAAI,EAAA,CAAA;sBAAZ,KAAK;gBACG,MAAM,EAAA,CAAA;sBAAd,KAAK;gBAEiC,IAAI,EAAA,CAAA;sBAA1C,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,UAAU,EAAE,EAAC,MAAM,EAAE,IAAI,EAAC,CAAA;;;MC/I1B,iBAAiB,CAAA;AAE5B,IAAA,SAAS,CAAC,IAAW,EAAA;AACnB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,IAAS,KAAI;YAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC;AACvB,SAAC,CAAC,CAAC;KACJ;8GANU,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;4GAAjB,iBAAiB,EAAA,IAAA,EAAA,eAAA,EAAA,CAAA,CAAA,EAAA;;2FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAJ7B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,eAAe;AACrB,oBAAA,IAAI,EAAE,IAAI;AACX,iBAAA,CAAA;;;ACED;;;;;;AAMG;MA6BU,sBAAsB,CAAA;IAWjC,WAAoB,CAAA,WAAwB,EACxB,iBAAoC,EAAA;QADpC,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QACxB,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB,CAAmB;QAVlC,IAAS,CAAA,SAAA,GAAW,oBAAoB,CAAC;QAGtD,IAAQ,CAAA,QAAA,GAAY,IAAI,CAAC;KAO0B;AAE5D,IAAA,OAAO,CAAC,IAAS,EAAA;QACf,IAAI,SAAS,EAAE,EAAE;AACf,YAAA,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;AAChD,YAAA,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SACrB;AAED,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,IAAmB,KAAI;AAClD,YAAA,KAAK,IAAI,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE;AACrC,gBAAA,IAAI,SAAS,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,EAAE;AACjE,oBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;oBAC7C,MAAM;iBACP;aACF;AACH,SAAC,CAAC,CAAC;KACJ;IAED,IAAI,GAAA;QACF,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,IAAmB,KAAI;YAClD,IAAI,CAAC,IAAI,EAAE,CAAC;AACd,SAAC,CAAC,CAAC;KACJ;IAED,QAAQ,GAAA;QACN,IAAI,QAAQ,GAAsB,EAAE,CAAC;QAErC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,IAAmB,KAAI;YAClD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;AACvC,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC;KAC3B;8GA9CU,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAAtB,sBAAsB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,GAAA,EAAA,KAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,SAAA,EASnB,aAAa,EAnCjB,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;AAcT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,yGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FAYU,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBA5BlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EACpB,QAAA,EAAA,CAAA;;;;;;;;;;;;;;AAcT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,yGAAA,CAAA,EAAA,CAAA;6GAcqB,SAAS,EAAA,CAAA;sBAA9B,WAAW;uBAAC,OAAO,CAAA;gBAEX,IAAI,EAAA,CAAA;sBAAZ,KAAK;gBACG,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBACG,UAAU,EAAA,CAAA;sBAAlB,KAAK;gBACG,GAAG,EAAA,CAAA;sBAAX,KAAK;gBAEuB,cAAc,EAAA,CAAA;sBAA1C,YAAY;uBAAC,aAAa,CAAA;;;ACnD7B;;AAEG;AAeH;;;;AAIG;MAoBU,UAAU,CAAA;IACrB,OAAO,OAAO,CAAC,MAAW,EAAA;QACxB,OAAO;AACL,YAAA,SAAS,EAAE;gBACT,EAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAC,YAAY,EAAC;gBACvD,WAAW;AACZ,aAAA;AACD,YAAA,QAAQ,EAAE,UAAU;SACrB,CAAC;KACH;8GATU,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;AAAV,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,iBAVnB,sBAAsB;YACtB,aAAa;AACb,YAAA,iBAAiB,aATjB,YAAY;YACZ,WAAW;YACX,SAAS;YACT,YAAY;AACZ,YAAA,UAAU,aAQV,sBAAsB;YACtB,aAAa;YACb,iBAAiB,CAAA,EAAA,CAAA,CAAA,EAAA;AAGR,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,YAjBnB,YAAY;YACZ,WAAW;YACX,SAAS;YACT,YAAY;YACZ,UAAU,CAAA,EAAA,CAAA,CAAA,EAAA;;2FAaD,UAAU,EAAA,UAAA,EAAA,CAAA;kBAnBtB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,WAAW;wBACX,SAAS;wBACT,YAAY;wBACZ,UAAU;AACX,qBAAA;AACD,oBAAA,YAAY,EAAE;wBACZ,sBAAsB;wBACtB,aAAa;wBACb,iBAAiB;AAClB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,sBAAsB;wBACtB,aAAa;wBACb,iBAAiB;AAClB,qBAAA;AACF,iBAAA,CAAA;;;ACxCD;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@huntsman-cancer-institute/crud",
3
- "version": "17.7.5",
3
+ "version": "17.8.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git@gitlab.com:huntsman-cancer-institute/risr/ng/hci-ng-lib.git"