@wertzui/ngx-restworld-client 4.2.3 → 4.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/views/restworld-edit-view/restworld-edit-view.component.mjs +7 -6
- package/fesm2015/wertzui-ngx-restworld-client.mjs +6 -5
- package/fesm2015/wertzui-ngx-restworld-client.mjs.map +1 -1
- package/fesm2020/wertzui-ngx-restworld-client.mjs +6 -5
- package/fesm2020/wertzui-ngx-restworld-client.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wertzui-ngx-restworld-client.mjs","sources":["../../../projects/ngx-restworld-client/src/lib/constants/link-names.ts","../../../projects/ngx-restworld-client/src/lib/models/problem-details.ts","../../../projects/ngx-restworld-client/src/lib/models/restworld-options.ts","../../../projects/ngx-restworld-client/src/lib/pipes/safe-url.pipe.ts","../../../projects/ngx-restworld-client/src/lib/pipes/as.pipe.ts","../../../projects/ngx-restworld-client/src/lib/services/avatar-generator.ts","../../../projects/ngx-restworld-client/src/lib/services/form.service.ts","../../../projects/ngx-restworld-client/src/lib/services/restworld-client.ts","../../../projects/ngx-restworld-client/src/lib/services/restworld-client-collection.ts","../../../projects/ngx-restworld-client/src/lib/services/settings.service.ts","../../../projects/ngx-restworld-client/src/lib/views/restworld-image-view/restworld-image-view.component.ts","../../../projects/ngx-restworld-client/src/lib/views/restworld-image-view/restworld-image-view.component.html","../../../projects/ngx-restworld-client/src/lib/views/restworld-file-view/restworld-file-view.component.ts","../../../projects/ngx-restworld-client/src/lib/views/restworld-file-view/restworld-file-view.component.html","../../../projects/ngx-restworld-client/src/lib/views/restworld-edit-form/restworld-edit-form.component.ts","../../../projects/ngx-restworld-client/src/lib/views/restworld-edit-form/restworld-edit-form.component.html","../../../projects/ngx-restworld-client/src/lib/views/restworld-edit-view/restworld-edit-view.component.ts","../../../projects/ngx-restworld-client/src/lib/views/restworld-edit-view/restworld-edit-view.component.html","../../../projects/ngx-restworld-client/src/lib/views/restworld-list-view/restworld-list-view.component.ts","../../../projects/ngx-restworld-client/src/lib/views/restworld-list-view/restworld-list-view.component.html","../../../projects/ngx-restworld-client/src/lib/restworld-client.module.ts","../../../projects/ngx-restworld-client/src/public-api.ts","../../../projects/ngx-restworld-client/src/wertzui-ngx-restworld-client.ts"],"sourcesContent":["export enum LinkNames {\r\n get = \"Get\",\r\n getList = \"GetList\",\r\n post = \"Post\",\r\n put = \"Put\",\r\n delete = \"Delete\",\r\n new = \"New\"\r\n}","import * as _ from \"lodash\";\r\nimport { Resource, ResourceOfDto } from \"@wertzui/ngx-hal-client\"\r\n/*\r\n * ProblemDetails is what an ASP.net Core backend returns in case of an error.\r\n * */\r\nexport interface ProblemDetailsDto {\r\n type?: string;\r\n title?: string;\r\n status?: number;\r\n detail?: string;\r\n instance?: string;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport class ProblemDetails extends Resource implements ResourceOfDto<ProblemDetailsDto> {\r\n public type?: string;\r\n public title?: string;\r\n public status?: number;\r\n public detail?: string;\r\n public instance?: string;\r\n [key: string]: unknown;\r\n\r\n public static isProblemDetails(resource: unknown): resource is ProblemDetails {\r\n return resource instanceof ProblemDetails;\r\n }\r\n\r\n public static containsProblemDetailsInformation(resource: unknown) {\r\n return resource && (resource instanceof ProblemDetails || (resource instanceof Resource && 'status' in resource && _.isNumber(resource['status']) && resource['status'] >= 100 && resource['status'] < 600));\r\n }\r\n\r\n public static fromResource(resource: Resource | null | undefined): ProblemDetails {\r\n if (!ProblemDetails.containsProblemDetailsInformation(resource))\r\n throw new Error(`The resource ${resource} does not have problem details.`);\r\n\r\n return Object.assign(new ProblemDetails(), resource);\r\n }\r\n}\r\n","export class RESTworldOptions {\r\n constructor(public readonly BaseUrl: string, public readonly Version?: number) {\r\n if (!BaseUrl.endsWith('/'))\r\n throw new Error(`The provided BaseUrl '${BaseUrl}' does not end with a slash '/'.`);\r\n }\r\n}","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport * as _ from 'lodash';\r\n\r\n@Pipe({\r\n name: 'safeUrl'\r\n})\r\nexport class SafeUrlPipe implements PipeTransform {\r\n\r\n constructor(private _domSanitizer: DomSanitizer) {\r\n }\r\n\r\n transform(url: unknown) {\r\n if (!_.isString(url))\r\n throw new Error(`The given url '${url}' is not a string.`)\r\n\r\n return this._domSanitizer.bypassSecurityTrustResourceUrl(url);\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n/**\r\n * Cast super type into type using generics\r\n * Return Type obtained by optional @param type OR assignment type.\r\n */\r\n\r\n@Pipe({ name: 'as' })\r\nexport class AsPipe implements PipeTransform {\r\n /**\r\n * Cast (S: SuperType) into (T: Type) using @Generics.\r\n * @param value (S: SuperType) obtained from input type.\r\n * @optional @param type (T CastingType)\r\n * type?: { new (): T }\r\n * type?: new () => T\r\n */\r\n transform<S, T extends S>(value: S, type: new (...args: any[]) => T): T {\r\n return value as T;\r\n }\r\n}","import { Injectable, Input } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AvatarGenerator {\r\n private static _nonWordRegex = new RegExp('\\\\W');\r\n private static _imageCache: Map<string, string> = new Map<string, string>();\r\n\r\n @Input()\r\n public getImageOverride: (nameOrEmail: string) => string = () => '';\r\n\r\n public getImage(nameOrEmail: string): string {\r\n let uri = AvatarGenerator._imageCache.get(nameOrEmail);\r\n\r\n if (!uri) {\r\n uri = this.getImageOverride(nameOrEmail);\r\n AvatarGenerator._imageCache.set(nameOrEmail, uri);\r\n }\r\n\r\n return uri;\r\n }\r\n\r\n public getLabel(nameOrEmail: string): string {\r\n if (!nameOrEmail)\r\n return '';\r\n\r\n if (this.getImage(nameOrEmail))\r\n return '';\r\n\r\n const name = AvatarGenerator.getLocalPartOfEmailAddress(nameOrEmail);\r\n const initials = AvatarGenerator.getTwoUppercaseLettersFromName(name);\r\n\r\n return initials;\r\n }\r\n\r\n public getStyle(nameOrEmail: string,): '' | { 'background-color': string; color: string } {\r\n if (this.getImage(nameOrEmail))\r\n return '';\r\n\r\n const foregroundColor = '#ffffff';\r\n const backgroundColor = AvatarGenerator.getBackgroundColor(nameOrEmail);\r\n\r\n const style = {\r\n 'background-color': backgroundColor,\r\n color: foregroundColor,\r\n };\r\n\r\n return style;\r\n }\r\n\r\n private static getLocalPartOfEmailAddress(email: string): string {\r\n const indexOfAt = email.indexOf('@');\r\n if (indexOfAt < 2) {\r\n if (indexOfAt >= 0) {\r\n if (indexOfAt === email.length - 1)\r\n return email.substring(0, indexOfAt);\r\n return email.substring(indexOfAt + 1);\r\n }\r\n } else {\r\n return email.substring(0, indexOfAt);\r\n }\r\n\r\n return email;\r\n }\r\n\r\n private static getTwoUppercaseLettersFromName(name: string): string {\r\n // Too short to do anything besides just returning the name\r\n if (name.length <= 2) {\r\n return name.toUpperCase();\r\n }\r\n\r\n // Try to split by non word characters\r\n const splittedByNonWord = name.split(AvatarGenerator._nonWordRegex);\r\n if (splittedByNonWord.length > 1) {\r\n return (splittedByNonWord[0][0] + splittedByNonWord[1][0]).toUpperCase();\r\n }\r\n\r\n // Try to split by upper case letters\r\n const upperCaseLetters = [...name]\r\n .filter((c) => c.toUpperCase() === c && !AvatarGenerator._nonWordRegex.test(c))\r\n .join();\r\n if (upperCaseLetters.length > 1) {\r\n return upperCaseLetters.substring(0, 2);\r\n }\r\n\r\n // Just return the first 2 letters\r\n return name.substring(0, 2).toUpperCase();\r\n }\r\n\r\n // from https://stackoverflow.com/a/66494926/1378307\r\n private static getBackgroundColor(\r\n text: string,\r\n minLightness = 40,\r\n maxLightness = 80,\r\n minSaturation = 30,\r\n maxSaturation = 100,\r\n ): string {\r\n if (!text) return '#aaa';\r\n\r\n const hash = [...text].reduce((acc, char) => {\r\n return char.charCodeAt(0) + ((acc << 5) - acc);\r\n }, 0);\r\n\r\n return (\r\n 'hsl(' +\r\n (hash % 360) +\r\n ', ' +\r\n ((hash % (maxSaturation - minSaturation)) + minSaturation) +\r\n '%, ' +\r\n ((hash % (maxLightness - minLightness)) + minLightness) +\r\n '%)'\r\n );\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { FormArray, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { Property, PropertyType, Template, Templates } from '@wertzui/ngx-hal-client';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FormService {\r\n\r\n public createFormGroupsFromTemplates(templates: Templates): { [key: string]: FormGroup } {\r\n const tabs = Object.fromEntries(Object.entries(templates).map(([name, template]) => [\r\n name,\r\n this.createFormGroupFromTemplate(template)\r\n ]));\r\n\r\n return tabs;\r\n }\r\n\r\n private createFormGroupFromTemplates(templates: Templates, ignoredProperties: string[]): FormGroup {\r\n const controls = Object.fromEntries(\r\n Object.entries(templates)\r\n .filter(([key, ]) => !ignoredProperties.some(p => key === p))\r\n .map(([name, template]) => [\r\n name,\r\n this.createFormGroupFromTemplate(template)\r\n ]));\r\n const formGroup = new FormGroup(controls);\r\n return formGroup;\r\n }\r\n\r\n public createFormArrayFromTemplates(templates: Templates, ignoredProperties: string[]): FormArray {\r\n const controls =\r\n Object.entries(templates)\r\n .filter(([key, ]) => !ignoredProperties.some(p => key === p))\r\n .map(([, template]) =>\r\n this.createFormGroupFromTemplate(template));\r\n const formArray = new FormArray(controls);\r\n return formArray;\r\n }\r\n\r\n public createFormGroupFromTemplate(template: Template): FormGroup {\r\n const controls = Object.fromEntries(template.properties.map(p => [\r\n p.name,\r\n this.createFormControl(p)\r\n ]));\r\n const formGroup = new FormGroup(controls);\r\n return formGroup;\r\n }\r\n\r\n public createFormControl(property: Property): FormControl | FormGroup | FormArray {\r\n if (property.type === PropertyType.Object)\r\n return this.createFormGroupFromTemplate(property._templates['default']);\r\n if (property.type === PropertyType.Collection)\r\n return this.createFormArrayFromTemplates(property._templates, ['default']);\r\n\r\n const control = new FormControl(property.value);\r\n if (property.max)\r\n control.addValidators(Validators.max(property.max));\r\n if (property.maxLength)\r\n control.addValidators(Validators.maxLength(property.maxLength));\r\n if (property.min)\r\n control.addValidators(Validators.min(property.min));\r\n if (property.minLength)\r\n control.addValidators(Validators.minLength(property.minLength));\r\n if (property.regex)\r\n control.addValidators(Validators.pattern(property.regex));\r\n if (property.required)\r\n control.addValidators(Validators.required);\r\n if (property.type === PropertyType.Email)\r\n control.addValidators(Validators.email);\r\n\r\n return control;\r\n }\r\n}\r\n","import { HttpHeaders, HttpResponse } from '@angular/common/http';\r\nimport * as _ from \"lodash\";\r\nimport { FormsResource, HalClient, Link, PagedListResource, Resource, ResourceDto, Template } from \"@wertzui/ngx-hal-client\";\r\nimport { LinkNames } from \"../constants/link-names\";\r\nimport { ProblemDetails } from \"../models/problem-details\";\r\nimport { RESTworldOptions } from \"../models/restworld-options\";\r\n\r\nexport class RESTworldClient {\r\n\r\n private _homeResource?: Resource;\r\n private _defaultCurie?: string;\r\n public get halClient() {\r\n return this._halClient;\r\n }\r\n\r\n constructor(\r\n private _halClient: HalClient,\r\n private _options: RESTworldOptions\r\n ) { }\r\n\r\n public async ensureHomeResourceIsSet(): Promise<void> {\r\n if (!this._homeResource) {\r\n const response = await this.getHomeForced();\r\n if (ProblemDetails.isProblemDetails(response.body)) {\r\n throw new Error(`Cannot get the home resource from ${this._options.BaseUrl} with Version ${this._options.Version}. Response was: ${response}`);\r\n }\r\n if (!response.body)\r\n throw new Error(`Cannot get the home resource from ${this._options.BaseUrl} with Version ${this._options.Version}. Response was empty.`);\r\n this._homeResource = response.body;\r\n this.setDefaultCurie();\r\n }\r\n }\r\n\r\n private async getHomeForced(): Promise<HttpResponse<Resource | ProblemDetails>> {\r\n const header = RESTworldClient.createHeaders('application/hal+json', this._options.Version);\r\n const response = await this.halClient.get(this._options.BaseUrl, Resource, ProblemDetails, header);\r\n return response;\r\n }\r\n\r\n private setDefaultCurie(): void {\r\n const curies = this._homeResource?._links?.curies;\r\n if (!curies || curies.length === 0 || !curies[0])\r\n this._defaultCurie = undefined;\r\n else\r\n this._defaultCurie = curies[0].name;\r\n }\r\n\r\n public async getList<TListDto extends ResourceDto>(rel: string, parameters: {}, headers?: HttpHeaders, curie?: string): Promise<HttpResponse<PagedListResource<TListDto> | ProblemDetails>> {\r\n const link = this.getLinkFromHome(rel, LinkNames.getList, curie);\r\n const uri = link.href\r\n\r\n const response = await this.getListByUri<TListDto>(uri, parameters, headers);\r\n\r\n return response;\r\n }\r\n\r\n public async getListByUri<TListDto extends ResourceDto>(uri: string, parameters: {}, headers?: HttpHeaders): Promise<HttpResponse<PagedListResource<TListDto> | ProblemDetails>> {\r\n const link = new Link();\r\n link.href = uri;\r\n const filledUri = link.fillTemplate(parameters);\r\n const defaultHeaders = RESTworldClient.createHeaders('application/hal+json', this._options.Version);\r\n const combinedHeaders = RESTworldClient.combineHeaders(headers, defaultHeaders, false);\r\n\r\n const response = await this.halClient.get<PagedListResource<TListDto>, ProblemDetails>(filledUri, PagedListResource, ProblemDetails, combinedHeaders);\r\n\r\n return response;\r\n }\r\n\r\n public async getAllPagesFromList<TListDto extends ResourceDto>(rel: string, parameters: {}, headers?: HttpHeaders, curie?: string): Promise<HttpResponse<PagedListResource<TListDto> | ProblemDetails>> {\r\n const link = this.getLinkFromHome(rel, LinkNames.getList, curie);\r\n const uri = link.href;\r\n\r\n const response = await this.getAllPagesFromListByUri<TListDto>(uri, parameters, headers);\r\n\r\n return response;\r\n }\r\n\r\n public async getAllPagesFromListByUri<TListDto extends ResourceDto>(uri: string, parameters: {}, headers?: HttpHeaders): Promise<HttpResponse<PagedListResource<TListDto> | ProblemDetails>> {\r\n const response = await this.getListByUri<TListDto>(uri, parameters, headers);\r\n\r\n if (!response.ok || ProblemDetails.isProblemDetails(response.body) || !response.body?._embedded?.items)\r\n return response;\r\n\r\n\r\n const items = response.body._embedded.items;\r\n let lastResponse = response;\r\n\r\n while ((lastResponse?.body?._links?.next?.length ?? 0) > 0) {\r\n // Get the next response\r\n const nextLinks = lastResponse.body?._links.next;\r\n const nextLink = nextLinks ? nextLinks[0]: undefined;\r\n const nextHref = nextLink?.href;\r\n if (nextHref) {\r\n lastResponse = await this.getListByUri<TListDto>(nextHref, parameters, headers);\r\n\r\n if (!lastResponse.ok || ProblemDetails.isProblemDetails(lastResponse.body) || !lastResponse.body)\r\n return lastResponse;\r\n\r\n // Combine the embedded items\r\n lastResponse.body?._embedded?.items?.forEach(r => items.push(r));\r\n }\r\n }\r\n\r\n // We combined everything, so there is just one big page\r\n response.body.totalPages = 1;\r\n response.body._links.next = undefined;\r\n\r\n return response;\r\n }\r\n\r\n public async getSingle(relOrUri: string, id?: number, headers?: HttpHeaders, curie?: string): Promise<HttpResponse<Resource | ProblemDetails>> {\r\n let uri;\r\n if (relOrUri.startsWith('http')) {\r\n if (id !== undefined)\r\n throw new Error('When supplying a URI, an ID cannot be supplied too.');\r\n if (curie)\r\n throw new Error('When supplying a URI, a curie cannot be supplied too.');\r\n\r\n uri = relOrUri;\r\n }\r\n else {\r\n if (!_.isNumber(id))\r\n throw new Error('When supplying a rel, an ID must be supplied too.');\r\n\r\n const link = this.getLinkFromHome(relOrUri, LinkNames.get, curie);\r\n uri = link.fillTemplate({ id: id.toString() });\r\n }\r\n\r\n const defaultHeaders = RESTworldClient.createHeaders('application/hal+json', this._options.Version);\r\n const combinedHeaders = RESTworldClient.combineHeaders(headers, defaultHeaders, false);\r\n const response = await this.halClient.get(uri, Resource, ProblemDetails, combinedHeaders);\r\n\r\n return response;\r\n }\r\n\r\n public async save(resource: Resource): Promise<HttpResponse<Resource | ProblemDetails>> {\r\n const saveLink = resource.findLink('save');\r\n if (!saveLink)\r\n throw new Error(`The resource ${resource} does not have a save link.`);\r\n if (!saveLink.name)\r\n throw new Error(`The save link ${saveLink} does not have a save name.`);\r\n\r\n const uri = saveLink.href;\r\n const method = saveLink.name.toLowerCase();\r\n const header = RESTworldClient.createHeaders('application/hal+json', this._options.Version);\r\n\r\n let response;\r\n switch (method) {\r\n case 'put':\r\n response = await this.halClient.put(uri, resource, Resource, ProblemDetails, header);\r\n break;\r\n case 'post':\r\n response = await this.halClient.post(uri, resource, Resource, ProblemDetails, header);\r\n break;\r\n default:\r\n throw new Error(`'${method}' is not allowed as link name for the save link. Only 'POST' and 'PUT' are allowed.`);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async getAllForms(resource: Resource): Promise<HttpResponse<FormsResource | ProblemDetails>[]> {\r\n const urls = resource.getFormLinkHrefs();\r\n const header = RESTworldClient.createHeaders('application/prs.hal-forms+json', this._options.Version);\r\n const formsPromises = urls.map(url => this._halClient.get(url, FormsResource, ProblemDetails, header));\r\n const formsAndProblems = await Promise.all(formsPromises);\r\n return formsAndProblems;\r\n }\r\n\r\n public async submit(template: Template, formValues: {}): Promise<HttpResponse<FormsResource | ProblemDetails>> {\r\n const uri = template.target || '';\r\n const method = template.method?.toLowerCase();\r\n const header = RESTworldClient.createHeaders('application/prs.hal-forms+json', this._options.Version);\r\n\r\n let response;\r\n switch (method) {\r\n case 'put':\r\n response = await this.halClient.put(uri, formValues, FormsResource, ProblemDetails, header);\r\n break;\r\n case 'post':\r\n response = await this.halClient.post(uri, formValues, FormsResource, ProblemDetails, header);\r\n break;\r\n default:\r\n response = await this.halClient.get(uri, FormsResource, ProblemDetails, header);\r\n }\r\n\r\n return response;\r\n\r\n }\r\n\r\n public async delete(resource: Resource): Promise<HttpResponse<void | ProblemDetails>> {\r\n const deleteLink = resource.findLink('delete');\r\n if (!deleteLink)\r\n throw new Error(`The resource ${resource} does not have a delete link.`);\r\n const uri = deleteLink.href;\r\n const header = RESTworldClient.createHeaders('application/hal+json', this._options.Version);\r\n\r\n const response = await this.halClient.delete(uri, ProblemDetails, header);\r\n\r\n return response;\r\n }\r\n\r\n public getAllLinksFromHome(): { [rel: string]: Link[] | undefined; } {\r\n if (!this._homeResource)\r\n throw new Error('Home resource is not set. Call ensureHomeResourceIsSet() first.');\r\n\r\n return this._homeResource._links;\r\n }\r\n\r\n public getLinkFromHome(rel: string, name?: string, curie?: string): Link {\r\n const links = this.getLinksFromHome(rel, curie);\r\n\r\n const link = name ? links.find(l => l.name === name) : links[0];\r\n\r\n if (!link)\r\n throw new Error(`The home resource does not have a link with the rel '${this.getFullRel(rel, curie)}' and the name '${name}'.`);\r\n\r\n return link;\r\n }\r\n\r\n public getLinksFromHome(rel: string, curie?: string): Link[] {\r\n if (!this._homeResource)\r\n throw new Error('Home resource is not set. Call ensureHomeResourceIsSet() first.');\r\n\r\n const fullRel = this.getFullRel(rel, curie);\r\n const links = this._homeResource._links[fullRel];\r\n if (!links || links.length === 0)\r\n throw Error(`The home resource does not have a link with the rel '${fullRel}'.`);\r\n\r\n return links;\r\n }\r\n\r\n private getFullRel(rel: string, curie?: string): string {\r\n // rel already includes a curie => just return it\r\n if (rel.includes(':'))\r\n return rel;\r\n\r\n // No curie given => use default curie.\r\n if (!curie)\r\n curie = this._defaultCurie;\r\n\r\n // Combine curie and rel\r\n const fullRel = `${curie}:${rel}`;\r\n\r\n return fullRel;\r\n }\r\n\r\n private static createHeaders(mediaType?: 'application/hal+json' | 'application/prs.hal-forms+json', version?: number): HttpHeaders {\r\n if (version)\r\n return new HttpHeaders({\r\n 'Accept': `${mediaType || 'application/hal+json'}; v=${version}`,\r\n 'Content-Type': `${mediaType || 'application/hal+json'}; v=${version}`\r\n });\r\n return new HttpHeaders();\r\n }\r\n\r\n private static combineHeaders(originalHeaders: HttpHeaders | undefined, headersToAdd: HttpHeaders | undefined, overwriteExisting: boolean) {\r\n if (!headersToAdd)\r\n return originalHeaders;\r\n if (!originalHeaders)\r\n return headersToAdd;\r\n\r\n let combinedHeaders = originalHeaders;\r\n\r\n for (const key in headersToAdd.keys) {\r\n if (!combinedHeaders.has(key) || overwriteExisting) {\r\n const headerValuesToAdd = headersToAdd.getAll(key);\r\n if (headerValuesToAdd)\r\n combinedHeaders = combinedHeaders.set(key, headerValuesToAdd);\r\n }\r\n }\r\n\r\n return combinedHeaders;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { HalClient } from \"@wertzui/ngx-hal-client\";\r\nimport { RESTworldOptions } from \"../models/restworld-options\";\r\nimport { RESTworldClient } from \"./restworld-client\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RESTworldClientCollection {\r\n private readonly _clients: {\r\n [name: string]: RESTworldClient;\r\n };\r\n constructor(private _halClient: HalClient) {\r\n this._clients = {};\r\n }\r\n\r\n public containsClient(name: string): boolean {\r\n return Object.keys(this._clients).includes(name);\r\n }\r\n\r\n public async addOrGetExistingClient(name: string, options: RESTworldOptions): Promise<RESTworldClient> {\r\n if (Object.keys(this._clients).includes(name))\r\n return this.getClient(name);\r\n\r\n const client = new RESTworldClient(this._halClient, options);\r\n await client.ensureHomeResourceIsSet();\r\n this._clients[name] = client;\r\n return client;\r\n }\r\n\r\n public getClient(name: string): RESTworldClient {\r\n const client = this._clients[name];\r\n if (!client)\r\n throw new Error(`No client with the name '${name}' exists.`);\r\n\r\n return client;\r\n }\r\n\r\n public get all(): { [name: string]: RESTworldClient } {\r\n return this._clients;\r\n }\r\n}","import { HttpBackend, HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { ClientSettings } from \"../models/client-settings\";\r\nimport { RESTworldOptions } from \"../models/restworld-options\";\r\nimport { RESTworldClientCollection } from \"./restworld-client-collection\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SettingsService {\r\n private static _settings: ClientSettings | undefined;\r\n public get settings(): ClientSettings | undefined {\r\n return SettingsService._settings;\r\n }\r\n\r\n private initializing = false;\r\n private initialized = false;\r\n\r\n constructor(\r\n private _clients: RESTworldClientCollection) {\r\n }\r\n\r\n public async ensureInitialized(): Promise<void> {\r\n if (this.initializing || this.initialized)\r\n return;\r\n\r\n this.initializing = true;\r\n\r\n await SettingsService.ensureSettingsAreLoaded();\r\n await this.populateRESTworldClientCollectionFromSettings();\r\n\r\n this.initialized = true;\r\n this.initializing = false;\r\n\r\n }\r\n\r\n /**\r\n * Call this method in your main.ts before calling bootstrapModule(...)\r\n * \r\n * Example:\r\n * async function main() {\r\n * try {\r\n * await SettingsService.ensureSettingsAreLoaded();\r\n * \r\n * const providers : StaticProvider[] = [\r\n * { provide: 'BASE_URL', useFactory: getBaseUrl, deps: [] }\r\n * ];\r\n * \r\n * await platformBrowserDynamic(providers).bootstrapModule(AppModule);\r\n * }\r\n * catch (e) {\r\n * console.error(e);\r\n * }\r\n * }\r\n * \r\n * main();\r\n * */\r\n public static async ensureSettingsAreLoaded(): Promise<void> {\r\n if (SettingsService._settings === undefined) {\r\n const response = await fetch('/settings');\r\n const settings: ClientSettings = await response.json();\r\n SettingsService._settings = settings;\r\n }\r\n }\r\n\r\n private async populateRESTworldClientCollectionFromSettings(): Promise<void> {\r\n if (!this.settings?.apiUrls)\r\n return;\r\n\r\n await Promise.all(this.settings.apiUrls\r\n .map(api => this._clients.addOrGetExistingClient(api.name, new RESTworldOptions(api.url, api.version))));\r\n }\r\n\r\n}\r\n","import { AfterViewInit, Component, forwardRef, Input, OnDestroy, OnInit, QueryList, ViewChildren } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { CropperPosition, ImageCroppedEvent, ImageCropperComponent, OutputFormat } from 'ngx-image-cropper';\r\nimport { FileUpload } from 'primeng/fileupload';\r\nimport { Dialog } from 'primeng/dialog'\r\nimport { async, firstValueFrom, Subscription } from 'rxjs';\r\n\n@Component({\n selector: 'rw-image',\n templateUrl: './restworld-image-view.component.html',\n styleUrls: ['./restworld-image-view.component.css'],\n providers: [{\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => RESTWorldImageViewComponent),\r\n multi: true\r\n }]\n})\nexport class RESTWorldImageViewComponent implements ControlValueAccessor, OnInit, OnDestroy, AfterViewInit {\n\r\n private onChange?: Function;\n private _subscriptions?: Subscription[];\n\n @Input()\n public alt?: string;\n @Input()\n public accept?: string;\n @Input()\n public fileName?: string;\n @Input()\r\n public alignImage?: 'center' | 'left';\r\n @Input()\r\n public aspectRatio?: number;\r\n @Input()\r\n public backgroundColor?: string;\r\n @Input()\r\n public canvasRotation?: number;\r\n @Input()\r\n public containWithinAspectRatio?: boolean;\r\n @Input()\r\n public cropper?: CropperPosition;\r\n @Input()\r\n public cropperMaxHeight?: number;\r\n @Input()\r\n public cropperMaxWidth?: number;\r\n @Input()\r\n public cropperMinHeight?: number;\r\n @Input()\r\n public cropperMinWidth?: number;\r\n @Input()\r\n public cropperStaticHeight?: number;\r\n @Input()\r\n public cropperStaticWidth?: number;\r\n @Input()\r\n public format?: OutputFormat;\r\n @Input()\r\n public imageQuality?: number;\r\n @Input()\r\n public initialStepSize?: number;\r\n @Input()\r\n public maintainAspectRatio?: boolean;\r\n @Input()\r\n public onlyScaleDown?: boolean;\r\n @Input()\r\n public resizeToWidth?: number;\r\n @Input()\r\n public resizeToHeight?: number;\r\n @Input()\r\n public roundCropper?: boolean;\r\n\n\n\r\n @ViewChildren(FileUpload)\r\n fileUploads?: QueryList<FileUpload>;\n\n\r\n @ViewChildren(ImageCropperComponent)\n imageCroppers?: QueryList<ImageCropperComponent>;\n\n @ViewChildren(Dialog)\n dialogs?: QueryList<Dialog>;\n\n public disabled = false;\n public uri?: string | null;\r\n public tempImageFile?: File;\r\n public displayCropDialog = false;\n public tempCroppedUri?: string | null;\n\n writeValue(obj?: string | null): void {\r\n this.uri = obj;\r\n }\r\n registerOnChange(fn?: Function): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(): void {\r\n // not needed for this component, but needed to implement the interface\r\n }\r\n\r\n setDisabledState?(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n ngOnInit(): void {\r\n // If no background color is set, we set it to white.\r\n // Otherwise the color picker would show red, the input would be empty and the image cropper would show transparent.\r\n if (!this.backgroundColor)\r\n this.backgroundColor = '#ffffff';\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._subscriptions?.forEach(s => s.unsubscribe());\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // We need to trigger imageLoadedInView each time, after the opening animation of the dialog has been completed.\r\n // Otherwise the image cropper initially (and after every window resize) thinks that the image size is 0x0,\r\n // because the opening animation hast just begun when the image cropper is first shown.\r\n this.dialogs?.map(d => d.onShow.subscribe(() =>\r\n this.imageCroppers?.forEach(i => { i.imageLoadedInView(); })\r\n ));\r\n }\r\n\r\n public showCropDialog(): void {\r\n this.displayCropDialog = true;\r\n }\r\n\n public imageChanged(event: { files: File[] }): void {\r\n this.tempImageFile = event.files[0];\r\n this.showCropDialog();\r\n }\n\n public croppedImageChanged(event: ImageCroppedEvent): void {\r\n this.tempCroppedUri = event.base64;\r\n }\n\r\n public acceptCroppedImage(): void {\r\n this.uri = this.tempCroppedUri;\r\n this.onChange?.(this.uri);\r\n this.closeCropDialog();\r\n }\r\n\r\n public closeCropDialog(): void {\r\n this.fileUploads?.forEach(f => f.clear());\r\n this.displayCropDialog = false;\r\n }\n}\n","<div class=\"flex align-items-center\">\r\n <p-button *ngIf=\"!uri\" [disabled]=\"true\" icon=\"pi pi-download\" class=\"mr-1\" pTooltip=\"No image present\"></p-button>\r\n <a *ngIf=\"uri\" [href]=\"uri | safeUrl\" [download]=\"fileName || 'download'\" class=\"mr-1\" pButton pTooltip=\"Download image\" icon=\"pi pi-download\"></a>\r\n <p-fileUpload class=\"mr-1\" chooseIcon=\"pi-upload fas fa-upload\" mode=\"basic\" [auto]=\"true\" [accept]=\"accept || 'image/*'\" [customUpload]=\"true\" (uploadHandler)=\"imageChanged($event)\" pTooltip=\"Upload new image\"></p-fileUpload>\r\n <img *ngIf=\"uri\" class=\"thumbnail\" [src]=\"uri | safeUrl\" [alt]=\"alt\" (click)=\"showCropDialog()\" pTooltip=\"Zoom and crop\" />\r\n</div>\r\n\r\n<p-dialog [header]=\"alt ?? ''\" [(visible)]=\"displayCropDialog\">\r\n <image-cropper\r\n [autoCrop]=\"true\"\r\n (imageCropped)=\"croppedImageChanged($event)\"\r\n [alignImage]=\"alignImage ?? 'center'\"\r\n [aspectRatio]=\"aspectRatio ?? 1\"\r\n [backgroundColor]=\"backgroundColor ?? null\"\r\n [canvasRotation]=\"canvasRotation ?? 0\"\r\n [containWithinAspectRatio]=\"containWithinAspectRatio ?? false\"\r\n [cropper]=\"cropper ?? { x1: -100, y1: -100, x2: 10000, y2: 10000 }\"\r\n [cropperMaxHeight]=\"cropperMaxHeight ?? 0\"\r\n [cropperMaxWidth]=\"cropperMaxWidth ?? 0\"\r\n [cropperMinHeight]=\"cropperMinHeight ?? 0\"\r\n [cropperMinWidth]=\"cropperMinWidth ?? 0\"\r\n [cropperStaticHeight]=\"cropperStaticHeight ?? 0\"\r\n [cropperStaticWidth]=\"cropperStaticWidth ?? 0\"\r\n [format]=\"format ?? 'png'\"\r\n [imageQuality]=\"imageQuality ?? 92\"\r\n [initialStepSize]=\"initialStepSize ?? 3\"\r\n [maintainAspectRatio]=\"maintainAspectRatio ?? true\"\r\n [onlyScaleDown]=\"onlyScaleDown ?? false\"\r\n [resizeToWidth]=\"resizeToWidth ?? 0\"\r\n [resizeToHeight]=\"resizeToHeight ?? 0\"\r\n [roundCropper]=\"roundCropper ?? false\"\r\n [imageFile]=\"tempImageFile!\"\r\n [imageURL]=\"uri!\"\r\n ></image-cropper>\r\n <div class=\"flex justify-content-end\">\r\n <div class=\"flex-auto align-items-center\">\r\n <span>Background color: </span>\r\n <p-colorPicker [(ngModel)]=\"backgroundColor\" appendTo=\"body\" class=\"ml-1 mr-1\"></p-colorPicker>\r\n <input pInputText [(ngModel)]=\"backgroundColor\" />\r\n </div>\r\n <button type=\"button\" pButton pRipple (click)=\"acceptCroppedImage()\" class=\"mr-2\">Ok</button>\r\n <button type=\"button\" pButton pRipple (click)=\"closeCropDialog()\">Cancel</button>\r\n </div>\r\n</p-dialog>\r\n","import { Component, forwardRef, Input, QueryList, ViewChildren } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { FileUpload } from 'primeng/fileupload';\r\n\n@Component({\n selector: 'rw-file',\n templateUrl: './restworld-file-view.component.html',\n styleUrls: ['./restworld-file-view.component.css'],\n providers: [{\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => RESTWorldFileViewComponent),\r\n multi: true\r\n }]\n})\nexport class RESTWorldFileViewComponent implements ControlValueAccessor {\n private onChange?: Function;\n @Input()\n public accept?: string;\n\n @Input()\n public fileName?: string;\n\r\n @ViewChildren(FileUpload)\r\n fileUploads?: QueryList<FileUpload>;\n\n public disabled = false;\n public uri?: string;\r\n\n writeValue(obj?: string): void {\r\n this.uri = obj;\r\n }\r\n registerOnChange(fn?: Function): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(): void {\r\n // not needed for this component, but needed to implement the interface\r\n }\r\n setDisabledState?(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\n\n public fileChanged(event: { files: File[] }): void {\r\n const file = event.files[0];\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n this.uri = reader.result as string;\r\n this.onChange?.(this.uri);\r\n };\r\n\r\n reader.readAsDataURL(file);\r\n }\n}\n","<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","import { CdkDragDrop } from '@angular/cdk/drag-drop';\r\nimport { OnInit } from '@angular/core';\r\nimport { ChangeDetectorRef } from '@angular/core';\r\nimport { Component, ContentChild, Input, TemplateRef } from '@angular/core';\nimport { AbstractControl, FormArray, FormGroup } from '@angular/forms';\r\nimport { Property, PropertyType, Resource, Template, TemplateDto } from '@wertzui/ngx-hal-client';\r\nimport { MessageService } from 'primeng/api';\r\nimport { ProblemDetails } from '../../models/problem-details';\r\nimport { FormService } from '../../services/form.service';\r\nimport { RESTworldClient } from '../../services/restworld-client';\r\nimport { RESTworldClientCollection } from '../../services/restworld-client-collection';\r\n\n@Component({\n selector: 'rw-form',\n templateUrl: './restworld-edit-form.component.html',\n styleUrls: ['./restworld-edit-form.component.css']\n})\nexport class RestworldEditFormComponent implements OnInit {\n @Input()\n formGroup!: FormGroup;\n\n @Input()\n template!: Template;\n\n @Input()\n apiName?: string;\n\n @ContentChild('inputOptionsSingle', { static: false })\n inputOptionsSingleRef?: TemplateRef<unknown>;\n\n @ContentChild('inputOptionsMultiple', { static: false })\n inputOptionsMultipleRef?: TemplateRef<unknown>;\n\n @ContentChild('inputOptions', { static: false })\n inputOptionsRef?: TemplateRef<unknown>;\n\n @ContentChild('inputHidden', { static: false })\n inputHiddenRef?: TemplateRef<unknown>;\n\n @ContentChild('inputText', { static: false })\n inputTextRef?: TemplateRef<unknown>;\n\n @ContentChild('inputTextarea', { static: false })\n inputTextareaRef?: TemplateRef<unknown>;\n\n @ContentChild('inputSearch', { static: false })\n inputSearchRef?: TemplateRef<unknown>;\n\n @ContentChild('inputTel', { static: false })\n inputTelRef?: TemplateRef<unknown>;\n\n @ContentChild('inputUrl', { static: false })\n inputUrlRef?: TemplateRef<unknown>;\n\n @ContentChild('inputEmail', { static: false })\n inputEmailRef?: TemplateRef<unknown>;\n\n @ContentChild('inputPassword', { static: false })\n inputPasswordRef?: TemplateRef<unknown>;\n\n @ContentChild('inputDate', { static: false })\n inputDateRef?: TemplateRef<unknown>;\n\n @ContentChild('inputMonth', { static: false })\n inputMonthRef?: TemplateRef<unknown>;\n\n @ContentChild('inputWeek', { static: false })\n inputWeekRef?: TemplateRef<unknown>;\n\n @ContentChild('inputTime', { static: false })\n inputTimeRef?: TemplateRef<unknown>;\n\n @ContentChild('inputDatetimeLocal', { static: false })\n inputDatetimeLocalRef?: TemplateRef<unknown>;\n\n @ContentChild('inputNumber', { static: false })\n inputNumberRef?: TemplateRef<unknown>;\n\n @ContentChild('inputRange', { static: false })\n inputRangeRef?: TemplateRef<unknown>;\n\n @ContentChild('inputColor', { static: false })\n inputColorRef?: TemplateRef<unknown>;\n\n @ContentChild('inputBool', { static: false })\n inputBoolRef?: TemplateRef<unknown>;\n\n @ContentChild('inputDatetimeOffset', { static: false })\n inputDatetimeOffsetRef?: TemplateRef<unknown>;\n\n @ContentChild('inputDuration', { static: false })\n inputDurationRef?: TemplateRef<unknown>;\n\n @ContentChild('inputImage', { static: false })\n inputImageRef?: TemplateRef<unknown>;\n\n @ContentChild('inputFile', { static: false })\n inputFileRef?: TemplateRef<unknown>;\n\n @ContentChild('inputObject', { static: false })\n inputObjectRef?: TemplateRef<unknown>;\n\n @ContentChild('inputCollection', { static: false })\n inputCollectionRef?: TemplateRef<unknown>;\n\n @ContentChild('inputDefault', { static: false })\n inputDefaultRef?: TemplateRef<unknown>;\n\n public get PropertyType() {\r\n return PropertyType;\r\n }\r\n\r\n public get dateFormat(): string {\r\n return new Date(3333, 10, 22)\r\n .toLocaleDateString()\r\n .replace(\"22\", \"dd\")\r\n .replace(\"11\", \"mm\")\r\n .replace(\"3333\", \"yy\")\r\n .replace(\"33\", \"y\");\r\n }\n\n public FormGroup = FormGroup;\n public FormArray = FormArray;\n public Number = Number;\n\n constructor(\n private _formService: FormService,\n private _changeDetectorRef: ChangeDetectorRef,\r\n private _messageService: MessageService,\r\n private _clients: RESTworldClientCollection\n ) { }\n\n ngOnInit(): void {\r\n if (!this.formGroup)\r\n throw new Error(\"[formGroup] is required on <rw-form>\");\r\n if (!this.template)\r\n throw new Error(\"[template] is required on <rw-form>\");\r\n if (!this.apiName)\r\n throw new Error(\"[apiName] is required on <rw-form>\");\r\n }\r\n\n public getTooltip(resource: Resource, keysToExclude?: string[]): string {\n const tooltip = Object.entries(resource)\n .filter(([key]) => !(key.startsWith('_') || ['createdAt', 'createdBy', 'lastChangedAt', 'lastChangedBy', 'timestamp'].includes(key) || keysToExclude?.includes(key)))\n .reduce((prev, [key, value], index) => `${prev}${index === 0 ? '' : '\\n'}${key}: ${RestworldEditFormComponent.jsonStringifyWithElipsis(value)}`, '');\n\n return tooltip;\n }\n\n private static jsonStringifyWithElipsis(value: unknown) {\n const maxLength = 200;\n const end = 10;\n const start = maxLength - end - 2;\n const json = JSON.stringify(value);\n const shortened = json.length > maxLength ? json.substring(0, start) + '…' + json.substring(json.length - end) : json;\n\n return shortened;\n }\n\n public getCollectionEntryTemplates(property?: Property): Template[] {\n if (!property)\r\n return [];\r\n\r\n return Object.entries(property._templates)\r\n .filter(([key,]) => Number.isInteger(Number.parseInt(key)))\r\n .map(([, value]) => value);\r\n }\n\n public addNewItemToCollection(property: Property, formArray: FormArray | AbstractControl): void {\n if (!(formArray instanceof FormArray))\n throw new Error('formArray is not an instance of FormArray.');\r\n\r\n const maxIndex = Math.max(...Object.keys(property._templates)\r\n .map(key => Number.parseInt(key))\r\n .filter(key => Number.isSafeInteger(key)));\r\n const nextIndex = maxIndex < 0 ? 0 : maxIndex + 1;\n\n const defaultTemplate = property._templates['default'];\r\n const copiedTemplateDto = JSON.parse(JSON.stringify(defaultTemplate)) as TemplateDto;\r\n const copiedTemplate = new Template(copiedTemplateDto);\r\n copiedTemplate.title = nextIndex.toString();\r\n\r\n property._templates[copiedTemplate.title] = copiedTemplate;\r\n formArray.push(this._formService.createFormGroupFromTemplate(defaultTemplate));\r\n }\n\n public deleteItemFromCollection(property: Property, formArray: FormArray | AbstractControl, template: Template): void {\n if (!template.title)\n throw new Error(`Cannot delete the item, because the template '${template}' does not have a title.`);\n\n if (!(formArray instanceof FormArray))\n throw new Error('formArray is not an instance of FormArray.');\n\n const templates = property._templates;\r\n delete templates[template.title];\r\n\r\n formArray.removeAt(Number.parseInt(template.title));\r\n }\n\n public collectionItemDropped($event: CdkDragDrop<{ property: Property; formArray: FormArray }>) {\n const formArray = $event.container.data.formArray;\r\n const previousIndex = $event.previousIndex;\r\n const currentIndex = $event.currentIndex;\r\n const movementDirection = currentIndex > previousIndex ? 1 : -1;\r\n\r\n // Move in FormArray\r\n // We do not need to move the item in the _templates object\r\n const movedControl = formArray.at(previousIndex);\r\n for (let i = previousIndex; i * movementDirection < currentIndex * movementDirection; i = i + movementDirection) {\r\n formArray.setControl(i, formArray.at(i + movementDirection));\r\n }\r\n formArray.setControl(currentIndex, movedControl);\r\n\r\n this._changeDetectorRef.markForCheck();\r\n\r\n console.log($event);\r\n }\n\r\n\r\n public async onOptionsFiltered(property: Property, event: { originalEvent: unknown; filter: string | null }) {\r\n const options = property?.options;\r\n\r\n if (!options?.link?.href || !event.filter || event.filter === '')\r\n return;\r\n\r\n\r\n const templatedUri = options.link.href;\r\n let filter = `contains(${options.promptField}, '${event.filter}')`;\r\n if (options.valueField?.toLowerCase() === 'id' && !Number.isNaN(Number.parseInt(event.filter)))\r\n filter = `(${options.valueField} eq ${event.filter}) or (${filter})`;\r\n\r\n const response = await this.getClient().getListByUri(templatedUri, { $filter: filter, $top: 10 });\r\n if (!response.ok || ProblemDetails.isProblemDetails(response.body) || !response.body) {\r\n const message = `An error occurred while getting the filtered items.`;\r\n this._messageService.add({ severity: 'error', summary: 'Error', detail: message, data: response });\r\n return;\r\n }\r\n\r\n const items = response.body._embedded.items;\r\n options.inline = items;\r\n }\r\n\r\n private getClient(): RESTworldClient {\r\n if (!this.apiName)\r\n throw new Error('Cannot get a client, because the apiName is not set.');\r\n\r\n return this._clients.getClient(this.apiName);\r\n }\n}\n","<div *ngFor=\"let property of template.properties\" class=\"grid field\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"property.type !== PropertyType.Hidden\" [attr.for]=\"property.name\" class=\"col-12 mb-2 md:col-2 md:mb-0\" [class.p-disabled]=\"property.readOnly\" [class.hasChildren]=\"property._templates\">{{property.prompt || property.name}}</label>\r\n <div class=\"col-12 md:col-10\">\r\n\r\n <ng-template #defaultInputOptions let-property=\"property\" let-template=\"template\">\r\n\r\n <ng-template #defaultInputOptionsSingle let-property=\"property\" let-template=\"template\">\r\n <p-dropdown [formControlName]=\"property.name\" [id]=\"property.name\" [options]=\"property.options.inline\" [filterBy]=\"(property.options.promptField || 'prompt') + ',' + (property.options.valueField || 'value')\" [optionValue]=\"property.options.valueField || 'value'\" [readonly]=\"property.readOnly\" [required]=\"property.required || property.options.minItems > 0\" [filter]=\"true\" [autoDisplayFirst]=\"false\" [showClear]=\"!property.required || property.options.minItems <= 0\" (onFilter)=\"onOptionsFiltered(property, $event)\" styleClass=\"w-full\" [filterPlaceholder]=\"property?.options?.link?.href ? 'search for more results' : ''\">\r\n <ng-template let-item pTemplate=\"selectedItem\">\r\n <span [pTooltip]=\"getTooltip(item, [property.options.promptField || 'prompt', property.options.valueField || 'value'])\">{{item[property.options.promptField || 'prompt']}} ({{item[property.options.valueField || 'value']}})</span>\r\n </ng-template>\r\n <ng-template let-item pTemplate=\"item\">\r\n <span [pTooltip]=\"getTooltip(item, [property.options.promptField || 'prompt', property.options.valueField || 'value'])\">{{item[property.options.promptField || 'prompt']}} ({{item[property.options.valueField || 'value']}})</span>\r\n </ng-template>\r\n </p-dropdown>\r\n </ng-template>\r\n <ng-container *ngIf=\"!property.options.maxItems || property.options.maxItems == 1\">\r\n <ng-container *ngTemplateOutlet=\"inputOptionsSingleRef || defaultInputOptionsSingle; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #defaultInputOptionsMultiple let-property=\"property\" let-template=\"template\">\r\n <p-multiSelect [formControlName]=\"property.name\" [id]=\"property.name\" [options]=\"property.options.inline\" [optionLabel]=\"property.options.promptField || 'prompt'\" [optionValue]=\"property.options.valueField || 'value'\" [readonly]=\"property.readOnly\" [selectionLimit]=\"property.options.maxItems\" [required]=\"property.required || property.options.minItems > 0\"></p-multiSelect>\r\n </ng-template>\r\n <ng-container *ngIf=\"property.options.maxItems > 1\">\r\n <ng-container *ngTemplateOutlet=\"inputOptionsMultipleRef || defaultInputOptionsMultiple; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n </ng-template>\r\n <ng-container *ngIf=\"property.options\">\r\n <ng-container *ngTemplateOutlet=\"inputOptionsRef || defaultInputOptions; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n <div *ngIf=\"!property.options\">\r\n <div [ngSwitch]=\"property.type\">\r\n\r\n <ng-template #defaultInputHidden let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"hidden\" [value]=\"property.value\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Hidden\">\r\n <ng-container *ngTemplateOutlet=\"inputHiddenRef || defaultInputHidden; context:{ property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #defaultInputText let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"text\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Text\">\r\n <ng-container *ngTemplateOutlet=\"inputTextRef || defaultInputText; context:{ property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputTextarea let-property=\"property\" let-template=\"template\">\r\n <textarea [formControlName]=\"property.name\" [id]=\"property.name\" pInputTextarea class=\"w-full p-inputtextarea p-inputtext p-component p-element\" [class.p-disabled]=\"property.readOnly\" [cols]=\"property.cols\" [rows]=\"property.rows\"></textarea>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Textarea\">\r\n <ng-container *ngTemplateOutlet=\"inputTextareaRef || defaultInputTextarea; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputSearch let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"search\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Search\">\r\n <ng-container *ngTemplateOutlet=\"inputSearchRef || defaultInputSearch; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputTel let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"tel\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Tel\">\r\n <ng-container *ngTemplateOutlet=\"inputTelRef || defaultInputTel; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputUrl let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"url\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Url\">\r\n <ng-container *ngTemplateOutlet=\"inputUrlRef || defaultInputUrl; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputEmail let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"email\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Email\">\r\n <ng-container *ngTemplateOutlet=\"inputEmailRef || defaultInputEmail; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputPassword let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"password\" pPassword class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Password\">\r\n <ng-container *ngTemplateOutlet=\"inputPasswordRef || defaultInputPassword; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDate let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showWeek]=\"true\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Date\">\r\n <ng-container *ngTemplateOutlet=\"inputDateRef || defaultInputDate; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputMonth let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showWeek]=\"false\" view=\"month\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Month\">\r\n <ng-container *ngTemplateOutlet=\"inputMonthRef || defaultInputMonth; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputWeek let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"week\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Week\">\r\n <ng-container *ngTemplateOutlet=\"inputWeekRef || defaultInputWeek; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputTime let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [timeOnly]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Time\">\r\n <ng-container *ngTemplateOutlet=\"inputTimeRef || defaultInputTime; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDatetimeLocal let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.DatetimeLocal\">\r\n <ng-container *ngTemplateOutlet=\"inputDatetimeLocalRef || defaultInputDatetimeLocal; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputNumber let-property=\"property\" let-template=\"template\">\r\n <p-inputNumber [formControlName]=\"property.name\" [id]=\"property.name\" mode=\"decimal\" [showButtons]=\"!property.readOnly\" class=\"w-full\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-inputNumber>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Number\">\r\n <ng-container *ngTemplateOutlet=\"inputNumberRef || defaultInputNumber; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputRange let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"range\" [min]=\"property.min\" [max]=\"property.max\" [step]=\"property.step\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Range\">\r\n <ng-container *ngTemplateOutlet=\"inputRangeRef || defaultInputRange; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputColor let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"color\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Color\">\r\n <ng-container *ngTemplateOutlet=\"inputColorRef || defaultInputColor; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputBool let-property=\"property\" let-template=\"template\" let-formGroup=\"formGroup\">\r\n <p-checkbox *ngIf=\"property.required\" [binary]=\"true\" [formControl]=\"formGroup.controls[property.name]\" [id]=\"property.name\" [readonly]=\"property.readOnly\"></p-checkbox>\r\n <p-triStateCheckbox *ngIf=\"!property.required\" [formControl]=\"formGroup.controls[property.name]\" [id]=\"property.name\" [readonly]=\"property.readOnly\"></p-triStateCheckbox>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Bool\">\r\n <ng-container *ngTemplateOutlet=\"inputBoolRef || defaultInputBool; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDatetimeOffset let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.DatetimeOffset\">\r\n <ng-container *ngTemplateOutlet=\"inputDatetimeOffsetRef || defaultInputDatetimeOffset; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDuration let-property=\"property\" let-template=\"template\">\r\n <p-calendar *ngSwitchCase=\"PropertyType.Duration\" [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [timeOnly]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Duration\">\r\n <ng-container *ngTemplateOutlet=\"inputDurationRef || defaultInputDuration; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputImage let-property=\"property\" let-template=\"template\">\r\n <rw-image\r\n [formControlName]=\"property.name\"\r\n [accept]=\"property.restWorldImage.accept ?? property.placeholder ?? 'image/*'\"\r\n [alignImage]=\"property.restWorldImage.alignImage\"\r\n [alt]=\"property.prompt ?? property.name\"\r\n [aspectRatio]=\"property.restWorldImage.aspectRatio\"\r\n [backgroundColor]=\"property.restWorldImage.backgroundColor\"\r\n [canvasRotation]=\"property.restWorldImage.canvasRotation\"\r\n [containWithinAspectRatio]=\"property.restWorldImage.containWithinAspectRatio\"\r\n [cropper]=\"property.restWorldImage.cropper\"\r\n [cropperMaxHeight]=\"property.restWorldImage.cropperMaxHeight\"\r\n [cropperMaxWidth]=\"property.restWorldImage.cropperMaxWidth\"\r\n [cropperMinHeight]=\"property.restWorldImage.cropperMinHeight\"\r\n [cropperMinWidth]=\"property.restWorldImage.cropperMinWidth\"\r\n [cropperStaticHeight]=\"property.restWorldImage.cropperStaticHeight\"\r\n [cropperStaticWidth]=\"property.restWorldImage.cropperStaticWidth\"\r\n [fileName]=\"property.name + '.' + (property.restWorldImage.format ?? 'png')\"\r\n [format]=\"property.restWorldImage.format\"\r\n [imageQuality]=\"property.restWorldImage.imageQuality\"\r\n [initialStepSize]=\"property.restWorldImage.initialStepSize\"\r\n [maintainAspectRatio]=\"property.restWorldImage.maintainAspectRatio\"\r\n [onlyScaleDown]=\"property.restWorldImage.onlyScaleDown\"\r\n [resizeToWidth]=\"property.restWorldImage.resizeToWidth\"\r\n [resizeToHeight]=\"property.restWorldImage.resizeToHeight\"\r\n [roundCropper]=\"property.restWorldImage.roundCropper\"></rw-image>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Image\">\r\n <ng-container *ngTemplateOutlet=\"inputImageRef || defaultInputImage; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputFile let-property=\"property\" let-template=\"template\">\r\n <rw-file [formControlName]=\"property.name\" [fileName]=\"property.name\" [accept]=\"property.placeholder\"></rw-file>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.File\">\r\n <ng-container *ngTemplateOutlet=\"inputFileRef || defaultInputFile; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputObject let-property=\"property\" let-template=\"template\">\r\n <div class=\"flex align-items-center\">\r\n <div class=\"brace\">\r\n </div>\r\n <div class=\"w-full\">\r\n <rw-form [formGroup]=\"(formGroup.controls[property.name] | as : FormGroup)\" [template]=\"property._templates.default\" [apiName]=\"apiName\"></rw-form>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Object\">\r\n <ng-container *ngTemplateOutlet=\"inputObjectRef || defaultInputObject; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputCollection let-property=\"property\" let-template=\"template\">\r\n <div class=\"flex align-items-center\">\r\n <div class=\"brace\">\r\n </div>\r\n <div class=\"w-full\" cdkDropList [cdkDropListData]=\"{ property: property, formArray: (formGroup.controls[property.name] | as : FormArray)}\" (cdkDropListDropped)=\"collectionItemDropped($event)\">\r\n <div *ngFor=\"let template of getCollectionEntryTemplates(property)\" class=\"flex align-items-center\" cdkDrag>\r\n <i class=\"fas fa-grip-lines\" cdkDragHandle></i>\r\n <div class=\"brace\">\r\n </div>\r\n <div class=\"w-full flex justify-content-end\">\r\n <rw-form [formGroup]=\"((formGroup.controls[property.name] | as : FormArray).controls[Number.parseInt(template.title!)] | as : FormGroup)\" [template]=\"template\" [apiName]=\"apiName\" class=\"w-full\"></rw-form>\r\n <button pButton pRipple type=\"button\" icon=\"fas fa-trash\" class=\"p-button-outlined p-button-danger ml-2 mb-3\" (click)=\"deleteItemFromCollection(property, formGroup.controls[property.name], template)\"></button>\r\n </div>\r\n </div>\r\n <div class=\"flex justify-content-end w-full\">\r\n <button pButton pRipple type=\"button\" icon=\"fas fa-plus\" class=\"p-button-outlined p-button-info\" (click)=\"addNewItemToCollection(property, formGroup.controls[property.name])\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Collection\">\r\n <ng-container *ngTemplateOutlet=\"inputCollectionRef || defaultInputCollection; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDefault let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"text\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngTemplateOutlet=\"inputDefaultRef || defaultInputDefault; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n <val-errors [controlName]=\"property.name || null\">\r\n <ng-template valError=\"required\">The field '{{property.prompt || property.name}}' is required.</ng-template>\r\n <ng-template valError=\"email\">The email must be a valid email address.</ng-template>\r\n <ng-template valError=\"min\" let-error=\"error\">'{{property.prompt || property.name}}' must be equal or greater than or equal to {{ error.min }}.</ng-template>\r\n <ng-template valError=\"max\" let-error=\"error\">'{{property.prompt || property.name}}' must be smaller than or equal to {{ error.max }}.</ng-template>\r\n <ng-template valError=\"minlength\" let-error=\"error\">The length of '{{property.prompt || property.name}}' must be equal or greater than or equal to {{ error.requiredLength }}.</ng-template>\r\n <ng-template valError=\"maxlength\" let-error=\"error\">The length of '{{property.prompt || property.name}}' must be shorter than or equal to {{ error.requiredLength }}.</ng-template>\r\n <ng-template valError=\"pattern\" let-error=\"error\">The value for '{{property.prompt || property.name}}' does not match the pattern {{ error }}.</ng-template>\r\n <ng-template valError=\"remote\" let-error=\"error\">{{ error }}</ng-template>\r\n </val-errors>\r\n </div>\r\n</div>\r\n","import { Component, Input } from '@angular/core';\r\nimport { PropertyType, Resource, Template, Templates, FormsResource, Property } from '@wertzui/ngx-hal-client';\r\nimport { RESTworldClient } from '../../services/restworld-client';\r\nimport { RESTworldClientCollection } from '../../services/restworld-client-collection';\r\nimport { AbstractControl, FormArray, FormControl, FormGroup } from '@angular/forms';\r\nimport { ConfirmationService, MessageService } from 'primeng/api';\r\nimport { Location } from '@angular/common';\r\nimport { Router } from '@angular/router';\r\nimport { ProblemDetails } from '../../models/problem-details';\r\nimport { ContentChild } from '@angular/core';\r\nimport { TemplateRef } from '@angular/core';\r\nimport { ValdemortConfig } from 'ngx-valdemort';\r\nimport { FormService } from '../../services/form.service';\r\n\r\n@Component({\r\n selector: 'rw-edit',\r\n templateUrl: './restworld-edit-view.component.html',\r\n styleUrls: ['./restworld-edit-view.component.css']\r\n})\r\nexport class RESTworldEditViewComponent {\r\n public get PropertyType() {\r\n return PropertyType;\r\n }\r\n public get templates() {\r\n return this._templates;\r\n }\r\n private _templates: Templates = {};\r\n\r\n public get isLoadingForTheFirstTime() {\r\n return Object.keys(this.templates).length === 0 && this.isLoading;\r\n }\r\n\r\n public get formTabs() {\r\n return this._formTabs;\r\n }\r\n private _formTabs: { [name: string]: FormGroup } = {};\r\n\r\n @Input()\r\n public set apiName(value: string | undefined) {\r\n this._apiName = value;\r\n this.load();\r\n }\r\n public get apiName(): string | undefined {\r\n return this._apiName;\r\n }\r\n private _apiName?: string;\r\n //@Input()\r\n //public set rel(value: string | undefined) {\r\n // this._rel = value;\r\n //}\r\n //public get rel(): string | undefined {\r\n // return this._rel;\r\n //}\r\n //private _rel?: string;\r\n @Input()\r\n public set uri(value: string | undefined) {\r\n this._uri = value;\r\n this.load();\r\n }\r\n public get uri(): string | undefined {\r\n return this._uri;\r\n }\r\n private _uri?: string;\r\n\r\n public get resource() {\r\n return this._resource;\r\n }\r\n private _resource?: Resource;\r\n public isLoading = false;\r\n public get canSave() {\r\n const length = this.resource?._links[\"save\"]?.length;\r\n return length !== undefined && length > 0;\r\n }\r\n public get canDelete() {\r\n const length = this.resource?._links[\"delete\"]?.length;\r\n return length !== undefined && length > 0;\r\n }\r\n public canSubmit(templateName: string) {\r\n const form = this.formTabs[templateName];\r\n return form && form.valid;\r\n }\r\n\r\n @ContentChild('extraTabs', { static: false })\r\n extraTabsRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('buttons', { static: false })\r\n buttonsRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputOptionsSingle', { static: false })\r\n inputOptionsSingleRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputOptionsMultiple', { static: false })\r\n inputOptionsMultipleRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputOptions', { static: false })\r\n inputOptionsRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputHidden', { static: false })\r\n inputHiddenRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputText', { static: false })\r\n inputTextRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputTextarea', { static: false })\r\n inputTextareaRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputSearch', { static: false })\r\n inputSearchRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputTel', { static: false })\r\n inputTelRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputUrl', { static: false })\r\n inputUrlRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputEmail', { static: false })\r\n inputEmailRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputPassword', { static: false })\r\n inputPasswordRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputDate', { static: false })\r\n inputDateRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputMonth', { static: false })\r\n inputMonthRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputWeek', { static: false })\r\n inputWeekRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputTime', { static: false })\r\n inputTimeRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputDatetimeLocal', { static: false })\r\n inputDatetimeLocalRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputNumber', { static: false })\r\n inputNumberRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputRange', { static: false })\r\n inputRangeRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputColor', { static: false })\r\n inputColorRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputBool', { static: false })\r\n inputBoolRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputDatetimeOffset', { static: false })\r\n inputDatetimeOffsetRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputDuration', { static: false })\r\n inputDurationRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputImage', { static: false })\r\n inputImageRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputFile', { static: false })\r\n inputFileRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputDefault', { static: false })\r\n inputDefaultRef?: TemplateRef<unknown>;\r\n\r\n constructor(\r\n private _clients: RESTworldClientCollection,\r\n private _confirmationService: ConfirmationService,\r\n private _messageService: MessageService,\r\n private _location: Location,\r\n private _router: Router,\r\n private _formService: FormService,\r\n valdemortConfig: ValdemortConfig) {\r\n valdemortConfig.errorClasses = 'p-error text-sm';\r\n }\r\n\r\n public getTooltip(resource: Resource, keysToExclude?: string[]): string {\r\n const tooltip = Object.entries(resource)\r\n .filter(([key]) => !(key.startsWith('_') || ['createdAt', 'createdBy', 'lastChangedAt', 'lastChangedBy', 'timestamp'].includes(key) || keysToExclude?.includes(key)))\r\n .reduce((prev, [key, value], index) => `${prev}${index === 0 ? '' : '\\n'}${key}: ${RESTworldEditViewComponent.jsonStringifyWithElipsis(value)}`, '');\r\n\r\n return tooltip;\r\n }\r\n\r\n private static jsonStringifyWithElipsis(value: unknown) {\r\n const maxLength = 200;\r\n const end = 10;\r\n const start = maxLength - end - 2;\r\n const json = JSON.stringify(value);\r\n const shortened = json.length > maxLength ? json.substring(0, start) + '…' + json.substring(json.length - end) : json;\r\n\r\n return shortened;\r\n }\r\n\r\n private getClient(): RESTworldClient {\r\n if (!this.apiName)\r\n throw new Error('Cannot get a client, because the apiName is not set.');\r\n\r\n return this._clients.getClient(this.apiName);\r\n }\r\n\r\n public async submit(templateName: string, template: Template, formValue: {}) {\r\n this.isLoading = true;\r\n\r\n try {\r\n const targetBeforeSave = template.target;\r\n const response = await this.getClient().submit(template, formValue);\r\n\r\n if (!response.ok) {\r\n let summary = 'Error';\r\n let detail = 'Error while saving the resource.';\r\n if (ProblemDetails.isProblemDetails(response.body)) {\r\n const problemDetails = response.body as ProblemDetails;\r\n summary = problemDetails.title || summary;\r\n detail = problemDetails.detail || detail;\r\n // display validation errors\r\n if (problemDetails['errors'] as {}) {\r\n const form = this.formTabs[templateName];\r\n for (const [key, errorsForKey] of Object.entries(problemDetails['errors'] as {})) {\r\n const path = key.split(/\\.|\\[/).map(e => e.replace(\"]\", \"\"));\r\n // The path might start with a $, indicating the root.\r\n if (path.length > 0 && path[0] === '$')\r\n path.shift();\r\n const formControl = path.reduce<AbstractControl>(RESTworldEditViewComponent.getSubControl, form);\r\n formControl.setErrors({ ...formControl.errors, ...{ remote: errorsForKey } });\r\n formControl.markAsTouched();\r\n }\r\n }\r\n }\r\n\r\n this._messageService.add({ severity: 'error', summary: summary, detail: detail, data: response, life: 10000 });\r\n }\r\n else {\r\n const responseResource = (response.body as FormsResource);\r\n const targetAfterSave = responseResource._templates[templateName].target;\r\n\r\n setTimeout(() =>\r\n this._messageService.add({ severity: 'success', summary: 'Saved', detail: 'The resource has been saved.' }),\r\n 100);\r\n\r\n if (targetBeforeSave !== targetAfterSave) {\r\n this._router.navigate(['/edit', this.apiName, responseResource._links.self[0].href]);\r\n }\r\n }\r\n\r\n }\r\n catch (e: unknown) {\r\n this._messageService.add({ severity: 'error', summary: 'Error', detail: `An unknown error occurred. ${JSON.stringify(e)}`, life: 10000 });\r\n console.log(e);\r\n }\r\n\r\n this.isLoading = false;\r\n }\r\n\r\n private static getSubControl(control: AbstractControl, pathElement: string): AbstractControl {\r\n if (control instanceof FormGroup)\r\n return control.controls[pathElement];\r\n if (control instanceof FormArray) {\r\n const index = Number.parseInt(pathElement);\r\n if (Number.isInteger(index))\r\n return control.controls[index];\r\n }\r\n return control;\r\n }\r\n\r\n public showDeleteConfirmatioModal() {\r\n this._confirmationService.confirm({\r\n message: 'Do you really want to delete this resource?',\r\n header: 'Confirm delete',\r\n icon: 'far fa-trash-alt',\r\n accept: () => this.delete()\r\n });\r\n }\r\n\r\n public async delete(): Promise<void> {\r\n if (!this.apiName || !this.uri || !this.resource)\r\n return;\r\n\r\n Object.assign(this.resource, this.formTabs.value);\r\n\r\n await this.getClient().delete(this.resource);\r\n setTimeout(() =>\r\n this._messageService.add({ severity: 'success', summary: 'Deleted', detail: 'The resource has been deleted.' }),\r\n 100);\r\n\r\n this._location.back();\r\n }\r\n\r\n public async load(): Promise<void> {\r\n if (!this.apiName || !this.uri)\r\n return;\r\n\r\n this.isLoading = true;\r\n\r\n const response = await this.getClient().getSingle(this.uri);\r\n if (!response.ok || ProblemDetails.isProblemDetails(response.body) || !response.body) {\r\n this._messageService.add({ severity: 'error', summary: 'Error', detail: 'Error while loading the resource from the API.', data: response });\r\n }\r\n else {\r\n this._resource = response.body;\r\n this._templates = await this.getAllTemplates(this._resource);\r\n this._formTabs = this._formService.createFormGroupsFromTemplates(this._templates);\r\n }\r\n\r\n this.isLoading = false;\r\n }\r\n\r\n private async setInitialSelectedOptionsElementsForTemplates(templates: Templates): Promise<void> {\r\n await Promise.all(Object.values(templates)\r\n .map(template => this.setInitialSelectedOptionsElementsForTemplate(template)));\r\n }\r\n\r\n private async setInitialSelectedOptionsElementsForTemplate(template: Template): Promise<void> {\r\n const propertyPromises = template.properties\r\n .filter(property => property?.options?.link?.href)\r\n .map(property => this.setInitialSelectedOptionsElementForProperty(property));\r\n const nestedTemplatePromised = template.properties\r\n .filter(property => property?._templates)\r\n .map(property => this.setInitialSelectedOptionsElementsForTemplates(property._templates));\r\n const allPromises = propertyPromises.concat(nestedTemplatePromised);\r\n\r\n await Promise.all(allPromises);\r\n }\r\n\r\n private async setInitialSelectedOptionsElementForProperty(property: Property): Promise<void> {\r\n const options = property?.options;\r\n\r\n if (!options?.link?.href)\r\n return;\r\n\r\n const templatedUri = options.link.href;\r\n const filter = `${options.valueField} eq ${property.value}`;\r\n const response = await this.getClient().getListByUri(templatedUri, { $filter: filter, $top: 10 });\r\n if (!response.ok || ProblemDetails.isProblemDetails(response.body) || !response.body) {\r\n const message = `An error occurred while getting the filtered items.`;\r\n this._messageService.add({ severity: 'error', summary: 'Error', detail: message, data: response });\r\n return;\r\n }\r\n\r\n const items = response.body._embedded.items;\r\n options.inline = items;\r\n }\r\n\r\n private async getAllTemplates(resource: Resource): Promise<Templates> {\r\n const formResponses = await this.getClient().getAllForms(resource);\r\n\r\n const failedResponses = formResponses.filter(response => !response.ok || ProblemDetails.isProblemDetails(response.body) || !response.body);\r\n if (failedResponses.length !== 0) {\r\n for (const response of failedResponses) {\r\n this._messageService.add({ severity: 'error', summary: 'Error', detail: 'Error while loading the resource from the API.', data: response });\r\n }\r\n return Promise.resolve({});\r\n }\r\n\r\n const formTemplates = Object.assign({}, ...formResponses.map(response => (response.body as FormsResource)._templates)) as Templates;\r\n\r\n await this.setInitialSelectedOptionsElementsForTemplates(formTemplates);\r\n\r\n return formTemplates;\r\n }\r\n\r\n public imageChanged(formControl: FormControl, event: { files: File[] }): void {\r\n const file = event.files[0];\r\n console.log(file);\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n const uri = reader.result;\r\n console.log(uri);\r\n formControl.setValue(uri);\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n}\r\n","<div class=\"grid\">\r\n <div class=\"col\">\r\n <h1>Edit resource</h1>\r\n </div>\r\n</div>\r\n\r\n<p-tabView>\r\n\r\n <p-tabPanel *ngIf=\"isLoadingForTheFirstTime\" header=\"Loading\">\r\n <div *ngFor=\"let i of [1, 2, 3, 4, 5]\" class=\"grid field\">\r\n <p-skeleton class=\"col-12 mb-2 md:col-2 md:mb-0\" height=\"39px\"></p-skeleton>\r\n <div class=\"col-12 md:col-10\">\r\n <p-skeleton class=\"w-full\" height=\"39px\"></p-skeleton>\r\n </div>\r\n </div>\r\n <div class=\"grid\">\r\n <div class=\"col\">\r\n <div class=\"flex justify-content-end w-full\">\r\n <p-skeleton width=\"120px\" height=\"39px\" class=\"mx-2\"></p-skeleton>\r\n <p-skeleton width=\"120px\" height=\"39px\" class=\"mx-2\"></p-skeleton>\r\n <p-skeleton width=\"120px\" height=\"39px\" class=\"mx-2\"></p-skeleton>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n\r\n <p-tabPanel *ngFor=\"let item of templates | keyvalue\" [header]=\"item.value.title || item.key\" [disabled]=\"isLoading\">\r\n <form [formGroup]=\"formTabs[item.key]\" (ngSubmit)=\"submit(item.key, item.value, formTabs[item.key].value)\">\r\n <div class=\"blockable-container\">\r\n <div class=\"blockable-element\">\r\n <rw-form [formGroup]=\"formTabs[item.key]\" [template]=\"item.value\" [apiName]=\"apiName\"></rw-form>\r\n </div>\r\n <div class=\"blockable-overlay\" *ngIf=\"isLoading\">\r\n <p-progressSpinner></p-progressSpinner>\r\n </div>\r\n </div>\r\n\r\n <div class=\"grid\">\r\n <div class=\"col\">\r\n <div class=\"flex justify-content-end w-full\">\r\n <ng-template #defaultButtons>\r\n <button pButton pRipple type=\"submit\" label=\"Save\" icon=\"far fa-save\" class=\"mx-2 p-button-success\" [disabled]=\"isLoading || !canSubmit(item.key)\"></button>\r\n <button pButton pRipple type=\"button\" label=\"Reload\" icon=\"fas fa-redo\" class=\"mx-2 p-button-info\" (click)=\"load()\" [disabled]=\"isLoading\"></button>\r\n <button pButton pRipple type=\"button\" label=\"Delete\" icon=\"far fa-trash-alt\" class=\"ml-2 p-button-danger\" (click)=\"showDeleteConfirmatioModal()\" [disabled]=\"!resource || isLoading || !canDelete\"></button>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"buttonsRef || defaultButtons\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </p-tabPanel>\r\n\r\n <ng-template #defaultExtraTabs>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"extraTabsRef || defaultExtraTabs\"></ng-container>\r\n\r\n</p-tabView>\r\n\r\n<p-toast></p-toast>\r\n<p-confirmDialog></p-confirmDialog>\r\n","import { Component, Input } from '@angular/core';\r\nimport { PagedListResource, Resource, ResourceDto } from '@wertzui/ngx-hal-client';\r\nimport * as _ from 'lodash';\r\nimport { ConfirmationService, FilterMatchMode, FilterMetadata, LazyLoadEvent, MenuItem, MessageService } from 'primeng/api';\r\nimport { RESTworldClient } from '../../services/restworld-client';\r\nimport { RESTworldClientCollection } from '../../services/restworld-client-collection';\r\nimport { ProblemDetails } from '../../models/problem-details';\r\nimport { AvatarGenerator } from '../../services/avatar-generator';\r\nimport { Router } from '@angular/router';\r\n\r\nexport enum ColumnType {\r\n text = 'text',\r\n numeric = 'numeric',\r\n boolean = 'boolean',\r\n date = 'date',\r\n array = 'array',\r\n object = 'object'\r\n}\r\n\r\nexport interface Column {\r\n header: string;\r\n field: string;\r\n type: ColumnType;\r\n}\r\n\r\n@Component({\r\n selector: 'rw-list',\r\n templateUrl: './restworld-list-view.component.html',\r\n styleUrls: ['./restworld-list-view.component.css']\r\n})\r\nexport class RESTworldListViewComponent<TListDto extends ResourceDto> {\r\n\r\n public get columns(): Column[] {\r\n return this._columns;\r\n }\r\n private _columns: Column[] = [];\r\n @Input()\r\n public set editLink(value: string) {\r\n if (value)\r\n this._editLink = value;\r\n }\r\n public get editLink() {\r\n return this._editLink;\r\n }\r\n private _editLink = '/edit';\r\n\r\n @Input()\r\n public set apiName(value: string | undefined) {\r\n this._apiName = value;\r\n this.load(this._lastEvent);\r\n }\r\n public get apiName(): string | undefined {\r\n return this._apiName;\r\n }\r\n private _apiName?: string;\r\n\r\n @Input()\r\n public set rel(value: string | undefined) {\r\n this._rel = value;\r\n this.load(this._lastEvent);\r\n }\r\n public get rel(): string | undefined {\r\n return this._rel;\r\n }\r\n private _rel?: string;\r\n\r\n @Input()\r\n public set sortField(value: string | undefined) {\r\n this._sortField = value ?? '';\r\n this._lastEvent.sortField = value;\r\n this.load(this._lastEvent);\r\n }\r\n public get sortField(): string {\r\n return this._sortField;\r\n }\r\n private _sortField = '';\r\n\r\n @Input()\r\n public set sortOrder(value: number | undefined) {\r\n this._sortOrder = value ?? 1;\r\n this._lastEvent.sortOrder = value;\r\n this.load(this._lastEvent);\r\n }\r\n public get sortOrder(): number {\r\n return this._sortOrder;\r\n }\r\n private _sortOrder = 1;\r\n\r\n @Input()\r\n public rowsPerPage: number[];\r\n\r\n @Input()\r\n public createButtonMenu?: MenuItem[];\r\n\r\n public resource?: PagedListResource<TListDto>;\r\n public isLoading = false;\r\n private _totalRecords = 0;\r\n private _lastEvent: LazyLoadEvent;\r\n public get value(): Resource[] {\r\n return this.resource?._embedded?.items || [];\r\n }\r\n public get rows(): number {\r\n return this._lastEvent?.rows || 0;\r\n }\r\n public get totalRecords(): number {\r\n return this._totalRecords;\r\n }\r\n private set totalRecords(value: number | undefined) {\r\n this._totalRecords = value || 0;\r\n }\r\n\r\n public get newHref(): string | undefined {\r\n return this.resource?.findLink('new')?.href;\r\n }\r\n\r\n private static _dateFormat = new Date(3333, 10, 22)\r\n .toLocaleDateString()\r\n .replace(\"22\", \"dd\")\r\n .replace(\"11\", \"MM\")\r\n .replace(\"3333\", \"y\")\r\n .replace(\"33\", \"yy\");\r\n\r\n public get dateFormat(): string {\r\n return RESTworldListViewComponent._dateFormat;\r\n }\r\n\r\n constructor(\r\n private _clients: RESTworldClientCollection,\r\n private _confirmationService: ConfirmationService,\r\n private _messageService: MessageService,\r\n public avatarGenerator: AvatarGenerator,\r\n private readonly _router: Router) {\r\n this.rowsPerPage = [10, 25, 50];\r\n\r\n this._lastEvent = {\r\n rows: this.rowsPerPage[0]\r\n };\r\n }\r\n\r\n public createNew(): Promise<boolean> {\r\n return this._router.navigate([this.editLink, this.apiName, this.newHref]);\r\n }\r\n\r\n private getClient(): RESTworldClient {\r\n if (!this.apiName)\r\n throw new Error('Cannot get a client, because the apiName is not set.');\r\n\r\n return this._clients.getClient(this.apiName);\r\n }\r\n\r\n public load = _.debounce(this.load2, 100);\r\n\r\n public async load2(event: LazyLoadEvent): Promise<void> {\r\n if (!this.apiName || !this.rel)\r\n return;\r\n\r\n this.isLoading = true;\r\n this._lastEvent = event;\r\n\r\n const parameters = this.createParametersFromEvent(event);\r\n const response = await this.getClient().getList<TListDto>(this.rel, parameters);\r\n if (!response.ok || ProblemDetails.isProblemDetails(response.body) || !response.body) {\r\n this._messageService.add({ severity: 'error', summary: 'Error', detail: 'Error while loading the resources from the API.', data: response });\r\n }\r\n else if (response.body) {\r\n this.resource = response.body;\r\n this.totalRecords = this.resource.totalPages && parameters.$top ? this.resource.totalPages * parameters.$top : undefined;\r\n this._columns = this.createColumns();\r\n }\r\n\r\n this.isLoading = false;\r\n }\r\n\r\n\r\n public showDeleteConfirmatioModal(resource: Resource) {\r\n this._confirmationService.confirm({\r\n message: 'Do you really want to delete this resource?',\r\n header: 'Confirm delete',\r\n icon: 'far fa-trash-alt',\r\n accept: () => this.delete(resource)\r\n });\r\n }\r\n\r\n public async delete(resource: Resource): Promise<void> {\r\n if (!this.apiName || !this.rel)\r\n return;\r\n\r\n await this.getClient().delete(resource);\r\n\r\n this._messageService.add({ severity: 'success', summary: 'Deleted', detail: 'The resource has been deleted.' });\r\n\r\n this.load(this._lastEvent);\r\n }\r\n\r\n private createColumns(): Column[] {\r\n if (this.value.length === 0)\r\n return this.columns;\r\n\r\n // Get all distinct properties from all rows\r\n // We look at all rows to eliminate possible undefined values\r\n const rowsWithProperties = this.value\r\n .map(resource =>\r\n Object.entries(resource)\r\n .filter(p =>\r\n p[0] !== '_links' &&\r\n p[0] !== '_embedded' &&\r\n p[0] !== 'id' &&\r\n p[0] !== 'timestamp'));\r\n\r\n const distinctProperties = rowsWithProperties[0];\r\n for (const propertiesOfRow of rowsWithProperties) {\r\n for (const property of propertiesOfRow) {\r\n const propertyName = property[0];\r\n const propertyValue = property[1];\r\n const alreadyFoundPropertyWithSameName = distinctProperties.find(p => p[0] === propertyName);\r\n if (!alreadyFoundPropertyWithSameName) // Add new property\r\n distinctProperties.push(property);\r\n else if (!alreadyFoundPropertyWithSameName[1] && propertyValue) // Use defined value instead of existing undefined value\r\n alreadyFoundPropertyWithSameName[1] = propertyValue;\r\n }\r\n }\r\n\r\n // Check if the rows are entities with change tracking\r\n const withoutChangeTrackingProperties = distinctProperties.filter(p =>\r\n p[0] !== 'createdAt' &&\r\n p[0] !== 'createdBy' &&\r\n p[0] !== 'lastChangedAt' &&\r\n p[0] !== 'lastChangedBy');\r\n const hasChangeTrackingProperties = withoutChangeTrackingProperties.length < distinctProperties.length;\r\n\r\n // First the id, then all other properties\r\n const sortedProperties: [string, unknown][] = [\r\n ['id', 0],\r\n ...withoutChangeTrackingProperties\r\n ];\r\n\r\n // And change tracking properties at the end\r\n if (hasChangeTrackingProperties) {\r\n sortedProperties.push(['createdAt', new Date()]);\r\n sortedProperties.push(['createdBy', '']);\r\n sortedProperties.push(['lastChangedAt', new Date()]);\r\n sortedProperties.push(['lastChangedBy', '']);\r\n }\r\n\r\n const columns = sortedProperties\r\n .map(p => ({\r\n header: RESTworldListViewComponent.toTitleCase(p[0]),\r\n field: p[0],\r\n type: RESTworldListViewComponent.getColumnType(p[1]),\r\n }));\r\n\r\n return columns;\r\n }\r\n\r\n private static getColumnType(value: unknown): ColumnType {\r\n if (value === null || value === undefined)\r\n return ColumnType.text;\r\n\r\n if (_.isNumber(value))\r\n return ColumnType.numeric;\r\n\r\n if (_.isDate(value))\r\n return ColumnType.date;\r\n\r\n if (_.isString(value))\r\n return ColumnType.text;\r\n\r\n if (_.isBoolean(value))\r\n return ColumnType.boolean;\r\n\r\n if (_.isArrayLike(value))\r\n return ColumnType.array;\r\n\r\n if (_.isObjectLike(value))\r\n return ColumnType.object;\r\n\r\n return ColumnType.text;\r\n }\r\n\r\n private static toTitleCase(anyCase: string) {\r\n return anyCase\r\n .replace(/(_)+/g, ' ') // underscore to whitespace\r\n .replace(/([a-z])([A-Z][a-z])/g, \"$1 $2\") // insert space before each new word if there is none\r\n .replace(/([A-Z][a-z])([A-Z])/g, \"$1 $2\") // insert space after each word if there is none\r\n .replace(/([a-z])([A-Z]+[a-z])/g, \"$1 $2\") // insert space after single letter word if there is none\r\n .replace(/([A-Z]+)([A-Z][a-z][a-z])/g, \"$1 $2\") // insert space before single letter word if there is none\r\n .replace(/([a-z]+)([A-Z0-9]+)/g, \"$1 $2\") // insert space after numbers\r\n .replace(/^./, (match) => match.toUpperCase()); // change first letter to be upper case\r\n }\r\n\r\n private createParametersFromEvent(event: LazyLoadEvent) {\r\n const oDataParameters = {\r\n $filter: this.createFilterFromEvent(event),\r\n $orderby: RESTworldListViewComponent.createOrderByFromEvent(event),\r\n $top: RESTworldListViewComponent.createTopFromEvent(event),\r\n $skip: RESTworldListViewComponent.createSkipFromEvent(event)\r\n };\r\n\r\n return oDataParameters;\r\n }\r\n\r\n static createSkipFromEvent(event: LazyLoadEvent): number | undefined {\r\n return event.first;\r\n }\r\n\r\n static createTopFromEvent(event: LazyLoadEvent): number | undefined {\r\n return event.rows;\r\n }\r\n\r\n static createOrderByFromEvent(event: LazyLoadEvent): string | undefined {\r\n if (event.sortField) {\r\n const order = !event.sortOrder || event.sortOrder > 0 ? 'asc' : 'desc';\r\n return `${event.sortField} ${order}`;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private createFilterFromEvent(event: LazyLoadEvent): string | undefined {\r\n if (!event.filters)\r\n return undefined;\r\n\r\n const filter = Object.entries(event.filters)\r\n // The type definition is wrong, event.filters has values of type FilterMetadata[] and not FilterMetadata.\r\n .map(([property, filter]) => ({ property: property, filters: filter as FilterMetadata[] }))\r\n .map(f => this.createFilterForPropertyArray(f.property, f.filters))\r\n .filter(f => !!f)\r\n .join(' and ');\r\n\r\n if (filter === '')\r\n return undefined;\r\n\r\n return `(${filter})`;\r\n }\r\n\r\n private createFilterForPropertyArray(property: string, filters: FilterMetadata[]): string | undefined {\r\n const filter = filters\r\n .map(f => this.createFilterForProperty(property, f))\r\n .filter(f => !!f)\r\n .join(` ${filters[0].operator} `);\r\n\r\n if (filter === '')\r\n return undefined;\r\n\r\n return `(${filter})`;\r\n }\r\n\r\n private createFilterForProperty(property: string, filter: FilterMetadata): string | undefined {\r\n if (!filter.value)\r\n return undefined;\r\n\r\n const oDataOperator = RESTworldListViewComponent.createODataOperator(\r\n filter.matchMode,\r\n );\r\n const comparisonValue = this.createComparisonValue(property, filter.value);\r\n\r\n switch (oDataOperator) {\r\n case 'contains':\r\n case 'not contains':\r\n case 'startswith':\r\n case 'endswith':\r\n return `${oDataOperator}(${property}, ${comparisonValue})`;\r\n default:\r\n return `${property} ${oDataOperator} ${comparisonValue}`;\r\n }\r\n }\r\n\r\n private static createODataOperator(matchMode?: string): string {\r\n switch (matchMode) {\r\n case FilterMatchMode.STARTS_WITH:\r\n return 'startswith';\r\n case FilterMatchMode.CONTAINS:\r\n return 'contains';\r\n case FilterMatchMode.NOT_CONTAINS:\r\n return 'not contains';\r\n case FilterMatchMode.ENDS_WITH:\r\n return 'endswith';\r\n case FilterMatchMode.EQUALS:\r\n return 'eq';\r\n case FilterMatchMode.NOT_EQUALS:\r\n return 'ne';\r\n case FilterMatchMode.IN:\r\n return 'in';\r\n case FilterMatchMode.LESS_THAN:\r\n return 'lt';\r\n case FilterMatchMode.LESS_THAN_OR_EQUAL_TO:\r\n return 'le';\r\n case FilterMatchMode.GREATER_THAN:\r\n return 'gt';\r\n case FilterMatchMode.GREATER_THAN_OR_EQUAL_TO:\r\n return 'ge';\r\n case FilterMatchMode.IS:\r\n return 'eq';\r\n case FilterMatchMode.IS_NOT:\r\n return 'ne';\r\n case FilterMatchMode.BEFORE:\r\n return 'lt';\r\n case FilterMatchMode.AFTER:\r\n return 'gt';\r\n case FilterMatchMode.DATE_AFTER:\r\n return 'ge';\r\n case FilterMatchMode.DATE_BEFORE:\r\n return 'lt';\r\n case FilterMatchMode.DATE_IS:\r\n return 'eq';\r\n case FilterMatchMode.DATE_IS_NOT:\r\n return 'ne';\r\n default:\r\n throw Error(`Unknown matchMode ${matchMode}`);\r\n }\r\n }\r\n\r\n private createComparisonValue(property: string, value: unknown): string {\r\n if (value === null || value === undefined)\r\n return 'null';\r\n\r\n const columns = this.columns.filter(c => c.field === property);\r\n if (columns.length !== 1)\r\n throw new Error(`Cannot find the column for the property ${property} which is specified in the filter.`);\r\n\r\n const type = columns[0].type;\r\n\r\n switch (type) {\r\n case ColumnType.boolean:\r\n return `${value}`;\r\n case ColumnType.date:\r\n return `cast(${(value as Date).toISOString()}, Edm.DateTimeOffset)`;\r\n case ColumnType.numeric:\r\n return `${value}`;\r\n case ColumnType.text:\r\n return `'${value}'`;\r\n default:\r\n throw new Error(`Unknown column type '${type}'`);\r\n }\r\n }\r\n}\r\n","<p-table [value]=\"value\"\r\n [lazy]=\"true\"\r\n [lazyLoadOnInit]=\"false\"\r\n (onLazyLoad)=\"load($event)\"\r\n responsiveLayout=\"scroll\"\r\n [paginator]=\"true\"\r\n [rows]=\"rows\"\r\n [rowsPerPageOptions]=\"rowsPerPage\"\r\n [totalRecords]=\"totalRecords\"\r\n [loading]=\"isLoading\"\r\n [showInitialSortBadge]=\"true\"\r\n [columns]=\"columns\"\r\n [sortField]=\"sortField\"\r\n [sortOrder]=\"sortOrder\">\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th *ngFor=\"let col of columns\" [pSortableColumn]=\"col.field\">\r\n <div class=\"p-d-flex p-jc-between p-ai-center\">\r\n {{col.header}}\r\n <p-sortIcon [field]=\"col.field\"></p-sortIcon>\r\n <p-columnFilter [type]=\"col.type\" [field]=\"col.field\" display=\"menu\"></p-columnFilter>\r\n </div>\r\n </th>\r\n <th>\r\n <div class=\"flex justify-content-end\">\r\n <div class=\"mx-2\">\r\n <a *ngIf=\"!createButtonMenu\" class=\"p-button-success\" icon=\"fas fa-plus\" pButton [routerLink]=\"[editLink, apiName, newHref]\" pTooltip=\"Create new\" tooltipPosition=\"left\"></a>\r\n <p-splitButton *ngIf=\"createButtonMenu\" styleClass=\"p-button-success\" icon=\"fas fa-plus\" pTooltip=\"Create new\" tooltipPosition=\"left\" (onClick)=\"createNew()\" [model]=\"createButtonMenu\" appendTo=\"body\"></p-splitButton>\r\n </div>\r\n </div>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"body\" let-entity let-columns=\"columns\">\r\n <tr>\r\n <td [ngSwitch]=\"col.type\" *ngFor=\"let col of columns\">\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <p-avatar *ngIf=\"col.field === 'createdBy' || col.field === 'lastChangedBy'\" [pTooltip]=\"entity[col.field]\" tooltipPosition=\"top\" [image]=\"avatarGenerator.getImage(entity[col.field])\" [label]=\"avatarGenerator.getLabel(entity[col.field])\" [style]=\"avatarGenerator.getStyle(entity[col.field])\" shape=\"circle\"></p-avatar>\r\n <span *ngIf=\"col.field !== 'createdBy' && col.field !== 'lastChangedBy'\">{{entity[col.field]}}</span>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'numeric'\" class=\"flex justify-content-end\">{{entity[col.field]}}</span>\r\n <span *ngSwitchCase=\"'boolean'\" class=\"flex justify-content-center\"><p-triStateCheckbox [(ngModel)]=\"entity[col.field]\" [readonly]=\"true\"></p-triStateCheckbox></span>\r\n <span *ngSwitchCase=\"'date'\" [pTooltip]=\"entity[col.field]\">{{entity[col.field] | date:dateFormat}}</span>\r\n <span *ngSwitchCase=\"'array'\" class=\"flex justify-content-end\"><p *ngFor=\"let arrayElement of entity[col.field]\">{{arrayElement | json}}</p></span>\r\n <span *ngSwitchCase=\"'object'\" class=\"flex justify-content-end\">{{entity[col.field] | json}}</span>\r\n </td>\r\n <td>\r\n <div class=\"flex justify-content-end\">\r\n <a pButton pTooltip=\"View/Edit\" tooltipPosition=\"left\" [routerLink]=\"[editLink, apiName, entity._links?.self[0].href]\" icon=\"fas fa-edit\"></a>\r\n <button pTooltip=\"Delete\" tooltipPosition=\"left\" pButton *ngIf=\"entity._links.delete\" (click)=\"showDeleteConfirmatioModal(entity)\" icon=\"fas fa-trash-alt\" type=\"button\" class=\"mx-2 p-button-danger\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"8\">No entries found.</td>\r\n </tr>\r\n </ng-template>\r\n\r\n</p-table>\r\n\r\n<p-toast></p-toast>\r\n<p-confirmDialog></p-confirmDialog>\r\n","import { APP_INITIALIZER, NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { RouterModule } from '@angular/router';\r\n\r\nimport { TableModule } from 'primeng/table';\r\nimport { TooltipModule } from 'primeng/tooltip'\r\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { InputNumberModule } from 'primeng/inputnumber';\r\nimport { CalendarModule } from 'primeng/calendar';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { ConfirmDialogModule } from 'primeng/confirmdialog';\r\nimport { ConfirmationService, MessageService } from 'primeng/api';\r\nimport { ToastModule } from 'primeng/toast';\r\nimport { MessagesModule } from 'primeng/messages';\r\nimport { PanelModule } from 'primeng/panel';\r\nimport { TabViewModule } from 'primeng/tabview';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport { ProgressSpinnerModule } from 'primeng/progressspinner';\r\nimport { RippleModule } from 'primeng/ripple';\r\nimport { TriStateCheckboxModule } from 'primeng/tristatecheckbox';\r\nimport { AvatarModule } from 'primeng/avatar';\r\nimport { DropdownModule } from 'primeng/dropdown';\r\nimport { MultiSelectModule } from 'primeng/multiselect';\r\nimport { FileUploadModule } from 'primeng/fileupload';\r\nimport { ValdemortModule } from 'ngx-valdemort';\r\nimport { ImageCropperModule } from 'ngx-image-cropper';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { ColorPickerModule } from 'primeng/colorpicker';\r\n\r\nimport { RESTworldListViewComponent } from './views/restworld-list-view/restworld-list-view.component';\r\nimport { RESTworldEditViewComponent } from './views/restworld-edit-view/restworld-edit-view.component';\r\nimport { RESTworldClientCollection } from './services/restworld-client-collection';\r\nimport { AvatarGenerator } from './services/avatar-generator';\r\nimport { SettingsService } from './services/settings.service';\nimport { RESTWorldImageViewComponent } from './views/restworld-image-view/restworld-image-view.component';\r\nimport { ButtonModule } from 'primeng/button';\nimport { RESTWorldFileViewComponent } from './views/restworld-file-view/restworld-file-view.component';\r\nimport { SafeUrlPipe } from './pipes/safe-url.pipe';\nimport { RestworldEditFormComponent } from './views/restworld-edit-form/restworld-edit-form.component'\r\nimport { FormService } from './services/form.service';\r\nimport { AsPipe } from './pipes/as.pipe';\r\nimport { SplitButtonModule } from 'primeng/splitbutton';\r\n\r\nexport function initializeSettings(settingsService: SettingsService): () => Promise<void> {\r\n return async () => await settingsService.ensureInitialized();\r\n}\r\n\r\n@NgModule({\r\n declarations: [\r\n RESTworldListViewComponent,\r\n RESTworldEditViewComponent,\r\n RESTWorldImageViewComponent,\r\n RESTWorldFileViewComponent,\r\n SafeUrlPipe,\r\n AsPipe,\r\n RestworldEditFormComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n RouterModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TableModule,\r\n TooltipModule,\r\n ScrollingModule,\r\n InputTextModule,\r\n InputNumberModule,\r\n CalendarModule,\r\n CheckboxModule,\r\n ConfirmDialogModule,\r\n ToastModule,\r\n MessagesModule,\r\n PanelModule,\r\n TabViewModule,\r\n SkeletonModule,\r\n ProgressSpinnerModule,\r\n RippleModule,\r\n TriStateCheckboxModule,\r\n AvatarModule,\r\n DropdownModule,\r\n MultiSelectModule,\r\n FileUploadModule,\r\n ValdemortModule,\r\n ImageCropperModule,\r\n DialogModule,\r\n ButtonModule,\r\n ColorPickerModule,\r\n DragDropModule,\r\n SplitButtonModule,\r\n ],\r\n exports: [\r\n RESTworldListViewComponent,\r\n RESTworldEditViewComponent,\r\n RESTWorldImageViewComponent,\r\n RESTWorldFileViewComponent,\r\n SafeUrlPipe\r\n ],\r\n providers: [\r\n RESTworldClientCollection,\r\n AvatarGenerator,\r\n ConfirmationService,\r\n FormService,\r\n MessageService,\r\n {\r\n provide: APP_INITIALIZER,\r\n useFactory: initializeSettings,\r\n deps: [SettingsService],\r\n multi: true,\r\n }\r\n ]\r\n})\r\nexport class RestworldClientModule { }\r\n","/*\n * Public API Surface of ngx-restworld-client\n */\r\n\nexport * from './lib/constants/link-names';\n\nexport * from './lib/models/api-url';\nexport * from './lib/models/client-settings';\nexport * from './lib/models/problem-details';\nexport * from './lib/models/restworld-options';\n\nexport * from './lib/pipes/safe-url.pipe'\nexport * from './lib/pipes/as.pipe'\n\nexport * from './lib/services/avatar-generator';\nexport * from './lib/services/form.service';\nexport * from './lib/services/restworld-client';\nexport * from './lib/services/restworld-client-collection';\nexport * from './lib/services/settings.service';\n\nexport * from './lib/views/restworld-edit-form/restworld-edit-form.component';\nexport * from './lib/views/restworld-edit-view/restworld-edit-view.component';\nexport * from './lib/views/restworld-file-view/restworld-file-view.component'\nexport * from './lib/views/restworld-image-view/restworld-image-view.component'\nexport * from './lib/views/restworld-list-view/restworld-list-view.component'\n\nexport * from './lib/restworld-client.module';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"wertzui-ngx-restworld-client.mjs","sources":["../../../projects/ngx-restworld-client/src/lib/constants/link-names.ts","../../../projects/ngx-restworld-client/src/lib/models/problem-details.ts","../../../projects/ngx-restworld-client/src/lib/models/restworld-options.ts","../../../projects/ngx-restworld-client/src/lib/pipes/safe-url.pipe.ts","../../../projects/ngx-restworld-client/src/lib/pipes/as.pipe.ts","../../../projects/ngx-restworld-client/src/lib/services/avatar-generator.ts","../../../projects/ngx-restworld-client/src/lib/services/form.service.ts","../../../projects/ngx-restworld-client/src/lib/services/restworld-client.ts","../../../projects/ngx-restworld-client/src/lib/services/restworld-client-collection.ts","../../../projects/ngx-restworld-client/src/lib/services/settings.service.ts","../../../projects/ngx-restworld-client/src/lib/views/restworld-image-view/restworld-image-view.component.ts","../../../projects/ngx-restworld-client/src/lib/views/restworld-image-view/restworld-image-view.component.html","../../../projects/ngx-restworld-client/src/lib/views/restworld-file-view/restworld-file-view.component.ts","../../../projects/ngx-restworld-client/src/lib/views/restworld-file-view/restworld-file-view.component.html","../../../projects/ngx-restworld-client/src/lib/views/restworld-edit-form/restworld-edit-form.component.ts","../../../projects/ngx-restworld-client/src/lib/views/restworld-edit-form/restworld-edit-form.component.html","../../../projects/ngx-restworld-client/src/lib/views/restworld-edit-view/restworld-edit-view.component.ts","../../../projects/ngx-restworld-client/src/lib/views/restworld-edit-view/restworld-edit-view.component.html","../../../projects/ngx-restworld-client/src/lib/views/restworld-list-view/restworld-list-view.component.ts","../../../projects/ngx-restworld-client/src/lib/views/restworld-list-view/restworld-list-view.component.html","../../../projects/ngx-restworld-client/src/lib/restworld-client.module.ts","../../../projects/ngx-restworld-client/src/public-api.ts","../../../projects/ngx-restworld-client/src/wertzui-ngx-restworld-client.ts"],"sourcesContent":["export enum LinkNames {\r\n get = \"Get\",\r\n getList = \"GetList\",\r\n post = \"Post\",\r\n put = \"Put\",\r\n delete = \"Delete\",\r\n new = \"New\"\r\n}","import * as _ from \"lodash\";\r\nimport { Resource, ResourceOfDto } from \"@wertzui/ngx-hal-client\"\r\n/*\r\n * ProblemDetails is what an ASP.net Core backend returns in case of an error.\r\n * */\r\nexport interface ProblemDetailsDto {\r\n type?: string;\r\n title?: string;\r\n status?: number;\r\n detail?: string;\r\n instance?: string;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport class ProblemDetails extends Resource implements ResourceOfDto<ProblemDetailsDto> {\r\n public type?: string;\r\n public title?: string;\r\n public status?: number;\r\n public detail?: string;\r\n public instance?: string;\r\n [key: string]: unknown;\r\n\r\n public static isProblemDetails(resource: unknown): resource is ProblemDetails {\r\n return resource instanceof ProblemDetails;\r\n }\r\n\r\n public static containsProblemDetailsInformation(resource: unknown) {\r\n return resource && (resource instanceof ProblemDetails || (resource instanceof Resource && 'status' in resource && _.isNumber(resource['status']) && resource['status'] >= 100 && resource['status'] < 600));\r\n }\r\n\r\n public static fromResource(resource: Resource | null | undefined): ProblemDetails {\r\n if (!ProblemDetails.containsProblemDetailsInformation(resource))\r\n throw new Error(`The resource ${resource} does not have problem details.`);\r\n\r\n return Object.assign(new ProblemDetails(), resource);\r\n }\r\n}\r\n","export class RESTworldOptions {\r\n constructor(public readonly BaseUrl: string, public readonly Version?: number) {\r\n if (!BaseUrl.endsWith('/'))\r\n throw new Error(`The provided BaseUrl '${BaseUrl}' does not end with a slash '/'.`);\r\n }\r\n}","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport * as _ from 'lodash';\r\n\r\n@Pipe({\r\n name: 'safeUrl'\r\n})\r\nexport class SafeUrlPipe implements PipeTransform {\r\n\r\n constructor(private _domSanitizer: DomSanitizer) {\r\n }\r\n\r\n transform(url: unknown) {\r\n if (!_.isString(url))\r\n throw new Error(`The given url '${url}' is not a string.`)\r\n\r\n return this._domSanitizer.bypassSecurityTrustResourceUrl(url);\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n/**\r\n * Cast super type into type using generics\r\n * Return Type obtained by optional @param type OR assignment type.\r\n */\r\n\r\n@Pipe({ name: 'as' })\r\nexport class AsPipe implements PipeTransform {\r\n /**\r\n * Cast (S: SuperType) into (T: Type) using @Generics.\r\n * @param value (S: SuperType) obtained from input type.\r\n * @optional @param type (T CastingType)\r\n * type?: { new (): T }\r\n * type?: new () => T\r\n */\r\n transform<S, T extends S>(value: S, type: new (...args: any[]) => T): T {\r\n return value as T;\r\n }\r\n}","import { Injectable, Input } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AvatarGenerator {\r\n private static _nonWordRegex = new RegExp('\\\\W');\r\n private static _imageCache: Map<string, string> = new Map<string, string>();\r\n\r\n @Input()\r\n public getImageOverride: (nameOrEmail: string) => string = () => '';\r\n\r\n public getImage(nameOrEmail: string): string {\r\n let uri = AvatarGenerator._imageCache.get(nameOrEmail);\r\n\r\n if (!uri) {\r\n uri = this.getImageOverride(nameOrEmail);\r\n AvatarGenerator._imageCache.set(nameOrEmail, uri);\r\n }\r\n\r\n return uri;\r\n }\r\n\r\n public getLabel(nameOrEmail: string): string {\r\n if (!nameOrEmail)\r\n return '';\r\n\r\n if (this.getImage(nameOrEmail))\r\n return '';\r\n\r\n const name = AvatarGenerator.getLocalPartOfEmailAddress(nameOrEmail);\r\n const initials = AvatarGenerator.getTwoUppercaseLettersFromName(name);\r\n\r\n return initials;\r\n }\r\n\r\n public getStyle(nameOrEmail: string,): '' | { 'background-color': string; color: string } {\r\n if (this.getImage(nameOrEmail))\r\n return '';\r\n\r\n const foregroundColor = '#ffffff';\r\n const backgroundColor = AvatarGenerator.getBackgroundColor(nameOrEmail);\r\n\r\n const style = {\r\n 'background-color': backgroundColor,\r\n color: foregroundColor,\r\n };\r\n\r\n return style;\r\n }\r\n\r\n private static getLocalPartOfEmailAddress(email: string): string {\r\n const indexOfAt = email.indexOf('@');\r\n if (indexOfAt < 2) {\r\n if (indexOfAt >= 0) {\r\n if (indexOfAt === email.length - 1)\r\n return email.substring(0, indexOfAt);\r\n return email.substring(indexOfAt + 1);\r\n }\r\n } else {\r\n return email.substring(0, indexOfAt);\r\n }\r\n\r\n return email;\r\n }\r\n\r\n private static getTwoUppercaseLettersFromName(name: string): string {\r\n // Too short to do anything besides just returning the name\r\n if (name.length <= 2) {\r\n return name.toUpperCase();\r\n }\r\n\r\n // Try to split by non word characters\r\n const splittedByNonWord = name.split(AvatarGenerator._nonWordRegex);\r\n if (splittedByNonWord.length > 1) {\r\n return (splittedByNonWord[0][0] + splittedByNonWord[1][0]).toUpperCase();\r\n }\r\n\r\n // Try to split by upper case letters\r\n const upperCaseLetters = [...name]\r\n .filter((c) => c.toUpperCase() === c && !AvatarGenerator._nonWordRegex.test(c))\r\n .join();\r\n if (upperCaseLetters.length > 1) {\r\n return upperCaseLetters.substring(0, 2);\r\n }\r\n\r\n // Just return the first 2 letters\r\n return name.substring(0, 2).toUpperCase();\r\n }\r\n\r\n // from https://stackoverflow.com/a/66494926/1378307\r\n private static getBackgroundColor(\r\n text: string,\r\n minLightness = 40,\r\n maxLightness = 80,\r\n minSaturation = 30,\r\n maxSaturation = 100,\r\n ): string {\r\n if (!text) return '#aaa';\r\n\r\n const hash = [...text].reduce((acc, char) => {\r\n return char.charCodeAt(0) + ((acc << 5) - acc);\r\n }, 0);\r\n\r\n return (\r\n 'hsl(' +\r\n (hash % 360) +\r\n ', ' +\r\n ((hash % (maxSaturation - minSaturation)) + minSaturation) +\r\n '%, ' +\r\n ((hash % (maxLightness - minLightness)) + minLightness) +\r\n '%)'\r\n );\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { FormArray, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { Property, PropertyType, Template, Templates } from '@wertzui/ngx-hal-client';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FormService {\r\n\r\n public createFormGroupsFromTemplates(templates: Templates): { [key: string]: FormGroup } {\r\n const tabs = Object.fromEntries(Object.entries(templates).map(([name, template]) => [\r\n name,\r\n this.createFormGroupFromTemplate(template)\r\n ]));\r\n\r\n return tabs;\r\n }\r\n\r\n private createFormGroupFromTemplates(templates: Templates, ignoredProperties: string[]): FormGroup {\r\n const controls = Object.fromEntries(\r\n Object.entries(templates)\r\n .filter(([key, ]) => !ignoredProperties.some(p => key === p))\r\n .map(([name, template]) => [\r\n name,\r\n this.createFormGroupFromTemplate(template)\r\n ]));\r\n const formGroup = new FormGroup(controls);\r\n return formGroup;\r\n }\r\n\r\n public createFormArrayFromTemplates(templates: Templates, ignoredProperties: string[]): FormArray {\r\n const controls =\r\n Object.entries(templates)\r\n .filter(([key, ]) => !ignoredProperties.some(p => key === p))\r\n .map(([, template]) =>\r\n this.createFormGroupFromTemplate(template));\r\n const formArray = new FormArray(controls);\r\n return formArray;\r\n }\r\n\r\n public createFormGroupFromTemplate(template: Template): FormGroup {\r\n const controls = Object.fromEntries(template.properties.map(p => [\r\n p.name,\r\n this.createFormControl(p)\r\n ]));\r\n const formGroup = new FormGroup(controls);\r\n return formGroup;\r\n }\r\n\r\n public createFormControl(property: Property): FormControl | FormGroup | FormArray {\r\n if (property.type === PropertyType.Object)\r\n return this.createFormGroupFromTemplate(property._templates['default']);\r\n if (property.type === PropertyType.Collection)\r\n return this.createFormArrayFromTemplates(property._templates, ['default']);\r\n\r\n const control = new FormControl(property.value);\r\n if (property.max)\r\n control.addValidators(Validators.max(property.max));\r\n if (property.maxLength)\r\n control.addValidators(Validators.maxLength(property.maxLength));\r\n if (property.min)\r\n control.addValidators(Validators.min(property.min));\r\n if (property.minLength)\r\n control.addValidators(Validators.minLength(property.minLength));\r\n if (property.regex)\r\n control.addValidators(Validators.pattern(property.regex));\r\n if (property.required)\r\n control.addValidators(Validators.required);\r\n if (property.type === PropertyType.Email)\r\n control.addValidators(Validators.email);\r\n\r\n return control;\r\n }\r\n}\r\n","import { HttpHeaders, HttpResponse } from '@angular/common/http';\r\nimport * as _ from \"lodash\";\r\nimport { FormsResource, HalClient, Link, PagedListResource, Resource, ResourceDto, Template } from \"@wertzui/ngx-hal-client\";\r\nimport { LinkNames } from \"../constants/link-names\";\r\nimport { ProblemDetails } from \"../models/problem-details\";\r\nimport { RESTworldOptions } from \"../models/restworld-options\";\r\n\r\nexport class RESTworldClient {\r\n\r\n private _homeResource?: Resource;\r\n private _defaultCurie?: string;\r\n public get halClient() {\r\n return this._halClient;\r\n }\r\n\r\n constructor(\r\n private _halClient: HalClient,\r\n private _options: RESTworldOptions\r\n ) { }\r\n\r\n public async ensureHomeResourceIsSet(): Promise<void> {\r\n if (!this._homeResource) {\r\n const response = await this.getHomeForced();\r\n if (ProblemDetails.isProblemDetails(response.body)) {\r\n throw new Error(`Cannot get the home resource from ${this._options.BaseUrl} with Version ${this._options.Version}. Response was: ${response}`);\r\n }\r\n if (!response.body)\r\n throw new Error(`Cannot get the home resource from ${this._options.BaseUrl} with Version ${this._options.Version}. Response was empty.`);\r\n this._homeResource = response.body;\r\n this.setDefaultCurie();\r\n }\r\n }\r\n\r\n private async getHomeForced(): Promise<HttpResponse<Resource | ProblemDetails>> {\r\n const header = RESTworldClient.createHeaders('application/hal+json', this._options.Version);\r\n const response = await this.halClient.get(this._options.BaseUrl, Resource, ProblemDetails, header);\r\n return response;\r\n }\r\n\r\n private setDefaultCurie(): void {\r\n const curies = this._homeResource?._links?.curies;\r\n if (!curies || curies.length === 0 || !curies[0])\r\n this._defaultCurie = undefined;\r\n else\r\n this._defaultCurie = curies[0].name;\r\n }\r\n\r\n public async getList<TListDto extends ResourceDto>(rel: string, parameters: {}, headers?: HttpHeaders, curie?: string): Promise<HttpResponse<PagedListResource<TListDto> | ProblemDetails>> {\r\n const link = this.getLinkFromHome(rel, LinkNames.getList, curie);\r\n const uri = link.href\r\n\r\n const response = await this.getListByUri<TListDto>(uri, parameters, headers);\r\n\r\n return response;\r\n }\r\n\r\n public async getListByUri<TListDto extends ResourceDto>(uri: string, parameters: {}, headers?: HttpHeaders): Promise<HttpResponse<PagedListResource<TListDto> | ProblemDetails>> {\r\n const link = new Link();\r\n link.href = uri;\r\n const filledUri = link.fillTemplate(parameters);\r\n const defaultHeaders = RESTworldClient.createHeaders('application/hal+json', this._options.Version);\r\n const combinedHeaders = RESTworldClient.combineHeaders(headers, defaultHeaders, false);\r\n\r\n const response = await this.halClient.get<PagedListResource<TListDto>, ProblemDetails>(filledUri, PagedListResource, ProblemDetails, combinedHeaders);\r\n\r\n return response;\r\n }\r\n\r\n public async getAllPagesFromList<TListDto extends ResourceDto>(rel: string, parameters: {}, headers?: HttpHeaders, curie?: string): Promise<HttpResponse<PagedListResource<TListDto> | ProblemDetails>> {\r\n const link = this.getLinkFromHome(rel, LinkNames.getList, curie);\r\n const uri = link.href;\r\n\r\n const response = await this.getAllPagesFromListByUri<TListDto>(uri, parameters, headers);\r\n\r\n return response;\r\n }\r\n\r\n public async getAllPagesFromListByUri<TListDto extends ResourceDto>(uri: string, parameters: {}, headers?: HttpHeaders): Promise<HttpResponse<PagedListResource<TListDto> | ProblemDetails>> {\r\n const response = await this.getListByUri<TListDto>(uri, parameters, headers);\r\n\r\n if (!response.ok || ProblemDetails.isProblemDetails(response.body) || !response.body?._embedded?.items)\r\n return response;\r\n\r\n\r\n const items = response.body._embedded.items;\r\n let lastResponse = response;\r\n\r\n while ((lastResponse?.body?._links?.next?.length ?? 0) > 0) {\r\n // Get the next response\r\n const nextLinks = lastResponse.body?._links.next;\r\n const nextLink = nextLinks ? nextLinks[0]: undefined;\r\n const nextHref = nextLink?.href;\r\n if (nextHref) {\r\n lastResponse = await this.getListByUri<TListDto>(nextHref, parameters, headers);\r\n\r\n if (!lastResponse.ok || ProblemDetails.isProblemDetails(lastResponse.body) || !lastResponse.body)\r\n return lastResponse;\r\n\r\n // Combine the embedded items\r\n lastResponse.body?._embedded?.items?.forEach(r => items.push(r));\r\n }\r\n }\r\n\r\n // We combined everything, so there is just one big page\r\n response.body.totalPages = 1;\r\n response.body._links.next = undefined;\r\n\r\n return response;\r\n }\r\n\r\n public async getSingle(relOrUri: string, id?: number, headers?: HttpHeaders, curie?: string): Promise<HttpResponse<Resource | ProblemDetails>> {\r\n let uri;\r\n if (relOrUri.startsWith('http')) {\r\n if (id !== undefined)\r\n throw new Error('When supplying a URI, an ID cannot be supplied too.');\r\n if (curie)\r\n throw new Error('When supplying a URI, a curie cannot be supplied too.');\r\n\r\n uri = relOrUri;\r\n }\r\n else {\r\n if (!_.isNumber(id))\r\n throw new Error('When supplying a rel, an ID must be supplied too.');\r\n\r\n const link = this.getLinkFromHome(relOrUri, LinkNames.get, curie);\r\n uri = link.fillTemplate({ id: id.toString() });\r\n }\r\n\r\n const defaultHeaders = RESTworldClient.createHeaders('application/hal+json', this._options.Version);\r\n const combinedHeaders = RESTworldClient.combineHeaders(headers, defaultHeaders, false);\r\n const response = await this.halClient.get(uri, Resource, ProblemDetails, combinedHeaders);\r\n\r\n return response;\r\n }\r\n\r\n public async save(resource: Resource): Promise<HttpResponse<Resource | ProblemDetails>> {\r\n const saveLink = resource.findLink('save');\r\n if (!saveLink)\r\n throw new Error(`The resource ${resource} does not have a save link.`);\r\n if (!saveLink.name)\r\n throw new Error(`The save link ${saveLink} does not have a save name.`);\r\n\r\n const uri = saveLink.href;\r\n const method = saveLink.name.toLowerCase();\r\n const header = RESTworldClient.createHeaders('application/hal+json', this._options.Version);\r\n\r\n let response;\r\n switch (method) {\r\n case 'put':\r\n response = await this.halClient.put(uri, resource, Resource, ProblemDetails, header);\r\n break;\r\n case 'post':\r\n response = await this.halClient.post(uri, resource, Resource, ProblemDetails, header);\r\n break;\r\n default:\r\n throw new Error(`'${method}' is not allowed as link name for the save link. Only 'POST' and 'PUT' are allowed.`);\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public async getAllForms(resource: Resource): Promise<HttpResponse<FormsResource | ProblemDetails>[]> {\r\n const urls = resource.getFormLinkHrefs();\r\n const header = RESTworldClient.createHeaders('application/prs.hal-forms+json', this._options.Version);\r\n const formsPromises = urls.map(url => this._halClient.get(url, FormsResource, ProblemDetails, header));\r\n const formsAndProblems = await Promise.all(formsPromises);\r\n return formsAndProblems;\r\n }\r\n\r\n public async submit(template: Template, formValues: {}): Promise<HttpResponse<FormsResource | ProblemDetails>> {\r\n const uri = template.target || '';\r\n const method = template.method?.toLowerCase();\r\n const header = RESTworldClient.createHeaders('application/prs.hal-forms+json', this._options.Version);\r\n\r\n let response;\r\n switch (method) {\r\n case 'put':\r\n response = await this.halClient.put(uri, formValues, FormsResource, ProblemDetails, header);\r\n break;\r\n case 'post':\r\n response = await this.halClient.post(uri, formValues, FormsResource, ProblemDetails, header);\r\n break;\r\n default:\r\n response = await this.halClient.get(uri, FormsResource, ProblemDetails, header);\r\n }\r\n\r\n return response;\r\n\r\n }\r\n\r\n public async delete(resource: Resource): Promise<HttpResponse<void | ProblemDetails>> {\r\n const deleteLink = resource.findLink('delete');\r\n if (!deleteLink)\r\n throw new Error(`The resource ${resource} does not have a delete link.`);\r\n const uri = deleteLink.href;\r\n const header = RESTworldClient.createHeaders('application/hal+json', this._options.Version);\r\n\r\n const response = await this.halClient.delete(uri, ProblemDetails, header);\r\n\r\n return response;\r\n }\r\n\r\n public getAllLinksFromHome(): { [rel: string]: Link[] | undefined; } {\r\n if (!this._homeResource)\r\n throw new Error('Home resource is not set. Call ensureHomeResourceIsSet() first.');\r\n\r\n return this._homeResource._links;\r\n }\r\n\r\n public getLinkFromHome(rel: string, name?: string, curie?: string): Link {\r\n const links = this.getLinksFromHome(rel, curie);\r\n\r\n const link = name ? links.find(l => l.name === name) : links[0];\r\n\r\n if (!link)\r\n throw new Error(`The home resource does not have a link with the rel '${this.getFullRel(rel, curie)}' and the name '${name}'.`);\r\n\r\n return link;\r\n }\r\n\r\n public getLinksFromHome(rel: string, curie?: string): Link[] {\r\n if (!this._homeResource)\r\n throw new Error('Home resource is not set. Call ensureHomeResourceIsSet() first.');\r\n\r\n const fullRel = this.getFullRel(rel, curie);\r\n const links = this._homeResource._links[fullRel];\r\n if (!links || links.length === 0)\r\n throw Error(`The home resource does not have a link with the rel '${fullRel}'.`);\r\n\r\n return links;\r\n }\r\n\r\n private getFullRel(rel: string, curie?: string): string {\r\n // rel already includes a curie => just return it\r\n if (rel.includes(':'))\r\n return rel;\r\n\r\n // No curie given => use default curie.\r\n if (!curie)\r\n curie = this._defaultCurie;\r\n\r\n // Combine curie and rel\r\n const fullRel = `${curie}:${rel}`;\r\n\r\n return fullRel;\r\n }\r\n\r\n private static createHeaders(mediaType?: 'application/hal+json' | 'application/prs.hal-forms+json', version?: number): HttpHeaders {\r\n if (version)\r\n return new HttpHeaders({\r\n 'Accept': `${mediaType || 'application/hal+json'}; v=${version}`,\r\n 'Content-Type': `${mediaType || 'application/hal+json'}; v=${version}`\r\n });\r\n return new HttpHeaders();\r\n }\r\n\r\n private static combineHeaders(originalHeaders: HttpHeaders | undefined, headersToAdd: HttpHeaders | undefined, overwriteExisting: boolean) {\r\n if (!headersToAdd)\r\n return originalHeaders;\r\n if (!originalHeaders)\r\n return headersToAdd;\r\n\r\n let combinedHeaders = originalHeaders;\r\n\r\n for (const key in headersToAdd.keys) {\r\n if (!combinedHeaders.has(key) || overwriteExisting) {\r\n const headerValuesToAdd = headersToAdd.getAll(key);\r\n if (headerValuesToAdd)\r\n combinedHeaders = combinedHeaders.set(key, headerValuesToAdd);\r\n }\r\n }\r\n\r\n return combinedHeaders;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { HalClient } from \"@wertzui/ngx-hal-client\";\r\nimport { RESTworldOptions } from \"../models/restworld-options\";\r\nimport { RESTworldClient } from \"./restworld-client\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RESTworldClientCollection {\r\n private readonly _clients: {\r\n [name: string]: RESTworldClient;\r\n };\r\n constructor(private _halClient: HalClient) {\r\n this._clients = {};\r\n }\r\n\r\n public containsClient(name: string): boolean {\r\n return Object.keys(this._clients).includes(name);\r\n }\r\n\r\n public async addOrGetExistingClient(name: string, options: RESTworldOptions): Promise<RESTworldClient> {\r\n if (Object.keys(this._clients).includes(name))\r\n return this.getClient(name);\r\n\r\n const client = new RESTworldClient(this._halClient, options);\r\n await client.ensureHomeResourceIsSet();\r\n this._clients[name] = client;\r\n return client;\r\n }\r\n\r\n public getClient(name: string): RESTworldClient {\r\n const client = this._clients[name];\r\n if (!client)\r\n throw new Error(`No client with the name '${name}' exists.`);\r\n\r\n return client;\r\n }\r\n\r\n public get all(): { [name: string]: RESTworldClient } {\r\n return this._clients;\r\n }\r\n}","import { HttpBackend, HttpClient } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { ClientSettings } from \"../models/client-settings\";\r\nimport { RESTworldOptions } from \"../models/restworld-options\";\r\nimport { RESTworldClientCollection } from \"./restworld-client-collection\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SettingsService {\r\n private static _settings: ClientSettings | undefined;\r\n public get settings(): ClientSettings | undefined {\r\n return SettingsService._settings;\r\n }\r\n\r\n private initializing = false;\r\n private initialized = false;\r\n\r\n constructor(\r\n private _clients: RESTworldClientCollection) {\r\n }\r\n\r\n public async ensureInitialized(): Promise<void> {\r\n if (this.initializing || this.initialized)\r\n return;\r\n\r\n this.initializing = true;\r\n\r\n await SettingsService.ensureSettingsAreLoaded();\r\n await this.populateRESTworldClientCollectionFromSettings();\r\n\r\n this.initialized = true;\r\n this.initializing = false;\r\n\r\n }\r\n\r\n /**\r\n * Call this method in your main.ts before calling bootstrapModule(...)\r\n * \r\n * Example:\r\n * async function main() {\r\n * try {\r\n * await SettingsService.ensureSettingsAreLoaded();\r\n * \r\n * const providers : StaticProvider[] = [\r\n * { provide: 'BASE_URL', useFactory: getBaseUrl, deps: [] }\r\n * ];\r\n * \r\n * await platformBrowserDynamic(providers).bootstrapModule(AppModule);\r\n * }\r\n * catch (e) {\r\n * console.error(e);\r\n * }\r\n * }\r\n * \r\n * main();\r\n * */\r\n public static async ensureSettingsAreLoaded(): Promise<void> {\r\n if (SettingsService._settings === undefined) {\r\n const response = await fetch('/settings');\r\n const settings: ClientSettings = await response.json();\r\n SettingsService._settings = settings;\r\n }\r\n }\r\n\r\n private async populateRESTworldClientCollectionFromSettings(): Promise<void> {\r\n if (!this.settings?.apiUrls)\r\n return;\r\n\r\n await Promise.all(this.settings.apiUrls\r\n .map(api => this._clients.addOrGetExistingClient(api.name, new RESTworldOptions(api.url, api.version))));\r\n }\r\n\r\n}\r\n","import { AfterViewInit, Component, forwardRef, Input, OnDestroy, OnInit, QueryList, ViewChildren } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { CropperPosition, ImageCroppedEvent, ImageCropperComponent, OutputFormat } from 'ngx-image-cropper';\r\nimport { FileUpload } from 'primeng/fileupload';\r\nimport { Dialog } from 'primeng/dialog'\r\nimport { async, firstValueFrom, Subscription } from 'rxjs';\r\n\n@Component({\n selector: 'rw-image',\n templateUrl: './restworld-image-view.component.html',\n styleUrls: ['./restworld-image-view.component.css'],\n providers: [{\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => RESTWorldImageViewComponent),\r\n multi: true\r\n }]\n})\nexport class RESTWorldImageViewComponent implements ControlValueAccessor, OnInit, OnDestroy, AfterViewInit {\n\r\n private onChange?: Function;\n private _subscriptions?: Subscription[];\n\n @Input()\n public alt?: string;\n @Input()\n public accept?: string;\n @Input()\n public fileName?: string;\n @Input()\r\n public alignImage?: 'center' | 'left';\r\n @Input()\r\n public aspectRatio?: number;\r\n @Input()\r\n public backgroundColor?: string;\r\n @Input()\r\n public canvasRotation?: number;\r\n @Input()\r\n public containWithinAspectRatio?: boolean;\r\n @Input()\r\n public cropper?: CropperPosition;\r\n @Input()\r\n public cropperMaxHeight?: number;\r\n @Input()\r\n public cropperMaxWidth?: number;\r\n @Input()\r\n public cropperMinHeight?: number;\r\n @Input()\r\n public cropperMinWidth?: number;\r\n @Input()\r\n public cropperStaticHeight?: number;\r\n @Input()\r\n public cropperStaticWidth?: number;\r\n @Input()\r\n public format?: OutputFormat;\r\n @Input()\r\n public imageQuality?: number;\r\n @Input()\r\n public initialStepSize?: number;\r\n @Input()\r\n public maintainAspectRatio?: boolean;\r\n @Input()\r\n public onlyScaleDown?: boolean;\r\n @Input()\r\n public resizeToWidth?: number;\r\n @Input()\r\n public resizeToHeight?: number;\r\n @Input()\r\n public roundCropper?: boolean;\r\n\n\n\r\n @ViewChildren(FileUpload)\r\n fileUploads?: QueryList<FileUpload>;\n\n\r\n @ViewChildren(ImageCropperComponent)\n imageCroppers?: QueryList<ImageCropperComponent>;\n\n @ViewChildren(Dialog)\n dialogs?: QueryList<Dialog>;\n\n public disabled = false;\n public uri?: string | null;\r\n public tempImageFile?: File;\r\n public displayCropDialog = false;\n public tempCroppedUri?: string | null;\n\n writeValue(obj?: string | null): void {\r\n this.uri = obj;\r\n }\r\n registerOnChange(fn?: Function): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(): void {\r\n // not needed for this component, but needed to implement the interface\r\n }\r\n\r\n setDisabledState?(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n ngOnInit(): void {\r\n // If no background color is set, we set it to white.\r\n // Otherwise the color picker would show red, the input would be empty and the image cropper would show transparent.\r\n if (!this.backgroundColor)\r\n this.backgroundColor = '#ffffff';\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._subscriptions?.forEach(s => s.unsubscribe());\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // We need to trigger imageLoadedInView each time, after the opening animation of the dialog has been completed.\r\n // Otherwise the image cropper initially (and after every window resize) thinks that the image size is 0x0,\r\n // because the opening animation hast just begun when the image cropper is first shown.\r\n this.dialogs?.map(d => d.onShow.subscribe(() =>\r\n this.imageCroppers?.forEach(i => { i.imageLoadedInView(); })\r\n ));\r\n }\r\n\r\n public showCropDialog(): void {\r\n this.displayCropDialog = true;\r\n }\r\n\n public imageChanged(event: { files: File[] }): void {\r\n this.tempImageFile = event.files[0];\r\n this.showCropDialog();\r\n }\n\n public croppedImageChanged(event: ImageCroppedEvent): void {\r\n this.tempCroppedUri = event.base64;\r\n }\n\r\n public acceptCroppedImage(): void {\r\n this.uri = this.tempCroppedUri;\r\n this.onChange?.(this.uri);\r\n this.closeCropDialog();\r\n }\r\n\r\n public closeCropDialog(): void {\r\n this.fileUploads?.forEach(f => f.clear());\r\n this.displayCropDialog = false;\r\n }\n}\n","<div class=\"flex align-items-center\">\r\n <p-button *ngIf=\"!uri\" [disabled]=\"true\" icon=\"pi pi-download\" class=\"mr-1\" pTooltip=\"No image present\"></p-button>\r\n <a *ngIf=\"uri\" [href]=\"uri | safeUrl\" [download]=\"fileName || 'download'\" class=\"mr-1\" pButton pTooltip=\"Download image\" icon=\"pi pi-download\"></a>\r\n <p-fileUpload class=\"mr-1\" chooseIcon=\"pi-upload fas fa-upload\" mode=\"basic\" [auto]=\"true\" [accept]=\"accept || 'image/*'\" [customUpload]=\"true\" (uploadHandler)=\"imageChanged($event)\" pTooltip=\"Upload new image\"></p-fileUpload>\r\n <img *ngIf=\"uri\" class=\"thumbnail\" [src]=\"uri | safeUrl\" [alt]=\"alt\" (click)=\"showCropDialog()\" pTooltip=\"Zoom and crop\" />\r\n</div>\r\n\r\n<p-dialog [header]=\"alt ?? ''\" [(visible)]=\"displayCropDialog\">\r\n <image-cropper\r\n [autoCrop]=\"true\"\r\n (imageCropped)=\"croppedImageChanged($event)\"\r\n [alignImage]=\"alignImage ?? 'center'\"\r\n [aspectRatio]=\"aspectRatio ?? 1\"\r\n [backgroundColor]=\"backgroundColor ?? null\"\r\n [canvasRotation]=\"canvasRotation ?? 0\"\r\n [containWithinAspectRatio]=\"containWithinAspectRatio ?? false\"\r\n [cropper]=\"cropper ?? { x1: -100, y1: -100, x2: 10000, y2: 10000 }\"\r\n [cropperMaxHeight]=\"cropperMaxHeight ?? 0\"\r\n [cropperMaxWidth]=\"cropperMaxWidth ?? 0\"\r\n [cropperMinHeight]=\"cropperMinHeight ?? 0\"\r\n [cropperMinWidth]=\"cropperMinWidth ?? 0\"\r\n [cropperStaticHeight]=\"cropperStaticHeight ?? 0\"\r\n [cropperStaticWidth]=\"cropperStaticWidth ?? 0\"\r\n [format]=\"format ?? 'png'\"\r\n [imageQuality]=\"imageQuality ?? 92\"\r\n [initialStepSize]=\"initialStepSize ?? 3\"\r\n [maintainAspectRatio]=\"maintainAspectRatio ?? true\"\r\n [onlyScaleDown]=\"onlyScaleDown ?? false\"\r\n [resizeToWidth]=\"resizeToWidth ?? 0\"\r\n [resizeToHeight]=\"resizeToHeight ?? 0\"\r\n [roundCropper]=\"roundCropper ?? false\"\r\n [imageFile]=\"tempImageFile!\"\r\n [imageURL]=\"uri!\"\r\n ></image-cropper>\r\n <div class=\"flex justify-content-end\">\r\n <div class=\"flex-auto align-items-center\">\r\n <span>Background color: </span>\r\n <p-colorPicker [(ngModel)]=\"backgroundColor\" appendTo=\"body\" class=\"ml-1 mr-1\"></p-colorPicker>\r\n <input pInputText [(ngModel)]=\"backgroundColor\" />\r\n </div>\r\n <button type=\"button\" pButton pRipple (click)=\"acceptCroppedImage()\" class=\"mr-2\">Ok</button>\r\n <button type=\"button\" pButton pRipple (click)=\"closeCropDialog()\">Cancel</button>\r\n </div>\r\n</p-dialog>\r\n","import { Component, forwardRef, Input, QueryList, ViewChildren } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { FileUpload } from 'primeng/fileupload';\r\n\n@Component({\n selector: 'rw-file',\n templateUrl: './restworld-file-view.component.html',\n styleUrls: ['./restworld-file-view.component.css'],\n providers: [{\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => RESTWorldFileViewComponent),\r\n multi: true\r\n }]\n})\nexport class RESTWorldFileViewComponent implements ControlValueAccessor {\n private onChange?: Function;\n @Input()\n public accept?: string;\n\n @Input()\n public fileName?: string;\n\r\n @ViewChildren(FileUpload)\r\n fileUploads?: QueryList<FileUpload>;\n\n public disabled = false;\n public uri?: string;\r\n\n writeValue(obj?: string): void {\r\n this.uri = obj;\r\n }\r\n registerOnChange(fn?: Function): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(): void {\r\n // not needed for this component, but needed to implement the interface\r\n }\r\n setDisabledState?(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\n\n public fileChanged(event: { files: File[] }): void {\r\n const file = event.files[0];\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n this.uri = reader.result as string;\r\n this.onChange?.(this.uri);\r\n };\r\n\r\n reader.readAsDataURL(file);\r\n }\n}\n","<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","import { CdkDragDrop } from '@angular/cdk/drag-drop';\r\nimport { OnInit } from '@angular/core';\r\nimport { ChangeDetectorRef } from '@angular/core';\r\nimport { Component, ContentChild, Input, TemplateRef } from '@angular/core';\nimport { AbstractControl, FormArray, FormGroup } from '@angular/forms';\r\nimport { Property, PropertyType, Resource, Template, TemplateDto } from '@wertzui/ngx-hal-client';\r\nimport { MessageService } from 'primeng/api';\r\nimport { ProblemDetails } from '../../models/problem-details';\r\nimport { FormService } from '../../services/form.service';\r\nimport { RESTworldClient } from '../../services/restworld-client';\r\nimport { RESTworldClientCollection } from '../../services/restworld-client-collection';\r\n\n@Component({\n selector: 'rw-form',\n templateUrl: './restworld-edit-form.component.html',\n styleUrls: ['./restworld-edit-form.component.css']\n})\nexport class RestworldEditFormComponent implements OnInit {\n @Input()\n formGroup!: FormGroup;\n\n @Input()\n template!: Template;\n\n @Input()\n apiName?: string;\n\n @ContentChild('inputOptionsSingle', { static: false })\n inputOptionsSingleRef?: TemplateRef<unknown>;\n\n @ContentChild('inputOptionsMultiple', { static: false })\n inputOptionsMultipleRef?: TemplateRef<unknown>;\n\n @ContentChild('inputOptions', { static: false })\n inputOptionsRef?: TemplateRef<unknown>;\n\n @ContentChild('inputHidden', { static: false })\n inputHiddenRef?: TemplateRef<unknown>;\n\n @ContentChild('inputText', { static: false })\n inputTextRef?: TemplateRef<unknown>;\n\n @ContentChild('inputTextarea', { static: false })\n inputTextareaRef?: TemplateRef<unknown>;\n\n @ContentChild('inputSearch', { static: false })\n inputSearchRef?: TemplateRef<unknown>;\n\n @ContentChild('inputTel', { static: false })\n inputTelRef?: TemplateRef<unknown>;\n\n @ContentChild('inputUrl', { static: false })\n inputUrlRef?: TemplateRef<unknown>;\n\n @ContentChild('inputEmail', { static: false })\n inputEmailRef?: TemplateRef<unknown>;\n\n @ContentChild('inputPassword', { static: false })\n inputPasswordRef?: TemplateRef<unknown>;\n\n @ContentChild('inputDate', { static: false })\n inputDateRef?: TemplateRef<unknown>;\n\n @ContentChild('inputMonth', { static: false })\n inputMonthRef?: TemplateRef<unknown>;\n\n @ContentChild('inputWeek', { static: false })\n inputWeekRef?: TemplateRef<unknown>;\n\n @ContentChild('inputTime', { static: false })\n inputTimeRef?: TemplateRef<unknown>;\n\n @ContentChild('inputDatetimeLocal', { static: false })\n inputDatetimeLocalRef?: TemplateRef<unknown>;\n\n @ContentChild('inputNumber', { static: false })\n inputNumberRef?: TemplateRef<unknown>;\n\n @ContentChild('inputRange', { static: false })\n inputRangeRef?: TemplateRef<unknown>;\n\n @ContentChild('inputColor', { static: false })\n inputColorRef?: TemplateRef<unknown>;\n\n @ContentChild('inputBool', { static: false })\n inputBoolRef?: TemplateRef<unknown>;\n\n @ContentChild('inputDatetimeOffset', { static: false })\n inputDatetimeOffsetRef?: TemplateRef<unknown>;\n\n @ContentChild('inputDuration', { static: false })\n inputDurationRef?: TemplateRef<unknown>;\n\n @ContentChild('inputImage', { static: false })\n inputImageRef?: TemplateRef<unknown>;\n\n @ContentChild('inputFile', { static: false })\n inputFileRef?: TemplateRef<unknown>;\n\n @ContentChild('inputObject', { static: false })\n inputObjectRef?: TemplateRef<unknown>;\n\n @ContentChild('inputCollection', { static: false })\n inputCollectionRef?: TemplateRef<unknown>;\n\n @ContentChild('inputDefault', { static: false })\n inputDefaultRef?: TemplateRef<unknown>;\n\n public get PropertyType() {\r\n return PropertyType;\r\n }\r\n\r\n public get dateFormat(): string {\r\n return new Date(3333, 10, 22)\r\n .toLocaleDateString()\r\n .replace(\"22\", \"dd\")\r\n .replace(\"11\", \"mm\")\r\n .replace(\"3333\", \"yy\")\r\n .replace(\"33\", \"y\");\r\n }\n\n public FormGroup = FormGroup;\n public FormArray = FormArray;\n public Number = Number;\n\n constructor(\n private _formService: FormService,\n private _changeDetectorRef: ChangeDetectorRef,\r\n private _messageService: MessageService,\r\n private _clients: RESTworldClientCollection\n ) { }\n\n ngOnInit(): void {\r\n if (!this.formGroup)\r\n throw new Error(\"[formGroup] is required on <rw-form>\");\r\n if (!this.template)\r\n throw new Error(\"[template] is required on <rw-form>\");\r\n if (!this.apiName)\r\n throw new Error(\"[apiName] is required on <rw-form>\");\r\n }\r\n\n public getTooltip(resource: Resource, keysToExclude?: string[]): string {\n const tooltip = Object.entries(resource)\n .filter(([key]) => !(key.startsWith('_') || ['createdAt', 'createdBy', 'lastChangedAt', 'lastChangedBy', 'timestamp'].includes(key) || keysToExclude?.includes(key)))\n .reduce((prev, [key, value], index) => `${prev}${index === 0 ? '' : '\\n'}${key}: ${RestworldEditFormComponent.jsonStringifyWithElipsis(value)}`, '');\n\n return tooltip;\n }\n\n private static jsonStringifyWithElipsis(value: unknown) {\n const maxLength = 200;\n const end = 10;\n const start = maxLength - end - 2;\n const json = JSON.stringify(value);\n const shortened = json.length > maxLength ? json.substring(0, start) + '…' + json.substring(json.length - end) : json;\n\n return shortened;\n }\n\n public getCollectionEntryTemplates(property?: Property): Template[] {\n if (!property)\r\n return [];\r\n\r\n return Object.entries(property._templates)\r\n .filter(([key,]) => Number.isInteger(Number.parseInt(key)))\r\n .map(([, value]) => value);\r\n }\n\n public addNewItemToCollection(property: Property, formArray: FormArray | AbstractControl): void {\n if (!(formArray instanceof FormArray))\n throw new Error('formArray is not an instance of FormArray.');\r\n\r\n const maxIndex = Math.max(...Object.keys(property._templates)\r\n .map(key => Number.parseInt(key))\r\n .filter(key => Number.isSafeInteger(key)));\r\n const nextIndex = maxIndex < 0 ? 0 : maxIndex + 1;\n\n const defaultTemplate = property._templates['default'];\r\n const copiedTemplateDto = JSON.parse(JSON.stringify(defaultTemplate)) as TemplateDto;\r\n const copiedTemplate = new Template(copiedTemplateDto);\r\n copiedTemplate.title = nextIndex.toString();\r\n\r\n property._templates[copiedTemplate.title] = copiedTemplate;\r\n formArray.push(this._formService.createFormGroupFromTemplate(defaultTemplate));\r\n }\n\n public deleteItemFromCollection(property: Property, formArray: FormArray | AbstractControl, template: Template): void {\n if (!template.title)\n throw new Error(`Cannot delete the item, because the template '${template}' does not have a title.`);\n\n if (!(formArray instanceof FormArray))\n throw new Error('formArray is not an instance of FormArray.');\n\n const templates = property._templates;\r\n delete templates[template.title];\r\n\r\n formArray.removeAt(Number.parseInt(template.title));\r\n }\n\n public collectionItemDropped($event: CdkDragDrop<{ property: Property; formArray: FormArray }>) {\n const formArray = $event.container.data.formArray;\r\n const previousIndex = $event.previousIndex;\r\n const currentIndex = $event.currentIndex;\r\n const movementDirection = currentIndex > previousIndex ? 1 : -1;\r\n\r\n // Move in FormArray\r\n // We do not need to move the item in the _templates object\r\n const movedControl = formArray.at(previousIndex);\r\n for (let i = previousIndex; i * movementDirection < currentIndex * movementDirection; i = i + movementDirection) {\r\n formArray.setControl(i, formArray.at(i + movementDirection));\r\n }\r\n formArray.setControl(currentIndex, movedControl);\r\n\r\n this._changeDetectorRef.markForCheck();\r\n\r\n console.log($event);\r\n }\n\r\n\r\n public async onOptionsFiltered(property: Property, event: { originalEvent: unknown; filter: string | null }) {\r\n const options = property?.options;\r\n\r\n if (!options?.link?.href || !event.filter || event.filter === '')\r\n return;\r\n\r\n\r\n const templatedUri = options.link.href;\r\n let filter = `contains(${options.promptField}, '${event.filter}')`;\r\n if (options.valueField?.toLowerCase() === 'id' && !Number.isNaN(Number.parseInt(event.filter)))\r\n filter = `(${options.valueField} eq ${event.filter}) or (${filter})`;\r\n\r\n const response = await this.getClient().getListByUri(templatedUri, { $filter: filter, $top: 10 });\r\n if (!response.ok || ProblemDetails.isProblemDetails(response.body) || !response.body) {\r\n const message = `An error occurred while getting the filtered items.`;\r\n this._messageService.add({ severity: 'error', summary: 'Error', detail: message, data: response });\r\n return;\r\n }\r\n\r\n const items = response.body._embedded.items;\r\n options.inline = items;\r\n }\r\n\r\n private getClient(): RESTworldClient {\r\n if (!this.apiName)\r\n throw new Error('Cannot get a client, because the apiName is not set.');\r\n\r\n return this._clients.getClient(this.apiName);\r\n }\n}\n","<div *ngFor=\"let property of template.properties\" class=\"grid field\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"property.type !== PropertyType.Hidden\" [attr.for]=\"property.name\" class=\"col-12 mb-2 md:col-2 md:mb-0\" [class.p-disabled]=\"property.readOnly\" [class.hasChildren]=\"property._templates\">{{property.prompt || property.name}}</label>\r\n <div class=\"col-12 md:col-10\">\r\n\r\n <ng-template #defaultInputOptions let-property=\"property\" let-template=\"template\">\r\n\r\n <ng-template #defaultInputOptionsSingle let-property=\"property\" let-template=\"template\">\r\n <p-dropdown [formControlName]=\"property.name\" [id]=\"property.name\" [options]=\"property.options.inline\" [filterBy]=\"(property.options.promptField || 'prompt') + ',' + (property.options.valueField || 'value')\" [optionValue]=\"property.options.valueField || 'value'\" [readonly]=\"property.readOnly\" [required]=\"property.required || property.options.minItems > 0\" [filter]=\"true\" [autoDisplayFirst]=\"false\" [showClear]=\"!property.required || property.options.minItems <= 0\" (onFilter)=\"onOptionsFiltered(property, $event)\" styleClass=\"w-full\" [filterPlaceholder]=\"property?.options?.link?.href ? 'search for more results' : ''\">\r\n <ng-template let-item pTemplate=\"selectedItem\">\r\n <span [pTooltip]=\"getTooltip(item, [property.options.promptField || 'prompt', property.options.valueField || 'value'])\">{{item[property.options.promptField || 'prompt']}} ({{item[property.options.valueField || 'value']}})</span>\r\n </ng-template>\r\n <ng-template let-item pTemplate=\"item\">\r\n <span [pTooltip]=\"getTooltip(item, [property.options.promptField || 'prompt', property.options.valueField || 'value'])\">{{item[property.options.promptField || 'prompt']}} ({{item[property.options.valueField || 'value']}})</span>\r\n </ng-template>\r\n </p-dropdown>\r\n </ng-template>\r\n <ng-container *ngIf=\"!property.options.maxItems || property.options.maxItems == 1\">\r\n <ng-container *ngTemplateOutlet=\"inputOptionsSingleRef || defaultInputOptionsSingle; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #defaultInputOptionsMultiple let-property=\"property\" let-template=\"template\">\r\n <p-multiSelect [formControlName]=\"property.name\" [id]=\"property.name\" [options]=\"property.options.inline\" [optionLabel]=\"property.options.promptField || 'prompt'\" [optionValue]=\"property.options.valueField || 'value'\" [readonly]=\"property.readOnly\" [selectionLimit]=\"property.options.maxItems\" [required]=\"property.required || property.options.minItems > 0\"></p-multiSelect>\r\n </ng-template>\r\n <ng-container *ngIf=\"property.options.maxItems > 1\">\r\n <ng-container *ngTemplateOutlet=\"inputOptionsMultipleRef || defaultInputOptionsMultiple; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n </ng-template>\r\n <ng-container *ngIf=\"property.options\">\r\n <ng-container *ngTemplateOutlet=\"inputOptionsRef || defaultInputOptions; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n <div *ngIf=\"!property.options\">\r\n <div [ngSwitch]=\"property.type\">\r\n\r\n <ng-template #defaultInputHidden let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"hidden\" [value]=\"property.value\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Hidden\">\r\n <ng-container *ngTemplateOutlet=\"inputHiddenRef || defaultInputHidden; context:{ property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #defaultInputText let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"text\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Text\">\r\n <ng-container *ngTemplateOutlet=\"inputTextRef || defaultInputText; context:{ property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputTextarea let-property=\"property\" let-template=\"template\">\r\n <textarea [formControlName]=\"property.name\" [id]=\"property.name\" pInputTextarea class=\"w-full p-inputtextarea p-inputtext p-component p-element\" [class.p-disabled]=\"property.readOnly\" [cols]=\"property.cols\" [rows]=\"property.rows\"></textarea>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Textarea\">\r\n <ng-container *ngTemplateOutlet=\"inputTextareaRef || defaultInputTextarea; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputSearch let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"search\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Search\">\r\n <ng-container *ngTemplateOutlet=\"inputSearchRef || defaultInputSearch; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputTel let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"tel\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Tel\">\r\n <ng-container *ngTemplateOutlet=\"inputTelRef || defaultInputTel; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputUrl let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"url\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Url\">\r\n <ng-container *ngTemplateOutlet=\"inputUrlRef || defaultInputUrl; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputEmail let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"email\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Email\">\r\n <ng-container *ngTemplateOutlet=\"inputEmailRef || defaultInputEmail; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputPassword let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"password\" pPassword class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Password\">\r\n <ng-container *ngTemplateOutlet=\"inputPasswordRef || defaultInputPassword; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDate let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showWeek]=\"true\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Date\">\r\n <ng-container *ngTemplateOutlet=\"inputDateRef || defaultInputDate; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputMonth let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showWeek]=\"false\" view=\"month\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Month\">\r\n <ng-container *ngTemplateOutlet=\"inputMonthRef || defaultInputMonth; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputWeek let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"week\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Week\">\r\n <ng-container *ngTemplateOutlet=\"inputWeekRef || defaultInputWeek; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputTime let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [timeOnly]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Time\">\r\n <ng-container *ngTemplateOutlet=\"inputTimeRef || defaultInputTime; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDatetimeLocal let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.DatetimeLocal\">\r\n <ng-container *ngTemplateOutlet=\"inputDatetimeLocalRef || defaultInputDatetimeLocal; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputNumber let-property=\"property\" let-template=\"template\">\r\n <p-inputNumber [formControlName]=\"property.name\" [id]=\"property.name\" mode=\"decimal\" [showButtons]=\"!property.readOnly\" class=\"w-full\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-inputNumber>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Number\">\r\n <ng-container *ngTemplateOutlet=\"inputNumberRef || defaultInputNumber; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputRange let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"range\" [min]=\"property.min\" [max]=\"property.max\" [step]=\"property.step\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Range\">\r\n <ng-container *ngTemplateOutlet=\"inputRangeRef || defaultInputRange; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputColor let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"color\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Color\">\r\n <ng-container *ngTemplateOutlet=\"inputColorRef || defaultInputColor; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputBool let-property=\"property\" let-template=\"template\" let-formGroup=\"formGroup\">\r\n <p-checkbox *ngIf=\"property.required\" [binary]=\"true\" [formControl]=\"formGroup.controls[property.name]\" [id]=\"property.name\" [readonly]=\"property.readOnly\"></p-checkbox>\r\n <p-triStateCheckbox *ngIf=\"!property.required\" [formControl]=\"formGroup.controls[property.name]\" [id]=\"property.name\" [readonly]=\"property.readOnly\"></p-triStateCheckbox>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Bool\">\r\n <ng-container *ngTemplateOutlet=\"inputBoolRef || defaultInputBool; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDatetimeOffset let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.DatetimeOffset\">\r\n <ng-container *ngTemplateOutlet=\"inputDatetimeOffsetRef || defaultInputDatetimeOffset; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDuration let-property=\"property\" let-template=\"template\">\r\n <p-calendar *ngSwitchCase=\"PropertyType.Duration\" [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [timeOnly]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Duration\">\r\n <ng-container *ngTemplateOutlet=\"inputDurationRef || defaultInputDuration; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputImage let-property=\"property\" let-template=\"template\">\r\n <rw-image\r\n [formControlName]=\"property.name\"\r\n [accept]=\"property.restWorldImage.accept ?? property.placeholder ?? 'image/*'\"\r\n [alignImage]=\"property.restWorldImage.alignImage\"\r\n [alt]=\"property.prompt ?? property.name\"\r\n [aspectRatio]=\"property.restWorldImage.aspectRatio\"\r\n [backgroundColor]=\"property.restWorldImage.backgroundColor\"\r\n [canvasRotation]=\"property.restWorldImage.canvasRotation\"\r\n [containWithinAspectRatio]=\"property.restWorldImage.containWithinAspectRatio\"\r\n [cropper]=\"property.restWorldImage.cropper\"\r\n [cropperMaxHeight]=\"property.restWorldImage.cropperMaxHeight\"\r\n [cropperMaxWidth]=\"property.restWorldImage.cropperMaxWidth\"\r\n [cropperMinHeight]=\"property.restWorldImage.cropperMinHeight\"\r\n [cropperMinWidth]=\"property.restWorldImage.cropperMinWidth\"\r\n [cropperStaticHeight]=\"property.restWorldImage.cropperStaticHeight\"\r\n [cropperStaticWidth]=\"property.restWorldImage.cropperStaticWidth\"\r\n [fileName]=\"property.name + '.' + (property.restWorldImage.format ?? 'png')\"\r\n [format]=\"property.restWorldImage.format\"\r\n [imageQuality]=\"property.restWorldImage.imageQuality\"\r\n [initialStepSize]=\"property.restWorldImage.initialStepSize\"\r\n [maintainAspectRatio]=\"property.restWorldImage.maintainAspectRatio\"\r\n [onlyScaleDown]=\"property.restWorldImage.onlyScaleDown\"\r\n [resizeToWidth]=\"property.restWorldImage.resizeToWidth\"\r\n [resizeToHeight]=\"property.restWorldImage.resizeToHeight\"\r\n [roundCropper]=\"property.restWorldImage.roundCropper\"></rw-image>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Image\">\r\n <ng-container *ngTemplateOutlet=\"inputImageRef || defaultInputImage; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputFile let-property=\"property\" let-template=\"template\">\r\n <rw-file [formControlName]=\"property.name\" [fileName]=\"property.name\" [accept]=\"property.placeholder\"></rw-file>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.File\">\r\n <ng-container *ngTemplateOutlet=\"inputFileRef || defaultInputFile; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputObject let-property=\"property\" let-template=\"template\">\r\n <div class=\"flex align-items-center\">\r\n <div class=\"brace\">\r\n </div>\r\n <div class=\"w-full\">\r\n <rw-form [formGroup]=\"(formGroup.controls[property.name] | as : FormGroup)\" [template]=\"property._templates.default\" [apiName]=\"apiName\"></rw-form>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Object\">\r\n <ng-container *ngTemplateOutlet=\"inputObjectRef || defaultInputObject; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputCollection let-property=\"property\" let-template=\"template\">\r\n <div class=\"flex align-items-center\">\r\n <div class=\"brace\">\r\n </div>\r\n <div class=\"w-full\" cdkDropList [cdkDropListData]=\"{ property: property, formArray: (formGroup.controls[property.name] | as : FormArray)}\" (cdkDropListDropped)=\"collectionItemDropped($event)\">\r\n <div *ngFor=\"let template of getCollectionEntryTemplates(property)\" class=\"flex align-items-center\" cdkDrag>\r\n <i class=\"fas fa-grip-lines\" cdkDragHandle></i>\r\n <div class=\"brace\">\r\n </div>\r\n <div class=\"w-full flex justify-content-end\">\r\n <rw-form [formGroup]=\"((formGroup.controls[property.name] | as : FormArray).controls[Number.parseInt(template.title!)] | as : FormGroup)\" [template]=\"template\" [apiName]=\"apiName\" class=\"w-full\"></rw-form>\r\n <button pButton pRipple type=\"button\" icon=\"fas fa-trash\" class=\"p-button-outlined p-button-danger ml-2 mb-3\" (click)=\"deleteItemFromCollection(property, formGroup.controls[property.name], template)\"></button>\r\n </div>\r\n </div>\r\n <div class=\"flex justify-content-end w-full\">\r\n <button pButton pRipple type=\"button\" icon=\"fas fa-plus\" class=\"p-button-outlined p-button-info\" (click)=\"addNewItemToCollection(property, formGroup.controls[property.name])\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Collection\">\r\n <ng-container *ngTemplateOutlet=\"inputCollectionRef || defaultInputCollection; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDefault let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"text\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngTemplateOutlet=\"inputDefaultRef || defaultInputDefault; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n <val-errors [controlName]=\"property.name || null\">\r\n <ng-template valError=\"required\">The field '{{property.prompt || property.name}}' is required.</ng-template>\r\n <ng-template valError=\"email\">The email must be a valid email address.</ng-template>\r\n <ng-template valError=\"min\" let-error=\"error\">'{{property.prompt || property.name}}' must be equal or greater than or equal to {{ error.min }}.</ng-template>\r\n <ng-template valError=\"max\" let-error=\"error\">'{{property.prompt || property.name}}' must be smaller than or equal to {{ error.max }}.</ng-template>\r\n <ng-template valError=\"minlength\" let-error=\"error\">The length of '{{property.prompt || property.name}}' must be equal or greater than or equal to {{ error.requiredLength }}.</ng-template>\r\n <ng-template valError=\"maxlength\" let-error=\"error\">The length of '{{property.prompt || property.name}}' must be shorter than or equal to {{ error.requiredLength }}.</ng-template>\r\n <ng-template valError=\"pattern\" let-error=\"error\">The value for '{{property.prompt || property.name}}' does not match the pattern {{ error }}.</ng-template>\r\n <ng-template valError=\"remote\" let-error=\"error\">{{ error }}</ng-template>\r\n </val-errors>\r\n </div>\r\n</div>\r\n","import { Component, Input } from '@angular/core';\r\nimport { PropertyType, Resource, Template, Templates, FormsResource, Property } from '@wertzui/ngx-hal-client';\r\nimport { RESTworldClient } from '../../services/restworld-client';\r\nimport { RESTworldClientCollection } from '../../services/restworld-client-collection';\r\nimport { AbstractControl, FormArray, FormControl, FormGroup } from '@angular/forms';\r\nimport { ConfirmationService, MessageService } from 'primeng/api';\r\nimport { Location } from '@angular/common';\r\nimport { Router } from '@angular/router';\r\nimport { ProblemDetails } from '../../models/problem-details';\r\nimport { ContentChild } from '@angular/core';\r\nimport { TemplateRef } from '@angular/core';\r\nimport { ValdemortConfig } from 'ngx-valdemort';\r\nimport { FormService } from '../../services/form.service';\r\n\r\n@Component({\r\n selector: 'rw-edit',\r\n templateUrl: './restworld-edit-view.component.html',\r\n styleUrls: ['./restworld-edit-view.component.css']\r\n})\r\nexport class RESTworldEditViewComponent {\r\n public get PropertyType() {\r\n return PropertyType;\r\n }\r\n public get templates() {\r\n return this._templates;\r\n }\r\n private _templates: Templates = {};\r\n\r\n public get isLoadingForTheFirstTime() {\r\n return Object.keys(this.templates).length === 0 && this.isLoading;\r\n }\r\n\r\n public get formTabs() {\r\n return this._formTabs;\r\n }\r\n private _formTabs: { [name: string]: FormGroup } = {};\r\n\r\n @Input()\r\n public set apiName(value: string | undefined) {\r\n this._apiName = value;\r\n this.load();\r\n }\r\n public get apiName(): string | undefined {\r\n return this._apiName;\r\n }\r\n private _apiName?: string;\r\n //@Input()\r\n //public set rel(value: string | undefined) {\r\n // this._rel = value;\r\n //}\r\n //public get rel(): string | undefined {\r\n // return this._rel;\r\n //}\r\n //private _rel?: string;\r\n @Input()\r\n public set uri(value: string | undefined) {\r\n this._uri = value;\r\n this.load();\r\n }\r\n public get uri(): string | undefined {\r\n return this._uri;\r\n }\r\n private _uri?: string;\r\n\r\n public get resource() {\r\n return this._resource;\r\n }\r\n private _resource?: Resource;\r\n public isLoading = false;\r\n public get canSave() {\r\n const length = this.resource?._links[\"save\"]?.length;\r\n return length !== undefined && length > 0;\r\n }\r\n public get canDelete() {\r\n const length = this.resource?._links[\"delete\"]?.length;\r\n return length !== undefined && length > 0;\r\n }\r\n public canSubmit(templateName: string) {\r\n const form = this.formTabs[templateName];\r\n return form && form.valid;\r\n }\r\n\r\n @ContentChild('extraTabs', { static: false })\r\n extraTabsRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('buttons', { static: false })\r\n buttonsRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputOptionsSingle', { static: false })\r\n inputOptionsSingleRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputOptionsMultiple', { static: false })\r\n inputOptionsMultipleRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputOptions', { static: false })\r\n inputOptionsRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputHidden', { static: false })\r\n inputHiddenRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputText', { static: false })\r\n inputTextRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputTextarea', { static: false })\r\n inputTextareaRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputSearch', { static: false })\r\n inputSearchRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputTel', { static: false })\r\n inputTelRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputUrl', { static: false })\r\n inputUrlRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputEmail', { static: false })\r\n inputEmailRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputPassword', { static: false })\r\n inputPasswordRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputDate', { static: false })\r\n inputDateRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputMonth', { static: false })\r\n inputMonthRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputWeek', { static: false })\r\n inputWeekRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputTime', { static: false })\r\n inputTimeRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputDatetimeLocal', { static: false })\r\n inputDatetimeLocalRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputNumber', { static: false })\r\n inputNumberRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputRange', { static: false })\r\n inputRangeRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputColor', { static: false })\r\n inputColorRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputBool', { static: false })\r\n inputBoolRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputDatetimeOffset', { static: false })\r\n inputDatetimeOffsetRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputDuration', { static: false })\r\n inputDurationRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputImage', { static: false })\r\n inputImageRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputFile', { static: false })\r\n inputFileRef?: TemplateRef<unknown>;\r\n\r\n @ContentChild('inputDefault', { static: false })\r\n inputDefaultRef?: TemplateRef<unknown>;\r\n\r\n constructor(\r\n private _clients: RESTworldClientCollection,\r\n private _confirmationService: ConfirmationService,\r\n private _messageService: MessageService,\r\n private _location: Location,\r\n private _router: Router,\r\n private _formService: FormService,\r\n valdemortConfig: ValdemortConfig) {\r\n valdemortConfig.errorClasses = 'p-error text-sm';\r\n }\r\n\r\n public getTooltip(resource: Resource, keysToExclude?: string[]): string {\r\n const tooltip = Object.entries(resource)\r\n .filter(([key]) => !(key.startsWith('_') || ['createdAt', 'createdBy', 'lastChangedAt', 'lastChangedBy', 'timestamp'].includes(key) || keysToExclude?.includes(key)))\r\n .reduce((prev, [key, value], index) => `${prev}${index === 0 ? '' : '\\n'}${key}: ${RESTworldEditViewComponent.jsonStringifyWithElipsis(value)}`, '');\r\n\r\n return tooltip;\r\n }\r\n\r\n private static jsonStringifyWithElipsis(value: unknown) {\r\n const maxLength = 200;\r\n const end = 10;\r\n const start = maxLength - end - 2;\r\n const json = JSON.stringify(value);\r\n const shortened = json.length > maxLength ? json.substring(0, start) + '…' + json.substring(json.length - end) : json;\r\n\r\n return shortened;\r\n }\r\n\r\n private getClient(): RESTworldClient {\r\n if (!this.apiName)\r\n throw new Error('Cannot get a client, because the apiName is not set.');\r\n\r\n return this._clients.getClient(this.apiName);\r\n }\r\n\r\n public async submit(templateName: string, template: Template, formValue: {}) {\r\n this.isLoading = true;\r\n\r\n try {\r\n const targetBeforeSave = template.target;\r\n const response = await this.getClient().submit(template, formValue);\r\n\r\n if (!response.ok) {\r\n let summary = 'Error';\r\n let detail = 'Error while saving the resource.';\r\n if (ProblemDetails.isProblemDetails(response.body)) {\r\n const problemDetails = response.body as ProblemDetails;\r\n summary = problemDetails.title || summary;\r\n detail = problemDetails.detail || detail;\r\n // display validation errors\r\n if (problemDetails['errors'] as {}) {\r\n const form = this.formTabs[templateName];\r\n for (const [key, errorsForKey] of Object.entries(problemDetails['errors'] as {})) {\r\n const path = key.split(/\\.|\\[/).map(e => e.replace(\"]\", \"\"));\r\n // The path might start with a $, indicating the root.\r\n if (path.length > 0 && path[0] === '$')\r\n path.shift();\r\n const formControl = path.reduce<AbstractControl>(RESTworldEditViewComponent.getSubControl, form);\r\n formControl.setErrors({ ...formControl.errors, ...{ remote: errorsForKey } });\r\n formControl.markAsTouched();\r\n }\r\n }\r\n }\r\n\r\n this._messageService.add({ severity: 'error', summary: summary, detail: detail, data: response, life: 10000 });\r\n }\r\n else {\r\n const responseResource = (response.body as FormsResource);\r\n const targetAfterSave = responseResource._templates[templateName].target;\r\n\r\n setTimeout(() =>\r\n this._messageService.add({ severity: 'success', summary: 'Saved', detail: 'The resource has been saved.' }),\r\n 100);\r\n\r\n if (targetBeforeSave !== targetAfterSave) {\r\n this._router.navigate(['/edit', this.apiName, responseResource._links.self[0].href]);\r\n }\r\n }\r\n\r\n }\r\n catch (e: unknown) {\r\n this._messageService.add({ severity: 'error', summary: 'Error', detail: `An unknown error occurred. ${JSON.stringify(e)}`, life: 10000 });\r\n console.log(e);\r\n }\r\n\r\n this.isLoading = false;\r\n }\r\n\r\n private static getSubControl(control: AbstractControl, pathElement: string): AbstractControl {\r\n if (control instanceof FormGroup)\r\n return control.controls[pathElement];\r\n if (control instanceof FormArray) {\r\n const index = Number.parseInt(pathElement);\r\n if (Number.isInteger(index))\r\n return control.controls[index];\r\n }\r\n return control;\r\n }\r\n\r\n public showDeleteConfirmatioModal() {\r\n this._confirmationService.confirm({\r\n message: 'Do you really want to delete this resource?',\r\n header: 'Confirm delete',\r\n icon: 'far fa-trash-alt',\r\n accept: () => this.delete()\r\n });\r\n }\r\n\r\n public async delete(): Promise<void> {\r\n if (!this.apiName || !this.uri || !this.resource)\r\n return;\r\n\r\n Object.assign(this.resource, this.formTabs.value);\r\n\r\n await this.getClient().delete(this.resource);\r\n setTimeout(() =>\r\n this._messageService.add({ severity: 'success', summary: 'Deleted', detail: 'The resource has been deleted.' }),\r\n 100);\r\n\r\n this._location.back();\r\n }\r\n\r\n public async load(): Promise<void> {\r\n if (!this.apiName || !this.uri)\r\n return;\r\n\r\n this.isLoading = true;\r\n\r\n const response = await this.getClient().getSingle(this.uri);\r\n if (!response.ok || ProblemDetails.isProblemDetails(response.body) || !response.body) {\r\n this._messageService.add({ severity: 'error', summary: 'Error', detail: 'Error while loading the resource from the API.', data: response });\r\n }\r\n else {\r\n this._resource = response.body;\r\n this._templates = await this.getAllTemplates(this._resource);\r\n this._formTabs = this._formService.createFormGroupsFromTemplates(this._templates);\r\n }\r\n\r\n this.isLoading = false;\r\n }\r\n\r\n private async setInitialSelectedOptionsElementsForTemplates(templates: Templates, skipDefaultTemplate: boolean): Promise<void> {\r\n await Promise.all(Object.entries(templates)\r\n .filter(([name,]) => !skipDefaultTemplate || name !== 'default')\r\n .map(([, template]) => this.setInitialSelectedOptionsElementsForTemplate(template)));\r\n }\r\n\r\n private async setInitialSelectedOptionsElementsForTemplate(template: Template): Promise<void> {\r\n const propertyPromises = template.properties\r\n .filter(property => property?.options?.link?.href)\r\n .map(property => this.setInitialSelectedOptionsElementForProperty(property));\r\n const nestedTemplatePromised = template.properties\r\n .filter(property => property?._templates)\r\n .map(property => this.setInitialSelectedOptionsElementsForTemplates(property._templates, true));\r\n const allPromises = propertyPromises.concat(nestedTemplatePromised);\r\n\r\n await Promise.all(allPromises);\r\n }\r\n\r\n private async setInitialSelectedOptionsElementForProperty(property: Property): Promise<void> {\r\n const options = property?.options;\r\n\r\n if (!options?.link?.href)\r\n return;\r\n\r\n const templatedUri = options.link.href;\r\n const filter = `${options.valueField} eq ${property.value}`;\r\n const response = await this.getClient().getListByUri(templatedUri, { $filter: filter, $top: 10 });\r\n if (!response.ok || ProblemDetails.isProblemDetails(response.body) || !response.body) {\r\n const message = `An error occurred while getting the filtered items.`;\r\n this._messageService.add({ severity: 'error', summary: 'Error', detail: message, data: response });\r\n return;\r\n }\r\n\r\n const items = response.body._embedded.items;\r\n options.inline = items;\r\n }\r\n\r\n private async getAllTemplates(resource: Resource): Promise<Templates> {\r\n const formResponses = await this.getClient().getAllForms(resource);\r\n\r\n const failedResponses = formResponses.filter(response => !response.ok || ProblemDetails.isProblemDetails(response.body) || !response.body);\r\n if (failedResponses.length !== 0) {\r\n for (const response of failedResponses) {\r\n this._messageService.add({ severity: 'error', summary: 'Error', detail: 'Error while loading the resource from the API.', data: response });\r\n }\r\n return Promise.resolve({});\r\n }\r\n\r\n const formTemplates = Object.assign({}, ...formResponses.map(response => (response.body as FormsResource)._templates)) as Templates;\r\n\r\n await this.setInitialSelectedOptionsElementsForTemplates(formTemplates, false);\r\n\r\n return formTemplates;\r\n }\r\n\r\n public imageChanged(formControl: FormControl, event: { files: File[] }): void {\r\n const file = event.files[0];\r\n console.log(file);\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n const uri = reader.result;\r\n console.log(uri);\r\n formControl.setValue(uri);\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n}\r\n","<div class=\"grid\">\r\n <div class=\"col\">\r\n <h1>Edit resource</h1>\r\n </div>\r\n</div>\r\n\r\n<p-tabView>\r\n\r\n <p-tabPanel *ngIf=\"isLoadingForTheFirstTime\" header=\"Loading\">\r\n <div *ngFor=\"let i of [1, 2, 3, 4, 5]\" class=\"grid field\">\r\n <p-skeleton class=\"col-12 mb-2 md:col-2 md:mb-0\" height=\"39px\"></p-skeleton>\r\n <div class=\"col-12 md:col-10\">\r\n <p-skeleton class=\"w-full\" height=\"39px\"></p-skeleton>\r\n </div>\r\n </div>\r\n <div class=\"grid\">\r\n <div class=\"col\">\r\n <div class=\"flex justify-content-end w-full\">\r\n <p-skeleton width=\"120px\" height=\"39px\" class=\"mx-2\"></p-skeleton>\r\n <p-skeleton width=\"120px\" height=\"39px\" class=\"mx-2\"></p-skeleton>\r\n <p-skeleton width=\"120px\" height=\"39px\" class=\"mx-2\"></p-skeleton>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n\r\n <p-tabPanel *ngFor=\"let item of templates | keyvalue\" [header]=\"item.value.title || item.key\" [disabled]=\"isLoading\">\r\n <form [formGroup]=\"formTabs[item.key]\" (ngSubmit)=\"submit(item.key, item.value, formTabs[item.key].value)\">\r\n <div class=\"blockable-container\">\r\n <div class=\"blockable-element\">\r\n <rw-form [formGroup]=\"formTabs[item.key]\" [template]=\"item.value\" [apiName]=\"apiName\"></rw-form>\r\n </div>\r\n <div class=\"blockable-overlay\" *ngIf=\"isLoading\">\r\n <p-progressSpinner></p-progressSpinner>\r\n </div>\r\n </div>\r\n\r\n <div class=\"grid\">\r\n <div class=\"col\">\r\n <div class=\"flex justify-content-end w-full\">\r\n <ng-template #defaultButtons>\r\n <button pButton pRipple type=\"submit\" label=\"Save\" icon=\"far fa-save\" class=\"mx-2 p-button-success\" [disabled]=\"isLoading || !canSubmit(item.key)\"></button>\r\n <button pButton pRipple type=\"button\" label=\"Reload\" icon=\"fas fa-redo\" class=\"mx-2 p-button-info\" (click)=\"load()\" [disabled]=\"isLoading\"></button>\r\n <button pButton pRipple type=\"button\" label=\"Delete\" icon=\"far fa-trash-alt\" class=\"ml-2 p-button-danger\" (click)=\"showDeleteConfirmatioModal()\" [disabled]=\"!resource || isLoading || !canDelete\"></button>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"buttonsRef || defaultButtons\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </p-tabPanel>\r\n\r\n <ng-template #defaultExtraTabs>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"extraTabsRef || defaultExtraTabs\"></ng-container>\r\n\r\n</p-tabView>\r\n\r\n<p-toast></p-toast>\r\n<p-confirmDialog></p-confirmDialog>\r\n","import { Component, Input } from '@angular/core';\r\nimport { PagedListResource, Resource, ResourceDto } from '@wertzui/ngx-hal-client';\r\nimport * as _ from 'lodash';\r\nimport { ConfirmationService, FilterMatchMode, FilterMetadata, LazyLoadEvent, MenuItem, MessageService } from 'primeng/api';\r\nimport { RESTworldClient } from '../../services/restworld-client';\r\nimport { RESTworldClientCollection } from '../../services/restworld-client-collection';\r\nimport { ProblemDetails } from '../../models/problem-details';\r\nimport { AvatarGenerator } from '../../services/avatar-generator';\r\nimport { Router } from '@angular/router';\r\n\r\nexport enum ColumnType {\r\n text = 'text',\r\n numeric = 'numeric',\r\n boolean = 'boolean',\r\n date = 'date',\r\n array = 'array',\r\n object = 'object'\r\n}\r\n\r\nexport interface Column {\r\n header: string;\r\n field: string;\r\n type: ColumnType;\r\n}\r\n\r\n@Component({\r\n selector: 'rw-list',\r\n templateUrl: './restworld-list-view.component.html',\r\n styleUrls: ['./restworld-list-view.component.css']\r\n})\r\nexport class RESTworldListViewComponent<TListDto extends ResourceDto> {\r\n\r\n public get columns(): Column[] {\r\n return this._columns;\r\n }\r\n private _columns: Column[] = [];\r\n @Input()\r\n public set editLink(value: string) {\r\n if (value)\r\n this._editLink = value;\r\n }\r\n public get editLink() {\r\n return this._editLink;\r\n }\r\n private _editLink = '/edit';\r\n\r\n @Input()\r\n public set apiName(value: string | undefined) {\r\n this._apiName = value;\r\n this.load(this._lastEvent);\r\n }\r\n public get apiName(): string | undefined {\r\n return this._apiName;\r\n }\r\n private _apiName?: string;\r\n\r\n @Input()\r\n public set rel(value: string | undefined) {\r\n this._rel = value;\r\n this.load(this._lastEvent);\r\n }\r\n public get rel(): string | undefined {\r\n return this._rel;\r\n }\r\n private _rel?: string;\r\n\r\n @Input()\r\n public set sortField(value: string | undefined) {\r\n this._sortField = value ?? '';\r\n this._lastEvent.sortField = value;\r\n this.load(this._lastEvent);\r\n }\r\n public get sortField(): string {\r\n return this._sortField;\r\n }\r\n private _sortField = '';\r\n\r\n @Input()\r\n public set sortOrder(value: number | undefined) {\r\n this._sortOrder = value ?? 1;\r\n this._lastEvent.sortOrder = value;\r\n this.load(this._lastEvent);\r\n }\r\n public get sortOrder(): number {\r\n return this._sortOrder;\r\n }\r\n private _sortOrder = 1;\r\n\r\n @Input()\r\n public rowsPerPage: number[];\r\n\r\n @Input()\r\n public createButtonMenu?: MenuItem[];\r\n\r\n public resource?: PagedListResource<TListDto>;\r\n public isLoading = false;\r\n private _totalRecords = 0;\r\n private _lastEvent: LazyLoadEvent;\r\n public get value(): Resource[] {\r\n return this.resource?._embedded?.items || [];\r\n }\r\n public get rows(): number {\r\n return this._lastEvent?.rows || 0;\r\n }\r\n public get totalRecords(): number {\r\n return this._totalRecords;\r\n }\r\n private set totalRecords(value: number | undefined) {\r\n this._totalRecords = value || 0;\r\n }\r\n\r\n public get newHref(): string | undefined {\r\n return this.resource?.findLink('new')?.href;\r\n }\r\n\r\n private static _dateFormat = new Date(3333, 10, 22)\r\n .toLocaleDateString()\r\n .replace(\"22\", \"dd\")\r\n .replace(\"11\", \"MM\")\r\n .replace(\"3333\", \"y\")\r\n .replace(\"33\", \"yy\");\r\n\r\n public get dateFormat(): string {\r\n return RESTworldListViewComponent._dateFormat;\r\n }\r\n\r\n constructor(\r\n private _clients: RESTworldClientCollection,\r\n private _confirmationService: ConfirmationService,\r\n private _messageService: MessageService,\r\n public avatarGenerator: AvatarGenerator,\r\n private readonly _router: Router) {\r\n this.rowsPerPage = [10, 25, 50];\r\n\r\n this._lastEvent = {\r\n rows: this.rowsPerPage[0]\r\n };\r\n }\r\n\r\n public createNew(): Promise<boolean> {\r\n return this._router.navigate([this.editLink, this.apiName, this.newHref]);\r\n }\r\n\r\n private getClient(): RESTworldClient {\r\n if (!this.apiName)\r\n throw new Error('Cannot get a client, because the apiName is not set.');\r\n\r\n return this._clients.getClient(this.apiName);\r\n }\r\n\r\n public load = _.debounce(this.load2, 100);\r\n\r\n public async load2(event: LazyLoadEvent): Promise<void> {\r\n if (!this.apiName || !this.rel)\r\n return;\r\n\r\n this.isLoading = true;\r\n this._lastEvent = event;\r\n\r\n const parameters = this.createParametersFromEvent(event);\r\n const response = await this.getClient().getList<TListDto>(this.rel, parameters);\r\n if (!response.ok || ProblemDetails.isProblemDetails(response.body) || !response.body) {\r\n this._messageService.add({ severity: 'error', summary: 'Error', detail: 'Error while loading the resources from the API.', data: response });\r\n }\r\n else if (response.body) {\r\n this.resource = response.body;\r\n this.totalRecords = this.resource.totalPages && parameters.$top ? this.resource.totalPages * parameters.$top : undefined;\r\n this._columns = this.createColumns();\r\n }\r\n\r\n this.isLoading = false;\r\n }\r\n\r\n\r\n public showDeleteConfirmatioModal(resource: Resource) {\r\n this._confirmationService.confirm({\r\n message: 'Do you really want to delete this resource?',\r\n header: 'Confirm delete',\r\n icon: 'far fa-trash-alt',\r\n accept: () => this.delete(resource)\r\n });\r\n }\r\n\r\n public async delete(resource: Resource): Promise<void> {\r\n if (!this.apiName || !this.rel)\r\n return;\r\n\r\n await this.getClient().delete(resource);\r\n\r\n this._messageService.add({ severity: 'success', summary: 'Deleted', detail: 'The resource has been deleted.' });\r\n\r\n this.load(this._lastEvent);\r\n }\r\n\r\n private createColumns(): Column[] {\r\n if (this.value.length === 0)\r\n return this.columns;\r\n\r\n // Get all distinct properties from all rows\r\n // We look at all rows to eliminate possible undefined values\r\n const rowsWithProperties = this.value\r\n .map(resource =>\r\n Object.entries(resource)\r\n .filter(p =>\r\n p[0] !== '_links' &&\r\n p[0] !== '_embedded' &&\r\n p[0] !== 'id' &&\r\n p[0] !== 'timestamp'));\r\n\r\n const distinctProperties = rowsWithProperties[0];\r\n for (const propertiesOfRow of rowsWithProperties) {\r\n for (const property of propertiesOfRow) {\r\n const propertyName = property[0];\r\n const propertyValue = property[1];\r\n const alreadyFoundPropertyWithSameName = distinctProperties.find(p => p[0] === propertyName);\r\n if (!alreadyFoundPropertyWithSameName) // Add new property\r\n distinctProperties.push(property);\r\n else if (!alreadyFoundPropertyWithSameName[1] && propertyValue) // Use defined value instead of existing undefined value\r\n alreadyFoundPropertyWithSameName[1] = propertyValue;\r\n }\r\n }\r\n\r\n // Check if the rows are entities with change tracking\r\n const withoutChangeTrackingProperties = distinctProperties.filter(p =>\r\n p[0] !== 'createdAt' &&\r\n p[0] !== 'createdBy' &&\r\n p[0] !== 'lastChangedAt' &&\r\n p[0] !== 'lastChangedBy');\r\n const hasChangeTrackingProperties = withoutChangeTrackingProperties.length < distinctProperties.length;\r\n\r\n // First the id, then all other properties\r\n const sortedProperties: [string, unknown][] = [\r\n ['id', 0],\r\n ...withoutChangeTrackingProperties\r\n ];\r\n\r\n // And change tracking properties at the end\r\n if (hasChangeTrackingProperties) {\r\n sortedProperties.push(['createdAt', new Date()]);\r\n sortedProperties.push(['createdBy', '']);\r\n sortedProperties.push(['lastChangedAt', new Date()]);\r\n sortedProperties.push(['lastChangedBy', '']);\r\n }\r\n\r\n const columns = sortedProperties\r\n .map(p => ({\r\n header: RESTworldListViewComponent.toTitleCase(p[0]),\r\n field: p[0],\r\n type: RESTworldListViewComponent.getColumnType(p[1]),\r\n }));\r\n\r\n return columns;\r\n }\r\n\r\n private static getColumnType(value: unknown): ColumnType {\r\n if (value === null || value === undefined)\r\n return ColumnType.text;\r\n\r\n if (_.isNumber(value))\r\n return ColumnType.numeric;\r\n\r\n if (_.isDate(value))\r\n return ColumnType.date;\r\n\r\n if (_.isString(value))\r\n return ColumnType.text;\r\n\r\n if (_.isBoolean(value))\r\n return ColumnType.boolean;\r\n\r\n if (_.isArrayLike(value))\r\n return ColumnType.array;\r\n\r\n if (_.isObjectLike(value))\r\n return ColumnType.object;\r\n\r\n return ColumnType.text;\r\n }\r\n\r\n private static toTitleCase(anyCase: string) {\r\n return anyCase\r\n .replace(/(_)+/g, ' ') // underscore to whitespace\r\n .replace(/([a-z])([A-Z][a-z])/g, \"$1 $2\") // insert space before each new word if there is none\r\n .replace(/([A-Z][a-z])([A-Z])/g, \"$1 $2\") // insert space after each word if there is none\r\n .replace(/([a-z])([A-Z]+[a-z])/g, \"$1 $2\") // insert space after single letter word if there is none\r\n .replace(/([A-Z]+)([A-Z][a-z][a-z])/g, \"$1 $2\") // insert space before single letter word if there is none\r\n .replace(/([a-z]+)([A-Z0-9]+)/g, \"$1 $2\") // insert space after numbers\r\n .replace(/^./, (match) => match.toUpperCase()); // change first letter to be upper case\r\n }\r\n\r\n private createParametersFromEvent(event: LazyLoadEvent) {\r\n const oDataParameters = {\r\n $filter: this.createFilterFromEvent(event),\r\n $orderby: RESTworldListViewComponent.createOrderByFromEvent(event),\r\n $top: RESTworldListViewComponent.createTopFromEvent(event),\r\n $skip: RESTworldListViewComponent.createSkipFromEvent(event)\r\n };\r\n\r\n return oDataParameters;\r\n }\r\n\r\n static createSkipFromEvent(event: LazyLoadEvent): number | undefined {\r\n return event.first;\r\n }\r\n\r\n static createTopFromEvent(event: LazyLoadEvent): number | undefined {\r\n return event.rows;\r\n }\r\n\r\n static createOrderByFromEvent(event: LazyLoadEvent): string | undefined {\r\n if (event.sortField) {\r\n const order = !event.sortOrder || event.sortOrder > 0 ? 'asc' : 'desc';\r\n return `${event.sortField} ${order}`;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private createFilterFromEvent(event: LazyLoadEvent): string | undefined {\r\n if (!event.filters)\r\n return undefined;\r\n\r\n const filter = Object.entries(event.filters)\r\n // The type definition is wrong, event.filters has values of type FilterMetadata[] and not FilterMetadata.\r\n .map(([property, filter]) => ({ property: property, filters: filter as FilterMetadata[] }))\r\n .map(f => this.createFilterForPropertyArray(f.property, f.filters))\r\n .filter(f => !!f)\r\n .join(' and ');\r\n\r\n if (filter === '')\r\n return undefined;\r\n\r\n return `(${filter})`;\r\n }\r\n\r\n private createFilterForPropertyArray(property: string, filters: FilterMetadata[]): string | undefined {\r\n const filter = filters\r\n .map(f => this.createFilterForProperty(property, f))\r\n .filter(f => !!f)\r\n .join(` ${filters[0].operator} `);\r\n\r\n if (filter === '')\r\n return undefined;\r\n\r\n return `(${filter})`;\r\n }\r\n\r\n private createFilterForProperty(property: string, filter: FilterMetadata): string | undefined {\r\n if (!filter.value)\r\n return undefined;\r\n\r\n const oDataOperator = RESTworldListViewComponent.createODataOperator(\r\n filter.matchMode,\r\n );\r\n const comparisonValue = this.createComparisonValue(property, filter.value);\r\n\r\n switch (oDataOperator) {\r\n case 'contains':\r\n case 'not contains':\r\n case 'startswith':\r\n case 'endswith':\r\n return `${oDataOperator}(${property}, ${comparisonValue})`;\r\n default:\r\n return `${property} ${oDataOperator} ${comparisonValue}`;\r\n }\r\n }\r\n\r\n private static createODataOperator(matchMode?: string): string {\r\n switch (matchMode) {\r\n case FilterMatchMode.STARTS_WITH:\r\n return 'startswith';\r\n case FilterMatchMode.CONTAINS:\r\n return 'contains';\r\n case FilterMatchMode.NOT_CONTAINS:\r\n return 'not contains';\r\n case FilterMatchMode.ENDS_WITH:\r\n return 'endswith';\r\n case FilterMatchMode.EQUALS:\r\n return 'eq';\r\n case FilterMatchMode.NOT_EQUALS:\r\n return 'ne';\r\n case FilterMatchMode.IN:\r\n return 'in';\r\n case FilterMatchMode.LESS_THAN:\r\n return 'lt';\r\n case FilterMatchMode.LESS_THAN_OR_EQUAL_TO:\r\n return 'le';\r\n case FilterMatchMode.GREATER_THAN:\r\n return 'gt';\r\n case FilterMatchMode.GREATER_THAN_OR_EQUAL_TO:\r\n return 'ge';\r\n case FilterMatchMode.IS:\r\n return 'eq';\r\n case FilterMatchMode.IS_NOT:\r\n return 'ne';\r\n case FilterMatchMode.BEFORE:\r\n return 'lt';\r\n case FilterMatchMode.AFTER:\r\n return 'gt';\r\n case FilterMatchMode.DATE_AFTER:\r\n return 'ge';\r\n case FilterMatchMode.DATE_BEFORE:\r\n return 'lt';\r\n case FilterMatchMode.DATE_IS:\r\n return 'eq';\r\n case FilterMatchMode.DATE_IS_NOT:\r\n return 'ne';\r\n default:\r\n throw Error(`Unknown matchMode ${matchMode}`);\r\n }\r\n }\r\n\r\n private createComparisonValue(property: string, value: unknown): string {\r\n if (value === null || value === undefined)\r\n return 'null';\r\n\r\n const columns = this.columns.filter(c => c.field === property);\r\n if (columns.length !== 1)\r\n throw new Error(`Cannot find the column for the property ${property} which is specified in the filter.`);\r\n\r\n const type = columns[0].type;\r\n\r\n switch (type) {\r\n case ColumnType.boolean:\r\n return `${value}`;\r\n case ColumnType.date:\r\n return `cast(${(value as Date).toISOString()}, Edm.DateTimeOffset)`;\r\n case ColumnType.numeric:\r\n return `${value}`;\r\n case ColumnType.text:\r\n return `'${value}'`;\r\n default:\r\n throw new Error(`Unknown column type '${type}'`);\r\n }\r\n }\r\n}\r\n","<p-table [value]=\"value\"\r\n [lazy]=\"true\"\r\n [lazyLoadOnInit]=\"false\"\r\n (onLazyLoad)=\"load($event)\"\r\n responsiveLayout=\"scroll\"\r\n [paginator]=\"true\"\r\n [rows]=\"rows\"\r\n [rowsPerPageOptions]=\"rowsPerPage\"\r\n [totalRecords]=\"totalRecords\"\r\n [loading]=\"isLoading\"\r\n [showInitialSortBadge]=\"true\"\r\n [columns]=\"columns\"\r\n [sortField]=\"sortField\"\r\n [sortOrder]=\"sortOrder\">\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th *ngFor=\"let col of columns\" [pSortableColumn]=\"col.field\">\r\n <div class=\"p-d-flex p-jc-between p-ai-center\">\r\n {{col.header}}\r\n <p-sortIcon [field]=\"col.field\"></p-sortIcon>\r\n <p-columnFilter [type]=\"col.type\" [field]=\"col.field\" display=\"menu\"></p-columnFilter>\r\n </div>\r\n </th>\r\n <th>\r\n <div class=\"flex justify-content-end\">\r\n <div class=\"mx-2\">\r\n <a *ngIf=\"!createButtonMenu\" class=\"p-button-success\" icon=\"fas fa-plus\" pButton [routerLink]=\"[editLink, apiName, newHref]\" pTooltip=\"Create new\" tooltipPosition=\"left\"></a>\r\n <p-splitButton *ngIf=\"createButtonMenu\" styleClass=\"p-button-success\" icon=\"fas fa-plus\" pTooltip=\"Create new\" tooltipPosition=\"left\" (onClick)=\"createNew()\" [model]=\"createButtonMenu\" appendTo=\"body\"></p-splitButton>\r\n </div>\r\n </div>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"body\" let-entity let-columns=\"columns\">\r\n <tr>\r\n <td [ngSwitch]=\"col.type\" *ngFor=\"let col of columns\">\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <p-avatar *ngIf=\"col.field === 'createdBy' || col.field === 'lastChangedBy'\" [pTooltip]=\"entity[col.field]\" tooltipPosition=\"top\" [image]=\"avatarGenerator.getImage(entity[col.field])\" [label]=\"avatarGenerator.getLabel(entity[col.field])\" [style]=\"avatarGenerator.getStyle(entity[col.field])\" shape=\"circle\"></p-avatar>\r\n <span *ngIf=\"col.field !== 'createdBy' && col.field !== 'lastChangedBy'\">{{entity[col.field]}}</span>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'numeric'\" class=\"flex justify-content-end\">{{entity[col.field]}}</span>\r\n <span *ngSwitchCase=\"'boolean'\" class=\"flex justify-content-center\"><p-triStateCheckbox [(ngModel)]=\"entity[col.field]\" [readonly]=\"true\"></p-triStateCheckbox></span>\r\n <span *ngSwitchCase=\"'date'\" [pTooltip]=\"entity[col.field]\">{{entity[col.field] | date:dateFormat}}</span>\r\n <span *ngSwitchCase=\"'array'\" class=\"flex justify-content-end\"><p *ngFor=\"let arrayElement of entity[col.field]\">{{arrayElement | json}}</p></span>\r\n <span *ngSwitchCase=\"'object'\" class=\"flex justify-content-end\">{{entity[col.field] | json}}</span>\r\n </td>\r\n <td>\r\n <div class=\"flex justify-content-end\">\r\n <a pButton pTooltip=\"View/Edit\" tooltipPosition=\"left\" [routerLink]=\"[editLink, apiName, entity._links?.self[0].href]\" icon=\"fas fa-edit\"></a>\r\n <button pTooltip=\"Delete\" tooltipPosition=\"left\" pButton *ngIf=\"entity._links.delete\" (click)=\"showDeleteConfirmatioModal(entity)\" icon=\"fas fa-trash-alt\" type=\"button\" class=\"mx-2 p-button-danger\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"8\">No entries found.</td>\r\n </tr>\r\n </ng-template>\r\n\r\n</p-table>\r\n\r\n<p-toast></p-toast>\r\n<p-confirmDialog></p-confirmDialog>\r\n","import { APP_INITIALIZER, NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { RouterModule } from '@angular/router';\r\n\r\nimport { TableModule } from 'primeng/table';\r\nimport { TooltipModule } from 'primeng/tooltip'\r\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { InputNumberModule } from 'primeng/inputnumber';\r\nimport { CalendarModule } from 'primeng/calendar';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { ConfirmDialogModule } from 'primeng/confirmdialog';\r\nimport { ConfirmationService, MessageService } from 'primeng/api';\r\nimport { ToastModule } from 'primeng/toast';\r\nimport { MessagesModule } from 'primeng/messages';\r\nimport { PanelModule } from 'primeng/panel';\r\nimport { TabViewModule } from 'primeng/tabview';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport { ProgressSpinnerModule } from 'primeng/progressspinner';\r\nimport { RippleModule } from 'primeng/ripple';\r\nimport { TriStateCheckboxModule } from 'primeng/tristatecheckbox';\r\nimport { AvatarModule } from 'primeng/avatar';\r\nimport { DropdownModule } from 'primeng/dropdown';\r\nimport { MultiSelectModule } from 'primeng/multiselect';\r\nimport { FileUploadModule } from 'primeng/fileupload';\r\nimport { ValdemortModule } from 'ngx-valdemort';\r\nimport { ImageCropperModule } from 'ngx-image-cropper';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { ColorPickerModule } from 'primeng/colorpicker';\r\n\r\nimport { RESTworldListViewComponent } from './views/restworld-list-view/restworld-list-view.component';\r\nimport { RESTworldEditViewComponent } from './views/restworld-edit-view/restworld-edit-view.component';\r\nimport { RESTworldClientCollection } from './services/restworld-client-collection';\r\nimport { AvatarGenerator } from './services/avatar-generator';\r\nimport { SettingsService } from './services/settings.service';\nimport { RESTWorldImageViewComponent } from './views/restworld-image-view/restworld-image-view.component';\r\nimport { ButtonModule } from 'primeng/button';\nimport { RESTWorldFileViewComponent } from './views/restworld-file-view/restworld-file-view.component';\r\nimport { SafeUrlPipe } from './pipes/safe-url.pipe';\nimport { RestworldEditFormComponent } from './views/restworld-edit-form/restworld-edit-form.component'\r\nimport { FormService } from './services/form.service';\r\nimport { AsPipe } from './pipes/as.pipe';\r\nimport { SplitButtonModule } from 'primeng/splitbutton';\r\n\r\nexport function initializeSettings(settingsService: SettingsService): () => Promise<void> {\r\n return async () => await settingsService.ensureInitialized();\r\n}\r\n\r\n@NgModule({\r\n declarations: [\r\n RESTworldListViewComponent,\r\n RESTworldEditViewComponent,\r\n RESTWorldImageViewComponent,\r\n RESTWorldFileViewComponent,\r\n SafeUrlPipe,\r\n AsPipe,\r\n RestworldEditFormComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n RouterModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TableModule,\r\n TooltipModule,\r\n ScrollingModule,\r\n InputTextModule,\r\n InputNumberModule,\r\n CalendarModule,\r\n CheckboxModule,\r\n ConfirmDialogModule,\r\n ToastModule,\r\n MessagesModule,\r\n PanelModule,\r\n TabViewModule,\r\n SkeletonModule,\r\n ProgressSpinnerModule,\r\n RippleModule,\r\n TriStateCheckboxModule,\r\n AvatarModule,\r\n DropdownModule,\r\n MultiSelectModule,\r\n FileUploadModule,\r\n ValdemortModule,\r\n ImageCropperModule,\r\n DialogModule,\r\n ButtonModule,\r\n ColorPickerModule,\r\n DragDropModule,\r\n SplitButtonModule,\r\n ],\r\n exports: [\r\n RESTworldListViewComponent,\r\n RESTworldEditViewComponent,\r\n RESTWorldImageViewComponent,\r\n RESTWorldFileViewComponent,\r\n SafeUrlPipe\r\n ],\r\n providers: [\r\n RESTworldClientCollection,\r\n AvatarGenerator,\r\n ConfirmationService,\r\n FormService,\r\n MessageService,\r\n {\r\n provide: APP_INITIALIZER,\r\n useFactory: initializeSettings,\r\n deps: [SettingsService],\r\n multi: true,\r\n }\r\n ]\r\n})\r\nexport class RestworldClientModule { }\r\n","/*\n * Public API Surface of ngx-restworld-client\n */\r\n\nexport * from './lib/constants/link-names';\n\nexport * from './lib/models/api-url';\nexport * from './lib/models/client-settings';\nexport * from './lib/models/problem-details';\nexport * from './lib/models/restworld-options';\n\nexport * from './lib/pipes/safe-url.pipe'\nexport * from './lib/pipes/as.pipe'\n\nexport * from './lib/services/avatar-generator';\nexport * from './lib/services/form.service';\nexport * from './lib/services/restworld-client';\nexport * from './lib/services/restworld-client-collection';\nexport * from './lib/services/settings.service';\n\nexport * from './lib/views/restworld-edit-form/restworld-edit-form.component';\nexport * from './lib/views/restworld-edit-view/restworld-edit-view.component';\nexport * from './lib/views/restworld-file-view/restworld-file-view.component'\nexport * from './lib/views/restworld-image-view/restworld-image-view.component'\nexport * from './lib/views/restworld-list-view/restworld-list-view.component'\n\nexport * from './lib/restworld-client.module';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|