@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
105 lines • 15.3 kB
JavaScript
import { Injectable } from '@angular/core';
import { BsModalService } from 'ngx-bootstrap/modal';
import { Status } from '../common/status.model';
import { gettext } from '../i18n/gettext';
import { GainsightService } from '../product-experience/gainsight.service';
import { ConfirmModalComponent } from './modal-confirm.component';
import * as i0 from "@angular/core";
import * as i1 from "ngx-bootstrap/modal";
import * as i2 from "../product-experience/gainsight.service";
/**
* Service to show a modal.
*/
export class ModalService {
constructor(modalService, gainsightService) {
this.modalService = modalService;
this.gainsightService = gainsightService;
}
/**
* Shows a quick confirm message modal.
* @param title The title of that modal.
* @param body The text body to display.
* @param status The status.
* @param labels The labels to use. Default: { ok: 'Confirm', cancel: 'Cancel'}
* @param confirmOptions Selection options to display as checkbox list.
* @param productExperienceEvent Additional data to attach to custom product experience events.
*/
async confirm(title, body, status = Status.INFO, labels = {}, confirmOptions = {}, productExperienceEvent = { eventName: 'confirmModal' }) {
const modalLabels = {
ok: labels.ok || gettext('Confirm'),
cancel: labels.cancel || gettext('Cancel')
};
const modalRef = this.modalService.show(ConfirmModalComponent, {
initialState: { title, body, labels: modalLabels, status, confirmOptions },
ariaDescribedby: 'modal-body',
ariaLabelledBy: 'modal-title',
ignoreBackdropClick: true
});
if (productExperienceEvent) {
productExperienceEvent.data = { ...productExperienceEvent.data, title };
}
this.triggerEvent(modalRef.content.result, modalLabels, productExperienceEvent);
return await modalRef.content.result;
}
/**
* Shows a quick acknowledge message modal.
* @param title The title of that modal.
* @param body The text body to display.
* @param status The status.
* @param acknowledgeLabel The label to use.
* @param productExperienceEvent Additional data to attach to custom product experience events.
*/
async acknowledge(title, body, status = Status.INFO, acknowledgeLabel = gettext('Confirm'), productExperienceEvent = { eventName: 'confirmModal' }) {
const labels = { ok: acknowledgeLabel, cancel: null };
const modalRef = this.modalService.show(ConfirmModalComponent, {
initialState: { title, body, labels, status },
ariaDescribedby: 'modal-body',
ariaLabelledBy: 'modal-title',
ignoreBackdropClick: true
});
if (productExperienceEvent) {
productExperienceEvent.data = { ...productExperienceEvent.data, title };
}
this.triggerEvent(modalRef.content.result, labels, productExperienceEvent);
return await modalRef.content.result;
}
/**
* Shows a quick logout confirmation modal.
* @param body The text body to display. Default: 'You will be logged out to apply your changes. Do you want to proceed?'
* @param status The status.
* @param labels The labels to use. Default: { ok: 'Confirm and log out', cancel: 'Cancel' }
*/
async confirmLogout(body, status = Status.WARNING, labels = {}) {
const modalLabels = {
ok: labels.ok || gettext('Confirm and log out'),
cancel: labels.cancel || gettext('Cancel')
};
const modalBody = body || gettext('You must log out to apply your changes. Do you want to proceed?');
return await this.confirm(gettext('Logout required'), modalBody, status, modalLabels);
}
triggerEvent(result, labels, productExperienceEvent) {
const data = { ...productExperienceEvent.data, url: window.location.href };
result
.then(() => {
this.gainsightService.triggerEvent(productExperienceEvent.eventName, {
...data,
result: labels.ok
});
})
.catch(() => {
this.gainsightService.triggerEvent(productExperienceEvent.eventName, {
...data,
result: labels.cancel
});
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ModalService, deps: [{ token: i1.BsModalService }, { token: i2.GainsightService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ModalService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ModalService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.BsModalService }, { type: i2.GainsightService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvbW9kYWwvbW9kYWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsTUFBTSxFQUFjLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBRTNFLE9BQU8sRUFBRSxxQkFBcUIsRUFBa0IsTUFBTSwyQkFBMkIsQ0FBQzs7OztBQUVsRjs7R0FFRztBQUlILE1BQU0sT0FBTyxZQUFZO0lBQ3ZCLFlBQ1UsWUFBNEIsRUFDNUIsZ0JBQWtDO1FBRGxDLGlCQUFZLEdBQVosWUFBWSxDQUFnQjtRQUM1QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO0lBQ3pDLENBQUM7SUFFSjs7Ozs7Ozs7T0FRRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQ1gsS0FBYSxFQUNiLElBQVksRUFDWixTQUFxQixNQUFNLENBQUMsSUFBSSxFQUNoQyxTQUEwQyxFQUFFLEVBQzVDLGlCQUFpQyxFQUFFLEVBQ25DLHlCQUFpRCxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUU7UUFFOUUsTUFBTSxXQUFXLEdBQUc7WUFDbEIsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQztZQUNuQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDO1NBQzNDLENBQUM7UUFDRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUM3RCxZQUFZ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O2FBQ0QsS0FBSyxDQUFDLEdBQUcsRUFBRTtZQUNWLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFO2dCQUNuRSxHQUFHLElBQUk7Z0JBQ1AsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO2FBQ3RCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzsrR0F4R1UsWUFBWTttSEFBWixZQUFZLGNBRlgsTUFBTTs7NEZBRVAsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgU3RhdHVzLCBTdGF0dXNUeXBlIH0gZnJvbSAnLi4vY29tbW9uL3N0YXR1cy5tb2RlbCc7XG5pbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnLi4vaTE4bi9nZXR0ZXh0JztcbmltcG9ydCB7IEdhaW5zaWdodFNlcnZpY2UgfSBmcm9tICcuLi9wcm9kdWN0LWV4cGVyaWVuY2UvZ2FpbnNpZ2h0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJvZHVjdEV4cGVyaWVuY2VFdmVudCB9IGZyb20gJy4uL3Byb2R1Y3QtZXhwZXJpZW5jZS9wcm9kdWN0LWV4cGVyaWVuY2UubW9kZWwnO1xuaW1wb3J0IHsgQ29uZmlybU1vZGFsQ29tcG9uZW50LCBDb25maXJtT3B0aW9ucyB9IGZyb20gJy4vbW9kYWwtY29uZmlybS5jb21wb25lbnQnO1xuXG4vKipcbiAqIFNlcnZpY2UgdG8gc2hvdyBhIG1vZGFsLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBNb2RhbFNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogQnNNb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBnYWluc2lnaHRTZXJ2aWNlOiBHYWluc2lnaHRTZXJ2aWNlXG4gICkge31cblxuICAvKipcbiAgICogU2hvd3MgYSBxdWljayBjb25maXJtIG1lc3NhZ2UgbW9kYWwuXG4gICAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGUgb2YgdGhhdCBtb2RhbC5cbiAgICogQHBhcmFtIGJvZHkgVGhlIHRleHQgYm9keSB0byBkaXNwbGF5LlxuICAgKiBAcGFyYW0gc3RhdHVzIFRoZSBzdGF0dXMuXG4gICAqIEBwYXJhbSBsYWJlbHMgVGhlIGxhYmVscyB0byB1c2UuIERlZmF1bHQ6IHsgb2s6ICdDb25maXJtJywgY2FuY2VsOiAnQ2FuY2VsJ31cbiAgICogQHBhcmFtIGNvbmZpcm1PcHRpb25zIFNlbGVjdGlvbiBvcHRpb25zIHRvIGRpc3BsYXkgYXMgY2hlY2tib3ggbGlzdC5cbiAgICogQHBhcmFtIHByb2R1Y3RFeHBlcmllbmNlRXZlbnQgQWRkaXRpb25hbCBkYXRhIHRvIGF0dGFjaCB0byBjdXN0b20gcHJvZHVjdCBleHBlcmllbmNlIGV2ZW50cy5cbiAgICovXG4gIGFzeW5jIGNvbmZpcm0oXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICBib2R5OiBzdHJpbmcsXG4gICAgc3RhdHVzOiBTdGF0dXNUeXBlID0gU3RhdHVzLklORk8sXG4gICAgbGFiZWxzOiBDb25maXJtTW9kYWxDb21wb25lbnRbJ2xhYmVscyddID0ge30sXG4gICAgY29uZmlybU9wdGlvbnM6IENvbmZpcm1PcHRpb25zID0ge30sXG4gICAgcHJvZHVjdEV4cGVyaWVuY2VFdmVudDogUHJvZHVjdEV4cGVyaWVuY2VFdmVudCA9IHsgZXZlbnROYW1lOiAnY29uZmlybU1vZGFsJyB9XG4gICkge1xuICAgIGNvbnN0IG1vZGFsTGFiZWxzID0ge1xuICAgICAgb2s6IGxhYmVscy5vayB8fCBnZXR0ZXh0KCdDb25maXJtJyksXG4gICAgICBjYW5jZWw6IGxhYmVscy5jYW5jZWwgfHwgZ2V0dGV4dCgnQ2FuY2VsJylcbiAgICB9O1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyhDb25maXJtTW9kYWxDb21wb25lbnQsIHtcbiAgICAgIGluaXRpYWxTdGF0ZTogeyB0aXRsZSwgYm9keSwgbGFiZWxzOiBtb2RhbExhYmVscywgc3RhdHVzLCBjb25maXJtT3B0aW9ucyB9LFxuICAgICAgYXJpYURlc2NyaWJlZGJ5OiAnbW9kYWwtYm9keScsXG4gICAgICBhcmlhTGFiZWxsZWRCeTogJ21vZGFsLXRpdGxlJyxcbiAgICAgIGlnbm9yZUJhY2tkcm9wQ2xpY2s6IHRydWVcbiAgICB9KTtcbiAgICBpZiAocHJvZHVjdEV4cGVyaWVuY2VFdmVudCkge1xuICAgICAgcHJvZHVjdEV4cGVyaWVuY2VFdmVudC5kYXRhID0geyAuLi5wcm9kdWN0RXhwZXJpZW5jZUV2ZW50LmRhdGEsIHRpdGxlIH07XG4gICAgfVxuICAgIHRoaXMudHJpZ2dlckV2ZW50KG1vZGFsUmVmLmNvbnRlbnQucmVzdWx0LCBtb2RhbExhYmVscywgcHJvZHVjdEV4cGVyaWVuY2VFdmVudCk7XG4gICAgcmV0dXJuIGF3YWl0IG1vZGFsUmVmLmNvbnRlbnQucmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGEgcXVpY2sgYWNrbm93bGVkZ2UgbWVzc2FnZSBtb2RhbC5cbiAgICogQHBhcmFtIHRpdGxlIFRoZSB0aXRsZSBvZiB0aGF0IG1vZGFsLlxuICAgKiBAcGFyYW0gYm9keSBUaGUgdGV4dCBib2R5IHRvIGRpc3BsYXkuXG4gICAqIEBwYXJhbSBzdGF0dXMgVGhlIHN0YXR1cy5cbiAgICogQHBhcmFtIGFja25vd2xlZGdlTGFiZWwgVGhlIGxhYmVsIHRvIHVzZS5cbiAgICogQHBhcmFtIHByb2R1Y3RFeHBlcmllbmNlRXZlbnQgQWRkaXRpb25hbCBkYXRhIHRvIGF0dGFjaCB0byBjdXN0b20gcHJvZHVjdCBleHBlcmllbmNlIGV2ZW50cy5cbiAgICovXG4gIGFzeW5jIGFja25vd2xlZGdlKFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgYm9keTogc3RyaW5nLFxuICAgIHN0YXR1czogU3RhdHVzVHlwZSA9IFN0YXR1cy5JTkZPLFxuICAgIGFja25vd2xlZGdlTGFiZWw6IHN0cmluZyA9IGdldHRleHQoJ0NvbmZpcm0nKSxcbiAgICBwcm9kdWN0RXhwZXJpZW5jZUV2ZW50OiBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50ID0geyBldmVudE5hbWU6ICdjb25maXJtTW9kYWwnIH1cbiAgKSB7XG4gICAgY29uc3QgbGFiZWxzID0geyBvazogYWNrbm93bGVkZ2VMYWJlbCwgY2FuY2VsOiBudWxsIH07XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5zaG93KENvbmZpcm1Nb2RhbENvbXBvbmVudCwge1xuICAgICAgaW5pdGlhbFN0YXRlOiB7IHRpdGxlLCBib2R5LCBsYWJlbHMsIHN0YXR1cyB9LFxuICAgICAgYXJpYURlc2NyaWJlZGJ5OiAnbW9kYWwtYm9keScsXG4gICAgICBhcmlhTGFiZWxsZWRCeTogJ21vZGFsLXRpdGxlJyxcbiAgICAgIGlnbm9yZUJhY2tkcm9wQ2xpY2s6IHRydWVcbiAgICB9KTtcbiAgICBpZiAocHJvZHVjdEV4cGVyaWVuY2VFdmVudCkge1xuICAgICAgcHJvZHVjdEV4cGVyaWVuY2VFdmVudC5kYXRhID0geyAuLi5wcm9kdWN0RXhwZXJpZW5jZUV2ZW50LmRhdGEsIHRpdGxlIH07XG4gICAgfVxuICAgIHRoaXMudHJpZ2dlckV2ZW50KG1vZGFsUmVmLmNvbnRlbnQucmVzdWx0LCBsYWJlbHMsIHByb2R1Y3RFeHBlcmllbmNlRXZlbnQpO1xuICAgIHJldHVybiBhd2FpdCBtb2RhbFJlZi5jb250ZW50LnJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIHF1aWNrIGxvZ291dCBjb25maXJtYXRpb24gbW9kYWwuXG4gICAqIEBwYXJhbSBib2R5IFRoZSB0ZXh0IGJvZHkgdG8gZGlzcGxheS4gRGVmYXVsdDogJ1lvdSB3aWxsIGJlIGxvZ2dlZCBvdXQgdG8gYXBwbHkgeW91ciBjaGFuZ2VzLiBEbyB5b3Ugd2FudCB0byBwcm9jZWVkPydcbiAgICogQHBhcmFtIHN0YXR1cyBUaGUgc3RhdHVzLlxuICAgKiBAcGFyYW0gbGFiZWxzIFRoZSBsYWJlbHMgdG8gdXNlLiBEZWZhdWx0OiB7IG9rOiAnQ29uZmlybSBhbmQgbG9nIG91dCcsIGNhbmNlbDogJ0NhbmNlbCcgfVxuICAgKi9cbiAgYXN5bmMgY29uZmlybUxvZ291dChib2R5Pzogc3RyaW5nLCBzdGF0dXM6IFN0YXR1c1R5cGUgPSBTdGF0dXMuV0FSTklORywgbGFiZWxzOiBhbnkgPSB7fSkge1xuICAgIGNvbnN0IG1vZGFsTGFiZWxzID0ge1xuICAgICAgb2s6IGxhYmVscy5vayB8fCBnZXR0ZXh0KCdDb25maXJtIGFuZCBsb2cgb3V0JyksXG4gICAgICBjYW5jZWw6IGxhYmVscy5jYW5jZWwgfHwgZ2V0dGV4dCgnQ2FuY2VsJylcbiAgICB9O1xuICAgIGNvbnN0IG1vZGFsQm9keSA9XG4gICAgICBib2R5IHx8IGdldHRleHQoJ1lvdSBtdXN0IGxvZyBvdXQgdG8gYXBwbHkgeW91ciBjaGFuZ2VzLiBEbyB5b3Ugd2FudCB0byBwcm9jZWVkPycpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbmZpcm0oZ2V0dGV4dCgnTG9nb3V0IHJlcXVpcmVkJyksIG1vZGFsQm9keSwgc3RhdHVzLCBtb2RhbExhYmVscyk7XG4gIH1cblxuICBwcml2YXRlIHRyaWdnZXJFdmVudChcbiAgICByZXN1bHQ6IFByb21pc2U8Ym9vbGVhbiB8IHsgY29uZmlybWVkOiBib29sZWFuOyBjb25maXJtT3B0aW9uczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gfT4sXG4gICAgbGFiZWxzOiBhbnksXG4gICAgcHJvZHVjdEV4cGVyaWVuY2VFdmVudDogUHJvZHVjdEV4cGVyaWVuY2VFdmVudFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhID0geyAuLi5wcm9kdWN0RXhwZXJpZW5jZUV2ZW50LmRhdGEsIHVybDogd2luZG93LmxvY2F0aW9uLmhyZWYgfTtcbiAgICByZXN1bHRcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnRyaWdnZXJFdmVudChwcm9kdWN0RXhwZXJpZW5jZUV2ZW50LmV2ZW50TmFtZSwge1xuICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgcmVzdWx0OiBsYWJlbHMub2tcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnRyaWdnZXJFdmVudChwcm9kdWN0RXhwZXJpZW5jZUV2ZW50LmV2ZW50TmFtZSwge1xuICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgcmVzdWx0OiBsYWJlbHMuY2FuY2VsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cbn1cbiJdfQ==