UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

121 lines 15 kB
import { cloneDeep } from 'lodash-es'; import { BehaviorSubject } from 'rxjs'; import { DismissAlertStrategy } from './dynamic-component-alert.model'; /** * Order of widget alerts due to alerts severity. */ const WIDGET_ALERTS_ORDER = [ 'danger', 'warning', 'info', 'system', 'success' ]; export class DynamicComponentAlertAggregator { constructor(alerts = []) { this.anyAlertExistsSubject = new BehaviorSubject(false); this.anyAlertExists$ = this.anyAlertExistsSubject.asObservable(); this.initAlertsGroups(); this.setAlerts(alerts); } /** * Adds alert to aggregator. * * @param {DynamicComponentAlert[]} alerts List of alerts that should be added to aggregator. * */ addAlerts(...alerts) { this.setAlerts(alerts); } /** * Remove alerts in group by provided alert type or removes all alerts when no param is provided. * * @param {AlertType} type Type of alerts group that should be removed. * */ clear(type) { if (type) { this.aggregatedAlertsData.get(type).alerts = []; } else { this.aggregatedAlertsData.forEach(value => (value.alerts = [])); } this.onDataChanged(); } /** * Sets possibility of alert to be dismissed in specific way. * * @param {AlertType} alertType Type of alerts for which the dismissal strategy should be set. * @param {dismissStrategy} dismissStrategy Type of dismissal strategy that will be set for the alert type. * */ setAlertGroupDismissStrategy(alertType, dismissStrategy) { this.aggregatedAlertsData.get(alertType).alertDismissal.dismissStrategy = dismissStrategy; this.onDataChanged(); } /** * Removes alerts in group due to dismissal dismissStrategy and sets userDismissalChoice property. * If group has dismissal strategy declared as TEMPORARY_OR_PERMANENT, its userDismissalChoice property can be set to * REMIND_ALLOWED or REMIND_DISALLOWED depending on parameter. * * @param {AlertType} alertType Type of alerts group that should be dismissed. * @param {boolean} permanent Determines whether the dismissal of alerts of a given type is permanent. * */ dismissAlertGroup(alertType, isPermanent = false) { const groupDismissStrategy = this.aggregatedAlertsData.get(alertType).alertDismissal.dismissStrategy; switch (groupDismissStrategy) { case DismissAlertStrategy.NONE: return; case DismissAlertStrategy.TEMPORARY: this.aggregatedAlertsData.get(alertType).alertDismissal.userDismissalChoice = 'REMIND_ALLOWED'; break; case DismissAlertStrategy.TEMPORARY_OR_PERMANENT: this.aggregatedAlertsData.get(alertType).alertDismissal.userDismissalChoice = isPermanent ? 'REMIND_DISALLOWED' : 'REMIND_ALLOWED'; } this.clear(alertType); } /** * Alert aggregator as a widget property should not be serialized and stored in database. */ toJSON() { return undefined; } initAlertsGroups() { this.aggregatedAlertsData = new Map(WIDGET_ALERTS_ORDER.map(alertType => { return [ alertType, { alerts: [], alertDismissal: { dismissStrategy: DismissAlertStrategy.NONE } } ]; })); } setAlerts(alerts) { alerts.forEach(alert => { if (this.aggregatedAlertsData.get(alert.type).alertDismissal.userDismissalChoice === 'REMIND_DISALLOWED') { return; } if (!this.aggregatedAlertsData.get(alert.type)) { this.aggregatedAlertsData.get(alert.type).alerts = []; } this.aggregatedAlertsData.get(alert.type).alerts.push(alert); }); this.onDataChanged(); } onDataChanged() { this.alertGroups = [...cloneDeep(this.aggregatedAlertsData)].map(([key, value]) => ({ type: key, value })); queueMicrotask(() => { this.anyAlertExistsSubject.next(this.alertGroups.some(({ value }) => !!value.alerts.length)); }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1jb21wb25lbnQtYWxlcnQtYWdncmVnYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvZHluYW1pYy1jb21wb25lbnQvZHluYW1pYy1jb21wb25lbnQtYWxlcnQtYWdncmVnYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sRUFBYyxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxFQUVMLG9CQUFvQixFQUVyQixNQUFNLGlDQUFpQyxDQUFDO0FBR3pDOztHQUVHO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRztJQUMxQixRQUFRO0lBQ1IsU0FBUztJQUNULE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztDQUNrQyxDQUFDO0FBRTlDLE1BQU0sT0FBTywrQkFBK0I7SUFlMUMsWUFBWSxTQUFrQyxFQUFFO1FBRnhDLDBCQUFxQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBR2xFLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2pFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBUyxDQUFDLEdBQUcsTUFBK0I7UUFDMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsSUFBZ0I7UUFDcEIsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNsRCxDQUFDO2FBQU0sQ0FBQztZQUNO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QUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbEYsSUFBSSxFQUFFLEdBQUc7WUFDVCxLQUFLO1NBQ04sQ0FBQyxDQUFDLENBQUM7UUFDSixjQUFjLENBQUMsR0FBRyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQy9GLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2xvbmVEZWVwIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgQWxlcnRHcm91cERhdGEsXG4gIERpc21pc3NBbGVydFN0cmF0ZWd5LFxuICBEeW5hbWljQ29tcG9uZW50QWxlcnRcbn0gZnJvbSAnLi9keW5hbWljLWNvbXBvbmVudC1hbGVydC5tb2RlbCc7XG5pbXBvcnQgeyBBbGVydFR5cGUgfSBmcm9tICcuLi9hbGVydCc7XG5cbi8qKlxuICogT3JkZXIgb2Ygd2lkZ2V0IGFsZXJ0cyBkdWUgdG8gYWxlcnRzIHNldmVyaXR5LlxuICovXG5jb25zdCBXSURHRVRfQUxFUlRTX09SREVSID0gW1xuICAnZGFuZ2VyJyxcbiAgJ3dhcm5pbmcnLFxuICAnaW5mbycsXG4gICdzeXN0ZW0nLFxuICAnc3VjY2Vzcydcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIFJlYWRvbmx5QXJyYXk8QWxlcnRUeXBlPjtcblxuZXhwb3J0IGNsYXNzIER5bmFtaWNDb21wb25lbnRBbGVydEFnZ3JlZ2F0b3Ige1xuICBhbnlBbGVydEV4aXN0cyQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIC8qKlxuICAgKiBBcnJheSBjb250YWluaW5nIGdyb3VwZWQgYWxlcnRzIHdpdGggZGF0YSBuZWNlc3NhcnkgdG8gZGlzcGxheSBhbGVydHMgYW5kIHdoZXRoZXIgYWxlcnQgZ3JvdXAgc2hvdWxkIGJlIGRpc21pc3NpYmxlLlxuICAgKi9cbiAgYWxlcnRHcm91cHM6IEFycmF5PHtcbiAgICB0eXBlOiBBbGVydFR5cGU7XG4gICAgdmFsdWU6IEFsZXJ0R3JvdXBEYXRhO1xuICB9PjtcbiAgLyoqXG4gICAqIFByaXZhdGUgTWFwIG9mIGFsZXJ0cyBkYXRhLlxuICAgKi9cbiAgcHJpdmF0ZSBhZ2dyZWdhdGVkQWxlcnRzRGF0YTogTWFwPEFsZXJ0VHlwZSwgQWxlcnRHcm91cERhdGE+O1xuICBwcml2YXRlIGFueUFsZXJ0RXhpc3RzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIGNvbnN0cnVjdG9yKGFsZXJ0czogRHluYW1pY0NvbXBvbmVudEFsZXJ0W10gPSBbXSkge1xuICAgIHRoaXMuYW55QWxlcnRFeGlzdHMkID0gdGhpcy5hbnlBbGVydEV4aXN0c1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5pbml0QWxlcnRzR3JvdXBzKCk7XG4gICAgdGhpcy5zZXRBbGVydHMoYWxlcnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFsZXJ0IHRvIGFnZ3JlZ2F0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7RHluYW1pY0NvbXBvbmVudEFsZXJ0W119IGFsZXJ0cyBMaXN0IG9mIGFsZXJ0cyB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byBhZ2dyZWdhdG9yLlxuICAgKlxuICAgKi9cbiAgYWRkQWxlcnRzKC4uLmFsZXJ0czogRHluYW1pY0NvbXBvbmVudEFsZXJ0W10pIHtcbiAgICB0aGlzLnNldEFsZXJ0cyhhbGVydHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbGVydHMgaW4gZ3JvdXAgYnkgcHJvdmlkZWQgYWxlcnQgdHlwZSBvciByZW1vdmVzIGFsbCBhbGVydHMgd2hlbiBubyBwYXJhbSBpcyBwcm92aWRlZC5cbiAgICpcbiAgICogQHBhcmFtIHtBbGVydFR5cGV9IHR5cGUgVHlwZSBvZiBhbGVydHMgZ3JvdXAgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZC5cbiAgICpcbiAgICovXG4gIGNsZWFyKHR5cGU/OiBBbGVydFR5cGUpIHtcbiAgICBpZiAodHlwZSkge1xuICAgICAgdGhpcy5hZ2dyZWdhdGVkQWxlcnRzRGF0YS5nZXQodHlwZSkuYWxlcnRzID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWdncmVnYXRlZEFsZXJ0c0RhdGEuZm9yRWFjaCh2YWx1ZSA9PiAodmFsdWUuYWxlcnRzID0gW10pKTtcbiAgICB9XG4gICAgdGhpcy5vbkRhdGFDaGFuZ2VkKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBwb3NzaWJpbGl0eSBvZiBhbGVydCB0byBiZSBkaXNtaXNzZWQgaW4gc3BlY2lmaWMgd2F5LlxuICAgKlxuICAgKiBAcGFyYW0ge0FsZXJ0VHlwZX0gYWxlcnRUeXBlIFR5cGUgb2YgYWxlcnRzIGZvciB3aGljaCB0aGUgZGlzbWlzc2FsIHN0cmF0ZWd5IHNob3VsZCBiZSBzZXQuXG4gICAqIEBwYXJhbSB7ZGlzbWlzc1N0cmF0ZWd5fSBkaXNtaXNzU3RyYXRlZ3kgVHlwZSBvZiBkaXNtaXNzYWwgc3RyYXRlZ3kgdGhhdCB3aWxsIGJlIHNldCBmb3IgdGhlIGFsZXJ0IHR5cGUuXG4gICAqXG4gICAqL1xuICBzZXRBbGVydEdyb3VwRGlzbWlzc1N0cmF0ZWd5KGFsZXJ0VHlwZTogQWxlcnRUeXBlLCBkaXNtaXNzU3RyYXRlZ3k6IERpc21pc3NBbGVydFN0cmF0ZWd5KSB7XG4gICAgdGhpcy5hZ2dyZWdhdGVkQWxlcnRzRGF0YS5nZXQoYWxlcnRUeXBlKS5hbGVydERpc21pc3NhbC5kaXNtaXNzU3RyYXRlZ3kgPSBkaXNtaXNzU3RyYXRlZ3k7XG4gICAgdGhpcy5vbkRhdGFDaGFuZ2VkKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGVydHMgaW4gZ3JvdXAgZHVlIHRvIGRpc21pc3NhbCBkaXNtaXNzU3RyYXRlZ3kgYW5kIHNldHMgdXNlckRpc21pc3NhbENob2ljZSBwcm9wZXJ0eS5cbiAgICogSWYgZ3JvdXAgaGFzIGRpc21pc3NhbCBzdHJhdGVneSBkZWNsYXJlZCBhcyBURU1QT1JBUllfT1JfUEVSTUFORU5ULCBpdHMgdXNlckRpc21pc3NhbENob2ljZSBwcm9wZXJ0eSBjYW4gYmUgc2V0IHRvXG4gICAqIFJFTUlORF9BTExPV0VEIG9yIFJFTUlORF9ESVNBTExPV0VEIGRlcGVuZGluZyBvbiBwYXJhbWV0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7QWxlcnRUeXBlfSBhbGVydFR5cGUgVHlwZSBvZiBhbGVydHMgZ3JvdXAgdGhhdCBzaG91bGQgYmUgZGlzbWlzc2VkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBlcm1hbmVudCBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRpc21pc3NhbCBvZiBhbGVydHMgb2YgYSBnaXZlbiB0eXBlIGlzIHBlcm1hbmVudC5cbiAgICpcbiAgICovXG4gIGRpc21pc3NBbGVydEdyb3VwKGFsZXJ0VHlwZTogQWxlcnRUeXBlLCBpc1Blcm1hbmVudCA9IGZhbHNlKSB7XG4gICAgY29uc3QgZ3JvdXBEaXNtaXNzU3RyYXRlZ3kgPVxuICAgICAgdGhpcy5hZ2dyZWdhdGVkQWxlcnRzRGF0YS5nZXQoYWxlcnRUeXBlKS5hbGVydERpc21pc3NhbC5kaXNtaXNzU3RyYXRlZ3k7XG5cbiAgICBzd2l0Y2ggKGdyb3VwRGlzbWlzc1N0cmF0ZWd5KSB7XG4gICAgICBjYXNlIERpc21pc3NBbGVydFN0cmF0ZWd5Lk5PTkU6XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgRGlzbWlzc0FsZXJ0U3RyYXRlZ3kuVEVNUE9SQVJZOlxuICAgICAgICB0aGlzLmFnZ3JlZ2F0ZWRBbGVydHNEYXRhLmdldChhbGVydFR5cGUpLmFsZXJ0RGlzbWlzc2FsLnVzZXJEaXNtaXNzYWxDaG9pY2UgPVxuICAgICAgICAgICdSRU1JTkRfQUxMT1dFRCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBEaXNtaXNzQWxlcnRTdHJhdGVneS5URU1QT1JBUllfT1JfUEVSTUFORU5UOlxuICAgICAgICB0aGlzLmFnZ3JlZ2F0ZWRBbGVydHNEYXRhLmdldChhbGVydFR5cGUpLmFsZXJ0RGlzbWlzc2FsLnVzZXJEaXNtaXNzYWxDaG9pY2UgPSBpc1Blcm1hbmVudFxuICAgICAgICAgID8gJ1JFTUlORF9ESVNBTExPV0VEJ1xuICAgICAgICAgIDogJ1JFTUlORF9BTExPV0VEJztcbiAgICB9XG5cbiAgICB0aGlzLmNsZWFyKGFsZXJ0VHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogQWxlcnQgYWdncmVnYXRvciBhcyBhIHdpZGdldCBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIHNlcmlhbGl6ZWQgYW5kIHN0b3JlZCBpbiBkYXRhYmFzZS5cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0QWxlcnRzR3JvdXBzKCkge1xuICAgIHRoaXMuYWdncmVnYXRlZEFsZXJ0c0RhdGEgPSBuZXcgTWFwKFxuICAgICAgV0lER0VUX0FMRVJUU19PUkRFUi5tYXAoYWxlcnRUeXBlID0+IHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBhbGVydFR5cGUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWxlcnRzOiBbXSxcbiAgICAgICAgICAgIGFsZXJ0RGlzbWlzc2FsOiB7IGRpc21pc3NTdHJhdGVneTogRGlzbWlzc0FsZXJ0U3RyYXRlZ3kuTk9ORSB9XG4gICAgICAgICAgfSBhcyBBbGVydEdyb3VwRGF0YVxuICAgICAgICBdO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRBbGVydHMoYWxlcnRzOiBEeW5hbWljQ29tcG9uZW50QWxlcnRbXSkge1xuICAgIGFsZXJ0cy5mb3JFYWNoKGFsZXJ0ID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5hZ2dyZWdhdGVkQWxlcnRzRGF0YS5nZXQoYWxlcnQudHlwZSkuYWxlcnREaXNtaXNzYWwudXNlckRpc21pc3NhbENob2ljZSA9PT1cbiAgICAgICAgJ1JFTUlORF9ESVNBTExPV0VEJ1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5hZ2dyZWdhdGVkQWxlcnRzRGF0YS5nZXQoYWxlcnQudHlwZSkpIHtcbiAgICAgICAgdGhpcy5hZ2dyZWdhdGVkQWxlcnRzRGF0YS5nZXQoYWxlcnQudHlwZSkuYWxlcnRzID0gW107XG4gICAgICB9XG4gICAgICB0aGlzLmFnZ3JlZ2F0ZWRBbGVydHNEYXRhLmdldChhbGVydC50eXBlKS5hbGVydHMucHVzaChhbGVydCk7XG4gICAgfSk7XG4gICAgdGhpcy5vbkRhdGFDaGFuZ2VkKCk7XG4gIH1cblxuICBwcml2YXRlIG9uRGF0YUNoYW5nZWQoKSB7XG4gICAgdGhpcy5hbGVydEdyb3VwcyA9IFsuLi5jbG9uZURlZXAodGhpcy5hZ2dyZWdhdGVkQWxlcnRzRGF0YSldLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoe1xuICAgICAgdHlwZToga2V5LFxuICAgICAgdmFsdWVcbiAgICB9KSk7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgdGhpcy5hbnlBbGVydEV4aXN0c1N1YmplY3QubmV4dCh0aGlzLmFsZXJ0R3JvdXBzLnNvbWUoKHsgdmFsdWUgfSkgPT4gISF2YWx1ZS5hbGVydHMubGVuZ3RoKSk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==