@c8y/ngx-components 1010.0.33 → 1010.0.37

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.
@@ -12,5 +12,5 @@
12
12
  LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
13
  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
14
  PERFORMANCE OF THIS SOFTWARE.
15
- ***************************************************************************** */var b=function(){return(b=Object.assign||function(t){for(var e,n=1,i=arguments.length;n<i;n++)for(var a in e=arguments[n])Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a]);return t}).apply(this,arguments)};function m(t,e,n,i){var a,s=arguments.length,r=s<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,n,i);else for(var o=t.length-1;o>=0;o--)(a=t[o])&&(r=(s<3?a(r):s>3?a(e,n,r):a(e,n))||r);return s>3&&r&&Object.defineProperty(e,n,r),r}function f(t,e,n,i){return new(n||(n=Promise))((function(a,s){function r(t){try{l(i.next(t))}catch(t){s(t)}}function o(t){try{l(i.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?a(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(r,o)}l((i=i.apply(t,e||[])).next())}))}function g(t,e){var n,i,a,s,r={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]};return s={next:o(0),throw:o(1),return:o(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function o(s){return function(o){return function(s){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,i&&(a=2&s[0]?i.return:s[0]?i.throw||((a=i.return)&&a.call(i),0):i.next)&&!(a=a.call(i,s[1])).done)return a;switch(i=0,a&&(s=[2&s[0],a.value]),s[0]){case 0:case 1:a=s;break;case 4:return r.label++,{value:s[1],done:!1};case 5:r.label++,i=s[1],s=[0];continue;case 7:s=r.ops.pop(),r.trys.pop();continue;default:if(!(a=r.trys,(a=a.length>0&&a[a.length-1])||6!==s[0]&&2!==s[0])){r=0;continue}if(3===s[0]&&(!a||s[1]>a[0]&&s[1]<a[3])){r.label=s[1];break}if(6===s[0]&&r.label<a[1]){r.label=a[1],a=s;break}if(a&&r.label<a[2]){r.label=a[2],r.ops.push(s);break}a[2]&&r.ops.pop(),r.trys.pop();continue}s=e.call(t,r)}catch(t){s=[6,t],i=0}finally{n=a=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,o])}}}function v(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var i,a,s=n.call(t),r=[];try{for(;(void 0===e||e-- >0)&&!(i=s.next()).done;)r.push(i.value)}catch(t){a={error:t}}finally{try{i&&!i.done&&(n=s.return)&&n.call(s)}finally{if(a)throw a.error}}return r}var O=function(){function t(t,e){this.bulkOperationDetailsService=t,this.modalRef=e}return t.ctorParameters=function(){return[{type:k},{type:c.BsModalRef}]},m([e.Input()],t.prototype,"bulkOperation",void 0),t=m([e.Component({selector:"c8y-bulk-operations-wrapper",template:'<div class="viewport-modal">\n <div class="modal-header">\n <h3>{{ \'Bulk operation details\' | translate }}</h3>\n </div>\n\n <div class="modal-inner-scroll">\n <c8y-bulk-operation-list-item\n [bulkOperation]="bulkOperation"\n [detailsCollapsed]="false"\n [readOnly]="true"\n (showFailedOperation)="bulkOperationDetailsService.openDetails($event)"\n ></c8y-bulk-operation-list-item>\n </div>\n\n <div class="modal-footer">\n <button title="{{ \'Close\' | translate }}" class="btn btn-default" (click)="modalRef.hide()">\n {{ \'Close\' | translate }}\n </button>\n </div>\n</div>\n'})],t)}(),k=function(){function t(t,e){this.bulkOperationsService=t,this.modalService=e}return t.prototype.openDetails=function(t){return f(this,void 0,void 0,(function(){var e,n;return g(this,(function(i){switch(i.label){case 0:return[4,this.bulkOperationsService.getBulkOperationById(t)];case 1:return e=i.sent().data,n={bulkOperation:e},this.modalService.show(O,{initialState:n,class:"modal-lg"}),[2]}}))}))},t.ctorParameters=function(){return[{type:p.BulkOperationsService},{type:c.BsModalService}]},t=m([e.Injectable()],t)}(),S=function(){function t(t,e){this.bsModalRef=t,this.resolver=e,this.showComponent=!1}return t.prototype.cancel=function(){this.bsModalRef.hide()},t.prototype.createComponent=function(t){if(t&&t.component){this.showComponent=!0;var e=this.resolver.resolveComponentFactory(t.component);this.container.createComponent(e)}},t.ctorParameters=function(){return[{type:c.BsModalRef},{type:e.ComponentFactoryResolver}]},m([e.ViewChild("container",{static:!1,read:e.ViewContainerRef})],t.prototype,"container",void 0),t=m([e.Component({selector:"c8y-bulk-operations-modal",template:'<div class="viewport-modal">\n <div class="modal-header dialog-header">\n <h1 class="c8y-icon c8y-icon-energy"></h1>\n <h4 translate>New bulk operation</h4>\n </div>\n <div class="modal-inner-scroll">\n <div class="modal-body text-center" [hidden]="showComponent">\n <h4 translate>Select one of the available options</h4>\n <p c8y-guide-docs>\n <small translate ngNonBindable>\n Check the\n <a c8y-guide-href="users-guide/device-management/#bulk-operation-wizard"\n >User guide`KEEP_ORIGINAL`</a\n >\n for more details.</small\n >\n </p>\n </div>\n\n <c8y-bulk-operation-type-list\n (onCustomType)="createComponent($event)"\n ></c8y-bulk-operation-type-list>\n <template #container></template>\n </div>\n <div class="modal-footer" [hidden]="showComponent">\n <button\n (click)="cancel()"\n type="button"\n class="btn btn-default"\n title="{{ \'Cancel\' | translate }}"\n >\n <span translate>Cancel</span>\n </button>\n </div>\n</div>\n'})],t)}(),x=function(){function t(t){this.bsModalService=t}return t.prototype.showNewBulkOperationModal=function(){this.bsModalRef=this.bsModalService.show(S,{backdrop:"static",class:"modal-sm"})},t.prototype.hideNewBulkOperationModal=function(){this.bsModalRef&&this.bsModalRef.hide()},t.ctorParameters=function(){return[{type:c.BsModalService}]},t=m([e.Injectable()],t)}(),C=function(){function t(t,e,n){this.bsModalRef=t,this.bulkOperationsService=e,this.alert=n,this.closeSubject=new d.Subject}return t.prototype.ngOnInit=function(){this.modalTitle=this.getTitle()},t.prototype.onDateAndDelaySelect=function(t){this.dateAndDelay=t},t.prototype.getTitle=function(){return this.isRetryOperation?s.gettext("Retry operation"):s.gettext("Edit schedule")},t.prototype.onCancel=function(){this.bsModalRef.hide()},t.prototype.onSave=function(){return f(this,void 0,void 0,(function(){var t,e,n;return g(this,(function(i){switch(i.label){case 0:if(this.bulkOperation.startDate=this.dateAndDelay.scheduledDate.toISOString(),this.bulkOperation.creationRamp=this.dateAndDelay.delayInSeconds,!this.isRetryOperation)return[3,5];i.label=1;case 1:return i.trys.push([1,3,,4]),[4,this.bulkOperationsService.createBulkOperation(this.bulkOperation)];case 2:return t=i.sent(),this.alert.success(s.gettext("Successfully rescheduled for a retry.")),[3,4];case 3:return e=i.sent(),this.alert.addServerFailure(e),[3,4];case 4:return[3,8];case 5:return i.trys.push([5,7,,8]),[4,this.bulkOperationsService.updateBulkOperation(this.bulkOperation)];case 6:return t=i.sent(),this.alert.success(s.gettext("Successfully rescheduled.")),[3,8];case 7:return n=i.sent(),this.alert.addServerFailure(n),[3,8];case 8:return this.closeSubject.next(t.data),this.bsModalRef.hide(),[2]}}))}))},t.ctorParameters=function(){return[{type:c.BsModalRef},{type:p.BulkOperationsService},{type:s.AlertService}]},t=m([e.Component({selector:"c8y-bulk-operations-reschedule-modal",template:'<div class="viewport-modal">\n <div class="modal-header dialog-header">\n <h1 class="c8y-icon c8y-icon-energy"></h1>\n <h4>{{ modalTitle | translate }}</h4>\n </div>\n <div class="modal-inner-scroll">\n <div class="modal-body">\n <div class="text-center">\n <c8y-operation-summary\n [description]="bulkOperation.operationPrototype.description"\n ></c8y-operation-summary>\n </div>\n <div class="p-t-16 center-block" style="max-width: 300px;">\n <c8y-operation-scheduler\n [(ngModel)]="dateAndDelay"\n #scheduler="ngModel"\n ></c8y-operation-scheduler>\n </div>\n </div>\n </div>\n <div class="modal-footer">\n <button\n (click)="onCancel()"\n type="button"\n class="btn btn-default"\n title="{{ \'Cancel\' | translate }}"\n >\n <span translate>Cancel</span>\n </button>\n <button\n id="save-btn"\n (click)="onSave()"\n type="button"\n class="btn btn-primary"\n title="{{ \'Save\' | translate }}"\n [disabled]="scheduler?.control?.errors"\n >\n <span translate>Save</span>\n </button>\n </div>\n</div>\n'})],t)}(),F={SCHEDULED:s.gettext("Scheduled"),EXECUTING:s.gettext("Executing"),CANCELED:s.gettext("Canceled"),FAILED:s.gettext("Completed with failures"),SUCCESSFUL:s.gettext("Completed successfully")},I=[{label:F.SCHEDULED,generalStatus:[h.OperationBulkGeneralStatus.SCHEDULED],iconClass:"dlt-c8y-icon-calendar text-info"},{label:F.EXECUTING,generalStatus:[h.OperationBulkGeneralStatus.EXECUTING,h.OperationBulkGeneralStatus.EXECUTING_WITH_ERROR],iconClass:"dlt-c8y-icon-refresh text-primary"},{label:F.CANCELED,generalStatus:[h.OperationBulkGeneralStatus.CANCELED],iconClass:"dlt-c8y-icon-ban text-muted"},{label:F.FAILED,generalStatus:[h.OperationBulkGeneralStatus.FAILED],iconClass:"dlt-c8y-icon-exclamation-triangle text-danger"},{label:F.SUCCESSFUL,generalStatus:[h.OperationBulkGeneralStatus.SUCCESSFUL],iconClass:"dlt-c8y-icon-check-circle text-success"}],w=function(){function t(t,n,i,a){this.bulkOperationsService=t,this.modal=n,this.alert=i,this.bsModalService=a,this.detailsCollapsed=!0,this.readOnly=!1,this.showFailedOperation=new e.EventEmitter,this.reload=new e.EventEmitter,this.refreshLoading=!1,this.bulkOperationGeneralStatus=h.OperationBulkGeneralStatus,this.bulkOperationStatusOptions=I,this.finishDatePopoverText=s.gettext("Approximate date, estimated based on the bulk operation settings."),this.progressBarClass="progress",this.progressBarStatus=0}return t.prototype.ngOnInit=function(){this.iconClass=this.getIconClass(),this.finishDate=this.calculateFinishDateMs(),this.setProgressBar()},t.prototype.ngOnChanges=function(t){t.bulkOperation&&!t.bulkOperation.firstChange&&(this.iconClass=this.getIconClass(),this.setProgressBar())},t.prototype.getIconClass=function(){var t=this;return this.bulkOperationStatusOptions.find((function(e){return e.generalStatus.includes(t.bulkOperation.generalStatus)})).iconClass},t.prototype.calculateFinishDateMs=function(){return new Date(this.bulkOperation.startDate).getTime()+1e3*this.bulkOperation.creationRamp*this.bulkOperation.progress.all},t.prototype.progressBarProgressFn=function(){return(this.bulkOperation.progress.successful+this.bulkOperation.progress.failed)/this.bulkOperation.progress.all*100},t.prototype.setProgressBar=function(){var t="progress-bar progress-striped active progress-bar",e={EXECUTING:{progressBarClass:"progress progress-striped active",progressBarColor:t+"-primary",progressBarStatus:this.progressBarProgressFn()},EXECUTING_WITH_ERROR:{progressBarClass:"progress progress-striped active",progressBarColor:t+"-danger",progressBarStatus:this.progressBarProgressFn()},FAILED:{progressBarClass:"progress",progressBarColor:t+"-danger",progressBarStatus:100},SUCCESSFUL:{progressBarClass:"progress",progressBarColor:t+"-success",progressBarStatus:100}};u.assign(this,e[this.bulkOperation.generalStatus])},t.prototype.editSchedule=function(){var t={initialState:{bulkOperation:u.cloneDeep(this.bulkOperation)},class:"modal-sm",backdrop:"static"};this.bsModalRef=this.bsModalService.show(C,t)},t.prototype.cancelBulkOperation=function(){return f(this,void 0,void 0,(function(){var t;return g(this,(function(e){switch(e.label){case 0:return e.trys.push([0,3,,4]),[4,this.modal.confirm(s.gettext("Cancel bulk operation"),s.gettext("You are about to cancel the bulk operation. Do you want to proceed?"),s.Status.DANGER)];case 1:return e.sent(),[4,this.bulkOperationsService.deleteBulkOperation(this.bulkOperation.id)];case 2:return e.sent(),this.reload.emit(),this.alert.success(s.gettext("Operation canceled.")),[3,4];case 3:return t=e.sent(),this.alert.addServerFailure(t),[3,4];case 4:return[2]}}))}))},t.prototype.retryFailedOperation=function(){var t=this,e=u.cloneDeep(this.bulkOperation);delete e.groupId,e.failedParentId=this.bulkOperation.id;var n={initialState:{bulkOperation:e,isRetryOperation:!0},class:"modal-sm",backdrop:"static"};this.bsModalRef=this.bsModalService.show(C,n),this.bsModalRef.content.closeSubject.subscribe((function(){t.reload.emit()}))},t.prototype.setToSuccessful=function(){return f(this,void 0,void 0,(function(){var t;return g(this,(function(e){switch(e.label){case 0:return e.trys.push([0,3,,4]),[4,this.modal.confirm(s.gettext("Set manually bulk operation to SUCCESSFUL"),s.gettext("You are about to change the bulk operation status to SUCCESSFUL. Do you want to proceed?"),s.Status.DANGER)];case 1:return e.sent(),[4,this.bulkOperationsService.updateBulkOperation({id:this.bulkOperation.id,generalStatus:h.OperationBulkGeneralStatus.SUCCESSFUL})];case 2:return e.sent(),this.reload.emit(),this.alert.success(s.gettext("Operation status changed to SUCCESSFUL.")),[3,4];case 3:return t=e.sent(),this.alert.addServerFailure(t),[3,4];case 4:return[2]}}))}))},t.prototype.openFailedOperation=function(t){this.showFailedOperation.emit(t)},t.prototype.isStatusScheduled=function(){return this.bulkOperation.generalStatus===this.bulkOperationGeneralStatus.SCHEDULED},t.prototype.isStatusExecutingOrExecutingWithError=function(){return this.bulkOperation.generalStatus===this.bulkOperationGeneralStatus.EXECUTING||this.bulkOperation.generalStatus===this.bulkOperationGeneralStatus.EXECUTING_WITH_ERROR},t.prototype.allOperationsCreated=function(){return this.bulkOperation.progress.all===this.bulkOperation.progress.executing+this.bulkOperation.progress.failed+this.bulkOperation.progress.pending+this.bulkOperation.progress.successful},t.prototype.isStatusCanceled=function(){return this.bulkOperation.generalStatus===this.bulkOperationGeneralStatus.CANCELED},t.prototype.isStatusFailed=function(){return this.bulkOperation.generalStatus===this.bulkOperationGeneralStatus.FAILED},t.ctorParameters=function(){return[{type:p.BulkOperationsService},{type:s.ModalService},{type:s.AlertService},{type:c.BsModalService}]},m([e.Input()],t.prototype,"bulkOperation",void 0),m([e.Input()],t.prototype,"detailsCollapsed",void 0),m([e.Input()],t.prototype,"readOnly",void 0),m([e.Output()],t.prototype,"showFailedOperation",void 0),m([e.Output()],t.prototype,"reload",void 0),m([e.ViewChild("listItem",{static:!0})],t.prototype,"listItem",void 0),t=m([e.Component({selector:"c8y-bulk-operation-list-item",template:'<c8y-li\n class="c8y-list__item--double-actions"\n [ngClass]="{ \'c8y-list__item--no-expand\': !detailsCollapsed }"\n [collapsed]="detailsCollapsed"\n #listItem\n id="{{ bulkOperation.id }}"\n>\n <c8y-li-icon>\n <i [class]="iconClass"></i>\n </c8y-li-icon>\n <div [ngClass]="{ \'content-flex-58\': !readOnly, \'content-flex-50\': readOnly }">\n <div class="col-5">\n <span\n class="text-truncate"\n title="{{ bulkOperation.id }} - {{\n bulkOperation.operationPrototype.description | translate\n }}"\n >\n <strong class="text-muted m-r-4">{{ bulkOperation.id }}</strong>\n {{ bulkOperation.operationPrototype.description | translate }}\n </span>\n </div>\n <div class="flex-grow">\n <div class="m-t-8 visible-xs"></div>\n <hr *ngIf="isStatusCanceled(); else statusNotCanceled" class="m-t-16 m-b-0" />\n <ng-template #statusNotCanceled>\n <div [class]="progressBarClass" title="{{ progressBarStatus | number: \'1.0-0\' }}%">\n <div\n [class]="progressBarColor"\n role="progressbar"\n aria-valuenow="0"\n aria-valuemin="0"\n aria-valuemax="100"\n [style.width.%]="progressBarStatus"\n >\n <span *ngIf="progressBarStatus !== 0">{{ progressBarStatus | number: \'1.0-0\' }}%</span>\n </div>\n </div>\n </ng-template>\n </div>\n <div class="col-4">\n <div class="p-t-8 visible-xs"></div>\n <small *ngIf="bulkOperation.progress.successful > 0" class="m-r-8 icon-flex">\n <i c8yIcon="check-circle" class="text-success m-r-4"></i>\n <span\n ngNonBindable\n translate\n [translateParams]="{ bulkOperationsCountSuccessful: bulkOperation.progress.successful }"\n >\n {{ bulkOperationsCountSuccessful }} successful\n </span>\n </small>\n <small *ngIf="bulkOperation.progress.failed > 0" class="m-r-8 icon-flex">\n <i c8yIcon="warning" class="text-danger m-r-4"></i>\n <span\n ngNonBindable\n translate\n [translateParams]="{ bulkOperationsCountFailed: bulkOperation.progress.failed }"\n >\n {{ bulkOperationsCountFailed }} failed\n </span>\n </small>\n <small *ngIf="bulkOperation.progress.pending > 0" class="m-r-8 icon-flex">\n <i c8yIcon="clock-o" class="text-primary m-r-4"></i>\n <span\n ngNonBindable\n translate\n [translateParams]="{ bulkOperationsCountPending: bulkOperation.progress.pending }"\n >\n {{ bulkOperationsCountPending }} pending\n </span>\n </small>\n </div>\n </div>\n <div class="c8y-list__item__footer">\n <div class="m-r-16">\n <span class="text-label-small m-r-4" translate>Start</span>\n <small class="icon-flex">\n <i c8yIcon="calendar" class="m-r-4"></i>\n <span>\n {{ bulkOperation.startDate | c8yDate }}\n </span>\n </small>\n </div>\n <div class="m-r-16" *ngIf="bulkOperationGeneralStatus.CANCELED !== bulkOperation.generalStatus">\n <span class="text-label-small m-r-4" translate>Finish</span>\n\n <small class="icon-flex">\n <i c8yIcon="calendar" class="m-r-4"></i>\n <span>{{ finishDate | c8yDate }}</span>\n </small>\n <a\n container="body"\n *ngIf="isStatusScheduled() || isStatusExecutingOrExecutingWithError()"\n class="btn-clean m-l-4"\n popover="{{ finishDatePopoverText | translate }}"\n placement="right"\n outsideClick="true"\n >\n <i c8yIcon="question-circle-o text-primary"></i>\n </a>\n </div>\n </div>\n <ng-container *ngIf="!readOnly">\n <c8y-li-action\n *ngIf="isStatusScheduled()"\n label="{{ \'Edit schedule\' | translate }}"\n (click)="editSchedule()"\n icon="pencil"\n >\n </c8y-li-action>\n <c8y-li-action\n *ngIf="\n isStatusScheduled() || (isStatusExecutingOrExecutingWithError() && !allOperationsCreated())\n "\n label="{{ \'Cancel bulk operation\' | translate }}"\n (click)="cancelBulkOperation()"\n icon="remove"\n >\n </c8y-li-action>\n <c8y-li-action\n *ngIf="isStatusFailed()"\n label="{{ \'Retry failed operations\' | translate }}"\n (click)="retryFailedOperation()"\n icon="repeat"\n >\n </c8y-li-action>\n <c8y-li-action\n *ngIf="isStatusFailed()"\n label="{{ \'Set operation to SUCCESSFUL\' | translate }}"\n (click)="setToSuccessful()"\n icon="check-circle"\n >\n </c8y-li-action>\n </ng-container>\n <c8y-li-collapse class="m-b-16">\n <c8y-bulk-operation-details-tabs\n *ngIf="!listItem.collapsed"\n [bulkOperation]="bulkOperation"\n [readOnly]="readOnly"\n (onRetryFailedOperations)="retryFailedOperation()"\n (showFailedOperation)="openFailedOperation($event)"\n >\n </c8y-bulk-operation-details-tabs>\n </c8y-li-collapse>\n</c8y-li>\n'})],t)}(),B=function(){function t(t,e,n){var i=this;this.realtime=t,this.bulkOperationsService=e,this.bulkOperationModalsService=n,this.bulkTypes=[],this.selectedTypeFilters=this.getTypeFilters(),this.bulkOperationStatusOptions=I,this.refreshLoading=!1,this.statusFilter$=new d.BehaviorSubject(null),this.typeFilter$=new d.BehaviorSubject(null),this.timeFilter$=new d.BehaviorSubject(null),this.reload$=new d.BehaviorSubject(null),this.bulkOperations$=d.combineLatest(this.statusFilter$,this.timeFilter$,this.typeFilter$,this.reload$).pipe(y.tap((function(){i.refreshLoading=!0})),y.switchMap((function(t){var e=v(t,2),n=e[0],a=e[1];return i.filter(n,a)})),y.withLatestFrom(this.typeFilter$),y.map((function(t){var e=v(t,2),n=e[0],a=e[1];return i.filterPipe=d.pipe(y.map((function(t){return i.filterByType(t,a)}))),b({},n,{data:i.filterByType(n.data,a)})})),y.tap((function(){i.refreshLoading=!1})),y.shareReplay(1)),this.allFilterFragments=this.flattenFilterFragments(this.getTypeFilters())}return t.prototype.ngOnInit=function(){this.bulkTypes=this.bulkOperationsService.getBulkTypes()},t.prototype.filterByType=function(t,e){var n=this.flattenFilterFragments(e);return!n.length||this.allFilterFragments.every((function(t){return n.includes(t)}))?t:t.filter((function(t){return Object.keys(t.operationPrototype).some((function(t){return n.includes(t)}))}))},t.prototype.resetFilter=function(){this.statusFilter$.next(null),this.timeFilter$.next(null),this.typeFilter$.next(null),this.datePicker.clearFilter(),this.selectedTypeFilters=this.getTypeFilters(),this.statusFilter.reset()},t.prototype.isFilterApplied=function(){return this.statusFilter$.getValue()||this.typeFilter$.getValue()||this.timeFilter$.getValue()},t.prototype.filter=function(t,e){var n=t&&t.length>0?{generalStatus:u.flatten(t.map((function(t){return t.generalStatus})))}:{},i=e?b({},e.dateFrom&&{dateFrom:e.dateFrom.toISOString()},e.dateTo&&{dateTo:e.dateTo.toISOString()}):{};return this.getBulkOperations(b({},n,i))},t.prototype.getBulkOperations=function(t){return this.bulkOperationsService.getBulkOperations(t)},t.prototype.getTypeFilters=function(){return this.bulkOperationsService.getBulkTypes()},t.prototype.addBulkOperation=function(){this.bulkOperationModalsService.showNewBulkOperationModal()},t.prototype.openFailedOperation=function(t){this.listItems.forEach((function(e){e.bulkOperation.id===t&&(e.listItem.collapsed=!1,e.listItem.element.nativeElement.scrollIntoView({behavior:"smooth",block:"center"}))}))},t.prototype.compareOperations=function(t,e){return new Date(t.startDate).getTime()-new Date(e.startDate).getTime()},t.prototype.flattenFilterFragments=function(t){return(t||[]).reduce((function(t,e){return t.concat(e.fragments)}),[])},t.ctorParameters=function(){return[{type:s.OperationBulkRealtimeService},{type:p.BulkOperationsService},{type:x}]},m([e.ViewChildren(w)],t.prototype,"listItems",void 0),m([e.ViewChild("statusFilter",{static:!0})],t.prototype,"statusFilter",void 0),m([e.ViewChild(s.DatePickerComponent,{static:!0})],t.prototype,"datePicker",void 0),t=m([e.Component({selector:"c8y-bulk-operations",template:'<c8y-title> {{ \'Device control\' | translate }}</c8y-title>\n<c8y-action-bar-item *ngIf="bulkTypes?.length" itemClass="navbar-form" [placement]="\'left\'">\n <label translate class="hidden-sm">Type</label>\n <c8y-select\n style="width: 180px;"\n [items]="bulkTypes"\n [selected]="selectedTypeFilters"\n [disableApplyOnNoSelection]="true"\n (onChange)="selectedTypeFilters = $event; typeFilter$.next(selectedTypeFilters)"\n >\n </c8y-select>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]="\'left\'" itemClass="navbar-form">\n <c8y-status-filter\n #statusFilter\n [options]="bulkOperationStatusOptions"\n (onFilterChanged)="statusFilter$.next($event)"\n ></c8y-status-filter>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]="\'left\'" itemClass="navbar-form">\n <c8y-date-picker (onDateSelected)="timeFilter$.next($event)"></c8y-date-picker>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]="\'right\'">\n <c8y-realtime-btn [service]="realtime"></c8y-realtime-btn>\n</c8y-action-bar-item>\n<c8y-action-bar-item [placement]="\'right\'">\n <button\n *ngIf="bulkTypes?.length"\n class="btn btn-link d-flex a-i-center"\n (click)="addBulkOperation()"\n title="{{ \'New bulk operation\' | translate }}"\n >\n <i c8yIcon="plus-circle" class="m-r-4"></i> \n <span class="text-truncate">\n {{ \'New bulk operation\' | translate }}\n </span> \n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item [placement]="\'right\'">\n <button class="btn btn-link d-flex a-i-center" \n title="{{ \'Reload\' | translate }}" \n (click)="reload$.next()"\n >\n <i c8yIcon="refresh" [ngClass]="{ \'icon-spin\': refreshLoading }" class="m-r-4"></i>\n <span class="text-truncate">\n {{ \'Reload\' | translate }}\n </span>\n </button>\n</c8y-action-bar-item>\n\x3c!-- Empty state --\x3e\n<div\n class="c8y-empty-state text-center"\n *ngIf="(bulkOperations$ | async)?.data.length === 0 && !isFilterApplied()"\n>\n <h1 class="c8y-icon c8y-icon-energy c8y-icon-duocolor"></h1>\n <h3 translate>No items to display</h3>\n <p translate>Bulk operations will be displayed here</p>\n <button\n type="button"\n *ngIf="bulkTypes?.length"\n title="{{ \'New bulk operation\' | translate }}"\n class="btn btn-primary"\n (click)="addBulkOperation()"\n translate\n >\n New bulk operation\n </button>\n</div>\n\n\x3c!-- No results empty state --\x3e\n<div\n class="c8y-empty-state text-center"\n *ngIf="(bulkOperations$ | async)?.data.length === 0 && isFilterApplied()"\n>\n <h1 c8yIcon="search" class="c8y-icon c8y-icon-duocolor"></h1>\n <h3 translate>No results to display.</h3>\n <p translate>Adjust or reset the filter.</p>\n <button\n type="button"\n title="{{ \'Reset filter\' | translate }}"\n class="btn btn-primary"\n (click)="resetFilter()"\n translate\n >\n Reset filter\n </button>\n</div>\n\n\x3c!-- Detailed list of operations + load more button --\x3e\n<c8y-list-group\n class="m-b-24"\n [ngClass]="{ \'dd-low\': (bulkOperations$ | async)?.data.length < 10 }"\n>\n <div\n class="page-sticky-header hidden-xs c8y-list__item--double-actions c8y-list__item"\n *ngIf="(bulkOperations$ | async)?.data.length"\n >\n <div class="c8y-list__item__block">\n <div class="c8y-list__item__icon">\n <i class="fa"></i>\n </div>\n <div class="c8y-list__item__body">\n <div class="content-flex-57">\n <div class="col-5">\n {{ \'Operation\' | translate }}\n </div>\n <div class="flex-grow">\n {{ \'Progress\' | translate }}\n </div>\n <div class="col-4">\n {{ \'Status\' | translate }}\n </div>\n </div>\n </div>\n <div class="c8y-list__item__actions"></div>\n </div>\n </div>\n <div\n class="d-contents"\n *c8yFor="\n let bulkOperation of bulkOperations$ | async;\n let i = index;\n realtime: realtime;\n pipe: filterPipe;\n comparator: compareOperations.bind(this);\n loadMore: \'auto\';\n "\n >\n <c8y-bulk-operation-list-item\n [bulkOperation]="bulkOperation"\n (reload)="reload$.next()"\n (showFailedOperation)="openFailedOperation($event)"\n class="d-contents"\n >\n </c8y-bulk-operation-list-item>\n </div>\n</c8y-list-group>\n',providers:[s.OperationBulkRealtimeService]})],t)}(),E=function(){function t(){this.readOnly=!1,this.onRetryFailedOperations=new e.EventEmitter,this.showFailedOperation=new e.EventEmitter,this.tabs=[]}return t.prototype.ngOnInit=function(){this.template=this.detailsTemplate,this.tabs=[{label:s.gettext("Details"),path:null,icon:"asterisk",template:this.detailsTemplate},{label:s.gettext("History of changes"),path:null,icon:"archive",template:this.auditTemplate}]},m([e.Input()],t.prototype,"bulkOperation",void 0),m([e.Input()],t.prototype,"readOnly",void 0),m([e.Output()],t.prototype,"onRetryFailedOperations",void 0),m([e.Output()],t.prototype,"showFailedOperation",void 0),m([e.ViewChild("details",{static:!0})],t.prototype,"detailsTemplate",void 0),m([e.ViewChild("audit",{static:!0})],t.prototype,"auditTemplate",void 0),t=m([e.Component({selector:"c8y-bulk-operation-details-tabs",template:'<div #container class="tabContainer">\n <ul class="nav nav-tabs nav-tabsc8y">\n <li [ngClass]="{ active: tab.template === template }" *ngFor="let tab of tabs">\n <button [title]="tab.label | translate" class="btn-clean" (click)="template = tab.template">\n <i [c8yIcon]="tab.icon"></i>\n <span class="txt">{{ tab.label | translate }}</span>\n </button>\n </li>\n </ul>\n</div>\n\n<ng-container *ngTemplateOutlet="template"></ng-container>\n\n<ng-template #details>\n <c8y-bulk-operation-details\n [bulkOperation]="bulkOperation"\n [readOnly]="readOnly"\n (showFailedOperation)="showFailedOperation.emit($event)"\n >\n </c8y-bulk-operation-details>\n</ng-template>\n\n<ng-template #audit>\n <c8y-audit-log [source]="bulkOperation.id"></c8y-audit-log>\n</ng-template>\n\n<c8y-single-operations-list\n [bulkOperation]="bulkOperation"\n [readOnly]="readOnly"\n (onRetryFailedOperations)="onRetryFailedOperations.emit($event)"\n class="d-flex d-col"\n></c8y-single-operations-list>\n'})],t)}(),T=function(){function t(){this.allFilterIsSelected=!1,this.readOnly=!1,this.showFailedOperation=new e.EventEmitter}return t.prototype.scrollToRetriedFromOperation=function(t){this.showFailedOperation.emit(t)},m([e.Input()],t.prototype,"bulkOperation",void 0),m([e.Input()],t.prototype,"readOnly",void 0),m([e.Output()],t.prototype,"showFailedOperation",void 0),t=m([e.Component({selector:"c8y-bulk-operation-details",template:'<div class="row d-flex-md fit-h">\n <div class="col-md-4 flex-item-top">\n <div class="legend form-block" translate>\n Details\n </div>\n <ul class="list-unstyled small">\n <li class="p-t-4 p-b-4 flex-row separator-bottom">\n <label class="small m-0" translate>Start date</label>\n <span class="flex-item-right">{{ bulkOperation.startDate | c8yDate }}</span>\n </li>\n <li class="p-t-4 p-b-4 flex-row separator-bottom">\n <label class="small m-0">\n {{ \'Delay\' | translate }}\n <a\n class="text-primary"\n tooltip="{{ \'Delay before sending the operation to the next device.\' | translate }}"\n container="body"\n >\n <i [c8yIcon]="\'info-circle\'"></i>\n </a>\n </label>\n <span [ngPlural]="bulkOperation.creationRamp" class="flex-item-right">\n <ng-template ngPluralCase="=1">\n {{ bulkOperation.creationRamp }} <span translate>second</span>\n </ng-template>\n <ng-template ngPluralCase="other">\n {{ bulkOperation.creationRamp }} <span translate>seconds</span>\n </ng-template>\n </span>\n </li>\n <li class="p-t-4 p-b-4 flex-row separator-bottom">\n <label class="small m-0" translate>Status</label>\n <span class="flex-item-right text-uppercase">\n {{ bulkOperation.generalStatus.toString() | translate }}\n </span>\n </li>\n <li class="p-t-4 p-b-4 flex-row separator-bottom">\n <label class="small flex-item-top" translate>Result</label>\n <div class="flex-row flex-grow flex-item-right flex-end">\n <div>\n <div *ngIf="bulkOperation.progress.successful > 0" class="icon-flex flex-item-left m-r-8">\n <i c8yIcon="check-circle" class="text-success m-r-4"></i>\n <span\n ngNonBindable\n translate\n [translateParams]="{\n bulkOperationsCountSuccessful: bulkOperation.progress.successful\n }"\n >\n {{ bulkOperationsCountSuccessful }} successful\n </span>\n </div>\n <div class="icon-flex flex-item-left m-r-8" *ngIf="bulkOperation.progress.failed > 0">\n <i c8yIcon="warning" class="text-danger m-r-4"></i>\n <span\n ngNonBindable\n translate\n [translateParams]="{ bulkOperationsCountFailed: bulkOperation.progress.failed }"\n >\n {{ bulkOperationsCountFailed }} failed\n </span>\n </div>\n <div class="icon-flex flex-item-left" *ngIf="bulkOperation.progress.pending > 0">\n <i c8yIcon="clock-o" class="m-r-4 text-info"></i>\n <span\n ngNonBindable\n translate\n [translateParams]="{ bulkOperationsCountPending: bulkOperation.progress.pending }"\n >\n {{ bulkOperationsCountPending }} pending\n </span>\n </div>\n </div>\n </div>\n </li>\n <li class="p-t-4 p-b-4 flex-row separator-bottom" *ngIf="bulkOperation.failedParentId">\n <label class="small m-0" translate>Retried from</label>\n <span class="flex-item-right">\n <button\n class="btn btn-default btn-xs"\n (click)="scrollToRetriedFromOperation(bulkOperation.failedParentId)"\n >\n {{ bulkOperation.failedParentId }}\n </button>\n </span>\n </li>\n <li class="p-t-4 p-b-4 flex-row separator-bottom" *ngIf="bulkOperation.note">\n <label class="small flex-item-top" translate>Description</label>\n <div\n title="{{ bulkOperation.note }}"\n class="flex-item-right text-right m-l-8 text-truncate"\n >\n {{ bulkOperation.note }}\n </div>\n </li>\n </ul>\n </div>\n <div class="col-md-8 fit-h d-flex d-col">\n <div class="legend form-block" translate>\n Operation\n </div>\n <pre class="inner-scroll p-16 m-b-0 text-pre-wrap">{{\n bulkOperation.operationPrototype | json\n }}</pre>\n </div>\n</div>\n'})],t)}(),R={PENDING:s.gettext("Pending"),EXECUTING:s.gettext("Executing"),FAILED:s.gettext("Failed"),SUCCESSFUL:s.gettext("Successful"),ALL:s.gettext("All")},D=[{label:R.PENDING,iconClass:"dlt-c8y-icon-clock-o text-info",selected:!1},{label:R.EXECUTING,iconClass:"dlt-c8y-icon-refresh text-info",selected:!1},{label:R.SUCCESSFUL,iconClass:"dlt-c8y-icon-check-circle text-success",selected:!1},{label:R.FAILED,iconClass:"dlt-c8y-icon-exclamation-circle text-danger",selected:!1}],P=function(){function t(t){this.bulkOperationsService=t,this.readOnly=!1,this.onRetryFailedOperations=new e.EventEmitter,this.singleOperationStatusProperties=D,this.singleOperationStatusNames=R}return t.prototype.ngAfterViewInit=function(){return f(this,void 0,void 0,(function(){return g(this,(function(t){return this.statusFilter&&this.filterOperationsByType(),[2]}))}))},t.prototype.ngOnChanges=function(t){t.bulkOperation&&!t.bulkOperation.firstChange&&this.filterOperationsByType()},t.prototype.filterOperationsByType=function(){if(this.statusFilter){var t=this.getFilterTypeOfSingleOperations();this.statusFilter.preset(t===this.singleOperationStatusNames.ALL?[]:[{label:t}])}else setTimeout(this.filterOperationsByType.bind(this))},t.prototype.getFilterTypeOfSingleOperations=function(){var t=this.bulkOperation.progress;return t.failed>0?this.singleOperationStatusNames.FAILED:0===t.failed&&0===t.successful&&0===t.pending?this.singleOperationStatusNames.EXECUTING:0===t.failed&&0===t.successful&&0===t.executing?this.singleOperationStatusNames.PENDING:0===t.failed&&0===t.pending&&0===t.executing?this.singleOperationStatusNames.SUCCESSFUL:this.singleOperationStatusNames.ALL},t.prototype.getOperationsByStatus=function(t){return f(this,void 0,void 0,(function(){var e;return g(this,(function(n){switch(n.label){case 0:return e=this,[4,this.bulkOperationsService.getSingleOperationsByStatus(t[0]&&t[0].label,this.bulkOperation.id)];case 1:return e.singleOperations=n.sent(),[2]}}))}))},t.prototype.retryBulkOperation=function(){this.onRetryFailedOperations.emit(this.bulkOperation)},t.ctorParameters=function(){return[{type:p.BulkOperationsService}]},m([e.Input()],t.prototype,"bulkOperation",void 0),m([e.Input()],t.prototype,"readOnly",void 0),m([e.Output()],t.prototype,"onRetryFailedOperations",void 0),m([e.ViewChild(r.StatusFilterComponent,{static:!1})],t.prototype,"statusFilter",void 0),t=m([e.Component({selector:"c8y-single-operations-list",template:'<ng-container\n *ngIf="\n bulkOperation.progress.failed ||\n bulkOperation.progress.executing ||\n bulkOperation.progress.pending ||\n bulkOperation.progress.successful\n "\n>\n <div class="legend form-block p-t-16 m-b-0" translate>\n Operations\n </div>\n <div class="d-flex a-i-center">\n <div class=" d-flex a-i-center p-b-8">\n <span class="m-r-4 text-medium" translate>Filter by status</span>\n <c8y-status-filter\n small\n [options]="singleOperationStatusProperties"\n (onFilterChanged)="getOperationsByStatus($event)"\n ></c8y-status-filter>\n </div>\n <div class="m-l-auto p-b-8" *ngIf="!readOnly && bulkOperation.progress.failed > 0">\n <button\n class="btn btn-navbar"\n (click)="retryBulkOperation()"\n title="{{ \'Retry failed operations\' | translate }}"\n >\n <i c8yIcon="repeat" class="m-r-4"></i> <span translate>Retry failed operations</span>\n </button>\n </div>\n </div>\n <div class="inner-scroll">\n <c8y-list-group>\n <div class="d-contents" *c8yFor="let operation of singleOperations; loadMore: \'auto\'">\n <c8y-single-operation-item [operation]="operation" [readOnly]="readOnly" class="d-contents">\n </c8y-single-operation-item>\n </div>\n\n <c8y-li *ngIf="singleOperations && singleOperations.data.length === 0">\n <c8y-li-body>\n <div class="c8y-empty-state text-center">\n <h2 class="c8y-icon c8y-icon-energy c8y-icon-duocolor m-b-16"></h2>\n <div>\n <h3 translate>No single operations of the selected status to display.</h3>\n <p class="m-b-16" translate>Single operations will be displayed here</p>\n </div>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </div>\n</ng-container>\n'})],t)}(),N=function(){function t(t,e){this.bulkOperationsService=t,this.alertService=e,this.device={},this.showIfTextTruncated=!1,this.singleOperationStatusNames=R,this.singleOperationsStatusProperties=D,this.readOnly=!1}return t.prototype.ngOnInit=function(){return f(this,void 0,void 0,(function(){var t;return g(this,(function(e){switch(e.label){case 0:return this.iconClass=this.getIconClass(),t=this,[4,this.getDeviceMO(this.operation.deviceId)];case 1:return t.device=e.sent(),[2]}}))}))},t.prototype.ngAfterViewInit=function(){this.isTextTruncated()},t.prototype.retrySingleOperation=function(t){return f(this,void 0,void 0,(function(){var e,n;return g(this,(function(i){switch(i.label){case 0:e=u.omit(t,["id","self","status","failureReason","creationTime","delivery"]),i.label=1;case 1:return i.trys.push([1,3,,4]),[4,this.bulkOperationsService.createSingleOperation(e)];case 2:return i.sent(),this.alertService.success(s.gettext("Operation created.")),[3,4];case 3:return n=i.sent(),this.alertService.addServerFailure(n),[3,4];case 4:return[2]}}))}))},t.prototype.getIconClass=function(){var t=this;return this.singleOperationsStatusProperties.find((function(e){return e.label.toUpperCase()===t.operation.status})).iconClass},t.prototype.getDeviceMO=function(t){return f(this,void 0,void 0,(function(){var e;return g(this,(function(n){switch(n.label){case 0:return[4,this.bulkOperationsService.getManagedObject(t)];case 1:return(e=n.sent())?[2,e.data]:[2]}}))}))},t.prototype.isTextTruncated=function(){if(this.operation.failureReason){var t=this.failureReasonRef.nativeElement;this.showIfTextTruncated=t.offsetWidth<t.scrollWidth}},t.ctorParameters=function(){return[{type:p.BulkOperationsService},{type:s.AlertService}]},m([e.Input()],t.prototype,"operation",void 0),m([e.Input()],t.prototype,"readOnly",void 0),m([e.ViewChild("failureReason",{static:!0})],t.prototype,"failureReasonRef",void 0),t=m([e.Component({selector:"c8y-single-operation-item",template:'<c8y-li class="c8y-list__item--double-actions">\n <c8y-li-icon>\n <i [class]="iconClass"></i>\n </c8y-li-icon>\n <div [ngClass]="{ \'content-flex-80\': !readOnly, \'content-flex-50\': readOnly }">\n <div class="col-4">\n <span class="m-r-4">\n <device-status [mo]=""></device-status>\n </span>\n <a [routerLink]="[\'/device\', operation.deviceId, \'device-info\']" routerLinkActive="active">\n {{ operation.deviceName }}\n </a>\n </div>\n <div class="col-3">\n <small class="icon-flex text-muted">\n <i c8yIcon="calendar" class="m-r-4"></i>\n {{ operation.creationTime | c8yDate }}\n </small>\n </div>\n <div class="col-5">\n <div class="flex-row">\n <span class="text-truncate" #failureReason>\n {{ operation.failureReason | translate }}\n </span>\n <a\n *ngIf="showIfTextTruncated"\n class="m-l-8"\n popover="{{ operation.failureReason | translate }}"\n placement="left"\n outsideClick="true"\n >\n <i [c8yIcon]="\'info-circle text-primary\'"></i>\n </a>\n <div\n class="showOnHover p-l-8 p-r-8 fit-h-20 flex-item-right"\n *ngIf="!readOnly && operation.status == singleOperationStatusNames.FAILED.toUpperCase()"\n >\n <a\n class="btn btn-default btn-xs"\n (click)="retrySingleOperation(operation)"\n title="{{ \'Retry operation\' | translate }}"\n >\n <i [c8yIcon]="\'repeat m-r-4\'"></i>\n <span translate>Retry operation</span>\n </a>\n </div>\n </div>\n </div>\n </div>\n</c8y-li>\n'})],t)}(),L=function(){function t(t,n,i){this.router=t,this.bulkOperationsService=n,this.bulkOperationModalsService=i,this.onCustomType=new e.EventEmitter,this.bulkList=[]}return t.prototype.ngOnInit=function(){this.bulkList=this.bulkOperationsService.getBulkTypes()},t.prototype.handleClick=function(t){t.path?(this.bulkOperationModalsService.hideNewBulkOperationModal(),this.router.navigateByUrl(t.path)):t.component&&this.onCustomType.emit(t)},t.ctorParameters=function(){return[{type:n.Router},{type:p.BulkOperationsService},{type:x}]},m([e.Output()],t.prototype,"onCustomType",void 0),t=m([e.Component({selector:"c8y-bulk-operation-type-list",template:'<div class="list-group list-group-links">\n <button\n *ngFor="let item of bulkList"\n type="button"\n class="list-group-item flex-row"\n (click)="handleClick(item)"\n >\n <div *ngIf="item.c8yIcon; else icon" class="list-item-icon">\n <i [c8yIcon]="item.c8yIcon"></i>\n </div>\n <ng-template #icon>\n <div class="list-item-icon">\n <i c8yIcon="cogs"></i>\n </div>\n </ng-template>\n <div title="{{ item.name | translate }}" class="list-item-body text-truncate">\n {{ item.name | translate }}\n </div>\n </button>\n</div>\n'})],t)}(),M=[{path:"devicecontrol/bulk",component:B}],U=function(){function t(){}return t=m([e.NgModule({imports:[s.CoreModule,i.PopoverModule,a.TooltipModule,r.StatusFilterModule,o.OperationSummaryModule,l.BulkOperationSchedulerModule,n.RouterModule.forChild(M)],providers:[k,x],declarations:[B,w,E,T,P,N,O,L,S,C],entryComponents:[B,w,E,T,P,N,O,L,S,C],exports:[B,w,E,T,P,N,O,L,S,C]})],t)}();t.BulkOperationDetailsComponent=T,t.BulkOperationDetailsService=k,t.BulkOperationDetailsTabsComponent=E,t.BulkOperationListItemComponent=w,t.BulkOperationModalsService=x,t.BulkOperationTypeListComponent=L,t.BulkOperationWrapperComponent=O,t.BulkOperationsListComponent=B,t.BulkOperationsListModule=U,t.BulkOperationsModalComponent=S,t.BulkOperationsRescheduleModalComponent=C,t.SingleOperationItemComponent=N,t.SingleOperationsListComponent=P,t.bulkOperationListRoutes=M,Object.defineProperty(t,"__esModule",{value:!0})}));
15
+ ***************************************************************************** */var b=function(){return(b=Object.assign||function(t){for(var e,n=1,i=arguments.length;n<i;n++)for(var a in e=arguments[n])Object.prototype.hasOwnProperty.call(e,a)&&(t[a]=e[a]);return t}).apply(this,arguments)};function m(t,e,n,i){var a,s=arguments.length,r=s<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,n,i);else for(var o=t.length-1;o>=0;o--)(a=t[o])&&(r=(s<3?a(r):s>3?a(e,n,r):a(e,n))||r);return s>3&&r&&Object.defineProperty(e,n,r),r}function f(t,e,n,i){return new(n||(n=Promise))((function(a,s){function r(t){try{l(i.next(t))}catch(t){s(t)}}function o(t){try{l(i.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?a(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(r,o)}l((i=i.apply(t,e||[])).next())}))}function g(t,e){var n,i,a,s,r={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]};return s={next:o(0),throw:o(1),return:o(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function o(s){return function(o){return function(s){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,i&&(a=2&s[0]?i.return:s[0]?i.throw||((a=i.return)&&a.call(i),0):i.next)&&!(a=a.call(i,s[1])).done)return a;switch(i=0,a&&(s=[2&s[0],a.value]),s[0]){case 0:case 1:a=s;break;case 4:return r.label++,{value:s[1],done:!1};case 5:r.label++,i=s[1],s=[0];continue;case 7:s=r.ops.pop(),r.trys.pop();continue;default:if(!(a=r.trys,(a=a.length>0&&a[a.length-1])||6!==s[0]&&2!==s[0])){r=0;continue}if(3===s[0]&&(!a||s[1]>a[0]&&s[1]<a[3])){r.label=s[1];break}if(6===s[0]&&r.label<a[1]){r.label=a[1],a=s;break}if(a&&r.label<a[2]){r.label=a[2],r.ops.push(s);break}a[2]&&r.ops.pop(),r.trys.pop();continue}s=e.call(t,r)}catch(t){s=[6,t],i=0}finally{n=a=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,o])}}}function v(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var i,a,s=n.call(t),r=[];try{for(;(void 0===e||e-- >0)&&!(i=s.next()).done;)r.push(i.value)}catch(t){a={error:t}}finally{try{i&&!i.done&&(n=s.return)&&n.call(s)}finally{if(a)throw a.error}}return r}var O=function(){function t(t,e){this.bulkOperationDetailsService=t,this.modalRef=e}return t.ctorParameters=function(){return[{type:k},{type:c.BsModalRef}]},m([e.Input()],t.prototype,"bulkOperation",void 0),t=m([e.Component({selector:"c8y-bulk-operations-wrapper",template:'<div class="viewport-modal">\n <div class="modal-header">\n <h3>{{ \'Bulk operation details\' | translate }}</h3>\n </div>\n\n <div class="modal-inner-scroll">\n <c8y-bulk-operation-list-item\n [bulkOperation]="bulkOperation"\n [detailsCollapsed]="false"\n [readOnly]="true"\n (showFailedOperation)="bulkOperationDetailsService.openDetails($event)"\n ></c8y-bulk-operation-list-item>\n </div>\n\n <div class="modal-footer">\n <button title="{{ \'Close\' | translate }}" class="btn btn-default" (click)="modalRef.hide()">\n {{ \'Close\' | translate }}\n </button>\n </div>\n</div>\n'})],t)}(),k=function(){function t(t,e){this.bulkOperationsService=t,this.modalService=e}return t.prototype.openDetails=function(t){return f(this,void 0,void 0,(function(){var e,n;return g(this,(function(i){switch(i.label){case 0:return[4,this.bulkOperationsService.getBulkOperationById(t)];case 1:return e=i.sent().data,n={bulkOperation:e},this.modalService.show(O,{initialState:n,class:"modal-lg"}),[2]}}))}))},t.ctorParameters=function(){return[{type:p.BulkOperationsService},{type:c.BsModalService}]},t=m([e.Injectable()],t)}(),S=function(){function t(t,e){this.bsModalRef=t,this.resolver=e,this.showComponent=!1}return t.prototype.cancel=function(){this.bsModalRef.hide()},t.prototype.createComponent=function(t){if(t&&t.component){this.showComponent=!0;var e=this.resolver.resolveComponentFactory(t.component);this.container.createComponent(e)}},t.ctorParameters=function(){return[{type:c.BsModalRef},{type:e.ComponentFactoryResolver}]},m([e.ViewChild("container",{static:!1,read:e.ViewContainerRef})],t.prototype,"container",void 0),t=m([e.Component({selector:"c8y-bulk-operations-modal",template:'<div class="viewport-modal">\n <div class="modal-header dialog-header">\n <h1 class="c8y-icon c8y-icon-energy"></h1>\n <h4 translate>New bulk operation</h4>\n </div>\n <div class="modal-inner-scroll">\n <div class="modal-body text-center" [hidden]="showComponent">\n <h4 translate>Select one of the available options</h4>\n <p c8y-guide-docs>\n <small translate ngNonBindable>\n Check the\n <a c8y-guide-href="users-guide/device-management/#bulk-operation-wizard"\n >User guide`KEEP_ORIGINAL`</a\n >\n for more details.</small\n >\n </p>\n </div>\n\n <c8y-bulk-operation-type-list\n (onCustomType)="createComponent($event)"\n ></c8y-bulk-operation-type-list>\n <template #container></template>\n </div>\n <div class="modal-footer" [hidden]="showComponent">\n <button\n (click)="cancel()"\n type="button"\n class="btn btn-default"\n title="{{ \'Cancel\' | translate }}"\n >\n <span translate>Cancel</span>\n </button>\n </div>\n</div>\n'})],t)}(),x=function(){function t(t){this.bsModalService=t}return t.prototype.showNewBulkOperationModal=function(){this.bsModalRef=this.bsModalService.show(S,{backdrop:"static",class:"modal-sm"})},t.prototype.hideNewBulkOperationModal=function(){this.bsModalRef&&this.bsModalRef.hide()},t.ctorParameters=function(){return[{type:c.BsModalService}]},t=m([e.Injectable()],t)}(),C=function(){function t(t,e,n){this.bsModalRef=t,this.bulkOperationsService=e,this.alert=n,this.closeSubject=new d.Subject}return t.prototype.ngOnInit=function(){this.modalTitle=this.getTitle()},t.prototype.onDateAndDelaySelect=function(t){this.dateAndDelay=t},t.prototype.getTitle=function(){return this.isRetryOperation?s.gettext("Retry operation"):s.gettext("Edit schedule")},t.prototype.onCancel=function(){this.bsModalRef.hide()},t.prototype.onSave=function(){return f(this,void 0,void 0,(function(){var t,e,n;return g(this,(function(i){switch(i.label){case 0:if(this.bulkOperation.startDate=this.dateAndDelay.scheduledDate.toISOString(),this.bulkOperation.creationRamp=this.dateAndDelay.delayInSeconds,!this.isRetryOperation)return[3,5];i.label=1;case 1:return i.trys.push([1,3,,4]),[4,this.bulkOperationsService.createBulkOperation(this.bulkOperation)];case 2:return t=i.sent(),this.alert.success(s.gettext("Successfully rescheduled for a retry.")),[3,4];case 3:return e=i.sent(),this.alert.addServerFailure(e),[3,4];case 4:return[3,8];case 5:return i.trys.push([5,7,,8]),[4,this.bulkOperationsService.updateBulkOperation(this.bulkOperation)];case 6:return t=i.sent(),this.alert.success(s.gettext("Successfully rescheduled.")),[3,8];case 7:return n=i.sent(),this.alert.addServerFailure(n),[3,8];case 8:return this.closeSubject.next(t.data),this.bsModalRef.hide(),[2]}}))}))},t.ctorParameters=function(){return[{type:c.BsModalRef},{type:p.BulkOperationsService},{type:s.AlertService}]},t=m([e.Component({selector:"c8y-bulk-operations-reschedule-modal",template:'<div class="viewport-modal">\n <div class="modal-header dialog-header">\n <h1 class="c8y-icon c8y-icon-energy"></h1>\n <h4>{{ modalTitle | translate }}</h4>\n </div>\n <div class="modal-inner-scroll">\n <div class="modal-body">\n <div class="text-center">\n <c8y-operation-summary\n [description]="bulkOperation.operationPrototype.description"\n ></c8y-operation-summary>\n </div>\n <div class="p-t-16 center-block" style="max-width: 300px;">\n <c8y-operation-scheduler\n [(ngModel)]="dateAndDelay"\n #scheduler="ngModel"\n ></c8y-operation-scheduler>\n </div>\n </div>\n </div>\n <div class="modal-footer">\n <button\n (click)="onCancel()"\n type="button"\n class="btn btn-default"\n title="{{ \'Cancel\' | translate }}"\n >\n <span translate>Cancel</span>\n </button>\n <button\n id="save-btn"\n (click)="onSave()"\n type="button"\n class="btn btn-primary"\n title="{{ \'Save\' | translate }}"\n [disabled]="scheduler?.control?.errors"\n >\n <span translate>Save</span>\n </button>\n </div>\n</div>\n'})],t)}(),F={SCHEDULED:s.gettext("Scheduled"),EXECUTING:s.gettext("Executing"),CANCELED:s.gettext("Canceled"),FAILED:s.gettext("Completed with failures"),SUCCESSFUL:s.gettext("Completed successfully"),DELETED:s.gettext("Deleted")},I=[{label:F.SCHEDULED,generalStatus:[h.OperationBulkGeneralStatus.SCHEDULED],iconClass:"dlt-c8y-icon-calendar text-info"},{label:F.EXECUTING,generalStatus:[h.OperationBulkGeneralStatus.EXECUTING,h.OperationBulkGeneralStatus.EXECUTING_WITH_ERROR],iconClass:"dlt-c8y-icon-refresh text-primary"},{label:F.DELETED,generalStatus:[h.OperationBulkGeneralStatus.DELETED],iconClass:"dlt-c8y-icon-delete-document text-muted"},{label:F.CANCELED,generalStatus:[h.OperationBulkGeneralStatus.CANCELED],iconClass:"dlt-c8y-icon-ban text-muted"},{label:F.FAILED,generalStatus:[h.OperationBulkGeneralStatus.FAILED],iconClass:"dlt-c8y-icon-exclamation-triangle text-danger"},{label:F.SUCCESSFUL,generalStatus:[h.OperationBulkGeneralStatus.SUCCESSFUL],iconClass:"dlt-c8y-icon-check-circle text-success"}],w=function(){function t(t,n,i,a){this.bulkOperationsService=t,this.modal=n,this.alert=i,this.bsModalService=a,this.detailsCollapsed=!0,this.readOnly=!1,this.showFailedOperation=new e.EventEmitter,this.reload=new e.EventEmitter,this.refreshLoading=!1,this.bulkOperationGeneralStatus=h.OperationBulkGeneralStatus,this.bulkOperationStatusOptions=I,this.finishDatePopoverText=s.gettext("Approximate date, estimated based on the bulk operation settings."),this.progressBarClass="progress",this.progressBarStatus=0}return t.prototype.ngOnInit=function(){this.iconClass=this.getIconClass(),this.finishDate=this.calculateFinishDateMs(),this.setProgressBar()},t.prototype.ngOnChanges=function(t){t.bulkOperation&&!t.bulkOperation.firstChange&&(this.iconClass=this.getIconClass(),this.setProgressBar())},t.prototype.getIconClass=function(){var t=this,e=this.bulkOperationStatusOptions.find((function(e){return e.generalStatus.includes(t.bulkOperation.generalStatus)}));return e?e.iconClass:"dlt-c8y-icon-ask-question text-muted"},t.prototype.calculateFinishDateMs=function(){return new Date(this.bulkOperation.startDate).getTime()+1e3*this.bulkOperation.creationRamp*this.bulkOperation.progress.all},t.prototype.progressBarProgressFn=function(){return(this.bulkOperation.progress.successful+this.bulkOperation.progress.failed)/this.bulkOperation.progress.all*100},t.prototype.setProgressBar=function(){var t="progress-bar progress-striped active progress-bar",e={EXECUTING:{progressBarClass:"progress progress-striped active",progressBarColor:t+"-primary",progressBarStatus:this.progressBarProgressFn()},EXECUTING_WITH_ERROR:{progressBarClass:"progress progress-striped active",progressBarColor:t+"-danger",progressBarStatus:this.progressBarProgressFn()},FAILED:{progressBarClass:"progress",progressBarColor:t+"-danger",progressBarStatus:100},SUCCESSFUL:{progressBarClass:"progress",progressBarColor:t+"-success",progressBarStatus:100}};u.assign(this,e[this.bulkOperation.generalStatus])},t.prototype.editSchedule=function(){var t={initialState:{bulkOperation:u.cloneDeep(this.bulkOperation)},class:"modal-sm",backdrop:"static"};this.bsModalRef=this.bsModalService.show(C,t)},t.prototype.cancelBulkOperation=function(){return f(this,void 0,void 0,(function(){var t;return g(this,(function(e){switch(e.label){case 0:return e.trys.push([0,3,,4]),[4,this.modal.confirm(s.gettext("Cancel bulk operation"),s.gettext("You are about to cancel the bulk operation. Do you want to proceed?"),s.Status.DANGER)];case 1:return e.sent(),[4,this.bulkOperationsService.deleteBulkOperation(this.bulkOperation.id)];case 2:return e.sent(),this.reload.emit(),this.alert.success(s.gettext("Operation canceled.")),[3,4];case 3:return t=e.sent(),this.alert.addServerFailure(t),[3,4];case 4:return[2]}}))}))},t.prototype.retryFailedOperation=function(){var t=this,e=u.cloneDeep(this.bulkOperation);delete e.groupId,e.failedParentId=this.bulkOperation.id;var n={initialState:{bulkOperation:e,isRetryOperation:!0},class:"modal-sm",backdrop:"static"};this.bsModalRef=this.bsModalService.show(C,n),this.bsModalRef.content.closeSubject.subscribe((function(){t.reload.emit()}))},t.prototype.setToSuccessful=function(){return f(this,void 0,void 0,(function(){var t;return g(this,(function(e){switch(e.label){case 0:return e.trys.push([0,3,,4]),[4,this.modal.confirm(s.gettext("Set manually bulk operation to SUCCESSFUL"),s.gettext("You are about to change the bulk operation status to SUCCESSFUL. Do you want to proceed?"),s.Status.DANGER)];case 1:return e.sent(),[4,this.bulkOperationsService.updateBulkOperation({id:this.bulkOperation.id,generalStatus:h.OperationBulkGeneralStatus.SUCCESSFUL})];case 2:return e.sent(),this.reload.emit(),this.alert.success(s.gettext("Operation status changed to SUCCESSFUL.")),[3,4];case 3:return t=e.sent(),this.alert.addServerFailure(t),[3,4];case 4:return[2]}}))}))},t.prototype.openFailedOperation=function(t){this.showFailedOperation.emit(t)},t.prototype.isStatusScheduled=function(){return this.bulkOperation.generalStatus===this.bulkOperationGeneralStatus.SCHEDULED},t.prototype.isStatusExecutingOrExecutingWithError=function(){return this.bulkOperation.generalStatus===this.bulkOperationGeneralStatus.EXECUTING||this.bulkOperation.generalStatus===this.bulkOperationGeneralStatus.EXECUTING_WITH_ERROR},t.prototype.allOperationsCreated=function(){return this.bulkOperation.progress.all===this.bulkOperation.progress.executing+this.bulkOperation.progress.failed+this.bulkOperation.progress.pending+this.bulkOperation.progress.successful},t.prototype.isStatusCanceled=function(){return this.bulkOperation.generalStatus===this.bulkOperationGeneralStatus.CANCELED},t.prototype.isStatusFailed=function(){return this.bulkOperation.generalStatus===this.bulkOperationGeneralStatus.FAILED},t.ctorParameters=function(){return[{type:p.BulkOperationsService},{type:s.ModalService},{type:s.AlertService},{type:c.BsModalService}]},m([e.Input()],t.prototype,"bulkOperation",void 0),m([e.Input()],t.prototype,"detailsCollapsed",void 0),m([e.Input()],t.prototype,"readOnly",void 0),m([e.Output()],t.prototype,"showFailedOperation",void 0),m([e.Output()],t.prototype,"reload",void 0),m([e.ViewChild("listItem",{static:!0})],t.prototype,"listItem",void 0),t=m([e.Component({selector:"c8y-bulk-operation-list-item",template:'<c8y-li\n class="c8y-list__item--double-actions"\n [ngClass]="{ \'c8y-list__item--no-expand\': !detailsCollapsed }"\n [collapsed]="detailsCollapsed"\n #listItem\n id="{{ bulkOperation.id }}"\n>\n <c8y-li-icon>\n <i [class]="iconClass"></i>\n </c8y-li-icon>\n <div [ngClass]="{ \'content-flex-58\': !readOnly, \'content-flex-50\': readOnly }">\n <div class="col-5">\n <span\n class="text-truncate"\n title="{{ bulkOperation.id }} - {{\n bulkOperation.operationPrototype.description | translate\n }}"\n >\n <strong class="text-muted m-r-4">{{ bulkOperation.id }}</strong>\n {{ bulkOperation.operationPrototype.description | translate }}\n </span>\n </div>\n <div class="flex-grow">\n <div class="m-t-8 visible-xs"></div>\n <hr *ngIf="isStatusCanceled(); else statusNotCanceled" class="m-t-16 m-b-0" />\n <ng-template #statusNotCanceled>\n <div [class]="progressBarClass" title="{{ progressBarStatus | number: \'1.0-0\' }}%">\n <div\n [class]="progressBarColor"\n role="progressbar"\n aria-valuenow="0"\n aria-valuemin="0"\n aria-valuemax="100"\n [style.width.%]="progressBarStatus"\n >\n <span *ngIf="progressBarStatus !== 0">{{ progressBarStatus | number: \'1.0-0\' }}%</span>\n </div>\n </div>\n </ng-template>\n </div>\n <div class="col-4">\n <div class="p-t-8 visible-xs"></div>\n <small *ngIf="bulkOperation.progress.successful > 0" class="m-r-8 icon-flex">\n <i c8yIcon="check-circle" class="text-success m-r-4"></i>\n <span\n ngNonBindable\n translate\n [translateParams]="{ bulkOperationsCountSuccessful: bulkOperation.progress.successful }"\n >\n {{ bulkOperationsCountSuccessful }} successful\n </span>\n </small>\n <small *ngIf="bulkOperation.progress.failed > 0" class="m-r-8 icon-flex">\n <i c8yIcon="warning" class="text-danger m-r-4"></i>\n <span\n ngNonBindable\n translate\n [translateParams]="{ bulkOperationsCountFailed: bulkOperation.progress.failed }"\n >\n {{ bulkOperationsCountFailed }} failed\n </span>\n </small>\n <small *ngIf="bulkOperation.progress.pending > 0" class="m-r-8 icon-flex">\n <i c8yIcon="clock-o" class="text-primary m-r-4"></i>\n <span\n ngNonBindable\n translate\n [translateParams]="{ bulkOperationsCountPending: bulkOperation.progress.pending }"\n >\n {{ bulkOperationsCountPending }} pending\n </span>\n </small>\n </div>\n </div>\n <div class="c8y-list__item__footer">\n <div class="m-r-16">\n <span class="text-label-small m-r-4" translate>Start</span>\n <small class="icon-flex">\n <i c8yIcon="calendar" class="m-r-4"></i>\n <span>\n {{ bulkOperation.startDate | c8yDate }}\n </span>\n </small>\n </div>\n <div class="m-r-16" *ngIf="bulkOperationGeneralStatus.CANCELED !== bulkOperation.generalStatus">\n <span class="text-label-small m-r-4" translate>Finish</span>\n\n <small class="icon-flex">\n <i c8yIcon="calendar" class="m-r-4"></i>\n <span>{{ finishDate | c8yDate }}</span>\n </small>\n <a\n container="body"\n *ngIf="isStatusScheduled() || isStatusExecutingOrExecutingWithError()"\n class="btn-clean m-l-4"\n popover="{{ finishDatePopoverText | translate }}"\n placement="right"\n outsideClick="true"\n >\n <i c8yIcon="question-circle-o text-primary"></i>\n </a>\n </div>\n </div>\n <ng-container *ngIf="!readOnly">\n <c8y-li-action\n *ngIf="isStatusScheduled()"\n label="{{ \'Edit schedule\' | translate }}"\n (click)="editSchedule()"\n icon="pencil"\n >\n </c8y-li-action>\n <c8y-li-action\n *ngIf="\n isStatusScheduled() || (isStatusExecutingOrExecutingWithError() && !allOperationsCreated())\n "\n label="{{ \'Cancel bulk operation\' | translate }}"\n (click)="cancelBulkOperation()"\n icon="remove"\n >\n </c8y-li-action>\n <c8y-li-action\n *ngIf="isStatusFailed()"\n label="{{ \'Retry failed operations\' | translate }}"\n (click)="retryFailedOperation()"\n icon="repeat"\n >\n </c8y-li-action>\n <c8y-li-action\n *ngIf="isStatusFailed()"\n label="{{ \'Set operation to SUCCESSFUL\' | translate }}"\n (click)="setToSuccessful()"\n icon="check-circle"\n >\n </c8y-li-action>\n </ng-container>\n <c8y-li-collapse class="m-b-16">\n <c8y-bulk-operation-details-tabs\n *ngIf="!listItem.collapsed"\n [bulkOperation]="bulkOperation"\n [readOnly]="readOnly"\n (onRetryFailedOperations)="retryFailedOperation()"\n (showFailedOperation)="openFailedOperation($event)"\n >\n </c8y-bulk-operation-details-tabs>\n </c8y-li-collapse>\n</c8y-li>\n'})],t)}(),E=function(){function t(t,e,n){var i=this;this.realtime=t,this.bulkOperationsService=e,this.bulkOperationModalsService=n,this.bulkTypes=[],this.selectedTypeFilters=this.getTypeFilters(),this.bulkOperationStatusOptions=I,this.refreshLoading=!1,this.statusFilter$=new d.BehaviorSubject(null),this.typeFilter$=new d.BehaviorSubject(null),this.timeFilter$=new d.BehaviorSubject(null),this.reload$=new d.BehaviorSubject(null),this.bulkOperations$=d.combineLatest(this.statusFilter$,this.timeFilter$,this.typeFilter$,this.reload$).pipe(y.tap((function(){i.refreshLoading=!0})),y.switchMap((function(t){var e=v(t,2),n=e[0],a=e[1];return i.filter(n,a)})),y.withLatestFrom(this.typeFilter$),y.map((function(t){var e=v(t,2),n=e[0],a=e[1];return i.filterPipe=d.pipe(y.map((function(t){return i.filterByType(t,a)}))),b({},n,{data:i.filterByType(n.data,a)})})),y.tap((function(){i.refreshLoading=!1})),y.shareReplay(1)),this.allFilterFragments=this.flattenFilterFragments(this.getTypeFilters())}return t.prototype.ngOnInit=function(){this.bulkTypes=this.bulkOperationsService.getBulkTypes()},t.prototype.filterByType=function(t,e){var n=this.flattenFilterFragments(e);return!n.length||this.allFilterFragments.every((function(t){return n.includes(t)}))?t:t.filter((function(t){return Object.keys(t.operationPrototype).some((function(t){return n.includes(t)}))}))},t.prototype.resetFilter=function(){this.statusFilter$.next(null),this.timeFilter$.next(null),this.typeFilter$.next(null),this.datePicker.clearFilter(),this.selectedTypeFilters=this.getTypeFilters(),this.statusFilter.reset()},t.prototype.isFilterApplied=function(){return this.statusFilter$.getValue()||this.typeFilter$.getValue()||this.timeFilter$.getValue()},t.prototype.filter=function(t,e){var n=t&&t.length>0?{generalStatus:u.flatten(t.map((function(t){return t.generalStatus})))}:{},i=e?b({},e.dateFrom&&{dateFrom:e.dateFrom.toISOString()},e.dateTo&&{dateTo:e.dateTo.toISOString()}):{};return this.getBulkOperations(b({},n,i))},t.prototype.getBulkOperations=function(t){return this.bulkOperationsService.getBulkOperations(t)},t.prototype.getTypeFilters=function(){return this.bulkOperationsService.getBulkTypes()},t.prototype.addBulkOperation=function(){this.bulkOperationModalsService.showNewBulkOperationModal()},t.prototype.openFailedOperation=function(t){this.listItems.forEach((function(e){e.bulkOperation.id===t&&(e.listItem.collapsed=!1,e.listItem.element.nativeElement.scrollIntoView({behavior:"smooth",block:"center"}))}))},t.prototype.compareOperations=function(t,e){return new Date(t.startDate).getTime()-new Date(e.startDate).getTime()},t.prototype.flattenFilterFragments=function(t){return(t||[]).reduce((function(t,e){return t.concat(e.fragments)}),[])},t.ctorParameters=function(){return[{type:s.OperationBulkRealtimeService},{type:p.BulkOperationsService},{type:x}]},m([e.ViewChildren(w)],t.prototype,"listItems",void 0),m([e.ViewChild("statusFilter",{static:!0})],t.prototype,"statusFilter",void 0),m([e.ViewChild(s.DatePickerComponent,{static:!0})],t.prototype,"datePicker",void 0),t=m([e.Component({selector:"c8y-bulk-operations",template:'<c8y-title> {{ \'Device control\' | translate }}</c8y-title>\n<c8y-action-bar-item *ngIf="bulkTypes?.length" itemClass="navbar-form" [placement]="\'left\'">\n <label translate class="hidden-sm">Type</label>\n <c8y-select\n style="width: 180px;"\n [items]="bulkTypes"\n [selected]="selectedTypeFilters"\n [disableApplyOnNoSelection]="true"\n (onChange)="selectedTypeFilters = $event; typeFilter$.next(selectedTypeFilters)"\n >\n </c8y-select>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]="\'left\'" itemClass="navbar-form">\n <c8y-status-filter\n #statusFilter\n [options]="bulkOperationStatusOptions"\n (onFilterChanged)="statusFilter$.next($event)"\n ></c8y-status-filter>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]="\'left\'" itemClass="navbar-form">\n <c8y-date-picker (onDateSelected)="timeFilter$.next($event)"></c8y-date-picker>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]="\'right\'">\n <c8y-realtime-btn [service]="realtime"></c8y-realtime-btn>\n</c8y-action-bar-item>\n<c8y-action-bar-item [placement]="\'right\'">\n <button\n *ngIf="bulkTypes?.length"\n class="btn btn-link d-flex a-i-center"\n (click)="addBulkOperation()"\n title="{{ \'New bulk operation\' | translate }}"\n >\n <i c8yIcon="plus-circle" class="m-r-4"></i> \n <span class="text-truncate">\n {{ \'New bulk operation\' | translate }}\n </span> \n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item [placement]="\'right\'">\n <button class="btn btn-link d-flex a-i-center" \n title="{{ \'Reload\' | translate }}" \n (click)="reload$.next()"\n >\n <i c8yIcon="refresh" [ngClass]="{ \'icon-spin\': refreshLoading }" class="m-r-4"></i>\n <span class="text-truncate">\n {{ \'Reload\' | translate }}\n </span>\n </button>\n</c8y-action-bar-item>\n\x3c!-- Empty state --\x3e\n<div\n class="c8y-empty-state text-center"\n *ngIf="(bulkOperations$ | async)?.data.length === 0 && !isFilterApplied()"\n>\n <h1 class="c8y-icon c8y-icon-energy c8y-icon-duocolor"></h1>\n <h3 translate>No items to display</h3>\n <p translate>Bulk operations will be displayed here</p>\n <button\n type="button"\n *ngIf="bulkTypes?.length"\n title="{{ \'New bulk operation\' | translate }}"\n class="btn btn-primary"\n (click)="addBulkOperation()"\n translate\n >\n New bulk operation\n </button>\n</div>\n\n\x3c!-- No results empty state --\x3e\n<div\n class="c8y-empty-state text-center"\n *ngIf="(bulkOperations$ | async)?.data.length === 0 && isFilterApplied()"\n>\n <h1 c8yIcon="search" class="c8y-icon c8y-icon-duocolor"></h1>\n <h3 translate>No results to display.</h3>\n <p translate>Adjust or reset the filter.</p>\n <button\n type="button"\n title="{{ \'Reset filter\' | translate }}"\n class="btn btn-primary"\n (click)="resetFilter()"\n translate\n >\n Reset filter\n </button>\n</div>\n\n\x3c!-- Detailed list of operations + load more button --\x3e\n<c8y-list-group\n class="m-b-24"\n [ngClass]="{ \'dd-low\': (bulkOperations$ | async)?.data.length < 10 }"\n>\n <div\n class="page-sticky-header hidden-xs c8y-list__item--double-actions c8y-list__item"\n *ngIf="(bulkOperations$ | async)?.data.length"\n >\n <div class="c8y-list__item__block">\n <div class="c8y-list__item__icon">\n <i class="fa"></i>\n </div>\n <div class="c8y-list__item__body">\n <div class="content-flex-57">\n <div class="col-5">\n {{ \'Operation\' | translate }}\n </div>\n <div class="flex-grow">\n {{ \'Progress\' | translate }}\n </div>\n <div class="col-4">\n {{ \'Status\' | translate }}\n </div>\n </div>\n </div>\n <div class="c8y-list__item__actions"></div>\n </div>\n </div>\n <div\n class="d-contents"\n *c8yFor="\n let bulkOperation of bulkOperations$ | async;\n let i = index;\n realtime: realtime;\n pipe: filterPipe;\n comparator: compareOperations.bind(this);\n loadMore: \'auto\';\n "\n >\n <c8y-bulk-operation-list-item\n [bulkOperation]="bulkOperation"\n (reload)="reload$.next()"\n (showFailedOperation)="openFailedOperation($event)"\n class="d-contents"\n >\n </c8y-bulk-operation-list-item>\n </div>\n</c8y-list-group>\n',providers:[s.OperationBulkRealtimeService]})],t)}(),B=function(){function t(){this.readOnly=!1,this.onRetryFailedOperations=new e.EventEmitter,this.showFailedOperation=new e.EventEmitter,this.tabs=[]}return t.prototype.ngOnInit=function(){this.template=this.detailsTemplate,this.tabs=[{label:s.gettext("Details"),path:null,icon:"asterisk",template:this.detailsTemplate},{label:s.gettext("History of changes"),path:null,icon:"archive",template:this.auditTemplate}]},m([e.Input()],t.prototype,"bulkOperation",void 0),m([e.Input()],t.prototype,"readOnly",void 0),m([e.Output()],t.prototype,"onRetryFailedOperations",void 0),m([e.Output()],t.prototype,"showFailedOperation",void 0),m([e.ViewChild("details",{static:!0})],t.prototype,"detailsTemplate",void 0),m([e.ViewChild("audit",{static:!0})],t.prototype,"auditTemplate",void 0),t=m([e.Component({selector:"c8y-bulk-operation-details-tabs",template:'<div #container class="tabContainer">\n <ul class="nav nav-tabs nav-tabsc8y">\n <li [ngClass]="{ active: tab.template === template }" *ngFor="let tab of tabs">\n <button [title]="tab.label | translate" class="btn-clean" (click)="template = tab.template">\n <i [c8yIcon]="tab.icon"></i>\n <span class="txt">{{ tab.label | translate }}</span>\n </button>\n </li>\n </ul>\n</div>\n\n<ng-container *ngTemplateOutlet="template"></ng-container>\n\n<ng-template #details>\n <c8y-bulk-operation-details\n [bulkOperation]="bulkOperation"\n [readOnly]="readOnly"\n (showFailedOperation)="showFailedOperation.emit($event)"\n >\n </c8y-bulk-operation-details>\n</ng-template>\n\n<ng-template #audit>\n <c8y-audit-log [source]="bulkOperation.id"></c8y-audit-log>\n</ng-template>\n\n<c8y-single-operations-list\n [bulkOperation]="bulkOperation"\n [readOnly]="readOnly"\n (onRetryFailedOperations)="onRetryFailedOperations.emit($event)"\n class="d-flex d-col"\n></c8y-single-operations-list>\n'})],t)}(),T=function(){function t(){this.allFilterIsSelected=!1,this.readOnly=!1,this.showFailedOperation=new e.EventEmitter}return t.prototype.scrollToRetriedFromOperation=function(t){this.showFailedOperation.emit(t)},m([e.Input()],t.prototype,"bulkOperation",void 0),m([e.Input()],t.prototype,"readOnly",void 0),m([e.Output()],t.prototype,"showFailedOperation",void 0),t=m([e.Component({selector:"c8y-bulk-operation-details",template:'<div class="row d-flex-md fit-h">\n <div class="col-md-4 flex-item-top">\n <div class="legend form-block" translate>\n Details\n </div>\n <ul class="list-unstyled small">\n <li class="p-t-4 p-b-4 flex-row separator-bottom">\n <label class="small m-0" translate>Start date</label>\n <span class="flex-item-right">{{ bulkOperation.startDate | c8yDate }}</span>\n </li>\n <li class="p-t-4 p-b-4 flex-row separator-bottom">\n <label class="small m-0">\n {{ \'Delay\' | translate }}\n <a\n class="text-primary"\n tooltip="{{ \'Delay before sending the operation to the next device.\' | translate }}"\n container="body"\n >\n <i [c8yIcon]="\'info-circle\'"></i>\n </a>\n </label>\n <span [ngPlural]="bulkOperation.creationRamp" class="flex-item-right">\n <ng-template ngPluralCase="=1">\n {{ bulkOperation.creationRamp }} <span translate>second</span>\n </ng-template>\n <ng-template ngPluralCase="other">\n {{ bulkOperation.creationRamp }} <span translate>seconds</span>\n </ng-template>\n </span>\n </li>\n <li class="p-t-4 p-b-4 flex-row separator-bottom">\n <label class="small m-0" translate>Status</label>\n <span class="flex-item-right text-uppercase">\n {{ bulkOperation.generalStatus.toString() | translate }}\n </span>\n </li>\n <li class="p-t-4 p-b-4 flex-row separator-bottom">\n <label class="small flex-item-top" translate>Result</label>\n <div class="flex-row flex-grow flex-item-right flex-end">\n <div>\n <div *ngIf="bulkOperation.progress.successful > 0" class="icon-flex flex-item-left m-r-8">\n <i c8yIcon="check-circle" class="text-success m-r-4"></i>\n <span\n ngNonBindable\n translate\n [translateParams]="{\n bulkOperationsCountSuccessful: bulkOperation.progress.successful\n }"\n >\n {{ bulkOperationsCountSuccessful }} successful\n </span>\n </div>\n <div class="icon-flex flex-item-left m-r-8" *ngIf="bulkOperation.progress.failed > 0">\n <i c8yIcon="warning" class="text-danger m-r-4"></i>\n <span\n ngNonBindable\n translate\n [translateParams]="{ bulkOperationsCountFailed: bulkOperation.progress.failed }"\n >\n {{ bulkOperationsCountFailed }} failed\n </span>\n </div>\n <div class="icon-flex flex-item-left" *ngIf="bulkOperation.progress.pending > 0">\n <i c8yIcon="clock-o" class="m-r-4 text-info"></i>\n <span\n ngNonBindable\n translate\n [translateParams]="{ bulkOperationsCountPending: bulkOperation.progress.pending }"\n >\n {{ bulkOperationsCountPending }} pending\n </span>\n </div>\n </div>\n </div>\n </li>\n <li class="p-t-4 p-b-4 flex-row separator-bottom" *ngIf="bulkOperation.failedParentId">\n <label class="small m-0" translate>Retried from</label>\n <span class="flex-item-right">\n <button\n class="btn btn-default btn-xs"\n (click)="scrollToRetriedFromOperation(bulkOperation.failedParentId)"\n >\n {{ bulkOperation.failedParentId }}\n </button>\n </span>\n </li>\n <li class="p-t-4 p-b-4 flex-row separator-bottom" *ngIf="bulkOperation.note">\n <label class="small flex-item-top" translate>Description</label>\n <div\n title="{{ bulkOperation.note }}"\n class="flex-item-right text-right m-l-8 text-truncate"\n >\n {{ bulkOperation.note }}\n </div>\n </li>\n </ul>\n </div>\n <div class="col-md-8 fit-h d-flex d-col">\n <div class="legend form-block" translate>\n Operation\n </div>\n <pre class="inner-scroll p-16 m-b-0 text-pre-wrap">{{\n bulkOperation.operationPrototype | json\n }}</pre>\n </div>\n</div>\n'})],t)}(),D={PENDING:s.gettext("Pending"),EXECUTING:s.gettext("Executing"),FAILED:s.gettext("Failed"),SUCCESSFUL:s.gettext("Successful"),ALL:s.gettext("All")},R=[{label:D.PENDING,iconClass:"dlt-c8y-icon-clock-o text-info",selected:!1},{label:D.EXECUTING,iconClass:"dlt-c8y-icon-refresh text-info",selected:!1},{label:D.SUCCESSFUL,iconClass:"dlt-c8y-icon-check-circle text-success",selected:!1},{label:D.FAILED,iconClass:"dlt-c8y-icon-exclamation-circle text-danger",selected:!1}],P=function(){function t(t){this.bulkOperationsService=t,this.readOnly=!1,this.onRetryFailedOperations=new e.EventEmitter,this.singleOperationStatusProperties=R,this.singleOperationStatusNames=D}return t.prototype.ngAfterViewInit=function(){return f(this,void 0,void 0,(function(){return g(this,(function(t){return this.statusFilter&&this.filterOperationsByType(),[2]}))}))},t.prototype.ngOnChanges=function(t){t.bulkOperation&&!t.bulkOperation.firstChange&&this.filterOperationsByType()},t.prototype.filterOperationsByType=function(){if(this.statusFilter){var t=this.getFilterTypeOfSingleOperations();this.statusFilter.preset(t===this.singleOperationStatusNames.ALL?[]:[{label:t}])}else setTimeout(this.filterOperationsByType.bind(this))},t.prototype.getFilterTypeOfSingleOperations=function(){var t=this.bulkOperation.progress;return t.failed>0?this.singleOperationStatusNames.FAILED:0===t.failed&&0===t.successful&&0===t.pending?this.singleOperationStatusNames.EXECUTING:0===t.failed&&0===t.successful&&0===t.executing?this.singleOperationStatusNames.PENDING:0===t.failed&&0===t.pending&&0===t.executing?this.singleOperationStatusNames.SUCCESSFUL:this.singleOperationStatusNames.ALL},t.prototype.getOperationsByStatus=function(t){return f(this,void 0,void 0,(function(){var e;return g(this,(function(n){switch(n.label){case 0:return e=this,[4,this.bulkOperationsService.getSingleOperationsByStatus(t[0]&&t[0].label,this.bulkOperation.id)];case 1:return e.singleOperations=n.sent(),[2]}}))}))},t.prototype.retryBulkOperation=function(){this.onRetryFailedOperations.emit(this.bulkOperation)},t.ctorParameters=function(){return[{type:p.BulkOperationsService}]},m([e.Input()],t.prototype,"bulkOperation",void 0),m([e.Input()],t.prototype,"readOnly",void 0),m([e.Output()],t.prototype,"onRetryFailedOperations",void 0),m([e.ViewChild(r.StatusFilterComponent,{static:!1})],t.prototype,"statusFilter",void 0),t=m([e.Component({selector:"c8y-single-operations-list",template:'<ng-container\n *ngIf="\n bulkOperation.progress.failed ||\n bulkOperation.progress.executing ||\n bulkOperation.progress.pending ||\n bulkOperation.progress.successful\n "\n>\n <div class="legend form-block p-t-16 m-b-0" translate>\n Operations\n </div>\n <div class="d-flex a-i-center">\n <div class=" d-flex a-i-center p-b-8">\n <span class="m-r-4 text-medium" translate>Filter by status</span>\n <c8y-status-filter\n small\n [options]="singleOperationStatusProperties"\n (onFilterChanged)="getOperationsByStatus($event)"\n ></c8y-status-filter>\n </div>\n <div class="m-l-auto p-b-8" *ngIf="!readOnly && bulkOperation.progress.failed > 0">\n <button\n class="btn btn-navbar"\n (click)="retryBulkOperation()"\n title="{{ \'Retry failed operations\' | translate }}"\n >\n <i c8yIcon="repeat" class="m-r-4"></i> <span translate>Retry failed operations</span>\n </button>\n </div>\n </div>\n <div class="inner-scroll">\n <c8y-list-group>\n <div class="d-contents" *c8yFor="let operation of singleOperations; loadMore: \'auto\'">\n <c8y-single-operation-item [operation]="operation" [readOnly]="readOnly" class="d-contents">\n </c8y-single-operation-item>\n </div>\n\n <c8y-li *ngIf="singleOperations && singleOperations.data.length === 0">\n <c8y-li-body>\n <div class="c8y-empty-state text-center">\n <h2 class="c8y-icon c8y-icon-energy c8y-icon-duocolor m-b-16"></h2>\n <div>\n <h3 translate>No single operations of the selected status to display.</h3>\n <p class="m-b-16" translate>Single operations will be displayed here</p>\n </div>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </div>\n</ng-container>\n'})],t)}(),N=function(){function t(t,e){this.bulkOperationsService=t,this.alertService=e,this.device={},this.showIfTextTruncated=!1,this.singleOperationStatusNames=D,this.singleOperationsStatusProperties=R,this.readOnly=!1}return t.prototype.ngOnInit=function(){return f(this,void 0,void 0,(function(){var t;return g(this,(function(e){switch(e.label){case 0:return this.iconClass=this.getIconClass(),t=this,[4,this.getDeviceMO(this.operation.deviceId)];case 1:return t.device=e.sent(),[2]}}))}))},t.prototype.ngAfterViewInit=function(){this.isTextTruncated()},t.prototype.retrySingleOperation=function(t){return f(this,void 0,void 0,(function(){var e,n;return g(this,(function(i){switch(i.label){case 0:e=u.omit(t,["id","self","status","failureReason","creationTime","delivery"]),i.label=1;case 1:return i.trys.push([1,3,,4]),[4,this.bulkOperationsService.createSingleOperation(e)];case 2:return i.sent(),this.alertService.success(s.gettext("Operation created.")),[3,4];case 3:return n=i.sent(),this.alertService.addServerFailure(n),[3,4];case 4:return[2]}}))}))},t.prototype.getIconClass=function(){var t=this;return this.singleOperationsStatusProperties.find((function(e){return e.label.toUpperCase()===t.operation.status})).iconClass},t.prototype.getDeviceMO=function(t){return f(this,void 0,void 0,(function(){var e;return g(this,(function(n){switch(n.label){case 0:return[4,this.bulkOperationsService.getManagedObject(t)];case 1:return(e=n.sent())?[2,e.data]:[2]}}))}))},t.prototype.isTextTruncated=function(){if(this.operation.failureReason){var t=this.failureReasonRef.nativeElement;this.showIfTextTruncated=t.offsetWidth<t.scrollWidth}},t.ctorParameters=function(){return[{type:p.BulkOperationsService},{type:s.AlertService}]},m([e.Input()],t.prototype,"operation",void 0),m([e.Input()],t.prototype,"readOnly",void 0),m([e.ViewChild("failureReason",{static:!0})],t.prototype,"failureReasonRef",void 0),t=m([e.Component({selector:"c8y-single-operation-item",template:'<c8y-li class="c8y-list__item--double-actions">\n <c8y-li-icon>\n <i [class]="iconClass"></i>\n </c8y-li-icon>\n <div [ngClass]="{ \'content-flex-80\': !readOnly, \'content-flex-50\': readOnly }">\n <div class="col-4">\n <span class="m-r-4">\n <device-status [mo]=""></device-status>\n </span>\n <a [routerLink]="[\'/device\', operation.deviceId, \'device-info\']" routerLinkActive="active">\n {{ operation.deviceName }}\n </a>\n </div>\n <div class="col-3">\n <small class="icon-flex text-muted">\n <i c8yIcon="calendar" class="m-r-4"></i>\n {{ operation.creationTime | c8yDate }}\n </small>\n </div>\n <div class="col-5">\n <div class="flex-row">\n <span class="text-truncate" #failureReason>\n {{ operation.failureReason | translate }}\n </span>\n <a\n *ngIf="showIfTextTruncated"\n class="m-l-8"\n popover="{{ operation.failureReason | translate }}"\n placement="left"\n outsideClick="true"\n >\n <i [c8yIcon]="\'info-circle text-primary\'"></i>\n </a>\n <div\n class="showOnHover p-l-8 p-r-8 fit-h-20 flex-item-right"\n *ngIf="!readOnly && operation.status == singleOperationStatusNames.FAILED.toUpperCase()"\n >\n <a\n class="btn btn-default btn-xs"\n (click)="retrySingleOperation(operation)"\n title="{{ \'Retry operation\' | translate }}"\n >\n <i [c8yIcon]="\'repeat m-r-4\'"></i>\n <span translate>Retry operation</span>\n </a>\n </div>\n </div>\n </div>\n </div>\n</c8y-li>\n'})],t)}(),L=function(){function t(t,n,i){this.router=t,this.bulkOperationsService=n,this.bulkOperationModalsService=i,this.onCustomType=new e.EventEmitter,this.bulkList=[]}return t.prototype.ngOnInit=function(){this.bulkList=this.bulkOperationsService.getBulkTypes()},t.prototype.handleClick=function(t){t.path?(this.bulkOperationModalsService.hideNewBulkOperationModal(),this.router.navigateByUrl(t.path)):t.component&&this.onCustomType.emit(t)},t.ctorParameters=function(){return[{type:n.Router},{type:p.BulkOperationsService},{type:x}]},m([e.Output()],t.prototype,"onCustomType",void 0),t=m([e.Component({selector:"c8y-bulk-operation-type-list",template:'<div class="list-group list-group-links">\n <button\n *ngFor="let item of bulkList"\n type="button"\n class="list-group-item flex-row"\n (click)="handleClick(item)"\n >\n <div *ngIf="item.c8yIcon; else icon" class="list-item-icon">\n <i [c8yIcon]="item.c8yIcon"></i>\n </div>\n <ng-template #icon>\n <div class="list-item-icon">\n <i c8yIcon="cogs"></i>\n </div>\n </ng-template>\n <div title="{{ item.name | translate }}" class="list-item-body text-truncate">\n {{ item.name | translate }}\n </div>\n </button>\n</div>\n'})],t)}(),M=[{path:"devicecontrol/bulk",component:E}],U=function(){function t(){}return t=m([e.NgModule({imports:[s.CoreModule,i.PopoverModule,a.TooltipModule,r.StatusFilterModule,o.OperationSummaryModule,l.BulkOperationSchedulerModule,n.RouterModule.forChild(M)],providers:[k,x],declarations:[E,w,B,T,P,N,O,L,S,C],entryComponents:[E,w,B,T,P,N,O,L,S,C],exports:[E,w,B,T,P,N,O,L,S,C]})],t)}();t.BulkOperationDetailsComponent=T,t.BulkOperationDetailsService=k,t.BulkOperationDetailsTabsComponent=B,t.BulkOperationListItemComponent=w,t.BulkOperationModalsService=x,t.BulkOperationTypeListComponent=L,t.BulkOperationWrapperComponent=O,t.BulkOperationsListComponent=E,t.BulkOperationsListModule=U,t.BulkOperationsModalComponent=S,t.BulkOperationsRescheduleModalComponent=C,t.SingleOperationItemComponent=N,t.SingleOperationsListComponent=P,t.bulkOperationListRoutes=M,Object.defineProperty(t,"__esModule",{value:!0})}));
16
16
  //# sourceMappingURL=c8y-ngx-components-operations-bulk-operations-list.umd.min.js.map