Commit 62bc3ab1 by Mac Stephens

Update complaint statuses and styling, remove list searches, show complaint…

Update complaint statuses and styling, remove list searches, show complaint numbers on units, and prioritize Wyoming units
parent 3778547f
...@@ -195,6 +195,7 @@ object ApiDatabaseModule: TApiDatabaseModule ...@@ -195,6 +195,7 @@ object ApiDatabaseModule: TApiDatabaseModule
'TID' 'TID'
'WHERE ag.AGENCYTYPE = '#39'POL'#39 'WHERE ag.AGENCYTYPE = '#39'POL'#39
'ORDER BY' 'ORDER BY'
' CASE WHEN ag.AGENCYID = '#39'WCSO'#39' THEN 0 ELSE 1 END,'
' ag.AGENCYNAME,' ' ag.AGENCYNAME,'
' dua.UNITNAME') ' dua.UNITNAME')
ReadOnly = True ReadOnly = True
......
...@@ -343,15 +343,21 @@ begin ...@@ -343,15 +343,21 @@ begin
statusColor := '#22C55E'; statusColor := '#22C55E';
statusTextColor := '#000000'; statusTextColor := '#000000';
end end
else if not FieldByName('DATERESPONDED').IsNull then
begin
status := 'Enroute';
statusColor := '#FFFF00';
statusTextColor := '#000000';
end
else if not FieldByName('DATEDISPATCHED').IsNull then else if not FieldByName('DATEDISPATCHED').IsNull then
begin begin
status := 'Attached'; status := 'Dispatched';
statusColor := '#FFFF00'; statusColor := '#FFFF00';
statusTextColor := '#000000'; statusTextColor := '#000000';
end end
else else
begin begin
status := 'Not Attached'; status := 'Pending';
statusColor := '#FF8080'; statusColor := '#FF8080';
statusTextColor := '#000000'; statusTextColor := '#000000';
end; end;
...@@ -416,31 +422,32 @@ begin ...@@ -416,31 +422,32 @@ begin
data := TJSONArray.Create; data := TJSONArray.Create;
try try
lastAgency := ''; lastAgency := '';
with ApiDB.uqUnitList do with ApiDB.uqUnitList do
begin begin
Open; Open;
First; First;
while not Eof do while not Eof do
begin begin
var item := TJSONObject.Create; var item := TJSONObject.Create;
// Section: Group header shown once when the agency changes.
var curAgency := Trim(ApiDB.uqUnitListAGENCY_NAME.AsString);
if curAgency = '' then
curAgency := Trim(ApiDB.uqUnitListAGENCY.AsString);
if curAgency = '' then
curAgency := 'Unknown Agency';
// Group header: show once when agency changes if not SameText(curAgency, lastAgency) then
var curAgency := Trim(ApiDB.uqUnitListAGENCY_NAME.AsString); begin
if curAgency = '' then item.AddPair('AgencyHeader', curAgency);
curAgency := Trim(ApiDB.uqUnitListAGENCY.AsString); lastAgency := curAgency;
if curAgency = '' then end
curAgency := 'Unknown Agency'; else
item.AddPair('AgencyHeader', '');
if not SameText(curAgency, lastAgency) then
begin
item.AddPair('AgencyHeader', curAgency);
lastAgency := curAgency;
end
else
item.AddPair('AgencyHeader', '');
// Core unit identity // Section: Core unit identity.
item.AddPair('UnitId', ApiDB.uqUnitListUNITID.AsString); item.AddPair('UnitId', ApiDB.uqUnitListUNITID.AsString);
item.AddPair('UnitName', ApiDB.uqUnitListUNITNAME.AsString); item.AddPair('UnitName', ApiDB.uqUnitListUNITNAME.AsString);
item.AddPair('Agency', ApiDB.uqUnitListAGENCY.AsString); item.AddPair('Agency', ApiDB.uqUnitListAGENCY.AsString);
...@@ -451,6 +458,7 @@ begin ...@@ -451,6 +458,7 @@ begin
item.AddPair('Sector', ApiDB.uqUnitListSECTOR_DESC.AsString); item.AddPair('Sector', ApiDB.uqUnitListSECTOR_DESC.AsString);
item.AddPair('CallType', ApiDB.uqUnitListCALL_TYPE.AsString); item.AddPair('CallType', ApiDB.uqUnitListCALL_TYPE.AsString);
// Section: Map button availability.
var canShowMap := False; var canShowMap := False;
if (not ApiDB.uqUnitListGPS_LATITUDE.IsNull) and if (not ApiDB.uqUnitListGPS_LATITUDE.IsNull) and
...@@ -466,39 +474,87 @@ begin ...@@ -466,39 +474,87 @@ begin
end; end;
item.AddPair('CanShowMap', IfThen(canShowMap, 'true', 'false')); item.AddPair('CanShowMap', IfThen(canShowMap, 'true', 'false'));
item.AddPair('MapButtonClass', IfThen(canShowMap, 'btn-primary', 'btn-secondary disabled')); item.AddPair(
item.AddPair('MapButtonDisabled', IfThen(canShowMap, '', 'disabled="disabled" aria-disabled="true"')); 'MapButtonClass',
item.AddPair('MapButtonTitle', IfThen(canShowMap, 'Show on map', 'No map location available')); IfThen(canShowMap, 'btn-primary', 'btn-secondary disabled')
);
item.AddPair(
'MapButtonDisabled',
IfThen(
canShowMap,
'',
'disabled="disabled" aria-disabled="true"'
)
);
item.AddPair(
'MapButtonTitle',
IfThen(
canShowMap,
'Show on map',
'No map location available'
)
);
// Section: Current complaint assignment.
var complaintNumber :=
Trim(ApiDB.uqUnitListCOMPLAINT.AsString);
item.AddPair(
'Location',
ApiDB.uqUnitListLOCATION.AsString
);
item.AddPair('Complaint', complaintNumber);
if complaintNumber <> '' then
item.AddPair(
'ComplaintHeader',
' - ' + complaintNumber
)
else
item.AddPair('ComplaintHeader', '');
// Section: Default to Available when there is no active CFS row.
var statusDesc :=
ApiDB.uqUnitListUNIT_STATUS_DESC.AsString;
if statusDesc = '' then
statusDesc := 'Available';
// Current assignment (if any) item.AddPair('Status', statusDesc);
item.AddPair('Location', ApiDB.uqUnitListLOCATION.AsString);
item.AddPair('Complaint', ApiDB.uqUnitListCOMPLAINT.AsString);
// Status: default to "Available" when no active CFS row // Section: Primary officer.
var statusDesc := ApiDB.uqUnitListUNIT_STATUS_DESC.AsString; var o1 :=
if statusDesc = '' then Trim(ApiDB.uqUnitListOFFICER1_LAST_NAME.AsString);
statusDesc := 'Available'; var f1 :=
item.AddPair('Status', statusDesc); Trim(ApiDB.uqUnitListOFFICER1_FIRST_NAME.AsString);
var m1 :=
Trim(ApiDB.uqUnitListOFFICER1_MI.AsString);
// Officers (LAST, FIRST [MI])
var o1 := Trim(ApiDB.uqUnitListOFFICER1_LAST_NAME.AsString);
var f1 := Trim(ApiDB.uqUnitListOFFICER1_FIRST_NAME.AsString);
var m1 := Trim(ApiDB.uqUnitListOFFICER1_MI.AsString);
if o1 <> '' then if o1 <> '' then
begin begin
if f1 <> '' then o1 := o1 + ', ' + f1; if f1 <> '' then
if m1 <> '' then o1 := o1 + ' ' + m1; o1 := o1 + ', ' + f1;
if m1 <> '' then
o1 := o1 + ' ' + m1;
item.AddPair('Officer1', o1); item.AddPair('Officer1', o1);
end; end;
var o2 := Trim(ApiDB.uqUnitListOFFICER2_LAST_NAME.AsString); // Section: Secondary officer.
var f2 := Trim(ApiDB.uqUnitListOFFICER2_FIRST_NAME.AsString); var o2 :=
var m2 := Trim(ApiDB.uqUnitListOFFICER2_MI.AsString); Trim(ApiDB.uqUnitListOFFICER2_LAST_NAME.AsString);
var f2 :=
Trim(ApiDB.uqUnitListOFFICER2_FIRST_NAME.AsString);
var m2 :=
Trim(ApiDB.uqUnitListOFFICER2_MI.AsString);
if o2 <> '' then if o2 <> '' then
begin begin
if f2 <> '' then o2 := o2 + ', ' + f2; if f2 <> '' then
if m2 <> '' then o2 := o2 + ' ' + m2; o2 := o2 + ', ' + f2;
if m2 <> '' then
o2 := o2 + ' ' + m2;
item.AddPair('Officer2', o2); item.AddPair('Officer2', o2);
end; end;
...@@ -507,13 +563,25 @@ begin ...@@ -507,13 +563,25 @@ begin
end; end;
end; end;
Result.AddPair('count', TJSONNumber.Create(data.Count)); Result.AddPair(
Result.AddPair('returned', TJSONNumber.Create(data.Count)); 'count',
TJSONNumber.Create(data.Count)
);
Result.AddPair(
'returned',
TJSONNumber.Create(data.Count)
);
Result.AddPair('data', data); Result.AddPair('data', data);
except except
data.Free; data.Free;
Logger.Log(3, '---TApiService.GetUnitList End (error)'); Logger.Log(
raise EXDataHttpException.Create(500, 'Failed to load units list'); 3,
'---TApiService.GetUnitList End (error)'
);
raise EXDataHttpException.Create(
500,
'Failed to load units list'
);
end; end;
Logger.Log(3, '---TApiService.GetUnitList End'); Logger.Log(3, '---TApiService.GetUnitList End');
......
...@@ -44,20 +44,18 @@ object FViewComplaints: TFViewComplaints ...@@ -44,20 +44,18 @@ object FViewComplaints: TFViewComplaints
ItemTemplate = ItemTemplate =
'<div class="list-section-header small fw-semibold bg-secondary t' + '<div class="list-section-header small fw-semibold bg-secondary t' +
'ext-white rounded-1 px-2 mb-1">(%DistrictHeader%)</div><div clas' + 'ext-white rounded-1 px-2 mb-1">(%DistrictHeader%)</div><div clas' +
's="card border shadow-sm" style="--bs-card-bg:(%StatusColor%);--' + 's="card border shadow-sm"><div class="card-body py-2 px-3 d-flex' +
'bs-card-color:(%StatusTextColor%);"><div class="card-body py-2 p' + ' gap-2"><div class="flex-grow-1"><div class="fw-bold text-upperc' +
'x-3 d-flex gap-2"><div class="flex-grow-1"><div class="fw-bold t' + 'ase small">(%Priority%): (%DispatchCodeDesc%)</div><div class="s' +
'ext-uppercase small">(%Priority%): (%DispatchCodeDesc%)</div><di' + 'mall">(%Address%)</div><div class="small d-none complaint-busine' +
'v class="small">(%Address%)</div><div class="small d-none compla' + 'ss" data-business="(%Business%)">(%Business%)</div><div class="s' +
'int-business" data-business="(%Business%)">(%Business%)</div><di' + 'mall text-opacity-75">(%Complaint%): (%Status%)&nbsp;&nbsp;(%Age' +
'v class="small text-opacity-75">(%Complaint%): (%Status%)&nbsp;&' + 'ncyLine%)</div><div class="small text-opacity-75">(%DateReported' +
'nbsp;(%AgencyLine%)</div><div class="small text-opacity-75">(%Da' + '%)</div></div><div class="d-flex flex-column justify-content-cen' +
'teReported%)</div></div><div class="d-flex flex-column justify-c' + 'ter gap-1"><button type="button" class="btn btn-primary btn-sm c' +
'ontent-center gap-1"><button type="button" class="btn btn-primar' + 'omplaint-details-btn" data-id="(%ComplaintId%)">Details</button>' +
'y btn-sm complaint-details-btn" data-id="(%ComplaintId%)">Detail' + '<button type="button" class="btn btn-primary btn-sm btn-complain' +
's</button><button type="button" class="btn btn-primary btn-sm bt' + 't-map" data-id="(%ComplaintId%)">Map</button></div></div></div>'
'n-complaint-map" data-id="(%ComplaintId%)">Map</button></div></d' +
'iv></div>'
ListSource = wdsComplaints ListSource = wdsComplaints
end end
object xdwcComplaints: TXDataWebClient object xdwcComplaints: TXDataWebClient
......
<div class="d-flex flex-column h-100"> <div class="d-flex flex-column h-100">
<!-- Header / controls (non-scrolling) -->
<div class="flex-shrink-0">
<!-- Search bar under local navbar -->
<div class="bg-light border-bottom py-2">
<div class="container-fluid">
<div class="input-group">
<span class="input-group-text bg-white"><i class="fa fa-search"></i></span>
<input id="complaints_search" class="form-control" placeholder="Search...">
</div>
</div>
</div>
</div>
<!-- Scrolling list area --> <!-- Scrolling list area -->
<div class="flex-grow-1 overflow-auto" style="min-height:0;"> <div class="flex-grow-1 overflow-auto" style="min-height:0;">
<div class="container-fluid mt-2"> <div class="container-fluid mt-2">
......
...@@ -53,10 +53,7 @@ ...@@ -53,10 +53,7 @@
</button> </button>
</div> </div>
<div class="card-footer text-muted small"> <div class="card-footer text-muted small">
Please use your lems username &amp; password to login.<br><br> Please use your lems username &amp; password to login.
For non-lems users, please call the CPS Help Desk at
(716) 858-7773 during business hours<br>
or email: <a href="mailto:CPSHelpdesk@erie.gov">CPSHelpdesk@erie.gov</a>
</div> </div>
</div> </div>
</div> </div>
......
...@@ -43,19 +43,19 @@ object FViewUnits: TFViewUnits ...@@ -43,19 +43,19 @@ object FViewUnits: TFViewUnits
'ary text-dark rounded-1 px-2 mb-1">(%AgencyHeader%)</div><div cl' + 'ary text-dark rounded-1 px-2 mb-1">(%AgencyHeader%)</div><div cl' +
'ass="card border shadow-sm"> <div class="card-body py-2 px-3 d-' + 'ass="card border shadow-sm"> <div class="card-body py-2 px-3 d-' +
'flex gap-2"> <div class="flex-grow-1"> <div class="fw-bo' + 'flex gap-2"> <div class="flex-grow-1"> <div class="fw-bo' +
'ld text-uppercase small">(%UnitName%)&nbsp;-&nbsp;(%Status%)</di' + 'ld text-uppercase small">(%UnitName%)(%ComplaintHeader%)&nbsp;-&' +
'v> <div class="small text-body-secondary mb-1">(%Location%)' + 'nbsp;(%Status%)</div> <div class="small text-body-secondary' +
'</div> <div class="small">(%CallType%)</div> <hr class' + ' mb-1">(%Location%)</div> <div class="small">(%CallType%)</' +
'="unit-divider my-1" style="width: 80px; margin-left: 0" /> ' + 'div> <hr class="unit-divider my-1" style="width: 80px; marg' +
' <div class="small officer1">(%Officer1%)</div> <div class=' + 'in-left: 0" /> <div class="small officer1">(%Officer1%)</di' +
'"small officer2">(%Officer2%)</div> </div> <div class="d-f' + 'v> <div class="small officer2">(%Officer2%)</div> </div>' +
'lex flex-column justify-content-center gap-1"> <button type' + ' <div class="d-flex flex-column justify-content-center gap-1"' +
'="button" class="btn btn-primary btn-sm btn-unit-details" data-u' + '> <button type="button" class="btn btn-primary btn-sm btn-u' +
'nitid="(%UnitId%)">Details</button> <button type="button" ' + 'nit-details" data-unitid="(%UnitId%)">Details</button> <but' +
' class="btn btn-sm btn-unit-map (%MapButtonClass%)" ' + 'ton type="button" class="btn btn-sm btn-unit-map (%MapBut' +
'data-unitid="(%UnitId%)" data-canmap="(%CanShowMap%)" ' + 'tonClass%)" data-unitid="(%UnitId%)" data-canmap="' +
' title="(%MapButtonTitle%)" (%MapButtonDisabled%)> Ma' + '(%CanShowMap%)" title="(%MapButtonTitle%)" (%MapBu' +
'p</button> </div> </div></div>' 'ttonDisabled%)> Map</button> </div> </div></div>'
ListSource = wdsUnits ListSource = wdsUnits
end end
object wdsUnits: TWebDataSource object wdsUnits: TWebDataSource
...@@ -66,7 +66,7 @@ object FViewUnits: TFViewUnits ...@@ -66,7 +66,7 @@ object FViewUnits: TFViewUnits
end end
object xdwdsUnits: TXDataWebDataSet object xdwdsUnits: TXDataWebDataSet
Connection = DMConnection.ApiConnection Connection = DMConnection.ApiConnection
Left = 260 Left = 262
Top = 412 Top = 412
object xdwdsUnitsAgencyHeader: TStringField object xdwdsUnitsAgencyHeader: TStringField
FieldName = 'AgencyHeader' FieldName = 'AgencyHeader'
...@@ -115,6 +115,10 @@ object FViewUnits: TFViewUnits ...@@ -115,6 +115,10 @@ object FViewUnits: TFViewUnits
object xdwdsUnitsMapButtonTitle: TStringField object xdwdsUnitsMapButtonTitle: TStringField
FieldName = 'MapButtonTitle' FieldName = 'MapButtonTitle'
end end
object xdwdsUnitsComplaintHeader: TStringField
FieldName = 'ComplaintHeader'
Size = 40
end
end end
object xdwcUnits: TXDataWebClient object xdwcUnits: TXDataWebClient
Connection = DMConnection.ApiConnection Connection = DMConnection.ApiConnection
......
<div class="d-flex flex-column h-100"> <div class="d-flex flex-column h-100">
<!-- Header / controls (non-scrolling) -->
<div class="flex-shrink-0">
<!-- Search bar under local navbar -->
<div class="bg-light border-bottom py-2">
<div class="container-fluid">
<div class="input-group">
<span class="input-group-text bg-white"><i class="fa fa-search"></i></span>
<input id="units_search" class="form-control" placeholder="Search...">
</div>
</div>
</div>
</div>
<!-- Scrolling list area --> <!-- Scrolling list area -->
<div class="flex-grow-1 overflow-auto" style="min-height:0;"> <div class="flex-grow-1 overflow-auto" style="min-height:0;">
<div class="container-fluid mt-2"> <div class="container-fluid mt-2">
......
...@@ -32,6 +32,7 @@ type ...@@ -32,6 +32,7 @@ type
xdwdsUnitsMapButtonClass: TStringField; xdwdsUnitsMapButtonClass: TStringField;
xdwdsUnitsMapButtonDisabled: TStringField; xdwdsUnitsMapButtonDisabled: TStringField;
xdwdsUnitsMapButtonTitle: TStringField; xdwdsUnitsMapButtonTitle: TStringField;
xdwdsUnitsComplaintHeader: TStringField;
procedure WebFormCreate(Sender: TObject); procedure WebFormCreate(Sender: TObject);
private private
FLoading: Boolean; FLoading: Boolean;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment