@idea-ionic/uncommon 8.13.10 → 8.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idea-ionic-uncommon.mjs","sources":["../../../modules/uncommon/src/address/address.component.ts","../../../modules/uncommon/src/errorReporting.service.ts","../../../modules/uncommon/src/tinCan.service.ts","../../../modules/uncommon/src/offline/offline.service.ts","../../../modules/uncommon/src/AWSAPI.service.ts","../../../modules/uncommon/src/attachments/attachments.component.ts","../../../modules/uncommon/src/announcement/announcement.component.ts","../../../modules/uncommon/src/colors/colorPicker.component.ts","../../../modules/uncommon/src/contacts/contacts.component.ts","../../../modules/uncommon/src/dateTime/calendarPicker.component.ts","../../../modules/uncommon/src/dateTime/calendarPicker.component.html","../../../modules/uncommon/src/dateTime/dateTime.component.ts","../../../modules/uncommon/src/duration/duration.component.ts","../../../modules/uncommon/src/echo/echo.page.ts","../../../modules/uncommon/src/echo/echo.routes.ts","../../../modules/uncommon/src/mde/mdeToolbar.component.ts","../../../modules/uncommon/src/mde/mde.component.ts","../../../modules/uncommon/src/offline/offlineData.service.ts","../../../modules/uncommon/src/offline/cacheableResource.component.ts","../../../modules/uncommon/src/offline/offlineManager.component.ts","../../../modules/uncommon/src/offline/offlineManager.component.html","../../../modules/uncommon/src/offline/offlineIndicator.component.ts","../../../modules/uncommon/src/sentiment/sentiment.component.ts","../../../modules/uncommon/src/timeInterval/fromTimeToTime.component.ts","../../../modules/uncommon/src/timeInterval/fromTimeToTime.component.html","../../../modules/uncommon/src/timeInterval/timeInterval.component.ts","../../../modules/uncommon/src/AWSAPISocket.service.ts","../../../modules/uncommon/src/cachedResources.service.ts","../../../modules/uncommon/src/pushNotifications.service.ts","../../../modules/uncommon/idea-ionic-uncommon.ts"],"sourcesContent":["import { Component, Input, OnInit, ChangeDetectionStrategy, output, viewChild, input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { IonAccordionGroup, IonAccordion, IonItem, IonInput, IonList, IonText } from '@ionic/angular/standalone';\nimport { Address, Countries, Suggestion } from 'idea-toolbox';\nimport { IDEASelectComponent, IDEATranslatePipe } from '@idea-ionic/common';\n\n@Component({\n selector: 'idea-address',\n imports: [\n FormsModule,\n IDEATranslatePipe,\n IDEASelectComponent,\n IonText,\n IonList,\n IonInput,\n IonItem,\n IonAccordion,\n IonAccordionGroup\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (address) {\n <ion-accordion-group #accordion>\n <ion-accordion value=\"open\">\n <ion-item slot=\"header\" button [color]=\"color()\" [lines]=\"lines()\">\n @if (isCollapsed()) {\n <ion-input\n readonly\n [labelPlacement]=\"isCollapsed() ? 'stacked' : ''\"\n [label]=\"label() || ('IDEA_UNCOMMON.ADDRESS.COMPLETE_ADDRESS' | translate)\"\n [title]=\"'IDEA_UNCOMMON.ADDRESS.COMPLETE_ADDRESS_HINT' | translate\"\n [placeholder]=\"placeholder()\"\n [value]=\"address.getFullAddress()\"\n (ionChange)=\"addressChange.emit(address)\"\n />\n }\n </ion-item>\n <ion-list slot=\"content\">\n @if (showContact()) {\n <ion-item [color]=\"color()\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.ADDRESS.CONTACT' | translate\"\n [disabled]=\"!editMode()\"\n [placeholder]=\"'IDEA_UNCOMMON.ADDRESS.CONTACT_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.ADDRESS.CONTACT_HINT' | translate\"\n [(ngModel)]=\"address.contact\"\n (ionChange)=\"addressChange.emit(address)\"\n />\n </ion-item>\n }\n @if (showEmail()) {\n <ion-item [color]=\"color()\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.ADDRESS.EMAIL' | translate\"\n [disabled]=\"!editMode()\"\n [placeholder]=\"'IDEA_UNCOMMON.ADDRESS.EMAIL_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.ADDRESS.EMAIL_HINT' | translate\"\n [(ngModel)]=\"address.email\"\n (ionChange)=\"addressChange.emit(address)\"\n />\n </ion-item>\n }\n @if (showPhone()) {\n <ion-item [color]=\"color()\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.ADDRESS.PHONE' | translate\"\n [disabled]=\"!editMode()\"\n [placeholder]=\"'IDEA_UNCOMMON.ADDRESS.PHONE_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.ADDRESS.PHONE_HINT' | translate\"\n [(ngModel)]=\"address.phone\"\n (ionChange)=\"addressChange.emit(address)\"\n />\n </ion-item>\n }\n <ion-item [color]=\"color()\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [disabled]=\"!editMode()\"\n [placeholder]=\"'IDEA_UNCOMMON.ADDRESS.ADDRESS_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.ADDRESS.ADDRESS_HINT' | translate\"\n [(ngModel)]=\"address.address\"\n (ionChange)=\"addressChange.emit(address)\"\n >\n <div slot=\"label\">\n {{ 'IDEA_UNCOMMON.ADDRESS.ADDRESS' | translate }}\n @if (editMode() && obligatory()) {\n <ion-text class=\"obligatoryDot\" />\n }\n </div>\n </ion-input>\n </ion-item>\n @if (showAddress2()) {\n <ion-item [color]=\"color()\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.ADDRESS.ADDRESS2' | translate\"\n [disabled]=\"!editMode()\"\n [placeholder]=\"'IDEA_UNCOMMON.ADDRESS.ADDRESS2_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.ADDRESS.ADDRESS2_HINT' | translate\"\n [(ngModel)]=\"address.address2\"\n (ionChange)=\"addressChange.emit(address)\"\n />\n </ion-item>\n }\n <ion-item [color]=\"color()\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.ADDRESS.POSTCODE' | translate\"\n [disabled]=\"!editMode()\"\n [placeholder]=\"'IDEA_UNCOMMON.ADDRESS.POSTCODE_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.ADDRESS.POSTCODE_HINT' | translate\"\n [(ngModel)]=\"address.postcode\"\n (ionChange)=\"addressChange.emit(address)\"\n />\n </ion-item>\n <ion-item [color]=\"color()\">\n <ion-input\n autocomplete=\"new\"\n [disabled]=\"!editMode()\"\n labelPlacement=\"stacked\"\n [placeholder]=\"'IDEA_UNCOMMON.ADDRESS.CITY_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.ADDRESS.CITY_HINT' | translate\"\n [(ngModel)]=\"address.city\"\n (ionChange)=\"addressChange.emit(address)\"\n >\n <div slot=\"label\">\n {{ 'IDEA_UNCOMMON.ADDRESS.CITY' | translate }}\n @if (editMode() && obligatory()) {\n <ion-text class=\"obligatoryDot\" />\n }\n </div>\n </ion-input>\n </ion-item>\n <ion-item [color]=\"color()\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.ADDRESS.PROVINCE' | translate\"\n [disabled]=\"!editMode()\"\n [placeholder]=\"'IDEA_UNCOMMON.ADDRESS.PROVINCE_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.ADDRESS.PROVINCE_HINT' | translate\"\n [(ngModel)]=\"address.province\"\n (ionChange)=\"addressChange.emit(address)\"\n />\n </ion-item>\n <idea-select\n [color]=\"color()\"\n [data]=\"countriesSuggestions\"\n [label]=\"'IDEA_UNCOMMON.ADDRESS.COUNTRY' | translate\"\n [lines]=\"editMode() ? lines() : null\"\n [description]=\"getCountryName(address.country)\"\n [placeholder]=\"'IDEA_UNCOMMON.ADDRESS.COUNTRY_HINT' | translate\"\n [searchPlaceholder]=\"'IDEA_UNCOMMON.ADDRESS.COUNTRY_HINT' | translate\"\n [hideIdFromUI]=\"true\"\n [avoidAutoSelection]=\"true\"\n [disabled]=\"!editMode()\"\n (select)=\"setCountryFromSuggestion($event)\"\n />\n </ion-list>\n </ion-accordion>\n </ion-accordion-group>\n }\n `,\n styles: [\n `\n ion-item[slot='header'] ion-input {\n --highlight-color-focused: transparent;\n --highlight-color-valid: transparent;\n --highlight-color-invalid: transparent;\n }\n ion-list[slot='content'] {\n padding-top: 0;\n padding-left: 20px;\n }\n `\n ]\n})\nexport class IDEAAddressComponent implements OnInit {\n /**\n * The address to manage.\n */\n @Input() address: Address;\n readonly addressChange = output<Address>();\n /**\n * If true, show the field `contact`.\n */\n readonly showContact = input(false);\n /**\n * If true, show the field `address2`.\n */\n readonly showAddress2 = input(false);\n /**\n * If true, show the field `phone`.\n */\n readonly showPhone = input(false);\n /**\n * If true, show the field `email`.\n */\n readonly showEmail = input(false);\n /**\n * Whether the fields are editable or disabled.\n */\n readonly editMode = input(true);\n /**\n * If true, show obligatory dots.\n */\n readonly obligatory = input(false);\n /**\n * The lines attribute of the item.\n */\n readonly lines = input<string>();\n /**\n * The color for the component.\n */\n readonly color = input<string>();\n /**\n * The label to show for the field; if not set, it has a default value.\n */\n readonly label = input<string>();\n /**\n * The placeholder to show for the field.\n */\n readonly placeholder = input<string>();\n /**\n * To toggle the detailed view.\n */\n readonly openByDefault = input(false);\n\n countriesSuggestions: Suggestion[];\n Countries = Countries;\n readonly accordion = viewChild<IonAccordionGroup>('accordion');\n\n ngOnInit(): void {\n this.countriesSuggestions = Object.keys(Countries).map(\n k => new Suggestion({ value: (Countries as any)[k], name: k })\n );\n }\n\n isCollapsed(): boolean {\n return this.accordion()?.value !== 'open';\n }\n\n getCountryName(countryCode: Countries): string {\n if (!countryCode) return;\n const country = Object.entries(Countries).find(([_, value]): boolean => value === countryCode);\n return country ? country[0] : null;\n }\n setCountryFromSuggestion(suggestion: Suggestion): void {\n if (!suggestion) return;\n this.address.country = suggestion.value;\n this.addressChange.emit(this.address);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Platform } from '@ionic/angular/standalone';\nimport { ClientInfo, ErrorReport } from 'idea-toolbox';\nimport { IDEAEnvironment } from '@idea-ionic/common';\n\n@Injectable({ providedIn: 'root' })\nexport class IDEAErrorReportingService {\n protected _env = inject(IDEAEnvironment);\n protected _http = inject(HttpClient);\n protected _platform = inject(Platform);\n\n apiStage: string;\n apiUrl: string;\n\n constructor() {\n this.apiStage = this._env.idea.ideaApi?.stage || (this._env.idea.ideaApi as any)?.version;\n this.apiUrl = 'https://'.concat([this._env.idea.ideaApi?.url, this.apiStage].filter(x => x).join('/'));\n }\n\n /**\n * Send the error report to the back-end.\n */\n sendReport(error: Error, forceSend?: boolean): Promise<void> {\n return new Promise(resolve => {\n // skip in case we don't want to send the report or the report is useless (blank error)\n if ((!this.shouldSend() && !forceSend) || !error?.name) return resolve();\n // prepare and send the report\n const report = new ErrorReport({\n version: this._env.idea.app.version,\n stage: this.apiStage,\n client: this.getClientInfo(),\n type: error.name,\n error: error.message,\n stack: error.stack\n });\n this._http\n .post(this.apiUrl.concat(`/projects/${this._env.idea.project}/errorReporting`), report)\n .toPromise()\n .catch((): void => {}) // note: never throw an error when reporting an error\n .finally((): void => resolve());\n });\n }\n\n /**\n * Whether we should send the reporting or we are in a scenario in which we should skip it.\n */\n shouldSend(): boolean {\n return this.apiStage === 'prod';\n }\n\n /**\n * Acquire the client's info.\n */\n getClientInfo(): ClientInfo {\n return new ClientInfo({\n timestamp: new Date().toISOString(),\n platform: this._platform.platforms().join(' '),\n screenWidth: this._platform.width(),\n screenHeight: this._platform.height(),\n isLandScape: this._platform.isLandscape(),\n url: this._platform.url(),\n referrer: document.referrer,\n isOnline: navigator.onLine,\n language: navigator.language,\n userAgent: navigator.userAgent\n });\n }\n}\n","import { Injectable } from '@angular/core';\n\n/**\n * @deprecated use a specific App service instead.\n */\n@Injectable({ providedIn: 'root' })\nexport class IDEATinCanService {\n protected data: any;\n\n constructor() {\n this.clear();\n }\n\n /**\n * Set a variable with the given value.\n * @param variable variable to set\n * @param value value to assign to the variable\n */\n set(variable: string, value: any): void {\n this.data[variable] = value;\n }\n /**\n * Get the content of a variable.\n * @param variable variable to acquire\n * @param getAndDelete if set, delete the variable after the acquisition\n */\n get(variable: string, getAndDelete?: boolean): any {\n const ret = this.data[variable];\n if (getAndDelete) this.remove(variable);\n return ret;\n }\n /**\n * Remove a variable.\n * @param variable variable to remove\n */\n remove(variable: string): void {\n delete this.data[variable];\n }\n /**\n * Clear all the variables.\n */\n clear(): void {\n this.data = {};\n }\n}\n","import { Injectable, signal } from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\nimport { Network } from '@capacitor/network';\n\n/**\n * Utility to monitor the network connection.\n * Note: don't use it directly, if you're also using IDEAOfflineDataService.\n */\n@Injectable({ providedIn: 'root' })\nexport class IDEAOfflineService {\n /**\n * True/false if the platform is offline/online.\n */\n protected _isOffline = signal<boolean>(typeof navigator === 'undefined' ? false : !navigator.onLine);\n /**\n * The observable for subscribing to online/offline status changes.\n */\n protected observable: Observable<boolean>;\n /**\n * The handler for listenig to network changes.\n */\n protected listenerHandler: any;\n\n constructor() {\n if (Network) {\n // set the basic listener for changes\n this.listenerHandler = Network.addListener('networkStatusChange', status =>\n this._isOffline.set(!status.connected)\n );\n // create the observable to subscribe to the network changes; note: it won't run until subscribed\n this.observable = new Observable(observer => {\n // remove the basic listener add add one that supports a subscription\n Network.removeAllListeners();\n this.listenerHandler = Network.addListener('networkStatusChange', status => {\n this._isOffline.set(!status.connected);\n if (observer) observer.next(status.connected);\n });\n });\n }\n }\n /**\n * Subscribe to be notified when the connection status changes.\n */\n subscribe(callback: (isOnline: boolean) => void): Subscription {\n return this.observable.subscribe(callback);\n }\n\n /**\n * Quickly check the connection status.\n */\n isOnline(): boolean {\n return !this._isOffline();\n }\n /**\n * Quickly check the connection status.\n */\n isOffline(): boolean {\n return this._isOffline();\n }\n\n /**\n * Quickly check for online connection.\n */\n async check(): Promise<boolean> {\n if (!Network) return false;\n\n const status = await Network.getStatus();\n this._isOffline.set(!status.connected);\n return status.connected;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient, HttpHeaders, HttpParams, HttpErrorResponse } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { Platform } from '@ionic/angular/standalone';\nimport { IDEAEnvironment, IDEAStorageService } from '@idea-ionic/common';\n\nimport { IDEAErrorReportingService } from './errorReporting.service';\nimport { IDEATinCanService } from './tinCan.service';\nimport { IDEAOfflineService } from './offline/offline.service';\n\n/**\n * To communicate with an AWS's API Gateway istance.\n *\n * Includes a rundimental cache on GET requests, until Android doesn't support SWs on local files.\n *\n * Note: requires an `AWSAPIAuthToken` variable to be set by IDEATinCanService service.\n */\n@Injectable({ providedIn: 'root' })\nexport class IDEAAWSAPIService {\n protected _env = inject(IDEAEnvironment);\n protected _http = inject(HttpClient);\n protected _platform = inject(Platform);\n protected _tc = inject(IDEATinCanService);\n protected _storage = inject(IDEAStorageService);\n protected _errorReporting = inject(IDEAErrorReportingService);\n protected _offline = inject(IDEAOfflineService);\n\n apiStage: string;\n apiUrlProject: string;\n ideaApiStage: string;\n apiUrlIDEA: string;\n\n constructor() {\n this.apiStage = this._env.idea.api?.stage || (this._env.idea.api as any)?.version;\n this.apiUrlProject = 'https://'.concat([this._env.idea.api?.url, this.apiStage].filter(x => x).join('/'));\n this.ideaApiStage = this._env.idea.ideaApi?.stage || (this._env.idea.ideaApi as any)?.version;\n this.apiUrlIDEA = 'https://'.concat([this._env.idea.ideaApi?.url, this.ideaApiStage].filter(x => x).join('/'));\n }\n\n /**\n * Execute an online API request.\n * @param resource resource name (e.g. `users`)\n * @param method enum HTTP methods\n * @param options the request options\n */\n protected request(resource: string, method: string, options?: APIRequestOption): Promise<any> {\n return new Promise((resolve, reject): void => {\n const opt = options || {};\n // prepare the url\n const url = this.prepareURL(resource, opt);\n // prepare the headers and set the Authorization token\n const headers = this.prepareHeaders(opt.headers);\n // prepare the query params and add some info about the client\n const params = this.prepareQueryParams(opt.params, true);\n // execute the request\n let req: any;\n switch (method) {\n case 'HEAD':\n req = this._http.head(url, { headers, params });\n break;\n case 'POST':\n req = this._http.post(url, opt.body, { headers, params });\n break;\n case 'PUT':\n req = this._http.put(url, opt.body, { headers, params });\n break;\n case 'PATCH':\n req = this._http.patch(url, opt.body, { headers, params });\n break;\n case 'DELETE':\n req = this._http.delete(url, { headers, params });\n break;\n case 'GET':\n default:\n req = this._http.get(url, { headers, params });\n }\n // handle the request response\n req.subscribe(\n (res: any): void => resolve(res),\n async (err: HttpErrorResponse): Promise<void> => {\n // check if the request failed for network reasons (to trigger offline mode if needed)\n await this._offline.check();\n // (async) send a report, if wanted\n if (opt.reportError) this._errorReporting.sendReport(err);\n // fix and return the error\n this.fixErrMessageBeforeReject(err, reject);\n }\n );\n });\n }\n /**\n * Prepare the URL to which execute the request.\n */\n protected prepareURL(resource: string, opt: APIRequestOption): string {\n // decide whether to use IDEA's API or the project's API (or an alternative API)\n let url = opt.idea ? this.apiUrlIDEA : opt.alternativeAPI || this.apiUrlProject;\n // prepare a single-resource request (by id) or a normal one\n url = `${url}/${resource}`;\n if (opt.resourceId) url = `${url}/${encodeURIComponent(opt.resourceId)}`;\n return url;\n }\n /**\n * Prepare the headers object to send with a request.\n * Note: it always adds the Authorization token (`AWSAPIAuthToken`) and the API key (`AWSAPIKey`), if set.\n */\n protected prepareHeaders(h: HttpHeaders | any): HttpHeaders {\n // preare the headers; note: HttpHeaders is immutable!\n let headers = new HttpHeaders(h || null);\n // set the Authorization token\n if (!headers.get('Authorization') && this._tc.get('AWSAPIAuthToken'))\n headers = headers.set('Authorization', this._tc.get('AWSAPIAuthToken'));\n // set the API key\n if (!headers.get('X-API-Key') && this._tc.get('AWSAPIKey'))\n headers = headers.set('X-API-Key', this._tc.get('AWSAPIKey'));\n return headers;\n }\n /**\n * Prepare the queryParams object to send with a request; if requested, add some info about the client.\n */\n protected prepareQueryParams(qp: HttpParams | any, addClientInfo?: boolean): HttpParams {\n // prepare the query params; note: HttpParams is immutable!\n let searchParams = new HttpParams();\n if (qp && qp instanceof HttpParams) searchParams = qp;\n else if (qp) for (const prop in qp) if (qp[prop]) searchParams = searchParams.set(prop, qp[prop]);\n // if requested, add app version and client platform to the info we send to the back-end\n if (addClientInfo) {\n searchParams = searchParams.set('_v', this._env.idea.app.version);\n searchParams = searchParams.set('_p', this._platform.platforms().join(' '));\n }\n return searchParams;\n }\n /**\n * Converts the error message to be readable.\n */\n protected fixErrMessageBeforeReject(err: HttpErrorResponse, reject: any): void {\n let e;\n try {\n if (!err || !err.error) e = {};\n else if (typeof err.error === 'string') e = JSON.parse(err.error);\n else e = err.error;\n } catch (_) {\n e = {};\n }\n reject(new Error(e.message || 'Unknown error!'));\n }\n\n /**\n * Use the HttpClient to execute a raw request.\n */\n rawRequest(): HttpClient {\n return this._http;\n }\n\n /**\n * HEAD request.\n * @param resource resource name (e.g. `users`)\n * @param options the request options\n */\n headResource(resource: string, options?: APIRequestOption): Promise<any> {\n return this.request(resource, 'HEAD', options);\n }\n\n /**\n * GET request. Include options to cache the requests (`options.useCache`), to work also offline.\n * @param resource resource name (e.g. `users`)\n * @param options the request options\n */\n getResource(resource: string, options?: APIRequestOption): Promise<any> {\n return new Promise((resolve, reject): void => {\n const opt = options || {};\n // if offline and with a cache mode set, force the request to the cache\n if (!navigator.onLine && opt.useCache) opt.useCache = CacheModes.CACHE_ONLY;\n // execute the GET request online or through the cache, depending on the chosen mode\n switch (opt.useCache) {\n case CacheModes.CACHE_ONLY:\n // return the result from the cache, without retrying online if a result wasn't found\n this.getFromCache(resource, opt).then((res: any): void => {\n if (res) resolve(res);\n else reject();\n });\n break;\n case CacheModes.CACHE_FIRST:\n // return the result from the cache\n this.getFromCache(resource, opt).then((localRes: any): void => {\n // check whether the local resource is present (element or list)\n if (localRes && (opt.resourceId || localRes.length)) {\n resolve(localRes);\n // asynchrounously execute the request online, to update the cache with latest data\n this.request(resource, 'GET', opt)\n .then((cloudRes: any): void => {\n // update the cache (if it fails, it's ok)\n this.putInCache(resource, cloudRes, opt).catch((): void => {});\n })\n .catch((): void => {}); // we already returned the result, an error is acceptable\n } else {\n // if the result isn't found in the cache, return the result of the online request\n this.request(resource, 'GET', opt)\n .then((res: any): void => {\n resolve(res);\n // update the cache (if it fails, it's ok)\n this.putInCache(resource, res, opt).catch((): void => {});\n })\n .catch((err: Error): void => reject(err)); // element not found\n }\n });\n break;\n case CacheModes.NETWORK_FIRST:\n // return the result from an online request\n this.request(resource, 'GET', opt)\n .then((cloudRes: any): void => {\n resolve(cloudRes);\n // asynchrounously get the same element from cache and decide whether to update or not\n this.getFromCache(resource, opt).then((): void => {\n // update the cache (if it fails, it's ok)\n this.putInCache(resource, cloudRes, opt).catch((): void => {});\n });\n })\n .catch(() => {\n // if a request to the network fails, check in cache\n this.getFromCache(resource, opt).then((res: any): void => {\n if (res) resolve(res);\n else reject();\n });\n });\n break;\n default:\n /* CacheModes.NO_CACHE */\n // return the result from an online request, with no cache involved\n this.request(resource, 'GET', opt)\n .then((res: any): void => resolve(res))\n .catch((err: Error): void => reject(err));\n }\n });\n }\n\n /**\n * Observe a GET request. Include options to cache the requests (`options.useCache`), to work also offline.\n * @param resource resource name (e.g. `users`)\n * @param options the request options\n */\n getResourceObserver(resource: string, options?: APIRequestOption): Observable<any> {\n return new Observable(observer => {\n const opt = options || {};\n // if offline and with a cache mode set, force the request to the cache\n if (!navigator.onLine && opt.useCache) opt.useCache = CacheModes.CACHE_ONLY;\n // execute the GET request online or through the cache, depending on the chosen mode\n switch (opt.useCache) {\n case CacheModes.CACHE_ONLY:\n // return the result from the cache, without retrying online if a result wasn't found\n this.getFromCache(resource, opt).then((res: any): void => {\n if (res) observer.next(res);\n else observer.error();\n });\n break;\n case CacheModes.CACHE_FIRST:\n // return the result from the cache\n this.getFromCache(resource, opt).then((localRes: any): void => {\n if (localRes) {\n observer.next(localRes);\n // asynchrounously execute the request online, to update the cache with latest data\n this.request(resource, 'GET', opt)\n .then((cloudRes: any): void => {\n observer.next(cloudRes);\n // update the cache (if it fails, it's ok)\n this.putInCache(resource, cloudRes, opt).catch((): void => {});\n })\n .catch((): void => {}); // we already returned the result, an error is acceptable\n } else {\n // if the result isn't found in the cache, return the result of the online request\n this.request(resource, 'GET', opt)\n .then((res: any): void => {\n observer.next(res);\n // update the cache (if it fails, it's ok)\n this.putInCache(resource, res, opt).catch((): void => {});\n })\n .catch((err: Error): void => observer.error(err)); // element not found\n }\n });\n break;\n case CacheModes.NETWORK_FIRST:\n // return the result from an online request\n this.request(resource, 'GET', opt)\n .then((cloudRes: any): void => {\n observer.next(cloudRes);\n // update the cache (if it fails, it's ok)\n this.putInCache(resource, cloudRes, opt).catch((): void => {});\n })\n .catch((): void => {\n // if a request to the network fails, check in cache\n this.getFromCache(resource, opt).then((res: any): void => {\n if (res) observer.next(res);\n else observer.error();\n });\n });\n break;\n default:\n /* CacheModes.NO_CACHE */\n // return the result from an online request, with no cache involved\n this.request(resource, 'GET', opt)\n .then((res: any): void => observer.next(res))\n .catch((err: Error): void => observer.error(err));\n }\n });\n }\n\n /**\n * Execute a GET request from the local storage.\n * @param resource resource name (e.g. `users`)\n * @param options the request options\n */\n getFromCache(resource: string, options?: APIRequestOption): Promise<any> {\n return new Promise(resolve => {\n const opt = options || {};\n // prepare the url and the query params\n const url = this.prepareURL(resource, opt);\n const queryParams = this.prepareQueryParams(opt.params);\n // get from storage, by the complete url\n this._storage\n .get(url.concat(queryParams.toString()))\n .then((res: any): void => (res ? resolve(res) : opt.resourceId ? resolve(null) : resolve([])));\n });\n }\n /**\n * Execute a PUT request in the local storage.\n * @param resource resource name (e.g. `users`)\n * @param data resource data\n * @param options the request options\n */\n putInCache(resource: string, data: any, options?: APIRequestOption): Promise<void> {\n return new Promise((resolve, reject) => {\n const opt = options || {};\n // prepare the url and the query params\n const url = this.prepareURL(resource, opt);\n const queryParams = this.prepareQueryParams(opt.params);\n // put in the storage, by the complete url\n this._storage\n .set(url.concat(queryParams.toString()), data)\n .then((): void => resolve())\n .catch((err: Error): void => reject(err));\n });\n }\n /**\n * Execute a DELETE request in the local storage.\n * @param resource resource name (e.g. `users`)\n * @param options the request options\n */\n deleteFromCache(resource: string, options?: APIRequestOption): Promise<void> {\n return new Promise((resolve, reject): void => {\n const opt = options || {};\n // prepare the url and the query params\n const url = this.prepareURL(resource, opt);\n const queryParams = this.prepareQueryParams(opt.params);\n // delete from storage, by the complete url\n this._storage\n .remove(url.concat(queryParams.toString()))\n .then((): void => resolve())\n .catch((err: Error): void => reject(err));\n });\n }\n\n /**\n * POST request.\n * @param resource resource name (e.g. `users`)\n * @param options the request options\n */\n postResource(resource: string, options?: APIRequestOption): Promise<any> {\n return this.request(resource, 'POST', options);\n }\n\n /**\n * PUT request.\n * @param resource resource name (e.g. `users`)\n * @param options the request options\n */\n putResource(resource: string, options?: APIRequestOption): Promise<any> {\n return this.request(resource, 'PUT', options);\n }\n\n /**\n * PATCH request.\n * @param resource resource name (e.g. `users`)\n * @param options the request options\n */\n patchResource(resource: string, options?: APIRequestOption): Promise<any> {\n return this.request(resource, 'PATCH', options);\n }\n\n /**\n * DELETE request.\n * @param resource resource name (e.g. `users`)\n * @param options the request options\n */\n deleteResource(resource: string, options?: APIRequestOption): Promise<any> {\n return this.request(resource, 'DELETE', options);\n }\n}\n\n/**\n * The options of an API request.\n */\nexport class APIRequestOption {\n /**\n * To identify a specific resource by id.\n */\n resourceId?: string;\n /**\n * The query parameters of the request.\n */\n params?: any;\n /**\n * The body of the request.\n */\n body?: any;\n /**\n * The additional headers of the request; `Authorization` is included by default.\n */\n headers?: any;\n /**\n * Which mode to use to take advance of the requests caching mechanism.\n */\n useCache?: CacheModes;\n /**\n * If true, report the errors that occurs during the request.\n */\n reportError?: boolean;\n /**\n * If true, use IDEA's API instead of the project's API).\n */\n idea?: boolean;\n /**\n * If `idea` is not set, set this to use an alternative API URL for the request.\n */\n alternativeAPI?: string;\n}\n\n/**\n * Set of usable cache modes.\n */\nexport enum CacheModes {\n /**\n * Return the result from an online request, with no cache involved.\n */\n NO_CACHE = 0,\n /**\n * Return the result from an online request, storing the result in the cache, to update it with the latest data.\n */\n NETWORK_FIRST,\n /**\n * Return the result from the cache, but also execute the request online, to update the cache with the latest data.\n */\n CACHE_FIRST,\n /**\n * Return the result from the cache, without retrying online if a result wasn't found.\n */\n CACHE_ONLY\n}\n","import heic2any from 'heic2any';\nimport { Component, inject, Input, OnInit, ChangeDetectionStrategy, input, model, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Platform } from '@ionic/angular';\nimport { IonButton, IonIcon, IonInput, IonItem, IonLabel, IonSpinner } from '@ionic/angular/standalone';\nimport { Browser } from '@capacitor/browser';\nimport { Camera, CameraResultType, CameraSource } from '@capacitor/camera';\nimport { Attachment } from 'idea-toolbox';\nimport { IDEALoadingService, IDEAMessageService, IDEATranslatePipe, IDEATranslationsService } from '@idea-ionic/common';\n\nimport { IDEAAWSAPIService } from '../AWSAPI.service';\nimport { IDEAOfflineService } from '../offline/offline.service';\nimport { IDEATinCanService } from '../tinCan.service';\n\n@Component({\n selector: 'idea-old-attachments',\n imports: [FormsModule, IDEATranslatePipe, IonItem, IonButton, IonIcon, IonInput, IonLabel, IonSpinner],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @for (att of attachments(); track att; let index = $index; let odd = $odd) {\n <ion-item\n class=\"attachments\"\n [class.fieldHasError]=\"hasFieldAnError('attachments[' + index + '].attachmentId')\"\n [class.odd]=\"odd\"\n [lines]=\"lines()\"\n >\n @if (att.attachmentId && _offline.isOnline()) {\n <ion-button fill=\"clear\" size=\"small\" slot=\"start\" (click)=\"openAttachment(att)\">\n <ion-icon name=\"open-outline\" slot=\"icon-only\" size=\"small\" />\n </ion-button>\n }\n @if (!editMode && att.attachmentId) {\n <ion-icon slot=\"start\" color=\"medium\" [name]=\"getFormatIcon(att.format)\" [title]=\"att.format\" />\n }\n @if (editMode && att.attachmentId) {\n <ion-input\n [(ngModel)]=\"att.name\"\n (ionBlur)=\"$event.target.value = $event.target.value || _translate._('IDEA_TEAMS.ATTACHMENTS.NO_NAME')\"\n />\n }\n @if (editMode && !att.attachmentId) {\n <ion-label class=\"loadingWarning\">\n {{ 'IDEA_TEAMS.ATTACHMENTS.UPLOADING_ATTACHMENT_WARNING' | translate }}\n </ion-label>\n }\n @if (!editMode) {\n <ion-label>{{ att.name }}.{{ att.format }}</ion-label>\n }\n @if (!att.attachmentId) {\n <ion-spinner slot=\"end\" [title]=\"'IDEA_TEAMS.ATTACHMENTS.UPLOADING' | translate\" />\n }\n @if (editMode) {\n <ion-button\n slot=\"end\"\n color=\"danger\"\n fill=\"clear\"\n [title]=\"'IDEA_TEAMS.ATTACHMENTS.REMOVE_ATTACHMENT' | translate\"\n (click)=\"removeAttachment(att)\"\n >\n <ion-icon name=\"remove\" slot=\"icon-only\" />\n </ion-button>\n }\n </ion-item>\n }\n <!----->\n @if (!editMode && !attachments()?.length) {\n <ion-item lines=\"none\" class=\"noAttachments\">\n <ion-label>\n {{ 'IDEA_TEAMS.ATTACHMENTS.NO_ATTACHMENT' | translate }}\n </ion-label>\n </ion-item>\n }\n <!----->\n @if (editMode) {\n <div>\n @for (err of uploadErrors(); track err) {\n <ion-item class=\"attachments\" [lines]=\"lines()\">\n <ion-icon name=\"alert-circle\" slot=\"start\" color=\"danger\" />\n <ion-label color=\"danger\">\n {{ err }}\n <p>{{ 'IDEA_TEAMS.ATTACHMENTS.ERROR_UPLOADING_ATTACHMENT' | translate }}</p>\n </ion-label>\n <ion-button\n slot=\"end\"\n color=\"danger\"\n fill=\"clear\"\n [title]=\"'IDEA_TEAMS.ATTACHMENTS.HIDE_ERROR' | translate\"\n (click)=\"hideUploadError(err)\"\n >\n <ion-icon name=\"close\" slot=\"icon-only\" />\n </ion-button>\n </ion-item>\n }\n </div>\n }\n <!----->\n @if (editMode) {\n <ion-item lines=\"none\" class=\"selectable\" (click)=\"browseFiles()\">\n <ion-label color=\"medium\">{{ 'IDEA_TEAMS.ATTACHMENTS.TAP_TO_ADD_ATTACHMENT' | translate }}</ion-label>\n <input\n id=\"attachmentPicker\"\n type=\"file\"\n multiple\n style=\"display: none\"\n (change)=\"addAttachmentFromFile($event)\"\n />\n @if (editMode) {\n <ion-icon slot=\"end\" name=\"caret-down\" class=\"selectIcon\" />\n }\n @if (editMode && isCapacitor()) {\n <ion-button slot=\"end\" fill=\"clear\" color=\"dark\" (click)=\"takePictureAndAttach($event)\">\n <ion-icon slot=\"icon-only\" name=\"camera\" />\n </ion-button>\n }\n </ion-item>\n }\n `,\n styles: [\n `\n .attachments {\n ion-button[slot='start'],\n ion-icon[slot='start'] {\n margin-right: 10px;\n }\n .loadingWarning {\n font-style: italic;\n font-size: 0.8em;\n color: var(--ion-color-medium);\n }\n }\n .noAttachments {\n font-style: italic;\n }\n .selectIcon {\n margin: 0;\n padding-left: 4px;\n font-size: 0.8em;\n color: var(--ion-color-medium);\n }\n .selectable {\n cursor: pointer;\n }\n `\n ]\n})\nexport class IDEAOldAttachmentsComponent implements OnInit {\n private _platform = inject(Platform);\n private _loading = inject(IDEALoadingService);\n private _message = inject(IDEAMessageService);\n private _tc = inject(IDEATinCanService);\n private _api = inject(IDEAAWSAPIService);\n _offline = inject(IDEAOfflineService);\n _translate = inject(IDEATranslationsService);\n\n /**\n * The team from which we want to load the resources. Default: try to guess current team.\n */\n @Input() team: string | null = null;\n /**\n * The path to the online API resource, as an array. Don't include the team. E.g. `['entities', entityId]`.\n */\n readonly pathResource = input<string[]>([]);\n /**\n * The array in which we want to add/remove attachments.\n */\n readonly attachments = model<Attachment[] | null>(null);\n /**\n * Regulate the mode (view/edit).\n */\n @Input() editMode = false;\n /**\n * Show errors as reported from the parent component.\n */\n readonly errors = input(new Set<string>());\n /**\n * The lines attribute of the item.\n */\n readonly lines = input('none');\n\n /**\n * URL towards to make API requests, based on the path of the resource.\n */\n requestURL: string;\n /**\n * Stack of errors from the last upload.\n */\n uploadErrors = signal<string[]>([]);\n\n ngOnInit(): void {\n // if the team isn't specified, try to guess it in the usual IDEA's paths\n this.team = this.team || this._tc.get('membership').teamId || this._tc.get('teamId');\n this.requestURL = `teams/${this.team}/`;\n const pathResource = this.pathResource();\n if (pathResource && pathResource.length)\n this.requestURL = this.requestURL.concat(pathResource.filter(x => x).join('/'));\n }\n\n isCapacitor(): boolean {\n return this._platform.is('capacitor');\n }\n\n hasFieldAnError(field: string): boolean {\n return this.errors().has(field);\n }\n\n browseFiles(): void {\n document.getElementById('attachmentPicker').click();\n }\n addAttachmentFromFile(ev: any): void {\n this.uploadErrors.set(new Array<string>());\n const files: FileList = ev.target ? ev.target.files : {};\n for (let i = 0; i < files.length; i++) {\n const file = files.item(i);\n const fullName = file.name.split('.');\n const format = fullName.pop();\n const name = fullName.join('.');\n this.addAttachment(name, format, file);\n }\n }\n async takePictureAndAttach(ev: Event): Promise<void> {\n if (ev) ev.stopPropagation();\n if (!this._platform.is('capacitor') || !Camera) return;\n const image = await Camera.getPhoto({\n quality: 90,\n allowEditing: false,\n source: CameraSource.Camera,\n resultType: CameraResultType.Base64\n });\n const filename = new Date().toISOString();\n const content = this.base64toBlob(image.base64String, 'image/jpeg');\n this.addAttachment(filename, image.format, content);\n }\n private base64toBlob(base64str: string, type: string): Blob {\n const binary = atob(base64str);\n const array = [];\n for (let i = 0; i < binary.length; i++) array.push(binary.charCodeAt(i));\n return new Blob([new Uint8Array(array)], { type });\n }\n private async addAttachment(name: string, format: string, content: any): Promise<void> {\n if (format === FileFormatTypes.HEIC) {\n format = FileFormatTypes.JPEG;\n content = await heic2any({ blob: content, toType: 'image/jpeg' });\n }\n const attachment = new Attachment({ name, format });\n this.attachments.update(list => [...(list ?? []), attachment]);\n try {\n const signedURL = await this._api.patchResource(this.requestURL, {\n body: { action: 'ATTACHMENTS_PUT', attachmentId: attachment.attachmentId }\n });\n await this._api.rawRequest().put(signedURL.url, content).toPromise();\n attachment.attachmentId = signedURL.id;\n // set a fresh array reference so the upload result (attachmentId) re-renders\n this.attachments.update(list => (list ? [...list] : list));\n } catch (error) {\n this.uploadErrors.update(errors => [...errors, name]);\n this.removeAttachment(attachment);\n this._message.error('IDEA_TEAMS.ATTACHMENTS.ERROR_UPLOADING_ATTACHMENT');\n }\n }\n\n hideUploadError(err: string): void {\n this.uploadErrors.update(errors => errors.filter(e => e !== err));\n }\n\n removeAttachment(attachment: Attachment): void {\n this.attachments.update(list => (list ? list.filter(att => att !== attachment) : list));\n }\n\n async openAttachment(attachment: Attachment): Promise<void> {\n try {\n await this._loading.show();\n const { url } = await this._api.patchResource(this.requestURL, {\n body: { action: 'ATTACHMENTS_GET', attachmentId: attachment.attachmentId }\n });\n await Browser.open({ url });\n } catch (error) {\n this._message.error('IDEA_TEAMS.ATTACHMENTS.ERROR_OPENING_ATTACHMENT');\n } finally {\n this._loading.hide();\n }\n }\n\n getFormatIcon(format: string): string {\n switch (format) {\n case FileFormatTypes.JPG:\n case FileFormatTypes.JPEG:\n case FileFormatTypes.PNG:\n return 'image';\n case FileFormatTypes.PDF:\n return 'document';\n default:\n return 'help';\n }\n }\n}\n\n/**\n * The possibile file types (formats).\n */\nenum FileFormatTypes {\n JPG = 'jpg',\n JPEG = 'jpeg',\n PNG = 'png',\n PDF = 'pdf',\n HEIC = 'heic'\n}\n","import { Component, OnInit, inject, signal, model, ChangeDetectionStrategy } from '@angular/core';\nimport { IonCard, IonCardContent, IonButton } from '@ionic/angular/standalone';\nimport { Announcement, mdToHtml } from 'idea-toolbox';\nimport { IDEAEnvironment, IDEAStorageService, IDEATranslatePipe } from '@idea-ionic/common';\n\nimport { IDEATinCanService } from '../tinCan.service';\n\n/**\n * Announcement card that can be set in any interface to show the alert for this project.\n */\n@Component({\n selector: 'idea-announcement',\n imports: [IDEATranslatePipe, IonButton, IonCardContent, IonCard],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (htmlContent()) {\n <ion-card class=\"announcementCard\" [color]=\"color()\">\n <ion-card-content>\n <p class=\"htmlContent\" [innerHTML]=\"htmlContent()\"></p>\n <p class=\"ion-text-right\">\n <ion-button color=\"primary\" (click)=\"markAsRead()\">\n {{ 'COMMON.GOT_IT' | translate }}\n </ion-button>\n </p>\n </ion-card-content>\n </ion-card>\n }\n `\n})\nexport class IDEAAnnouncementComponent implements OnInit {\n protected _env = inject(IDEAEnvironment);\n private _tc = inject(IDEATinCanService);\n private _storage = inject(IDEAStorageService);\n\n /**\n * The color for the announcement card.\n */\n color = model<string>('dark');\n\n announcement: Announcement;\n htmlContent = signal<string>(null);\n storageKey: string;\n\n constructor() {\n this.storageKey = (this._env.idea.project || 'app').concat('_LAST_ANNOUNCEMENT');\n }\n async ngOnInit(): Promise<void> {\n // standard IDEA: the announcement is read in the Init Guard\n this.announcement = this._tc.get('idea-announcement');\n if (this.announcement && this.announcement.content) {\n const lastRead: string = await this._storage.get(this.storageKey);\n if (!lastRead || this.announcement.content !== lastRead)\n this.htmlContent.set(mdToHtml(this.announcement.content));\n }\n }\n\n async markAsRead(): Promise<void> {\n await this._storage.set(this.storageKey, this.announcement.content);\n this.htmlContent.set(null);\n }\n}\n","import { Component, inject, ChangeDetectionStrategy, output, input, Input } from '@angular/core';\nimport {\n PopoverController,\n IonItem,\n IonButton,\n IonIcon,\n IonLabel,\n IonText,\n IonAvatar,\n IonContent,\n IonGrid,\n IonRow,\n IonCol\n} from '@ionic/angular/standalone';\nimport { Color, COLORS } from 'idea-toolbox';\n\n/**\n * Pick a color from a defined set.\n */\n@Component({\n selector: 'idea-color-picker',\n imports: [IonAvatar, IonText, IonLabel, IonIcon, IonButton, IonItem],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ion-item\n class=\"colorPickerItem\"\n [color]=\"color()\"\n [lines]=\"lines()\"\n [button]=\"!disabled()\"\n [title]=\"placeholder() || ''\"\n [class.withLabel]=\"label()\"\n (click)=\"openPalette($event)\"\n >\n @if (icon()) {\n <ion-button fill=\"clear\" slot=\"start\" [color]=\"iconColor()\" (click)=\"doIconSelect($event)\">\n <ion-icon [name]=\"icon()\" slot=\"icon-only\" />\n </ion-button>\n }\n @if (label()) {\n <ion-label [class.selectable]=\"!disabled()\">\n {{ label() }}\n @if (obligatory() && !disabled()) {\n <ion-text class=\"obligatoryDot\" />\n }\n </ion-label>\n }\n <ion-avatar slot=\"end\" class=\"colorCircle\" [style.background-color]=\"current()\" />\n @if (!disabled()) {\n <ion-icon slot=\"end\" name=\"caret-down\" class=\"selectIcon\" [class.selectable]=\"!disabled()\" />\n }\n </ion-item>\n `,\n styles: [\n `\n .colorPickerItem {\n min-height: 48px;\n height: auto;\n .placeholder {\n color: var(--ion-color-medium);\n }\n .selectIcon {\n margin: 0;\n padding-left: 4px;\n font-size: 0.8em;\n color: var(--ion-color-medium);\n }\n }\n .selectItem.withLabel {\n min-height: 58px;\n height: auto;\n .selectIcon {\n padding-top: 25px;\n }\n ion-button[slot='start'] {\n margin-top: 16px;\n }\n }\n .selectable {\n cursor: pointer;\n }\n ion-avatar.colorCircle {\n width: 20px;\n height: 20px;\n }\n `\n ]\n})\nexport class IDEAColorPickerComponent {\n /**\n * The pickable colors.\n */\n readonly colors = input<Color[]>(COLORS);\n /**\n * The current color.\n */\n readonly current = input<string>();\n /**\n * The label for the field.\n */\n readonly label = input<string>();\n /**\n * A placeholder for the field.\n */\n readonly placeholder = input<string>();\n /**\n * The icon for the field.\n */\n readonly icon = input<string>();\n /**\n * The color of the icon.\n */\n readonly iconColor = input<string>();\n /**\n * If true, the component is disabled.\n */\n readonly disabled = input<boolean>();\n /**\n * If true, the obligatory dot is shown.\n */\n readonly obligatory = input<boolean>();\n /**\n * Lines preferences for the item.\n */\n readonly lines = input<string>();\n /**\n * The color for the component.\n */\n readonly color = input<string>();\n /**\n * On select event.\n */\n readonly select = output<string>();\n /**\n * Icon select.\n */\n readonly iconSelect = output<void>();\n\n private _popover = inject(PopoverController);\n\n async openPalette(event: any): Promise<void> {\n if (this.disabled()) return;\n\n const componentProps = { colors: this.colors(), current: this.current() };\n const popover = await this._popover.create({ component: ColorsPaletteComponent, componentProps, event });\n popover.onDidDismiss().then(res => {\n if (res && res.data) this.select.emit(res.data);\n });\n popover.present();\n }\n\n doIconSelect(event: any): void {\n if (event) event.stopPropagation();\n this.iconSelect.emit(event);\n }\n}\n\n/**\n * Component to open in a popover for displaying the colors available.\n */\n@Component({\n selector: 'idea-colors-palette',\n imports: [IonContent, IonGrid, IonRow, IonCol, IonAvatar, IonIcon],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ion-content>\n <ion-grid>\n <ion-row>\n @for (c of colors; track c) {\n <ion-col [size]=\"2\">\n <ion-avatar\n class=\"colorCircle tappable\"\n [style.background-color]=\"c.hex\"\n [title]=\"c.name || c.hex\"\n (click)=\"pick(c.hex)\"\n >\n @if (c.hex === current) {\n <ion-icon name=\"checkmark\" />\n }\n </ion-avatar>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n </ion-content>\n `,\n styles: [\n `\n ion-content {\n --background: var(--ion-color-white);\n }\n ion-avatar.colorCircle {\n width: 20px;\n height: 20px;\n }\n .tappable {\n cursor: pointer;\n }\n ion-avatar.colorCircle ion-icon {\n color: white;\n font-size: 1.2em;\n }\n `\n ]\n})\nexport class ColorsPaletteComponent {\n private _popover = inject(PopoverController);\n\n /**\n * The pickable colors.\n */\n @Input() colors?: Color[];\n /**\n * The current color.\n */\n @Input() current?: string;\n\n pick(color: string): void {\n this._popover.dismiss(color);\n }\n}\n","import { Component, inject, ChangeDetectionStrategy, input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AlertController, IonItem, IonButton, IonIcon, IonInput } from '@ionic/angular/standalone';\nimport { Contacts } from 'idea-toolbox';\nimport { IDEATranslatePipe, IDEATranslationsService } from '@idea-ionic/common';\n\n@Component({\n selector: 'idea-contacts',\n imports: [FormsModule, IDEATranslatePipe, IonInput, IonIcon, IonButton, IonItem],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"contacts\">\n @if (showName()) {\n <ion-item [lines]=\"lines()\" [color]=\"color()\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.CONTACTS.NAME' | translate\"\n [disabled]=\"!editMode()\"\n [placeholder]=\"'IDEA_UNCOMMON.CONTACTS.NAME_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.NAME_HINT' | translate\"\n [(ngModel)]=\"contacts().name\"\n />\n </ion-item>\n }\n <ion-item [lines]=\"lines()\" [color]=\"color()\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.CONTACTS.PHONE' | translate\"\n [disabled]=\"!editMode()\"\n [placeholder]=\"'IDEA_UNCOMMON.CONTACTS.PHONE_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.PHONE_HINT' | translate\"\n [(ngModel)]=\"contacts().phone\"\n />\n @if (!editMode()) {\n <ion-button\n slot=\"end\"\n fill=\"clear\"\n color=\"dark\"\n class=\"marginTop\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.CALL' | translate\"\n (click)=\"call()\"\n >\n <ion-icon name=\"call\" slot=\"icon-only\" />\n </ion-button>\n }\n </ion-item>\n <ion-item [lines]=\"lines()\" [color]=\"color()\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.CONTACTS.EMAIL' | translate\"\n [disabled]=\"!editMode()\"\n [placeholder]=\"'IDEA_UNCOMMON.CONTACTS.EMAIL_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.EMAIL_HINT' | translate\"\n [(ngModel)]=\"contacts().email\"\n />\n @if (!editMode()) {\n <ion-button\n slot=\"end\"\n fill=\"clear\"\n color=\"dark\"\n class=\"marginTop\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.SEND_EMAIL' | translate\"\n (click)=\"sendEmail()\"\n >\n <ion-icon name=\"mail\" slot=\"icon-only\" />\n </ion-button>\n }\n </ion-item>\n </div>\n `,\n styles: [\n `\n .marginTop {\n margin-top: 14px;\n }\n `\n ]\n})\nexport class IDEAContactsComponent {\n private _alert = inject(AlertController);\n private _translate = inject(IDEATranslationsService);\n\n /**\n * The contacts to manage.\n */\n readonly contacts = input<Contacts>(new Contacts());\n /**\n * If true, show the field `name`.\n */\n readonly showName = input(false);\n /**\n * Whether the fields are editable or disabled.\n */\n readonly editMode = input(true);\n /**\n * The lines attribute of the item.\n */\n readonly lines = input<string>();\n /**\n * The color for the component.\n */\n readonly color = input<string>();\n\n sendEmail(): void {\n const contacts = this.contacts();\n if (!contacts.email) return;\n const url = `mailto:${contacts.email}`;\n this.preExternalAction(contacts.email, (): Window => window.open(url, '_system'));\n }\n call(): void {\n const contacts = this.contacts();\n if (!contacts.phone) return;\n const url = `tel:${contacts.phone}`;\n this.preExternalAction(contacts.phone, (): Window => window.open(url, '_system'));\n }\n\n private preExternalAction(message: string, cb: () => void): void {\n const header = this._translate._('COMMON.DO_YOU_WANT_TO_PROCEED');\n const buttons = [\n { text: this._translate._('COMMON.CANCEL') },\n { text: this._translate._('COMMON.CONFIRM'), handler: (): void => cb() }\n ];\n const cssClass = 'selectableAlertMessage';\n this._alert.create({ header, message, buttons, cssClass }).then(alert => alert.present());\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnInit, inject, ChangeDetectionStrategy, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n AlertController,\n ModalController,\n IonHeader,\n IonToolbar,\n IonTitle,\n IonButtons,\n IonButton,\n IonIcon,\n IonGrid,\n IonContent,\n IonRow,\n IonCol,\n IonInput,\n IonFooter\n} from '@ionic/angular/standalone';\nimport { epochDateTime, epochISOString } from 'idea-toolbox';\nimport { IDEALocalizedDatePipe, IDEATranslatePipe, IDEATranslationsService } from '@idea-ionic/common';\n\n/**\n * A random sunday, used as reference to calculate the week days.\n */\nconst SUNDAY = 259200000;\n\n@Component({\n selector: 'idea-calendar-picker',\n imports: [\n CommonModule,\n FormsModule,\n IDEATranslatePipe,\n IDEALocalizedDatePipe,\n IonFooter,\n IonInput,\n IonCol,\n IonRow,\n IonContent,\n IonGrid,\n IonIcon,\n IonButton,\n IonButtons,\n IonTitle,\n IonToolbar,\n IonHeader\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: 'calendarPicker.component.html',\n styleUrls: ['calendarPicker.component.scss']\n})\nexport class IDEACalendarPickerComponent implements OnInit {\n private _modal = inject(ModalController);\n private _alert = inject(AlertController);\n private _translate = inject(IDEATranslationsService);\n\n @Input() inputDate?: epochDateTime | epochISOString;\n @Input() timePicker = false;\n @Input() manualTimePicker = false;\n @Input() title?: string;\n @Input() hideClearButton = false;\n @Input() min?: epochDateTime | epochISOString;\n @Input() max?: epochDateTime | epochISOString;\n\n refDate = signal<Date>(undefined);\n selectedDate: Date;\n today: Date;\n calendarGrid = signal<Date[][]>(undefined);\n hour: number;\n minute: number;\n hours: string[];\n minutes: string[];\n weekDays: string[];\n dateMin: Date;\n dateMax: Date;\n\n ngOnInit(): void {\n this.today = new Date();\n const inputDate = this.inputDate;\n this.refDate.set(inputDate ? new Date(inputDate) : new Date(this.today));\n this.selectedDate = new Date(this.refDate());\n this.hour = 12; // to endure timezones\n this.minute = 0;\n const manualTimePicker = this.manualTimePicker;\n if (this.timePicker || manualTimePicker) {\n this.hour = this.selectedDate.getHours();\n if (manualTimePicker) this.minute = this.selectedDate.getMinutes();\n else {\n // round the minutes a multiple of 5\n this.minute = Math.ceil(this.selectedDate.getMinutes() / 5) * 5;\n this.selectedDate.setMinutes(this.minute);\n }\n }\n this.buildCalendarGrid(this.refDate());\n this.hours = Array.from(Array(24).keys()).map(i => '0'.concat(i.toString()).slice(-2));\n this.minutes = Array.from(Array(12).keys()).map(i => '0'.concat((i * 5).toString()).slice(-2));\n // build the weekdays based on the current locale\n this.weekDays = new Array<string>();\n const refDateForWeekDays = new Date(SUNDAY);\n refDateForWeekDays.setDate(refDateForWeekDays.getDate() - this.getLocalisedDay(refDateForWeekDays));\n for (let i = 0; i < 7; i++) {\n this.weekDays.push(refDateForWeekDays.toLocaleDateString(this._translate.getCurrentLang(), { weekday: 'short' }));\n refDateForWeekDays.setDate(refDateForWeekDays.getDate() + 1);\n }\n const min = this.min;\n if (min) this.dateMin = new Date(min);\n const max = this.max;\n if (max) this.dateMax = new Date(max);\n }\n\n getLocalisedDay(date: Date): number {\n let n = date.getDay();\n switch (this._translate.getCurrentLang()) {\n case 'it':\n n = --n < 0 ? 6 : n;\n break;\n }\n return n;\n }\n\n buildCalendarGrid(refDate: Date): void {\n // find the first day in the month: the important data here is the day of the week\n const firstDateOfMonth = new Date(refDate.getFullYear(), refDate.getMonth(), 1);\n // the following flag is used to divide the logic so I can fill the calendar\n // also with the dates from the previous month, until there's space in the grid\n let haventFoundFirstDay = true;\n // index used to build the dates of the month, starting from the first one\n let index = 1;\n const calendarGrid = new Array<Date[]>();\n for (let i = 0; i < 6; i++) {\n calendarGrid[i] = new Array<Date>();\n for (let j = 0; j < 7; j++) {\n if (haventFoundFirstDay) {\n if (this.getLocalisedDay(firstDateOfMonth) === j) {\n // note: considers Sunday\n haventFoundFirstDay = false;\n calendarGrid[i][j] = new Date(firstDateOfMonth);\n // now the I've found the first date of the month I can fill the calendar\n // the dates fromt the previous month, until there's space in the grid\n for (let y = this.getLocalisedDay(firstDateOfMonth); y >= 0; y--) {\n const d = new Date(firstDateOfMonth);\n d.setDate(firstDateOfMonth.getDate() - y);\n calendarGrid[i][this.getLocalisedDay(firstDateOfMonth) - y] = d;\n }\n }\n } else {\n // fill the following dates until there's space in the grid\n const d = new Date(firstDateOfMonth);\n d.setDate(firstDateOfMonth.getDate() + index++);\n calendarGrid[i][j] = d;\n }\n }\n }\n this.calendarGrid.set(calendarGrid);\n }\n\n addYears(offset: number): void {\n this.refDate.update(d => {\n const refDate = new Date(d);\n refDate.setFullYear(refDate.getFullYear() + offset);\n return refDate;\n });\n this.buildCalendarGrid(this.refDate());\n }\n setYear(year: string | number): void {\n if (!year) return;\n\n this.refDate.update(d => {\n const refDate = new Date(d);\n refDate.setFullYear(Number(year));\n return refDate;\n });\n this.buildCalendarGrid(this.refDate());\n }\n addMonths(offset: number): void {\n this.refDate.update(d => {\n const refDate = new Date(d);\n refDate.setMonth(refDate.getMonth() + offset);\n return refDate;\n });\n this.buildCalendarGrid(this.refDate());\n }\n async showMonths(): Promise<void> {\n const buttons = [];\n const inputs: any[] = [];\n const month = new Date(0);\n for (let i = 1; i <= 12; i++) {\n inputs.push({\n type: 'radio',\n label: month.toLocaleDateString(this._translate.getCurrentLang(), { month: 'long' }),\n value: i.toString(),\n checked: i === this.refDate().getMonth() + 1\n });\n month.setMonth(month.getMonth() + 1);\n }\n buttons.push({ text: this._translate._('COMMON.CANCEL'), role: 'cancel' });\n buttons.push({\n text: this._translate._('COMMON.SELECT'),\n handler: (m: string): void => {\n this.refDate.update(d => {\n const refDate = new Date(d);\n refDate.setMonth(parseInt(m, 10) - 1);\n return refDate;\n });\n this.buildCalendarGrid(this.refDate());\n }\n });\n\n const alert = await this._alert.create({\n header: this._translate._('IDEA_UNCOMMON.CALENDAR.MONTH'),\n buttons,\n inputs\n });\n alert.present();\n }\n\n isDateSelectable(date: Date): boolean {\n if (this.dateMin && date < this.dateMin) return false;\n if (this.dateMax && date > this.dateMax) return false;\n return true;\n }\n\n selectDate(date: Date): void {\n this.selectedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), this.hour, this.minute);\n }\n\n selectHour(hour: string): void {\n this.hour = Number(hour);\n this.selectedDate.setHours(this.hour);\n }\n selectMinute(minute: string): void {\n this.minute = Number(minute);\n this.selectedDate.setMinutes(this.minute);\n }\n\n isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n }\n isSameMonth(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();\n }\n\n isSameHour(hour: string): boolean {\n return this.selectedDate.getHours() === Number(hour);\n }\n isSameMinute(minute: string): boolean {\n return this.selectedDate.getMinutes() === Number(minute);\n }\n\n save(reset?: boolean): void {\n this._modal.dismiss(reset ? '' : this.selectedDate);\n }\n close(): void {\n this._modal.dismiss();\n }\n}\n","<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-title>{{ title }}</ion-title>\n <ion-buttons slot=\"end\">\n @if (!hideClearButton) {\n <ion-button [title]=\"'IDEA_UNCOMMON.CALENDAR.RESET' | translate\" (click)=\"save(true)\">\n <ion-icon slot=\"icon-only\" name=\"arrow-undo\" />\n </ion-button>\n }\n <ion-button [title]=\"'IDEA_UNCOMMON.CALENDAR.CLOSE_WITHOUT_SAVING' | translate\" (click)=\"close()\">\n <ion-icon slot=\"icon-only\" name=\"close\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <ion-grid fixed class=\"ion-no-padding\">\n <ion-row>\n <h1 class=\"headerLabel\">{{ 'IDEA_UNCOMMON.CALENDAR.SET_DATE' | translate }}</h1>\n </ion-row>\n <ion-row style=\"margin-bottom: 8px\">\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"5\">\n <ion-row class=\"ion-align-items-center ion-justify-content-center\">\n <ion-col class=\"ion-text-right ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addYears(-1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-back\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding tappable\" [size]=\"6\">\n <ion-input\n type=\"text\"\n [placeholder]=\"'IDEA_UNCOMMON.CALENDAR.YEAR' | translate\"\n [value]=\"refDate().getFullYear()\"\n (ionFocus)=\"$event.target.value = ''\"\n (ionChange)=\"setYear($event?.target?.value)\"\n >\n </ion-input>\n </ion-col>\n <ion-col class=\"ion-text-left ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addYears(+1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-forward\" />\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"7\">\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-right ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addMonths(-1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-back\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding tappable\" [size]=\"6\" (click)=\"showMonths()\">\n {{ refDate() | dateLocale: 'MMMM' }}\n </ion-col>\n <ion-col class=\"ion-text-left ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addMonths(+1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-forward\" />\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-col>\n </ion-row>\n <ion-row style=\"margin-bottom: 8px\" class=\"headerLabel\">\n @for (ddd of weekDays; track ddd) {\n <ion-col class=\"ion-text-center ion-no-padding\">\n {{ ddd }}\n </ion-col>\n }\n </ion-row>\n @for (row of calendarGrid(); track row; let i = $index) {\n <ion-row class=\"ion-align-items-center\">\n @for (col of row; track col; let j = $index) {\n <ion-col class=\"ion-text-center ion-no-padding\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"\n isSameDay(calendarGrid()[i][j], today) || isSameDay(calendarGrid()[i][j], selectedDate)\n ? 'primary'\n : isSameMonth(calendarGrid()[i][j], refDate())\n ? 'dark'\n : 'medium'\n \"\n [fill]=\"\n isSameDay(calendarGrid()[i][j], selectedDate)\n ? 'solid'\n : isSameDay(calendarGrid()[i][j], today)\n ? 'outline'\n : 'clear'\n \"\n [disabled]=\"!isDateSelectable(calendarGrid()[i][j])\"\n (click)=\"selectDate(calendarGrid()[i][j])\"\n >\n {{ calendarGrid()[i][j] | date: 'd' }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n }\n @if (timePicker || manualTimePicker) {\n <ion-row>\n <h1 class=\"headerLabel\">\n {{ 'IDEA_UNCOMMON.CALENDAR.SET_TIME' | translate }}\n </h1>\n </ion-row>\n }\n @if (timePicker) {\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-no-padding\" [size]=\"7\">\n <ion-row>\n @for (hour of hours; track hour) {\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"2\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"isSameHour(hour) ? 'primary' : 'dark'\"\n [fill]=\"isSameHour(hour) ? 'solid' : 'clear'\"\n (click)=\"selectHour(hour)\"\n >\n {{ hour }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"1\"> : </ion-col>\n <ion-col class=\"ion-no-padding\" [size]=\"4\">\n <ion-row>\n @for (minute of minutes; track minute) {\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"4\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"isSameMinute(minute) ? 'primary' : 'dark'\"\n [fill]=\"isSameMinute(minute) ? 'solid' : 'clear'\"\n (click)=\"selectMinute(minute)\"\n >\n {{ minute }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n </ion-col>\n </ion-row>\n }\n @if (manualTimePicker) {\n <ion-row class=\"ion-align-items-center manualTimePicker\">\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <input type=\"number\" min=\"0\" max=\"23\" [value]=\"hour\" (change)=\"selectHour($event.target.value)\" />\n <span>:</span>\n <input type=\"number\" min=\"0\" max=\"59\" [value]=\"minute\" (change)=\"selectMinute($event.target.value)\" />\n </ion-col>\n </ion-row>\n }\n </ion-grid>\n</ion-content>\n<ion-footer>\n <ion-toolbar color=\"ideaToolbar\" class=\"tappable\" (click)=\"save()\">\n <ion-title class=\"ion-text-center\">\n <ion-icon name=\"checkmark\" />\n </ion-title>\n </ion-toolbar>\n</ion-footer>\n","import {\n Component,\n SimpleChanges,\n OnInit,\n OnDestroy,\n OnChanges,\n inject,\n ChangeDetectionStrategy,\n output,\n input,\n signal\n} from '@angular/core';\nimport { ModalController, IonItem, IonButton, IonIcon, IonLabel, IonText } from '@ionic/angular/standalone';\nimport { Subscription } from 'rxjs';\nimport { epochDateTime, epochISOString } from 'idea-toolbox';\nimport { IDEATranslationsService } from '@idea-ionic/common';\n\nimport { IDEACalendarPickerComponent } from './calendarPicker.component';\n\n@Component({\n selector: 'idea-date-time',\n imports: [IonText, IonLabel, IonIcon, IonButton, IonItem],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ion-item\n class=\"dateTimeItem\"\n [color]=\"color()\"\n [lines]=\"lines()\"\n [title]=\"placeholder() || label() || ''\"\n [button]=\"!disabled()\"\n [disabled]=\"isOpening()\"\n [class.withLabel]=\"label()\"\n (click)=\"openCalendarPicker()\"\n >\n @if (icon()) {\n <ion-button\n fill=\"clear\"\n slot=\"start\"\n [color]=\"iconColor()\"\n [class.marginTop]=\"label()\"\n (click)=\"doIconSelect($event)\"\n >\n <ion-icon [icon]=\"icon()\" slot=\"icon-only\" />\n </ion-button>\n }\n @if (label()) {\n <ion-label position=\"stacked\" [class.selectable]=\"!disabled()\">\n {{ label() }}\n @if (obligatory() && !disabled()) {\n <ion-text class=\"obligatoryDot\" />\n }\n </ion-label>\n }\n <ion-label class=\"value\" [class.selectable]=\"!disabled()\">\n @if (!valueToDisplay() && !disabled()) {\n <ion-text class=\"placeholder\" [class.selectable]=\"!disabled()\">\n {{ placeholder() }}\n </ion-text>\n }\n {{ valueToDisplay() }}\n </ion-label>\n @if (!disabled()) {\n <ion-icon slot=\"end\" icon=\"caret-down\" class=\"selectIcon\" [class.selectable]=\"!disabled()\" />\n }\n </ion-item>\n `,\n styles: [\n `\n .dateTimeItem {\n min-height: 48px;\n height: auto;\n .description {\n margin: 10px 0;\n height: 20px;\n line-height: 20px;\n width: 100%;\n }\n .placeholder {\n color: var(--ion-color-medium);\n }\n .value {\n white-space: nowrap;\n }\n .selectIcon {\n margin: 0;\n padding-left: 4px;\n font-size: 0.8em;\n color: var(--ion-color-medium);\n }\n }\n .dateTimeItem.withLabel {\n min-height: 58px;\n height: auto;\n .selectIcon {\n padding-top: 25px;\n }\n ion-button[slot='start'] {\n margin-top: 16px;\n }\n }\n .selectable {\n cursor: pointer;\n }\n `\n ]\n})\nexport class IDEADateTimeComponent implements OnInit, OnDestroy, OnChanges {\n private _modal = inject(ModalController);\n private _translate = inject(IDEATranslationsService);\n\n /**\n * The date to show/pick.\n */\n readonly date = input<epochDateTime | epochISOString>();\n /**\n * Whether to show the time picker (datetime) or not (date).\n */\n readonly timePicker = input(false);\n /**\n * Whether to show the MANUAL time picker (datetime) or not (date).\n */\n readonly manualTimePicker = input(false);\n /**\n * Whether to use the `epochISOString` format instead of `epochDateTime`.\n */\n readonly useISOFormat = input(false);\n /**\n * The label for the field.\n */\n readonly label = input<string>();\n /**\n * The icon for the field.\n */\n readonly icon = input<string>();\n /**\n * The color of the icon.\n */\n readonly iconColor = input<string>();\n /**\n * Lines preferences for the item.\n */\n readonly lines = input<string>();\n /**\n * The color for the component.\n */\n readonly color = input<string>();\n /**\n * A placeholder for the field.\n */\n readonly placeholder = input<string>();\n /**\n * If true, the component is disabled.\n */\n readonly disabled = input(false);\n /**\n * If true, the obligatory dot is shown.\n */\n readonly obligatory = input(false);\n /**\n * If true, hidew the clear button in the header.\n */\n readonly hideClearButton = input(false);\n /**\n * If set, is the minimum date selectable.\n */\n readonly min = input<epochDateTime | epochISOString>();\n /**\n * If set, is the maximum date selectable.\n */\n readonly max = input<epochDateTime | epochISOString>();\n\n readonly dateChange = output<epochDateTime | epochISOString | null | any>();\n readonly iconSelect = output<void>();\n\n valueToDisplay = signal<string>('');\n private langChangeSubscription: Subscription;\n\n isOpening = signal(false);\n\n ngOnInit(): void {\n this.langChangeSubscription = this._translate.onLangChange.subscribe((): void => {\n this.valueToDisplay.set(this.getValueToDisplay(this.date()));\n });\n }\n ngOnDestroy(): void {\n if (this.langChangeSubscription) this.langChangeSubscription.unsubscribe();\n }\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.date || changes.timePicker) this.valueToDisplay.set(this.getValueToDisplay(this.date()));\n }\n\n async openCalendarPicker(): Promise<void> {\n if (this.disabled() || this.isOpening()) return;\n this.isOpening.set(true);\n const modal = await this._modal.create({\n component: IDEACalendarPickerComponent,\n componentProps: {\n inputDate: this.date(),\n title: this.label(),\n timePicker: this.timePicker(),\n manualTimePicker: this.manualTimePicker(),\n hideClearButton: this.hideClearButton(),\n min: this.min(),\n max: this.max()\n }\n });\n modal.onDidDismiss().then(({ data }): void => {\n if (data !== undefined && data !== null) {\n if (data === '') this.doSelect(null);\n else this.doSelect(data as Date);\n }\n });\n modal.present();\n this.isOpening.set(false);\n }\n\n private getValueToDisplay(date: epochDateTime | epochISOString): string {\n return !date\n ? ''\n : this._translate.formatDate(\n date,\n this.timePicker() || this.manualTimePicker() ? 'd MMM yyyy, HH:mm' : 'mediumDate'\n );\n }\n\n doSelect(date: Date): void {\n this.dateChange.emit(date ? (this.useISOFormat() ? date.toISOString() : date.valueOf()) : null);\n }\n doIconSelect(event: Event): void {\n if (event) event.stopPropagation();\n this.iconSelect.emit();\n }\n}\n","import { Component, Input, SimpleChanges, OnChanges, ChangeDetectionStrategy, output, input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { IonItem, IonIcon, IonLabel, IonText } from '@ionic/angular/standalone';\nimport { IDEATranslatePipe } from '@idea-ionic/common';\n\n@Component({\n selector: 'idea-duration',\n imports: [IonText, IonLabel, IonIcon, IonItem, FormsModule, IDEATranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ion-item class=\"durationItem\" [lines]=\"lines()\" [color]=\"color()\" [title]=\"title() || label\">\n @if (icon) {\n <ion-icon slot=\"start\" [name]=\"icon\" />\n }\n @if (!icon && label) {\n <ion-label position=\"stacked\">\n {{ label }}\n @if (obligatory() && !disabled()) {\n <ion-text class=\"obligatoryDot\" />\n }\n </ion-label>\n }\n <ion-label class=\"value\">\n <ion-input\n type=\"number\"\n min=\"0\"\n max=\"23\"\n inputmode=\"numeric\"\n [disabled]=\"disabled()\"\n [(ngModel)]=\"hours\"\n (ionChange)=\"setDuration('hours')\"\n />\n <ion-text>{{\n ((shortLabels() ? 'IDEA_UNCOMMON.DURATION.HH' : 'IDEA_UNCOMMON.DURATION.HOURS') | translate).toLowerCase()\n }}</ion-text>\n <ion-input\n type=\"number\"\n min=\"0\"\n max=\"59\"\n inputmode=\"numeric\"\n [disabled]=\"disabled()\"\n [(ngModel)]=\"minutes\"\n (ionChange)=\"setDuration('minutes')\"\n />\n <ion-text>{{\n ((shortLabels() ? 'IDEA_UNCOMMON.DURATION.MM' : 'IDEA_UNCOMMON.DURATION.MINUTES') | translate).toLowerCase()\n }}</ion-text>\n @if (!hideSeconds()) {\n <ion-input\n type=\"number\"\n min=\"0\"\n max=\"59\"\n inputmode=\"numeric\"\n [disabled]=\"disabled()\"\n [(ngModel)]=\"seconds\"\n (ionChange)=\"setDuration('seconds')\"\n />\n }\n @if (!hideSeconds()) {\n <ion-text>\n {{\n (\n (shortLabels() ? 'IDEA_UNCOMMON.DURATION.SS' : 'IDEA_UNCOMMON.DURATION.SECONDS') | translate\n ).toLowerCase()\n }}\n </ion-text>\n }\n </ion-label>\n </ion-item>\n `,\n styles: [\n `\n .durationItem {\n .value {\n max-width: none;\n width: 100%;\n pointer-events: all;\n ion-input {\n display: inline-block;\n max-width: 35px;\n text-align: right;\n }\n ion-text {\n margin-left: 10px;\n margin-right: 20px;\n font-size: 0.8em;\n }\n }\n }\n `\n ]\n})\nexport class IDEADurationComponent implements OnChanges {\n /**\n * The default number of seconds, to build the duration.\n */\n @Input() default: number;\n /**\n * The label for the field.\n */\n @Input() label: string;\n /**\n * The icon (alternative to the label) for the field.\n */\n @Input() icon: string;\n /**\n * The title (hint) for the field.\n */\n readonly title = input<string>();\n /**\n * If true, the component is disabled.\n */\n readonly disabled = input<boolean>();\n /**\n * If true, the obligatory dot is shown.\n */\n readonly obligatory = input<boolean>();\n /**\n * Lines preferences for the item.\n */\n readonly lines = input<string>();\n /**\n * The color for the component.\n */\n readonly color = input<string>();\n /**\n * Whether to show or hide the seconds input.\n */\n readonly hideSeconds = input<boolean>();\n /**\n * Whether to show a shortened version of the labels.\n */\n readonly shortLabels = input<boolean>();\n /**\n * On change event. It emits a number of seconds representing the duration.\n */\n readonly set = output<number>();\n\n /**\n * The hour part of the duration.\n */\n hours: number;\n /**\n * The minutes part of the duration.\n */\n minutes: number;\n /**\n * The seconds part of the duration.\n */\n seconds: number;\n\n constructor() {\n this.default = this.hours = this.minutes = this.seconds = 0;\n }\n ngOnChanges(changes: SimpleChanges): void {\n // assign a default value to the duration\n if (changes['default'] && changes['default'].isFirstChange()) {\n const refDate = new Date(0);\n refDate.setHours(0, 0, 0);\n refDate.setSeconds(refDate.getSeconds() + this.default);\n this.hours = refDate.getHours();\n this.minutes = refDate.getMinutes();\n this.seconds = this.hideSeconds() ? 0 : refDate.getSeconds();\n }\n }\n\n /**\n * When one of the parts changes, emit the new duration.\n */\n setDuration(type: string): void {\n switch (type) {\n case 'hours':\n const hh = Number(this.hours) || 0;\n this.hours = hh > 23 ? 23 : hh < 0 ? 0 : hh;\n break;\n case 'minutes':\n const mm = Number(this.minutes) || 0;\n this.minutes = mm > 59 ? 59 : mm < 0 ? 0 : mm;\n break;\n case 'seconds':\n const ss = Number(this.seconds) || 0;\n if (this.hideSeconds()) this.seconds = 0;\n else this.seconds = ss > 59 ? 59 : ss < 0 ? 0 : ss;\n break;\n }\n this.set.emit(this.hours * 3600 + this.minutes * 60 + this.seconds);\n }\n}\n","import { Component, OnInit, inject, signal, ChangeDetectionStrategy } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport {\n IonContent,\n IonCard,\n IonImg,\n IonCardHeader,\n IonCardTitle,\n IonIcon,\n IonCardContent\n} from '@ionic/angular/standalone';\nimport { ExternalCalendarSources, mdToHtml } from 'idea-toolbox';\nimport { IDEAEnvironment, IDEALoadingService, IDEATranslatePipe, IDEATranslationsService } from '@idea-ionic/common';\n\nimport { IDEAAWSAPIService } from '../AWSAPI.service';\nimport { IDEATinCanService } from '../tinCan.service';\n\n@Component({\n selector: 'idea-echo',\n imports: [IDEATranslatePipe, IonCardContent, IonIcon, IonCardTitle, IonCardHeader, IonImg, IonCard, IonContent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ion-content>\n <div class=\"flexBox\">\n <ion-card class=\"echoCard maxWidthContainer\">\n <ion-img [src]=\"'assets/icons/icon-auth.svg'\" />\n <ion-card-header>\n <ion-card-title>\n @if (success() === true) {\n <ion-icon testId=\"echoSuccess\" color=\"success\" name=\"checkmark\" />\n }\n @if (success() === false) {\n <ion-icon testId=\"echoFailure\" color=\"danger\" name=\"close\" />\n }\n </ion-card-title>\n </ion-card-header>\n <ion-card-content class=\"selectable\">\n {{ content() }}\n @if (htmlContent()) {\n <div class=\"htmlContent\" [innerHTML]=\"htmlContent()\"></div>\n }\n @if (success() === false || success() === true) {\n <p class=\"youCanCloseMe\">\n <i>{{ 'IDEA_UNCOMMON.ECHO.YOU_CAN_CLOSE_THE_PAGE' | translate }}</i>\n </p>\n }\n </ion-card-content>\n </ion-card>\n </div>\n </ion-content>\n `,\n styles: [\n `\n .echoCard {\n min-width: 300px;\n padding: 30px 20px;\n text-align: center;\n ion-img {\n width: 80px;\n display: block;\n margin: 0 auto;\n }\n ion-icon {\n font-size: 1.8em;\n }\n ion-card-content {\n margin-bottom: 20px;\n font-size: 1.2em;\n p.youCanCloseMe {\n margin-top: 12px;\n }\n }\n }\n `\n ]\n})\nexport class IDEAEchoPage implements OnInit {\n protected _env = inject(IDEAEnvironment);\n private _route = inject(ActivatedRoute);\n private _tc = inject(IDEATinCanService);\n private _loading = inject(IDEALoadingService);\n private _API = inject(IDEAAWSAPIService);\n private _translate = inject(IDEATranslationsService);\n\n content = signal<string>(undefined);\n htmlContent = signal<string>(undefined);\n success = signal<boolean>(undefined);\n\n ngOnInit(): void {\n const request: EchoRequests =\n this._route.snapshot.paramMap.get('request') || this._route.snapshot.queryParams.request;\n const code: string = this._route.snapshot.queryParams.code;\n const user: string = decodeURIComponent(this._route.snapshot.queryParams.user);\n const state: string = this._route.snapshot.queryParams.state;\n switch (request) {\n case EchoRequests.MAINTENANCE:\n this.maintenanceMode();\n break;\n case EchoRequests.REGISTRATION:\n this.followRegistrationLink(code, user);\n break;\n case EchoRequests.INVITATION:\n this.followInvitationLink(code);\n break;\n case EchoRequests.EMAIL_CHANGE:\n this.followEmailChangeConfirmationLink(code);\n break;\n case EchoRequests.GITHUB_INTEGRATION:\n this.endGitHubIntegrationFlow(code === 'done');\n break;\n case EchoRequests.TRELLO_INTEGRATION:\n this.endTrelloIntegrationFlow(code);\n break;\n case EchoRequests.MICROSOFT_CALENDARS_INTEGRATION:\n this.endExternalCalendarsIntegrationFlow(ExternalCalendarSources.MICROSOFT, code, state);\n break;\n case EchoRequests.GOOGLE_CALENDARS_INTEGRATION:\n this.endExternalCalendarsIntegrationFlow(ExternalCalendarSources.GOOGLE, code, state);\n break;\n default:\n this.success.set(false);\n this.content.set(this._translate._('IDEA_UNCOMMON.ECHO.INVALID_ACTION'));\n break;\n }\n }\n\n maintenanceMode(): void {\n const announcement = this._tc.get('idea-announcement');\n if (announcement && announcement.content) this.htmlContent.set(mdToHtml(announcement.content));\n }\n\n async followRegistrationLink(code: string, user: string): Promise<void> {\n try {\n await this._loading.show();\n await this._API.postResource('cognito2', {\n idea: true,\n body: {\n action: 'CONFIRM_SIGN_UP',\n username: user,\n confirmationCode: code,\n cognitoUserPoolClientId: this._env.aws.cognito.userPoolClientId\n }\n });\n this.success.set(true);\n this.content.set(this._translate._('IDEA_UNCOMMON.ECHO.ACCOUNT_CONFIRMED'));\n } catch (error) {\n this.success.set(false);\n this.content.set(this._translate._('IDEA_UNCOMMON.ECHO.REQUEST_FAILED'));\n } finally {\n this._loading.hide();\n }\n }\n async followInvitationLink(code: string): Promise<void> {\n try {\n await this._loading.show();\n await this._API.getResource('invitations', { idea: true, resourceId: code });\n this.success.set(true);\n this.content.set(this._translate._('IDEA_UNCOMMON.ECHO.TEAM_JOINED'));\n } catch (error) {\n this.success.set(false);\n this.content.set(this._translate._('IDEA_UNCOMMON.ECHO.REQUEST_FAILED'));\n } finally {\n this._loading.hide();\n }\n }\n async followEmailChangeConfirmationLink(code: string): Promise<void> {\n try {\n await this._loading.show();\n await this._API.getResource('emailChangeRequests', {\n idea: true,\n resourceId: code,\n params: { project: this._env.idea.project }\n });\n this.success.set(true);\n this.content.set(this._translate._('IDEA_UNCOMMON.ECHO.EMAIL_CHANGED'));\n } catch (error) {\n this.success.set(false);\n this.content.set(this._translate._('IDEA_UNCOMMON.ECHO.REQUEST_FAILED'));\n } finally {\n this._loading.hide();\n }\n }\n endGitHubIntegrationFlow(success: boolean): void {\n this.success.set(success);\n this.content.set(\n success\n ? this._translate._('IDEA_UNCOMMON.ECHO.GITHUB_SOURCE_INTEGRATION_SUCCESS')\n : this._translate._('IDEA_UNCOMMON.ECHO.GITHUB_SOURCE_INTEGRATION_ERROR')\n );\n }\n endTrelloIntegrationFlow(token: string): void {\n this.success.set(Boolean(token));\n this.content.set(\n token\n ? this._translate._('IDEA_UNCOMMON.ECHO.TRELLO_SOURCE_INTEGRATION_SUCCESS', { token })\n : this._translate._('IDEA_UNCOMMON.ECHO.TRELLO_SOURCE_INTEGRATION_ERROR')\n );\n }\n async endExternalCalendarsIntegrationFlow(\n service: ExternalCalendarSources,\n code: string,\n calendarId: string\n ): Promise<void> {\n try {\n await this._loading.show();\n await this._API.patchResource('calendars', {\n idea: true,\n body: { action: 'SET_EXTERNAL_INTEGRATION', service, code, calendarId, project: this._env.idea.project }\n });\n this.success.set(true);\n this.content.set(this._translate._('IDEA_UNCOMMON.ECHO.EXTERNAL_CALENDARS_SOURCE_INTEGRATION_SUCCESS'));\n } catch (error) {\n this.success.set(false);\n this.content.set(this._translate._('IDEA_UNCOMMON.ECHO.EXTERNAL_CALENDARS_SOURCE_INTEGRATION_ERROR'));\n } finally {\n this._loading.hide();\n }\n }\n}\n\nexport enum EchoRequests {\n MAINTENANCE = 'maintenance',\n REGISTRATION = 'registration',\n INVITATION = 'invitation',\n EMAIL_CHANGE = 'email-change',\n GITHUB_INTEGRATION = 'github-integration',\n TRELLO_INTEGRATION = 'trello-integration',\n MICROSOFT_CALENDARS_INTEGRATION = 'microsoft-calendars-integration',\n GOOGLE_CALENDARS_INTEGRATION = 'google-calendars-integration'\n}\n","import { Routes } from '@angular/router';\n\nimport { IDEAEchoPage } from './echo.page';\n\nexport const ideaEchoRoutes: Routes = [\n { path: '', component: IDEAEchoPage },\n { path: ':request', component: IDEAEchoPage }\n];\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { IDEATranslatePipe } from '@idea-ionic/common';\n\n@Component({\n selector: 'idea-mde-toolbar',\n imports: [IDEATranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"mdeToolbar\">\n <b>**{{ 'IDEA_UNCOMMON.MDE.TOOLBAR.BOLD' | translate }}**</b>\n <i>*{{ 'IDEA_UNCOMMON.MDE.TOOLBAR.ITALIC' | translate }}*</i>\n ~{{ 'IDEA_UNCOMMON.MDE.TOOLBAR.STRIKE' | translate }}~\n </div>\n `,\n styles: [\n `\n .mdeToolbar {\n text-align: right;\n color: #aaa;\n padding: 5px 0;\n font-size: 0.9em;\n b,\n i {\n padding-right: 5px;\n }\n }\n `\n ]\n})\nexport class IDEAMDEToolbarComponent {}\n","import { Component, Input, OnInit, inject, ChangeDetectionStrategy, input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n ModalController,\n IonHeader,\n IonToolbar,\n IonButtons,\n IonButton,\n IonIcon,\n IonTitle,\n IonContent,\n IonText,\n IonTextarea\n} from '@ionic/angular/standalone';\nimport { IDEATranslatePipe } from '@idea-ionic/common';\n\nimport { IDEAMDEToolbarComponent } from './mdeToolbar.component';\n\n@Component({\n selector: 'idea-mde',\n imports: [\n FormsModule,\n IDEATranslatePipe,\n IDEAMDEToolbarComponent,\n IonTextarea,\n IonText,\n IonContent,\n IonTitle,\n IonIcon,\n IonButton,\n IonButtons,\n IonToolbar,\n IonHeader\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n <ion-button [title]=\"'IDEA_UNCOMMON.MDE.CLOSE_WITHOUT_SAVING' | translate\" (click)=\"close()\">\n <ion-icon name=\"close\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n <ion-title>\n {{ title() || ('IDEA_UNCOMMON.MDE.TITLE' | translate) }}\n </ion-title>\n <ion-buttons slot=\"end\">\n <ion-button [title]=\"'IDEA_UNCOMMON.MDE.SAVE_AND_CLOSE' | translate\" (click)=\"confirm()\">\n <ion-icon name=\"checkmark\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n @if (header) {\n <h2 class=\"header\">\n {{ header }}\n </h2>\n }\n @if (description) {\n <p class=\"description\">\n {{ description }}\n </p>\n }\n @if (variables?.length) {\n <p class=\"variables\">\n <b> {{ 'IDEA_UNCOMMON.MDE.VARIABLES' | translate }}: </b>\n @for (v of variables; track v) {\n <ion-text>\n {{ v.concat(' ') }}\n </ion-text>\n }\n </p>\n }\n <ion-textarea rows=\"12\" [id]=\"id\" [placeholder]=\"placeholder()\" [(ngModel)]=\"value\" />\n <idea-mde-toolbar />\n </ion-content>\n `,\n styles: [\n `\n ion-content {\n --ion-background-color: #f4f4f4;\n }\n h2.header {\n margin: 0;\n font-size: 0.7em;\n font-weight: bold;\n text-transform: uppercase;\n }\n .description {\n margin-top: 5px;\n margin-bottom: 20px;\n font-size: 0.9em;\n }\n .variables {\n margin: 10px 5px;\n font-size: 0.8em;\n }\n ion-textarea {\n --background: var(--ion-color-white);\n padding: 10px;\n }\n `\n ]\n})\nexport class IDEAMDEComponent implements OnInit {\n private _modal = inject(ModalController);\n\n /**\n * Id to identify this specific Markdown Editor (default: 'mde').\n */\n @Input() id: string;\n /**\n * The title of the modal.\n */\n readonly title = input<string>();\n /**\n * The header text content.\n */\n @Input() header: string;\n /**\n * The sub-header description.\n */\n @Input() description: string;\n /**\n * A series of text variables to substitute with values.\n */\n @Input() variables: string[];\n /**\n * If set, will customize the initial value of the editor.\n */\n readonly initialValue = input<string>();\n /**\n * Custom placeholder that should be displayed.\n */\n readonly placeholder = input<string>();\n\n value: string;\n\n ngOnInit(): void {\n this.id = this.id || 'mde';\n this.variables = this.variables || new Array<string>();\n this.value = this.initialValue();\n }\n\n close(): void {\n this._modal.dismiss();\n }\n confirm(): void {\n this._modal.dismiss(this.value);\n }\n}\n","import { Injectable, inject, signal } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { Delta, DeltaRecord, DeltaResources, epochDateTime } from 'idea-toolbox';\nimport { IDEAStorageService, IDEATranslationsService } from '@idea-ionic/common';\n\nimport { IDEAAWSAPIService, APIRequestOption } from '../AWSAPI.service';\nimport { IDEAOfflineService } from './offline.service';\n\n/**\n * After how much time we need to request a synchronisation to keep the contents up-to-date.\n */\nexport const SYNC_EXPIRATION_INTERVAL = 1000 * 60 * 60 * 24; // a day\n/**\n * Prefix for the key of the API requests queue info in the local storage.\n */\nexport const QUEUE_API_REQUESTS_KEY = 'IDEAOfflineService.queueAPIrequests';\n/**\n * Prefix for the key of the last sync time info in the local storage.\n */\nexport const LAST_SYNC_KEY = 'IDEAOfflineService.lastSyncAt';\n/**\n * The max number of elements per resource to synchronize during the first analysis of a synchronisation.\n * If the number of elements exceeds (there is more data after the 1st page), the operation require manual confirmation.\n */\nexport const NUM_ELEMENTS_WITHOUT_MANUAL_SYNC = 100;\n/**\n * The max number of elements per resource to request at the same time during a normal synchronisation.\n */\nexport const NUM_ELEMENTS_WITH_MANUAL_SYNC = 300;\n\n/**\n * Manage the offline functioning of the app's data (upload/download/synchronization).\n * Note: it includes all the methods of IDEAOfflineService.\n *\n * Download: it works through the **Delta** mechanism on back-end resources.\n * Practically, the service prepares each possible API GET requests for each of the involved resources.\n * In this way, if offline, the API service can hit an element by URL in the cache (storage offline).\n *\n * **How to use it**. Configure the sync mechanism in the main app.component as it follows:\n *\n * 1. Implement a CacheableResource class for each DeltaResource you want to cache offline.\n * 2. Set up the service (`setUpOfflineData`).\n * 3. Run a synchronization.\n * 4. Add the navigation to the Offline Manager (UI).\n * 5. Optionally, push offline API requests to the queue when offline.\n *\n * e.g. of CacheableResource classes:\n * ```\n * class CustomerCR extends CacheableResource {\n * constructor(description: string) {\n * super(DeltaResources.CUSTOMERS, description);\n * }\n * public listURL(element: any): string {\n * return `teams/${element.teamId}/customers`;\n * }\n * public elementURL(element: any): string {\n * return `teams/${element.teamId}/customers/${element.customerId}`;\n * }\n * public findIndexInList(list: Array<any>, element: any): number {\n * return list.findIndex(x => x.customerId === element.customerId);\n * }\n * public sort(a: any, b: any): number {\n * return a.name.localeCompare(b.name);\n * }\n * }\n */\n@Injectable({ providedIn: 'root' })\nexport class IDEAOfflineDataService {\n protected _storage = inject(IDEAStorageService);\n protected _translate = inject(IDEATranslationsService);\n protected _offline = inject(IDEAOfflineService);\n protected _API = inject(IDEAAWSAPIService);\n\n /**\n * True when running a synchronization.\n */\n synchronizing = signal<boolean>(undefined);\n /**\n * The timestamp of the last synchronization.\n */\n lastSyncAt = signal<epochDateTime>(undefined);\n /**\n * True if an error happened in the last synchronization.\n */\n errorInLastSync = signal<boolean>(undefined);\n /**\n * True if the synchronisation is too vast and so require a manual action of the user.\n */\n requiresManualConfirmation = signal<boolean>(undefined);\n /**\n * If false, ignore the entire upload scenario.\n */\n useQueueAPIRequests: boolean;\n /**\n * The array of the requests not executed because we are/were offline; they need to run once online.\n */\n queueAPIRequests: APIRequest[];\n\n /**\n * The id of the team of which to manage data offline.\n * If null, the project isn't teams-based.\n */\n protected teamId: string;\n /**\n * The array of DeltaResources to cache offline.\n */\n protected resources: (DeltaResources | string)[];\n /**\n * Helper structure to manage the CacheableResource for each DeltaResource.\n */\n protected cacheableResources: { [resource: string]: CacheableResource };\n /**\n * Key to acquire from the storage the lastSyncAt information of the team.\n */\n protected lastSyncKey: string;\n /**\n * Key to acquire from the storage the lastSyncAt information of the team.\n */\n protected queueAPIRequestKey: string;\n\n constructor() {\n this.queueAPIRequests = new Array<APIRequest>();\n this.resources = new Array<string>();\n this.cacheableResources = {};\n // subscribe to network changes\n this._offline.subscribe(isOnline => {\n if (isOnline) {\n // try a synchronization if needed or if the last one failed\n if (this.errorInLastSync()) this.synchronize();\n else this.synchronizeIfNeeded();\n }\n });\n }\n\n //\n // NETWORK STATUS from IDEAOfflineService\n //\n\n /**\n * Quickly check the connection status.\n */\n isOnline(): boolean {\n return this._offline.isOnline();\n }\n /**\n * Quickly check the connection status.\n */\n isOffline(): boolean {\n return this._offline.isOffline();\n }\n /**\n * Subscribe to the service to be notified when the connection status changes.\n */\n subscribe(callback: (isOnline: boolean) => void): Subscription {\n return this._offline.subscribe(callback);\n }\n /**\n * Quickly check for online connection.\n */\n public check(): Promise<boolean> {\n return this._offline.check();\n }\n\n //\n // CONFIGURATION\n //\n\n /**\n * Whether the offline mode is allowed. You can customize this function, if needed.\n */\n isAllowed(): boolean {\n return !!this.resources.length;\n }\n /**\n * Set up the service to use and sync offline data.\n */\n setUpOfflineData(teamId: string, useQueueAPIRequests: boolean, cacheableResources: CacheableResource[]): void {\n // set the team\n this.teamId = teamId;\n // decide if to allow certain API request while offline\n this.useQueueAPIRequests = useQueueAPIRequests;\n // load the API request pending queue, if any\n this.queueAPIRequestKey = this.teamId ? `${QUEUE_API_REQUESTS_KEY}_${this.teamId}` : QUEUE_API_REQUESTS_KEY;\n this.loadQueueAPIRequest();\n // load the lastSyncAt information for the team\n this.lastSyncKey = this.teamId ? `${LAST_SYNC_KEY}_${this.teamId}` : LAST_SYNC_KEY;\n this.loadLastSyncAt();\n // load the cacheable resources\n this.resources = new Array<DeltaResources | string>();\n this.cacheableResources = {};\n cacheableResources.forEach(r => this.addCacheableResource(r));\n }\n /**\n * Load from the local storage the last sync at information.\n */\n protected loadLastSyncAt(): Promise<number> {\n return new Promise(resolve => {\n this._storage.get(this.lastSyncKey).then((lastSyncAt: number): void => {\n this.lastSyncAt.set(lastSyncAt ? Number(lastSyncAt) : null);\n resolve(this.lastSyncAt());\n });\n });\n }\n /**\n * Update last sync at info in the local storage.\n */\n protected saveLastSyncAt(lastSyncAt: number): Promise<void> {\n this.lastSyncAt.set(lastSyncAt);\n return this._storage.set(this.lastSyncKey, lastSyncAt);\n }\n /**\n * Add a CacheableResource.\n */\n protected addCacheableResource(cacheableResource: CacheableResource): void {\n if (this.teamId) cacheableResource.teamId = this.teamId;\n this.cacheableResources[cacheableResource.resource] = cacheableResource;\n this.resources.push(cacheableResource.resource);\n }\n /**\n * Remove a CacheableResource by its DeltaResource.\n */\n protected removeCacheableResource(resource: DeltaResources | string): void {\n delete this.cacheableResources[resource];\n this.resources.splice(this.resources.indexOf(resource), 1);\n }\n /**\n * Get the the DeltaResourced configured.\n */\n getResources(): (DeltaResources | string)[] {\n return this.resources;\n }\n /**\n * Get a CacheableResource by its DeltaResource.\n */\n getCacheableResource(resource: DeltaResources | string): CacheableResource {\n return this.cacheableResources[resource];\n }\n\n //\n // UPLOAD\n //\n\n /**\n * Execute all the API requests in the queue; the requests terminated with an error will remain in the queue.\n */\n protected runQueueAPIRequests(): Promise<void> {\n return new Promise((resolve, reject): void => {\n if (!this.useQueueAPIRequests || this.isOffline() || !this.queueAPIRequests.length) return resolve();\n this.queueAPIRequests.forEach(async request => {\n const options: APIRequestOption = {};\n if (request.resourceId) options.resourceId = request.resourceId;\n if (request.body) options.body = request.body;\n let promise: Promise<any>;\n try {\n switch (request.method.toUpperCase()) {\n case 'POST':\n promise = await this._API.postResource(request.resource, options);\n break;\n case 'PUT':\n promise = await this._API.putResource(request.resource, options);\n break;\n case 'PATCH':\n promise = await this._API.patchResource(request.resource, options);\n break;\n }\n if (!promise) request.error = 'INVALID_METHOD';\n else request.error = null;\n } catch (err) {\n request.error = (err as Error).message || 'UNKNOWN_ERROR';\n }\n });\n // keep the requests NOT successfully executed\n this.saveQueueAPIRequest(this.queueAPIRequests.filter(x => x.error)).then((): void => {\n // if the queue is empty, the entire operation was successful\n if (this.queueAPIRequests.length) reject();\n else resolve();\n });\n });\n }\n /**\n * Load from the local storage the API requests queue.\n */\n protected loadQueueAPIRequest(): Promise<APIRequest[]> {\n return new Promise(resolve => {\n if (!this.useQueueAPIRequests) return resolve([]);\n this._storage.get(this.queueAPIRequestKey).then((queue: APIRequest[]): void => {\n this.queueAPIRequests = queue || [];\n resolve(this.queueAPIRequests);\n });\n });\n }\n /**\n * Update the queue in memory and also save the copy in the local storage.\n */\n saveQueueAPIRequest(queue?: APIRequest[]): Promise<void> {\n if (!this.isAllowed()) return Promise.reject();\n this.queueAPIRequests = queue || this.queueAPIRequests;\n return this._storage.set(this.queueAPIRequestKey, this.queueAPIRequests);\n }\n /**\n * Delete a request stuck in an error.\n */\n deleteRequest(request: APIRequest) {\n if (!this.isAllowed()) return Promise.reject();\n if (request) {\n this.queueAPIRequests.splice(this.queueAPIRequests.indexOf(request), 1);\n this.saveQueueAPIRequest();\n }\n }\n\n //\n // DOWNLOAD\n //\n\n /**\n * Save the records of a delta and, if the latter has more pages, go recursive.\n */\n protected async syncDeltaRecords(delta: Delta, done?: any): Promise<any> {\n // for each resource, we reset the status; if a resource still need to be synchronized, it will be flagged below\n this.resources.forEach(resource => {\n this.cacheableResources[resource].error = false;\n this.cacheableResources[resource].synchronizing = false;\n });\n try {\n // synchronze each of the resources included in the delta; this execution can go in parallel\n await Promise.all(\n delta.resources.map(async resource => {\n const cr = this.cacheableResources[resource];\n if (cr) {\n // synchronize the delta records; note: the executuion inside a resource must go in series\n cr.synchronizing = true;\n const success = await this.syncResourceDeltaRecords(resource, delta.records[resource]);\n if (!success) this.errorInLastSync.set(true);\n }\n })\n );\n // if there were error of if there is nothing left to sync, we are done\n if (this.errorInLastSync() || !delta.next) return done();\n // otherwise, get the next page of the delta and go recursive until we are done\n const params: any = { next: delta.next, limit: NUM_ELEMENTS_WITH_MANUAL_SYNC };\n if (this.lastSyncAt()) params.since = this.lastSyncAt();\n const newDelta = await this._API.getResource(this.teamId ? `teams/${this.teamId}/delta` : 'delta', { params });\n this.syncDeltaRecords(newDelta, done);\n } catch (err) {\n // if something went wrong, stops the operation, since we need to make sure the entire flow is consistent\n this.errorInLastSync.set(true);\n return done();\n }\n }\n /**\n * Save offline a list of DeltaRecords for this resource, creating a map of all the corresponding API GET requests.\n */\n protected async syncResourceDeltaRecords(resource: string, records: DeltaRecord[]): Promise<boolean> {\n // acquire the info an a cacheable resource\n const cr = this.cacheableResources[resource];\n if (!cr) return Promise.resolve(true);\n try {\n // prepare helpers to group executions of elements of the same list\n let list: any[] = null,\n oldListURL: string = null;\n for (const r of records) {\n // calculate the URL to access the API request key for this element\n const elementURL = cr.elementURL(r.element);\n // if the element was deleted (based on delta), delete its corresponding API GET request\n if (r.deleted) await this._API.deleteFromCache(elementURL);\n // otherwise, update it\n else await this._API.putInCache(elementURL, r.element);\n // calculate the URLs to access the API request key for this element's list\n const listURL = cr.listURL(r.element);\n // to improve the performance, get/sort/save the list only when it changes from the previous element's one.\n if (listURL !== oldListURL) {\n // skip first cycle (oldListURL === null)\n if (oldListURL) {\n // re-sort the list; note: it should be sorted from the last time, so we only manage the new element\n list = list.sort(cr.sort);\n // save the updated list\n await this._API.putInCache(oldListURL, list);\n }\n // get the list of elements from the local storage by the calculated URL\n list = await this._API.getFromCache(listURL);\n // save the reference to the list for the next cycle\n oldListURL = listURL;\n }\n // find in the list the element we want to manage\n const index = cr.findIndexInList(list, r.element);\n // delete the element from the list\n if (index !== -1) list.splice(index, 1);\n // if the element wasn't deleted (following the delta record information), insert the new version\n if (!r.deleted) list.push(r.element);\n }\n // in case there were elements, save the last element's list\n if (oldListURL) {\n // re-sort the list; note: it should be sorted from the last time, so we only manage the new element\n list = list.sort(cr.sort);\n // save the updated list\n await this._API.putInCache(oldListURL, list);\n }\n return Promise.resolve(true);\n } catch (err) {\n // if something went wrong, stops the operation, since we need to make sure the entire flow is consistent\n cr.error = true;\n return Promise.resolve(false);\n }\n }\n\n //\n // SYNCHRONISATION (UPLOAD+DOWNLOAD)\n //\n\n /**\n * Run a sync, but only if needed, i.e. the cached content expired or we have pending API requests in the queue.\n */\n synchronizeIfNeeded(): Promise<void> {\n return new Promise((resolve, reject): void => {\n if (!this.isAllowed()) return;\n this.loadLastSyncAt().then(\n (): Promise<void> =>\n this.loadQueueAPIRequest()\n .then((): void => {\n if (this.queueAPIRequests.length || Date.now() > this.lastSyncAt() + SYNC_EXPIRATION_INTERVAL)\n this.synchronize();\n resolve();\n })\n .catch(err => reject(err))\n );\n });\n }\n /**\n * Synchronization of the whole set of resources (upload+download).\n * @param manualConfirmation if true, the request comes directly from a user action (not automatic procedures).\n */\n synchronize(manualConfirmation?: boolean): Promise<void> {\n return new Promise((resolve, reject): void => {\n if (!this.isAllowed() || this.synchronizing()) return resolve();\n this.synchronizing.set(true);\n this.errorInLastSync.set(false);\n this.requiresManualConfirmation.set(false);\n // load the lastSyncAt information\n this.loadLastSyncAt().then(\n (): Promise<void> =>\n // try to run all the pending API requests in the queue, i.e. uploading the offline resources changed\n this.runQueueAPIRequests()\n .then((): void => {\n // set this moment in time: if anything happened before the end of the sync, we don't lose fresh data\n const now = Date.now();\n // prepare a first \"short\" Delta request, to see if there is a lot of data to process\n const params: any = { limit: NUM_ELEMENTS_WITHOUT_MANUAL_SYNC };\n if (this.lastSyncAt()) params.since = this.lastSyncAt();\n this._API\n .getResource(this.teamId ? `teams/${this.teamId}/delta` : 'delta', { params })\n .then((delta: Delta): void => {\n // decide if to proceed with the sync: in case there is another page, it requires a manual confirmation\n if (delta.next && !manualConfirmation) {\n this.requiresManualConfirmation.set(true);\n this.synchronizing.set(false);\n return resolve();\n }\n // save the records in the delta and request possible new pages\n this.syncDeltaRecords(delta, (): void => {\n if (this.errorInLastSync()) {\n this.synchronizing.set(false);\n resolve();\n } else {\n // all the resources are succesfully in sync\n this.resources.forEach(resource => (this.cacheableResources[resource].synchronizing = false));\n // update the timestamp of last sync\n this.saveLastSyncAt(now)\n .then((): void => {\n this.synchronizing.set(false);\n resolve();\n })\n .catch((): void => {\n // we couldn't save the last sync info\n this.errorInLastSync.set(true);\n this.synchronizing.set(false);\n reject();\n });\n }\n });\n })\n .catch((): void => {\n // we couldn't acquire new information (Delta)\n this.errorInLastSync.set(true);\n this.synchronizing.set(false);\n reject();\n });\n })\n .catch((): void => {\n // we stop, since we don't want backend data to override local info not yet uploaded\n this.errorInLastSync.set(true);\n this.synchronizing.set(false);\n reject();\n })\n );\n });\n }\n /**\n * Force a full synchronisation.\n */\n forceFullSync(): void {\n this._storage.clear().then((): Promise<void> => this.synchronize(true));\n }\n}\n\n/**\n * The description of an API request to a resource, to use with `IDEAAWSAPI`.\n * Used for queues of requests (UPLOAD).\n */\nexport interface APIRequest {\n /**\n * Resource path (e.g. `users` or `teams/${teamId}/users`).\n */\n resource: string;\n /**\n * The id to identify a specific element of the resource.\n */\n resourceId: string;\n /**\n * The API request method (e.g. POST, PUT, PATCH).\n */\n method: string;\n /**\n * The body of the request.\n */\n body: any;\n /**\n * A description to show for the request.\n */\n description?: string;\n /**\n * If not null, the request tried to run but it encountered the error.\n */\n error?: string;\n}\n\n/**\n * The abstract class to implement for each resource to cache offline from the back-end (DOWNLOAD).\n */\nexport abstract class CacheableResource {\n /**\n * The team owning the resource.\n * If null, the project isn't teams-based.\n */\n teamId: string;\n /**\n * The identifier of the resource.\n */\n resource: DeltaResources | string;\n /**\n * The resource description (translated) for the UI.\n */\n description: string;\n /**\n * Runtime attribute to know if the resource is synchronizing.\n */\n synchronizing: boolean;\n /**\n * True if one of the elements failed the execution.\n */\n error: boolean;\n\n constructor(resource: string, description: string) {\n this.resource = resource;\n this.description = description;\n this.synchronizing = false;\n this.error = false;\n // loaded at runtime\n this.teamId = null;\n }\n\n /**\n * How to build the relative URL to the resource (list).\n * E.g. `teams/${element.teamId}/customers` or `customers`.\n */\n abstract listURL(element: any): string;\n /**\n * How to build the relative URL to the resource element (detail).\n * E.g. `teams/${element.teamId}/customers/${element.customerId}` or `customers/${element.customerId}`.\n */\n abstract elementURL(element: any): string;\n /**\n * How to uniquely identify an element in the list (by its ids).\n * E.g. `return list.findIndex(x => x.customerId === element.customerId);`\n */\n abstract findIndexInList(list: any[], element: any): number;\n /**\n * How to keep the list sorted.\n * E.g. `return a.name.localeCompare(b.name);`\n */\n abstract sort(a: any, b: any): number;\n}\n","import { Component, inject, ChangeDetectionStrategy, input } from '@angular/core';\nimport { IonItem, IonLabel, IonIcon, IonSpinner } from '@ionic/angular/standalone';\n\nimport { IDEAOfflineDataService, CacheableResource } from './offlineData.service';\n\n@Component({\n selector: 'idea-cacheable-resource',\n imports: [IonSpinner, IonIcon, IonLabel, IonItem],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ion-item class=\"cacheableResourceItem\">\n <ion-label>{{ resource().description }}</ion-label>\n @if (resource().error) {\n <ion-icon slot=\"end\" name=\"alert-circle\" color=\"danger\" />\n }\n @if (!resource().error && _offline.synchronizing() && resource().synchronizing) {\n <ion-spinner slot=\"end\" name=\"dots\" />\n }\n @if (!resource().error && !resource().synchronizing && !_offline.requiresManualConfirmation()) {\n <ion-icon slot=\"end\" name=\"checkmark\" color=\"success\" />\n }\n @if (!resource().error && !resource().synchronizing && _offline.requiresManualConfirmation()) {\n <ion-icon slot=\"end\" name=\"pause\" color=\"dark\" />\n }\n </ion-item>\n `\n})\nexport class IDEACacheableResourceComponent {\n _offline = inject(IDEAOfflineDataService);\n\n /**\n * The resouece to manage.\n */\n readonly resource = input<CacheableResource>();\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, ChangeDetectionStrategy } from '@angular/core';\nimport {\n ModalController,\n AlertController,\n IonHeader,\n IonToolbar,\n IonButton,\n IonIcon,\n IonButtons,\n IonTitle,\n IonContent,\n IonList,\n IonListHeader,\n IonLabel,\n IonText,\n IonItem,\n IonSpinner\n} from '@ionic/angular/standalone';\nimport { Browser } from '@capacitor/browser';\nimport {\n IDEAActionSheetController,\n IDEALocalizedDatePipe,\n IDEATranslatePipe,\n IDEATranslationsService\n} from '@idea-ionic/common';\n\nimport { IDEAOfflineDataService, APIRequest } from './offlineData.service';\nimport { IDEACacheableResourceComponent } from './cacheableResource.component';\n\n@Component({\n selector: 'idea-offline-manager',\n imports: [\n CommonModule,\n IDEATranslatePipe,\n IDEALocalizedDatePipe,\n IDEACacheableResourceComponent,\n IonSpinner,\n IonItem,\n IonText,\n IonLabel,\n IonListHeader,\n IonList,\n IonContent,\n IonTitle,\n IonButtons,\n IonIcon,\n IonButton,\n IonToolbar,\n IonHeader\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: 'offlineManager.component.html',\n styleUrls: ['offlineManager.component.scss']\n})\nexport class IDEAOfflineManagerComponent {\n private _modal = inject(ModalController);\n private _alert = inject(AlertController);\n private _actions = inject(IDEAActionSheetController);\n private _translate = inject(IDEATranslationsService);\n _offline = inject(IDEAOfflineDataService);\n\n async sync(): Promise<void> {\n const alert = await this._alert.create({\n header: this._translate._('IDEA_UNCOMMON.OFFLINE.SYNC_NOW'),\n message: this._translate._('IDEA_UNCOMMON.OFFLINE.DONT_EXIT_APP_DISCLAIMER'),\n buttons: [\n { text: this._translate._('COMMON.CANCEL') },\n { text: this._translate._('COMMON.GOT_IT'), handler: (): Promise<void> => this._offline.synchronize(true) }\n ]\n });\n alert.present();\n }\n\n async deleteRequest(request: APIRequest): Promise<void> {\n const alert = await this._alert.create({\n header: this._translate._('COMMON.ARE_YOU_SURE'),\n message: this._translate._('IDEA_UNCOMMON.OFFLINE.DELETION_IS_IRREVERSIBLE'),\n buttons: [\n { text: this._translate._('COMMON.CANCEL') },\n {\n text: this._translate._('COMMON.CONFIRM'),\n handler: (): Promise<void> => this._offline.deleteRequest(request)\n }\n ]\n });\n alert.present();\n }\n downloadRequestLog(request: APIRequest): void {\n const dataURL = window.URL.createObjectURL(new Blob([JSON.stringify(request)], { type: 'text/json' }));\n Browser.open({ url: dataURL });\n }\n\n async actions(): Promise<void> {\n const buttons = [\n {\n text: this._translate._('IDEA_UNCOMMON.OFFLINE.FORCE_FULL_SYNC'),\n icon: 'sync',\n handler: (): Promise<void> => this.forceFullSync()\n },\n { text: this._translate._('COMMON.CANCEL'), role: 'cancel', icon: 'arrow-undo' }\n ];\n const actions = await this._actions.create({\n header: this._translate._('IDEA_UNCOMMON.OFFLINE.ADVANCED_ACTIONS'),\n buttons\n });\n actions.present();\n }\n\n async forceFullSync(): Promise<void> {\n const alert = await this._alert.create({\n header: this._translate._('IDEA_UNCOMMON.OFFLINE.FORCE_FULL_SYNC'),\n subHeader: this._translate._('COMMON.ARE_YOU_SURE'),\n message: this._translate._('IDEA_UNCOMMON.OFFLINE.FULL_SYNC_DISCLAIMER'),\n buttons: [\n { text: this._translate._('COMMON.CANCEL'), role: 'cancel' },\n { text: this._translate._('COMMON.CONFIRM'), handler: (): void => this._offline.forceFullSync() }\n ]\n });\n alert.present();\n }\n\n close(): void {\n this._modal.dismiss();\n }\n}\n","<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n <ion-button (click)=\"close()\">\n <ion-icon name=\"close\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n <ion-title>\n {{ 'IDEA_UNCOMMON.OFFLINE.OFFLINE_MANAGER' | translate }}\n </ion-title>\n <ion-buttons slot=\"end\">\n <ion-button [title]=\"'IDEA_UNCOMMON.OFFLINE.ADVANCED_ACTIONS' | translate\" (click)=\"actions()\">\n <ion-icon slot=\"icon-only\" name=\"ellipsis-vertical\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <ion-list class=\"aList\">\n @if (!_offline.synchronizing() && _offline.requiresManualConfirmation()) {\n <ion-list-header>\n <ion-label>\n <h2>{{ 'IDEA_UNCOMMON.OFFLINE.HUGE_SYNC_NEED_MANUAL_CONFIRMATION' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n }\n @if (!_offline.synchronizing()) {\n <ion-list-header>\n <ion-label class=\"ion-text-wrap\">\n <h3 class=\"lastSyncAt\">\n {{ 'IDEA_UNCOMMON.OFFLINE.LAST_SYNC' | translate }}:\n <ion-text>\n {{\n _offline.lastSyncAt()\n ? (_offline.lastSyncAt() | dateLocale: 'medium')\n : ('IDEA_UNCOMMON.OFFLINE.NEVER' | translate)\n }}\n </ion-text>\n </h3>\n @if (_offline.errorInLastSync()) {\n <p>\n <ion-text color=\"danger\">\n <b>{{ 'IDEA_UNCOMMON.OFFLINE.ERROR_DURING_LAST_SYNC' | translate }}</b>\n </ion-text>\n </p>\n }\n </ion-label>\n <ion-button\n size=\"small\"\n fill=\"solid\"\n [color]=\"_offline.errorInLastSync() ? 'danger' : 'dark'\"\n [disabled]=\"_offline.isOffline()\"\n (click)=\"sync()\"\n >\n <ion-icon slot=\"start\" name=\"sync\" /> {{ 'IDEA_UNCOMMON.OFFLINE.SYNC_NOW' | translate }}\n </ion-button>\n </ion-list-header>\n }\n </ion-list>\n @if (_offline.synchronizing()) {\n <ion-list class=\"aList\">\n <ion-item>\n <ion-label class=\"ion-text-center\">\n <ion-spinner name=\"crescent\" color=\"primary\" />\n </ion-label>\n </ion-item>\n </ion-list>\n }\n @if (_offline.useQueueAPIRequests) {\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label>\n <h2>{{ 'IDEA_UNCOMMON.OFFLINE.UPLOAD' | translate }}</h2>\n <p>{{ 'IDEA_UNCOMMON.OFFLINE.UPLOAD_QUEUE_REQUESTS_EXPLANATION' | translate }}</p>\n </ion-label>\n </ion-list-header>\n @if (!_offline.queueAPIRequests.length) {\n <ion-item>\n <i>{{ 'IDEA_UNCOMMON.OFFLINE.NO_ELEMENTS_TO_UPLOAD' | translate }}</i>\n <ion-icon slot=\"end\" size=\"small\" name=\"checkmark\" color=\"success\" />\n </ion-item>\n }\n @for (r of _offline.queueAPIRequests; track r; let odd = $odd) {\n <ion-item [class.oddItem]=\"odd\">\n <ion-label class=\"ion-text-wrap\">\n {{ r.description }}\n @if (r.error) {\n <p>\n <ion-text color=\"danger\">\n <b>{{ 'IDEA_UNCOMMON.OFFLINE.ERROR_CODE' | translate }}: {{ r.error }}</b>\n </ion-text>\n <br />\n {{ 'IDEA_UNCOMMON.OFFLINE.REQUEST_FAILED_EXPLANATION_I' | translate }}<br />\n {{ 'IDEA_UNCOMMON.OFFLINE.REQUEST_FAILED_EXPLANATION_II' | translate }}<br />\n {{ 'IDEA_UNCOMMON.OFFLINE.REQUEST_FAILED_EXPLANATION_III' | translate }}\n </p>\n }\n </ion-label>\n @if (r.error) {\n <ion-button\n fill=\"clear\"\n slot=\"end\"\n color=\"danger\"\n [title]=\"'IDEA_UNCOMMON.OFFLINE.CANCEL_REQUEST' | translate\"\n (click)=\"deleteRequest(r)\"\n >\n <ion-icon slot=\"icon-only\" name=\"trash\" />\n </ion-button>\n }\n @if (r.error) {\n <ion-button\n fill=\"clear\"\n slot=\"end\"\n color=\"medium\"\n [title]=\"'IDEA_UNCOMMON.OFFLINE.DOWNLOAD_LOG' | translate\"\n (click)=\"downloadRequestLog(r)\"\n >\n <ion-icon slot=\"icon-only\" name=\"download\" />\n </ion-button>\n }\n @if (_offline.synchronizing()) {\n <ion-spinner slot=\"end\" name=\"dots\" />\n }\n </ion-item>\n }\n </ion-list>\n }\n @if (_offline.getResources().length) {\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label>\n <h2>{{ 'IDEA_UNCOMMON.OFFLINE.DOWNLOAD' | translate }}</h2>\n <p>{{ 'IDEA_UNCOMMON.OFFLINE.DOWNLOAD_RESOURCES_EXPLANATION' | translate }}</p>\n </ion-label>\n </ion-list-header>\n @for (r of _offline.getResources(); track r) {\n <idea-cacheable-resource [resource]=\"_offline.getCacheableResource(r)\" />\n }\n </ion-list>\n }\n</ion-content>\n","import { Component, inject, ChangeDetectionStrategy, input } from '@angular/core';\nimport { ModalController, AlertController, Platform, IonFab, IonFabButton, IonIcon } from '@ionic/angular/standalone';\nimport { IDEATranslationsService } from '@idea-ionic/common';\n\nimport { IDEAOfflineManagerComponent } from './offlineManager.component';\nimport { IDEAOfflineDataService } from './offlineData.service';\n\n@Component({\n selector: 'idea-offline-indicator',\n imports: [IonFab, IonFabButton, IonIcon],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (\n _platform.is('mobile') &&\n (_offline.isOffline() || _offline.synchronizing() || _offline.requiresManualConfirmation())\n ) {\n <ion-fab [vertical]=\"vertical()\" [horizontal]=\"horizontal()\" [edge]=\"edge()\">\n <ion-fab-button color=\"dark\" size=\"small\" (click)=\"showStatus()\">\n <!-- OFFLINE -->\n @if (_offline.isOffline()) {\n <ion-icon name=\"airplane\" />\n }\n <!-- SYNCHRONISING -->\n @if (_offline.isOnline() && _offline.synchronizing()) {\n <ion-icon name=\"sync\" />\n }\n <!-- NEED MANAL SYNCHRONISATION -->\n @if (_offline.isOnline() && _offline.requiresManualConfirmation()) {\n <ion-icon name=\"pause\" />\n }\n </ion-fab-button>\n </ion-fab>\n }\n `\n})\nexport class IDEAOfflineIndicatorComponent {\n private _alert = inject(AlertController);\n private _modal = inject(ModalController);\n private _translate = inject(IDEATranslationsService);\n _platform = inject(Platform);\n _offline = inject(IDEAOfflineDataService);\n\n /**\n * Vertical position.\n */\n readonly vertical = input('bottom');\n /**\n * Horizontal position.\n */\n readonly horizontal = input('start');\n /**\n * Whether it is positionated on an edge.\n */\n readonly edge = input(false);\n\n async showStatus(): Promise<void> {\n if (this._offline.isOffline()) {\n const isOnline = await this._offline.check();\n if (!isOnline) {\n const alert = await this._alert.create({\n header: this._translate._('IDEA_UNCOMMON.OFFLINE.YOU_ARE_OFFLINE'),\n message: this._translate._('IDEA_UNCOMMON.OFFLINE.FEATURES_REDUCED_CONTENTS_NOT_UP_TO_DATE'),\n buttons: [this._translate._('COMMON.GOT_IT')]\n });\n alert.present();\n }\n } else if (this._offline.isAllowed()) {\n const modal = await this._modal.create({ component: IDEAOfflineManagerComponent });\n modal.present();\n }\n }\n}\n","import {\n Component,\n OnChanges,\n SimpleChanges,\n inject,\n ChangeDetectionStrategy,\n output,\n input,\n signal\n} from '@angular/core';\nimport { Sentiment } from 'idea-toolbox';\nimport { IonItem, IonSpinner, IonBadge } from '@ionic/angular/standalone';\nimport { IDEAEnvironment, IDEATranslatePipe, IDEATranslationsService } from '@idea-ionic/common';\n\nimport { IDEAAWSAPIService } from '../AWSAPI.service';\nimport { IDEAOfflineService } from '../offline/offline.service';\n\n@Component({\n selector: 'idea-sentiment',\n imports: [IDEATranslatePipe, IonBadge, IonSpinner, IonItem],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (text() && _offline.isOnline()) {\n <ion-item [lines]=\"lines()\" [color]=\"color()\">\n @if (!sentiment()) {\n <ion-spinner slot=\"end\" size=\"small\" />\n }\n @if (sentiment()) {\n <ion-badge\n slot=\"end\"\n size=\"small\"\n [color]=\"getColorBySentiment()\"\n [title]=\"'IDEA_UNCOMMON.SENTIMENT.RESULT_HINT' | translate: { sentiment: sentiment() }\"\n >\n {{ 'IDEA_UNCOMMON.SENTIMENT.RESULT.' + sentiment() | translate }}\n </ion-badge>\n }\n </ion-item>\n }\n `\n})\nexport class IDEASentimentComponent implements OnChanges {\n protected _env = inject(IDEAEnvironment);\n private _API = inject(IDEAAWSAPIService);\n private _translate = inject(IDEATranslationsService);\n _offline = inject(IDEAOfflineService);\n\n /**\n * The sentiment detected from the input text.\n */\n sentiment = signal<Sentiment>(null);\n /**\n * The input text.\n */\n readonly text = input<string>();\n /**\n * Lines preferences for the item.\n */\n readonly lines = input<string>();\n /**\n * The color for the component.\n */\n readonly color = input<string>();\n /**\n * Triggers when the sentiment change.\n */\n readonly change = output<Sentiment>();\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.text.previousValue !== changes.text.currentValue) this.detectSentiment(changes.text.currentValue);\n }\n private async detectSentiment(text: string): Promise<void> {\n if (!text || this._offline.isOffline()) this.sentiment.set(null);\n else {\n try {\n const { sentiment } = await this._API.postResource('sentiment', {\n idea: true,\n body: { project: this._env.idea.project, language: this._translate.getCurrentLang(), text: this.text() }\n });\n this.sentiment.set(sentiment);\n this.change.emit(this.sentiment());\n } catch (error) {\n this.sentiment.set(null);\n }\n }\n }\n\n getColorBySentiment(sentiment?: Sentiment | string): string {\n sentiment = sentiment || this.sentiment();\n switch (sentiment) {\n case Sentiment.POSITIVE:\n return 'success';\n case Sentiment.NEGATIVE:\n return 'danger';\n case Sentiment.MIXED:\n return 'warning';\n case Sentiment.NEUTRAL:\n return 'medium';\n default:\n return 'light';\n }\n }\n}\n","import { Component, Input, OnInit, inject, ChangeDetectionStrategy } from '@angular/core';\nimport {\n ModalController,\n IonHeader,\n IonToolbar,\n IonButtons,\n IonButton,\n IonIcon,\n IonTitle,\n IonContent,\n IonGrid,\n IonRow,\n IonCol,\n IonText,\n IonSegment,\n IonSegmentButton,\n IonLabel\n} from '@ionic/angular/standalone';\nimport { TimeInterval } from 'idea-toolbox';\nimport { IDEATranslatePipe, IDEATranslationsService } from '@idea-ionic/common';\n\n@Component({\n selector: 'idea-from-time-to-time',\n imports: [\n IDEATranslatePipe,\n IonLabel,\n IonSegmentButton,\n IonSegment,\n IonText,\n IonCol,\n IonRow,\n IonGrid,\n IonContent,\n IonTitle,\n IonIcon,\n IonButton,\n IonButtons,\n IonToolbar,\n IonHeader\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: 'fromTimeToTime.component.html',\n styleUrls: ['fromTimeToTime.component.scss']\n})\nexport class IDEAFromTimeToTimeComponent implements OnInit {\n private _modal = inject(ModalController);\n private _translate = inject(IDEATranslationsService);\n\n /**\n * The time interval to set.\n */\n @Input() timeInterval?: TimeInterval;\n /**\n * Whether we should start picking the time displaying the afternoon (PM) or the morning (AM, default).\n */\n @Input() period: Periods = Periods.AM;\n /**\n * A time to use as lower limit for the possible choices.\n */\n @Input() notEarlierThan?: number;\n /**\n * A time to use as upper limit for the possible choices.\n */\n @Input() notLaterThan?: number;\n /**\n * The title of the component.\n */\n @Input() title?: string;\n\n segment: Segments;\n Segments = Segments;\n Periods = Periods;\n timeIntervalWC: TimeInterval;\n minutes: number;\n\n ngOnInit(): void {\n this.segment = Segments.FROM;\n this.minutes = 30;\n this.timeIntervalWC = new TimeInterval(this.timeInterval);\n }\n\n setInterval(hours: number, minutes?: number): void {\n // adjust the hour based on the start of the interval and the settings of am/pm\n hours = this.contextualizeHour(hours, minutes);\n // convert the hours and minutes in milliseconds\n const timeMs = this.timeToMs(hours, minutes);\n // set the correct part of the interval, based on the current segment\n if (this.segment === Segments.FROM) {\n // set the start of the interval (from) and change the segment so that the end (to) will be picked\n this.timeIntervalWC.from = timeMs;\n this.segment = Segments.TO;\n } else {\n // can't proceed if from and to are equal\n if (timeMs === this.timeIntervalWC.from) return;\n // set the end of the interval (to)\n this.timeIntervalWC.to = timeMs;\n // save the changes and notify the parent component\n this.save();\n }\n }\n private timeToMs(hours: number, minutes?: number): number {\n return (hours * 60 * 60 + (minutes || 0) * 60) * 1000;\n }\n\n getClockButtonContent(hours: number, minutes?: number): string {\n // adjust the hour based on the start of the interval and the settings of am/pm\n hours = this.contextualizeHour(hours, minutes);\n // convert the calculated time into a readable string; we need to format it to distinguish 0-24 vs 0-12 am/pm\n const refDate = new Date();\n refDate.setHours(hours, minutes || 0, 0);\n const str = this._translate.formatDate(refDate, 'shortTime');\n // remove the extra part (e.g. am/pm), based on the type of button we have to show\n const strArr = str.split(':');\n return String(Number(strArr[0])).concat(minutes ? ':'.concat(strArr[1].slice(0, 2)) : '');\n }\n private contextualizeHour(hours: number, minutes?: number): number {\n // adjust the content to the afternoon hours, if needed\n if (this.period === Periods.PM) hours += 12;\n // if we already selected the start of the interval, check whether we need to adjust the time: the center of the\n // clock will be moved to the selected hour (from), to have a reasonable set of choices for the end (to)\n if (this.segment === Segments.TO && this.timeToMs(hours, minutes) < this.timeIntervalWC.from)\n hours += this.period === Periods.PM ? -12 : 12;\n // set midnight to 00\n if (hours === 24) hours = 0;\n return hours;\n }\n\n equalsFrom(hours: number, minutes?: number): boolean {\n // if the start of the interval hasn't been selected yet, skip it\n if (this.segment === Segments.FROM) return false;\n // adjust the hour based on the start of the interval and the settings of am/pm\n hours = this.contextualizeHour(hours, minutes);\n // compare the two strings based on the timestamps in ms\n return this.msToTimeString(this.timeIntervalWC.from) === this.msToTimeString(this.timeToMs(hours, minutes));\n }\n\n isAllowed(hours: number, minutes?: number): boolean {\n // adjust the hour based on the start of the interval and the settings of am/pm\n hours = this.contextualizeHour(hours, minutes);\n // check whether the selected time is inside the given boundaries\n const notEarlierThan = this.notEarlierThan;\n const notLaterThan = this.notLaterThan;\n return (\n (!notEarlierThan || this.timeToMs(hours, minutes) >= notEarlierThan || this.timeToMs(hours, minutes) === 0) &&\n (!notLaterThan || this.timeToMs(hours, minutes) <= notLaterThan)\n );\n }\n\n isHourOfOppositeMeridian(hours: number, minutes?: number): boolean {\n // if the start of the interval hasn't been selected yet, skip it\n if (this.segment === Segments.FROM) return false;\n // adjust the hour based on the start of the interval and the settings of am/pm\n hours = this.contextualizeHour(hours, minutes);\n // calculate the ms of the selected time and of \"noon\" time (to determ the meridian)\n const timeMs = this.timeToMs(hours, minutes);\n const noonMs = this.timeToMs(12);\n // return true in case the hour doesn't belong to the current meridian\n return (this.period === Periods.AM && timeMs > noonMs) || (this.period === Periods.PM && timeMs < noonMs);\n }\n\n msToTimeString(time: number): string {\n if (!time) return '';\n // note: the time must be always considered without any timezone (UTC)\n const refDate = new Date();\n refDate.setTime(time);\n const dateOpts = { timeZone: 'UTC', hour: '2-digit', minute: '2-digit' } as const;\n return refDate.toLocaleTimeString(this._translate.getCurrentLang(), dateOpts);\n }\n\n save(): void {\n this.timeInterval.load(this.timeIntervalWC);\n this._modal.dismiss(true);\n }\n\n reset(): void {\n this.timeInterval.reset();\n this._modal.dismiss(false);\n }\n\n close(): void {\n this._modal.dismiss();\n }\n}\n\n/**\n * The two stages of the component, to pick the start and the end of the interval.\n */\nenum Segments {\n FROM = 'FROM',\n TO = 'TO'\n}\n\n/**\n * The two possible periods of the component, to interpret the clock the right way.\n */\nexport enum Periods {\n AM = 'AM',\n PM = 'PM'\n}\n","<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n <ion-button [title]=\"'COMMON.CLOSE' | translate\" (click)=\"close()\">\n <ion-icon name=\"close\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n <ion-title>{{ title }}</ion-title>\n <ion-buttons slot=\"end\">\n <ion-button [title]=\"'COMMON.RESET' | translate\" (click)=\"reset()\">\n <ion-icon name=\"arrow-undo\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <ion-grid class=\"clockGrid\">\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"5\"> </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(12) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(12)\"\n [disabled]=\"!isAllowed(12)\"\n (click)=\"setInterval(12)\"\n >\n {{ getClockButtonContent(12) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(12, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(12, minutes)\"\n [disabled]=\"!isAllowed(12, minutes)\"\n (click)=\"setInterval(12, minutes)\"\n >\n {{ getClockButtonContent(12, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"3\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"2\"> </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(11, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(11, minutes)\"\n [disabled]=\"!isAllowed(11, minutes)\"\n (click)=\"setInterval(11, minutes)\"\n >\n {{ getClockButtonContent(11, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(11) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(11)\"\n [disabled]=\"!isAllowed(11)\"\n (click)=\"setInterval(11)\"\n >\n {{ getClockButtonContent(11) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(1) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(1)\"\n [disabled]=\"!isAllowed(1)\"\n (click)=\"setInterval(1)\"\n >\n {{ getClockButtonContent(1) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(1, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(1, minutes)\"\n [disabled]=\"!isAllowed(1, minutes)\"\n (click)=\"setInterval(1, minutes)\"\n >\n {{ getClockButtonContent(1, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"1\"> </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(10, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(10, minutes)\"\n [disabled]=\"!isAllowed(10, minutes)\"\n (click)=\"setInterval(10, minutes)\"\n >\n {{ getClockButtonContent(10, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(10) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(10)\"\n [disabled]=\"!isAllowed(10)\"\n (click)=\"setInterval(10)\"\n >\n {{ getClockButtonContent(10) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\"> </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(2) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(2)\"\n [disabled]=\"!isAllowed(2)\"\n (click)=\"setInterval(2)\"\n >\n {{ getClockButtonContent(2) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(2, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(2, minutes)\"\n [disabled]=\"!isAllowed(2, minutes)\"\n (click)=\"setInterval(2, minutes)\"\n >\n {{ getClockButtonContent(2, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"1\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(9, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(9, minutes)\"\n [disabled]=\"!isAllowed(9, minutes)\"\n (click)=\"setInterval(9, minutes)\"\n >\n {{ getClockButtonContent(9, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(9) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(9)\"\n [disabled]=\"!isAllowed(9)\"\n (click)=\"setInterval(9)\"\n >\n {{ getClockButtonContent(9) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center displayText\" [size]=\"4\">\n <ion-text [class.fromSelected]=\"segment === Segments.TO\">\n {{ 'IDEA_UNCOMMON.FTTT.FROM' | translate }}\n @if (segment === Segments.TO) {\n <span>{{ msToTimeString(timeIntervalWC.from) }}</span>\n }\n </ion-text>\n @if (segment === Segments.TO) {\n <ion-text>{{ 'IDEA_UNCOMMON.FTTT.TO' | translate }}</ion-text>\n }\n </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(3) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(3)\"\n [disabled]=\"!isAllowed(3)\"\n (click)=\"setInterval(3)\"\n >\n {{ getClockButtonContent(3) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(3, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(3, minutes)\"\n [disabled]=\"!isAllowed(3, minutes)\"\n (click)=\"setInterval(3, minutes)\"\n >\n {{ getClockButtonContent(3, minutes) }}\n </ion-button>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"1\"> </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(8, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(8, minutes)\"\n [disabled]=\"!isAllowed(8, minutes)\"\n (click)=\"setInterval(8, minutes)\"\n >\n {{ getClockButtonContent(8, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(8) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(8)\"\n [disabled]=\"!isAllowed(8)\"\n (click)=\"setInterval(8)\"\n >\n {{ getClockButtonContent(8) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\"> </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(4) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(4)\"\n [disabled]=\"!isAllowed(4)\"\n (click)=\"setInterval(4)\"\n >\n {{ getClockButtonContent(4) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(4, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(4, minutes)\"\n [disabled]=\"!isAllowed(4, minutes)\"\n (click)=\"setInterval(4, minutes)\"\n >\n {{ getClockButtonContent(4, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"1\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"2\"> </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(7, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(7, minutes)\"\n [disabled]=\"!isAllowed(7, minutes)\"\n (click)=\"setInterval(7, minutes)\"\n >\n {{ getClockButtonContent(7, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(7) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(7)\"\n [disabled]=\"!isAllowed(7)\"\n (click)=\"setInterval(7)\"\n >\n {{ getClockButtonContent(7) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(5) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(5)\"\n [disabled]=\"!isAllowed(5)\"\n (click)=\"setInterval(5)\"\n >\n {{ getClockButtonContent(5) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(5, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(5, minutes)\"\n [disabled]=\"!isAllowed(5, minutes)\"\n (click)=\"setInterval(5, minutes)\"\n >\n {{ getClockButtonContent(5, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"3\"> </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(6, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(6, minutes)\"\n [disabled]=\"!isAllowed(6, minutes)\"\n (click)=\"setInterval(6, minutes)\"\n >\n {{ getClockButtonContent(6, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(6) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(6)\"\n [disabled]=\"!isAllowed(6)\"\n (click)=\"setInterval(6)\"\n >\n {{ getClockButtonContent(6) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"5\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-right\" [size]=\"3\" [sizeSm]=\"7\">\n <ion-text class=\"prefLabel\">{{ 'IDEA_UNCOMMON.FTTT.PERIOD' | translate }}:</ion-text>\n </ion-col>\n <ion-col [size]=\"9\" [sizeSm]=\"5\">\n <ion-segment [value]=\"period\" (ionChange)=\"period = $any($event?.detail?.value) || period\">\n <ion-segment-button [value]=\"Periods.AM\">\n <ion-label>{{ 'IDEA_UNCOMMON.FTTT.AM' | translate }}</ion-label>\n </ion-segment-button>\n <ion-segment-button [value]=\"Periods.PM\">\n <ion-label>{{ 'IDEA_UNCOMMON.FTTT.PM' | translate }}</ion-label>\n </ion-segment-button>\n </ion-segment>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-right\" [size]=\"3\" [sizeSm]=\"7\">\n <ion-text class=\"prefLabel\">{{ 'IDEA_UNCOMMON.FTTT.MINUTES_PREFERENCE' | translate }}:</ion-text>\n </ion-col>\n <ion-col [size]=\"9\" [sizeSm]=\"5\">\n <ion-segment [value]=\"minutes\" (ionChange)=\"minutes = $any($event?.detail?.value) || minutes\">\n <ion-segment-button value=\"15\">\n <ion-label>15</ion-label>\n </ion-segment-button>\n <ion-segment-button value=\"30\">\n <ion-label>30</ion-label>\n </ion-segment-button>\n <ion-segment-button value=\"45\">\n <ion-label>45</ion-label>\n </ion-segment-button>\n </ion-segment>\n </ion-col>\n </ion-row>\n </ion-grid>\n</ion-content>\n","import {\n Component,\n SimpleChanges,\n OnInit,\n OnDestroy,\n OnChanges,\n inject,\n ChangeDetectionStrategy,\n output,\n input,\n signal\n} from '@angular/core';\nimport { ModalController, IonItem, IonButton, IonIcon, IonText, IonLabel } from '@ionic/angular/standalone';\nimport { Subscription } from 'rxjs';\nimport { TimeInterval } from 'idea-toolbox';\nimport { IDEATranslationsService } from '@idea-ionic/common';\n\nimport { IDEAFromTimeToTimeComponent, Periods } from './fromTimeToTime.component';\n\n@Component({\n selector: 'idea-time-interval',\n imports: [IonLabel, IonText, IonIcon, IonButton, IonItem],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ion-item\n class=\"timeIntervalItem\"\n [color]=\"color()\"\n [lines]=\"lines()\"\n [button]=\"!disabled()\"\n [disabled]=\"isOpening()\"\n [title]=\"placeholder() || valueToDisplay() || ''\"\n [class.withLabel]=\"label()\"\n (click)=\"disabled() ? doSelectWhenDisabled() : pickTimeInterval()\"\n >\n @if (icon()) {\n <ion-button\n fill=\"clear\"\n slot=\"start\"\n [color]=\"iconColor()\"\n [class.marginTop]=\"label()\"\n (click)=\"doIconSelect($event)\"\n >\n <ion-icon [name]=\"icon()\" slot=\"icon-only\" />\n </ion-button>\n }\n @if (label()) {\n <ion-label position=\"stacked\" [class.selectable]=\"!disabled() || tappableWhenDisabled()\">\n {{ label() }}\n @if (obligatory() && !disabled()) {\n <ion-text class=\"obligatoryDot\" />\n }\n </ion-label>\n }\n <ion-label class=\"description\" [class.selectable]=\"!disabled() || tappableWhenDisabled()\">\n @if (!valueToDisplay() && !disabled()) {\n <ion-text class=\"placeholder\" [class.selectable]=\"!disabled()\">\n {{ placeholder() }}\n </ion-text>\n }\n {{ valueToDisplay() }}\n </ion-label>\n @if (!disabled()) {\n <ion-icon slot=\"end\" name=\"caret-down\" class=\"selectIcon\" [class.selectable]=\"!disabled()\" />\n }\n </ion-item>\n `,\n styles: [\n `\n .timeIntervalItem {\n min-height: 48px;\n height: auto;\n .description {\n margin: 10px 0;\n height: 20px;\n line-height: 20px;\n width: 100%;\n }\n .placeholder {\n color: var(--ion-color-medium);\n }\n .selectIcon {\n margin: 0;\n padding-left: 4px;\n font-size: 0.8em;\n color: var(--ion-color-medium);\n }\n }\n .timeIntervalItem.withLabel {\n min-height: 58px;\n height: auto;\n .selectIcon {\n padding-top: 25px;\n }\n ion-button[slot='start'] {\n margin-top: 16px;\n }\n }\n .selectable {\n cursor: pointer;\n }\n `\n ]\n})\nexport class IDEATimeIntervalComponent implements OnInit, OnDestroy, OnChanges {\n private _modal = inject(ModalController);\n private _translate = inject(IDEATranslationsService);\n\n /**\n * The time interval to set.\n */\n readonly timeInterval = input<TimeInterval>();\n /**\n * Whether we should start picking the time displaying the afternoon (PM) or the morning (AM, default).\n */\n readonly period = input<Periods>(Periods.AM);\n /**\n * A time to use as lower limit for the possible choices.\n */\n readonly notEarlierThan = input<number>();\n /**\n * A time to use as upper limit for the possible choices.\n */\n readonly notLaterThan = input<number>();\n /**\n * The label for the field.\n */\n readonly label = input<string>();\n /**\n * The icon for the field.\n */\n readonly icon = input<string>();\n /**\n * The color of the icon.\n */\n readonly iconColor = input<string>();\n /**\n * A placeholder for the field.\n */\n readonly placeholder = input<string>();\n /**\n * If true, the component is disabled.\n */\n readonly disabled = input<boolean>();\n /**\n * If true, the field has a tappable effect when disabled.\n */\n readonly tappableWhenDisabled = input<boolean>();\n /**\n * If true, the obligatory dot is shown.\n */\n readonly obligatory = input<boolean>();\n /**\n * Lines preferences for the item.\n */\n readonly lines = input<string>();\n /**\n * The color for the component.\n */\n readonly color = input<string>();\n /**\n * On select event.\n */\n readonly select = output<void>();\n /**\n * Icon select.\n */\n readonly iconSelect = output<void>();\n /**\n * On select (with the field disabled) event.\n */\n readonly selectWhenDisabled = output<void>();\n\n valueToDisplay = signal<string>('');\n private langChangeSubscription: Subscription;\n\n isOpening = signal<boolean>(false);\n\n ngOnInit(): void {\n // when the language changes, set the locale\n this.langChangeSubscription = this._translate.onLangChange.subscribe((): void => {\n this.valueToDisplay.set(this.getValueToDisplay(this.timeInterval()));\n });\n }\n ngOnDestroy(): void {\n if (this.langChangeSubscription) this.langChangeSubscription.unsubscribe();\n }\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.timeInterval) this.valueToDisplay.set(this.getValueToDisplay(changes.timeInterval.currentValue));\n }\n\n private getValueToDisplay(timeInterval: TimeInterval): string {\n if (!timeInterval || !timeInterval.isSet()) return '';\n // note: the time must be always considered without any timezone (UTC)\n const dateOpts = { timeZone: 'UTC', hour: '2-digit', minute: '2-digit' } as const;\n return ''.concat(\n this._translate._('IDEA_UNCOMMON.FTTT.FROM'),\n ' ',\n new Date(timeInterval.from).toLocaleTimeString(this._translate.getCurrentLang(), dateOpts),\n ' ',\n this._translate._('IDEA_UNCOMMON.FTTT.TO').toLowerCase(),\n ' ',\n new Date(timeInterval.to).toLocaleTimeString(this._translate.getCurrentLang(), dateOpts)\n );\n }\n\n async pickTimeInterval(): Promise<void> {\n if (this.isOpening()) return;\n this.isOpening.set(true);\n const modal = await this._modal.create({\n component: IDEAFromTimeToTimeComponent,\n componentProps: {\n timeInterval: this.timeInterval(),\n period: this.period(),\n notEarlierThan: this.notEarlierThan(),\n notLaterThan: this.notLaterThan(),\n title: this.label()\n }\n });\n modal.onDidDismiss().then((res: any): void => {\n // if the content changed, update the internal values and notify the parent component\n if (res.data === true || res.data === false) {\n this.valueToDisplay.set(this.getValueToDisplay(this.timeInterval()));\n this.select.emit();\n }\n });\n modal.present();\n this.isOpening.set(false);\n }\n\n doSelectWhenDisabled(): void {\n if (this.disabled()) this.selectWhenDisabled.emit();\n }\n\n doIconSelect(event: any): void {\n if (event) event.stopPropagation();\n this.iconSelect.emit(event);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { epochDateTime } from 'idea-toolbox';\nimport { IDEAEnvironment } from '@idea-ionic/common';\n\nimport { IDEAErrorReportingService } from './errorReporting.service';\nimport { IDEAOfflineService } from './offline/offline.service';\nimport { IDEATinCanService } from './tinCan.service';\n\n/**\n * To communicate with an AWS API Gateway websocket istance.\n *\n * Note: requires an `AWSAPIAuthToken` variable to be set by IDEATinCanService service.\n */\n@Injectable({ providedIn: 'root' })\nexport class IDEAAWSAPISocketService {\n protected _env = inject(IDEAEnvironment);\n protected _tc = inject(IDEATinCanService);\n protected _errorReporting = inject(IDEAErrorReportingService);\n protected _offline = inject(IDEAOfflineService);\n\n apiStage: string;\n /**\n * The URL to connect for socket communication.\n */\n WEBSOCKET_API_URL: string;\n\n /**\n * The current websocket connection.\n */\n protected connection: WebSocket;\n /**\n * The options with which we opened a connection, to re-open it if needed.\n */\n protected options: IDEAAWSAPISocketServiceOpenOptions;\n /**\n * A timeout to ping the connection every once in a while, to keep it alive.\n */\n protected pingTimeout: any;\n /**\n * The timestamp of last activity for the connection, to make sure to ping it in case it's almost dead.\n */\n protected lastActivityAt: epochDateTime;\n /**\n * A timeout to re-try to open a connection later on, hoping we are online again.\n */\n protected offlineTimeout: any;\n /**\n * Whether the connection was correctly opened at least once.\n */\n protected wasOpenAtLeastOnce: boolean;\n\n /**\n * The maximum amount of minutes of inactivity after which we ping the connection to keep it alive.\n */\n MAX_INACTIVITY_MINUTES = 7;\n /**\n * The amount of minutes after which we check if the connection needs to be pinged to be kept alive.\n */\n KEEP_ALIVE_MINUTES_INTERVAL = 2;\n /**\n * In case we are offline, the amount of minutes after which we check if we are online, so we can re-connect.\n */\n TRY_AGAIN_OFFLINE_MINUTES = 3;\n\n constructor() {\n this.apiStage = this._env.idea.socket?.stage || (this._env.idea.socket as any)?.version;\n this.WEBSOCKET_API_URL = 'wss://'.concat([this._env.idea.socket?.url, this.apiStage].filter(x => x).join('/'));\n }\n\n /**\n * Open a connection to the websocket API.\n */\n open(options?: IDEAAWSAPISocketServiceOpenOptions): void {\n this.options = options || this.options || {};\n // skip in case we have an open and valid connection\n if (this.connection && this.isOpen()) return;\n // prepare optional query params for the connection/authorization request\n let qp = '';\n Object.entries(this.options.openParams || {}).forEach(([key, value]): string => (qp += `&${key}=${String(value)}`));\n // open a connection (with IDEA authentication or not)\n const auth = this.options.noAuth ? '?noAuth=' : '?Authorization='.concat(this._tc.get('AWSAPIAuthToken'));\n this.connection = new WebSocket(this.WEBSOCKET_API_URL.concat(auth, qp));\n // set the event listeners\n this.connection.onopen = (event: any): void => {\n if (this.options.debug) console.log('WEBSOCKET IS OPEN', event);\n // reset the try-again-when-offline mechanism, since we are online and connected\n if (this.offlineTimeout) clearTimeout(this.offlineTimeout);\n this.offlineTimeout = null;\n // mark the start of the connection as the first activity time\n this.lastActivityAt = Date.now();\n // set a timer that every N minutes checks if we need to ping the connection to keep it alive\n this.pingTimeout = setTimeout((): void => this.keepItAlive(), this.minutesToMS(this.KEEP_ALIVE_MINUTES_INTERVAL));\n // set the connection as correctly opened at least once (for re-connecting scenarios)\n this.wasOpenAtLeastOnce = true;\n // run the user-defined onOpen actions\n if (this.options.onOpen) this.options.onOpen(event);\n };\n this.connection.onclose = (event: any): void => {\n if (this.options.debug) console.log('WEBSOCKET WAS CLOSED BY EXTERNAL EVENTS', event);\n // run the user-defined onClose actions\n if (this.options.onClose) this.options.onClose(event);\n // in case the connection was closed by other events (e.g. offline) reset the data and try to re-open the socket\n this.close(this.wasOpenAtLeastOnce);\n };\n this.connection.onerror = (event: any): void => {\n if (this.options.debug) console.log('WEBSOCKET HAD AN ERROR', event);\n // send an error report, if requested\n if (this.options.reportError) {\n const errMsg = ''.concat(event?.target?.url, ' @@@ ', this._tc.get('user')?.userId || this._tc.get('userId'));\n this._errorReporting.sendReport(new Error(errMsg));\n }\n // run the user-defined onError actions\n if (this.options.onError) this.options.onError(event);\n };\n this.connection.onmessage = (event: any): void => {\n if (this.options.debug) console.log('WEBSOCKET INCOMING MESSAGE', event);\n try {\n const data = JSON.parse(event.data || {});\n if (this.options.onMessage) this.options.onMessage(data);\n } catch (err) {\n /* IGNORE: it probably comes from a keep-alive ping-pong message */\n }\n this.lastActivityAt = Date.now();\n };\n }\n\n /**\n * Close the current connection to the websocket API.\n * @param itShouldReopen in case the connection was forcibly closed, try to re-open it (with offline mechanism).\n */\n close(itShouldReopen?: boolean): void {\n // skip in case there isn't an active connection\n if (!this.connection) return;\n // reset the events listener\n this.connection.onopen = null;\n this.connection.onclose = null;\n this.connection.onmessage = null;\n this.connection.onerror = null;\n // in case the connection was closed by a manual action, reset the initial parameters\n if (!itShouldReopen) {\n this.options = null;\n this.wasOpenAtLeastOnce = false;\n }\n // reset the keep-alive mechanism\n if (this.pingTimeout) clearTimeout(this.pingTimeout);\n this.pingTimeout = null;\n this.lastActivityAt = null;\n // reset the try-again-when-offline mechanism\n if (this.offlineTimeout) clearTimeout(this.offlineTimeout);\n this.offlineTimeout = null;\n // close the connection and empty the reference\n this.connection.close();\n this.connection = null;\n // in case the connection was forcibly closed, try to re-open it\n if (itShouldReopen) this.reOpen();\n }\n /**\n * Try to-reopen a closed connection, if we are online.\n */\n protected async reOpen(): Promise<void> {\n // in case we are online, reopen the connection right away\n const isOnline = await this._offline.check();\n if (this.options.debug) console.log('WEBSOCKET WILL TRY TO RE-OPEN', isOnline, new Date());\n if (isOnline) return this.open();\n // if we are offline, set a timer to try to re-open the connection later on\n this.offlineTimeout = setTimeout(\n (): Promise<void> => this.reOpen(),\n this.minutesToMS(this.TRY_AGAIN_OFFLINE_MINUTES)\n );\n }\n\n /**\n * Whether the socket connection is currently open.\n */\n isOpen(): boolean {\n return this.connection && this.connection.readyState === WebSocket.OPEN;\n }\n\n /**\n * A simple message delivered to the server to keep the connection alive.\n */\n protected ping(): void {\n if (this.options.debug) console.log('WEBSOCKET IS PINGING THE SERVER', new Date());\n this.connection.send('ping');\n }\n\n /**\n * Helper to keep the connection alive, if needed.\n */\n protected keepItAlive(): void {\n if (this.options.debug) console.log('WEBSOCKET KEEP-IT-ALIVE', new Date());\n // if there wasn't an acivity in the last MAX_INACTIVITY_MINUTES, ping the connection\n if (!this.lastActivityAt || this.lastActivityAt + this.minutesToMS(this.MAX_INACTIVITY_MINUTES) < Date.now())\n this.ping();\n // set again the timer to keep the connection alive\n if (this.pingTimeout) clearTimeout(this.pingTimeout);\n this.pingTimeout = setTimeout((): void => this.keepItAlive(), this.minutesToMS(this.KEEP_ALIVE_MINUTES_INTERVAL));\n }\n\n /**\n * Convert minutes to milliseconds.\n */\n protected minutesToMS(minutes: number): number {\n return minutes * 60 * 1000;\n }\n}\n\n/**\n * The options to open a socket connection and handle its events.\n */\nexport interface IDEAAWSAPISocketServiceOpenOptions {\n /**\n * Optional parameters needed to be passed to the socket's authorizer to open the connection.\n * Note: the authentication (IDEA standard) is automatically included, if `noAuth` isn't set.\n */\n openParams?: { [key: string]: any };\n /**\n * If set, the socket connection won't require authentication.\n */\n noAuth?: boolean;\n /**\n * Action to execute when the connection is confirmed \"open\" by the server.\n */\n onOpen?: (event: any) => void;\n /**\n * Action to execute when the connection closes (for external events).\n */\n onClose?: (event: any) => void;\n /**\n * Action to execute when a message is delivered from the server.\n */\n onMessage?: (event: any) => void;\n /**\n * Action to execute when an error occurs.\n */\n onError?: (event: any) => void;\n /**\n * If true, report the errors that occur (IDEA standard).\n */\n reportError?: boolean;\n /**\n * Whether to show debug messages.\n */\n debug?: boolean;\n}\n","import { Injectable, inject } from '@angular/core';\nimport { IDEAStorageService } from '@idea-ionic/common';\n\n/**\n * *The service aims to solve the resource caching behaviour of browsers.*\n * *It's suggested to use it with avatars and other images/resources that can change based on user input.*\n * The browsers tend to cache images based on their URL;\n * sometimes, the image changes but the URL doesn't, and the browser keeps showing the old image.\n * Through this service, when we change a resource (e.g. an image), we also update a cache key.\n * Each time we load a resource through the service's method `getCachedImage`, we use the cache key as a query param;\n * in this way, the browser uses the same cached images, until we change the cache key.\n */\n@Injectable({ providedIn: 'root' })\nexport class IDEACachedResourcesService {\n /**\n * Change it only if necessary.\n */\n cacheKeyIndex = 'IDEA_CACHED_RESOURCES_KEY';\n\n private cacheKey: string;\n\n private storage = inject(IDEAStorageService);\n\n constructor() {\n this.loadKeyFromStorage();\n }\n /**\n * Load the cache key from the local storage.\n */\n private loadKeyFromStorage(): void {\n this.storage.get(this.cacheKeyIndex).then(key => {\n if (key) this.cacheKey = key;\n else this.updateCacheKey(Date.now());\n });\n }\n\n /**\n * Get an image using the service's caching mechanism.\n * Optionally update the cache key and forces the image's cache deletion.\n */\n getCachedResource(url: string, updateCacheKey?: boolean): string {\n const key = updateCacheKey ? this.updateCacheKey() : this.cacheKey;\n return url.concat(`?crs=${key}`);\n }\n /**\n * Set a new cache key.\n */\n async updateCacheKey(key: string | number = Date.now()): Promise<void> {\n this.cacheKey = String(key);\n await this.storage.set(this.cacheKeyIndex, key);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Platform } from '@ionic/angular/standalone';\nimport { PushNotifications, PushNotificationSchema } from '@capacitor/push-notifications';\nimport { Observable } from 'rxjs';\nimport { PushNotificationsDevice, PushNotificationsPlatforms } from 'idea-toolbox';\n\nimport { IDEAErrorReportingService } from './errorReporting.service';\n\n/**\n * To subscribe push notifications events.\n *\n * These are `Observable` streams fed by native Capacitor listeners (outside the Angular zone). On a\n * zoneless consumer, render any state you derive from them reactively (signals or the `async` pipe);\n * a plain field assigned inside `.subscribe(...)` won't schedule change detection.\n */\n@Injectable({ providedIn: 'root' })\nexport class IDEAPushNotificationsService {\n private _platform = inject(Platform);\n private _errorReporting = inject(IDEAErrorReportingService);\n\n registrations: Observable<PushNotificationsDevice>;\n notifications: Observable<PushNotificationSchema>;\n errors: Observable<Error>;\n\n constructor() {\n if (!this.isAvailable()) return;\n\n this.registrations = new Observable(observer => {\n PushNotifications.addListener('registration', token =>\n observer.next(new PushNotificationsDevice({ token: token.value, platform: PushNotificationsPlatforms.FCM }))\n );\n });\n this.errors = new Observable(observer => {\n // rif. https://forum.ionicframework.com/t/226376\n (PushNotifications as any).addListener('registrationError', (err: Error): void => {\n this._errorReporting.sendReport(err);\n observer.next(err);\n });\n });\n this.notifications = new Observable(observer => {\n PushNotifications.addListener('pushNotificationReceived', n => observer.next(n));\n });\n }\n\n /**\n * Return true if the device is supported.\n */\n isAvailable(): boolean {\n return this._platform.is('capacitor') && !!PushNotifications;\n }\n\n /**\n * To fire the registration of a new device: it will rewquest the permission to use Push Notification.\n * On iOS will prompt the request, on Android it's automatic.\n */\n async registerDevice(): Promise<void> {\n if (!this.isAvailable()) return;\n\n let permStatus = await PushNotifications.checkPermissions();\n\n if (permStatus.receive === 'prompt') permStatus = await PushNotifications.requestPermissions();\n\n if (permStatus.receive === 'granted') PushNotifications.register();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["Platform","i1"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"idea-ionic-uncommon.mjs","sources":["../../../modules/uncommon/src/address/address.component.ts","../../../modules/uncommon/src/errorReporting.service.ts","../../../modules/uncommon/src/tinCan.service.ts","../../../modules/uncommon/src/offline/offline.service.ts","../../../modules/uncommon/src/AWSAPI.service.ts","../../../modules/uncommon/src/attachments/attachments.component.ts","../../../modules/uncommon/src/announcement/announcement.component.ts","../../../modules/uncommon/src/colors/colorPicker.component.ts","../../../modules/uncommon/src/contacts/contacts.component.ts","../../../modules/uncommon/src/dateTime/calendarPicker.component.ts","../../../modules/uncommon/src/dateTime/calendarPicker.component.html","../../../modules/uncommon/src/dateTime/dateTime.component.ts","../../../modules/uncommon/src/duration/duration.component.ts","../../../modules/uncommon/src/echo/echo.page.ts","../../../modules/uncommon/src/echo/echo.routes.ts","../../../modules/uncommon/src/mde/mdeToolbar.component.ts","../../../modules/uncommon/src/mde/mde.component.ts","../../../modules/uncommon/src/offline/offlineData.service.ts","../../../modules/uncommon/src/offline/cacheableResource.component.ts","../../../modules/uncommon/src/offline/offlineManager.component.ts","../../../modules/uncommon/src/offline/offlineManager.component.html","../../../modules/uncommon/src/offline/offlineIndicator.component.ts","../../../modules/uncommon/src/sentiment/sentiment.component.ts","../../../modules/uncommon/src/timeInterval/fromTimeToTime.component.ts","../../../modules/uncommon/src/timeInterval/fromTimeToTime.component.html","../../../modules/uncommon/src/timeInterval/timeInterval.component.ts","../../../modules/uncommon/src/AWSAPISocket.service.ts","../../../modules/uncommon/src/cachedResources.service.ts","../../../modules/uncommon/src/pushNotifications.service.ts","../../../modules/uncommon/idea-ionic-uncommon.ts"],"sourcesContent":["import { Component, Input, OnInit, ChangeDetectionStrategy, output, viewChild, input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { IonAccordionGroup, IonAccordion, IonItem, IonInput, IonList, IonText } from '@ionic/angular/standalone';\nimport { Address, Countries, Suggestion } from 'idea-toolbox';\nimport { IDEASelectComponent, IDEATranslatePipe } from '@idea-ionic/common';\n\n@Component({\n selector: 'idea-address',\n imports: [\n FormsModule,\n IDEATranslatePipe,\n IDEASelectComponent,\n IonText,\n IonList,\n IonInput,\n IonItem,\n IonAccordion,\n IonAccordionGroup\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (address) {\n <ion-accordion-group #accordion>\n <ion-accordion value=\"open\">\n <ion-item slot=\"header\" button [color]=\"color()\" [lines]=\"lines()\">\n @if (isCollapsed()) {\n <ion-input\n readonly\n [labelPlacement]=\"isCollapsed() ? 'stacked' : ''\"\n [label]=\"label() || ('IDEA_UNCOMMON.ADDRESS.COMPLETE_ADDRESS' | translate)\"\n [title]=\"'IDEA_UNCOMMON.ADDRESS.COMPLETE_ADDRESS_HINT' | translate\"\n [placeholder]=\"placeholder()\"\n [value]=\"address.getFullAddress()\"\n (ionChange)=\"addressChange.emit(address)\"\n />\n }\n </ion-item>\n <ion-list slot=\"content\">\n @if (showContact()) {\n <ion-item [color]=\"color()\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.ADDRESS.CONTACT' | translate\"\n [disabled]=\"!editMode()\"\n [placeholder]=\"'IDEA_UNCOMMON.ADDRESS.CONTACT_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.ADDRESS.CONTACT_HINT' | translate\"\n [(ngModel)]=\"address.contact\"\n (ionChange)=\"addressChange.emit(address)\"\n />\n </ion-item>\n }\n @if (showEmail()) {\n <ion-item [color]=\"color()\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.ADDRESS.EMAIL' | translate\"\n [disabled]=\"!editMode()\"\n [placeholder]=\"'IDEA_UNCOMMON.ADDRESS.EMAIL_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.ADDRESS.EMAIL_HINT' | translate\"\n [(ngModel)]=\"address.email\"\n (ionChange)=\"addressChange.emit(address)\"\n />\n </ion-item>\n }\n @if (showPhone()) {\n <ion-item [color]=\"color()\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.ADDRESS.PHONE' | translate\"\n [disabled]=\"!editMode()\"\n [placeholder]=\"'IDEA_UNCOMMON.ADDRESS.PHONE_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.ADDRESS.PHONE_HINT' | translate\"\n [(ngModel)]=\"address.phone\"\n (ionChange)=\"addressChange.emit(address)\"\n />\n </ion-item>\n }\n <ion-item [color]=\"color()\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [disabled]=\"!editMode()\"\n [placeholder]=\"'IDEA_UNCOMMON.ADDRESS.ADDRESS_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.ADDRESS.ADDRESS_HINT' | translate\"\n [(ngModel)]=\"address.address\"\n (ionChange)=\"addressChange.emit(address)\"\n >\n <div slot=\"label\">\n {{ 'IDEA_UNCOMMON.ADDRESS.ADDRESS' | translate }}\n @if (editMode() && obligatory()) {\n <ion-text class=\"obligatoryDot\" />\n }\n </div>\n </ion-input>\n </ion-item>\n @if (showAddress2()) {\n <ion-item [color]=\"color()\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.ADDRESS.ADDRESS2' | translate\"\n [disabled]=\"!editMode()\"\n [placeholder]=\"'IDEA_UNCOMMON.ADDRESS.ADDRESS2_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.ADDRESS.ADDRESS2_HINT' | translate\"\n [(ngModel)]=\"address.address2\"\n (ionChange)=\"addressChange.emit(address)\"\n />\n </ion-item>\n }\n <ion-item [color]=\"color()\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.ADDRESS.POSTCODE' | translate\"\n [disabled]=\"!editMode()\"\n [placeholder]=\"'IDEA_UNCOMMON.ADDRESS.POSTCODE_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.ADDRESS.POSTCODE_HINT' | translate\"\n [(ngModel)]=\"address.postcode\"\n (ionChange)=\"addressChange.emit(address)\"\n />\n </ion-item>\n <ion-item [color]=\"color()\">\n <ion-input\n autocomplete=\"new\"\n [disabled]=\"!editMode()\"\n labelPlacement=\"stacked\"\n [placeholder]=\"'IDEA_UNCOMMON.ADDRESS.CITY_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.ADDRESS.CITY_HINT' | translate\"\n [(ngModel)]=\"address.city\"\n (ionChange)=\"addressChange.emit(address)\"\n >\n <div slot=\"label\">\n {{ 'IDEA_UNCOMMON.ADDRESS.CITY' | translate }}\n @if (editMode() && obligatory()) {\n <ion-text class=\"obligatoryDot\" />\n }\n </div>\n </ion-input>\n </ion-item>\n <ion-item [color]=\"color()\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.ADDRESS.PROVINCE' | translate\"\n [disabled]=\"!editMode()\"\n [placeholder]=\"'IDEA_UNCOMMON.ADDRESS.PROVINCE_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.ADDRESS.PROVINCE_HINT' | translate\"\n [(ngModel)]=\"address.province\"\n (ionChange)=\"addressChange.emit(address)\"\n />\n </ion-item>\n <idea-select\n [color]=\"color()\"\n [data]=\"countriesSuggestions\"\n [label]=\"'IDEA_UNCOMMON.ADDRESS.COUNTRY' | translate\"\n [lines]=\"editMode() ? lines() : null\"\n [description]=\"getCountryName(address.country)\"\n [placeholder]=\"'IDEA_UNCOMMON.ADDRESS.COUNTRY_HINT' | translate\"\n [searchPlaceholder]=\"'IDEA_UNCOMMON.ADDRESS.COUNTRY_HINT' | translate\"\n [hideIdFromUI]=\"true\"\n [avoidAutoSelection]=\"true\"\n [disabled]=\"!editMode()\"\n (select)=\"setCountryFromSuggestion($event)\"\n />\n </ion-list>\n </ion-accordion>\n </ion-accordion-group>\n }\n `,\n styles: [\n `\n ion-item[slot='header'] ion-input {\n --highlight-color-focused: transparent;\n --highlight-color-valid: transparent;\n --highlight-color-invalid: transparent;\n }\n ion-list[slot='content'] {\n padding-top: 0;\n padding-left: 20px;\n }\n `\n ]\n})\nexport class IDEAAddressComponent implements OnInit {\n /**\n * The address to manage.\n */\n @Input() address: Address;\n readonly addressChange = output<Address>();\n /**\n * If true, show the field `contact`.\n */\n readonly showContact = input(false);\n /**\n * If true, show the field `address2`.\n */\n readonly showAddress2 = input(false);\n /**\n * If true, show the field `phone`.\n */\n readonly showPhone = input(false);\n /**\n * If true, show the field `email`.\n */\n readonly showEmail = input(false);\n /**\n * Whether the fields are editable or disabled.\n */\n readonly editMode = input(true);\n /**\n * If true, show obligatory dots.\n */\n readonly obligatory = input(false);\n /**\n * The lines attribute of the item.\n */\n readonly lines = input<string>();\n /**\n * The color for the component.\n */\n readonly color = input<string>();\n /**\n * The label to show for the field; if not set, it has a default value.\n */\n readonly label = input<string>();\n /**\n * The placeholder to show for the field.\n */\n readonly placeholder = input<string>();\n /**\n * To toggle the detailed view.\n */\n readonly openByDefault = input(false);\n\n countriesSuggestions: Suggestion[];\n Countries = Countries;\n readonly accordion = viewChild<IonAccordionGroup>('accordion');\n\n ngOnInit(): void {\n this.countriesSuggestions = Object.keys(Countries).map(\n k => new Suggestion({ value: (Countries as any)[k], name: k })\n );\n }\n\n isCollapsed(): boolean {\n return this.accordion()?.value !== 'open';\n }\n\n getCountryName(countryCode: Countries): string {\n if (!countryCode) return;\n const country = Object.entries(Countries).find(([_, value]): boolean => value === countryCode);\n return country ? country[0] : null;\n }\n setCountryFromSuggestion(suggestion: Suggestion): void {\n if (!suggestion) return;\n this.address.country = suggestion.value;\n this.addressChange.emit(this.address);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Platform } from '@ionic/angular/standalone';\nimport { ClientInfo, ErrorReport } from 'idea-toolbox';\nimport { IDEAEnvironment } from '@idea-ionic/common';\n\n@Injectable({ providedIn: 'root' })\nexport class IDEAErrorReportingService {\n protected _env = inject(IDEAEnvironment);\n protected _http = inject(HttpClient);\n protected _platform = inject(Platform);\n\n apiStage: string;\n apiUrl: string;\n\n constructor() {\n this.apiStage = this._env.idea.ideaApi?.stage || (this._env.idea.ideaApi as any)?.version;\n this.apiUrl = 'https://'.concat([this._env.idea.ideaApi?.url, this.apiStage].filter(x => x).join('/'));\n }\n\n /**\n * Send the error report to the back-end.\n */\n sendReport(error: Error, forceSend?: boolean): Promise<void> {\n return new Promise(resolve => {\n // skip in case we don't want to send the report or the report is useless (blank error)\n if ((!this.shouldSend() && !forceSend) || !error?.name) return resolve();\n // prepare and send the report\n const report = new ErrorReport({\n version: this._env.idea.app.version,\n stage: this.apiStage,\n client: this.getClientInfo(),\n type: error.name,\n error: error.message,\n stack: error.stack\n });\n this._http\n .post(this.apiUrl.concat(`/projects/${this._env.idea.project}/errorReporting`), report)\n .toPromise()\n .catch((): void => {}) // note: never throw an error when reporting an error\n .finally((): void => resolve());\n });\n }\n\n /**\n * Whether we should send the reporting or we are in a scenario in which we should skip it.\n */\n shouldSend(): boolean {\n return this.apiStage === 'prod';\n }\n\n /**\n * Acquire the client's info.\n */\n getClientInfo(): ClientInfo {\n return new ClientInfo({\n timestamp: new Date().toISOString(),\n platform: this._platform.platforms().join(' '),\n screenWidth: this._platform.width(),\n screenHeight: this._platform.height(),\n isLandScape: this._platform.isLandscape(),\n url: this._platform.url(),\n referrer: document.referrer,\n isOnline: navigator.onLine,\n language: navigator.language,\n userAgent: navigator.userAgent\n });\n }\n}\n","import { Injectable } from '@angular/core';\n\n/**\n * @deprecated use a specific App service instead.\n */\n@Injectable({ providedIn: 'root' })\nexport class IDEATinCanService {\n protected data: any;\n\n constructor() {\n this.clear();\n }\n\n /**\n * Set a variable with the given value.\n * @param variable variable to set\n * @param value value to assign to the variable\n */\n set(variable: string, value: any): void {\n this.data[variable] = value;\n }\n /**\n * Get the content of a variable.\n * @param variable variable to acquire\n * @param getAndDelete if set, delete the variable after the acquisition\n */\n get(variable: string, getAndDelete?: boolean): any {\n const ret = this.data[variable];\n if (getAndDelete) this.remove(variable);\n return ret;\n }\n /**\n * Remove a variable.\n * @param variable variable to remove\n */\n remove(variable: string): void {\n delete this.data[variable];\n }\n /**\n * Clear all the variables.\n */\n clear(): void {\n this.data = {};\n }\n}\n","import { Injectable, signal } from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\nimport { Network } from '@capacitor/network';\n\n/**\n * Utility to monitor the network connection.\n * Note: don't use it directly, if you're also using IDEAOfflineDataService.\n */\n@Injectable({ providedIn: 'root' })\nexport class IDEAOfflineService {\n /**\n * True/false if the platform is offline/online.\n */\n protected _isOffline = signal<boolean>(typeof navigator === 'undefined' ? false : !navigator.onLine);\n /**\n * The observable for subscribing to online/offline status changes.\n */\n protected observable: Observable<boolean>;\n /**\n * The handler for listenig to network changes.\n */\n protected listenerHandler: any;\n\n constructor() {\n if (Network) {\n // set the basic listener for changes\n this.listenerHandler = Network.addListener('networkStatusChange', status =>\n this._isOffline.set(!status.connected)\n );\n // create the observable to subscribe to the network changes; note: it won't run until subscribed\n this.observable = new Observable(observer => {\n // remove the basic listener add add one that supports a subscription\n Network.removeAllListeners();\n this.listenerHandler = Network.addListener('networkStatusChange', status => {\n this._isOffline.set(!status.connected);\n if (observer) observer.next(status.connected);\n });\n });\n }\n }\n /**\n * Subscribe to be notified when the connection status changes.\n */\n subscribe(callback: (isOnline: boolean) => void): Subscription {\n return this.observable.subscribe(callback);\n }\n\n /**\n * Quickly check the connection status.\n */\n isOnline(): boolean {\n return !this._isOffline();\n }\n /**\n * Quickly check the connection status.\n */\n isOffline(): boolean {\n return this._isOffline();\n }\n\n /**\n * Quickly check for online connection.\n */\n async check(): Promise<boolean> {\n if (!Network) return false;\n\n const status = await Network.getStatus();\n this._isOffline.set(!status.connected);\n return status.connected;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient, HttpHeaders, HttpParams, HttpErrorResponse } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { Platform } from '@ionic/angular/standalone';\nimport { IDEAApiError, IDEAEnvironment, IDEAStorageService } from '@idea-ionic/common';\n\nimport { IDEAErrorReportingService } from './errorReporting.service';\nimport { IDEATinCanService } from './tinCan.service';\nimport { IDEAOfflineService } from './offline/offline.service';\n\n/**\n * To communicate with an AWS's API Gateway istance.\n *\n * Includes a rundimental cache on GET requests, until Android doesn't support SWs on local files.\n *\n * Note: requires an `AWSAPIAuthToken` variable to be set by IDEATinCanService service.\n */\n@Injectable({ providedIn: 'root' })\nexport class IDEAAWSAPIService {\n protected _env = inject(IDEAEnvironment);\n protected _http = inject(HttpClient);\n protected _platform = inject(Platform);\n protected _tc = inject(IDEATinCanService);\n protected _storage = inject(IDEAStorageService);\n protected _errorReporting = inject(IDEAErrorReportingService);\n protected _offline = inject(IDEAOfflineService);\n\n apiStage: string;\n apiUrlProject: string;\n ideaApiStage: string;\n apiUrlIDEA: string;\n\n constructor() {\n this.apiStage = this._env.idea.api?.stage || (this._env.idea.api as any)?.version;\n this.apiUrlProject = 'https://'.concat([this._env.idea.api?.url, this.apiStage].filter(x => x).join('/'));\n this.ideaApiStage = this._env.idea.ideaApi?.stage || (this._env.idea.ideaApi as any)?.version;\n this.apiUrlIDEA = 'https://'.concat([this._env.idea.ideaApi?.url, this.ideaApiStage].filter(x => x).join('/'));\n }\n\n /**\n * Execute an online API request.\n * @param resource resource name (e.g. `users`)\n * @param method enum HTTP methods\n * @param options the request options\n */\n protected request(resource: string, method: string, options?: APIRequestOption): Promise<any> {\n return new Promise((resolve, reject): void => {\n const opt = options || {};\n // prepare the url\n const url = this.prepareURL(resource, opt);\n // prepare the headers and set the Authorization token\n const headers = this.prepareHeaders(opt.headers);\n // prepare the query params and add some info about the client\n const params = this.prepareQueryParams(opt.params, true);\n // execute the request\n let req: any;\n switch (method) {\n case 'HEAD':\n req = this._http.head(url, { headers, params });\n break;\n case 'POST':\n req = this._http.post(url, opt.body, { headers, params });\n break;\n case 'PUT':\n req = this._http.put(url, opt.body, { headers, params });\n break;\n case 'PATCH':\n req = this._http.patch(url, opt.body, { headers, params });\n break;\n case 'DELETE':\n req = this._http.delete(url, { headers, params });\n break;\n case 'GET':\n default:\n req = this._http.get(url, { headers, params });\n }\n // handle the request response\n req.subscribe(\n (res: any): void => resolve(res),\n async (err: HttpErrorResponse): Promise<void> => {\n // check if the request failed for network reasons (to trigger offline mode if needed)\n await this._offline.check();\n // (async) send a report, if wanted\n if (opt.reportError) this._errorReporting.sendReport(err);\n // fix and return the error\n this.fixErrMessageBeforeReject(err, reject);\n }\n );\n });\n }\n /**\n * Prepare the URL to which execute the request.\n */\n protected prepareURL(resource: string, opt: APIRequestOption): string {\n // decide whether to use IDEA's API or the project's API (or an alternative API)\n let url = opt.idea ? this.apiUrlIDEA : opt.alternativeAPI || this.apiUrlProject;\n // prepare a single-resource request (by id) or a normal one\n url = `${url}/${resource}`;\n if (opt.resourceId) url = `${url}/${encodeURIComponent(opt.resourceId)}`;\n return url;\n }\n /**\n * Prepare the headers object to send with a request.\n * Note: it always adds the Authorization token (`AWSAPIAuthToken`) and the API key (`AWSAPIKey`), if set.\n */\n protected prepareHeaders(h: HttpHeaders | any): HttpHeaders {\n // preare the headers; note: HttpHeaders is immutable!\n let headers = new HttpHeaders(h || null);\n // set the Authorization token\n if (!headers.get('Authorization') && this._tc.get('AWSAPIAuthToken'))\n headers = headers.set('Authorization', this._tc.get('AWSAPIAuthToken'));\n // set the API key\n if (!headers.get('X-API-Key') && this._tc.get('AWSAPIKey'))\n headers = headers.set('X-API-Key', this._tc.get('AWSAPIKey'));\n return headers;\n }\n /**\n * Prepare the queryParams object to send with a request; if requested, add some info about the client.\n */\n protected prepareQueryParams(qp: HttpParams | any, addClientInfo?: boolean): HttpParams {\n // prepare the query params; note: HttpParams is immutable!\n let searchParams = new HttpParams();\n if (qp && qp instanceof HttpParams) searchParams = qp;\n else if (qp) for (const prop in qp) if (qp[prop]) searchParams = searchParams.set(prop, qp[prop]);\n // if requested, add app version and client platform to the info we send to the back-end\n if (addClientInfo) {\n searchParams = searchParams.set('_v', this._env.idea.app.version);\n searchParams = searchParams.set('_p', this._platform.platforms().join(' '));\n }\n return searchParams;\n }\n /**\n * Converts the error message to be readable.\n */\n protected fixErrMessageBeforeReject(err: HttpErrorResponse, reject: any): void {\n let e;\n try {\n if (!err || !err.error) e = {};\n else if (typeof err.error === 'string') e = JSON.parse(err.error);\n else e = err.error;\n } catch (_) {\n e = {};\n }\n // the id of the request of an error the back-end didn't handle, to show as a code to report\n const error: IDEAApiError = new Error(e.message || 'Unknown error!');\n if (e.requestId) error.requestId = e.requestId;\n reject(error);\n }\n\n /**\n * Use the HttpClient to execute a raw request.\n */\n rawRequest(): HttpClient {\n return this._http;\n }\n\n /**\n * HEAD request.\n * @param resource resource name (e.g. `users`)\n * @param options the request options\n */\n headResource(resource: string, options?: APIRequestOption): Promise<any> {\n return this.request(resource, 'HEAD', options);\n }\n\n /**\n * GET request. Include options to cache the requests (`options.useCache`), to work also offline.\n * @param resource resource name (e.g. `users`)\n * @param options the request options\n */\n getResource(resource: string, options?: APIRequestOption): Promise<any> {\n return new Promise((resolve, reject): void => {\n const opt = options || {};\n // if offline and with a cache mode set, force the request to the cache\n if (!navigator.onLine && opt.useCache) opt.useCache = CacheModes.CACHE_ONLY;\n // execute the GET request online or through the cache, depending on the chosen mode\n switch (opt.useCache) {\n case CacheModes.CACHE_ONLY:\n // return the result from the cache, without retrying online if a result wasn't found\n this.getFromCache(resource, opt).then((res: any): void => {\n if (res) resolve(res);\n else reject();\n });\n break;\n case CacheModes.CACHE_FIRST:\n // return the result from the cache\n this.getFromCache(resource, opt).then((localRes: any): void => {\n // check whether the local resource is present (element or list)\n if (localRes && (opt.resourceId || localRes.length)) {\n resolve(localRes);\n // asynchrounously execute the request online, to update the cache with latest data\n this.request(resource, 'GET', opt)\n .then((cloudRes: any): void => {\n // update the cache (if it fails, it's ok)\n this.putInCache(resource, cloudRes, opt).catch((): void => {});\n })\n .catch((): void => {}); // we already returned the result, an error is acceptable\n } else {\n // if the result isn't found in the cache, return the result of the online request\n this.request(resource, 'GET', opt)\n .then((res: any): void => {\n resolve(res);\n // update the cache (if it fails, it's ok)\n this.putInCache(resource, res, opt).catch((): void => {});\n })\n .catch((err: Error): void => reject(err)); // element not found\n }\n });\n break;\n case CacheModes.NETWORK_FIRST:\n // return the result from an online request\n this.request(resource, 'GET', opt)\n .then((cloudRes: any): void => {\n resolve(cloudRes);\n // asynchrounously get the same element from cache and decide whether to update or not\n this.getFromCache(resource, opt).then((): void => {\n // update the cache (if it fails, it's ok)\n this.putInCache(resource, cloudRes, opt).catch((): void => {});\n });\n })\n .catch(() => {\n // if a request to the network fails, check in cache\n this.getFromCache(resource, opt).then((res: any): void => {\n if (res) resolve(res);\n else reject();\n });\n });\n break;\n default:\n /* CacheModes.NO_CACHE */\n // return the result from an online request, with no cache involved\n this.request(resource, 'GET', opt)\n .then((res: any): void => resolve(res))\n .catch((err: Error): void => reject(err));\n }\n });\n }\n\n /**\n * Observe a GET request. Include options to cache the requests (`options.useCache`), to work also offline.\n * @param resource resource name (e.g. `users`)\n * @param options the request options\n */\n getResourceObserver(resource: string, options?: APIRequestOption): Observable<any> {\n return new Observable(observer => {\n const opt = options || {};\n // if offline and with a cache mode set, force the request to the cache\n if (!navigator.onLine && opt.useCache) opt.useCache = CacheModes.CACHE_ONLY;\n // execute the GET request online or through the cache, depending on the chosen mode\n switch (opt.useCache) {\n case CacheModes.CACHE_ONLY:\n // return the result from the cache, without retrying online if a result wasn't found\n this.getFromCache(resource, opt).then((res: any): void => {\n if (res) observer.next(res);\n else observer.error();\n });\n break;\n case CacheModes.CACHE_FIRST:\n // return the result from the cache\n this.getFromCache(resource, opt).then((localRes: any): void => {\n if (localRes) {\n observer.next(localRes);\n // asynchrounously execute the request online, to update the cache with latest data\n this.request(resource, 'GET', opt)\n .then((cloudRes: any): void => {\n observer.next(cloudRes);\n // update the cache (if it fails, it's ok)\n this.putInCache(resource, cloudRes, opt).catch((): void => {});\n })\n .catch((): void => {}); // we already returned the result, an error is acceptable\n } else {\n // if the result isn't found in the cache, return the result of the online request\n this.request(resource, 'GET', opt)\n .then((res: any): void => {\n observer.next(res);\n // update the cache (if it fails, it's ok)\n this.putInCache(resource, res, opt).catch((): void => {});\n })\n .catch((err: Error): void => observer.error(err)); // element not found\n }\n });\n break;\n case CacheModes.NETWORK_FIRST:\n // return the result from an online request\n this.request(resource, 'GET', opt)\n .then((cloudRes: any): void => {\n observer.next(cloudRes);\n // update the cache (if it fails, it's ok)\n this.putInCache(resource, cloudRes, opt).catch((): void => {});\n })\n .catch((): void => {\n // if a request to the network fails, check in cache\n this.getFromCache(resource, opt).then((res: any): void => {\n if (res) observer.next(res);\n else observer.error();\n });\n });\n break;\n default:\n /* CacheModes.NO_CACHE */\n // return the result from an online request, with no cache involved\n this.request(resource, 'GET', opt)\n .then((res: any): void => observer.next(res))\n .catch((err: Error): void => observer.error(err));\n }\n });\n }\n\n /**\n * Execute a GET request from the local storage.\n * @param resource resource name (e.g. `users`)\n * @param options the request options\n */\n getFromCache(resource: string, options?: APIRequestOption): Promise<any> {\n return new Promise(resolve => {\n const opt = options || {};\n // prepare the url and the query params\n const url = this.prepareURL(resource, opt);\n const queryParams = this.prepareQueryParams(opt.params);\n // get from storage, by the complete url\n this._storage\n .get(url.concat(queryParams.toString()))\n .then((res: any): void => (res ? resolve(res) : opt.resourceId ? resolve(null) : resolve([])));\n });\n }\n /**\n * Execute a PUT request in the local storage.\n * @param resource resource name (e.g. `users`)\n * @param data resource data\n * @param options the request options\n */\n putInCache(resource: string, data: any, options?: APIRequestOption): Promise<void> {\n return new Promise((resolve, reject) => {\n const opt = options || {};\n // prepare the url and the query params\n const url = this.prepareURL(resource, opt);\n const queryParams = this.prepareQueryParams(opt.params);\n // put in the storage, by the complete url\n this._storage\n .set(url.concat(queryParams.toString()), data)\n .then((): void => resolve())\n .catch((err: Error): void => reject(err));\n });\n }\n /**\n * Execute a DELETE request in the local storage.\n * @param resource resource name (e.g. `users`)\n * @param options the request options\n */\n deleteFromCache(resource: string, options?: APIRequestOption): Promise<void> {\n return new Promise((resolve, reject): void => {\n const opt = options || {};\n // prepare the url and the query params\n const url = this.prepareURL(resource, opt);\n const queryParams = this.prepareQueryParams(opt.params);\n // delete from storage, by the complete url\n this._storage\n .remove(url.concat(queryParams.toString()))\n .then((): void => resolve())\n .catch((err: Error): void => reject(err));\n });\n }\n\n /**\n * POST request.\n * @param resource resource name (e.g. `users`)\n * @param options the request options\n */\n postResource(resource: string, options?: APIRequestOption): Promise<any> {\n return this.request(resource, 'POST', options);\n }\n\n /**\n * PUT request.\n * @param resource resource name (e.g. `users`)\n * @param options the request options\n */\n putResource(resource: string, options?: APIRequestOption): Promise<any> {\n return this.request(resource, 'PUT', options);\n }\n\n /**\n * PATCH request.\n * @param resource resource name (e.g. `users`)\n * @param options the request options\n */\n patchResource(resource: string, options?: APIRequestOption): Promise<any> {\n return this.request(resource, 'PATCH', options);\n }\n\n /**\n * DELETE request.\n * @param resource resource name (e.g. `users`)\n * @param options the request options\n */\n deleteResource(resource: string, options?: APIRequestOption): Promise<any> {\n return this.request(resource, 'DELETE', options);\n }\n}\n\n/**\n * The options of an API request.\n */\nexport class APIRequestOption {\n /**\n * To identify a specific resource by id.\n */\n resourceId?: string;\n /**\n * The query parameters of the request.\n */\n params?: any;\n /**\n * The body of the request.\n */\n body?: any;\n /**\n * The additional headers of the request; `Authorization` is included by default.\n */\n headers?: any;\n /**\n * Which mode to use to take advance of the requests caching mechanism.\n */\n useCache?: CacheModes;\n /**\n * If true, report the errors that occurs during the request.\n */\n reportError?: boolean;\n /**\n * If true, use IDEA's API instead of the project's API).\n */\n idea?: boolean;\n /**\n * If `idea` is not set, set this to use an alternative API URL for the request.\n */\n alternativeAPI?: string;\n}\n\n/**\n * Set of usable cache modes.\n */\nexport enum CacheModes {\n /**\n * Return the result from an online request, with no cache involved.\n */\n NO_CACHE = 0,\n /**\n * Return the result from an online request, storing the result in the cache, to update it with the latest data.\n */\n NETWORK_FIRST,\n /**\n * Return the result from the cache, but also execute the request online, to update the cache with the latest data.\n */\n CACHE_FIRST,\n /**\n * Return the result from the cache, without retrying online if a result wasn't found.\n */\n CACHE_ONLY\n}\n","import heic2any from 'heic2any';\nimport { Component, inject, Input, OnInit, ChangeDetectionStrategy, input, model, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Platform } from '@ionic/angular';\nimport { IonButton, IonIcon, IonInput, IonItem, IonLabel, IonSpinner } from '@ionic/angular/standalone';\nimport { Browser } from '@capacitor/browser';\nimport { Camera, CameraResultType, CameraSource } from '@capacitor/camera';\nimport { Attachment } from 'idea-toolbox';\nimport {\n IDEAApiError,\n IDEALoadingService,\n IDEAMessageService,\n IDEATranslatePipe,\n IDEATranslationsService\n} from '@idea-ionic/common';\n\nimport { IDEAAWSAPIService } from '../AWSAPI.service';\nimport { IDEAOfflineService } from '../offline/offline.service';\nimport { IDEATinCanService } from '../tinCan.service';\n\n@Component({\n selector: 'idea-old-attachments',\n imports: [FormsModule, IDEATranslatePipe, IonItem, IonButton, IonIcon, IonInput, IonLabel, IonSpinner],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @for (att of attachments(); track att; let index = $index; let odd = $odd) {\n <ion-item\n class=\"attachments\"\n [class.fieldHasError]=\"hasFieldAnError('attachments[' + index + '].attachmentId')\"\n [class.odd]=\"odd\"\n [lines]=\"lines()\"\n >\n @if (att.attachmentId && _offline.isOnline()) {\n <ion-button fill=\"clear\" size=\"small\" slot=\"start\" (click)=\"openAttachment(att)\">\n <ion-icon name=\"open-outline\" slot=\"icon-only\" size=\"small\" />\n </ion-button>\n }\n @if (!editMode && att.attachmentId) {\n <ion-icon slot=\"start\" color=\"medium\" [name]=\"getFormatIcon(att.format)\" [title]=\"att.format\" />\n }\n @if (editMode && att.attachmentId) {\n <ion-input\n [(ngModel)]=\"att.name\"\n (ionBlur)=\"$event.target.value = $event.target.value || _translate._('IDEA_TEAMS.ATTACHMENTS.NO_NAME')\"\n />\n }\n @if (editMode && !att.attachmentId) {\n <ion-label class=\"loadingWarning\">\n {{ 'IDEA_TEAMS.ATTACHMENTS.UPLOADING_ATTACHMENT_WARNING' | translate }}\n </ion-label>\n }\n @if (!editMode) {\n <ion-label>{{ att.name }}.{{ att.format }}</ion-label>\n }\n @if (!att.attachmentId) {\n <ion-spinner slot=\"end\" [title]=\"'IDEA_TEAMS.ATTACHMENTS.UPLOADING' | translate\" />\n }\n @if (editMode) {\n <ion-button\n slot=\"end\"\n color=\"danger\"\n fill=\"clear\"\n [title]=\"'IDEA_TEAMS.ATTACHMENTS.REMOVE_ATTACHMENT' | translate\"\n (click)=\"removeAttachment(att)\"\n >\n <ion-icon name=\"remove\" slot=\"icon-only\" />\n </ion-button>\n }\n </ion-item>\n }\n <!----->\n @if (!editMode && !attachments()?.length) {\n <ion-item lines=\"none\" class=\"noAttachments\">\n <ion-label>\n {{ 'IDEA_TEAMS.ATTACHMENTS.NO_ATTACHMENT' | translate }}\n </ion-label>\n </ion-item>\n }\n <!----->\n @if (editMode) {\n <div>\n @for (err of uploadErrors(); track err) {\n <ion-item class=\"attachments\" [lines]=\"lines()\">\n <ion-icon name=\"alert-circle\" slot=\"start\" color=\"danger\" />\n <ion-label color=\"danger\">\n {{ err }}\n <p>{{ 'IDEA_TEAMS.ATTACHMENTS.ERROR_UPLOADING_ATTACHMENT' | translate }}</p>\n </ion-label>\n <ion-button\n slot=\"end\"\n color=\"danger\"\n fill=\"clear\"\n [title]=\"'IDEA_TEAMS.ATTACHMENTS.HIDE_ERROR' | translate\"\n (click)=\"hideUploadError(err)\"\n >\n <ion-icon name=\"close\" slot=\"icon-only\" />\n </ion-button>\n </ion-item>\n }\n </div>\n }\n <!----->\n @if (editMode) {\n <ion-item lines=\"none\" class=\"selectable\" (click)=\"browseFiles()\">\n <ion-label color=\"medium\">{{ 'IDEA_TEAMS.ATTACHMENTS.TAP_TO_ADD_ATTACHMENT' | translate }}</ion-label>\n <input\n id=\"attachmentPicker\"\n type=\"file\"\n multiple\n style=\"display: none\"\n (change)=\"addAttachmentFromFile($event)\"\n />\n @if (editMode) {\n <ion-icon slot=\"end\" name=\"caret-down\" class=\"selectIcon\" />\n }\n @if (editMode && isCapacitor()) {\n <ion-button slot=\"end\" fill=\"clear\" color=\"dark\" (click)=\"takePictureAndAttach($event)\">\n <ion-icon slot=\"icon-only\" name=\"camera\" />\n </ion-button>\n }\n </ion-item>\n }\n `,\n styles: [\n `\n .attachments {\n ion-button[slot='start'],\n ion-icon[slot='start'] {\n margin-right: 10px;\n }\n .loadingWarning {\n font-style: italic;\n font-size: 0.8em;\n color: var(--ion-color-medium);\n }\n }\n .noAttachments {\n font-style: italic;\n }\n .selectIcon {\n margin: 0;\n padding-left: 4px;\n font-size: 0.8em;\n color: var(--ion-color-medium);\n }\n .selectable {\n cursor: pointer;\n }\n `\n ]\n})\nexport class IDEAOldAttachmentsComponent implements OnInit {\n private _platform = inject(Platform);\n private _loading = inject(IDEALoadingService);\n private _message = inject(IDEAMessageService);\n private _tc = inject(IDEATinCanService);\n private _api = inject(IDEAAWSAPIService);\n _offline = inject(IDEAOfflineService);\n _translate = inject(IDEATranslationsService);\n\n /**\n * The team from which we want to load the resources. Default: try to guess current team.\n */\n @Input() team: string | null = null;\n /**\n * The path to the online API resource, as an array. Don't include the team. E.g. `['entities', entityId]`.\n */\n readonly pathResource = input<string[]>([]);\n /**\n * The array in which we want to add/remove attachments.\n */\n readonly attachments = model<Attachment[] | null>(null);\n /**\n * Regulate the mode (view/edit).\n */\n @Input() editMode = false;\n /**\n * Show errors as reported from the parent component.\n */\n readonly errors = input(new Set<string>());\n /**\n * The lines attribute of the item.\n */\n readonly lines = input('none');\n\n /**\n * URL towards to make API requests, based on the path of the resource.\n */\n requestURL: string;\n /**\n * Stack of errors from the last upload.\n */\n uploadErrors = signal<string[]>([]);\n\n ngOnInit(): void {\n // if the team isn't specified, try to guess it in the usual IDEA's paths\n this.team = this.team || this._tc.get('membership').teamId || this._tc.get('teamId');\n this.requestURL = `teams/${this.team}/`;\n const pathResource = this.pathResource();\n if (pathResource && pathResource.length)\n this.requestURL = this.requestURL.concat(pathResource.filter(x => x).join('/'));\n }\n\n isCapacitor(): boolean {\n return this._platform.is('capacitor');\n }\n\n hasFieldAnError(field: string): boolean {\n return this.errors().has(field);\n }\n\n browseFiles(): void {\n document.getElementById('attachmentPicker').click();\n }\n addAttachmentFromFile(ev: any): void {\n this.uploadErrors.set(new Array<string>());\n const files: FileList = ev.target ? ev.target.files : {};\n for (let i = 0; i < files.length; i++) {\n const file = files.item(i);\n const fullName = file.name.split('.');\n const format = fullName.pop();\n const name = fullName.join('.');\n this.addAttachment(name, format, file);\n }\n }\n async takePictureAndAttach(ev: Event): Promise<void> {\n if (ev) ev.stopPropagation();\n if (!this._platform.is('capacitor') || !Camera) return;\n const image = await Camera.getPhoto({\n quality: 90,\n allowEditing: false,\n source: CameraSource.Camera,\n resultType: CameraResultType.Base64\n });\n const filename = new Date().toISOString();\n const content = this.base64toBlob(image.base64String, 'image/jpeg');\n this.addAttachment(filename, image.format, content);\n }\n private base64toBlob(base64str: string, type: string): Blob {\n const binary = atob(base64str);\n const array = [];\n for (let i = 0; i < binary.length; i++) array.push(binary.charCodeAt(i));\n return new Blob([new Uint8Array(array)], { type });\n }\n private async addAttachment(name: string, format: string, content: any): Promise<void> {\n if (format === FileFormatTypes.HEIC) {\n format = FileFormatTypes.JPEG;\n content = await heic2any({ blob: content, toType: 'image/jpeg' });\n }\n const attachment = new Attachment({ name, format });\n this.attachments.update(list => [...(list ?? []), attachment]);\n try {\n const signedURL = await this._api.patchResource(this.requestURL, {\n body: { action: 'ATTACHMENTS_PUT', attachmentId: attachment.attachmentId }\n });\n await this._api.rawRequest().put(signedURL.url, content).toPromise();\n attachment.attachmentId = signedURL.id;\n // set a fresh array reference so the upload result (attachmentId) re-renders\n this.attachments.update(list => (list ? [...list] : list));\n } catch (error) {\n this.uploadErrors.update(errors => [...errors, name]);\n this.removeAttachment(attachment);\n this._message.error('IDEA_TEAMS.ATTACHMENTS.ERROR_UPLOADING_ATTACHMENT', {\n requestId: (error as IDEAApiError).requestId\n });\n }\n }\n\n hideUploadError(err: string): void {\n this.uploadErrors.update(errors => errors.filter(e => e !== err));\n }\n\n removeAttachment(attachment: Attachment): void {\n this.attachments.update(list => (list ? list.filter(att => att !== attachment) : list));\n }\n\n async openAttachment(attachment: Attachment): Promise<void> {\n try {\n await this._loading.show();\n const { url } = await this._api.patchResource(this.requestURL, {\n body: { action: 'ATTACHMENTS_GET', attachmentId: attachment.attachmentId }\n });\n await Browser.open({ url });\n } catch (error) {\n this._message.error('IDEA_TEAMS.ATTACHMENTS.ERROR_OPENING_ATTACHMENT', {\n requestId: (error as IDEAApiError).requestId\n });\n } finally {\n this._loading.hide();\n }\n }\n\n getFormatIcon(format: string): string {\n switch (format) {\n case FileFormatTypes.JPG:\n case FileFormatTypes.JPEG:\n case FileFormatTypes.PNG:\n return 'image';\n case FileFormatTypes.PDF:\n return 'document';\n default:\n return 'help';\n }\n }\n}\n\n/**\n * The possibile file types (formats).\n */\nenum FileFormatTypes {\n JPG = 'jpg',\n JPEG = 'jpeg',\n PNG = 'png',\n PDF = 'pdf',\n HEIC = 'heic'\n}\n","import { Component, OnInit, inject, signal, model, ChangeDetectionStrategy } from '@angular/core';\nimport { IonCard, IonCardContent, IonButton } from '@ionic/angular/standalone';\nimport { Announcement, mdToHtml } from 'idea-toolbox';\nimport { IDEAEnvironment, IDEAStorageService, IDEATranslatePipe } from '@idea-ionic/common';\n\nimport { IDEATinCanService } from '../tinCan.service';\n\n/**\n * Announcement card that can be set in any interface to show the alert for this project.\n */\n@Component({\n selector: 'idea-announcement',\n imports: [IDEATranslatePipe, IonButton, IonCardContent, IonCard],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (htmlContent()) {\n <ion-card class=\"announcementCard\" [color]=\"color()\">\n <ion-card-content>\n <p class=\"htmlContent\" [innerHTML]=\"htmlContent()\"></p>\n <p class=\"ion-text-right\">\n <ion-button color=\"primary\" (click)=\"markAsRead()\">\n {{ 'COMMON.GOT_IT' | translate }}\n </ion-button>\n </p>\n </ion-card-content>\n </ion-card>\n }\n `\n})\nexport class IDEAAnnouncementComponent implements OnInit {\n protected _env = inject(IDEAEnvironment);\n private _tc = inject(IDEATinCanService);\n private _storage = inject(IDEAStorageService);\n\n /**\n * The color for the announcement card.\n */\n color = model<string>('dark');\n\n announcement: Announcement;\n htmlContent = signal<string>(null);\n storageKey: string;\n\n constructor() {\n this.storageKey = (this._env.idea.project || 'app').concat('_LAST_ANNOUNCEMENT');\n }\n async ngOnInit(): Promise<void> {\n // standard IDEA: the announcement is read in the Init Guard\n this.announcement = this._tc.get('idea-announcement');\n if (this.announcement && this.announcement.content) {\n const lastRead: string = await this._storage.get(this.storageKey);\n if (!lastRead || this.announcement.content !== lastRead)\n this.htmlContent.set(mdToHtml(this.announcement.content));\n }\n }\n\n async markAsRead(): Promise<void> {\n await this._storage.set(this.storageKey, this.announcement.content);\n this.htmlContent.set(null);\n }\n}\n","import { Component, inject, ChangeDetectionStrategy, output, input, Input } from '@angular/core';\nimport {\n PopoverController,\n IonItem,\n IonButton,\n IonIcon,\n IonLabel,\n IonText,\n IonAvatar,\n IonContent,\n IonGrid,\n IonRow,\n IonCol\n} from '@ionic/angular/standalone';\nimport { Color, COLORS } from 'idea-toolbox';\n\n/**\n * Pick a color from a defined set.\n */\n@Component({\n selector: 'idea-color-picker',\n imports: [IonAvatar, IonText, IonLabel, IonIcon, IonButton, IonItem],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ion-item\n class=\"colorPickerItem\"\n [color]=\"color()\"\n [lines]=\"lines()\"\n [button]=\"!disabled()\"\n [title]=\"placeholder() || ''\"\n [class.withLabel]=\"label()\"\n (click)=\"openPalette($event)\"\n >\n @if (icon()) {\n <ion-button fill=\"clear\" slot=\"start\" [color]=\"iconColor()\" (click)=\"doIconSelect($event)\">\n <ion-icon [name]=\"icon()\" slot=\"icon-only\" />\n </ion-button>\n }\n @if (label()) {\n <ion-label [class.selectable]=\"!disabled()\">\n {{ label() }}\n @if (obligatory() && !disabled()) {\n <ion-text class=\"obligatoryDot\" />\n }\n </ion-label>\n }\n <ion-avatar slot=\"end\" class=\"colorCircle\" [style.background-color]=\"current()\" />\n @if (!disabled()) {\n <ion-icon slot=\"end\" name=\"caret-down\" class=\"selectIcon\" [class.selectable]=\"!disabled()\" />\n }\n </ion-item>\n `,\n styles: [\n `\n .colorPickerItem {\n min-height: 48px;\n height: auto;\n .placeholder {\n color: var(--ion-color-medium);\n }\n .selectIcon {\n margin: 0;\n padding-left: 4px;\n font-size: 0.8em;\n color: var(--ion-color-medium);\n }\n }\n .selectItem.withLabel {\n min-height: 58px;\n height: auto;\n .selectIcon {\n padding-top: 25px;\n }\n ion-button[slot='start'] {\n margin-top: 16px;\n }\n }\n .selectable {\n cursor: pointer;\n }\n ion-avatar.colorCircle {\n width: 20px;\n height: 20px;\n }\n `\n ]\n})\nexport class IDEAColorPickerComponent {\n /**\n * The pickable colors.\n */\n readonly colors = input<Color[]>(COLORS);\n /**\n * The current color.\n */\n readonly current = input<string>();\n /**\n * The label for the field.\n */\n readonly label = input<string>();\n /**\n * A placeholder for the field.\n */\n readonly placeholder = input<string>();\n /**\n * The icon for the field.\n */\n readonly icon = input<string>();\n /**\n * The color of the icon.\n */\n readonly iconColor = input<string>();\n /**\n * If true, the component is disabled.\n */\n readonly disabled = input<boolean>();\n /**\n * If true, the obligatory dot is shown.\n */\n readonly obligatory = input<boolean>();\n /**\n * Lines preferences for the item.\n */\n readonly lines = input<string>();\n /**\n * The color for the component.\n */\n readonly color = input<string>();\n /**\n * On select event.\n */\n readonly select = output<string>();\n /**\n * Icon select.\n */\n readonly iconSelect = output<void>();\n\n private _popover = inject(PopoverController);\n\n async openPalette(event: any): Promise<void> {\n if (this.disabled()) return;\n\n const componentProps = { colors: this.colors(), current: this.current() };\n const popover = await this._popover.create({ component: ColorsPaletteComponent, componentProps, event });\n popover.onDidDismiss().then(res => {\n if (res && res.data) this.select.emit(res.data);\n });\n popover.present();\n }\n\n doIconSelect(event: any): void {\n if (event) event.stopPropagation();\n this.iconSelect.emit(event);\n }\n}\n\n/**\n * Component to open in a popover for displaying the colors available.\n */\n@Component({\n selector: 'idea-colors-palette',\n imports: [IonContent, IonGrid, IonRow, IonCol, IonAvatar, IonIcon],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ion-content>\n <ion-grid>\n <ion-row>\n @for (c of colors; track c) {\n <ion-col [size]=\"2\">\n <ion-avatar\n class=\"colorCircle tappable\"\n [style.background-color]=\"c.hex\"\n [title]=\"c.name || c.hex\"\n (click)=\"pick(c.hex)\"\n >\n @if (c.hex === current) {\n <ion-icon name=\"checkmark\" />\n }\n </ion-avatar>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n </ion-content>\n `,\n styles: [\n `\n ion-content {\n --background: var(--ion-color-white);\n }\n ion-avatar.colorCircle {\n width: 20px;\n height: 20px;\n }\n .tappable {\n cursor: pointer;\n }\n ion-avatar.colorCircle ion-icon {\n color: white;\n font-size: 1.2em;\n }\n `\n ]\n})\nexport class ColorsPaletteComponent {\n private _popover = inject(PopoverController);\n\n /**\n * The pickable colors.\n */\n @Input() colors?: Color[];\n /**\n * The current color.\n */\n @Input() current?: string;\n\n pick(color: string): void {\n this._popover.dismiss(color);\n }\n}\n","import { Component, inject, ChangeDetectionStrategy, input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AlertController, IonItem, IonButton, IonIcon, IonInput } from '@ionic/angular/standalone';\nimport { Contacts } from 'idea-toolbox';\nimport { IDEATranslatePipe, IDEATranslationsService } from '@idea-ionic/common';\n\n@Component({\n selector: 'idea-contacts',\n imports: [FormsModule, IDEATranslatePipe, IonInput, IonIcon, IonButton, IonItem],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"contacts\">\n @if (showName()) {\n <ion-item [lines]=\"lines()\" [color]=\"color()\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.CONTACTS.NAME' | translate\"\n [disabled]=\"!editMode()\"\n [placeholder]=\"'IDEA_UNCOMMON.CONTACTS.NAME_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.NAME_HINT' | translate\"\n [(ngModel)]=\"contacts().name\"\n />\n </ion-item>\n }\n <ion-item [lines]=\"lines()\" [color]=\"color()\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.CONTACTS.PHONE' | translate\"\n [disabled]=\"!editMode()\"\n [placeholder]=\"'IDEA_UNCOMMON.CONTACTS.PHONE_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.PHONE_HINT' | translate\"\n [(ngModel)]=\"contacts().phone\"\n />\n @if (!editMode()) {\n <ion-button\n slot=\"end\"\n fill=\"clear\"\n color=\"dark\"\n class=\"marginTop\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.CALL' | translate\"\n (click)=\"call()\"\n >\n <ion-icon name=\"call\" slot=\"icon-only\" />\n </ion-button>\n }\n </ion-item>\n <ion-item [lines]=\"lines()\" [color]=\"color()\">\n <ion-input\n autocomplete=\"new\"\n labelPlacement=\"stacked\"\n [label]=\"'IDEA_UNCOMMON.CONTACTS.EMAIL' | translate\"\n [disabled]=\"!editMode()\"\n [placeholder]=\"'IDEA_UNCOMMON.CONTACTS.EMAIL_HINT' | translate\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.EMAIL_HINT' | translate\"\n [(ngModel)]=\"contacts().email\"\n />\n @if (!editMode()) {\n <ion-button\n slot=\"end\"\n fill=\"clear\"\n color=\"dark\"\n class=\"marginTop\"\n [title]=\"'IDEA_UNCOMMON.CONTACTS.SEND_EMAIL' | translate\"\n (click)=\"sendEmail()\"\n >\n <ion-icon name=\"mail\" slot=\"icon-only\" />\n </ion-button>\n }\n </ion-item>\n </div>\n `,\n styles: [\n `\n .marginTop {\n margin-top: 14px;\n }\n `\n ]\n})\nexport class IDEAContactsComponent {\n private _alert = inject(AlertController);\n private _translate = inject(IDEATranslationsService);\n\n /**\n * The contacts to manage.\n */\n readonly contacts = input<Contacts>(new Contacts());\n /**\n * If true, show the field `name`.\n */\n readonly showName = input(false);\n /**\n * Whether the fields are editable or disabled.\n */\n readonly editMode = input(true);\n /**\n * The lines attribute of the item.\n */\n readonly lines = input<string>();\n /**\n * The color for the component.\n */\n readonly color = input<string>();\n\n sendEmail(): void {\n const contacts = this.contacts();\n if (!contacts.email) return;\n const url = `mailto:${contacts.email}`;\n this.preExternalAction(contacts.email, (): Window => window.open(url, '_system'));\n }\n call(): void {\n const contacts = this.contacts();\n if (!contacts.phone) return;\n const url = `tel:${contacts.phone}`;\n this.preExternalAction(contacts.phone, (): Window => window.open(url, '_system'));\n }\n\n private preExternalAction(message: string, cb: () => void): void {\n const header = this._translate._('COMMON.DO_YOU_WANT_TO_PROCEED');\n const buttons = [\n { text: this._translate._('COMMON.CANCEL') },\n { text: this._translate._('COMMON.CONFIRM'), handler: (): void => cb() }\n ];\n const cssClass = 'selectableAlertMessage';\n this._alert.create({ header, message, buttons, cssClass }).then(alert => alert.present());\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnInit, inject, ChangeDetectionStrategy, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n AlertController,\n ModalController,\n IonHeader,\n IonToolbar,\n IonTitle,\n IonButtons,\n IonButton,\n IonIcon,\n IonGrid,\n IonContent,\n IonRow,\n IonCol,\n IonInput,\n IonFooter\n} from '@ionic/angular/standalone';\nimport { epochDateTime, epochISOString } from 'idea-toolbox';\nimport { IDEALocalizedDatePipe, IDEATranslatePipe, IDEATranslationsService } from '@idea-ionic/common';\n\n/**\n * A random sunday, used as reference to calculate the week days.\n */\nconst SUNDAY = 259200000;\n\n@Component({\n selector: 'idea-calendar-picker',\n imports: [\n CommonModule,\n FormsModule,\n IDEATranslatePipe,\n IDEALocalizedDatePipe,\n IonFooter,\n IonInput,\n IonCol,\n IonRow,\n IonContent,\n IonGrid,\n IonIcon,\n IonButton,\n IonButtons,\n IonTitle,\n IonToolbar,\n IonHeader\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: 'calendarPicker.component.html',\n styleUrls: ['calendarPicker.component.scss']\n})\nexport class IDEACalendarPickerComponent implements OnInit {\n private _modal = inject(ModalController);\n private _alert = inject(AlertController);\n private _translate = inject(IDEATranslationsService);\n\n @Input() inputDate?: epochDateTime | epochISOString;\n @Input() timePicker = false;\n @Input() manualTimePicker = false;\n @Input() title?: string;\n @Input() hideClearButton = false;\n @Input() min?: epochDateTime | epochISOString;\n @Input() max?: epochDateTime | epochISOString;\n\n refDate = signal<Date>(undefined);\n selectedDate: Date;\n today: Date;\n calendarGrid = signal<Date[][]>(undefined);\n hour: number;\n minute: number;\n hours: string[];\n minutes: string[];\n weekDays: string[];\n dateMin: Date;\n dateMax: Date;\n\n ngOnInit(): void {\n this.today = new Date();\n const inputDate = this.inputDate;\n this.refDate.set(inputDate ? new Date(inputDate) : new Date(this.today));\n this.selectedDate = new Date(this.refDate());\n this.hour = 12; // to endure timezones\n this.minute = 0;\n const manualTimePicker = this.manualTimePicker;\n if (this.timePicker || manualTimePicker) {\n this.hour = this.selectedDate.getHours();\n if (manualTimePicker) this.minute = this.selectedDate.getMinutes();\n else {\n // round the minutes a multiple of 5\n this.minute = Math.ceil(this.selectedDate.getMinutes() / 5) * 5;\n this.selectedDate.setMinutes(this.minute);\n }\n }\n this.buildCalendarGrid(this.refDate());\n this.hours = Array.from(Array(24).keys()).map(i => '0'.concat(i.toString()).slice(-2));\n this.minutes = Array.from(Array(12).keys()).map(i => '0'.concat((i * 5).toString()).slice(-2));\n // build the weekdays based on the current locale\n this.weekDays = new Array<string>();\n const refDateForWeekDays = new Date(SUNDAY);\n refDateForWeekDays.setDate(refDateForWeekDays.getDate() - this.getLocalisedDay(refDateForWeekDays));\n for (let i = 0; i < 7; i++) {\n this.weekDays.push(refDateForWeekDays.toLocaleDateString(this._translate.getCurrentLang(), { weekday: 'short' }));\n refDateForWeekDays.setDate(refDateForWeekDays.getDate() + 1);\n }\n const min = this.min;\n if (min) this.dateMin = new Date(min);\n const max = this.max;\n if (max) this.dateMax = new Date(max);\n }\n\n getLocalisedDay(date: Date): number {\n let n = date.getDay();\n switch (this._translate.getCurrentLang()) {\n case 'it':\n n = --n < 0 ? 6 : n;\n break;\n }\n return n;\n }\n\n buildCalendarGrid(refDate: Date): void {\n // find the first day in the month: the important data here is the day of the week\n const firstDateOfMonth = new Date(refDate.getFullYear(), refDate.getMonth(), 1);\n // the following flag is used to divide the logic so I can fill the calendar\n // also with the dates from the previous month, until there's space in the grid\n let haventFoundFirstDay = true;\n // index used to build the dates of the month, starting from the first one\n let index = 1;\n const calendarGrid = new Array<Date[]>();\n for (let i = 0; i < 6; i++) {\n calendarGrid[i] = new Array<Date>();\n for (let j = 0; j < 7; j++) {\n if (haventFoundFirstDay) {\n if (this.getLocalisedDay(firstDateOfMonth) === j) {\n // note: considers Sunday\n haventFoundFirstDay = false;\n calendarGrid[i][j] = new Date(firstDateOfMonth);\n // now the I've found the first date of the month I can fill the calendar\n // the dates fromt the previous month, until there's space in the grid\n for (let y = this.getLocalisedDay(firstDateOfMonth); y >= 0; y--) {\n const d = new Date(firstDateOfMonth);\n d.setDate(firstDateOfMonth.getDate() - y);\n calendarGrid[i][this.getLocalisedDay(firstDateOfMonth) - y] = d;\n }\n }\n } else {\n // fill the following dates until there's space in the grid\n const d = new Date(firstDateOfMonth);\n d.setDate(firstDateOfMonth.getDate() + index++);\n calendarGrid[i][j] = d;\n }\n }\n }\n this.calendarGrid.set(calendarGrid);\n }\n\n addYears(offset: number): void {\n this.refDate.update(d => {\n const refDate = new Date(d);\n refDate.setFullYear(refDate.getFullYear() + offset);\n return refDate;\n });\n this.buildCalendarGrid(this.refDate());\n }\n setYear(year: string | number): void {\n if (!year) return;\n\n this.refDate.update(d => {\n const refDate = new Date(d);\n refDate.setFullYear(Number(year));\n return refDate;\n });\n this.buildCalendarGrid(this.refDate());\n }\n addMonths(offset: number): void {\n this.refDate.update(d => {\n const refDate = new Date(d);\n refDate.setMonth(refDate.getMonth() + offset);\n return refDate;\n });\n this.buildCalendarGrid(this.refDate());\n }\n async showMonths(): Promise<void> {\n const buttons = [];\n const inputs: any[] = [];\n const month = new Date(0);\n for (let i = 1; i <= 12; i++) {\n inputs.push({\n type: 'radio',\n label: month.toLocaleDateString(this._translate.getCurrentLang(), { month: 'long' }),\n value: i.toString(),\n checked: i === this.refDate().getMonth() + 1\n });\n month.setMonth(month.getMonth() + 1);\n }\n buttons.push({ text: this._translate._('COMMON.CANCEL'), role: 'cancel' });\n buttons.push({\n text: this._translate._('COMMON.SELECT'),\n handler: (m: string): void => {\n this.refDate.update(d => {\n const refDate = new Date(d);\n refDate.setMonth(parseInt(m, 10) - 1);\n return refDate;\n });\n this.buildCalendarGrid(this.refDate());\n }\n });\n\n const alert = await this._alert.create({\n header: this._translate._('IDEA_UNCOMMON.CALENDAR.MONTH'),\n buttons,\n inputs\n });\n alert.present();\n }\n\n isDateSelectable(date: Date): boolean {\n if (this.dateMin && date < this.dateMin) return false;\n if (this.dateMax && date > this.dateMax) return false;\n return true;\n }\n\n selectDate(date: Date): void {\n this.selectedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), this.hour, this.minute);\n }\n\n selectHour(hour: string): void {\n this.hour = Number(hour);\n this.selectedDate.setHours(this.hour);\n }\n selectMinute(minute: string): void {\n this.minute = Number(minute);\n this.selectedDate.setMinutes(this.minute);\n }\n\n isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n }\n isSameMonth(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();\n }\n\n isSameHour(hour: string): boolean {\n return this.selectedDate.getHours() === Number(hour);\n }\n isSameMinute(minute: string): boolean {\n return this.selectedDate.getMinutes() === Number(minute);\n }\n\n save(reset?: boolean): void {\n this._modal.dismiss(reset ? '' : this.selectedDate);\n }\n close(): void {\n this._modal.dismiss();\n }\n}\n","<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-title>{{ title }}</ion-title>\n <ion-buttons slot=\"end\">\n @if (!hideClearButton) {\n <ion-button [title]=\"'IDEA_UNCOMMON.CALENDAR.RESET' | translate\" (click)=\"save(true)\">\n <ion-icon slot=\"icon-only\" name=\"arrow-undo\" />\n </ion-button>\n }\n <ion-button [title]=\"'IDEA_UNCOMMON.CALENDAR.CLOSE_WITHOUT_SAVING' | translate\" (click)=\"close()\">\n <ion-icon slot=\"icon-only\" name=\"close\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <ion-grid fixed class=\"ion-no-padding\">\n <ion-row>\n <h1 class=\"headerLabel\">{{ 'IDEA_UNCOMMON.CALENDAR.SET_DATE' | translate }}</h1>\n </ion-row>\n <ion-row style=\"margin-bottom: 8px\">\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"5\">\n <ion-row class=\"ion-align-items-center ion-justify-content-center\">\n <ion-col class=\"ion-text-right ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addYears(-1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-back\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding tappable\" [size]=\"6\">\n <ion-input\n type=\"text\"\n [placeholder]=\"'IDEA_UNCOMMON.CALENDAR.YEAR' | translate\"\n [value]=\"refDate().getFullYear()\"\n (ionFocus)=\"$event.target.value = ''\"\n (ionChange)=\"setYear($event?.target?.value)\"\n >\n </ion-input>\n </ion-col>\n <ion-col class=\"ion-text-left ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addYears(+1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-forward\" />\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"7\">\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-right ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addMonths(-1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-back\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding tappable\" [size]=\"6\" (click)=\"showMonths()\">\n {{ refDate() | dateLocale: 'MMMM' }}\n </ion-col>\n <ion-col class=\"ion-text-left ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addMonths(+1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-forward\" />\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-col>\n </ion-row>\n <ion-row style=\"margin-bottom: 8px\" class=\"headerLabel\">\n @for (ddd of weekDays; track ddd) {\n <ion-col class=\"ion-text-center ion-no-padding\">\n {{ ddd }}\n </ion-col>\n }\n </ion-row>\n @for (row of calendarGrid(); track row; let i = $index) {\n <ion-row class=\"ion-align-items-center\">\n @for (col of row; track col; let j = $index) {\n <ion-col class=\"ion-text-center ion-no-padding\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"\n isSameDay(calendarGrid()[i][j], today) || isSameDay(calendarGrid()[i][j], selectedDate)\n ? 'primary'\n : isSameMonth(calendarGrid()[i][j], refDate())\n ? 'dark'\n : 'medium'\n \"\n [fill]=\"\n isSameDay(calendarGrid()[i][j], selectedDate)\n ? 'solid'\n : isSameDay(calendarGrid()[i][j], today)\n ? 'outline'\n : 'clear'\n \"\n [disabled]=\"!isDateSelectable(calendarGrid()[i][j])\"\n (click)=\"selectDate(calendarGrid()[i][j])\"\n >\n {{ calendarGrid()[i][j] | date: 'd' }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n }\n @if (timePicker || manualTimePicker) {\n <ion-row>\n <h1 class=\"headerLabel\">\n {{ 'IDEA_UNCOMMON.CALENDAR.SET_TIME' | translate }}\n </h1>\n </ion-row>\n }\n @if (timePicker) {\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-no-padding\" [size]=\"7\">\n <ion-row>\n @for (hour of hours; track hour) {\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"2\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"isSameHour(hour) ? 'primary' : 'dark'\"\n [fill]=\"isSameHour(hour) ? 'solid' : 'clear'\"\n (click)=\"selectHour(hour)\"\n >\n {{ hour }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"1\"> : </ion-col>\n <ion-col class=\"ion-no-padding\" [size]=\"4\">\n <ion-row>\n @for (minute of minutes; track minute) {\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"4\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"isSameMinute(minute) ? 'primary' : 'dark'\"\n [fill]=\"isSameMinute(minute) ? 'solid' : 'clear'\"\n (click)=\"selectMinute(minute)\"\n >\n {{ minute }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n </ion-col>\n </ion-row>\n }\n @if (manualTimePicker) {\n <ion-row class=\"ion-align-items-center manualTimePicker\">\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <input type=\"number\" min=\"0\" max=\"23\" [value]=\"hour\" (change)=\"selectHour($event.target.value)\" />\n <span>:</span>\n <input type=\"number\" min=\"0\" max=\"59\" [value]=\"minute\" (change)=\"selectMinute($event.target.value)\" />\n </ion-col>\n </ion-row>\n }\n </ion-grid>\n</ion-content>\n<ion-footer>\n <ion-toolbar color=\"ideaToolbar\" class=\"tappable\" (click)=\"save()\">\n <ion-title class=\"ion-text-center\">\n <ion-icon name=\"checkmark\" />\n </ion-title>\n </ion-toolbar>\n</ion-footer>\n","import {\n Component,\n SimpleChanges,\n OnInit,\n OnDestroy,\n OnChanges,\n inject,\n ChangeDetectionStrategy,\n output,\n input,\n signal\n} from '@angular/core';\nimport { ModalController, IonItem, IonButton, IonIcon, IonLabel, IonText } from '@ionic/angular/standalone';\nimport { Subscription } from 'rxjs';\nimport { epochDateTime, epochISOString } from 'idea-toolbox';\nimport { IDEATranslationsService } from '@idea-ionic/common';\n\nimport { IDEACalendarPickerComponent } from './calendarPicker.component';\n\n@Component({\n selector: 'idea-date-time',\n imports: [IonText, IonLabel, IonIcon, IonButton, IonItem],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ion-item\n class=\"dateTimeItem\"\n [color]=\"color()\"\n [lines]=\"lines()\"\n [title]=\"placeholder() || label() || ''\"\n [button]=\"!disabled()\"\n [disabled]=\"isOpening()\"\n [class.withLabel]=\"label()\"\n (click)=\"openCalendarPicker()\"\n >\n @if (icon()) {\n <ion-button\n fill=\"clear\"\n slot=\"start\"\n [color]=\"iconColor()\"\n [class.marginTop]=\"label()\"\n (click)=\"doIconSelect($event)\"\n >\n <ion-icon [icon]=\"icon()\" slot=\"icon-only\" />\n </ion-button>\n }\n @if (label()) {\n <ion-label position=\"stacked\" [class.selectable]=\"!disabled()\">\n {{ label() }}\n @if (obligatory() && !disabled()) {\n <ion-text class=\"obligatoryDot\" />\n }\n </ion-label>\n }\n <ion-label class=\"value\" [class.selectable]=\"!disabled()\">\n @if (!valueToDisplay() && !disabled()) {\n <ion-text class=\"placeholder\" [class.selectable]=\"!disabled()\">\n {{ placeholder() }}\n </ion-text>\n }\n {{ valueToDisplay() }}\n </ion-label>\n @if (!disabled()) {\n <ion-icon slot=\"end\" icon=\"caret-down\" class=\"selectIcon\" [class.selectable]=\"!disabled()\" />\n }\n </ion-item>\n `,\n styles: [\n `\n .dateTimeItem {\n min-height: 48px;\n height: auto;\n .description {\n margin: 10px 0;\n height: 20px;\n line-height: 20px;\n width: 100%;\n }\n .placeholder {\n color: var(--ion-color-medium);\n }\n .value {\n white-space: nowrap;\n }\n .selectIcon {\n margin: 0;\n padding-left: 4px;\n font-size: 0.8em;\n color: var(--ion-color-medium);\n }\n }\n .dateTimeItem.withLabel {\n min-height: 58px;\n height: auto;\n .selectIcon {\n padding-top: 25px;\n }\n ion-button[slot='start'] {\n margin-top: 16px;\n }\n }\n .selectable {\n cursor: pointer;\n }\n `\n ]\n})\nexport class IDEADateTimeComponent implements OnInit, OnDestroy, OnChanges {\n private _modal = inject(ModalController);\n private _translate = inject(IDEATranslationsService);\n\n /**\n * The date to show/pick.\n */\n readonly date = input<epochDateTime | epochISOString>();\n /**\n * Whether to show the time picker (datetime) or not (date).\n */\n readonly timePicker = input(false);\n /**\n * Whether to show the MANUAL time picker (datetime) or not (date).\n */\n readonly manualTimePicker = input(false);\n /**\n * Whether to use the `epochISOString` format instead of `epochDateTime`.\n */\n readonly useISOFormat = input(false);\n /**\n * The label for the field.\n */\n readonly label = input<string>();\n /**\n * The icon for the field.\n */\n readonly icon = input<string>();\n /**\n * The color of the icon.\n */\n readonly iconColor = input<string>();\n /**\n * Lines preferences for the item.\n */\n readonly lines = input<string>();\n /**\n * The color for the component.\n */\n readonly color = input<string>();\n /**\n * A placeholder for the field.\n */\n readonly placeholder = input<string>();\n /**\n * If true, the component is disabled.\n */\n readonly disabled = input(false);\n /**\n * If true, the obligatory dot is shown.\n */\n readonly obligatory = input(false);\n /**\n * If true, hidew the clear button in the header.\n */\n readonly hideClearButton = input(false);\n /**\n * If set, is the minimum date selectable.\n */\n readonly min = input<epochDateTime | epochISOString>();\n /**\n * If set, is the maximum date selectable.\n */\n readonly max = input<epochDateTime | epochISOString>();\n\n readonly dateChange = output<epochDateTime | epochISOString | null | any>();\n readonly iconSelect = output<void>();\n\n valueToDisplay = signal<string>('');\n private langChangeSubscription: Subscription;\n\n isOpening = signal(false);\n\n ngOnInit(): void {\n this.langChangeSubscription = this._translate.onLangChange.subscribe((): void => {\n this.valueToDisplay.set(this.getValueToDisplay(this.date()));\n });\n }\n ngOnDestroy(): void {\n if (this.langChangeSubscription) this.langChangeSubscription.unsubscribe();\n }\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.date || changes.timePicker) this.valueToDisplay.set(this.getValueToDisplay(this.date()));\n }\n\n async openCalendarPicker(): Promise<void> {\n if (this.disabled() || this.isOpening()) return;\n this.isOpening.set(true);\n const modal = await this._modal.create({\n component: IDEACalendarPickerComponent,\n componentProps: {\n inputDate: this.date(),\n title: this.label(),\n timePicker: this.timePicker(),\n manualTimePicker: this.manualTimePicker(),\n hideClearButton: this.hideClearButton(),\n min: this.min(),\n max: this.max()\n }\n });\n modal.onDidDismiss().then(({ data }): void => {\n if (data !== undefined && data !== null) {\n if (data === '') this.doSelect(null);\n else this.doSelect(data as Date);\n }\n });\n modal.present();\n this.isOpening.set(false);\n }\n\n private getValueToDisplay(date: epochDateTime | epochISOString): string {\n return !date\n ? ''\n : this._translate.formatDate(\n date,\n this.timePicker() || this.manualTimePicker() ? 'd MMM yyyy, HH:mm' : 'mediumDate'\n );\n }\n\n doSelect(date: Date): void {\n this.dateChange.emit(date ? (this.useISOFormat() ? date.toISOString() : date.valueOf()) : null);\n }\n doIconSelect(event: Event): void {\n if (event) event.stopPropagation();\n this.iconSelect.emit();\n }\n}\n","import { Component, Input, SimpleChanges, OnChanges, ChangeDetectionStrategy, output, input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { IonItem, IonIcon, IonLabel, IonText } from '@ionic/angular/standalone';\nimport { IDEATranslatePipe } from '@idea-ionic/common';\n\n@Component({\n selector: 'idea-duration',\n imports: [IonText, IonLabel, IonIcon, IonItem, FormsModule, IDEATranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ion-item class=\"durationItem\" [lines]=\"lines()\" [color]=\"color()\" [title]=\"title() || label\">\n @if (icon) {\n <ion-icon slot=\"start\" [name]=\"icon\" />\n }\n @if (!icon && label) {\n <ion-label position=\"stacked\">\n {{ label }}\n @if (obligatory() && !disabled()) {\n <ion-text class=\"obligatoryDot\" />\n }\n </ion-label>\n }\n <ion-label class=\"value\">\n <ion-input\n type=\"number\"\n min=\"0\"\n max=\"23\"\n inputmode=\"numeric\"\n [disabled]=\"disabled()\"\n [(ngModel)]=\"hours\"\n (ionChange)=\"setDuration('hours')\"\n />\n <ion-text>{{\n ((shortLabels() ? 'IDEA_UNCOMMON.DURATION.HH' : 'IDEA_UNCOMMON.DURATION.HOURS') | translate).toLowerCase()\n }}</ion-text>\n <ion-input\n type=\"number\"\n min=\"0\"\n max=\"59\"\n inputmode=\"numeric\"\n [disabled]=\"disabled()\"\n [(ngModel)]=\"minutes\"\n (ionChange)=\"setDuration('minutes')\"\n />\n <ion-text>{{\n ((shortLabels() ? 'IDEA_UNCOMMON.DURATION.MM' : 'IDEA_UNCOMMON.DURATION.MINUTES') | translate).toLowerCase()\n }}</ion-text>\n @if (!hideSeconds()) {\n <ion-input\n type=\"number\"\n min=\"0\"\n max=\"59\"\n inputmode=\"numeric\"\n [disabled]=\"disabled()\"\n [(ngModel)]=\"seconds\"\n (ionChange)=\"setDuration('seconds')\"\n />\n }\n @if (!hideSeconds()) {\n <ion-text>\n {{\n (\n (shortLabels() ? 'IDEA_UNCOMMON.DURATION.SS' : 'IDEA_UNCOMMON.DURATION.SECONDS') | translate\n ).toLowerCase()\n }}\n </ion-text>\n }\n </ion-label>\n </ion-item>\n `,\n styles: [\n `\n .durationItem {\n .value {\n max-width: none;\n width: 100%;\n pointer-events: all;\n ion-input {\n display: inline-block;\n max-width: 35px;\n text-align: right;\n }\n ion-text {\n margin-left: 10px;\n margin-right: 20px;\n font-size: 0.8em;\n }\n }\n }\n `\n ]\n})\nexport class IDEADurationComponent implements OnChanges {\n /**\n * The default number of seconds, to build the duration.\n */\n @Input() default: number;\n /**\n * The label for the field.\n */\n @Input() label: string;\n /**\n * The icon (alternative to the label) for the field.\n */\n @Input() icon: string;\n /**\n * The title (hint) for the field.\n */\n readonly title = input<string>();\n /**\n * If true, the component is disabled.\n */\n readonly disabled = input<boolean>();\n /**\n * If true, the obligatory dot is shown.\n */\n readonly obligatory = input<boolean>();\n /**\n * Lines preferences for the item.\n */\n readonly lines = input<string>();\n /**\n * The color for the component.\n */\n readonly color = input<string>();\n /**\n * Whether to show or hide the seconds input.\n */\n readonly hideSeconds = input<boolean>();\n /**\n * Whether to show a shortened version of the labels.\n */\n readonly shortLabels = input<boolean>();\n /**\n * On change event. It emits a number of seconds representing the duration.\n */\n readonly set = output<number>();\n\n /**\n * The hour part of the duration.\n */\n hours: number;\n /**\n * The minutes part of the duration.\n */\n minutes: number;\n /**\n * The seconds part of the duration.\n */\n seconds: number;\n\n constructor() {\n this.default = this.hours = this.minutes = this.seconds = 0;\n }\n ngOnChanges(changes: SimpleChanges): void {\n // assign a default value to the duration\n if (changes['default'] && changes['default'].isFirstChange()) {\n const refDate = new Date(0);\n refDate.setHours(0, 0, 0);\n refDate.setSeconds(refDate.getSeconds() + this.default);\n this.hours = refDate.getHours();\n this.minutes = refDate.getMinutes();\n this.seconds = this.hideSeconds() ? 0 : refDate.getSeconds();\n }\n }\n\n /**\n * When one of the parts changes, emit the new duration.\n */\n setDuration(type: string): void {\n switch (type) {\n case 'hours':\n const hh = Number(this.hours) || 0;\n this.hours = hh > 23 ? 23 : hh < 0 ? 0 : hh;\n break;\n case 'minutes':\n const mm = Number(this.minutes) || 0;\n this.minutes = mm > 59 ? 59 : mm < 0 ? 0 : mm;\n break;\n case 'seconds':\n const ss = Number(this.seconds) || 0;\n if (this.hideSeconds()) this.seconds = 0;\n else this.seconds = ss > 59 ? 59 : ss < 0 ? 0 : ss;\n break;\n }\n this.set.emit(this.hours * 3600 + this.minutes * 60 + this.seconds);\n }\n}\n","import { Component, OnInit, inject, signal, ChangeDetectionStrategy } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport {\n IonContent,\n IonCard,\n IonImg,\n IonCardHeader,\n IonCardTitle,\n IonIcon,\n IonCardContent\n} from '@ionic/angular/standalone';\nimport { ExternalCalendarSources, mdToHtml } from 'idea-toolbox';\nimport { IDEAEnvironment, IDEALoadingService, IDEATranslatePipe, IDEATranslationsService } from '@idea-ionic/common';\n\nimport { IDEAAWSAPIService } from '../AWSAPI.service';\nimport { IDEATinCanService } from '../tinCan.service';\n\n@Component({\n selector: 'idea-echo',\n imports: [IDEATranslatePipe, IonCardContent, IonIcon, IonCardTitle, IonCardHeader, IonImg, IonCard, IonContent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ion-content>\n <div class=\"flexBox\">\n <ion-card class=\"echoCard maxWidthContainer\">\n <ion-img [src]=\"'assets/icons/icon-auth.svg'\" />\n <ion-card-header>\n <ion-card-title>\n @if (success() === true) {\n <ion-icon testId=\"echoSuccess\" color=\"success\" name=\"checkmark\" />\n }\n @if (success() === false) {\n <ion-icon testId=\"echoFailure\" color=\"danger\" name=\"close\" />\n }\n </ion-card-title>\n </ion-card-header>\n <ion-card-content class=\"selectable\">\n {{ content() }}\n @if (htmlContent()) {\n <div class=\"htmlContent\" [innerHTML]=\"htmlContent()\"></div>\n }\n @if (success() === false || success() === true) {\n <p class=\"youCanCloseMe\">\n <i>{{ 'IDEA_UNCOMMON.ECHO.YOU_CAN_CLOSE_THE_PAGE' | translate }}</i>\n </p>\n }\n </ion-card-content>\n </ion-card>\n </div>\n </ion-content>\n `,\n styles: [\n `\n .echoCard {\n min-width: 300px;\n padding: 30px 20px;\n text-align: center;\n ion-img {\n width: 80px;\n display: block;\n margin: 0 auto;\n }\n ion-icon {\n font-size: 1.8em;\n }\n ion-card-content {\n margin-bottom: 20px;\n font-size: 1.2em;\n p.youCanCloseMe {\n margin-top: 12px;\n }\n }\n }\n `\n ]\n})\nexport class IDEAEchoPage implements OnInit {\n protected _env = inject(IDEAEnvironment);\n private _route = inject(ActivatedRoute);\n private _tc = inject(IDEATinCanService);\n private _loading = inject(IDEALoadingService);\n private _API = inject(IDEAAWSAPIService);\n private _translate = inject(IDEATranslationsService);\n\n content = signal<string>(undefined);\n htmlContent = signal<string>(undefined);\n success = signal<boolean>(undefined);\n\n ngOnInit(): void {\n const request: EchoRequests =\n this._route.snapshot.paramMap.get('request') || this._route.snapshot.queryParams.request;\n const code: string = this._route.snapshot.queryParams.code;\n const user: string = decodeURIComponent(this._route.snapshot.queryParams.user);\n const state: string = this._route.snapshot.queryParams.state;\n switch (request) {\n case EchoRequests.MAINTENANCE:\n this.maintenanceMode();\n break;\n case EchoRequests.REGISTRATION:\n this.followRegistrationLink(code, user);\n break;\n case EchoRequests.INVITATION:\n this.followInvitationLink(code);\n break;\n case EchoRequests.EMAIL_CHANGE:\n this.followEmailChangeConfirmationLink(code);\n break;\n case EchoRequests.GITHUB_INTEGRATION:\n this.endGitHubIntegrationFlow(code === 'done');\n break;\n case EchoRequests.TRELLO_INTEGRATION:\n this.endTrelloIntegrationFlow(code);\n break;\n case EchoRequests.MICROSOFT_CALENDARS_INTEGRATION:\n this.endExternalCalendarsIntegrationFlow(ExternalCalendarSources.MICROSOFT, code, state);\n break;\n case EchoRequests.GOOGLE_CALENDARS_INTEGRATION:\n this.endExternalCalendarsIntegrationFlow(ExternalCalendarSources.GOOGLE, code, state);\n break;\n default:\n this.success.set(false);\n this.content.set(this._translate._('IDEA_UNCOMMON.ECHO.INVALID_ACTION'));\n break;\n }\n }\n\n maintenanceMode(): void {\n const announcement = this._tc.get('idea-announcement');\n if (announcement && announcement.content) this.htmlContent.set(mdToHtml(announcement.content));\n }\n\n async followRegistrationLink(code: string, user: string): Promise<void> {\n try {\n await this._loading.show();\n await this._API.postResource('cognito2', {\n idea: true,\n body: {\n action: 'CONFIRM_SIGN_UP',\n username: user,\n confirmationCode: code,\n cognitoUserPoolClientId: this._env.aws.cognito.userPoolClientId\n }\n });\n this.success.set(true);\n this.content.set(this._translate._('IDEA_UNCOMMON.ECHO.ACCOUNT_CONFIRMED'));\n } catch (error) {\n this.success.set(false);\n this.content.set(this._translate._('IDEA_UNCOMMON.ECHO.REQUEST_FAILED'));\n } finally {\n this._loading.hide();\n }\n }\n async followInvitationLink(code: string): Promise<void> {\n try {\n await this._loading.show();\n await this._API.getResource('invitations', { idea: true, resourceId: code });\n this.success.set(true);\n this.content.set(this._translate._('IDEA_UNCOMMON.ECHO.TEAM_JOINED'));\n } catch (error) {\n this.success.set(false);\n this.content.set(this._translate._('IDEA_UNCOMMON.ECHO.REQUEST_FAILED'));\n } finally {\n this._loading.hide();\n }\n }\n async followEmailChangeConfirmationLink(code: string): Promise<void> {\n try {\n await this._loading.show();\n await this._API.getResource('emailChangeRequests', {\n idea: true,\n resourceId: code,\n params: { project: this._env.idea.project }\n });\n this.success.set(true);\n this.content.set(this._translate._('IDEA_UNCOMMON.ECHO.EMAIL_CHANGED'));\n } catch (error) {\n this.success.set(false);\n this.content.set(this._translate._('IDEA_UNCOMMON.ECHO.REQUEST_FAILED'));\n } finally {\n this._loading.hide();\n }\n }\n endGitHubIntegrationFlow(success: boolean): void {\n this.success.set(success);\n this.content.set(\n success\n ? this._translate._('IDEA_UNCOMMON.ECHO.GITHUB_SOURCE_INTEGRATION_SUCCESS')\n : this._translate._('IDEA_UNCOMMON.ECHO.GITHUB_SOURCE_INTEGRATION_ERROR')\n );\n }\n endTrelloIntegrationFlow(token: string): void {\n this.success.set(Boolean(token));\n this.content.set(\n token\n ? this._translate._('IDEA_UNCOMMON.ECHO.TRELLO_SOURCE_INTEGRATION_SUCCESS', { token })\n : this._translate._('IDEA_UNCOMMON.ECHO.TRELLO_SOURCE_INTEGRATION_ERROR')\n );\n }\n async endExternalCalendarsIntegrationFlow(\n service: ExternalCalendarSources,\n code: string,\n calendarId: string\n ): Promise<void> {\n try {\n await this._loading.show();\n await this._API.patchResource('calendars', {\n idea: true,\n body: { action: 'SET_EXTERNAL_INTEGRATION', service, code, calendarId, project: this._env.idea.project }\n });\n this.success.set(true);\n this.content.set(this._translate._('IDEA_UNCOMMON.ECHO.EXTERNAL_CALENDARS_SOURCE_INTEGRATION_SUCCESS'));\n } catch (error) {\n this.success.set(false);\n this.content.set(this._translate._('IDEA_UNCOMMON.ECHO.EXTERNAL_CALENDARS_SOURCE_INTEGRATION_ERROR'));\n } finally {\n this._loading.hide();\n }\n }\n}\n\nexport enum EchoRequests {\n MAINTENANCE = 'maintenance',\n REGISTRATION = 'registration',\n INVITATION = 'invitation',\n EMAIL_CHANGE = 'email-change',\n GITHUB_INTEGRATION = 'github-integration',\n TRELLO_INTEGRATION = 'trello-integration',\n MICROSOFT_CALENDARS_INTEGRATION = 'microsoft-calendars-integration',\n GOOGLE_CALENDARS_INTEGRATION = 'google-calendars-integration'\n}\n","import { Routes } from '@angular/router';\n\nimport { IDEAEchoPage } from './echo.page';\n\nexport const ideaEchoRoutes: Routes = [\n { path: '', component: IDEAEchoPage },\n { path: ':request', component: IDEAEchoPage }\n];\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { IDEATranslatePipe } from '@idea-ionic/common';\n\n@Component({\n selector: 'idea-mde-toolbar',\n imports: [IDEATranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"mdeToolbar\">\n <b>**{{ 'IDEA_UNCOMMON.MDE.TOOLBAR.BOLD' | translate }}**</b>\n <i>*{{ 'IDEA_UNCOMMON.MDE.TOOLBAR.ITALIC' | translate }}*</i>\n ~{{ 'IDEA_UNCOMMON.MDE.TOOLBAR.STRIKE' | translate }}~\n </div>\n `,\n styles: [\n `\n .mdeToolbar {\n text-align: right;\n color: #aaa;\n padding: 5px 0;\n font-size: 0.9em;\n b,\n i {\n padding-right: 5px;\n }\n }\n `\n ]\n})\nexport class IDEAMDEToolbarComponent {}\n","import { Component, Input, OnInit, inject, ChangeDetectionStrategy, input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n ModalController,\n IonHeader,\n IonToolbar,\n IonButtons,\n IonButton,\n IonIcon,\n IonTitle,\n IonContent,\n IonText,\n IonTextarea\n} from '@ionic/angular/standalone';\nimport { IDEATranslatePipe } from '@idea-ionic/common';\n\nimport { IDEAMDEToolbarComponent } from './mdeToolbar.component';\n\n@Component({\n selector: 'idea-mde',\n imports: [\n FormsModule,\n IDEATranslatePipe,\n IDEAMDEToolbarComponent,\n IonTextarea,\n IonText,\n IonContent,\n IonTitle,\n IonIcon,\n IonButton,\n IonButtons,\n IonToolbar,\n IonHeader\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n <ion-button [title]=\"'IDEA_UNCOMMON.MDE.CLOSE_WITHOUT_SAVING' | translate\" (click)=\"close()\">\n <ion-icon name=\"close\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n <ion-title>\n {{ title() || ('IDEA_UNCOMMON.MDE.TITLE' | translate) }}\n </ion-title>\n <ion-buttons slot=\"end\">\n <ion-button [title]=\"'IDEA_UNCOMMON.MDE.SAVE_AND_CLOSE' | translate\" (click)=\"confirm()\">\n <ion-icon name=\"checkmark\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n @if (header) {\n <h2 class=\"header\">\n {{ header }}\n </h2>\n }\n @if (description) {\n <p class=\"description\">\n {{ description }}\n </p>\n }\n @if (variables?.length) {\n <p class=\"variables\">\n <b> {{ 'IDEA_UNCOMMON.MDE.VARIABLES' | translate }}: </b>\n @for (v of variables; track v) {\n <ion-text>\n {{ v.concat(' ') }}\n </ion-text>\n }\n </p>\n }\n <ion-textarea rows=\"12\" [id]=\"id\" [placeholder]=\"placeholder()\" [(ngModel)]=\"value\" />\n <idea-mde-toolbar />\n </ion-content>\n `,\n styles: [\n `\n ion-content {\n --ion-background-color: #f4f4f4;\n }\n h2.header {\n margin: 0;\n font-size: 0.7em;\n font-weight: bold;\n text-transform: uppercase;\n }\n .description {\n margin-top: 5px;\n margin-bottom: 20px;\n font-size: 0.9em;\n }\n .variables {\n margin: 10px 5px;\n font-size: 0.8em;\n }\n ion-textarea {\n --background: var(--ion-color-white);\n padding: 10px;\n }\n `\n ]\n})\nexport class IDEAMDEComponent implements OnInit {\n private _modal = inject(ModalController);\n\n /**\n * Id to identify this specific Markdown Editor (default: 'mde').\n */\n @Input() id: string;\n /**\n * The title of the modal.\n */\n readonly title = input<string>();\n /**\n * The header text content.\n */\n @Input() header: string;\n /**\n * The sub-header description.\n */\n @Input() description: string;\n /**\n * A series of text variables to substitute with values.\n */\n @Input() variables: string[];\n /**\n * If set, will customize the initial value of the editor.\n */\n readonly initialValue = input<string>();\n /**\n * Custom placeholder that should be displayed.\n */\n readonly placeholder = input<string>();\n\n value: string;\n\n ngOnInit(): void {\n this.id = this.id || 'mde';\n this.variables = this.variables || new Array<string>();\n this.value = this.initialValue();\n }\n\n close(): void {\n this._modal.dismiss();\n }\n confirm(): void {\n this._modal.dismiss(this.value);\n }\n}\n","import { Injectable, inject, signal } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { Delta, DeltaRecord, DeltaResources, epochDateTime } from 'idea-toolbox';\nimport { IDEAStorageService, IDEATranslationsService } from '@idea-ionic/common';\n\nimport { IDEAAWSAPIService, APIRequestOption } from '../AWSAPI.service';\nimport { IDEAOfflineService } from './offline.service';\n\n/**\n * After how much time we need to request a synchronisation to keep the contents up-to-date.\n */\nexport const SYNC_EXPIRATION_INTERVAL = 1000 * 60 * 60 * 24; // a day\n/**\n * Prefix for the key of the API requests queue info in the local storage.\n */\nexport const QUEUE_API_REQUESTS_KEY = 'IDEAOfflineService.queueAPIrequests';\n/**\n * Prefix for the key of the last sync time info in the local storage.\n */\nexport const LAST_SYNC_KEY = 'IDEAOfflineService.lastSyncAt';\n/**\n * The max number of elements per resource to synchronize during the first analysis of a synchronisation.\n * If the number of elements exceeds (there is more data after the 1st page), the operation require manual confirmation.\n */\nexport const NUM_ELEMENTS_WITHOUT_MANUAL_SYNC = 100;\n/**\n * The max number of elements per resource to request at the same time during a normal synchronisation.\n */\nexport const NUM_ELEMENTS_WITH_MANUAL_SYNC = 300;\n\n/**\n * Manage the offline functioning of the app's data (upload/download/synchronization).\n * Note: it includes all the methods of IDEAOfflineService.\n *\n * Download: it works through the **Delta** mechanism on back-end resources.\n * Practically, the service prepares each possible API GET requests for each of the involved resources.\n * In this way, if offline, the API service can hit an element by URL in the cache (storage offline).\n *\n * **How to use it**. Configure the sync mechanism in the main app.component as it follows:\n *\n * 1. Implement a CacheableResource class for each DeltaResource you want to cache offline.\n * 2. Set up the service (`setUpOfflineData`).\n * 3. Run a synchronization.\n * 4. Add the navigation to the Offline Manager (UI).\n * 5. Optionally, push offline API requests to the queue when offline.\n *\n * e.g. of CacheableResource classes:\n * ```\n * class CustomerCR extends CacheableResource {\n * constructor(description: string) {\n * super(DeltaResources.CUSTOMERS, description);\n * }\n * public listURL(element: any): string {\n * return `teams/${element.teamId}/customers`;\n * }\n * public elementURL(element: any): string {\n * return `teams/${element.teamId}/customers/${element.customerId}`;\n * }\n * public findIndexInList(list: Array<any>, element: any): number {\n * return list.findIndex(x => x.customerId === element.customerId);\n * }\n * public sort(a: any, b: any): number {\n * return a.name.localeCompare(b.name);\n * }\n * }\n */\n@Injectable({ providedIn: 'root' })\nexport class IDEAOfflineDataService {\n protected _storage = inject(IDEAStorageService);\n protected _translate = inject(IDEATranslationsService);\n protected _offline = inject(IDEAOfflineService);\n protected _API = inject(IDEAAWSAPIService);\n\n /**\n * True when running a synchronization.\n */\n synchronizing = signal<boolean>(undefined);\n /**\n * The timestamp of the last synchronization.\n */\n lastSyncAt = signal<epochDateTime>(undefined);\n /**\n * True if an error happened in the last synchronization.\n */\n errorInLastSync = signal<boolean>(undefined);\n /**\n * True if the synchronisation is too vast and so require a manual action of the user.\n */\n requiresManualConfirmation = signal<boolean>(undefined);\n /**\n * If false, ignore the entire upload scenario.\n */\n useQueueAPIRequests: boolean;\n /**\n * The array of the requests not executed because we are/were offline; they need to run once online.\n */\n queueAPIRequests: APIRequest[];\n\n /**\n * The id of the team of which to manage data offline.\n * If null, the project isn't teams-based.\n */\n protected teamId: string;\n /**\n * The array of DeltaResources to cache offline.\n */\n protected resources: (DeltaResources | string)[];\n /**\n * Helper structure to manage the CacheableResource for each DeltaResource.\n */\n protected cacheableResources: { [resource: string]: CacheableResource };\n /**\n * Key to acquire from the storage the lastSyncAt information of the team.\n */\n protected lastSyncKey: string;\n /**\n * Key to acquire from the storage the lastSyncAt information of the team.\n */\n protected queueAPIRequestKey: string;\n\n constructor() {\n this.queueAPIRequests = new Array<APIRequest>();\n this.resources = new Array<string>();\n this.cacheableResources = {};\n // subscribe to network changes\n this._offline.subscribe(isOnline => {\n if (isOnline) {\n // try a synchronization if needed or if the last one failed\n if (this.errorInLastSync()) this.synchronize();\n else this.synchronizeIfNeeded();\n }\n });\n }\n\n //\n // NETWORK STATUS from IDEAOfflineService\n //\n\n /**\n * Quickly check the connection status.\n */\n isOnline(): boolean {\n return this._offline.isOnline();\n }\n /**\n * Quickly check the connection status.\n */\n isOffline(): boolean {\n return this._offline.isOffline();\n }\n /**\n * Subscribe to the service to be notified when the connection status changes.\n */\n subscribe(callback: (isOnline: boolean) => void): Subscription {\n return this._offline.subscribe(callback);\n }\n /**\n * Quickly check for online connection.\n */\n public check(): Promise<boolean> {\n return this._offline.check();\n }\n\n //\n // CONFIGURATION\n //\n\n /**\n * Whether the offline mode is allowed. You can customize this function, if needed.\n */\n isAllowed(): boolean {\n return !!this.resources.length;\n }\n /**\n * Set up the service to use and sync offline data.\n */\n setUpOfflineData(teamId: string, useQueueAPIRequests: boolean, cacheableResources: CacheableResource[]): void {\n // set the team\n this.teamId = teamId;\n // decide if to allow certain API request while offline\n this.useQueueAPIRequests = useQueueAPIRequests;\n // load the API request pending queue, if any\n this.queueAPIRequestKey = this.teamId ? `${QUEUE_API_REQUESTS_KEY}_${this.teamId}` : QUEUE_API_REQUESTS_KEY;\n this.loadQueueAPIRequest();\n // load the lastSyncAt information for the team\n this.lastSyncKey = this.teamId ? `${LAST_SYNC_KEY}_${this.teamId}` : LAST_SYNC_KEY;\n this.loadLastSyncAt();\n // load the cacheable resources\n this.resources = new Array<DeltaResources | string>();\n this.cacheableResources = {};\n cacheableResources.forEach(r => this.addCacheableResource(r));\n }\n /**\n * Load from the local storage the last sync at information.\n */\n protected loadLastSyncAt(): Promise<number> {\n return new Promise(resolve => {\n this._storage.get(this.lastSyncKey).then((lastSyncAt: number): void => {\n this.lastSyncAt.set(lastSyncAt ? Number(lastSyncAt) : null);\n resolve(this.lastSyncAt());\n });\n });\n }\n /**\n * Update last sync at info in the local storage.\n */\n protected saveLastSyncAt(lastSyncAt: number): Promise<void> {\n this.lastSyncAt.set(lastSyncAt);\n return this._storage.set(this.lastSyncKey, lastSyncAt);\n }\n /**\n * Add a CacheableResource.\n */\n protected addCacheableResource(cacheableResource: CacheableResource): void {\n if (this.teamId) cacheableResource.teamId = this.teamId;\n this.cacheableResources[cacheableResource.resource] = cacheableResource;\n this.resources.push(cacheableResource.resource);\n }\n /**\n * Remove a CacheableResource by its DeltaResource.\n */\n protected removeCacheableResource(resource: DeltaResources | string): void {\n delete this.cacheableResources[resource];\n this.resources.splice(this.resources.indexOf(resource), 1);\n }\n /**\n * Get the the DeltaResourced configured.\n */\n getResources(): (DeltaResources | string)[] {\n return this.resources;\n }\n /**\n * Get a CacheableResource by its DeltaResource.\n */\n getCacheableResource(resource: DeltaResources | string): CacheableResource {\n return this.cacheableResources[resource];\n }\n\n //\n // UPLOAD\n //\n\n /**\n * Execute all the API requests in the queue; the requests terminated with an error will remain in the queue.\n */\n protected runQueueAPIRequests(): Promise<void> {\n return new Promise((resolve, reject): void => {\n if (!this.useQueueAPIRequests || this.isOffline() || !this.queueAPIRequests.length) return resolve();\n this.queueAPIRequests.forEach(async request => {\n const options: APIRequestOption = {};\n if (request.resourceId) options.resourceId = request.resourceId;\n if (request.body) options.body = request.body;\n let promise: Promise<any>;\n try {\n switch (request.method.toUpperCase()) {\n case 'POST':\n promise = await this._API.postResource(request.resource, options);\n break;\n case 'PUT':\n promise = await this._API.putResource(request.resource, options);\n break;\n case 'PATCH':\n promise = await this._API.patchResource(request.resource, options);\n break;\n }\n if (!promise) request.error = 'INVALID_METHOD';\n else request.error = null;\n } catch (err) {\n request.error = (err as Error).message || 'UNKNOWN_ERROR';\n }\n });\n // keep the requests NOT successfully executed\n this.saveQueueAPIRequest(this.queueAPIRequests.filter(x => x.error)).then((): void => {\n // if the queue is empty, the entire operation was successful\n if (this.queueAPIRequests.length) reject();\n else resolve();\n });\n });\n }\n /**\n * Load from the local storage the API requests queue.\n */\n protected loadQueueAPIRequest(): Promise<APIRequest[]> {\n return new Promise(resolve => {\n if (!this.useQueueAPIRequests) return resolve([]);\n this._storage.get(this.queueAPIRequestKey).then((queue: APIRequest[]): void => {\n this.queueAPIRequests = queue || [];\n resolve(this.queueAPIRequests);\n });\n });\n }\n /**\n * Update the queue in memory and also save the copy in the local storage.\n */\n saveQueueAPIRequest(queue?: APIRequest[]): Promise<void> {\n if (!this.isAllowed()) return Promise.reject();\n this.queueAPIRequests = queue || this.queueAPIRequests;\n return this._storage.set(this.queueAPIRequestKey, this.queueAPIRequests);\n }\n /**\n * Delete a request stuck in an error.\n */\n deleteRequest(request: APIRequest) {\n if (!this.isAllowed()) return Promise.reject();\n if (request) {\n this.queueAPIRequests.splice(this.queueAPIRequests.indexOf(request), 1);\n this.saveQueueAPIRequest();\n }\n }\n\n //\n // DOWNLOAD\n //\n\n /**\n * Save the records of a delta and, if the latter has more pages, go recursive.\n */\n protected async syncDeltaRecords(delta: Delta, done?: any): Promise<any> {\n // for each resource, we reset the status; if a resource still need to be synchronized, it will be flagged below\n this.resources.forEach(resource => {\n this.cacheableResources[resource].error = false;\n this.cacheableResources[resource].synchronizing = false;\n });\n try {\n // synchronze each of the resources included in the delta; this execution can go in parallel\n await Promise.all(\n delta.resources.map(async resource => {\n const cr = this.cacheableResources[resource];\n if (cr) {\n // synchronize the delta records; note: the executuion inside a resource must go in series\n cr.synchronizing = true;\n const success = await this.syncResourceDeltaRecords(resource, delta.records[resource]);\n if (!success) this.errorInLastSync.set(true);\n }\n })\n );\n // if there were error of if there is nothing left to sync, we are done\n if (this.errorInLastSync() || !delta.next) return done();\n // otherwise, get the next page of the delta and go recursive until we are done\n const params: any = { next: delta.next, limit: NUM_ELEMENTS_WITH_MANUAL_SYNC };\n if (this.lastSyncAt()) params.since = this.lastSyncAt();\n const newDelta = await this._API.getResource(this.teamId ? `teams/${this.teamId}/delta` : 'delta', { params });\n this.syncDeltaRecords(newDelta, done);\n } catch (err) {\n // if something went wrong, stops the operation, since we need to make sure the entire flow is consistent\n this.errorInLastSync.set(true);\n return done();\n }\n }\n /**\n * Save offline a list of DeltaRecords for this resource, creating a map of all the corresponding API GET requests.\n */\n protected async syncResourceDeltaRecords(resource: string, records: DeltaRecord[]): Promise<boolean> {\n // acquire the info an a cacheable resource\n const cr = this.cacheableResources[resource];\n if (!cr) return Promise.resolve(true);\n try {\n // prepare helpers to group executions of elements of the same list\n let list: any[] = null,\n oldListURL: string = null;\n for (const r of records) {\n // calculate the URL to access the API request key for this element\n const elementURL = cr.elementURL(r.element);\n // if the element was deleted (based on delta), delete its corresponding API GET request\n if (r.deleted) await this._API.deleteFromCache(elementURL);\n // otherwise, update it\n else await this._API.putInCache(elementURL, r.element);\n // calculate the URLs to access the API request key for this element's list\n const listURL = cr.listURL(r.element);\n // to improve the performance, get/sort/save the list only when it changes from the previous element's one.\n if (listURL !== oldListURL) {\n // skip first cycle (oldListURL === null)\n if (oldListURL) {\n // re-sort the list; note: it should be sorted from the last time, so we only manage the new element\n list = list.sort(cr.sort);\n // save the updated list\n await this._API.putInCache(oldListURL, list);\n }\n // get the list of elements from the local storage by the calculated URL\n list = await this._API.getFromCache(listURL);\n // save the reference to the list for the next cycle\n oldListURL = listURL;\n }\n // find in the list the element we want to manage\n const index = cr.findIndexInList(list, r.element);\n // delete the element from the list\n if (index !== -1) list.splice(index, 1);\n // if the element wasn't deleted (following the delta record information), insert the new version\n if (!r.deleted) list.push(r.element);\n }\n // in case there were elements, save the last element's list\n if (oldListURL) {\n // re-sort the list; note: it should be sorted from the last time, so we only manage the new element\n list = list.sort(cr.sort);\n // save the updated list\n await this._API.putInCache(oldListURL, list);\n }\n return Promise.resolve(true);\n } catch (err) {\n // if something went wrong, stops the operation, since we need to make sure the entire flow is consistent\n cr.error = true;\n return Promise.resolve(false);\n }\n }\n\n //\n // SYNCHRONISATION (UPLOAD+DOWNLOAD)\n //\n\n /**\n * Run a sync, but only if needed, i.e. the cached content expired or we have pending API requests in the queue.\n */\n synchronizeIfNeeded(): Promise<void> {\n return new Promise((resolve, reject): void => {\n if (!this.isAllowed()) return;\n this.loadLastSyncAt().then(\n (): Promise<void> =>\n this.loadQueueAPIRequest()\n .then((): void => {\n if (this.queueAPIRequests.length || Date.now() > this.lastSyncAt() + SYNC_EXPIRATION_INTERVAL)\n this.synchronize();\n resolve();\n })\n .catch(err => reject(err))\n );\n });\n }\n /**\n * Synchronization of the whole set of resources (upload+download).\n * @param manualConfirmation if true, the request comes directly from a user action (not automatic procedures).\n */\n synchronize(manualConfirmation?: boolean): Promise<void> {\n return new Promise((resolve, reject): void => {\n if (!this.isAllowed() || this.synchronizing()) return resolve();\n this.synchronizing.set(true);\n this.errorInLastSync.set(false);\n this.requiresManualConfirmation.set(false);\n // load the lastSyncAt information\n this.loadLastSyncAt().then(\n (): Promise<void> =>\n // try to run all the pending API requests in the queue, i.e. uploading the offline resources changed\n this.runQueueAPIRequests()\n .then((): void => {\n // set this moment in time: if anything happened before the end of the sync, we don't lose fresh data\n const now = Date.now();\n // prepare a first \"short\" Delta request, to see if there is a lot of data to process\n const params: any = { limit: NUM_ELEMENTS_WITHOUT_MANUAL_SYNC };\n if (this.lastSyncAt()) params.since = this.lastSyncAt();\n this._API\n .getResource(this.teamId ? `teams/${this.teamId}/delta` : 'delta', { params })\n .then((delta: Delta): void => {\n // decide if to proceed with the sync: in case there is another page, it requires a manual confirmation\n if (delta.next && !manualConfirmation) {\n this.requiresManualConfirmation.set(true);\n this.synchronizing.set(false);\n return resolve();\n }\n // save the records in the delta and request possible new pages\n this.syncDeltaRecords(delta, (): void => {\n if (this.errorInLastSync()) {\n this.synchronizing.set(false);\n resolve();\n } else {\n // all the resources are succesfully in sync\n this.resources.forEach(resource => (this.cacheableResources[resource].synchronizing = false));\n // update the timestamp of last sync\n this.saveLastSyncAt(now)\n .then((): void => {\n this.synchronizing.set(false);\n resolve();\n })\n .catch((): void => {\n // we couldn't save the last sync info\n this.errorInLastSync.set(true);\n this.synchronizing.set(false);\n reject();\n });\n }\n });\n })\n .catch((): void => {\n // we couldn't acquire new information (Delta)\n this.errorInLastSync.set(true);\n this.synchronizing.set(false);\n reject();\n });\n })\n .catch((): void => {\n // we stop, since we don't want backend data to override local info not yet uploaded\n this.errorInLastSync.set(true);\n this.synchronizing.set(false);\n reject();\n })\n );\n });\n }\n /**\n * Force a full synchronisation.\n */\n forceFullSync(): void {\n this._storage.clear().then((): Promise<void> => this.synchronize(true));\n }\n}\n\n/**\n * The description of an API request to a resource, to use with `IDEAAWSAPI`.\n * Used for queues of requests (UPLOAD).\n */\nexport interface APIRequest {\n /**\n * Resource path (e.g. `users` or `teams/${teamId}/users`).\n */\n resource: string;\n /**\n * The id to identify a specific element of the resource.\n */\n resourceId: string;\n /**\n * The API request method (e.g. POST, PUT, PATCH).\n */\n method: string;\n /**\n * The body of the request.\n */\n body: any;\n /**\n * A description to show for the request.\n */\n description?: string;\n /**\n * If not null, the request tried to run but it encountered the error.\n */\n error?: string;\n}\n\n/**\n * The abstract class to implement for each resource to cache offline from the back-end (DOWNLOAD).\n */\nexport abstract class CacheableResource {\n /**\n * The team owning the resource.\n * If null, the project isn't teams-based.\n */\n teamId: string;\n /**\n * The identifier of the resource.\n */\n resource: DeltaResources | string;\n /**\n * The resource description (translated) for the UI.\n */\n description: string;\n /**\n * Runtime attribute to know if the resource is synchronizing.\n */\n synchronizing: boolean;\n /**\n * True if one of the elements failed the execution.\n */\n error: boolean;\n\n constructor(resource: string, description: string) {\n this.resource = resource;\n this.description = description;\n this.synchronizing = false;\n this.error = false;\n // loaded at runtime\n this.teamId = null;\n }\n\n /**\n * How to build the relative URL to the resource (list).\n * E.g. `teams/${element.teamId}/customers` or `customers`.\n */\n abstract listURL(element: any): string;\n /**\n * How to build the relative URL to the resource element (detail).\n * E.g. `teams/${element.teamId}/customers/${element.customerId}` or `customers/${element.customerId}`.\n */\n abstract elementURL(element: any): string;\n /**\n * How to uniquely identify an element in the list (by its ids).\n * E.g. `return list.findIndex(x => x.customerId === element.customerId);`\n */\n abstract findIndexInList(list: any[], element: any): number;\n /**\n * How to keep the list sorted.\n * E.g. `return a.name.localeCompare(b.name);`\n */\n abstract sort(a: any, b: any): number;\n}\n","import { Component, inject, ChangeDetectionStrategy, input } from '@angular/core';\nimport { IonItem, IonLabel, IonIcon, IonSpinner } from '@ionic/angular/standalone';\n\nimport { IDEAOfflineDataService, CacheableResource } from './offlineData.service';\n\n@Component({\n selector: 'idea-cacheable-resource',\n imports: [IonSpinner, IonIcon, IonLabel, IonItem],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ion-item class=\"cacheableResourceItem\">\n <ion-label>{{ resource().description }}</ion-label>\n @if (resource().error) {\n <ion-icon slot=\"end\" name=\"alert-circle\" color=\"danger\" />\n }\n @if (!resource().error && _offline.synchronizing() && resource().synchronizing) {\n <ion-spinner slot=\"end\" name=\"dots\" />\n }\n @if (!resource().error && !resource().synchronizing && !_offline.requiresManualConfirmation()) {\n <ion-icon slot=\"end\" name=\"checkmark\" color=\"success\" />\n }\n @if (!resource().error && !resource().synchronizing && _offline.requiresManualConfirmation()) {\n <ion-icon slot=\"end\" name=\"pause\" color=\"dark\" />\n }\n </ion-item>\n `\n})\nexport class IDEACacheableResourceComponent {\n _offline = inject(IDEAOfflineDataService);\n\n /**\n * The resouece to manage.\n */\n readonly resource = input<CacheableResource>();\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, ChangeDetectionStrategy } from '@angular/core';\nimport {\n ModalController,\n AlertController,\n IonHeader,\n IonToolbar,\n IonButton,\n IonIcon,\n IonButtons,\n IonTitle,\n IonContent,\n IonList,\n IonListHeader,\n IonLabel,\n IonText,\n IonItem,\n IonSpinner\n} from '@ionic/angular/standalone';\nimport { Browser } from '@capacitor/browser';\nimport {\n IDEAActionSheetController,\n IDEALocalizedDatePipe,\n IDEATranslatePipe,\n IDEATranslationsService\n} from '@idea-ionic/common';\n\nimport { IDEAOfflineDataService, APIRequest } from './offlineData.service';\nimport { IDEACacheableResourceComponent } from './cacheableResource.component';\n\n@Component({\n selector: 'idea-offline-manager',\n imports: [\n CommonModule,\n IDEATranslatePipe,\n IDEALocalizedDatePipe,\n IDEACacheableResourceComponent,\n IonSpinner,\n IonItem,\n IonText,\n IonLabel,\n IonListHeader,\n IonList,\n IonContent,\n IonTitle,\n IonButtons,\n IonIcon,\n IonButton,\n IonToolbar,\n IonHeader\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: 'offlineManager.component.html',\n styleUrls: ['offlineManager.component.scss']\n})\nexport class IDEAOfflineManagerComponent {\n private _modal = inject(ModalController);\n private _alert = inject(AlertController);\n private _actions = inject(IDEAActionSheetController);\n private _translate = inject(IDEATranslationsService);\n _offline = inject(IDEAOfflineDataService);\n\n async sync(): Promise<void> {\n const alert = await this._alert.create({\n header: this._translate._('IDEA_UNCOMMON.OFFLINE.SYNC_NOW'),\n message: this._translate._('IDEA_UNCOMMON.OFFLINE.DONT_EXIT_APP_DISCLAIMER'),\n buttons: [\n { text: this._translate._('COMMON.CANCEL') },\n { text: this._translate._('COMMON.GOT_IT'), handler: (): Promise<void> => this._offline.synchronize(true) }\n ]\n });\n alert.present();\n }\n\n async deleteRequest(request: APIRequest): Promise<void> {\n const alert = await this._alert.create({\n header: this._translate._('COMMON.ARE_YOU_SURE'),\n message: this._translate._('IDEA_UNCOMMON.OFFLINE.DELETION_IS_IRREVERSIBLE'),\n buttons: [\n { text: this._translate._('COMMON.CANCEL') },\n {\n text: this._translate._('COMMON.CONFIRM'),\n handler: (): Promise<void> => this._offline.deleteRequest(request)\n }\n ]\n });\n alert.present();\n }\n downloadRequestLog(request: APIRequest): void {\n const dataURL = window.URL.createObjectURL(new Blob([JSON.stringify(request)], { type: 'text/json' }));\n Browser.open({ url: dataURL });\n }\n\n async actions(): Promise<void> {\n const buttons = [\n {\n text: this._translate._('IDEA_UNCOMMON.OFFLINE.FORCE_FULL_SYNC'),\n icon: 'sync',\n handler: (): Promise<void> => this.forceFullSync()\n },\n { text: this._translate._('COMMON.CANCEL'), role: 'cancel', icon: 'arrow-undo' }\n ];\n const actions = await this._actions.create({\n header: this._translate._('IDEA_UNCOMMON.OFFLINE.ADVANCED_ACTIONS'),\n buttons\n });\n actions.present();\n }\n\n async forceFullSync(): Promise<void> {\n const alert = await this._alert.create({\n header: this._translate._('IDEA_UNCOMMON.OFFLINE.FORCE_FULL_SYNC'),\n subHeader: this._translate._('COMMON.ARE_YOU_SURE'),\n message: this._translate._('IDEA_UNCOMMON.OFFLINE.FULL_SYNC_DISCLAIMER'),\n buttons: [\n { text: this._translate._('COMMON.CANCEL'), role: 'cancel' },\n { text: this._translate._('COMMON.CONFIRM'), handler: (): void => this._offline.forceFullSync() }\n ]\n });\n alert.present();\n }\n\n close(): void {\n this._modal.dismiss();\n }\n}\n","<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n <ion-button (click)=\"close()\">\n <ion-icon name=\"close\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n <ion-title>\n {{ 'IDEA_UNCOMMON.OFFLINE.OFFLINE_MANAGER' | translate }}\n </ion-title>\n <ion-buttons slot=\"end\">\n <ion-button [title]=\"'IDEA_UNCOMMON.OFFLINE.ADVANCED_ACTIONS' | translate\" (click)=\"actions()\">\n <ion-icon slot=\"icon-only\" name=\"ellipsis-vertical\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <ion-list class=\"aList\">\n @if (!_offline.synchronizing() && _offline.requiresManualConfirmation()) {\n <ion-list-header>\n <ion-label>\n <h2>{{ 'IDEA_UNCOMMON.OFFLINE.HUGE_SYNC_NEED_MANUAL_CONFIRMATION' | translate }}</h2>\n </ion-label>\n </ion-list-header>\n }\n @if (!_offline.synchronizing()) {\n <ion-list-header>\n <ion-label class=\"ion-text-wrap\">\n <h3 class=\"lastSyncAt\">\n {{ 'IDEA_UNCOMMON.OFFLINE.LAST_SYNC' | translate }}:\n <ion-text>\n {{\n _offline.lastSyncAt()\n ? (_offline.lastSyncAt() | dateLocale: 'medium')\n : ('IDEA_UNCOMMON.OFFLINE.NEVER' | translate)\n }}\n </ion-text>\n </h3>\n @if (_offline.errorInLastSync()) {\n <p>\n <ion-text color=\"danger\">\n <b>{{ 'IDEA_UNCOMMON.OFFLINE.ERROR_DURING_LAST_SYNC' | translate }}</b>\n </ion-text>\n </p>\n }\n </ion-label>\n <ion-button\n size=\"small\"\n fill=\"solid\"\n [color]=\"_offline.errorInLastSync() ? 'danger' : 'dark'\"\n [disabled]=\"_offline.isOffline()\"\n (click)=\"sync()\"\n >\n <ion-icon slot=\"start\" name=\"sync\" /> {{ 'IDEA_UNCOMMON.OFFLINE.SYNC_NOW' | translate }}\n </ion-button>\n </ion-list-header>\n }\n </ion-list>\n @if (_offline.synchronizing()) {\n <ion-list class=\"aList\">\n <ion-item>\n <ion-label class=\"ion-text-center\">\n <ion-spinner name=\"crescent\" color=\"primary\" />\n </ion-label>\n </ion-item>\n </ion-list>\n }\n @if (_offline.useQueueAPIRequests) {\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label>\n <h2>{{ 'IDEA_UNCOMMON.OFFLINE.UPLOAD' | translate }}</h2>\n <p>{{ 'IDEA_UNCOMMON.OFFLINE.UPLOAD_QUEUE_REQUESTS_EXPLANATION' | translate }}</p>\n </ion-label>\n </ion-list-header>\n @if (!_offline.queueAPIRequests.length) {\n <ion-item>\n <i>{{ 'IDEA_UNCOMMON.OFFLINE.NO_ELEMENTS_TO_UPLOAD' | translate }}</i>\n <ion-icon slot=\"end\" size=\"small\" name=\"checkmark\" color=\"success\" />\n </ion-item>\n }\n @for (r of _offline.queueAPIRequests; track r; let odd = $odd) {\n <ion-item [class.oddItem]=\"odd\">\n <ion-label class=\"ion-text-wrap\">\n {{ r.description }}\n @if (r.error) {\n <p>\n <ion-text color=\"danger\">\n <b>{{ 'IDEA_UNCOMMON.OFFLINE.ERROR_CODE' | translate }}: {{ r.error }}</b>\n </ion-text>\n <br />\n {{ 'IDEA_UNCOMMON.OFFLINE.REQUEST_FAILED_EXPLANATION_I' | translate }}<br />\n {{ 'IDEA_UNCOMMON.OFFLINE.REQUEST_FAILED_EXPLANATION_II' | translate }}<br />\n {{ 'IDEA_UNCOMMON.OFFLINE.REQUEST_FAILED_EXPLANATION_III' | translate }}\n </p>\n }\n </ion-label>\n @if (r.error) {\n <ion-button\n fill=\"clear\"\n slot=\"end\"\n color=\"danger\"\n [title]=\"'IDEA_UNCOMMON.OFFLINE.CANCEL_REQUEST' | translate\"\n (click)=\"deleteRequest(r)\"\n >\n <ion-icon slot=\"icon-only\" name=\"trash\" />\n </ion-button>\n }\n @if (r.error) {\n <ion-button\n fill=\"clear\"\n slot=\"end\"\n color=\"medium\"\n [title]=\"'IDEA_UNCOMMON.OFFLINE.DOWNLOAD_LOG' | translate\"\n (click)=\"downloadRequestLog(r)\"\n >\n <ion-icon slot=\"icon-only\" name=\"download\" />\n </ion-button>\n }\n @if (_offline.synchronizing()) {\n <ion-spinner slot=\"end\" name=\"dots\" />\n }\n </ion-item>\n }\n </ion-list>\n }\n @if (_offline.getResources().length) {\n <ion-list class=\"aList\">\n <ion-list-header>\n <ion-label>\n <h2>{{ 'IDEA_UNCOMMON.OFFLINE.DOWNLOAD' | translate }}</h2>\n <p>{{ 'IDEA_UNCOMMON.OFFLINE.DOWNLOAD_RESOURCES_EXPLANATION' | translate }}</p>\n </ion-label>\n </ion-list-header>\n @for (r of _offline.getResources(); track r) {\n <idea-cacheable-resource [resource]=\"_offline.getCacheableResource(r)\" />\n }\n </ion-list>\n }\n</ion-content>\n","import { Component, inject, ChangeDetectionStrategy, input } from '@angular/core';\nimport { ModalController, AlertController, Platform, IonFab, IonFabButton, IonIcon } from '@ionic/angular/standalone';\nimport { IDEATranslationsService } from '@idea-ionic/common';\n\nimport { IDEAOfflineManagerComponent } from './offlineManager.component';\nimport { IDEAOfflineDataService } from './offlineData.service';\n\n@Component({\n selector: 'idea-offline-indicator',\n imports: [IonFab, IonFabButton, IonIcon],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (\n _platform.is('mobile') &&\n (_offline.isOffline() || _offline.synchronizing() || _offline.requiresManualConfirmation())\n ) {\n <ion-fab [vertical]=\"vertical()\" [horizontal]=\"horizontal()\" [edge]=\"edge()\">\n <ion-fab-button color=\"dark\" size=\"small\" (click)=\"showStatus()\">\n <!-- OFFLINE -->\n @if (_offline.isOffline()) {\n <ion-icon name=\"airplane\" />\n }\n <!-- SYNCHRONISING -->\n @if (_offline.isOnline() && _offline.synchronizing()) {\n <ion-icon name=\"sync\" />\n }\n <!-- NEED MANAL SYNCHRONISATION -->\n @if (_offline.isOnline() && _offline.requiresManualConfirmation()) {\n <ion-icon name=\"pause\" />\n }\n </ion-fab-button>\n </ion-fab>\n }\n `\n})\nexport class IDEAOfflineIndicatorComponent {\n private _alert = inject(AlertController);\n private _modal = inject(ModalController);\n private _translate = inject(IDEATranslationsService);\n _platform = inject(Platform);\n _offline = inject(IDEAOfflineDataService);\n\n /**\n * Vertical position.\n */\n readonly vertical = input('bottom');\n /**\n * Horizontal position.\n */\n readonly horizontal = input('start');\n /**\n * Whether it is positionated on an edge.\n */\n readonly edge = input(false);\n\n async showStatus(): Promise<void> {\n if (this._offline.isOffline()) {\n const isOnline = await this._offline.check();\n if (!isOnline) {\n const alert = await this._alert.create({\n header: this._translate._('IDEA_UNCOMMON.OFFLINE.YOU_ARE_OFFLINE'),\n message: this._translate._('IDEA_UNCOMMON.OFFLINE.FEATURES_REDUCED_CONTENTS_NOT_UP_TO_DATE'),\n buttons: [this._translate._('COMMON.GOT_IT')]\n });\n alert.present();\n }\n } else if (this._offline.isAllowed()) {\n const modal = await this._modal.create({ component: IDEAOfflineManagerComponent });\n modal.present();\n }\n }\n}\n","import {\n Component,\n OnChanges,\n SimpleChanges,\n inject,\n ChangeDetectionStrategy,\n output,\n input,\n signal\n} from '@angular/core';\nimport { Sentiment } from 'idea-toolbox';\nimport { IonItem, IonSpinner, IonBadge } from '@ionic/angular/standalone';\nimport { IDEAEnvironment, IDEATranslatePipe, IDEATranslationsService } from '@idea-ionic/common';\n\nimport { IDEAAWSAPIService } from '../AWSAPI.service';\nimport { IDEAOfflineService } from '../offline/offline.service';\n\n@Component({\n selector: 'idea-sentiment',\n imports: [IDEATranslatePipe, IonBadge, IonSpinner, IonItem],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (text() && _offline.isOnline()) {\n <ion-item [lines]=\"lines()\" [color]=\"color()\">\n @if (!sentiment()) {\n <ion-spinner slot=\"end\" size=\"small\" />\n }\n @if (sentiment()) {\n <ion-badge\n slot=\"end\"\n size=\"small\"\n [color]=\"getColorBySentiment()\"\n [title]=\"'IDEA_UNCOMMON.SENTIMENT.RESULT_HINT' | translate: { sentiment: sentiment() }\"\n >\n {{ 'IDEA_UNCOMMON.SENTIMENT.RESULT.' + sentiment() | translate }}\n </ion-badge>\n }\n </ion-item>\n }\n `\n})\nexport class IDEASentimentComponent implements OnChanges {\n protected _env = inject(IDEAEnvironment);\n private _API = inject(IDEAAWSAPIService);\n private _translate = inject(IDEATranslationsService);\n _offline = inject(IDEAOfflineService);\n\n /**\n * The sentiment detected from the input text.\n */\n sentiment = signal<Sentiment>(null);\n /**\n * The input text.\n */\n readonly text = input<string>();\n /**\n * Lines preferences for the item.\n */\n readonly lines = input<string>();\n /**\n * The color for the component.\n */\n readonly color = input<string>();\n /**\n * Triggers when the sentiment change.\n */\n readonly change = output<Sentiment>();\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.text.previousValue !== changes.text.currentValue) this.detectSentiment(changes.text.currentValue);\n }\n private async detectSentiment(text: string): Promise<void> {\n if (!text || this._offline.isOffline()) this.sentiment.set(null);\n else {\n try {\n const { sentiment } = await this._API.postResource('sentiment', {\n idea: true,\n body: { project: this._env.idea.project, language: this._translate.getCurrentLang(), text: this.text() }\n });\n this.sentiment.set(sentiment);\n this.change.emit(this.sentiment());\n } catch (error) {\n this.sentiment.set(null);\n }\n }\n }\n\n getColorBySentiment(sentiment?: Sentiment | string): string {\n sentiment = sentiment || this.sentiment();\n switch (sentiment) {\n case Sentiment.POSITIVE:\n return 'success';\n case Sentiment.NEGATIVE:\n return 'danger';\n case Sentiment.MIXED:\n return 'warning';\n case Sentiment.NEUTRAL:\n return 'medium';\n default:\n return 'light';\n }\n }\n}\n","import { Component, Input, OnInit, inject, ChangeDetectionStrategy } from '@angular/core';\nimport {\n ModalController,\n IonHeader,\n IonToolbar,\n IonButtons,\n IonButton,\n IonIcon,\n IonTitle,\n IonContent,\n IonGrid,\n IonRow,\n IonCol,\n IonText,\n IonSegment,\n IonSegmentButton,\n IonLabel\n} from '@ionic/angular/standalone';\nimport { TimeInterval } from 'idea-toolbox';\nimport { IDEATranslatePipe, IDEATranslationsService } from '@idea-ionic/common';\n\n@Component({\n selector: 'idea-from-time-to-time',\n imports: [\n IDEATranslatePipe,\n IonLabel,\n IonSegmentButton,\n IonSegment,\n IonText,\n IonCol,\n IonRow,\n IonGrid,\n IonContent,\n IonTitle,\n IonIcon,\n IonButton,\n IonButtons,\n IonToolbar,\n IonHeader\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: 'fromTimeToTime.component.html',\n styleUrls: ['fromTimeToTime.component.scss']\n})\nexport class IDEAFromTimeToTimeComponent implements OnInit {\n private _modal = inject(ModalController);\n private _translate = inject(IDEATranslationsService);\n\n /**\n * The time interval to set.\n */\n @Input() timeInterval?: TimeInterval;\n /**\n * Whether we should start picking the time displaying the afternoon (PM) or the morning (AM, default).\n */\n @Input() period: Periods = Periods.AM;\n /**\n * A time to use as lower limit for the possible choices.\n */\n @Input() notEarlierThan?: number;\n /**\n * A time to use as upper limit for the possible choices.\n */\n @Input() notLaterThan?: number;\n /**\n * The title of the component.\n */\n @Input() title?: string;\n\n segment: Segments;\n Segments = Segments;\n Periods = Periods;\n timeIntervalWC: TimeInterval;\n minutes: number;\n\n ngOnInit(): void {\n this.segment = Segments.FROM;\n this.minutes = 30;\n this.timeIntervalWC = new TimeInterval(this.timeInterval);\n }\n\n setInterval(hours: number, minutes?: number): void {\n // adjust the hour based on the start of the interval and the settings of am/pm\n hours = this.contextualizeHour(hours, minutes);\n // convert the hours and minutes in milliseconds\n const timeMs = this.timeToMs(hours, minutes);\n // set the correct part of the interval, based on the current segment\n if (this.segment === Segments.FROM) {\n // set the start of the interval (from) and change the segment so that the end (to) will be picked\n this.timeIntervalWC.from = timeMs;\n this.segment = Segments.TO;\n } else {\n // can't proceed if from and to are equal\n if (timeMs === this.timeIntervalWC.from) return;\n // set the end of the interval (to)\n this.timeIntervalWC.to = timeMs;\n // save the changes and notify the parent component\n this.save();\n }\n }\n private timeToMs(hours: number, minutes?: number): number {\n return (hours * 60 * 60 + (minutes || 0) * 60) * 1000;\n }\n\n getClockButtonContent(hours: number, minutes?: number): string {\n // adjust the hour based on the start of the interval and the settings of am/pm\n hours = this.contextualizeHour(hours, minutes);\n // convert the calculated time into a readable string; we need to format it to distinguish 0-24 vs 0-12 am/pm\n const refDate = new Date();\n refDate.setHours(hours, minutes || 0, 0);\n const str = this._translate.formatDate(refDate, 'shortTime');\n // remove the extra part (e.g. am/pm), based on the type of button we have to show\n const strArr = str.split(':');\n return String(Number(strArr[0])).concat(minutes ? ':'.concat(strArr[1].slice(0, 2)) : '');\n }\n private contextualizeHour(hours: number, minutes?: number): number {\n // adjust the content to the afternoon hours, if needed\n if (this.period === Periods.PM) hours += 12;\n // if we already selected the start of the interval, check whether we need to adjust the time: the center of the\n // clock will be moved to the selected hour (from), to have a reasonable set of choices for the end (to)\n if (this.segment === Segments.TO && this.timeToMs(hours, minutes) < this.timeIntervalWC.from)\n hours += this.period === Periods.PM ? -12 : 12;\n // set midnight to 00\n if (hours === 24) hours = 0;\n return hours;\n }\n\n equalsFrom(hours: number, minutes?: number): boolean {\n // if the start of the interval hasn't been selected yet, skip it\n if (this.segment === Segments.FROM) return false;\n // adjust the hour based on the start of the interval and the settings of am/pm\n hours = this.contextualizeHour(hours, minutes);\n // compare the two strings based on the timestamps in ms\n return this.msToTimeString(this.timeIntervalWC.from) === this.msToTimeString(this.timeToMs(hours, minutes));\n }\n\n isAllowed(hours: number, minutes?: number): boolean {\n // adjust the hour based on the start of the interval and the settings of am/pm\n hours = this.contextualizeHour(hours, minutes);\n // check whether the selected time is inside the given boundaries\n const notEarlierThan = this.notEarlierThan;\n const notLaterThan = this.notLaterThan;\n return (\n (!notEarlierThan || this.timeToMs(hours, minutes) >= notEarlierThan || this.timeToMs(hours, minutes) === 0) &&\n (!notLaterThan || this.timeToMs(hours, minutes) <= notLaterThan)\n );\n }\n\n isHourOfOppositeMeridian(hours: number, minutes?: number): boolean {\n // if the start of the interval hasn't been selected yet, skip it\n if (this.segment === Segments.FROM) return false;\n // adjust the hour based on the start of the interval and the settings of am/pm\n hours = this.contextualizeHour(hours, minutes);\n // calculate the ms of the selected time and of \"noon\" time (to determ the meridian)\n const timeMs = this.timeToMs(hours, minutes);\n const noonMs = this.timeToMs(12);\n // return true in case the hour doesn't belong to the current meridian\n return (this.period === Periods.AM && timeMs > noonMs) || (this.period === Periods.PM && timeMs < noonMs);\n }\n\n msToTimeString(time: number): string {\n if (!time) return '';\n // note: the time must be always considered without any timezone (UTC)\n const refDate = new Date();\n refDate.setTime(time);\n const dateOpts = { timeZone: 'UTC', hour: '2-digit', minute: '2-digit' } as const;\n return refDate.toLocaleTimeString(this._translate.getCurrentLang(), dateOpts);\n }\n\n save(): void {\n this.timeInterval.load(this.timeIntervalWC);\n this._modal.dismiss(true);\n }\n\n reset(): void {\n this.timeInterval.reset();\n this._modal.dismiss(false);\n }\n\n close(): void {\n this._modal.dismiss();\n }\n}\n\n/**\n * The two stages of the component, to pick the start and the end of the interval.\n */\nenum Segments {\n FROM = 'FROM',\n TO = 'TO'\n}\n\n/**\n * The two possible periods of the component, to interpret the clock the right way.\n */\nexport enum Periods {\n AM = 'AM',\n PM = 'PM'\n}\n","<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-buttons slot=\"start\">\n <ion-button [title]=\"'COMMON.CLOSE' | translate\" (click)=\"close()\">\n <ion-icon name=\"close\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n <ion-title>{{ title }}</ion-title>\n <ion-buttons slot=\"end\">\n <ion-button [title]=\"'COMMON.RESET' | translate\" (click)=\"reset()\">\n <ion-icon name=\"arrow-undo\" slot=\"icon-only\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <ion-grid class=\"clockGrid\">\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"5\"> </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(12) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(12)\"\n [disabled]=\"!isAllowed(12)\"\n (click)=\"setInterval(12)\"\n >\n {{ getClockButtonContent(12) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(12, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(12, minutes)\"\n [disabled]=\"!isAllowed(12, minutes)\"\n (click)=\"setInterval(12, minutes)\"\n >\n {{ getClockButtonContent(12, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"3\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"2\"> </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(11, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(11, minutes)\"\n [disabled]=\"!isAllowed(11, minutes)\"\n (click)=\"setInterval(11, minutes)\"\n >\n {{ getClockButtonContent(11, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(11) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(11)\"\n [disabled]=\"!isAllowed(11)\"\n (click)=\"setInterval(11)\"\n >\n {{ getClockButtonContent(11) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(1) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(1)\"\n [disabled]=\"!isAllowed(1)\"\n (click)=\"setInterval(1)\"\n >\n {{ getClockButtonContent(1) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(1, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(1, minutes)\"\n [disabled]=\"!isAllowed(1, minutes)\"\n (click)=\"setInterval(1, minutes)\"\n >\n {{ getClockButtonContent(1, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"1\"> </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(10, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(10, minutes)\"\n [disabled]=\"!isAllowed(10, minutes)\"\n (click)=\"setInterval(10, minutes)\"\n >\n {{ getClockButtonContent(10, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(10) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(10)\"\n [disabled]=\"!isAllowed(10)\"\n (click)=\"setInterval(10)\"\n >\n {{ getClockButtonContent(10) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\"> </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(2) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(2)\"\n [disabled]=\"!isAllowed(2)\"\n (click)=\"setInterval(2)\"\n >\n {{ getClockButtonContent(2) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(2, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(2, minutes)\"\n [disabled]=\"!isAllowed(2, minutes)\"\n (click)=\"setInterval(2, minutes)\"\n >\n {{ getClockButtonContent(2, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"1\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(9, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(9, minutes)\"\n [disabled]=\"!isAllowed(9, minutes)\"\n (click)=\"setInterval(9, minutes)\"\n >\n {{ getClockButtonContent(9, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(9) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(9)\"\n [disabled]=\"!isAllowed(9)\"\n (click)=\"setInterval(9)\"\n >\n {{ getClockButtonContent(9) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center displayText\" [size]=\"4\">\n <ion-text [class.fromSelected]=\"segment === Segments.TO\">\n {{ 'IDEA_UNCOMMON.FTTT.FROM' | translate }}\n @if (segment === Segments.TO) {\n <span>{{ msToTimeString(timeIntervalWC.from) }}</span>\n }\n </ion-text>\n @if (segment === Segments.TO) {\n <ion-text>{{ 'IDEA_UNCOMMON.FTTT.TO' | translate }}</ion-text>\n }\n </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(3) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(3)\"\n [disabled]=\"!isAllowed(3)\"\n (click)=\"setInterval(3)\"\n >\n {{ getClockButtonContent(3) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(3, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(3, minutes)\"\n [disabled]=\"!isAllowed(3, minutes)\"\n (click)=\"setInterval(3, minutes)\"\n >\n {{ getClockButtonContent(3, minutes) }}\n </ion-button>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"1\"> </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(8, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(8, minutes)\"\n [disabled]=\"!isAllowed(8, minutes)\"\n (click)=\"setInterval(8, minutes)\"\n >\n {{ getClockButtonContent(8, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(8) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(8)\"\n [disabled]=\"!isAllowed(8)\"\n (click)=\"setInterval(8)\"\n >\n {{ getClockButtonContent(8) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\"> </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(4) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(4)\"\n [disabled]=\"!isAllowed(4)\"\n (click)=\"setInterval(4)\"\n >\n {{ getClockButtonContent(4) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(4, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(4, minutes)\"\n [disabled]=\"!isAllowed(4, minutes)\"\n (click)=\"setInterval(4, minutes)\"\n >\n {{ getClockButtonContent(4, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"1\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"2\"> </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(7, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(7, minutes)\"\n [disabled]=\"!isAllowed(7, minutes)\"\n (click)=\"setInterval(7, minutes)\"\n >\n {{ getClockButtonContent(7, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-left\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(7) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(7)\"\n [disabled]=\"!isAllowed(7)\"\n (click)=\"setInterval(7)\"\n >\n {{ getClockButtonContent(7) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(5) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(5)\"\n [disabled]=\"!isAllowed(5)\"\n (click)=\"setInterval(5)\"\n >\n {{ getClockButtonContent(5) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(5, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(5, minutes)\"\n [disabled]=\"!isAllowed(5, minutes)\"\n (click)=\"setInterval(5, minutes)\"\n >\n {{ getClockButtonContent(5, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"2\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col [size]=\"3\"> </ion-col>\n <ion-col class=\"ion-text-right\" [size]=\"2\">\n <ion-button\n size=\"small\"\n [color]=\"equalsFrom(6, minutes) ? 'primary' : 'light'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(6, minutes)\"\n [disabled]=\"!isAllowed(6, minutes)\"\n (click)=\"setInterval(6, minutes)\"\n >\n {{ getClockButtonContent(6, minutes) }}\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center\" [size]=\"2\">\n <ion-button\n size=\"large\"\n shape=\"round\"\n [color]=\"equalsFrom(6) ? 'primary' : 'dark'\"\n [class.oppositeMeridian]=\"isHourOfOppositeMeridian(6)\"\n [disabled]=\"!isAllowed(6)\"\n (click)=\"setInterval(6)\"\n >\n {{ getClockButtonContent(6) }}\n </ion-button>\n </ion-col>\n <ion-col [size]=\"5\"> </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-right\" [size]=\"3\" [sizeSm]=\"7\">\n <ion-text class=\"prefLabel\">{{ 'IDEA_UNCOMMON.FTTT.PERIOD' | translate }}:</ion-text>\n </ion-col>\n <ion-col [size]=\"9\" [sizeSm]=\"5\">\n <ion-segment [value]=\"period\" (ionChange)=\"period = $any($event?.detail?.value) || period\">\n <ion-segment-button [value]=\"Periods.AM\">\n <ion-label>{{ 'IDEA_UNCOMMON.FTTT.AM' | translate }}</ion-label>\n </ion-segment-button>\n <ion-segment-button [value]=\"Periods.PM\">\n <ion-label>{{ 'IDEA_UNCOMMON.FTTT.PM' | translate }}</ion-label>\n </ion-segment-button>\n </ion-segment>\n </ion-col>\n </ion-row>\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-right\" [size]=\"3\" [sizeSm]=\"7\">\n <ion-text class=\"prefLabel\">{{ 'IDEA_UNCOMMON.FTTT.MINUTES_PREFERENCE' | translate }}:</ion-text>\n </ion-col>\n <ion-col [size]=\"9\" [sizeSm]=\"5\">\n <ion-segment [value]=\"minutes\" (ionChange)=\"minutes = $any($event?.detail?.value) || minutes\">\n <ion-segment-button value=\"15\">\n <ion-label>15</ion-label>\n </ion-segment-button>\n <ion-segment-button value=\"30\">\n <ion-label>30</ion-label>\n </ion-segment-button>\n <ion-segment-button value=\"45\">\n <ion-label>45</ion-label>\n </ion-segment-button>\n </ion-segment>\n </ion-col>\n </ion-row>\n </ion-grid>\n</ion-content>\n","import {\n Component,\n SimpleChanges,\n OnInit,\n OnDestroy,\n OnChanges,\n inject,\n ChangeDetectionStrategy,\n output,\n input,\n signal\n} from '@angular/core';\nimport { ModalController, IonItem, IonButton, IonIcon, IonText, IonLabel } from '@ionic/angular/standalone';\nimport { Subscription } from 'rxjs';\nimport { TimeInterval } from 'idea-toolbox';\nimport { IDEATranslationsService } from '@idea-ionic/common';\n\nimport { IDEAFromTimeToTimeComponent, Periods } from './fromTimeToTime.component';\n\n@Component({\n selector: 'idea-time-interval',\n imports: [IonLabel, IonText, IonIcon, IonButton, IonItem],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ion-item\n class=\"timeIntervalItem\"\n [color]=\"color()\"\n [lines]=\"lines()\"\n [button]=\"!disabled()\"\n [disabled]=\"isOpening()\"\n [title]=\"placeholder() || valueToDisplay() || ''\"\n [class.withLabel]=\"label()\"\n (click)=\"disabled() ? doSelectWhenDisabled() : pickTimeInterval()\"\n >\n @if (icon()) {\n <ion-button\n fill=\"clear\"\n slot=\"start\"\n [color]=\"iconColor()\"\n [class.marginTop]=\"label()\"\n (click)=\"doIconSelect($event)\"\n >\n <ion-icon [name]=\"icon()\" slot=\"icon-only\" />\n </ion-button>\n }\n @if (label()) {\n <ion-label position=\"stacked\" [class.selectable]=\"!disabled() || tappableWhenDisabled()\">\n {{ label() }}\n @if (obligatory() && !disabled()) {\n <ion-text class=\"obligatoryDot\" />\n }\n </ion-label>\n }\n <ion-label class=\"description\" [class.selectable]=\"!disabled() || tappableWhenDisabled()\">\n @if (!valueToDisplay() && !disabled()) {\n <ion-text class=\"placeholder\" [class.selectable]=\"!disabled()\">\n {{ placeholder() }}\n </ion-text>\n }\n {{ valueToDisplay() }}\n </ion-label>\n @if (!disabled()) {\n <ion-icon slot=\"end\" name=\"caret-down\" class=\"selectIcon\" [class.selectable]=\"!disabled()\" />\n }\n </ion-item>\n `,\n styles: [\n `\n .timeIntervalItem {\n min-height: 48px;\n height: auto;\n .description {\n margin: 10px 0;\n height: 20px;\n line-height: 20px;\n width: 100%;\n }\n .placeholder {\n color: var(--ion-color-medium);\n }\n .selectIcon {\n margin: 0;\n padding-left: 4px;\n font-size: 0.8em;\n color: var(--ion-color-medium);\n }\n }\n .timeIntervalItem.withLabel {\n min-height: 58px;\n height: auto;\n .selectIcon {\n padding-top: 25px;\n }\n ion-button[slot='start'] {\n margin-top: 16px;\n }\n }\n .selectable {\n cursor: pointer;\n }\n `\n ]\n})\nexport class IDEATimeIntervalComponent implements OnInit, OnDestroy, OnChanges {\n private _modal = inject(ModalController);\n private _translate = inject(IDEATranslationsService);\n\n /**\n * The time interval to set.\n */\n readonly timeInterval = input<TimeInterval>();\n /**\n * Whether we should start picking the time displaying the afternoon (PM) or the morning (AM, default).\n */\n readonly period = input<Periods>(Periods.AM);\n /**\n * A time to use as lower limit for the possible choices.\n */\n readonly notEarlierThan = input<number>();\n /**\n * A time to use as upper limit for the possible choices.\n */\n readonly notLaterThan = input<number>();\n /**\n * The label for the field.\n */\n readonly label = input<string>();\n /**\n * The icon for the field.\n */\n readonly icon = input<string>();\n /**\n * The color of the icon.\n */\n readonly iconColor = input<string>();\n /**\n * A placeholder for the field.\n */\n readonly placeholder = input<string>();\n /**\n * If true, the component is disabled.\n */\n readonly disabled = input<boolean>();\n /**\n * If true, the field has a tappable effect when disabled.\n */\n readonly tappableWhenDisabled = input<boolean>();\n /**\n * If true, the obligatory dot is shown.\n */\n readonly obligatory = input<boolean>();\n /**\n * Lines preferences for the item.\n */\n readonly lines = input<string>();\n /**\n * The color for the component.\n */\n readonly color = input<string>();\n /**\n * On select event.\n */\n readonly select = output<void>();\n /**\n * Icon select.\n */\n readonly iconSelect = output<void>();\n /**\n * On select (with the field disabled) event.\n */\n readonly selectWhenDisabled = output<void>();\n\n valueToDisplay = signal<string>('');\n private langChangeSubscription: Subscription;\n\n isOpening = signal<boolean>(false);\n\n ngOnInit(): void {\n // when the language changes, set the locale\n this.langChangeSubscription = this._translate.onLangChange.subscribe((): void => {\n this.valueToDisplay.set(this.getValueToDisplay(this.timeInterval()));\n });\n }\n ngOnDestroy(): void {\n if (this.langChangeSubscription) this.langChangeSubscription.unsubscribe();\n }\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.timeInterval) this.valueToDisplay.set(this.getValueToDisplay(changes.timeInterval.currentValue));\n }\n\n private getValueToDisplay(timeInterval: TimeInterval): string {\n if (!timeInterval || !timeInterval.isSet()) return '';\n // note: the time must be always considered without any timezone (UTC)\n const dateOpts = { timeZone: 'UTC', hour: '2-digit', minute: '2-digit' } as const;\n return ''.concat(\n this._translate._('IDEA_UNCOMMON.FTTT.FROM'),\n ' ',\n new Date(timeInterval.from).toLocaleTimeString(this._translate.getCurrentLang(), dateOpts),\n ' ',\n this._translate._('IDEA_UNCOMMON.FTTT.TO').toLowerCase(),\n ' ',\n new Date(timeInterval.to).toLocaleTimeString(this._translate.getCurrentLang(), dateOpts)\n );\n }\n\n async pickTimeInterval(): Promise<void> {\n if (this.isOpening()) return;\n this.isOpening.set(true);\n const modal = await this._modal.create({\n component: IDEAFromTimeToTimeComponent,\n componentProps: {\n timeInterval: this.timeInterval(),\n period: this.period(),\n notEarlierThan: this.notEarlierThan(),\n notLaterThan: this.notLaterThan(),\n title: this.label()\n }\n });\n modal.onDidDismiss().then((res: any): void => {\n // if the content changed, update the internal values and notify the parent component\n if (res.data === true || res.data === false) {\n this.valueToDisplay.set(this.getValueToDisplay(this.timeInterval()));\n this.select.emit();\n }\n });\n modal.present();\n this.isOpening.set(false);\n }\n\n doSelectWhenDisabled(): void {\n if (this.disabled()) this.selectWhenDisabled.emit();\n }\n\n doIconSelect(event: any): void {\n if (event) event.stopPropagation();\n this.iconSelect.emit(event);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { epochDateTime } from 'idea-toolbox';\nimport { IDEAEnvironment } from '@idea-ionic/common';\n\nimport { IDEAErrorReportingService } from './errorReporting.service';\nimport { IDEAOfflineService } from './offline/offline.service';\nimport { IDEATinCanService } from './tinCan.service';\n\n/**\n * To communicate with an AWS API Gateway websocket istance.\n *\n * Note: requires an `AWSAPIAuthToken` variable to be set by IDEATinCanService service.\n */\n@Injectable({ providedIn: 'root' })\nexport class IDEAAWSAPISocketService {\n protected _env = inject(IDEAEnvironment);\n protected _tc = inject(IDEATinCanService);\n protected _errorReporting = inject(IDEAErrorReportingService);\n protected _offline = inject(IDEAOfflineService);\n\n apiStage: string;\n /**\n * The URL to connect for socket communication.\n */\n WEBSOCKET_API_URL: string;\n\n /**\n * The current websocket connection.\n */\n protected connection: WebSocket;\n /**\n * The options with which we opened a connection, to re-open it if needed.\n */\n protected options: IDEAAWSAPISocketServiceOpenOptions;\n /**\n * A timeout to ping the connection every once in a while, to keep it alive.\n */\n protected pingTimeout: any;\n /**\n * The timestamp of last activity for the connection, to make sure to ping it in case it's almost dead.\n */\n protected lastActivityAt: epochDateTime;\n /**\n * A timeout to re-try to open a connection later on, hoping we are online again.\n */\n protected offlineTimeout: any;\n /**\n * Whether the connection was correctly opened at least once.\n */\n protected wasOpenAtLeastOnce: boolean;\n\n /**\n * The maximum amount of minutes of inactivity after which we ping the connection to keep it alive.\n */\n MAX_INACTIVITY_MINUTES = 7;\n /**\n * The amount of minutes after which we check if the connection needs to be pinged to be kept alive.\n */\n KEEP_ALIVE_MINUTES_INTERVAL = 2;\n /**\n * In case we are offline, the amount of minutes after which we check if we are online, so we can re-connect.\n */\n TRY_AGAIN_OFFLINE_MINUTES = 3;\n\n constructor() {\n this.apiStage = this._env.idea.socket?.stage || (this._env.idea.socket as any)?.version;\n this.WEBSOCKET_API_URL = 'wss://'.concat([this._env.idea.socket?.url, this.apiStage].filter(x => x).join('/'));\n }\n\n /**\n * Open a connection to the websocket API.\n */\n open(options?: IDEAAWSAPISocketServiceOpenOptions): void {\n this.options = options || this.options || {};\n // skip in case we have an open and valid connection\n if (this.connection && this.isOpen()) return;\n // prepare optional query params for the connection/authorization request\n let qp = '';\n Object.entries(this.options.openParams || {}).forEach(([key, value]): string => (qp += `&${key}=${String(value)}`));\n // open a connection (with IDEA authentication or not)\n const auth = this.options.noAuth ? '?noAuth=' : '?Authorization='.concat(this._tc.get('AWSAPIAuthToken'));\n this.connection = new WebSocket(this.WEBSOCKET_API_URL.concat(auth, qp));\n // set the event listeners\n this.connection.onopen = (event: any): void => {\n if (this.options.debug) console.log('WEBSOCKET IS OPEN', event);\n // reset the try-again-when-offline mechanism, since we are online and connected\n if (this.offlineTimeout) clearTimeout(this.offlineTimeout);\n this.offlineTimeout = null;\n // mark the start of the connection as the first activity time\n this.lastActivityAt = Date.now();\n // set a timer that every N minutes checks if we need to ping the connection to keep it alive\n this.pingTimeout = setTimeout((): void => this.keepItAlive(), this.minutesToMS(this.KEEP_ALIVE_MINUTES_INTERVAL));\n // set the connection as correctly opened at least once (for re-connecting scenarios)\n this.wasOpenAtLeastOnce = true;\n // run the user-defined onOpen actions\n if (this.options.onOpen) this.options.onOpen(event);\n };\n this.connection.onclose = (event: any): void => {\n if (this.options.debug) console.log('WEBSOCKET WAS CLOSED BY EXTERNAL EVENTS', event);\n // run the user-defined onClose actions\n if (this.options.onClose) this.options.onClose(event);\n // in case the connection was closed by other events (e.g. offline) reset the data and try to re-open the socket\n this.close(this.wasOpenAtLeastOnce);\n };\n this.connection.onerror = (event: any): void => {\n if (this.options.debug) console.log('WEBSOCKET HAD AN ERROR', event);\n // send an error report, if requested\n if (this.options.reportError) {\n const errMsg = ''.concat(event?.target?.url, ' @@@ ', this._tc.get('user')?.userId || this._tc.get('userId'));\n this._errorReporting.sendReport(new Error(errMsg));\n }\n // run the user-defined onError actions\n if (this.options.onError) this.options.onError(event);\n };\n this.connection.onmessage = (event: any): void => {\n if (this.options.debug) console.log('WEBSOCKET INCOMING MESSAGE', event);\n try {\n const data = JSON.parse(event.data || {});\n if (this.options.onMessage) this.options.onMessage(data);\n } catch (err) {\n /* IGNORE: it probably comes from a keep-alive ping-pong message */\n }\n this.lastActivityAt = Date.now();\n };\n }\n\n /**\n * Close the current connection to the websocket API.\n * @param itShouldReopen in case the connection was forcibly closed, try to re-open it (with offline mechanism).\n */\n close(itShouldReopen?: boolean): void {\n // skip in case there isn't an active connection\n if (!this.connection) return;\n // reset the events listener\n this.connection.onopen = null;\n this.connection.onclose = null;\n this.connection.onmessage = null;\n this.connection.onerror = null;\n // in case the connection was closed by a manual action, reset the initial parameters\n if (!itShouldReopen) {\n this.options = null;\n this.wasOpenAtLeastOnce = false;\n }\n // reset the keep-alive mechanism\n if (this.pingTimeout) clearTimeout(this.pingTimeout);\n this.pingTimeout = null;\n this.lastActivityAt = null;\n // reset the try-again-when-offline mechanism\n if (this.offlineTimeout) clearTimeout(this.offlineTimeout);\n this.offlineTimeout = null;\n // close the connection and empty the reference\n this.connection.close();\n this.connection = null;\n // in case the connection was forcibly closed, try to re-open it\n if (itShouldReopen) this.reOpen();\n }\n /**\n * Try to-reopen a closed connection, if we are online.\n */\n protected async reOpen(): Promise<void> {\n // in case we are online, reopen the connection right away\n const isOnline = await this._offline.check();\n if (this.options.debug) console.log('WEBSOCKET WILL TRY TO RE-OPEN', isOnline, new Date());\n if (isOnline) return this.open();\n // if we are offline, set a timer to try to re-open the connection later on\n this.offlineTimeout = setTimeout(\n (): Promise<void> => this.reOpen(),\n this.minutesToMS(this.TRY_AGAIN_OFFLINE_MINUTES)\n );\n }\n\n /**\n * Whether the socket connection is currently open.\n */\n isOpen(): boolean {\n return this.connection && this.connection.readyState === WebSocket.OPEN;\n }\n\n /**\n * A simple message delivered to the server to keep the connection alive.\n */\n protected ping(): void {\n if (this.options.debug) console.log('WEBSOCKET IS PINGING THE SERVER', new Date());\n this.connection.send('ping');\n }\n\n /**\n * Helper to keep the connection alive, if needed.\n */\n protected keepItAlive(): void {\n if (this.options.debug) console.log('WEBSOCKET KEEP-IT-ALIVE', new Date());\n // if there wasn't an acivity in the last MAX_INACTIVITY_MINUTES, ping the connection\n if (!this.lastActivityAt || this.lastActivityAt + this.minutesToMS(this.MAX_INACTIVITY_MINUTES) < Date.now())\n this.ping();\n // set again the timer to keep the connection alive\n if (this.pingTimeout) clearTimeout(this.pingTimeout);\n this.pingTimeout = setTimeout((): void => this.keepItAlive(), this.minutesToMS(this.KEEP_ALIVE_MINUTES_INTERVAL));\n }\n\n /**\n * Convert minutes to milliseconds.\n */\n protected minutesToMS(minutes: number): number {\n return minutes * 60 * 1000;\n }\n}\n\n/**\n * The options to open a socket connection and handle its events.\n */\nexport interface IDEAAWSAPISocketServiceOpenOptions {\n /**\n * Optional parameters needed to be passed to the socket's authorizer to open the connection.\n * Note: the authentication (IDEA standard) is automatically included, if `noAuth` isn't set.\n */\n openParams?: { [key: string]: any };\n /**\n * If set, the socket connection won't require authentication.\n */\n noAuth?: boolean;\n /**\n * Action to execute when the connection is confirmed \"open\" by the server.\n */\n onOpen?: (event: any) => void;\n /**\n * Action to execute when the connection closes (for external events).\n */\n onClose?: (event: any) => void;\n /**\n * Action to execute when a message is delivered from the server.\n */\n onMessage?: (event: any) => void;\n /**\n * Action to execute when an error occurs.\n */\n onError?: (event: any) => void;\n /**\n * If true, report the errors that occur (IDEA standard).\n */\n reportError?: boolean;\n /**\n * Whether to show debug messages.\n */\n debug?: boolean;\n}\n","import { Injectable, inject } from '@angular/core';\nimport { IDEAStorageService } from '@idea-ionic/common';\n\n/**\n * *The service aims to solve the resource caching behaviour of browsers.*\n * *It's suggested to use it with avatars and other images/resources that can change based on user input.*\n * The browsers tend to cache images based on their URL;\n * sometimes, the image changes but the URL doesn't, and the browser keeps showing the old image.\n * Through this service, when we change a resource (e.g. an image), we also update a cache key.\n * Each time we load a resource through the service's method `getCachedImage`, we use the cache key as a query param;\n * in this way, the browser uses the same cached images, until we change the cache key.\n */\n@Injectable({ providedIn: 'root' })\nexport class IDEACachedResourcesService {\n /**\n * Change it only if necessary.\n */\n cacheKeyIndex = 'IDEA_CACHED_RESOURCES_KEY';\n\n private cacheKey: string;\n\n private storage = inject(IDEAStorageService);\n\n constructor() {\n this.loadKeyFromStorage();\n }\n /**\n * Load the cache key from the local storage.\n */\n private loadKeyFromStorage(): void {\n this.storage.get(this.cacheKeyIndex).then(key => {\n if (key) this.cacheKey = key;\n else this.updateCacheKey(Date.now());\n });\n }\n\n /**\n * Get an image using the service's caching mechanism.\n * Optionally update the cache key and forces the image's cache deletion.\n */\n getCachedResource(url: string, updateCacheKey?: boolean): string {\n const key = updateCacheKey ? this.updateCacheKey() : this.cacheKey;\n return url.concat(`?crs=${key}`);\n }\n /**\n * Set a new cache key.\n */\n async updateCacheKey(key: string | number = Date.now()): Promise<void> {\n this.cacheKey = String(key);\n await this.storage.set(this.cacheKeyIndex, key);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Platform } from '@ionic/angular/standalone';\nimport { PushNotifications, PushNotificationSchema } from '@capacitor/push-notifications';\nimport { Observable } from 'rxjs';\nimport { PushNotificationsDevice, PushNotificationsPlatforms } from 'idea-toolbox';\n\nimport { IDEAErrorReportingService } from './errorReporting.service';\n\n/**\n * To subscribe push notifications events.\n *\n * These are `Observable` streams fed by native Capacitor listeners (outside the Angular zone). On a\n * zoneless consumer, render any state you derive from them reactively (signals or the `async` pipe);\n * a plain field assigned inside `.subscribe(...)` won't schedule change detection.\n */\n@Injectable({ providedIn: 'root' })\nexport class IDEAPushNotificationsService {\n private _platform = inject(Platform);\n private _errorReporting = inject(IDEAErrorReportingService);\n\n registrations: Observable<PushNotificationsDevice>;\n notifications: Observable<PushNotificationSchema>;\n errors: Observable<Error>;\n\n constructor() {\n if (!this.isAvailable()) return;\n\n this.registrations = new Observable(observer => {\n PushNotifications.addListener('registration', token =>\n observer.next(new PushNotificationsDevice({ token: token.value, platform: PushNotificationsPlatforms.FCM }))\n );\n });\n this.errors = new Observable(observer => {\n // rif. https://forum.ionicframework.com/t/226376\n (PushNotifications as any).addListener('registrationError', (err: Error): void => {\n this._errorReporting.sendReport(err);\n observer.next(err);\n });\n });\n this.notifications = new Observable(observer => {\n PushNotifications.addListener('pushNotificationReceived', n => observer.next(n));\n });\n }\n\n /**\n * Return true if the device is supported.\n */\n isAvailable(): boolean {\n return this._platform.is('capacitor') && !!PushNotifications;\n }\n\n /**\n * To fire the registration of a new device: it will rewquest the permission to use Push Notification.\n * On iOS will prompt the request, on Android it's automatic.\n */\n async registerDevice(): Promise<void> {\n if (!this.isAvailable()) return;\n\n let permStatus = await PushNotifications.checkPermissions();\n\n if (permStatus.receive === 'prompt') permStatus = await PushNotifications.requestPermissions();\n\n if (permStatus.receive === 'granted') PushNotifications.register();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["Platform","i1"],"mappings":"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"}
|