449 lines
22 KiB
Plaintext
449 lines
22 KiB
Plaintext
<%@ Page Title="" Language="C#" MasterPageFile="~/JobSite/JobSiteMasterPage.master" AutoEventWireup="true" CodeFile="DispatchRequests.aspx.cs" Inherits="DispatchRequests" %>
|
|
|
|
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
|
|
<style type="text/css">
|
|
#dialog_machines .dialog-content table td input,
|
|
#dialog_layouts .dialog-content table td input {
|
|
width: auto;
|
|
}
|
|
|
|
.dialog-content table td input[type="checkbox"] {
|
|
border: none;
|
|
}
|
|
</style>
|
|
<link href="<%=GetFileUrlWithVersion("../css/spectrum.css")%>" rel="stylesheet" type="text/css" />
|
|
<script src="../js/spectrum.js?v=1" type="text/javascript"></script>
|
|
<script src="<%=GetFileUrlWithVersion("js/email.js")%>" type="text/javascript"></script>
|
|
<script src="<%=GetFileUrlWithVersion("js/dispatchassign.js")%>" type="text/javascript"></script>
|
|
<script>
|
|
jobsitequery = function (method, param, callback, error, nolog) {
|
|
_network.request("JobSite/DispatchRequests.aspx?tp=ashx", -1, method, param, callback, error, nolog);
|
|
}
|
|
var IsReadOnly = <%=IsReadOnly ?"true":"false"%>;
|
|
var allroadassets;
|
|
var _sendType = 1;
|
|
var _seltype;//0.print;1.email
|
|
var _selectdispatchids;
|
|
|
|
/***************************Jobsites***************************/
|
|
|
|
function OnDelete(dis) {
|
|
if (!dis) {
|
|
return;
|
|
}
|
|
|
|
var text = $('<div style="padding-right:20px;line-height:20px;">' + GetTextByKey("P_JS_DELETETHEDISPATCH", "Would you like to delete the dispatch?") + '<br/></div');
|
|
text.append($('<span></span>').text(GetTextByKey("P_JS_MOVEDATE_COLON", "Move Date:") + " " + dis.BeginDateStr));
|
|
text.append($('<span style="margin-left:10px;"></span>').text(GetTextByKey("P_MA_ASSETNAME_COLON", "Asset Name:") + " " + dis.AssetName));
|
|
text.append($('<span style="margin-left:10px;"></span>').text(GetTextByKey("P_JS_ASSETTYPE_COLON", "Asset Type:") + " " + dis.AssetTypeName));
|
|
text.append("<br/>")
|
|
text.append($('<span></span>').text(GetTextByKey("P_JS_FROMJOBSITE_COLON", "From Jobsite:") + " " + dis.CurrentJobSiteName));
|
|
text.append($('<span style="margin-left:10px;"></span>').text(GetTextByKey("P_JS_TOJOBSITE_COLON", "To Jobsite:") + " " + dis.RequiredJobSiteName));
|
|
var alerttile = GetTextByKey("P_JS_DELETEDISPATCH", "Delete Dispatch");
|
|
showConfirm(text, alerttile, function (e, notes) {
|
|
var item = {
|
|
'DispatchId': [dis.DispatchId],
|
|
'DeleteNotes': notes
|
|
};
|
|
var p = htmlencode(JSON.stringify(item));
|
|
jobsitequery("DeleteDispatch", p, function (data) {
|
|
OnRefresh();
|
|
}, function (err) {
|
|
showAlert(GetTextByKey("P_JS_FAILEDTODELETETHISDISPATCH", "Failed to delete this dispatch."), alerttile);
|
|
});
|
|
}, null, true);
|
|
}
|
|
|
|
function OnRefresh() {
|
|
var lateststartdate = $.trim($('#latesdatetxt').val());
|
|
if (lateststartdate && !$('#latesdatetxt').is(':valid')) {
|
|
showAlert(GetTextByKey('P_COMMON_THELATESTSTARTDATEISINVALID', "The latest start date is invalid."), GetTextByKey("P_FR_ERROR", 'Error'));
|
|
showloading(false);
|
|
return;
|
|
}
|
|
var jobsites = $('#div_jobsites').dropdownVals();
|
|
var regions = $('#div_region').dropdownVals();
|
|
|
|
showloading(true);
|
|
var p = {
|
|
"LatestStartDate": lateststartdate,
|
|
"JobSites": jobsites,
|
|
"Regions": regions,
|
|
"SearchText": $.trim($('#searchinputtxt').val()),
|
|
"UnScheduledOnly": $('#chk_unscheduled').prop('checked')
|
|
};
|
|
jobsitequery("GetAssetDispatchItems", htmlencode(JSON.stringify(p)), function (data) {
|
|
showloading(false);
|
|
if (typeof (data) === "string") {
|
|
showAlert(data, GetTextByKey("P_AM_ERROR", 'Error'));
|
|
return;
|
|
}
|
|
|
|
showDispatchList(data);
|
|
}, function (err) {
|
|
showloading(false);
|
|
});
|
|
}
|
|
|
|
function showDispatchList(data) {
|
|
var rows = [];
|
|
for (var i = 0; i < data.length; i++) {
|
|
var r = data[i];
|
|
for (var j in r) {
|
|
if (j === "MoveDate")
|
|
r[j] = { DisplayValue: r["BeginDateStr"], Value: r[j] };
|
|
else if (j === "BeginDate")
|
|
r[j] = { DisplayValue: r["BeginDateStr"], Value: r[j] };
|
|
else if (j === "EndDate")
|
|
r[j] = { DisplayValue: r["EndDateStr"], Value: r[j] };
|
|
else if (j === "CompletedTime")
|
|
r[j] = { DisplayValue: r["CompletedTimeStr"], Value: r[j] };
|
|
}
|
|
rows.push(r);
|
|
}
|
|
|
|
grid_dt.setData(rows);
|
|
grid_dt.refresh();
|
|
}
|
|
|
|
var grid_dt;
|
|
function InitGridData() {
|
|
grid_dt = createGridView('#dispatchlist');
|
|
var list_columns = [
|
|
//{ name: 'Selected', caption: "", valueIndex: 'Selected', type: 3, css: { 'width': 45, 'text-align': 'center' } },
|
|
{ name: 'BeginDate', caption: GetTextByKey("P_JS_MOVEDATE", "Move Date"), valueIndex: 'BeginDate', css: { 'width': 100, 'text-align': 'left' } },
|
|
//{ name: 'BeginDate', caption: GetTextByKey("P_JS_BEGINDATE", "Begin Date"), valueIndex: 'BeginDate', css: { 'width': 100, 'text-align': 'left' } },
|
|
//{ name: 'EndDate', caption: GetTextByKey("P_JS_ENDDATE", "End Date"), valueIndex: 'EndDate', css: { 'width': 100, 'text-align': 'left' } },
|
|
{ name: 'AssetName', caption: GetTextByKey("P_JS_ASSETNAME", "Asset Name"), valueIndex: 'AssetName', allowFilter: true, css: { 'width': 200, 'text-align': 'left' } },
|
|
{ name: 'AssetTypeName', caption: GetTextByKey("P_JS_ASSETTYPE", "Asset Type"), valueIndex: 'AssetTypeName', allowFilter: true, css: { 'width': 180, 'text-align': 'left' } },
|
|
{ name: 'AssetModelName', caption: GetTextByKey("P_JS_MODEL", "Model"), valueIndex: 'AssetModelName', allowFilter: true, css: { 'width': 180, 'text-align': 'left' } },
|
|
{ name: 'CurrentJobSiteName', caption: GetTextByKey("P_JS_FROMJOBSITE", "From Jobsite"), allowFilter: true, valueIndex: 'CurrentJobSiteName', css: { 'width': 120, 'text-align': 'left' } },
|
|
{ name: 'RequiredJobSiteName', caption: GetTextByKey("P_JS_TOJOBSITE", "To Jobsite"), allowFilter: true, valueIndex: 'RequiredJobSiteName', css: { 'width': 120, 'text-align': 'left' } },
|
|
{ name: 'Completed', caption: GetTextByKey("P_JS_MARKCOMPLETE", "Mark Complete"), valueIndex: 'Completed', type: 3, css: { 'width': 100, 'text-align': 'center' } },
|
|
{ name: 'CompletedTime', caption: GetTextByKey("P_JS_COMPLETEDATE", "Completed Date"), valueIndex: 'CompletedTime', css: { 'width': 120, 'text-align': 'left' } },
|
|
{ name: 'Notes', caption: GetTextByKey("P_JS_NOTES", "Notes"), valueIndex: 'Notes', allowFilter: true, css: { 'width': 200, 'text-align': 'left' } },
|
|
{ name: 'AssignedTo', caption: GetTextByKey("P_JS_ASSIGNEDTO", "Assigned To"), valueIndex: 'AssignedToAssetName', allowFilter: true, css: { 'width': 200, 'text-align': 'left' } },
|
|
{ name: 'PointOfContact', caption: GetTextByKey("P_JS_POINTOFCONTACT", "Point Of Contact"), valueIndex: 'PointOfContact', allowFilter: true, css: { 'width': 200, 'text-align': 'left' } },
|
|
{ name: 'Delete', caption: "", alwaysshow: true, css: { 'width': 30, 'text-align': 'center' } },
|
|
{ name: 'History', caption: "", alwaysshow: true, css: { 'width': 30, 'text-align': 'center' } }
|
|
];
|
|
var columns = [
|
|
{
|
|
// checkbox
|
|
name: 'check',
|
|
key: 'Selected',
|
|
width: 45,
|
|
align: 'center',
|
|
sortable: false,
|
|
allcheck: true,
|
|
type: 3
|
|
}
|
|
];
|
|
// 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 === "Completed") {
|
|
col.events = {
|
|
onchange: function () {
|
|
var item = this;
|
|
var msg = "";
|
|
if (item.Completed)
|
|
msg = GetTextByKey("P_JS_DOYOUWANTTOMARKCOMPLETE", "Do you want to mark complete?");
|
|
else
|
|
msg = GetTextByKey("P_JS_DOYOUWANTTOUNMARKCOMPLETION", "Do you want to unmark completion?");
|
|
|
|
showConfirm(msg, GetTextByKey("P_JS_MARKCOMPLATE", 'Mark Complete'), function () {
|
|
UpdateDispatchCompleted(item.DispatchId, item.Completed);
|
|
}, function () {
|
|
item.Completed = !item.Completed;
|
|
grid_dt.reload();
|
|
showmaskbg(false);
|
|
});
|
|
}
|
|
};
|
|
col.enabled = !IsReadOnly;
|
|
}
|
|
if (col.name === "Delete") {
|
|
col.sortable = false;
|
|
col.resizable = false;
|
|
col.type = GridView.ColumnTypes.Icon;
|
|
col.text = 'times';
|
|
col.events = {
|
|
onclick: function () {
|
|
OnDelete(this);
|
|
}
|
|
};
|
|
col.attrs = { 'title': GetTextByKey("P_JS_DELETE", 'Delete') };
|
|
col.styleFilter = function (e) {
|
|
if (e.Completed)
|
|
return {
|
|
display: 'none'
|
|
};
|
|
};
|
|
col.visible = !IsReadOnly;
|
|
}
|
|
if (col.name === "History") {
|
|
col.sortable = false;
|
|
col.resizable = false;
|
|
col.type = GridView.ColumnTypes.Icon;
|
|
col.text = 'eye';
|
|
col.events = {
|
|
onclick: function () {
|
|
OnViewChangeHistory(this);
|
|
}
|
|
};
|
|
col.attrs = { 'title': GetTextByKey("P_MR_VIEWCHANGEHIS", 'View Change History') };
|
|
col.visible = !IsReadOnly;
|
|
}
|
|
columns.push(col);
|
|
}
|
|
grid_dt.canMultiSelect = false;
|
|
grid_dt.columns = columns;
|
|
grid_dt.init();
|
|
}
|
|
|
|
|
|
function searchEnter(e) {
|
|
if (e.keyCode == 13) {
|
|
OnRefresh();
|
|
}
|
|
}
|
|
|
|
var alljobsites;
|
|
function getJobsitesAndRegions() {
|
|
jobsitequery('GetJobsitesAndRegions', '1', function (data) {
|
|
if (typeof (data) === "string") {
|
|
showAlert(data, GetTextByKey("P_AM_ERROR", 'Error'));
|
|
return;
|
|
}
|
|
|
|
alljobsites = data.Jobsites;
|
|
$("#div_jobsites").dropdownSource(data.Jobsites);
|
|
|
|
$('#div_region').dropdownSource(data.Regions);
|
|
});
|
|
}
|
|
|
|
function onregioncompleted() {
|
|
if (!alljobsites) return;
|
|
var regions = $('#div_region').dropdownVals();
|
|
var jss = [...alljobsites];
|
|
if (regions && regions.length > 0)
|
|
jss = jss.filter(t => regions.indexOf(t.Tag3) >= 0);
|
|
$("#div_jobsites").dropdownSource(jss);
|
|
var seljss = $("#div_jobsites").dropdownVals();
|
|
$("#div_jobsites").dropdownSource(jss).dropdownVals(seljss);
|
|
}
|
|
|
|
$(function () {
|
|
setPageTitle(GetTextByKey("P_JS_DISPATCHREQUESTS", "Dispatch Requests"), true);
|
|
$('#dialog_assignasset').dropdown([], {
|
|
search: true,
|
|
valueKey: 'Id',
|
|
textKey: 'DisplayName'
|
|
});
|
|
$('#dialog_assignasset').dropdownDisabled(false);
|
|
InitGridData();
|
|
InitEmailGridData();
|
|
getJobsitesAndRegions();
|
|
|
|
$(window).resize(function () {
|
|
$("#dispatchlist").css("height", $(window).height() - $("#dispatchlist").offset().top - 14);
|
|
grid_dt && grid_dt.resize();
|
|
|
|
}).resize();
|
|
OnRefresh();
|
|
|
|
$("#div_region").css('width', 120).dropdown([], {
|
|
search: true,
|
|
multiselect: true,
|
|
allowselectall: true,
|
|
textKey: 'Value',
|
|
valueKey: 'Key'
|
|
}).on('collapsed', onregioncompleted);
|
|
|
|
$("#div_jobsites").css('width', 120).dropdown([], {
|
|
search: true,
|
|
multiselect: true,
|
|
allowselectall: true,
|
|
textKey: 'Value',
|
|
valueKey: 'Key'
|
|
});
|
|
|
|
$('#searchinputtxt').keydown(searchEnter);
|
|
|
|
$('#dialog_sendmail').dialog(function () {
|
|
showmaskbg(false);
|
|
});
|
|
|
|
$('#dialog_assignment').dialog(function () {
|
|
showmaskbg(false);
|
|
});
|
|
|
|
$('#sendmail_othertextaddress').focus(function (e) {
|
|
var left = $('#dialog_sendmail').offset().left + $('#dialog_sendmail').width() + 2;
|
|
var top = $('#dialog_sendmail').offset().top + $("#dialog_sendmail").height() - $("#div_tooltip").height() - 9;
|
|
$('#div_tooltip').css({ 'display': '', 'left': left, 'top': top });
|
|
});
|
|
|
|
if (!canExport) {
|
|
$('#spExport').hide();
|
|
}
|
|
});
|
|
|
|
function UpdateDispatchCompleted(dispatchid, competed) {
|
|
var item = { 'Key': dispatchid, 'Value': competed };
|
|
|
|
var p = htmlencode(JSON.stringify(item));
|
|
jobsitequery('UpdateDispatchCompleted', p, function (data) {
|
|
if (data !== "OK") {
|
|
showAlert(data, GetTextByKey("P_AM_ERROR", 'Error'));
|
|
}
|
|
OnRefresh();
|
|
});
|
|
}
|
|
|
|
function OnPrint(assignto) {
|
|
if (!assignto)
|
|
assignto = "";
|
|
|
|
if (_selectdispatchids.length == 0) {
|
|
showAlert(GetTextByKey('P_JS_PLEASESELECTDISPATCH', 'Please select Dispatch.'), GetTextByKey('P_MR_PRINT', 'Print'));
|
|
return;
|
|
}
|
|
|
|
window.open("../Print.aspx?pt=2&t=" + _sendType + "&assignto=" + encodeURIComponent(assignto) + "&ids=" + JSON.stringify(_selectdispatchids));
|
|
}
|
|
|
|
function OnViewChangeHistory(dis) {
|
|
if (!dis) {
|
|
return;
|
|
}
|
|
|
|
window.open("DispatchChangeHistory.aspx?stype=" + _sendType + "&id=" + dis.DispatchId);
|
|
}
|
|
|
|
function OnExport() {
|
|
var jobsites = $('#div_jobsites').dropdownVals();
|
|
var regions = $('#div_region').dropdownVals();
|
|
var lateststartdate = $.trim($('#latesdatetxt').val());
|
|
if (lateststartdate && !$('#latesdatetxt').is(':valid')) {
|
|
showAlert(GetTextByKey('P_COMMON_THELATESTSTARTDATEISINVALID', "The latest start date is invalid."), GetTextByKey("P_FR_ERROR", 'Error'));
|
|
return;
|
|
}
|
|
var p = {
|
|
"LatestStartDate": lateststartdate,
|
|
"JobSites": jobsites,
|
|
"Regions": regions,
|
|
"SearchText": $.trim($('#searchinputtxt').val()),
|
|
"UnScheduledOnly": $('#chk_unscheduled').prop('checked')
|
|
};
|
|
window.open("../ExportToFile.aspx?type=dispatchrequests&t=" + htmlencode(JSON.stringify(p)));
|
|
}
|
|
|
|
</script>
|
|
</asp:Content>
|
|
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
|
|
<div id="contentctrl">
|
|
<div class="page_title" data-lgid="P_JS_DISPATCHREQUESTS">Dispatch Requests</div>
|
|
<div class="search_bar">
|
|
<input type="password" autocomplete="new-password" style="display: none" />
|
|
<span data-lgid="P_JS_LATESTSTARTDATE_COLON"></span>
|
|
<input type="date" class="type-date" required min="1900-01-01" id="latesdatetxt" autocomplete="off" style="float: left; width: 89px; margin-left: 5px;" value="<%=LatestStartDate %>" />
|
|
<span data-lgid="P_JS_REGION_COLON">Region:</span>
|
|
<div id="div_region"></div>
|
|
<span data-lgid="P_JS_JOBSITES_COLON">Jobsites:</span>
|
|
<div id="div_jobsites"></div>
|
|
<input type="text" id="searchinputtxt" autocomplete="off" style="margin-left: 5px; display: none;" />
|
|
<input class="search" type="button" onclick="OnRefresh();" value="Search" data-lgid="P_CM_SEARCH" style="margin-left: 5px;" />
|
|
<input id="chk_unscheduled" type="checkbox" onclick="OnRefresh();" />
|
|
<label data-lgid="P_JS_MARKCOMPLETE" for="chk_unscheduled">Mark Complete</label>
|
|
</div>
|
|
<div class="function_title">
|
|
<span class="sbutton iconmail" onclick="openAssignDispatch(1);" data-lgid="P_JS_EMAIL">Email</span>
|
|
<span class="sbutton iconprint" onclick="openAssignDispatch(0);" data-lgid="P_JS_PRIINT">Print</span>
|
|
<span id="spExport" class="sbutton iconexport" onclick="OnExport();" data-lgid="P_MR_EXPORTTOEXCEL">Export to Excel</span>
|
|
<span class="sbutton iconrefresh" onclick="OnRefresh();" data-lgid="P_JS_REFRESH"></span>
|
|
</div>
|
|
<div id="dispatchlist"></div>
|
|
</div>
|
|
|
|
<div id="mask_bg" style="display: none;">
|
|
<div class="loading c-spin"></div>
|
|
</div>
|
|
<div class="dialog" id="dialog_sendmail" style="display: none; width: 510px;">
|
|
<div class="dialog-title"><span class="title" data-lgid="P_JS_SENDDISPATCHREQUEST">Send Dispatch Request</span><em class="dialog-close"></em></div>
|
|
<div class="dialog-content" style="line-height: 24px;">
|
|
<table>
|
|
<tr>
|
|
<td colspan="2" data-lgid="P_MV_SENDTHISTO">Who do you want to send this to? Select from existing relationships or manual entry.</td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="2">
|
|
<div id="contactlist" style="height: 168px; width: 470px; margin-left: 10px; margin-right: 10px;"></div>
|
|
</td>
|
|
</tr>
|
|
<tr style="height: 24px;">
|
|
<td colspan="2" data-lgid="P_MV_EMAILORTEXTADDRESSESTIPS">Separate multiple manually entered email or text addresses with a semi-colon (;).</td>
|
|
</tr>
|
|
<tr style="height: 24px;">
|
|
<td style="text-align: right; padding-right: 5px;"><span data-lgid="P_MV_OTHEREMAILADDRESS">Other Email Address</span>
|
|
</td>
|
|
<td>
|
|
<input type="text" id="sendmail_otheremailaddress" style="width: 350px;" autocomplete="off" /></td>
|
|
</tr>
|
|
<tr style="height: 24px; display: none;">
|
|
<td style="text-align: right; padding-right: 5px;"><span data-lgid="P_MV_OTHERTEXTADDRESS">Other Text Address</span>
|
|
</td>
|
|
<td>
|
|
<input type="text" id="sendmail_othertextaddress" style="width: 350px;" autocomplete="off" />
|
|
</td>
|
|
<%--<span id="span_hepler" class='helper pointer' title='Help'></span>--%>
|
|
</tr>
|
|
<tr style="height: 24px;">
|
|
<td style="text-align: right; padding-right: 5px;" data-lgid="P_MV_DESCRIPTION">Description</td>
|
|
<td>
|
|
<textarea id="sendmail_desc" style="width: 350px; height: 80px; resize: none;"></textarea></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="dialog-func">
|
|
<input type="button" value="Cancel" data-lgid="P_MV_CANCEL" class="dialog-close" tabindex="12" />
|
|
<input type="button" onclick="onSendEmails();" value="OK" data-lgid="P_MV_OK" tabindex="11" />
|
|
<div class="clear"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="dialog" id="dialog_assignment" style="display: none;">
|
|
<div class="dialog-title"><span class="title" data-lgid="P_JS_DISPATCHASSIGNMENT">Dispatch Assignment</span><em class="dialog-close"></em></div>
|
|
<div class="dialog-content">
|
|
<table style="line-height: 30px; margin-left: 30px;">
|
|
<tr>
|
|
<td data-lgid="P_JS_SELECTASSETFORDISPATCH">Select Asset for Dispatch</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<div id="dialog_assignasset" style="width: 320px; position: relative;" class="dropdown"></div>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="dialog-func">
|
|
<input type="button" onclick="onAssignContinue();" value="Continue" data-lgid="P_JS_CONTINUE" tabindex="12" />
|
|
<input type="button" onclick="onAssignSkip();" value="Skip" data-lgid="P_JS_SKIP" tabindex="11" />
|
|
<div class="clear"></div>
|
|
</div>
|
|
</div>
|
|
</asp:Content>
|