@firestitch/system 9.2.1 → 9.2.2

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 R=function(){return(R=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var a in t=arguments[n])Object.prototype.hasOwnProperty.call(t,a)&&(e[a]=t[a]);return e}).apply(this,arguments)};function P(e,t,n,r){var a,o=arguments.length,i=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,n,r);else for(var l=e.length-1;l>=0;l--)(a=e[l])&&(i=(o<3?a(i):o>3?a(t,n,i):a(t,n))||i);return o>3&&i&&Object.defineProperty(t,n,i),i}function O(e,t){return function(n,r){t(n,r,e)}}function j(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function q(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,a,o=n.call(e),i=[];try{for(;(void 0===t||t-- >0)&&!(r=o.next()).done;)i.push(r.value)}catch(e){a={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(a)throw a.error}}return i}function N(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(q(arguments[t]));return e}var E,G,B,K,$,Q=new t.InjectionToken("fs-system-config"),V=function(){function e(e,t,n){this._message=e,this._cdRef=t,this._buildService=n,this.buttonActions=[],this.menuActions=[],this._destroy$=new F.Subject,this.actions=[]}return e.prototype.ngOnInit=function(){var e=this;this._load(),this.buttonActions=this.actions.filter((function(e){return!e.menu})),this.menuActions=this.actions.filter((function(e){return e.menu})),this.build=this._buildService.build,this._buildService.buildChange$.pipe(C.takeUntil(this._destroy$)).subscribe((function(t){e.build=t,e._cdRef.markForCheck()}))},e.prototype._load=function(){var e=this;this.load().subscribe((function(t){e.dashboard=t,e.dashboard.cronRanAttention=!t.cronRan||L.differenceInMinutes(new Date,new Date(t.cronRan))>15,e._cdRef.markForCheck()}))},e.prototype.ngOnDestroy=function(){this._destroy$.next(),this._destroy$.complete()},e.prototype.actionClick=function(e){e.click()},e.prototype.initClick=function(){var e=this;this.init().subscribe((function(){e._message.success("Successfully initialized the system")}))},e.prototype.upgradeClick=function(){var e=this;this.upgrade().subscribe((function(){e._load(),e._message.success("Successfully upgraded the system")}))},e.ctorParameters=function(){return[{type:D.FsMessage},{type:t.ChangeDetectorRef},{type:I.FsBuildService}]},P([t.Input(),j("design:type",Function)],e.prototype,"init",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"upgrade",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"load",void 0),P([t.Input(),j("design:type",Array)],e.prototype,"actions",void 0),e=P([t.Component({selector:"fs-system-dashboard",template:'<div *fsSkeleton="dashboard">\r\n\r\n <div class="h2-container">\r\n\r\n <div class="actions">\r\n <h2>Actions</h2>\r\n <div fxLayout="row" fxLayoutGap="5px" fxLayout.xs="column">\r\n <button mat-raised-button (click)="upgradeClick()">Run Upgrades</button>\r\n <button mat-raised-button (click)="initClick()">Init System</button>\r\n\r\n <button\r\n *ngFor="let action of buttonActions"\r\n mat-raised-button\r\n (click)="actionClick(action)">\r\n {{action.label}}\r\n </button>\r\n\r\n <ng-container *ngIf="menuActions.length">\r\n\r\n <fs-menu buttonClass="mat-raised-button menu-button">\r\n <ng-template\r\n *ngFor="let action of menuActions"\r\n fs-menu-item\r\n (click)="actionClick(action)">\r\n {{action.label}}\r\n </ng-template>\r\n </fs-menu>\r\n\r\n\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div\r\n fxLayout="row wrap"\r\n fxLayout.xs="column"\r\n fxLayoutGap.xs="0px"\r\n fxLayoutAlign="start start"\r\n fxLayoutGap="50px">\r\n\r\n <div>\r\n <h2>Server</h2>\r\n\r\n <fs-label-field>\r\n <fs-label>Date/Time</fs-label>\r\n {{dashboard.serverTime | fsDateFormat: \'date-time\'}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>Timezone</fs-label>\r\n {{dashboard.serverTimezone}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>Hostname</fs-label>\r\n {{dashboard.serverHostname}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>Directory</fs-label>\r\n {{dashboard.appDirectory}}\r\n </fs-label-field>\r\n </div>\r\n\r\n <div>\r\n <h2>System</h2>\r\n <fs-label-field>\r\n <fs-label>Mode</fs-label>\r\n {{dashboard.appMode}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>Notification Recipients</fs-label>\r\n {{dashboard.notifyRecipients.join(\', \')}}\r\n </fs-label-field>\r\n </div>\r\n\r\n <div>\r\n <h2>Database</h2>\r\n\r\n <fs-label-field>\r\n <fs-label>Name</fs-label>\r\n {{dashboard.databaseName}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>Date/Time</fs-label>\r\n {{dashboard.databaseTime | fsDateFormat: \'date-time\'}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>Timezone</fs-label>\r\n {{dashboard.databaseTimezone}}\r\n </fs-label-field>\r\n </div>\r\n\r\n <div *ngIf="build || dashboard.upgrades.length">\r\n <h2>Build</h2>\r\n\r\n <ng-container *ngIf="build">\r\n <fs-label-field>\r\n <fs-label>Version</fs-label>\r\n {{build.version}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>Date</fs-label>\r\n {{ build.date | fsDateFormat: \'date-time\' }}\r\n </fs-label-field>\r\n </ng-container>\r\n\r\n <fs-label-field *ngIf="dashboard.upgrades.length">\r\n <fs-label>Pending Upgrades</fs-label>\r\n <span class="attention" [ngClass]="{ \'needs-attention\': !!dashboard.upgrades.length }">\r\n {{dashboard.upgrades.length}}\r\n <mat-icon\r\n [matTooltip]="dashboard.upgrades.join(\'\\n\')"\r\n matTooltipClass="tooltip-pending-upgrades"\r\n >\r\n warning\r\n </mat-icon>\r\n </span>\r\n </fs-label-field>\r\n </div>\r\n\r\n <div>\r\n <h2>Cron</h2>\r\n\r\n <fs-label-field>\r\n <fs-label>Last Ran</fs-label>\r\n <span class="attention" [ngClass]="{ \'needs-attention\': dashboard.cronRanAttention }">\r\n <span *ngIf="!dashboard.cronRan">Never</span>\r\n <span *ngIf="dashboard.cronRan">{{dashboard.cronRan | fsDateFormat: \'date-time\'}}</span>\r\n <mat-icon>warning</mat-icon>\r\n </span>\r\n </fs-label-field>\r\n </div>\r\n </div>\r\n</div>\r\n',changeDetection:t.ChangeDetectionStrategy.OnPush,styles:[".actions{margin-bottom:1.25em}table td{padding:3px}.attention{display:flex;align-items:center}.attention mat-icon{display:none;margin-left:2px}.attention.needs-attention{color:#c00}.attention.needs-attention mat-icon{display:inline}::ng-deep .tooltip-pending-upgrades{white-space:pre-line}@media (max-width:600px){:host ::ng-deep .menu-button{width:100%;border-radius:4px}}@media (min-width:600px){:host ::ng-deep .menu-button{box-shadow:none}}"]}),j("design:paramtypes",[D.FsMessage,t.ChangeDetectorRef,I.FsBuildService])],e)}();function z(e){var t={};return e.forEach((function(e){t[e.value]=e.name})),t}(E=e.CronState||(e.CronState={})).Running="running",E.Idle="idle",E.Failed="failed",E.Queued="queued",E.Disabled="disabled",function(e){e.RadioButton="R",e.InputBox="I",e.Textarea="T",e.Select="D",e.SelectMultiple="W",e.Date="A",e.File="F",e.Static="S",e.Password="P",e.Time="M",e.None="N"}(G||(G={})),(B=e.ApiLogState||(e.ApiLogState={})).Success="success",B.Failed="failed",B.Deleted="deleted",(K=e.ProcessState||(e.ProcessState={})).Queued="Q",K.Running="R",K.Completed="C",K.Killed="K",K.Deleted="D",K.Failed="F",function(e){e.Message="message",e.Disabled="disabled",e.Started="started",e.Running="running",e.Completed="completed",e.Failed="failed",e.Killed="killed",e.Queued="queued",e.Reset="reset",e.Stagnant="stagnant",e.LongRunning="long_running"}($||($={}));var U=[{name:"Message",value:$.Message,color:"#29B7FF"},{name:"Disabled",value:$.Disabled,color:"#29B7FF"},{name:"Started",value:$.Started,color:"#34BD43"},{name:"Running",value:$.Running,color:"#34BD43"},{name:"Completed",value:$.Completed,color:"#34BD43"},{name:"Failed",value:$.Failed,color:"#FA7567"},{name:"Killed",value:$.Killed,color:"#29B7FF"},{name:"Queued",value:$.Queued,color:"#29B7FF"},{name:"Reset",value:$.Reset,color:"#29B7FF"},{name:"Stagnant",value:$.Stagnant,color:"#FA7567"},{name:"Long Running",value:$.LongRunning,color:"#FA7567"}],J=[{name:"Running",value:e.CronState.Running},{name:"Idle",value:e.CronState.Idle},{name:"Failed",value:e.CronState.Failed},{name:"Queued",value:e.CronState.Queued},{name:"Disabled",value:e.CronState.Disabled}],H=[{name:"Success",value:e.ApiLogState.Success},{name:"Failed",value:e.ApiLogState.Failed},{name:"Deleted",value:e.ApiLogState.Deleted}],W=[{name:"Queued",value:e.ProcessState.Queued},{name:"Running",value:e.ProcessState.Running},{name:"Completed",value:e.ProcessState.Completed},{name:"Killed",value:e.ProcessState.Killed},{name:"Failed",value:e.ProcessState.Failed},{name:"Deleted",value:e.ProcessState.Deleted}],Y=function(){function e(e){this._data=e,this.CronLogStates=z(U),this.CronLogStateColors={}}return e.prototype.ngOnInit=function(){this.cronLog=this._data.cronLog,this.CronLogStateColors=U.reduce((function(e,t){return e[t.value]=t.color,e}),{})},e.ctorParameters=function(){return[{type:void 0,decorators:[{type:t.Inject,args:[s.MAT_DIALOG_DATA]}]}]},e=P([t.Component({template:'<fs-dialog *fsSkeleton="cronLog">\r\n <div mat-dialog-title>Cron Log</div>\r\n <mat-dialog-content>\r\n <div class="row">\r\n <fs-label-field>\r\n <fs-label>\r\n Status\r\n </fs-label>\r\n <div [ngStyle]="{ color: CronLogStateColors[cronLog.state]}">\r\n {{CronLogStates[cronLog.state] || cronLog.state}}\r\n </div>\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>\r\n Date\r\n </fs-label>\r\n <fs-date-ago [date]="cronLog.createDate"></fs-date-ago>\r\n </fs-label-field>\r\n </div>\r\n \r\n <fs-label-field *ngIf="cronLog.message">\r\n <fs-label>\r\n Message\r\n </fs-label>\r\n <div class="message">\r\n {{cronLog.message}}\r\n </div>\r\n </fs-label-field>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]="true" color="primary">Done</button>\r\n </mat-dialog-actions>\r\n</fs-dialog>\r\n',styles:[".message{white-space:pre-line}.row{display:flex;flex-wrap:wrap}.row fs-label-field:not(:last-child){margin-right:40px}"]}),O(0,t.Inject(s.MAT_DIALOG_DATA)),j("design:paramtypes",[Object])],e)}(),Z=function(){function e(e,t,n){this._data=e,this._dialog=t,this._cdRef=n,this.tabIndex=0,this.CronStates=z(J),this.CronLogStates=z(U),this.CronLogStateColors={}}return e.prototype.ngOnInit=function(){this.load(),this.CronLogStateColors=U.reduce((function(e,t){return e[t.value]=t.color,e}),{})},e.prototype.cronLogOpen=function(e){this._dialog.open(Y,{data:{cronLog:e},width:"85%"})},e.prototype.cronActionClick=function(e){var t=this;e.action(this.cron).subscribe((function(){t.load()}))},e.prototype.selectedIndexChange=function(e){this.tabIndex=e},e.prototype.load=function(){var e=this;this._data.loadCron(this._data.cron).subscribe((function(t){e.cron=R(R({},e._data.cron),t),e._data.loadCronLogs&&(e.config={filters:[{type:_.ItemType.Select,name:"state",label:"Status",values:N([{name:"All",value:null}],U)},{type:_.ItemType.DateRange,name:"date",label:["From Date","To Date"]}],fetch:function(t){return t=R(R({},t),{cronId:e.cron.id}),e._data.loadCronLogs(t)}}),e.cronActions=e._data.cronActions.filter((function(t){return t.show(e.cron)})),e._cdRef.markForCheck()}))},e.ctorParameters=function(){return[{type:void 0,decorators:[{type:t.Inject,args:[s.MAT_DIALOG_DATA]}]},{type:s.MatDialog},{type:t.ChangeDetectorRef}]},e=P([t.Component({template:'<fs-dialog *fsSkeleton="cron">\r\n <h1 mat-dialog-title>\r\n Cron\r\n <div class="small">{{cron.name}}</div>\r\n </h1>\r\n <mat-dialog-content>\r\n <mat-tab-group (selectedIndexChange)="selectedIndexChange($event)">\r\n <mat-tab label="Overview">\r\n <div class="row">\r\n <fs-label-field>\r\n <fs-label>\r\n Status\r\n </fs-label>\r\n {{CronStates[cron.state]}}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="cron.cronSetting">\r\n <fs-label>\r\n Run Frequency\r\n </fs-label>\r\n {{cron.cronSetting.summary}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>\r\n Last Ran\r\n </fs-label>\r\n <ng-container *ngIf="cron.duration===null; else lastRan">\r\n Never\r\n </ng-container>\r\n <ng-template #lastRan>\r\n <fs-date-ago [date]="cron.createDate"></fs-date-ago>\r\n <div><small *ngIf="cron.duration">Duration: {{ cron.duration | fsDateDuration }}</small></div>\r\n </ng-template>\r\n </fs-label-field>\r\n </div>\r\n\r\n <fs-label-field *ngIf="cron.message">\r\n <fs-label>\r\n Last Message\r\n </fs-label>\r\n <div class="message">{{cron.message}}</div>\r\n </fs-label-field>\r\n </mat-tab>\r\n <mat-tab label="Logs" *ngIf="config">\r\n <ng-template matTabContent>\r\n <fs-list [config]="config">\r\n <fs-list-column name="state" title="Status">\r\n <ng-template fs-list-cell let-row="row">\r\n <a \r\n (click)="cronLogOpen(row)"\r\n [ngStyle]="{ color: CronLogStateColors[row.state] }">\r\n {{CronLogStates[row.state] || row.state}}\r\n </a>\r\n </ng-template>\r\n </fs-list-column>\r\n \r\n <fs-list-column title="Message" class="col-message">\r\n <ng-template fs-list-cell let-row="row">\r\n <div class="message">{{row.message}}</div>\r\n </ng-template>\r\n </fs-list-column>\r\n\r\n <fs-list-column name="create_date" title="Date" class="col-date">\r\n <ng-template fs-list-cell let-row="row">\r\n <fs-date-ago [date]="row.createDate"></fs-date-ago>\r\n </ng-template>\r\n </fs-list-column>\r\n </fs-list> \r\n </ng-template>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n </mat-dialog-content>\r\n <mat-dialog-actions> \r\n <button \r\n mat-button \r\n [mat-dialog-close]="true" \r\n color="primary">\r\n Done\r\n </button>\r\n <ng-container *ngIf="tabIndex === 0">\r\n <button \r\n *ngFor="let cronAction of cronActions"\r\n mat-button \r\n (click)="cronActionClick(cronAction)">\r\n {{cronAction.label}}\r\n </button> \r\n </ng-container>\r\n </mat-dialog-actions>\r\n</fs-dialog>\r\n',changeDetection:t.ChangeDetectionStrategy.OnPush,styles:[":host ::ng-deep .col-message .message{white-space:break-spaces;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden}:host ::ng-deep .col-date{white-space:nowrap}h1 .small{line-height:normal}.row{display:flex;flex-wrap:wrap}.row fs-label-field:not(:last-child){margin-right:40px}.message{white-space:pre-line}"]}),O(0,t.Inject(s.MAT_DIALOG_DATA)),j("design:paramtypes",[Object,s.MatDialog,t.ChangeDetectorRef])],e)}(),X=function(){function n(e,t){this._message=e,this._dialog=t,this.config=null,this.cronStates=z(J)}return n.prototype.ngOnInit=function(){this._configList()},n.prototype._configList=function(){var e=this;this.config={paging:!1,filters:[{type:_.ItemType.Keyword,name:"keyword",label:"Search"}],rowActions:this.getCronActions().map((function(e){return R(R({},e),{click:function(t){e.action(t).subscribe()}})})),fetch:function(t){return t.timezone=Intl.DateTimeFormat().resolvedOptions().timeZone,e.loadCrons(t).pipe(C.map((function(e){return{data:e}})))}},this.bulk&&(this.config.selection={selectAll:!1,actions:[{type:x.SelectionActionType.Action,name:"disable",label:"Disable"},{type:x.SelectionActionType.Action,name:"enable",label:"Enable"}],actionSelected:function(t){return e.bulk(t.action.name,t.selected).pipe(C.tap((function(){e.list.reload(),e._message.success("Applied Changes")})))}})},n.prototype.open=function(e){this._dialog.open(Z,{data:{cron:e,loadCronLogs:this.loadCronLogs,loadCron:this.loadCron,cronActions:this.getCronActions()},width:"85%"})},n.prototype.getCronActions=function(){var t=this;return[{action:function(e){return t.queue(e).pipe(C.tap((function(){t._message.success("Queued cron"),t.list.reload()})))},label:"Queue",show:function(t){return t.state===e.CronState.Idle||t.state===e.CronState.Failed}},{action:function(e){return t.run(e).pipe(C.tap((function(){t._message.success("Cron ran"),t.list.reload()})))},label:"Run",show:function(t){return t.state===e.CronState.Idle||t.state===e.CronState.Failed}},{action:function(e){return t.enable(e).pipe(C.tap((function(){t._message.success("Enabled cron"),t.list.reload()})))},label:"Enable",show:function(t){return t.state===e.CronState.Disabled}},{action:function(e){return t.disable(e).pipe(C.tap((function(){t._message.success("Disabled cron"),t.list.reload()})))},label:"Disable",show:function(t){return t.state===e.CronState.Idle||t.state===e.CronState.Failed}},{action:function(e){return t.kill(e).pipe(C.tap((function(){t._message.success("Killed cron"),t.list.reload()})))},label:"Kill",show:function(t){return t.state===e.CronState.Running}}]},n.ctorParameters=function(){return[{type:D.FsMessage},{type:s.MatDialog}]},P([t.ViewChild(b.FsListComponent,{static:!0}),j("design:type",b.FsListComponent)],n.prototype,"list",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"enable",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"disable",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"kill",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"queue",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"run",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"loadCrons",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"loadCron",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"loadCronLogs",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"bulk",void 0),n=P([t.Component({selector:"fs-system-crons",template:'<fs-list [config]="config">\r\n <fs-list-column>\r\n <ng-template fs-list-header>Name</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n <a (click)="open(row)">{{row.name}}</a>\r\n <div *ngIf="row.cronSetting">\r\n <small>{{row.cronSetting.summary}}</small>\r\n </div>\r\n </ng-template>\r\n </fs-list-column>\r\n <fs-list-column>\r\n <ng-template fs-list-header>Status</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n {{cronStates[row.state]}}\r\n </ng-template>\r\n </fs-list-column>\r\n <fs-list-column>\r\n <ng-template fs-list-header>Last Ran</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n <ng-container *ngIf="row.duration===null; else lastRan">\r\n Never\r\n </ng-container>\r\n <ng-template #lastRan>\r\n <fs-date-ago [date]="row.createDate"></fs-date-ago>\r\n <div><small *ngIf="row.duration">Duration: {{ row.duration | fsDateDuration }}</small></div>\r\n </ng-template>\r\n </ng-template>\r\n </fs-list-column>\r\n</fs-list>\r\n',styles:[""]}),j("design:paramtypes",[D.FsMessage,s.MatDialog])],n)}(),ee=function(){function e(e,n,r,a){this._message=e,this._clipboardService=n,this._prompt=r,this._cdRef=a,this.fileRemove=new t.EventEmitter,this.fileSelect=new t.EventEmitter,this.groupedSettings=[],this.groups=[],this.SettingInterfaceType=G}return e.prototype.ngOnInit=function(){var e=this;this.loadSettings().subscribe((function(t){t=t.filter((function(e){return e.interfaceType!==G.None})).map((function(e){switch(e.interfaceType){case G.Date:case G.Time:e.value=u.parse(e.value);case G.SelectMultiple:e.value=Array.isArray(e.value)?e.value:[]}return e})),e.groupedSettings=k.groupBy(t,(function(e){return e.group})),e.groups=Object.keys(e.groupedSettings),e._cdRef.markForCheck()}))},e.prototype.export=function(e,t){e.stopPropagation();var n=t.map((function(e){return{name:e.name,value:e.value,group:e.group}}));this._clipboardService.copy(JSON.stringify(n)),this._message.success("Copied to clipboard")},e.prototype.import=function(e,t){var n=this;e.stopPropagation(),this._prompt.input({label:"JSON Import",title:"Import Settings",commitLabel:"Import",required:!0}).subscribe((function(e){if(e)try{var r=n.groupedSettings[t];JSON.parse(e).forEach((function(e){var t=r.find((function(t){return e.name===t.name}));t&&Object.assign(t,e)})),n._cdRef.markForCheck()}catch(e){n._message.error(e)}}))},e.prototype.saveGroup=function(e){var t=this,n=this.groupedSettings[e],r=k.reduce(n,(function(e,t,n){return e[t.name]=t.value,e}),{});this.save(e,r).subscribe((function(){t._message.success("Changes Saved")}))},e.ctorParameters=function(){return[{type:D.FsMessage},{type:A.ClipboardService},{type:M.FsPrompt},{type:t.ChangeDetectorRef}]},P([t.Input(),j("design:type",Function)],e.prototype,"loadSettings",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"save",void 0),P([t.Output(),j("design:type",Object)],e.prototype,"fileRemove",void 0),P([t.Output(),j("design:type",Object)],e.prototype,"fileSelect",void 0),e=P([t.Component({selector:"fs-system-settings",template:'\r\n<mat-accordion>\r\n <mat-expansion-panel hideToggle *ngFor="let group of groups">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <div class="title-row">\r\n <div class="title">{{group || \'General\'}}</div>\r\n <div class="actions">\r\n <button\r\n type="button"\r\n [matTooltip]="\'Export \' + (group || \'General\') + \' Settings\'"\r\n mat-icon-button\r\n (click)="export($event, groupedSettings[group])">\r\n <mat-icon>cloud_download</mat-icon>\r\n </button>\r\n <button\r\n type="button"\r\n [matTooltip]="\'Import \' + (group || \'General\') + \' Settings\'"\r\n mat-icon-button\r\n (click)="import($event, group)">\r\n <mat-icon>cloud_upload</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <div hideToggle *ngFor="let setting of groupedSettings[group]">\r\n <mat-form-field class="full-width" *ngIf="setting.interfaceType===SettingInterfaceType.InputBox">\r\n <input\r\n matInput\r\n [placeholder]="setting.label"\r\n [(ngModel)]="setting.value"\r\n [name]="\'setting\' + setting.id">\r\n <mat-hint>{{setting.instruction}}</mat-hint>\r\n </mat-form-field>\r\n\r\n <mat-form-field class="full-width" *ngIf="setting.interfaceType===SettingInterfaceType.Textarea">\r\n <textarea\r\n matInput\r\n [placeholder]="setting.label"\r\n [(ngModel)]="setting.value"\r\n [name]="\'setting\' + setting.id">\r\n </textarea>\r\n <mat-hint>{{setting.instruction}}</mat-hint>\r\n </mat-form-field>\r\n\r\n <mat-form-field class="full-width" *ngIf="setting.interfaceType===SettingInterfaceType.Select || setting.interfaceType===SettingInterfaceType.SelectMultiple">\r\n <mat-select\r\n [placeholder]="setting.label"\r\n [(ngModel)]="setting.value"\r\n [multiple]="setting.interfaceType===SettingInterfaceType.SelectMultiple"\r\n [name]="\'setting\' + setting.id">\r\n <mat-option *ngFor="let item of setting.values | keyNameValue" [value]="item.value">\r\n {{item.name}}\r\n </mat-option>\r\n </mat-select>\r\n <mat-hint>{{setting.instruction}}</mat-hint>\r\n </mat-form-field>\r\n\r\n <mat-form-field class="full-width" *ngIf="setting.interfaceType===SettingInterfaceType.Date">\r\n <input\r\n matInput\r\n fsDatePicker\r\n [placeholder]="setting.label"\r\n [(ngModel)]="setting.value"\r\n [name]="\'setting\' + setting.id">\r\n <mat-hint>{{setting.instruction}}</mat-hint>\r\n </mat-form-field>\r\n\r\n <mat-form-field class="full-width" *ngIf="setting.interfaceType===SettingInterfaceType.Time">\r\n <input\r\n matInput\r\n fsTimePicker\r\n [placeholder]="setting.label"\r\n [(ngModel)]="setting.value"\r\n [name]="\'setting\' + setting.id">\r\n <mat-hint>{{setting.instruction}}</mat-hint>\r\n </mat-form-field>\r\n\r\n <fs-file-picker\r\n *ngIf="setting.interfaceType===SettingInterfaceType.File"\r\n [allowRemove]="true"\r\n [allowDownload]="true"\r\n (select)="fileSelect.emit({ setting: setting, file: $event.file })"\r\n (remove)="fileRemove.emit(setting)"\r\n [url]="setting.value">\r\n <div fsFileLabel>{{setting.label}}</div>\r\n </fs-file-picker>\r\n </div>\r\n\r\n <button mat-raised-button color="primary" type="button" (click)="saveGroup(group)">Save</button>\r\n\r\n </mat-expansion-panel>\r\n\r\n</mat-accordion>\r\n',changeDetection:t.ChangeDetectionStrategy.OnPush,styles:[".mat-expansion-panel-header{font-size:19px}.full-width{width:100%}.title-row{flex-direction:row;box-sizing:border-box;display:flex;place-content:center flex-start;align-items:center;width:100%}.title-row .title{display:flex;flex:1}:host ::ng-deep .mat-expansion-panel-header-title{margin:0}:host ::ng-deep .mat-expansion-panel .actions{display:none}:host ::ng-deep .mat-expansion-panel.mat-expanded .actions{display:block}"]}),j("design:paramtypes",[D.FsMessage,A.ClipboardService,M.FsPrompt,t.ChangeDetectorRef])],e)}(),te=function(){function e(){}return e.prototype.ngOnInit=function(){this._configFileManager()},e.prototype._configFileManager=function(){var e=this;this.config={fetch:function(t){return e.fetch(t)},deleteFile:function(t){return e.deleteFile(t)},deleteDirectory:function(t){return e.deleteDirectory(t)},createDirectory:function(t){return e.createDirectory(t)},download:function(t){return e.download(t)},upload:function(t,n){return e.upload(t,n)}}},P([t.Input(),j("design:type",Function)],e.prototype,"fetch",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"deleteFile",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"deleteDirectory",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"createDirectory",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"download",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"upload",void 0),e=P([t.Component({selector:"fs-system-file-manager",template:'<fs-file-manager [config]="config"></fs-file-manager>',styles:[""]}),j("design:paramtypes",[])],e)}(),ne=function(){function e(){}return e.prototype.transform=function(e){return Object.keys(e).map((function(t){return{value:t,name:e[t]}}))},e=P([t.Pipe({name:"keyNameValue"}),t.Injectable()],e)}(),re=function(){function n(t,n){this._dialogRef=t,this.data=n,this.ProcessState=e.ProcessState}return n.prototype.ngOnInit=function(){this.ProcessStates=z(W),this.data.loadProcess?this.load():this.process=this.data.process},n.prototype.load=function(){var e=this;this.data.loadProcess(this.data.process).subscribe((function(t){e.process=t}))},n.ctorParameters=function(){return[{type:s.MatDialogRef},{type:void 0,decorators:[{type:t.Inject,args:[s.MAT_DIALOG_DATA]}]}]},n=P([t.Component({template:'<fs-dialog *fsSkeleton="process">\r\n <div mat-dialog-title>Process</div>\r\n <mat-dialog-content>\r\n <div fxLayout="column">\r\n <fs-label-field>\r\n <fs-label>\r\n Name\r\n </fs-label>\r\n {{process.prettyName}}\r\n </fs-label-field>\r\n\r\n <div fxLayout="row" fxLayoutGap="20px">\r\n\r\n <fs-label-field>\r\n <fs-label>\r\n Status\r\n </fs-label>\r\n {{ProcessStates[process.state]}}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="process.notify">\r\n <fs-label>\r\n Notification Email\r\n </fs-label>\r\n {{process.notify}}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="process.pid">\r\n <fs-label>\r\n PID\r\n </fs-label>\r\n {{process.pid}}\r\n </fs-label-field>\r\n </div>\r\n\r\n <div fxLayout="row" fxLayoutGap="20px">\r\n <fs-label-field>\r\n <fs-label>\r\n Create Date\r\n </fs-label>\r\n {{ process.createDate | fsDateFormat: \'date-time\' }}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="process.startDate">\r\n <fs-label>\r\n Start Date\r\n </fs-label>\r\n {{ process.startDate | fsDateFormat: \'date-time\' }}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="process.endDate">\r\n <fs-label>\r\n Complete Date\r\n </fs-label>\r\n {{ process.endDate | fsDateFormat: \'date-time\' }}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="process.duration">\r\n <fs-label>\r\n Duration\r\n </fs-label>\r\n {{ process.duration | fsDateDuration: {hours: true, minutes: true, seconds: true} }}\r\n </fs-label-field>\r\n </div>\r\n\r\n <fs-label-field *ngIf="process.message">\r\n <fs-label>\r\n Message\r\n </fs-label>\r\n {{process.message}}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="process.log" class="log">\r\n <fs-label>\r\n Log\r\n </fs-label>{{process.log}}\r\n </fs-label-field>\r\n\r\n </div>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]="true" color="primary">Done</button>\r\n <button\r\n *ngIf="process.state===ProcessState.Running && data.loadProcess"\r\n mat-button\r\n (click)="load()">\r\n Reload\r\n </button>\r\n </mat-dialog-actions>\r\n</fs-dialog>\r\n',styles:[":host ::ng-deep .log .field-content{white-space:pre-wrap;font-family:monospace;font-size:14px}"]}),O(1,t.Inject(s.MAT_DIALOG_DATA)),j("design:paramtypes",[s.MatDialogRef,Object])],n)}(),ae=function(){function n(t,n){this._dialog=t,this._message=n,this.actions=[],this.config=null,this.ProcessStates=z(W),this.ProcessState=e.ProcessState,this._destroy$=new F.Subject}return n.prototype.ngOnInit=function(){this._configList()},n.prototype._configList=function(){var e=this;this.config={actions:[],rowActions:[],filters:[{type:_.ItemType.Keyword,name:"keyword",label:"Search"},{type:_.ItemType.Select,name:"state",label:"Status",values:W}],fetch:function(t){return e.loadProcesses(t).pipe(C.map((function(e){return{data:e.data,paging:e.paging}})))}},this.run&&this.config.rowActions.push({label:"Run",click:function(t){e._message.info("Running process..."),e.run(t).subscribe((function(){e.list.reload(),e._message.success("Succesfully ran process")})),setTimeout((function(){e.list.reload()}),500)}}),this.kill&&this.config.rowActions.push({label:"Kill",show:function(e){return!!e.pid},click:function(t){e._message.info("Killing process..."),e.kill(t).subscribe((function(){e.list.reload(),e._message.success("Succesfully killed process")})),setTimeout((function(){e.list.reload()}),500)}}),this.delete&&this.config.rowActions.push({label:"Delete",click:function(t){e.delete(t).subscribe((function(){e.list.reload(),e._message.success("Deleted process")}))}}),this.actions.forEach((function(t){e.config.actions.push({primary:!1,label:t.label,menu:t.menu,click:function(){(t.click&&t.click(),t.component)&&e._dialog.open(t.component,{width:"800px"}).afterClosed().pipe(C.takeUntil(e._destroy$)).subscribe((function(t){e.list.reload()}))}})}))},n.prototype.open=function(e){this._dialog.open(re,{data:{process:e,loadProcess:this.loadProcess},width:"85%"})},n.prototype.ngOnDestroy=function(){this._destroy$.next(),this._destroy$.complete()},n.ctorParameters=function(){return[{type:s.MatDialog},{type:D.FsMessage}]},P([t.ViewChild(b.FsListComponent),j("design:type",b.FsListComponent)],n.prototype,"list",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"loadProcesses",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"loadProcess",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"run",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"kill",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"delete",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"download",void 0),P([t.Input(),j("design:type",Array)],n.prototype,"actions",void 0),n=P([t.Component({selector:"fs-system-processes",template:'<fs-list [config]="config">\r\n <fs-list-column>\r\n <ng-template fs-list-header>Name</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n <a (click)="open(row)">{{row.prettyName}}</a>\r\n </ng-template>\r\n </fs-list-column>\r\n\r\n <fs-list-column>\r\n <ng-template fs-list-header>Status</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n {{ProcessStates[row.state]}}\r\n <small>\r\n <div *ngIf="row.state===ProcessState.Running && row.percent">Complete: {{ row.percent }}%</div>\r\n <div *ngIf="row.state===ProcessState.Completed && row.filename">Download: <a href="javascript:;" (click)="download(row)">{{ row.filename }}</a></div>\r\n <div *ngIf="row.pid">PID: {{ row.pid }}</div>\r\n <div *ngIf="row.state===ProcessState.Running && row.notify">Notify: {{ row.notify }}</div>\r\n </small>\r\n </ng-template>\r\n </fs-list-column>\r\n\r\n <fs-list-column>\r\n <ng-template fs-list-header>Duration</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n {{ row.duration | fsDateDuration: {hours: true, minutes: true, seconds: true} }}\r\n </ng-template>\r\n </fs-list-column>\r\n\r\n\r\n <fs-list-column>\r\n <ng-template fs-list-header>Message</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n {{row.message}}\r\n </ng-template>\r\n </fs-list-column>\r\n\r\n <fs-list-column>\r\n <ng-template fs-list-header>Completed</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n <fs-date-ago [date]="row.endDate"></fs-date-ago>\r\n </ng-template>\r\n </fs-list-column>\r\n</fs-list>\r\n',styles:[""]}),j("design:paramtypes",[s.MatDialog,D.FsMessage])],n)}(),oe=function(){function e(e){this.data=e}return e.prototype.ngOnInit=function(){if(this.data.log){this.log=this.data.log;try{this.log.backtrace=JSON.parse(this.log.backtrace)}catch(e){}try{this.log.server=JSON.parse(this.log.server)}catch(e){}}},e.ctorParameters=function(){return[{type:void 0,decorators:[{type:t.Inject,args:[s.MAT_DIALOG_DATA]}]}]},e=P([t.Component({template:'<fs-dialog *fsSkeleton="log">\r\n <div mat-dialog-title>Log</div>\r\n <mat-dialog-content>\r\n <div fxLayout="column">\r\n <fs-label-field>\r\n <fs-label>\r\n Error Type\r\n </fs-label>\r\n {{log.type}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>\r\n Message\r\n </fs-label>\r\n {{log.message}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>\r\n URL\r\n </fs-label>\r\n {{log.url}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>\r\n Date\r\n </fs-label>\r\n {{log.createDate|fsDateFormat: \'full-date-time\'}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>\r\n File\r\n </fs-label>\r\n {{log.file}} @ {{log.line}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>\r\n Backtrace\r\n </fs-label>\r\n <pre>{{log.backtrace|json}}</pre>\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>\r\n $_SERVER\r\n </fs-label>\r\n <pre>{{log.server|json}}</pre>\r\n </fs-label-field>\r\n </div>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]="true" color="primary">Done</button>\r\n </mat-dialog-actions>\r\n</fs-dialog>\r\n',styles:[""]}),O(0,t.Inject(s.MAT_DIALOG_DATA)),j("design:paramtypes",[Object])],e)}(),ie=function(){function e(e){this._dialog=e,this.config=null,this.logTypes=[]}return e.prototype.ngOnInit=function(){this._configList()},e.prototype._configList=function(){var e=this;this.config={filters:[{type:_.ItemType.Keyword,name:"keyword",label:"Search"}],fetch:function(t){return e.loadLogs(t).pipe(C.map((function(e){return{data:e.data,paging:e.paging}})))}}},e.prototype.open=function(e){this._dialog.open(oe,{data:{log:e},width:"85%"})},e.ctorParameters=function(){return[{type:s.MatDialog}]},P([t.ViewChild("list",{static:!0}),j("design:type",b.FsListComponent)],e.prototype,"list",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"loadLogs",void 0),e=P([t.Component({selector:"fs-system-server-logs",template:'<fs-list [config]="config">\r\n <fs-list-column>\r\n <ng-template fs-list-header>Message</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n <a href="javascript:;" (click)="open(row)">{{row.message}}</a>\r\n </ng-template>\r\n </fs-list-column>\r\n <fs-list-column>\r\n <ng-template fs-list-header>Type</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n {{row.type}}\r\n </ng-template>\r\n </fs-list-column>\r\n <fs-list-column>\r\n <ng-template fs-list-header>Date</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n <fs-date-ago [date]="row.createDate"></fs-date-ago>\r\n </ng-template>\r\n </fs-list-column>\r\n </fs-list>\r\n',styles:[""]}),j("design:paramtypes",[s.MatDialog])],e)}(),le=function(){function e(){this.config=null,this.logTypes=[]}return e.prototype.ngOnInit=function(){this._configList()},e.prototype._configList=function(){var e=this;this.config={paging:!1,filters:[{type:_.ItemType.Keyword,name:"keyword",label:"Search"}],fetch:function(t){return e.loadUpgradeLogs(t).pipe(C.map((function(e){return{data:e.data,paging:e.paging}})))}}},P([t.ViewChild(b.FsListComponent,{static:!0}),j("design:type",b.FsListComponent)],e.prototype,"list",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"loadUpgradeLogs",void 0),e=P([t.Component({selector:"fs-system-upgrade-logs",template:'<fs-list [config]="config">\r\n <fs-list-column>\r\n <ng-template fs-list-header>Name</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n {{row.name}}\r\n </ng-template>\r\n </fs-list-column>\r\n\r\n <fs-list-column>\r\n <ng-template fs-list-header>Function</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n {{row.function}}()\r\n </ng-template>\r\n </fs-list-column>\r\n\r\n <fs-list-column>\r\n <ng-template fs-list-header>Date</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n <fs-date-ago [date]="row.createDate"></fs-date-ago>\r\n </ng-template>\r\n </fs-list-column>\r\n</fs-list>\r\n',styles:[""]})],e)}(),se=function(){function e(e,t){this._dialogRef=e,this.data=t}return e.prototype.ngOnInit=function(){this.apiLogStates=z(H),this.data.apiLog&&(this.apiLog=this.data.apiLog)},e.ctorParameters=function(){return[{type:s.MatDialogRef},{type:void 0,decorators:[{type:t.Inject,args:[s.MAT_DIALOG_DATA]}]}]},e=P([t.Component({template:'<fs-dialog *fsSkeleton="apiLog">\r\n <div mat-dialog-title>API Log</div>\r\n <mat-dialog-content>\r\n <div fxLayout="column">\r\n <fs-label-field>\r\n <fs-label>\r\n Type\r\n </fs-label>\r\n {{apiLog.type}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>\r\n Status\r\n </fs-label>\r\n {{apiLogStates[apiLog.state]}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>\r\n Date\r\n </fs-label>\r\n {{apiLog.createDate|fsDateFormat: \'full-date-time\'}}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="apiLog.length">\r\n <fs-label>\r\n Duration\r\n </fs-label>\r\n {{ apiLog.length | fsDateDuration }}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="apiLog.code">\r\n <fs-label>\r\n Code\r\n </fs-label>\r\n {{apiLog.code}}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="apiLog.message">\r\n <fs-label>\r\n Message\r\n </fs-label>\r\n {{apiLog.message}}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="apiLog.url">\r\n <fs-label>\r\n URL\r\n </fs-label>\r\n {{apiLog.url}}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="apiLog.request">\r\n <fs-label>\r\n Request\r\n </fs-label>\r\n <pre>{{apiLog.request|json}}</pre>\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="apiLog.response">\r\n <fs-label>\r\n Response\r\n </fs-label>\r\n <pre>{{apiLog.response|json}}</pre>\r\n </fs-label-field>\r\n\r\n </div>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]="true" color="primary">Done</button>\r\n </mat-dialog-actions>\r\n</fs-dialog>\r\n',styles:[""]}),O(1,t.Inject(s.MAT_DIALOG_DATA)),j("design:paramtypes",[s.MatDialogRef,Object])],e)}(),ce=function(){function e(e){this._dialog=e,this.config=null,this.apiLogStates=z(H)}return e.prototype.ngOnInit=function(){this._configList()},e.prototype._configList=function(){var e=this;this.config={filters:[{type:_.ItemType.Keyword,name:"keyword",label:"Search"},{type:_.ItemType.Select,name:"state",label:"Status",values:H},{name:"createDate",type:_.ItemType.DateRange,label:["From Date","To Date"]}],fetch:function(t){return Object.assign(t,{}),e.loadApiLogs(t).pipe(C.map((function(e){return{data:e.data,paging:e.paging}})))}}},e.prototype.open=function(e){this._dialog.open(se,{data:{apiLog:e},width:"85%"})},e.ctorParameters=function(){return[{type:s.MatDialog}]},P([t.ViewChild(b.FsListComponent,{static:!0}),j("design:type",b.FsListComponent)],e.prototype,"list",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"loadApiLogs",void 0),e=P([t.Component({selector:"fs-system-api-logs",template:'<fs-list [config]="config">\r\n <fs-list-column>\r\n <ng-template fs-list-header>Name</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n <a href="javascript:;" (click)="open(row)">{{row.type || \'Unknown\'}}</a>\r\n </ng-template>\r\n </fs-list-column>\r\n <fs-list-column>\r\n <ng-template fs-list-header>Message</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n {{row.message}}\r\n </ng-template>\r\n </fs-list-column>\r\n <fs-list-column>\r\n <ng-template fs-list-header>Status</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n {{apiLogStates[row.state]}}\r\n </ng-template>\r\n </fs-list-column>\r\n <fs-list-column>\r\n <ng-template fs-list-header>Date</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n <fs-date-ago [date]="row.createDate"></fs-date-ago>\r\n <div><small *ngIf="row.length">Duration: {{ row.length | fsDateDuration }}</small></div>\r\n </ng-template>\r\n </fs-list-column>\r\n </fs-list>\r\n',styles:[""]}),j("design:paramtypes",[s.MatDialog])],e)}(),fe=function(){function e(){}return e.prototype.ngAfterViewInit=function(){this._load()},e.prototype._load=function(){var e=this;this.load().subscribe((function(t){t+="<style>body { background: transparent; }</style>";var n=e.iframe.nativeElement.contentDocument||e.iframe.nativeElement.contentWindow;n.open(),n.write(t),n.close();var r=e.iframe.nativeElement.contentWindow.document.documentElement.scrollHeight+100;e.iframe.nativeElement.style.height=r+"px"}))},P([t.ViewChild("iframe"),j("design:type",t.ElementRef)],e.prototype,"iframe",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"load",void 0),e=P([t.Component({selector:"fs-system-info",template:"<iframe #iframe></iframe>\r\n",changeDetection:t.ChangeDetectionStrategy.OnPush,styles:["iframe{width:100%;border:0}"]})],e)}(),de=function(){function e(){}var D;return D=e,e.forRoot=function(e){return{ngModule:D,providers:[{provide:Q,useValue:e||{}}]}},e=D=P([t.NgModule({imports:[n.CommonModule,d.FlexLayoutModule,r.FormsModule,p.MatButtonModule,o.MatExpansionModule,c.MatTooltipModule,f.MatIconModule,a.MatFormFieldModule,i.MatInputModule,l.MatSelectModule,s.MatDialogModule,T.MatTabsModule,u.FsDateModule,m.FsSkeletonModule,b.FsListModule,w.FsFileModule,h.FsFileManagerModule,v.FsLabelModule,y.FsDialogModule,g.FsDatePickerModule,S.FsMenuModule,A.ClipboardModule],exports:[V,X,ee,te,ae,ie,le,ce,fe],declarations:[V,X,ee,ne,te,ae,oe,ie,le,ce,se,fe,re,Z,Y]})],e)}();e.ApiLogStates=H,e.CronStates=J,e.FS_SYSTEM_CONFIG=Q,e.FsSystemModule=de,e.ProcessStates=W,e.ɵa=V,e.ɵb=X,e.ɵc=ee,e.ɵd=te,e.ɵe=ae,e.ɵf=ie,e.ɵg=le,e.ɵh=ce,e.ɵi=fe,e.ɵj=ne,e.ɵk=oe,e.ɵl=se,e.ɵm=re,e.ɵn=Z,e.ɵo=Y,Object.defineProperty(e,"__esModule",{value:!0})}));
15
+ ***************************************************************************** */var R=function(){return(R=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var a in t=arguments[n])Object.prototype.hasOwnProperty.call(t,a)&&(e[a]=t[a]);return e}).apply(this,arguments)};function P(e,t,n,r){var a,o=arguments.length,i=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,n,r);else for(var l=e.length-1;l>=0;l--)(a=e[l])&&(i=(o<3?a(i):o>3?a(t,n,i):a(t,n))||i);return o>3&&i&&Object.defineProperty(t,n,i),i}function O(e,t){return function(n,r){t(n,r,e)}}function j(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function q(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,a,o=n.call(e),i=[];try{for(;(void 0===t||t-- >0)&&!(r=o.next()).done;)i.push(r.value)}catch(e){a={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(a)throw a.error}}return i}function N(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(q(arguments[t]));return e}var E,G,B,K,$,Q=new t.InjectionToken("fs-system-config"),V=function(){function e(e,t,n){this._message=e,this._cdRef=t,this._buildService=n,this.buttonActions=[],this.menuActions=[],this._destroy$=new F.Subject,this.actions=[]}return e.prototype.ngOnInit=function(){var e=this;this._load(),this.buttonActions=this.actions.filter((function(e){return!e.menu})),this.menuActions=this.actions.filter((function(e){return e.menu})),this.build=this._buildService.build,this._buildService.buildChange$.pipe(C.takeUntil(this._destroy$)).subscribe((function(t){e.build=t,e._cdRef.markForCheck()}))},e.prototype._load=function(){var e=this;this.load().subscribe((function(t){e.dashboard=t,e.dashboard.cronRanAttention=!t.cronRan||L.differenceInMinutes(new Date,new Date(t.cronRan))>15,e._cdRef.markForCheck()}))},e.prototype.ngOnDestroy=function(){this._destroy$.next(),this._destroy$.complete()},e.prototype.actionClick=function(e){e.click()},e.prototype.initClick=function(){var e=this;this.init().subscribe((function(){e._message.success("Successfully initialized the system")}))},e.prototype.upgradeClick=function(){var e=this;this.upgrade().subscribe((function(){e._load(),e._message.success("Successfully upgraded the system")}))},e.ctorParameters=function(){return[{type:D.FsMessage},{type:t.ChangeDetectorRef},{type:I.FsBuildService}]},P([t.Input(),j("design:type",Function)],e.prototype,"init",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"upgrade",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"load",void 0),P([t.Input(),j("design:type",Array)],e.prototype,"actions",void 0),e=P([t.Component({selector:"fs-system-dashboard",template:'<div *fsSkeleton="dashboard">\r\n\r\n <div class="h2-container">\r\n\r\n <div class="actions">\r\n <h2>Actions</h2>\r\n <div fxLayout="row" fxLayoutGap="5px" fxLayout.xs="column">\r\n <button mat-raised-button (click)="upgradeClick()">Run Upgrades</button>\r\n <button mat-raised-button (click)="initClick()">Init System</button>\r\n\r\n <button\r\n *ngFor="let action of buttonActions"\r\n mat-raised-button\r\n (click)="actionClick(action)">\r\n {{action.label}}\r\n </button>\r\n\r\n <ng-container *ngIf="menuActions.length">\r\n\r\n <fs-menu buttonClass="mat-raised-button menu-button">\r\n <ng-template\r\n *ngFor="let action of menuActions"\r\n fs-menu-item\r\n (click)="actionClick(action)">\r\n {{action.label}}\r\n </ng-template>\r\n </fs-menu>\r\n\r\n\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div\r\n fxLayout="row wrap"\r\n fxLayout.xs="column"\r\n fxLayoutGap.xs="0px"\r\n fxLayoutAlign="start start"\r\n fxLayoutGap="50px">\r\n\r\n <div>\r\n <h2>Server</h2>\r\n\r\n <fs-label-field>\r\n <fs-label>Date/Time</fs-label>\r\n {{dashboard.serverTime | fsDateFormat: \'date-time\'}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>Timezone</fs-label>\r\n {{dashboard.serverTimezone}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>Hostname</fs-label>\r\n {{dashboard.serverHostname}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>Directory</fs-label>\r\n {{dashboard.appDirectory}}\r\n </fs-label-field>\r\n </div>\r\n\r\n <div>\r\n <h2>System</h2>\r\n <fs-label-field>\r\n <fs-label>Mode</fs-label>\r\n {{dashboard.appMode}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>Notification Recipients</fs-label>\r\n {{dashboard.notifyRecipients.join(\', \')}}\r\n </fs-label-field>\r\n </div>\r\n\r\n <div>\r\n <h2>Database</h2>\r\n\r\n <fs-label-field>\r\n <fs-label>Name</fs-label>\r\n {{dashboard.databaseName}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>Date/Time</fs-label>\r\n {{dashboard.databaseTime | fsDateFormat: \'date-time\'}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>Timezone</fs-label>\r\n {{dashboard.databaseTimezone}}\r\n </fs-label-field>\r\n </div>\r\n\r\n <div *ngIf="build || dashboard.upgrades.length">\r\n <h2>Build</h2>\r\n\r\n <ng-container *ngIf="build">\r\n <fs-label-field>\r\n <fs-label>Version</fs-label>\r\n {{build.version}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>Date</fs-label>\r\n {{ build.date | fsDateFormat: \'date-time\' }}\r\n </fs-label-field>\r\n </ng-container>\r\n\r\n <fs-label-field *ngIf="dashboard.upgrades.length">\r\n <fs-label>Pending Upgrades</fs-label>\r\n <span class="attention" [ngClass]="{ \'needs-attention\': !!dashboard.upgrades.length }">\r\n {{dashboard.upgrades.length}}\r\n <mat-icon\r\n [matTooltip]="dashboard.upgrades.join(\'\\n\')"\r\n matTooltipClass="tooltip-pending-upgrades"\r\n >\r\n warning\r\n </mat-icon>\r\n </span>\r\n </fs-label-field>\r\n </div>\r\n\r\n <div>\r\n <h2>Cron</h2>\r\n\r\n <fs-label-field>\r\n <fs-label>Last Ran</fs-label>\r\n <span class="attention" [ngClass]="{ \'needs-attention\': dashboard.cronRanAttention }">\r\n <span *ngIf="!dashboard.cronRan">Never</span>\r\n <span *ngIf="dashboard.cronRan">{{dashboard.cronRan | fsDateFormat: \'date-time\'}}</span>\r\n <mat-icon>warning</mat-icon>\r\n </span>\r\n </fs-label-field>\r\n </div>\r\n </div>\r\n</div>\r\n',changeDetection:t.ChangeDetectionStrategy.OnPush,styles:[".actions{margin-bottom:1.25em}table td{padding:3px}.attention{display:flex;align-items:center}.attention mat-icon{display:none;margin-left:2px}.attention.needs-attention{color:#c00}.attention.needs-attention mat-icon{display:inline}::ng-deep .tooltip-pending-upgrades{white-space:pre-line}@media (max-width:600px){:host ::ng-deep .menu-button{width:100%;border-radius:4px}}@media (min-width:600px){:host ::ng-deep .menu-button{box-shadow:none}}"]}),j("design:paramtypes",[D.FsMessage,t.ChangeDetectorRef,I.FsBuildService])],e)}();function z(e){var t={};return e.forEach((function(e){t[e.value]=e.name})),t}(E=e.CronState||(e.CronState={})).Running="running",E.Idle="idle",E.Failed="failed",E.Queued="queued",E.Disabled="disabled",function(e){e.RadioButton="R",e.InputBox="I",e.Textarea="T",e.Select="D",e.SelectMultiple="W",e.Date="A",e.File="F",e.Static="S",e.Password="P",e.Time="M",e.None="N"}(G||(G={})),(B=e.ApiLogState||(e.ApiLogState={})).Success="success",B.Failed="failed",B.Deleted="deleted",(K=e.ProcessState||(e.ProcessState={})).Queued="Q",K.Running="R",K.Completed="C",K.Killed="K",K.Deleted="D",K.Failed="F",function(e){e.Message="message",e.Disabled="disabled",e.Started="started",e.Running="running",e.Completed="completed",e.Failed="failed",e.Killed="killed",e.Queued="queued",e.Reset="reset",e.Stagnant="stagnant",e.LongRunning="long_running"}($||($={}));var U=[{name:"Message",value:$.Message,color:"#29B7FF"},{name:"Disabled",value:$.Disabled,color:"#29B7FF"},{name:"Started",value:$.Started,color:"#34BD43"},{name:"Running",value:$.Running,color:"#34BD43"},{name:"Completed",value:$.Completed,color:"#34BD43"},{name:"Failed",value:$.Failed,color:"#FA7567"},{name:"Killed",value:$.Killed,color:"#29B7FF"},{name:"Queued",value:$.Queued,color:"#29B7FF"},{name:"Reset",value:$.Reset,color:"#29B7FF"},{name:"Stagnant",value:$.Stagnant,color:"#FA7567"},{name:"Long Running",value:$.LongRunning,color:"#FA7567"}],J=[{name:"Running",value:e.CronState.Running},{name:"Idle",value:e.CronState.Idle},{name:"Failed",value:e.CronState.Failed},{name:"Queued",value:e.CronState.Queued},{name:"Disabled",value:e.CronState.Disabled}],H=[{name:"Success",value:e.ApiLogState.Success},{name:"Failed",value:e.ApiLogState.Failed},{name:"Deleted",value:e.ApiLogState.Deleted}],W=[{name:"Queued",value:e.ProcessState.Queued},{name:"Running",value:e.ProcessState.Running},{name:"Completed",value:e.ProcessState.Completed},{name:"Killed",value:e.ProcessState.Killed},{name:"Failed",value:e.ProcessState.Failed},{name:"Deleted",value:e.ProcessState.Deleted}],Y=function(){function e(e){this._data=e,this.CronLogStates=z(U),this.CronLogStateColors={}}return e.prototype.ngOnInit=function(){this.cronLog=this._data.cronLog,this.CronLogStateColors=U.reduce((function(e,t){return e[t.value]=t.color,e}),{})},e.ctorParameters=function(){return[{type:void 0,decorators:[{type:t.Inject,args:[s.MAT_DIALOG_DATA]}]}]},e=P([t.Component({template:'<fs-dialog *fsSkeleton="cronLog">\r\n <div mat-dialog-title>Cron Log</div>\r\n <mat-dialog-content>\r\n <div class="row">\r\n <fs-label-field>\r\n <fs-label>\r\n Status\r\n </fs-label>\r\n <div [ngStyle]="{ color: CronLogStateColors[cronLog.state]}">\r\n {{CronLogStates[cronLog.state] || cronLog.state}}\r\n </div>\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>\r\n Date\r\n </fs-label>\r\n <fs-date-ago [date]="cronLog.createDate"></fs-date-ago>\r\n </fs-label-field>\r\n </div>\r\n \r\n <fs-label-field *ngIf="cronLog.message">\r\n <fs-label>\r\n Message\r\n </fs-label>\r\n <div class="message">\r\n {{cronLog.message}}\r\n </div>\r\n </fs-label-field>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]="true" color="primary">Done</button>\r\n </mat-dialog-actions>\r\n</fs-dialog>\r\n',styles:[".message{white-space:pre-line}.row{display:flex;flex-wrap:wrap}.row fs-label-field:not(:last-child){margin-right:40px}"]}),O(0,t.Inject(s.MAT_DIALOG_DATA)),j("design:paramtypes",[Object])],e)}(),Z=function(){function e(e,t,n){this._data=e,this._dialog=t,this._cdRef=n,this.tabIndex=0,this.CronStates=z(J),this.CronLogStates=z(U),this.CronLogStateColors={}}return e.prototype.ngOnInit=function(){this.load(),this.CronLogStateColors=U.reduce((function(e,t){return e[t.value]=t.color,e}),{})},e.prototype.cronLogOpen=function(e){this._dialog.open(Y,{data:{cronLog:e},width:"85%"})},e.prototype.cronActionClick=function(e){var t=this;e.action(this.cron).subscribe((function(){t.load()}))},e.prototype.selectedIndexChange=function(e){this.tabIndex=e},e.prototype.load=function(){var e=this;this._data.loadCron(this._data.cron).subscribe((function(t){e.cron=R(R({},e._data.cron),t),e._data.loadCronLogs&&(e.config={filters:[{type:_.ItemType.Select,name:"state",label:"Status",values:N([{name:"All",value:null}],U)},{type:_.ItemType.DateRange,name:"date",label:["From Date","To Date"]}],fetch:function(t){return t=R(R({},t),{cronId:e.cron.id}),e._data.loadCronLogs(t)}}),e.cronActions=e._data.cronActions.filter((function(t){return t.show(e.cron)})),e._cdRef.markForCheck()}))},e.ctorParameters=function(){return[{type:void 0,decorators:[{type:t.Inject,args:[s.MAT_DIALOG_DATA]}]},{type:s.MatDialog},{type:t.ChangeDetectorRef}]},e=P([t.Component({template:'<fs-dialog *fsSkeleton="cron">\r\n <h1 mat-dialog-title>\r\n Cron\r\n <div class="small">{{cron.name}}</div>\r\n </h1>\r\n <mat-dialog-content>\r\n <mat-tab-group (selectedIndexChange)="selectedIndexChange($event)">\r\n <mat-tab label="Overview">\r\n <div class="row">\r\n <fs-label-field>\r\n <fs-label>\r\n Status\r\n </fs-label>\r\n {{CronStates[cron.state]}}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="cron.cronSetting">\r\n <fs-label>\r\n Run Frequency\r\n </fs-label>\r\n {{cron.cronSetting.summary}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>\r\n Last Ran\r\n </fs-label>\r\n <ng-container *ngIf="cron.duration===null; else lastRan">\r\n Never\r\n </ng-container>\r\n <ng-template #lastRan>\r\n <fs-date-ago [date]="cron.createDate"></fs-date-ago>\r\n <div><small *ngIf="cron.duration">Duration: {{ cron.duration | fsDateDuration }}</small></div>\r\n </ng-template>\r\n </fs-label-field>\r\n </div>\r\n\r\n <fs-label-field *ngIf="cron.message">\r\n <fs-label>\r\n Last Message\r\n </fs-label>\r\n <div class="message">{{cron.message}}</div>\r\n </fs-label-field>\r\n </mat-tab>\r\n <mat-tab label="Logs" *ngIf="config">\r\n <ng-template matTabContent>\r\n <fs-list [config]="config">\r\n <fs-list-column name="state" title="Status">\r\n <ng-template fs-list-cell let-row="row">\r\n <a \r\n (click)="cronLogOpen(row)"\r\n [ngStyle]="{ color: CronLogStateColors[row.state] }">\r\n {{CronLogStates[row.state] || row.state}}\r\n </a>\r\n </ng-template>\r\n </fs-list-column>\r\n \r\n <fs-list-column title="Message" class="col-message">\r\n <ng-template fs-list-cell let-row="row">\r\n <div class="message">{{row.message}}</div>\r\n </ng-template>\r\n </fs-list-column>\r\n\r\n <fs-list-column name="create_date" title="Date" class="col-date">\r\n <ng-template fs-list-cell let-row="row">\r\n <fs-date-ago [date]="row.createDate"></fs-date-ago>\r\n </ng-template>\r\n </fs-list-column>\r\n </fs-list> \r\n </ng-template>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n </mat-dialog-content>\r\n <mat-dialog-actions> \r\n <button \r\n mat-button \r\n [mat-dialog-close]="true" \r\n color="primary">\r\n Done\r\n </button>\r\n <ng-container *ngIf="tabIndex === 0">\r\n <button \r\n *ngFor="let cronAction of cronActions"\r\n mat-button \r\n (click)="cronActionClick(cronAction)">\r\n {{cronAction.label}}\r\n </button> \r\n </ng-container>\r\n </mat-dialog-actions>\r\n</fs-dialog>\r\n',changeDetection:t.ChangeDetectionStrategy.OnPush,styles:[":host ::ng-deep .col-message .message{white-space:break-spaces;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden}:host ::ng-deep .col-date{white-space:nowrap}h1 .small{line-height:normal}.row{display:flex;flex-wrap:wrap}.row fs-label-field:not(:last-child){margin-right:40px}.message{white-space:pre-line}"]}),O(0,t.Inject(s.MAT_DIALOG_DATA)),j("design:paramtypes",[Object,s.MatDialog,t.ChangeDetectorRef])],e)}(),X=function(){function n(e,t){this._message=e,this._dialog=t,this.config=null,this.cronStates=z(J)}return n.prototype.ngOnInit=function(){this._configList()},n.prototype._configList=function(){var e=this;this.config={paging:!1,filters:[{type:_.ItemType.Keyword,name:"keyword",label:"Search"}],rowActions:this.getCronActions().map((function(e){return R(R({},e),{click:function(t){e.action(t).subscribe()}})})),fetch:function(t){return t.timezone=Intl.DateTimeFormat().resolvedOptions().timeZone,e.loadCrons(t).pipe(C.map((function(e){return{data:e}})))}},this.bulk&&(this.config.selection={selectAll:!1,actions:[{type:x.SelectionActionType.Action,name:"disable",label:"Disable"},{type:x.SelectionActionType.Action,name:"enable",label:"Enable"}],actionSelected:function(t){return e.bulk(t.action.name,t.selected).pipe(C.tap((function(){e.list.reload(),e._message.success("Applied Changes")})))}})},n.prototype.open=function(e){this._dialog.open(Z,{data:{cron:e,loadCronLogs:this.loadCronLogs,loadCron:this.loadCron,cronActions:this.getCronActions()},width:"85%"})},n.prototype.getCronActions=function(){var t=this;return[{action:function(e){return t.queue(e).pipe(C.tap((function(){t._message.success("Queued cron"),t.list.reload()})))},label:"Queue",show:function(t){return t.state===e.CronState.Idle||t.state===e.CronState.Failed}},{action:function(e){return t.run(e).pipe(C.tap((function(){t._message.success("Cron ran"),t.list.reload()})))},label:"Run",show:function(t){return t.state===e.CronState.Idle||t.state===e.CronState.Failed}},{action:function(e){return t.enable(e).pipe(C.tap((function(){t._message.success("Enabled cron"),t.list.reload()})))},label:"Enable",show:function(t){return t.state===e.CronState.Disabled}},{action:function(e){return t.disable(e).pipe(C.tap((function(){t._message.success("Disabled cron"),t.list.reload()})))},label:"Disable",show:function(t){return t.state===e.CronState.Idle||t.state===e.CronState.Failed}},{action:function(e){return t.kill(e).pipe(C.tap((function(){t._message.success("Killed cron"),t.list.reload()})))},label:"Kill",show:function(t){return t.state===e.CronState.Running}}]},n.ctorParameters=function(){return[{type:D.FsMessage},{type:s.MatDialog}]},P([t.ViewChild(b.FsListComponent,{static:!0}),j("design:type",b.FsListComponent)],n.prototype,"list",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"enable",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"disable",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"kill",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"queue",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"run",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"loadCrons",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"loadCron",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"loadCronLogs",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"bulk",void 0),n=P([t.Component({selector:"fs-system-crons",template:'<fs-list [config]="config">\r\n <fs-list-column>\r\n <ng-template fs-list-header>Name</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n <a (click)="open(row)">{{row.name}}</a>\r\n <div *ngIf="row.cronSetting">\r\n <small>{{row.cronSetting.summary}}</small>\r\n </div>\r\n </ng-template>\r\n </fs-list-column>\r\n <fs-list-column>\r\n <ng-template fs-list-header>Status</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n {{cronStates[row.state]}}\r\n </ng-template>\r\n </fs-list-column>\r\n <fs-list-column>\r\n <ng-template fs-list-header>Last Ran</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n <ng-container *ngIf="row.duration===null; else lastRan">\r\n Never\r\n </ng-container>\r\n <ng-template #lastRan>\r\n <fs-date-ago [date]="row.createDate"></fs-date-ago>\r\n <div><small *ngIf="row.duration">Duration: {{ row.duration | fsDateDuration }}</small></div>\r\n </ng-template>\r\n </ng-template>\r\n </fs-list-column>\r\n</fs-list>\r\n',styles:[""]}),j("design:paramtypes",[D.FsMessage,s.MatDialog])],n)}(),ee=function(){function e(e,n,r,a){this._message=e,this._clipboardService=n,this._prompt=r,this._cdRef=a,this.fileRemove=new t.EventEmitter,this.fileSelect=new t.EventEmitter,this.groupedSettings=[],this.groups=[],this.SettingInterfaceType=G}return e.prototype.ngOnInit=function(){var e=this;this.loadSettings().subscribe((function(t){t=t.filter((function(e){return e.interfaceType!==G.None})).map((function(e){switch(e.interfaceType){case G.Date:case G.Time:e.value=u.parse(e.value);case G.SelectMultiple:e.value=Array.isArray(e.value)?e.value:[]}return e})),e.groupedSettings=k.groupBy(t,(function(e){return e.group})),e.groups=Object.keys(e.groupedSettings),e._cdRef.markForCheck()}))},e.prototype.export=function(e,t){e.stopPropagation();var n=t.map((function(e){return{name:e.name,value:e.value,group:e.group}}));this._clipboardService.copy(JSON.stringify(n)),this._message.success("Copied to clipboard")},e.prototype.import=function(e,t){var n=this;e.stopPropagation(),this._prompt.input({label:"JSON Import",title:"Import Settings",commitLabel:"Import",required:!0}).subscribe((function(e){if(e)try{var r=n.groupedSettings[t];JSON.parse(e).forEach((function(e){var t=r.find((function(t){return e.name===t.name}));t&&Object.assign(t,e)})),n._cdRef.markForCheck()}catch(e){n._message.error(e)}}))},e.prototype.saveGroup=function(e){var t=this,n=this.groupedSettings[e],r=k.reduce(n,(function(e,t,n){return e[t.name]=t.value,e}),{});this.save(e,r).subscribe((function(){t._message.success("Changes Saved")}))},e.ctorParameters=function(){return[{type:D.FsMessage},{type:A.ClipboardService},{type:M.FsPrompt},{type:t.ChangeDetectorRef}]},P([t.Input(),j("design:type",Function)],e.prototype,"loadSettings",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"save",void 0),P([t.Output(),j("design:type",Object)],e.prototype,"fileRemove",void 0),P([t.Output(),j("design:type",Object)],e.prototype,"fileSelect",void 0),e=P([t.Component({selector:"fs-system-settings",template:'\r\n<mat-accordion>\r\n <mat-expansion-panel hideToggle *ngFor="let group of groups">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <div class="title-row">\r\n <div class="title">{{group || \'General\'}}</div>\r\n <div class="actions">\r\n <button\r\n type="button"\r\n [matTooltip]="\'Export \' + (group || \'General\') + \' Settings\'"\r\n mat-icon-button\r\n (click)="export($event, groupedSettings[group])">\r\n <mat-icon>cloud_download</mat-icon>\r\n </button>\r\n <button\r\n type="button"\r\n [matTooltip]="\'Import \' + (group || \'General\') + \' Settings\'"\r\n mat-icon-button\r\n (click)="import($event, group)">\r\n <mat-icon>cloud_upload</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <div hideToggle *ngFor="let setting of groupedSettings[group]">\r\n <mat-form-field \r\n class="full-width form-field-multiline-subscript"\r\n *ngIf="setting.interfaceType===SettingInterfaceType.InputBox">\r\n <input\r\n matInput\r\n [placeholder]="setting.label"\r\n [(ngModel)]="setting.value"\r\n [name]="\'setting\' + setting.id">\r\n <mat-hint>{{setting.instruction}}</mat-hint>\r\n </mat-form-field>\r\n\r\n <mat-form-field \r\n class="full-width form-field-multiline-subscript" \r\n *ngIf="setting.interfaceType===SettingInterfaceType.Textarea">\r\n <textarea\r\n matInput\r\n [placeholder]="setting.label"\r\n [(ngModel)]="setting.value"\r\n [name]="\'setting\' + setting.id">\r\n </textarea>\r\n <mat-hint>{{setting.instruction}}</mat-hint>\r\n </mat-form-field>\r\n\r\n <mat-form-field \r\n class="full-width form-field-multiline-subscript" \r\n *ngIf="setting.interfaceType===SettingInterfaceType.Select || setting.interfaceType===SettingInterfaceType.SelectMultiple">\r\n <mat-select\r\n [placeholder]="setting.label"\r\n [(ngModel)]="setting.value"\r\n [multiple]="setting.interfaceType===SettingInterfaceType.SelectMultiple"\r\n [name]="\'setting\' + setting.id">\r\n <mat-option *ngFor="let item of setting.values | keyNameValue" [value]="item.value">\r\n {{item.name}}\r\n </mat-option>\r\n </mat-select>\r\n <mat-hint>{{setting.instruction}}</mat-hint>\r\n </mat-form-field>\r\n\r\n <mat-form-field \r\n class="full-width form-field-multiline-subscript" \r\n *ngIf="setting.interfaceType===SettingInterfaceType.Date">\r\n <input\r\n matInput\r\n fsDatePicker\r\n [placeholder]="setting.label"\r\n [(ngModel)]="setting.value"\r\n [name]="\'setting\' + setting.id">\r\n <mat-hint>{{setting.instruction}}</mat-hint>\r\n </mat-form-field>\r\n\r\n <mat-form-field \r\n class="full-width form-field-multiline-subscript" \r\n *ngIf="setting.interfaceType===SettingInterfaceType.Time">\r\n <input\r\n matInput\r\n fsTimePicker\r\n [placeholder]="setting.label"\r\n [(ngModel)]="setting.value"\r\n [name]="\'setting\' + setting.id">\r\n <mat-hint>{{setting.instruction}}</mat-hint>\r\n </mat-form-field>\r\n\r\n <fs-file-picker\r\n *ngIf="setting.interfaceType===SettingInterfaceType.File"\r\n [allowRemove]="true"\r\n [allowDownload]="true"\r\n (select)="fileSelect.emit({ setting: setting, file: $event.file })"\r\n (remove)="fileRemove.emit(setting)"\r\n [url]="setting.value">\r\n <div fsFileLabel>{{setting.label}}</div>\r\n </fs-file-picker>\r\n </div>\r\n\r\n <button mat-raised-button color="primary" type="button" (click)="saveGroup(group)">Save</button>\r\n\r\n </mat-expansion-panel>\r\n\r\n</mat-accordion>\r\n',changeDetection:t.ChangeDetectionStrategy.OnPush,styles:[".mat-expansion-panel-header{font-size:19px}.full-width{width:100%}.title-row{flex-direction:row;box-sizing:border-box;display:flex;place-content:center flex-start;align-items:center;width:100%}.title-row .title{display:flex;flex:1}:host ::ng-deep .mat-expansion-panel-header-title{margin:0}:host ::ng-deep .mat-expansion-panel .actions{display:none}:host ::ng-deep .mat-expansion-panel.mat-expanded .actions{display:block}"]}),j("design:paramtypes",[D.FsMessage,A.ClipboardService,M.FsPrompt,t.ChangeDetectorRef])],e)}(),te=function(){function e(){}return e.prototype.ngOnInit=function(){this._configFileManager()},e.prototype._configFileManager=function(){var e=this;this.config={fetch:function(t){return e.fetch(t)},deleteFile:function(t){return e.deleteFile(t)},deleteDirectory:function(t){return e.deleteDirectory(t)},createDirectory:function(t){return e.createDirectory(t)},download:function(t){return e.download(t)},upload:function(t,n){return e.upload(t,n)}}},P([t.Input(),j("design:type",Function)],e.prototype,"fetch",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"deleteFile",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"deleteDirectory",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"createDirectory",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"download",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"upload",void 0),e=P([t.Component({selector:"fs-system-file-manager",template:'<fs-file-manager [config]="config"></fs-file-manager>',styles:[""]}),j("design:paramtypes",[])],e)}(),ne=function(){function e(){}return e.prototype.transform=function(e){return Object.keys(e).map((function(t){return{value:t,name:e[t]}}))},e=P([t.Pipe({name:"keyNameValue"}),t.Injectable()],e)}(),re=function(){function n(t,n){this._dialogRef=t,this.data=n,this.ProcessState=e.ProcessState}return n.prototype.ngOnInit=function(){this.ProcessStates=z(W),this.data.loadProcess?this.load():this.process=this.data.process},n.prototype.load=function(){var e=this;this.data.loadProcess(this.data.process).subscribe((function(t){e.process=t}))},n.ctorParameters=function(){return[{type:s.MatDialogRef},{type:void 0,decorators:[{type:t.Inject,args:[s.MAT_DIALOG_DATA]}]}]},n=P([t.Component({template:'<fs-dialog *fsSkeleton="process">\r\n <div mat-dialog-title>Process</div>\r\n <mat-dialog-content>\r\n <div fxLayout="column">\r\n <fs-label-field>\r\n <fs-label>\r\n Name\r\n </fs-label>\r\n {{process.prettyName}}\r\n </fs-label-field>\r\n\r\n <div fxLayout="row" fxLayoutGap="20px">\r\n\r\n <fs-label-field>\r\n <fs-label>\r\n Status\r\n </fs-label>\r\n {{ProcessStates[process.state]}}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="process.notify">\r\n <fs-label>\r\n Notification Email\r\n </fs-label>\r\n {{process.notify}}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="process.pid">\r\n <fs-label>\r\n PID\r\n </fs-label>\r\n {{process.pid}}\r\n </fs-label-field>\r\n </div>\r\n\r\n <div fxLayout="row" fxLayoutGap="20px">\r\n <fs-label-field>\r\n <fs-label>\r\n Create Date\r\n </fs-label>\r\n {{ process.createDate | fsDateFormat: \'date-time\' }}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="process.startDate">\r\n <fs-label>\r\n Start Date\r\n </fs-label>\r\n {{ process.startDate | fsDateFormat: \'date-time\' }}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="process.endDate">\r\n <fs-label>\r\n Complete Date\r\n </fs-label>\r\n {{ process.endDate | fsDateFormat: \'date-time\' }}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="process.duration">\r\n <fs-label>\r\n Duration\r\n </fs-label>\r\n {{ process.duration | fsDateDuration: {hours: true, minutes: true, seconds: true} }}\r\n </fs-label-field>\r\n </div>\r\n\r\n <fs-label-field *ngIf="process.message">\r\n <fs-label>\r\n Message\r\n </fs-label>\r\n {{process.message}}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="process.log" class="log">\r\n <fs-label>\r\n Log\r\n </fs-label>{{process.log}}\r\n </fs-label-field>\r\n\r\n </div>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]="true" color="primary">Done</button>\r\n <button\r\n *ngIf="process.state===ProcessState.Running && data.loadProcess"\r\n mat-button\r\n (click)="load()">\r\n Reload\r\n </button>\r\n </mat-dialog-actions>\r\n</fs-dialog>\r\n',styles:[":host ::ng-deep .log .field-content{white-space:pre-wrap;font-family:monospace;font-size:14px}"]}),O(1,t.Inject(s.MAT_DIALOG_DATA)),j("design:paramtypes",[s.MatDialogRef,Object])],n)}(),ae=function(){function n(t,n){this._dialog=t,this._message=n,this.actions=[],this.config=null,this.ProcessStates=z(W),this.ProcessState=e.ProcessState,this._destroy$=new F.Subject}return n.prototype.ngOnInit=function(){this._configList()},n.prototype._configList=function(){var e=this;this.config={actions:[],rowActions:[],filters:[{type:_.ItemType.Keyword,name:"keyword",label:"Search"},{type:_.ItemType.Select,name:"state",label:"Status",values:W}],fetch:function(t){return e.loadProcesses(t).pipe(C.map((function(e){return{data:e.data,paging:e.paging}})))}},this.run&&this.config.rowActions.push({label:"Run",click:function(t){e._message.info("Running process..."),e.run(t).subscribe((function(){e.list.reload(),e._message.success("Succesfully ran process")})),setTimeout((function(){e.list.reload()}),500)}}),this.kill&&this.config.rowActions.push({label:"Kill",show:function(e){return!!e.pid},click:function(t){e._message.info("Killing process..."),e.kill(t).subscribe((function(){e.list.reload(),e._message.success("Succesfully killed process")})),setTimeout((function(){e.list.reload()}),500)}}),this.delete&&this.config.rowActions.push({label:"Delete",click:function(t){e.delete(t).subscribe((function(){e.list.reload(),e._message.success("Deleted process")}))}}),this.actions.forEach((function(t){e.config.actions.push({primary:!1,label:t.label,menu:t.menu,click:function(){(t.click&&t.click(),t.component)&&e._dialog.open(t.component,{width:"800px"}).afterClosed().pipe(C.takeUntil(e._destroy$)).subscribe((function(t){e.list.reload()}))}})}))},n.prototype.open=function(e){this._dialog.open(re,{data:{process:e,loadProcess:this.loadProcess},width:"85%"})},n.prototype.ngOnDestroy=function(){this._destroy$.next(),this._destroy$.complete()},n.ctorParameters=function(){return[{type:s.MatDialog},{type:D.FsMessage}]},P([t.ViewChild(b.FsListComponent),j("design:type",b.FsListComponent)],n.prototype,"list",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"loadProcesses",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"loadProcess",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"run",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"kill",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"delete",void 0),P([t.Input(),j("design:type",Function)],n.prototype,"download",void 0),P([t.Input(),j("design:type",Array)],n.prototype,"actions",void 0),n=P([t.Component({selector:"fs-system-processes",template:'<fs-list [config]="config">\r\n <fs-list-column>\r\n <ng-template fs-list-header>Name</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n <a (click)="open(row)">{{row.prettyName}}</a>\r\n </ng-template>\r\n </fs-list-column>\r\n\r\n <fs-list-column>\r\n <ng-template fs-list-header>Status</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n {{ProcessStates[row.state]}}\r\n <small>\r\n <div *ngIf="row.state===ProcessState.Running && row.percent">Complete: {{ row.percent }}%</div>\r\n <div *ngIf="row.state===ProcessState.Completed && row.filename">Download: <a href="javascript:;" (click)="download(row)">{{ row.filename }}</a></div>\r\n <div *ngIf="row.pid">PID: {{ row.pid }}</div>\r\n <div *ngIf="row.state===ProcessState.Running && row.notify">Notify: {{ row.notify }}</div>\r\n </small>\r\n </ng-template>\r\n </fs-list-column>\r\n\r\n <fs-list-column>\r\n <ng-template fs-list-header>Duration</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n {{ row.duration | fsDateDuration: {hours: true, minutes: true, seconds: true} }}\r\n </ng-template>\r\n </fs-list-column>\r\n\r\n\r\n <fs-list-column>\r\n <ng-template fs-list-header>Message</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n {{row.message}}\r\n </ng-template>\r\n </fs-list-column>\r\n\r\n <fs-list-column>\r\n <ng-template fs-list-header>Completed</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n <fs-date-ago [date]="row.endDate"></fs-date-ago>\r\n </ng-template>\r\n </fs-list-column>\r\n</fs-list>\r\n',styles:[""]}),j("design:paramtypes",[s.MatDialog,D.FsMessage])],n)}(),oe=function(){function e(e){this.data=e}return e.prototype.ngOnInit=function(){if(this.data.log){this.log=this.data.log;try{this.log.backtrace=JSON.parse(this.log.backtrace)}catch(e){}try{this.log.server=JSON.parse(this.log.server)}catch(e){}}},e.ctorParameters=function(){return[{type:void 0,decorators:[{type:t.Inject,args:[s.MAT_DIALOG_DATA]}]}]},e=P([t.Component({template:'<fs-dialog *fsSkeleton="log">\r\n <div mat-dialog-title>Log</div>\r\n <mat-dialog-content>\r\n <div fxLayout="column">\r\n <fs-label-field>\r\n <fs-label>\r\n Error Type\r\n </fs-label>\r\n {{log.type}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>\r\n Message\r\n </fs-label>\r\n {{log.message}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>\r\n URL\r\n </fs-label>\r\n {{log.url}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>\r\n Date\r\n </fs-label>\r\n {{log.createDate|fsDateFormat: \'full-date-time\'}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>\r\n File\r\n </fs-label>\r\n {{log.file}} @ {{log.line}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>\r\n Backtrace\r\n </fs-label>\r\n <pre>{{log.backtrace|json}}</pre>\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>\r\n $_SERVER\r\n </fs-label>\r\n <pre>{{log.server|json}}</pre>\r\n </fs-label-field>\r\n </div>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]="true" color="primary">Done</button>\r\n </mat-dialog-actions>\r\n</fs-dialog>\r\n',styles:[""]}),O(0,t.Inject(s.MAT_DIALOG_DATA)),j("design:paramtypes",[Object])],e)}(),ie=function(){function e(e){this._dialog=e,this.config=null,this.logTypes=[]}return e.prototype.ngOnInit=function(){this._configList()},e.prototype._configList=function(){var e=this;this.config={filters:[{type:_.ItemType.Keyword,name:"keyword",label:"Search"}],fetch:function(t){return e.loadLogs(t).pipe(C.map((function(e){return{data:e.data,paging:e.paging}})))}}},e.prototype.open=function(e){this._dialog.open(oe,{data:{log:e},width:"85%"})},e.ctorParameters=function(){return[{type:s.MatDialog}]},P([t.ViewChild("list",{static:!0}),j("design:type",b.FsListComponent)],e.prototype,"list",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"loadLogs",void 0),e=P([t.Component({selector:"fs-system-server-logs",template:'<fs-list [config]="config">\r\n <fs-list-column>\r\n <ng-template fs-list-header>Message</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n <a href="javascript:;" (click)="open(row)">{{row.message}}</a>\r\n </ng-template>\r\n </fs-list-column>\r\n <fs-list-column>\r\n <ng-template fs-list-header>Type</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n {{row.type}}\r\n </ng-template>\r\n </fs-list-column>\r\n <fs-list-column>\r\n <ng-template fs-list-header>Date</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n <fs-date-ago [date]="row.createDate"></fs-date-ago>\r\n </ng-template>\r\n </fs-list-column>\r\n </fs-list>\r\n',styles:[""]}),j("design:paramtypes",[s.MatDialog])],e)}(),le=function(){function e(){this.config=null,this.logTypes=[]}return e.prototype.ngOnInit=function(){this._configList()},e.prototype._configList=function(){var e=this;this.config={paging:!1,filters:[{type:_.ItemType.Keyword,name:"keyword",label:"Search"}],fetch:function(t){return e.loadUpgradeLogs(t).pipe(C.map((function(e){return{data:e.data,paging:e.paging}})))}}},P([t.ViewChild(b.FsListComponent,{static:!0}),j("design:type",b.FsListComponent)],e.prototype,"list",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"loadUpgradeLogs",void 0),e=P([t.Component({selector:"fs-system-upgrade-logs",template:'<fs-list [config]="config">\r\n <fs-list-column>\r\n <ng-template fs-list-header>Name</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n {{row.name}}\r\n </ng-template>\r\n </fs-list-column>\r\n\r\n <fs-list-column>\r\n <ng-template fs-list-header>Function</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n {{row.function}}()\r\n </ng-template>\r\n </fs-list-column>\r\n\r\n <fs-list-column>\r\n <ng-template fs-list-header>Date</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n <fs-date-ago [date]="row.createDate"></fs-date-ago>\r\n </ng-template>\r\n </fs-list-column>\r\n</fs-list>\r\n',styles:[""]})],e)}(),se=function(){function e(e,t){this._dialogRef=e,this.data=t}return e.prototype.ngOnInit=function(){this.apiLogStates=z(H),this.data.apiLog&&(this.apiLog=this.data.apiLog)},e.ctorParameters=function(){return[{type:s.MatDialogRef},{type:void 0,decorators:[{type:t.Inject,args:[s.MAT_DIALOG_DATA]}]}]},e=P([t.Component({template:'<fs-dialog *fsSkeleton="apiLog">\r\n <div mat-dialog-title>API Log</div>\r\n <mat-dialog-content>\r\n <div fxLayout="column">\r\n <fs-label-field>\r\n <fs-label>\r\n Type\r\n </fs-label>\r\n {{apiLog.type}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>\r\n Status\r\n </fs-label>\r\n {{apiLogStates[apiLog.state]}}\r\n </fs-label-field>\r\n\r\n <fs-label-field>\r\n <fs-label>\r\n Date\r\n </fs-label>\r\n {{apiLog.createDate|fsDateFormat: \'full-date-time\'}}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="apiLog.length">\r\n <fs-label>\r\n Duration\r\n </fs-label>\r\n {{ apiLog.length | fsDateDuration }}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="apiLog.code">\r\n <fs-label>\r\n Code\r\n </fs-label>\r\n {{apiLog.code}}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="apiLog.message">\r\n <fs-label>\r\n Message\r\n </fs-label>\r\n {{apiLog.message}}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="apiLog.url">\r\n <fs-label>\r\n URL\r\n </fs-label>\r\n {{apiLog.url}}\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="apiLog.request">\r\n <fs-label>\r\n Request\r\n </fs-label>\r\n <pre>{{apiLog.request|json}}</pre>\r\n </fs-label-field>\r\n\r\n <fs-label-field *ngIf="apiLog.response">\r\n <fs-label>\r\n Response\r\n </fs-label>\r\n <pre>{{apiLog.response|json}}</pre>\r\n </fs-label-field>\r\n\r\n </div>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]="true" color="primary">Done</button>\r\n </mat-dialog-actions>\r\n</fs-dialog>\r\n',styles:[""]}),O(1,t.Inject(s.MAT_DIALOG_DATA)),j("design:paramtypes",[s.MatDialogRef,Object])],e)}(),ce=function(){function e(e){this._dialog=e,this.config=null,this.apiLogStates=z(H)}return e.prototype.ngOnInit=function(){this._configList()},e.prototype._configList=function(){var e=this;this.config={filters:[{type:_.ItemType.Keyword,name:"keyword",label:"Search"},{type:_.ItemType.Select,name:"state",label:"Status",values:H},{name:"createDate",type:_.ItemType.DateRange,label:["From Date","To Date"]}],fetch:function(t){return Object.assign(t,{}),e.loadApiLogs(t).pipe(C.map((function(e){return{data:e.data,paging:e.paging}})))}}},e.prototype.open=function(e){this._dialog.open(se,{data:{apiLog:e},width:"85%"})},e.ctorParameters=function(){return[{type:s.MatDialog}]},P([t.ViewChild(b.FsListComponent,{static:!0}),j("design:type",b.FsListComponent)],e.prototype,"list",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"loadApiLogs",void 0),e=P([t.Component({selector:"fs-system-api-logs",template:'<fs-list [config]="config">\r\n <fs-list-column>\r\n <ng-template fs-list-header>Name</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n <a href="javascript:;" (click)="open(row)">{{row.type || \'Unknown\'}}</a>\r\n </ng-template>\r\n </fs-list-column>\r\n <fs-list-column>\r\n <ng-template fs-list-header>Message</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n {{row.message}}\r\n </ng-template>\r\n </fs-list-column>\r\n <fs-list-column>\r\n <ng-template fs-list-header>Status</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n {{apiLogStates[row.state]}}\r\n </ng-template>\r\n </fs-list-column>\r\n <fs-list-column>\r\n <ng-template fs-list-header>Date</ng-template>\r\n <ng-template fs-list-cell let-row="row">\r\n <fs-date-ago [date]="row.createDate"></fs-date-ago>\r\n <div><small *ngIf="row.length">Duration: {{ row.length | fsDateDuration }}</small></div>\r\n </ng-template>\r\n </fs-list-column>\r\n </fs-list>\r\n',styles:[""]}),j("design:paramtypes",[s.MatDialog])],e)}(),fe=function(){function e(){}return e.prototype.ngAfterViewInit=function(){this._load()},e.prototype._load=function(){var e=this;this.load().subscribe((function(t){t+="<style>body { background: transparent; }</style>";var n=e.iframe.nativeElement.contentDocument||e.iframe.nativeElement.contentWindow;n.open(),n.write(t),n.close();var r=e.iframe.nativeElement.contentWindow.document.documentElement.scrollHeight+100;e.iframe.nativeElement.style.height=r+"px"}))},P([t.ViewChild("iframe"),j("design:type",t.ElementRef)],e.prototype,"iframe",void 0),P([t.Input(),j("design:type",Function)],e.prototype,"load",void 0),e=P([t.Component({selector:"fs-system-info",template:"<iframe #iframe></iframe>\r\n",changeDetection:t.ChangeDetectionStrategy.OnPush,styles:["iframe{width:100%;border:0}"]})],e)}(),de=function(){function e(){}var D;return D=e,e.forRoot=function(e){return{ngModule:D,providers:[{provide:Q,useValue:e||{}}]}},e=D=P([t.NgModule({imports:[n.CommonModule,d.FlexLayoutModule,r.FormsModule,p.MatButtonModule,o.MatExpansionModule,c.MatTooltipModule,f.MatIconModule,a.MatFormFieldModule,i.MatInputModule,l.MatSelectModule,s.MatDialogModule,T.MatTabsModule,u.FsDateModule,m.FsSkeletonModule,b.FsListModule,w.FsFileModule,h.FsFileManagerModule,v.FsLabelModule,y.FsDialogModule,g.FsDatePickerModule,S.FsMenuModule,A.ClipboardModule],exports:[V,X,ee,te,ae,ie,le,ce,fe],declarations:[V,X,ee,ne,te,ae,oe,ie,le,ce,se,fe,re,Z,Y]})],e)}();e.ApiLogStates=H,e.CronStates=J,e.FS_SYSTEM_CONFIG=Q,e.FsSystemModule=de,e.ProcessStates=W,e.ɵa=V,e.ɵb=X,e.ɵc=ee,e.ɵd=te,e.ɵe=ae,e.ɵf=ie,e.ɵg=le,e.ɵh=ce,e.ɵi=fe,e.ɵj=ne,e.ɵk=oe,e.ɵl=se,e.ɵm=re,e.ɵn=Z,e.ɵo=Y,Object.defineProperty(e,"__esModule",{value:!0})}));
16
16
  //# sourceMappingURL=firestitch-system.umd.min.js.map