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
'TID'
'WHERE ag.AGENCYTYPE = '#39'POL'#39
'ORDER BY'
' CASE WHEN ag.AGENCYID = '#39'WCSO'#39' THEN 0 ELSE 1 END,'
' ag.AGENCYNAME,'
' dua.UNITNAME')
ReadOnly = True
......
......@@ -343,15 +343,21 @@ begin
statusColor := '#22C55E';
statusTextColor := '#000000';
end
else if not FieldByName('DATERESPONDED').IsNull then
begin
status := 'Enroute';
statusColor := '#FFFF00';
statusTextColor := '#000000';
end
else if not FieldByName('DATEDISPATCHED').IsNull then
begin
status := 'Attached';
status := 'Dispatched';
statusColor := '#FFFF00';
statusTextColor := '#000000';
end
else
begin
status := 'Not Attached';
status := 'Pending';
statusColor := '#FF8080';
statusTextColor := '#000000';
end;
......@@ -416,31 +422,32 @@ begin
data := TJSONArray.Create;
try
lastAgency := '';
with ApiDB.uqUnitList do
begin
Open;
First;
while not Eof do
begin
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
var curAgency := Trim(ApiDB.uqUnitListAGENCY_NAME.AsString);
if curAgency = '' then
curAgency := Trim(ApiDB.uqUnitListAGENCY.AsString);
if curAgency = '' then
curAgency := 'Unknown Agency';
if not SameText(curAgency, lastAgency) then
begin
item.AddPair('AgencyHeader', curAgency);
lastAgency := curAgency;
end
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('UnitName', ApiDB.uqUnitListUNITNAME.AsString);
item.AddPair('Agency', ApiDB.uqUnitListAGENCY.AsString);
......@@ -451,6 +458,7 @@ begin
item.AddPair('Sector', ApiDB.uqUnitListSECTOR_DESC.AsString);
item.AddPair('CallType', ApiDB.uqUnitListCALL_TYPE.AsString);
// Section: Map button availability.
var canShowMap := False;
if (not ApiDB.uqUnitListGPS_LATITUDE.IsNull) and
......@@ -466,39 +474,87 @@ begin
end;
item.AddPair('CanShowMap', IfThen(canShowMap, 'true', 'false'));
item.AddPair('MapButtonClass', 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'));
item.AddPair(
'MapButtonClass',
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('Location', ApiDB.uqUnitListLOCATION.AsString);
item.AddPair('Complaint', ApiDB.uqUnitListCOMPLAINT.AsString);
item.AddPair('Status', statusDesc);
// Status: default to "Available" when no active CFS row
var statusDesc := ApiDB.uqUnitListUNIT_STATUS_DESC.AsString;
if statusDesc = '' then
statusDesc := 'Available';
item.AddPair('Status', statusDesc);
// Section: Primary officer.
var o1 :=
Trim(ApiDB.uqUnitListOFFICER1_LAST_NAME.AsString);
var f1 :=
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
begin
if f1 <> '' then o1 := o1 + ', ' + f1;
if m1 <> '' then o1 := o1 + ' ' + m1;
if f1 <> '' then
o1 := o1 + ', ' + f1;
if m1 <> '' then
o1 := o1 + ' ' + m1;
item.AddPair('Officer1', o1);
end;
var o2 := Trim(ApiDB.uqUnitListOFFICER2_LAST_NAME.AsString);
var f2 := Trim(ApiDB.uqUnitListOFFICER2_FIRST_NAME.AsString);
var m2 := Trim(ApiDB.uqUnitListOFFICER2_MI.AsString);
// Section: Secondary officer.
var o2 :=
Trim(ApiDB.uqUnitListOFFICER2_LAST_NAME.AsString);
var f2 :=
Trim(ApiDB.uqUnitListOFFICER2_FIRST_NAME.AsString);
var m2 :=
Trim(ApiDB.uqUnitListOFFICER2_MI.AsString);
if o2 <> '' then
begin
if f2 <> '' then o2 := o2 + ', ' + f2;
if m2 <> '' then o2 := o2 + ' ' + m2;
if f2 <> '' then
o2 := o2 + ', ' + f2;
if m2 <> '' then
o2 := o2 + ' ' + m2;
item.AddPair('Officer2', o2);
end;
......@@ -507,13 +563,25 @@ begin
end;
end;
Result.AddPair('count', TJSONNumber.Create(data.Count));
Result.AddPair('returned', TJSONNumber.Create(data.Count));
Result.AddPair(
'count',
TJSONNumber.Create(data.Count)
);
Result.AddPair(
'returned',
TJSONNumber.Create(data.Count)
);
Result.AddPair('data', data);
except
data.Free;
Logger.Log(3, '---TApiService.GetUnitList End (error)');
raise EXDataHttpException.Create(500, 'Failed to load units list');
Logger.Log(
3,
'---TApiService.GetUnitList End (error)'
);
raise EXDataHttpException.Create(
500,
'Failed to load units list'
);
end;
Logger.Log(3, '---TApiService.GetUnitList End');
......
......@@ -44,20 +44,18 @@ object FViewComplaints: TFViewComplaints
ItemTemplate =
'<div class="list-section-header small fw-semibold bg-secondary t' +
'ext-white rounded-1 px-2 mb-1">(%DistrictHeader%)</div><div clas' +
's="card border shadow-sm" style="--bs-card-bg:(%StatusColor%);--' +
'bs-card-color:(%StatusTextColor%);"><div class="card-body py-2 p' +
'x-3 d-flex gap-2"><div class="flex-grow-1"><div class="fw-bold t' +
'ext-uppercase small">(%Priority%): (%DispatchCodeDesc%)</div><di' +
'v class="small">(%Address%)</div><div class="small d-none compla' +
'int-business" data-business="(%Business%)">(%Business%)</div><di' +
'v class="small text-opacity-75">(%Complaint%): (%Status%)&nbsp;&' +
'nbsp;(%AgencyLine%)</div><div class="small text-opacity-75">(%Da' +
'teReported%)</div></div><div class="d-flex flex-column justify-c' +
'ontent-center gap-1"><button type="button" class="btn btn-primar' +
'y btn-sm complaint-details-btn" data-id="(%ComplaintId%)">Detail' +
's</button><button type="button" class="btn btn-primary btn-sm bt' +
'n-complaint-map" data-id="(%ComplaintId%)">Map</button></div></d' +
'iv></div>'
's="card border shadow-sm"><div class="card-body py-2 px-3 d-flex' +
' gap-2"><div class="flex-grow-1"><div class="fw-bold text-upperc' +
'ase small">(%Priority%): (%DispatchCodeDesc%)</div><div class="s' +
'mall">(%Address%)</div><div class="small d-none complaint-busine' +
'ss" data-business="(%Business%)">(%Business%)</div><div class="s' +
'mall text-opacity-75">(%Complaint%): (%Status%)&nbsp;&nbsp;(%Age' +
'ncyLine%)</div><div class="small text-opacity-75">(%DateReported' +
'%)</div></div><div class="d-flex flex-column justify-content-cen' +
'ter gap-1"><button type="button" class="btn btn-primary btn-sm c' +
'omplaint-details-btn" data-id="(%ComplaintId%)">Details</button>' +
'<button type="button" class="btn btn-primary btn-sm btn-complain' +
't-map" data-id="(%ComplaintId%)">Map</button></div></div></div>'
ListSource = wdsComplaints
end
object xdwcComplaints: TXDataWebClient
......
<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 -->
<div class="flex-grow-1 overflow-auto" style="min-height:0;">
<div class="container-fluid mt-2">
......
......@@ -53,10 +53,7 @@
</button>
</div>
<div class="card-footer text-muted small">
Please use your lems username &amp; password to login.<br><br>
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>
Please use your lems username &amp; password to login.
</div>
</div>
</div>
......
......@@ -43,19 +43,19 @@ object FViewUnits: TFViewUnits
'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-' +
'flex gap-2"> <div class="flex-grow-1"> <div class="fw-bo' +
'ld text-uppercase small">(%UnitName%)&nbsp;-&nbsp;(%Status%)</di' +
'v> <div class="small text-body-secondary mb-1">(%Location%)' +
'</div> <div class="small">(%CallType%)</div> <hr class' +
'="unit-divider my-1" style="width: 80px; margin-left: 0" /> ' +
' <div class="small officer1">(%Officer1%)</div> <div class=' +
'"small officer2">(%Officer2%)</div> </div> <div class="d-f' +
'lex flex-column justify-content-center gap-1"> <button type' +
'="button" class="btn btn-primary btn-sm btn-unit-details" data-u' +
'nitid="(%UnitId%)">Details</button> <button type="button" ' +
' class="btn btn-sm btn-unit-map (%MapButtonClass%)" ' +
'data-unitid="(%UnitId%)" data-canmap="(%CanShowMap%)" ' +
' title="(%MapButtonTitle%)" (%MapButtonDisabled%)> Ma' +
'p</button> </div> </div></div>'
'ld text-uppercase small">(%UnitName%)(%ComplaintHeader%)&nbsp;-&' +
'nbsp;(%Status%)</div> <div class="small text-body-secondary' +
' mb-1">(%Location%)</div> <div class="small">(%CallType%)</' +
'div> <hr class="unit-divider my-1" style="width: 80px; marg' +
'in-left: 0" /> <div class="small officer1">(%Officer1%)</di' +
'v> <div class="small officer2">(%Officer2%)</div> </div>' +
' <div class="d-flex flex-column justify-content-center gap-1"' +
'> <button type="button" class="btn btn-primary btn-sm btn-u' +
'nit-details" data-unitid="(%UnitId%)">Details</button> <but' +
'ton type="button" class="btn btn-sm btn-unit-map (%MapBut' +
'tonClass%)" data-unitid="(%UnitId%)" data-canmap="' +
'(%CanShowMap%)" title="(%MapButtonTitle%)" (%MapBu' +
'ttonDisabled%)> Map</button> </div> </div></div>'
ListSource = wdsUnits
end
object wdsUnits: TWebDataSource
......@@ -66,7 +66,7 @@ object FViewUnits: TFViewUnits
end
object xdwdsUnits: TXDataWebDataSet
Connection = DMConnection.ApiConnection
Left = 260
Left = 262
Top = 412
object xdwdsUnitsAgencyHeader: TStringField
FieldName = 'AgencyHeader'
......@@ -115,6 +115,10 @@ object FViewUnits: TFViewUnits
object xdwdsUnitsMapButtonTitle: TStringField
FieldName = 'MapButtonTitle'
end
object xdwdsUnitsComplaintHeader: TStringField
FieldName = 'ComplaintHeader'
Size = 40
end
end
object xdwcUnits: TXDataWebClient
Connection = DMConnection.ApiConnection
......
<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 -->
<div class="flex-grow-1 overflow-auto" style="min-height:0;">
<div class="container-fluid mt-2">
......
......@@ -32,6 +32,7 @@ type
xdwdsUnitsMapButtonClass: TStringField;
xdwdsUnitsMapButtonDisabled: TStringField;
xdwdsUnitsMapButtonTitle: TStringField;
xdwdsUnitsComplaintHeader: TStringField;
procedure WebFormCreate(Sender: TObject);
private
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