function showSchedulerData(data) { if (data) { assetsObj = data; var col = grid_dt.columns.find(c => c.name === 'Schedules'); if (assetsObj.HasSchedule) col.width = assetsObj.TotalDays * 5; else col.width = 320; grid_dt.init(); showSchedulerList(data.DispatchAssets); } else { assetsObj = null; grid_dt.columns[grid_dt.columns.length - 1].width = 320; grid_dt.init(); showSchedulerList([]); } } function showSchedulerList(data) { var rows = []; for (var i = 0; i < data.length; i++) { var r = data[i]; for (var j in r) { if (j === "StartDate") { r[j] = { DisplayValue: r["StartDateStr"], Value: r[j] }; } else if (j === "FinishDate") { r[j] = { DisplayValue: r["FinishDateStr"], Value: r[j] }; } else if (j === "EngineHours") { r[j] = { DisplayValue: r[j] === null ? "" : r[j], Value: r[j] }; } if (r.AttachedToAsset) r.AttachedToAssetName = r.AttachedToAsset.AssetName; else r.AttachedToAssetName = r.AssetName; } rows.push(r); } grid_dt.setData(rows); grid_dt.refresh(); } var grid_dt; function InitGridData() { grid_dt = createGridView('#schedulerlist', true); var list_columns = [ { name: 'TypeName', caption: GetTextByKey("P_JS_ASSETTYPE", "Asset Type"), valueIndex: 'TypeName', allowFilter: true, css: { 'width': 150, 'text-align': 'left' } }, { name: 'MakeName', caption: GetTextByKey("P_JS_MAKE", "Make"), valueIndex: 'MakeName', allowFilter: true, css: { 'width': 100, 'text-align': 'left' } }, { name: 'ModelName', caption: GetTextByKey("P_JS_MODEL", "Model"), valueIndex: 'ModelName', allowFilter: true, css: { 'width': 100, 'text-align': 'left' } }, { name: 'AssetName', caption: GetTextByKey("P_JS_ASSETNAME", "Asset Name"), valueIndex: 'AssetName', allowFilter: true, css: { 'width': 150, 'text-align': 'left' } }, { name: 'AttachedToAsset', caption: GetTextByKey("P_JS_ATTACHEDTO", "Attached To"), valueIndex: 'AttachedToAssetName', allowFilter: true, css: { 'width': 150, 'text-align': 'left' } }, { name: 'CurrentJobSite', caption: GetTextByKey("P_JS_CURRJOBSITE", "Current Jobsite"), allowFilter: true, valueIndex: 'CurrentJobSite', allowFilter: true, css: { 'width': 150, 'text-align': 'left' } }, { name: 'NextJobSite', caption: GetTextByKey("P_JS_SCHEDULEDFOR", "Scheduled For"), allowFilter: true, valueIndex: 'NextJobSite', allowFilter: true, css: { 'width': 150, 'text-align': 'left' } }, { name: 'AssetGroups', caption: GetTextByKey("P_JS_ASSETGROUP", "Asset Group"), valueIndex: 'AssetGroups', allowFilter: true, css: { 'width': 150, 'text-align': 'left' } }, { name: 'EngineHours', caption: GetTextByKey("P_JS_ENGINEHOURS", "Engine Hours"), valueIndex: 'EngineHours', allowFilter: true, css: { 'width': 100, 'text-align': 'right' } }, { name: 'AquisitionType', caption: GetTextByKey("P_JS_ACQUISITIONTYPE", "Acquisition Type"), valueIndex: 'AquisitionType', allowFilter: true, css: { 'width': 150, 'text-align': 'left' } }, { name: 'StartDate', caption: GetTextByKey("P_JS_START", "Start"), valueIndex: 'StartDate', allowFilter: true, css: { 'width': 100, 'text-align': 'left' } }, { name: 'FinishDate', caption: GetTextByKey("P_JS_FINISH", "Finish"), valueIndex: 'FinishDate', allowFilter: true, css: { 'width': 100, 'text-align': 'left' } }, { name: 'DurationDays', caption: GetTextByKey("P_JS_DURATIONDAYS", "Duration (days)"), valueIndex: 'DurationDays', allowFilter: true, css: { 'width': 120, 'text-align': 'right' } }, { name: 'Schedules', caption: "gantt", valueIndex: 'ScheduleParts', css: { 'width': 320, 'text-align': 'left' } } ]; var columns = []; // head for (var hd in list_columns) { var col = {}; col.name = list_columns[hd].name; col.caption = list_columns[hd].caption; col.visible = list_columns[hd].visible === false ? false : true; col.sortable = true; col.width = list_columns[hd].css.width; col.align = list_columns[hd].css["text-align"] col.key = list_columns[hd].valueIndex; col.allowFilter = list_columns[hd].allowFilter; col.type = list_columns[hd].type; col.alwaysshow = list_columns[hd].alwaysshow; if (col.name === "AttachedToAsset") { col.sortFilter = function (a, b) { a = a.AttachedToAssetName + (a.AttachedToAsset ? "1" : ""); b = b.AttachedToAssetName + (b.AttachedToAsset ? "1" : ""); return a > b ? 1 : -1; } } else if (col.name === "Schedules") { col.sortable = false; col.orderable = false; col.type = SchedulesColumn; col.onScheduleClicked = function (item, sp) { onEditScheduler(item, sp.Schedules); }; col.styleFilter = function () { return { 'position': 'relative', 'height': '36px', }; } } columns.push(col); } grid_dt.canMultiSelect = false; grid_dt.onCellDblClicked = function (rowindex, columnIndex) { if (!IsReadOnly) { if (columnIndex != grid_dt.columns.length - 1) { var rowdata = grid_dt.source[rowindex]; if (rowdata) { onEditScheduler(rowdata); } } } } grid_dt.allcolumns = columns; // multiple sort grid_dt.columnchanged = function (ev) { if (ev === 'sort') { try { var sorts = JSON.parse(window.localStorage.getItem('jobsite_schedulers_sorts')); delete sorts[`${companyid}_${userid}`]; window.localStorage.setItem('jobsite_schedulers_sorts', JSON.stringify(sorts)); } catch { } } }; grid_dt.onsorts = function (arr) { var sorts; try { sorts = JSON.parse(window.localStorage.getItem('jobsite_schedulers_sorts')); if (sorts == null) { sorts = {}; } } catch { sorts = {}; } sorts[`${companyid}_${userid}`] = arr; window.localStorage.setItem('jobsite_schedulers_sorts', JSON.stringify(sorts)); }; try { var sorts = JSON.parse(window.localStorage.getItem('jobsite_schedulers_sorts')); grid_dt.sortArray = sorts[`${companyid}_${userid}`]; } catch { } getGridLayout(gridLayoutID, grid_dt); } function showJobsiteSchedulerList(data) { var rows = []; for (var i = 0; i < data.length; i++) { var r = data[i]; r.Selected = false; r.Changed = false; for (var j in r) { if (j === "BeginDate") { r[j] = { DisplayValue: r["BeginDateStr"], Value: r[j] }; } if (j === "EndDate") { r[j] = { DisplayValue: r["EndDateStr"], Value: r[j] }; } } rows.push(r); } grid_jsschedulerdt.setData(rows); grid_jsschedulerdt.refresh(); } var grid_jsschedulerdt; function InitJobsiteschedulerGridData() { grid_jsschedulerdt = createGridView('#schedulerlist1'); grid_jsschedulerdt.isEditable = true; var list_columns = [ { name: 'Selected', caption: "", valueIndex: 'Selected', type: 3, css: { 'width': 45, 'text-align': 'center' } }, { name: 'JobSiteName', caption: GetTextByKey("P_JOBSITES", "Jobsite"), valueIndex: 'JobSiteName', allowFilter: true, css: { 'width': 130, 'text-align': 'left' } }, { name: 'BeginDate', caption: GetTextByKey("P_JS_BEGINDATE", 'Begin Date'), valueIndex: 'BeginDate', allowFilter: true, css: { 'width': 120, 'text-align': 'left' } }, { name: 'EndDate', caption: GetTextByKey("P_JS_ENDDATE", 'End Date'), valueIndex: 'EndDate', allowFilter: true, css: { 'width': 120, 'text-align': 'left' } }, { name: 'Delete', caption: "", alwaysshow: true, css: { 'width': 30, 'text-align': 'center' } } ]; var columns = []; // head for (var hd in list_columns) { var col = {}; col.name = list_columns[hd].name; col.caption = list_columns[hd].caption; col.visible = true; col.sortable = true; col.width = list_columns[hd].css.width; col.align = list_columns[hd].css["text-align"] col.key = list_columns[hd].valueIndex; col.allowFilter = list_columns[hd].allowFilter; col.oldFilterValues = col.filterValues; if (list_columns[hd].type) { col.type = list_columns[hd].type; } col.alwaysshow = list_columns[hd].alwaysshow; var DateColumn = window['lib-ui'].GridDateColumn; if (col.name === "BeginDate") { col.type = DateColumn; col.filter = function (item, editing) { return item.BeginDateStr; }; col.sortFilter = function (a, b) { a = a.BeginDate.Value; b = b.BeginDate.Value; return a > b ? 1 : (a < b ? -1 : 0); }; col.onChanged = function (item, value) { item.BeginDateStr = item.BeginDate.DisplayValue = DateColumn.formatDate(value); item.BeginDate = item.BeginDate.Value; item.Changed = true; }; } else if (col.name === "EndDate") { col.type = DateColumn; col.filter = function (item, editing) { return item.EndDateStr; }; col.sortFilter = function (a, b) { a = a.EndDate.Value; b = b.EndDate.Value; return a > b ? 1 : (a < b ? -1 : 0); }; col.onChanged = function (item, value) { item.EndDateStr = item.EndDate.DisplayValue = DateColumn.formatDate(value); item.EndDate = item.EndDate.Value; item.Changed = true; }; } else if (col.name === "Delete") { col.sortable = false; col.resizable = false; col.type = GridView.ColumnTypes.Icon; col.text = 'times'; col.events = { onclick: function () { onDeleteScheduler(this); } }; col.attrs = { 'title': GetTextByKey("P_WO_DELETE", 'Delete') }; } columns.push(col); } grid_jsschedulerdt.multiSelect = true; grid_jsschedulerdt.columns = columns; grid_jsschedulerdt.init(); } var currentscheduler; var allSchedulers; function onEditScheduler(item, schedules) { allSchedulers = []; currentscheduler = item; if (!schedules || schedules.length == 0) { schedules = item.Schedules; } if (schedules && schedules.length > 0) allSchedulers = schedules; $('#dialog_assetname').text(item.AssetName); $('#dialog_assettype').text(item.TypeName); $('#dialog_make').text(item.MakeName); $('#dialog_model').text(item.ModelName); showmaskbg(true); var title = GetTextByKey("P_JS_MANAGESCHEDULER", "Manage Scheduler"); $('#dialog_managescheduler .dialog-title span.title').html(title); $('#dialog_managescheduler') .attr('init', 1) .css({ 'top': (document.documentElement.clientHeight - $('#dialog_managescheduler').height()) / 3, 'left': (document.documentElement.clientWidth - $('#dialog_managescheduler').width()) / 2 }).showDialogfixed(); showJobsiteSchedulerList(allSchedulers); } function onDeleteScheduler(item) { var schduler = item; var ids = []; if (schduler) { ids.push(schduler.DispatchId); } else { var tempsource = grid_jsschedulerdt.source; for (var i = 0; i < tempsource.length; i++) { var sch = tempsource[i]; if (sch.Selected && !sch.Completed) { ids.push(sch.DispatchId); } } } if (ids.length == 0) return; var text = GetTextByKey("P_JS_WOULDYOULIKETODELETETHESCHEDULERS", "Would you like to delete the scheduler(s)?"); var alerttitle = GetTextByKey("P_JS_DELETESCHEDULER", "Delete Scheduler"); showConfirmIndialog(text, alerttitle, function () { var dispatchids = []; if (schduler) { dispatchids.push(schduler.DispatchId); var index = grid_jsschedulerdt.selectedIndex; grid_jsschedulerdt.removeItem(index); } else { var tempsource = grid_jsschedulerdt.source; for (var i = tempsource.length - 1; i >= 0; i--) { var sch = tempsource[i]; if (sch.Selected && !sch.Completed) { dispatchids.push(sch.DispatchId); grid_jsschedulerdt.removeItem(i); } } } if (dispatchids.length == 0) return; var item = { 'DispatchId': dispatchids, 'DeleteNotes': '' }; var p = htmlencode(JSON.stringify(item)); jobsitequery("DeleteDispatch", p, function (data) { }, function (err) { }); }); } function checkSchedulerItems(alerttitle) { var items = []; var tempsource = grid_jsschedulerdt.source; for (var i = 0; i < tempsource.length; i++) { var sch = tempsource[i]; if (sch.Changed) { var item = { 'DispatchId': sch.DispatchId, 'MoveDate': sch.MoveDate, 'BeginDate': sch.BeginDateStr, 'EndDate': sch.EndDateStr, 'Notes': sch.Notes }; if (!item.BeginDate) { showAlert(GetTextByKey("P_JS_PLEASEENTERTHEBEGINDATE", "Please enter the Begin Date."), alerttitle); return false; } if (!checkDate(item.BeginDate)) { showAlert(GetTextByKey("P_JS_BEGINDATEFORMATERROR", "Begin Date format error."), alerttitle); return false; } if (!item.EndDate) { showAlert(GetTextByKey("P_JS_PLEASEENTERTHEENDDATE", "Please enter the End Date."), alerttitle); return false; } if (!checkDate(item.EndDate)) { showAlert(GetTextByKey("P_JS_ENDDATEFORMATERROR", "End Date format error."), alerttitle); return false; } var nowdt = new Date(currentdate.replace("-", "/")); var sdate = item.BeginDate; var stdt = new Date(sdate.replace("-", "/")); var edate = item.EndDate; var etdt = new Date(edate.replace("-", "/")); //if (stdt < nowdt) { // showAlert(GetTextByKey("P_JS_BEGINDATESHOULDBENOEARLIERTHANTODAYSDATE", "Begin Date should be no earlier than today’s date. Please select another date."), alerttitle); // return false; //} //if (etdt < nowdt) { // showAlert(GetTextByKey("P_JS_ENDDATEMUSTBELATERTHANBEGINDATE1", "End Date must be later than Begin Date. Please select another date range."), alerttitle); // return false; //} if (stdt > etdt) { showAlert(GetTextByKey("P_JS_ENDDATEMUSTBELATERTHANBEGINDATE", "End Date must be later than Begin Date."), alerttitle); return false; } items.push(item); } } return items; } function onUpdateScheduler() { if (grid_jsschedulerdt.source.length == 0) { $('#dialog_managescheduler').hide(); showmaskbg(false); OnRefresh(); return; } var alerttitle = GetTextByKey("P_JS_MANAGESCHEDULER", "Manage Scheduler"); var items = checkSchedulerItems(alerttitle); if (!items) return; if (items.length == 0) { $('#dialog_managescheduler').hide(); $('#dialogmask').hide(); OnRefresh(); return; } showloading(true); var param = JSON.stringify(items); param = htmlencode(param); jobsitequery("UpdateDispatch", param, function (data) { showloading(false); if (data !== "OK") { showAlert(data, GetTextByKey("P_AM_ERROR", 'Error')); } $('#dialog_managescheduler').hide(); $('#dialogmask').hide(); OnRefresh(); }, function (err) { console.log(err); showloading(false); showAlert(GetTextByKey("P_JS_FAILEDTOSAVE", "Failed to save jobsite."), alerttitle); }); } function openAddScheduler() { showmaskbg(true); $('#dialogmask').show(); //$('#dialog_addjobsite').val(''); $('#dialog_addbegindate').val(''); $('#dialog_addenddate').val(''); $('#dialog_addnotes').val(''); $('#dialog_pointofcontact').val(''); var title = GetTextByKey("P_JS_ADDSCHEDULER", "Add Scheduler"); $('#dialog_addscheduler .dialog-title span.title').html(title); $('#dialog_addscheduler') .attr('init', 1) .css({ 'top': (document.documentElement.clientHeight - $('#dialog_addscheduler').height()) / 3, 'left': (document.documentElement.clientWidth - $('#dialog_addscheduler').width()) / 2 }).showDialogfixed(); } function onAddScheduler(ignorebeginpast) { var alerttitle = GetTextByKey("P_JS_ADDSCHEDULER", "Add Scheduler"); var item = { 'JobSiteId': $('#dialog_addjobsite').find("option:selected").val(), 'JobSiteName': $("#dialog_addjobsite").find("option:selected").text(), 'BeginDate': $.trim($('#dialog_addbegindate').val()), 'EndDate': $.trim($('#dialog_addenddate').val()), 'Quantity': 1, 'Notes': $('#dialog_addnotes').val(), 'PointOfContact': $('#dialog_pointofcontact').val() }; item.AssetType = currentscheduler.TypeId; var assets = []; var asset = { 'AssetId': currentscheduler.AssetId, 'BeginDate': item.BeginDate, 'EndDate': item.EndDate }; assets.push(asset); item.Assets = assets; if (item.BeginDate.length === 0) { showAlert(GetTextByKey("P_JS_PLEASEENTERTHEBEGINDATE", "Please enter the Begin Date."), alerttitle); return; } if (!checkDate(item.BeginDate)) { showAlert(GetTextByKey("P_JS_BEGINDATEFORMATERROR", "Begin Date format error."), alerttitle); return; } if (item.EndDate.length === 0) { showAlert(GetTextByKey("P_JS_PLEASEENTERTHEENDDATE", "Please enter the End Date."), alerttitle); return; } if (!checkDate(item.EndDate)) { showAlert(GetTextByKey("P_JS_ENDDATEFORMATERROR", "End Date format error."), alerttitle); return; } var nowdt = new Date(currentdate.replace("-", "/")); var sdate = item.BeginDate; var stdt = new Date(sdate.replace("-", "/")); var edate = item.EndDate; var etdt = new Date(edate.replace("-", "/")); if (!ignorebeginpast && stdt < nowdt) { var msg = GetTextByKey("P_JS_BEGINDATEPAST", "The begin date for this requirement is in the past, do you want to continue?") showConfirm(msg, alerttitle, function () { onAddScheduler(true); }); return; } //if (etdt < nowdt) { // showAlert(GetTextByKey("P_JS_ENDDATEMUSTBELATERTHANBEGINDATE1", "End Date must be later than Begin Date. Please select another date range."), alerttitle); // return; //} if (stdt > etdt) { showAlert(GetTextByKey("P_JS_ENDDATEMUSTBELATERTHANBEGINDATE", "End Date must be later than Begin Date."), alerttitle); return; } $('#dialogmask1').show(); var param = JSON.stringify(item); param = htmlencode(param); jobsitequery("CreateNewRequirment", param, function (data) { if (typeof (data) === "string") { showAlert(data, alerttitle); $('#dialogmask1').hide(); } else { $('#dialog_addscheduler').hide(); $('#dialogmask').hide(); $('#dialogmask1').hide(); var scheduleritem = item; scheduleritem.DispatchId = data[0]; scheduleritem.BeginDateStr = item.BeginDate; scheduleritem.EndDateStr = item.EndDate; allSchedulers.push(scheduleritem); showJobsiteSchedulerList(allSchedulers); } }, function (err) { console.log(err); showAlert(GetTextByKey("P_JS_FAILEDTOSAVESCHEDULER", "Failed to save scheduler."), alerttitle); $('#dialogmask1').hide(); }); }