File: //usr/syno/synoman/webman/modules/BackgroundTaskMonitor/BackgroundTaskGrid.js
/* Copyright (c) 2025 Synology Inc. All rights reserved. */
Ext.ns("SYNO.SDS.FileTaskMonitor"),SYNO.SDS.FileTaskMonitor.BKMonitorGrid=Ext.extend(SYNO.ux.GridPanel,{constructor:function(t){_S("standalone")||(this.BKToolbar=this.initToolbar()),this.gridCtxMenu=this.initCtxMenu(t.baseURL),this.fileds=["cancelable","id","title","progress","processed_num","processed_size","total","processing_path","status"],SYNO.SDS.FileTaskMonitor.BKMonitorGrid.superclass.constructor.call(this,Ext.apply({enableHdMenu:!1,autoExpandColumn:"status",store:new Ext.data.JsonStore({autoDestroy:!0,idProperty:"id",fields:this.fileds}),colModel:this.initColumnModel(t.baseURL),sm:new Ext.grid.RowSelectionModel({listeners:{selectionchange:{fn:this.onUpdateBtnStatus,scope:this}}}),listeners:{rowcontextmenu:{scope:this,fn:this.rowContextMenuHandle},rowclick:{fn:function(t,e,o){o&&e&&!o.hasModifier()&&t.getSelectionModel().selectRow(e)}}},tbar:this.BKToolbar},t)),this.addClass("filemonitor-bkmonitor-grid")},initToolbar:function(){return new Ext.Toolbar({items:[{xtype:"syno_button",itemId:"gc_remove",text:_T("common","remove"),handler:this.onClickCancels,scope:this,disabled:!0}]})},onUpdateBtnStatus:function(){if(!_S("standalone")){var t=this.BKToolbar.get("gc_remove"),e=this.getSelectionModel().getSelections(),o=!0;Ext.each(e,(function(t){o=o&&"sds-progress-no-cancel"!==t.data.cancelable}),this),e.length>0&&o?t.enable():t.disable()}},initColumnModel:function(t){return new Ext.grid.ColumnModel({columns:[{id:"status",header:_T("filetable","filetable_file"),renderer:function(t,e,o,n,s,i){var r=Ext.util.Format.htmlEncode(o.data.title);return e.attr='ext:qtip="'+Ext.util.Format.htmlEncode(r)+'"',r}},{header:_T("common","progress"),width:360,renderer:function(t,e,o,n,s,i){var r=o.data;if("NOT_STARTED"===r.status)return _T("background_task","task_waiting");if(r.progress>0){var a="";r.total&&0<r.total&&(r.processed_num||r.processed_size)&&(a=Ext.isNumber(r.processed_size)?" ("+Ext.util.Format.fileSize(r.processed_size||0)+"/"+Ext.util.Format.fileSize(r.total)+")":" ("+(r.processed_num||0)+"/"+r.total+")");var l=100*o.data.progress;return new SYNO.SDS.Utils.ProgressBar({barHeight:6,lineHeight:16,marginTop:5,fixed:!1,showExtraText:!0,showValueText:!0}).fill(l.toFixed(1),a)}return _T("background_task","task_processing")}}]})},initCtxMenu:function(){var t=new SYNO.ux.Menu({cls:"syno-sds-ctx-menu",items:[{itemId:"gc_remove",iconCls:"syno-sds-delete-icon",text:_T("common","remove"),handler:this.onClickCancels,scope:this}]});return this.addManagedComponent(t),t},rowContextMenuHandle:function(t,e,o){o.preventDefault();var n,s=t.getSelectionModel(),i=!0;s.isSelected(e)||s.selectRow(e),n=s.getSelections(),Ext.each(n,(function(t){i=i&&"sds-progress-no-cancel"!==t.data.cancelable}),this),!1!==i&&this.gridCtxMenu.showAt(o.getXY())},onClickCancel:function(t,e,o,n){var s=SYNO.SDS.BackgroundTaskMgr.getTask(e.data.id);s&&s.cancel(),this.onRemove(e)},onClickCancels:function(){var t=this.getSelectionModel().getSelections();if(!(t.length<1))for(var e=0;e<t.length;e++)this.onClickCancel(this,t[e])},localizeTpl:function(t){for(var e=0;e<t.length;e++)t[e]=SYNO.SDS.UIString.GetLocalizedString(t[e]);return t},onAdd:function(t){var e=this.getStore(),o={};Ext.copyTo(o,t,this.fileds),o.title=t.title||t.id,Ext.isArray(o.title)||(o.title=[o.title]),!1===t.ajaxTaskConfig.cancelable?o.cancelable="sds-progress-no-cancel":o.cancelable="sds-progress-cancel",o.progress=0,o.title=String.format.apply(String,this.localizeTpl(o.title)),e.add(new e.recordType(o,o.id))},onRemove:function(t){this.getStore().remove(t)},onProgress:function(t,e,o,n,s){var i=this.getStore().getById(t.id),r=this.fileds.slice();i&&(r.shift(),"fail"===e||"cancel"===e||o?this.onRemove(i):Ext.isNumber(n)&&(Ext.copyTo(i.data,s,r),i.data.progress=n,i.commit()))},initEvents:function(){var t,e;for(t in SYNO.SDS.BackgroundTaskMgr.tasks)SYNO.SDS.BackgroundTaskMgr.tasks.hasOwnProperty(t)&&(e=SYNO.SDS.BackgroundTaskMgr.getTask(t))&&this.onAdd(e);this.mon(SYNO.SDS.BackgroundTaskMgr,"add",this.onAdd,this),this.mon(SYNO.SDS.BackgroundTaskMgr,"progress",this.onProgress,this),SYNO.SDS.FileTaskMonitor.BKMonitorGrid.superclass.initEvents.apply(this,arguments)}});