Commit 80ed6f36 by emsys

Merge branch 'master' into websockets

parents 376416dd 63541f7e
...@@ -9,17 +9,19 @@ emiMobileServer/doc/ ...@@ -9,17 +9,19 @@ emiMobileServer/doc/
emiMobileServer/Win32/ emiMobileServer/Win32/
emiMobileServer/*.log emiMobileServer/*.log
emiMobileServer/*.txt emiMobileServer/*.txt
emiMobileServer/bin/logs/
emiMobileServer/bin/static/
emiMobileServer/Source/__history emiMobileServer/Source/__history
emiMobileServer/Source/__recovery/ emiMobileServer/Source/__recovery/
emiMobileServer/logs/*
*.local *.local
*.exe *.exe
*.identcache *.identcache
*.res *.res
*.tvsconfig *.tvsconfig
*.dxsettings *.dxsettings
*.zip *.zip
*.log
*.dll
...@@ -590,17 +590,66 @@ object ApiDatabaseModule: TApiDatabaseModule ...@@ -590,17 +590,66 @@ object ApiDatabaseModule: TApiDatabaseModule
' a.STRPREFIX,' ' a.STRPREFIX,'
' a.STRNAME,' ' a.STRNAME,'
' a.STRSUFFIX,' ' a.STRSUFFIX,'
' a.CITY' ' a.CITY,'
' 0 as status'
'FROM COMPLAINT_ACTIVE ca' 'FROM COMPLAINT_ACTIVE ca'
'JOIN COMPLAINT_TIMES ct' 'JOIN COMPLAINT_TIMES ct'
' ON ca.COMPLAINTID = ct.COMPLAINTID' ' ON ca.COMPLAINTID = ct.COMPLAINTID'
'LEFT JOIN CD_DISPATCHCODES cdc' 'LEFT JOIN CD_DISPATCHCODES cdc'
' ON ca.DISPATCHCODE = cdc.CODE' ' ON ca.DISPATCHCODE = cdc.CODE'
'JOIN CD_DISTRICT cd' 'LEFT JOIN CD_DISTRICT cd'
' ON cd.AGENCYCODE = ca.DISPATCHDISTRICT'
'LEFT JOIN ADDRESS a'
' ON ca.ADDRESSID = a.ADDRESSID'
'WHERE ca.COMPLAINTID = :COMPLAINTID'
''
'union'
''
'SELECT'
' ca.COMPLAINTID,'
' ca.CFSID,'
' ca.COMPLAINT,'
' ca.PRIORITY,'
' ca.DISPATCHCODE,'
' cdc.CODE_DESC AS DISPATCH_CODE_DESC,'
' cd.CODE_DESC AS DISPATCHDISTRICT,'
' ca.ADDRESS,'
' ca.BUSINESS,'
' ct.DATEREPORTED,'
' ct.DATERECEIVED,'
' ct.DATEDISPATCHED,'
' ct.DATERESPONDED,'
' ct.DATEARRIVED,'
' ct.DATECLEARED,'
''
' -- For enabling/disabling buttons (disable when = '#39'-1'#39')'
' ca.HISTORY,'
' ca.CONTACTS,'
' ca.WARNINGS,'
''
' -- For Contacts + Warnings lookups'
' ca.ADDRESSID,'
' ca.AGENCY,'
''
' -- For History matching (address parts)'
' a.STRNUMBER,'
' a.STRHNUMBER,'
' a.STRPREFIX,'
' a.STRNAME,'
' a.STRSUFFIX,'
' a.CITY,'
' 1 as status'
'FROM COMPLAINT_ARCHIVE ca'
'JOIN COMPLAINT_TIMES ct'
' ON ca.COMPLAINTID = ct.COMPLAINTID'
'LEFT JOIN CD_DISPATCHCODES cdc'
' ON ca.DISPATCHCODE = cdc.CODE'
'LEFT JOIN CD_DISTRICT cd'
' ON cd.AGENCYCODE = ca.DISPATCHDISTRICT' ' ON cd.AGENCYCODE = ca.DISPATCHDISTRICT'
'LEFT JOIN ADDRESS a' 'LEFT JOIN ADDRESS a'
' ON ca.ADDRESSID = a.ADDRESSID' ' ON ca.ADDRESSID = a.ADDRESSID'
'WHERE ca.COMPLAINTID = :COMPLAINTID;') 'WHERE ca.COMPLAINTID = :COMPLAINTID;'
'')
ReadOnly = True ReadOnly = True
Left = 80 Left = 80
Top = 302 Top = 302
...@@ -713,6 +762,10 @@ object ApiDatabaseModule: TApiDatabaseModule ...@@ -713,6 +762,10 @@ object ApiDatabaseModule: TApiDatabaseModule
FieldName = 'BUSINESS' FieldName = 'BUSINESS'
Size = 35 Size = 35
end end
object uqComplaintDetailsSTATUS: TFloatField
FieldName = 'STATUS'
ReadOnly = True
end
end end
object ucENTCAD: TUniConnection object ucENTCAD: TUniConnection
ProviderName = 'Oracle' ProviderName = 'Oracle'
...@@ -807,8 +860,10 @@ object ApiDatabaseModule: TApiDatabaseModule ...@@ -807,8 +860,10 @@ object ApiDatabaseModule: TApiDatabaseModule
Calculated = True Calculated = True
end end
object uqMapComplaintspngName: TStringField object uqMapComplaintspngName: TStringField
DisplayWidth = 100
FieldKind = fkCalculated FieldKind = fkCalculated
FieldName = 'pngName' FieldName = 'pngName'
Size = 100
Calculated = True Calculated = True
end end
object uqMapComplaintsBUSINESS: TStringField object uqMapComplaintsBUSINESS: TStringField
...@@ -908,6 +963,7 @@ object ApiDatabaseModule: TApiDatabaseModule ...@@ -908,6 +963,7 @@ object ApiDatabaseModule: TApiDatabaseModule
' where ca.complaintid = :COMPLAINTID' ' where ca.complaintid = :COMPLAINTID'
')' ')'
'select' 'select'
' c.complaintid,'
' c.complaint,' ' c.complaint,'
' c.apartment,' ' c.apartment,'
' c.datereported,' ' c.datereported,'
...@@ -929,14 +985,39 @@ object ApiDatabaseModule: TApiDatabaseModule ...@@ -929,14 +985,39 @@ object ApiDatabaseModule: TApiDatabaseModule
'and (ctx.city is null or c.city = ctx.city)' 'and (ctx.city is null or c.city = ctx.city)'
'order by c.datereported desc') 'order by c.datereported desc')
ReadOnly = True ReadOnly = True
Left = 328 Left = 330
Top = 72 Top = 72
ParamData = < ParamData = <
item item
DataType = ftUnknown DataType = ftUnknown
Name = 'COMPLAINTID' Name = 'COMPLAINTID'
Value = nil Value = Null
end> end>
object uqComplaintHistoryCOMPLAINTID: TFloatField
FieldName = 'COMPLAINTID'
Required = True
end
object uqComplaintHistoryCOMPLAINT: TStringField
FieldName = 'COMPLAINT'
Size = 10
end
object uqComplaintHistoryAPARTMENT: TStringField
FieldName = 'APARTMENT'
Size = 6
end
object uqComplaintHistoryDATEREPORTED: TDateTimeField
FieldName = 'DATEREPORTED'
end
object uqComplaintHistoryDPRIORITY: TStringField
FieldName = 'DPRIORITY'
ReadOnly = True
Size = 120
end
object uqComplaintHistoryDCALLTYPE: TStringField
FieldName = 'DCALLTYPE'
ReadOnly = True
Size = 60
end
end end
object uqComplaintContacts: TUniQuery object uqComplaintContacts: TUniQuery
Connection = ucENTCAD Connection = ucENTCAD
......
...@@ -172,6 +172,13 @@ type ...@@ -172,6 +172,13 @@ type
uqMapUnitsDIS_UNITID: TFloatField; uqMapUnitsDIS_UNITID: TFloatField;
uqMapComplaintsBUSINESS: TStringField; uqMapComplaintsBUSINESS: TStringField;
uqComplaintDetailsBUSINESS: TStringField; uqComplaintDetailsBUSINESS: TStringField;
uqComplaintDetailsSTATUS: TFloatField;
uqComplaintHistoryCOMPLAINTID: TFloatField;
uqComplaintHistoryCOMPLAINT: TStringField;
uqComplaintHistoryAPARTMENT: TStringField;
uqComplaintHistoryDATEREPORTED: TDateTimeField;
uqComplaintHistoryDPRIORITY: TStringField;
uqComplaintHistoryDCALLTYPE: TStringField;
procedure uqComplaintListCalcFields(DataSet: TDataSet); procedure uqComplaintListCalcFields(DataSet: TDataSet);
procedure uqMapComplaintsCalcFields(DataSet: TDataSet); procedure uqMapComplaintsCalcFields(DataSet: TDataSet);
private private
......
...@@ -22,6 +22,7 @@ type ...@@ -22,6 +22,7 @@ type
[HttpGet] function GetComplaintMap: TJSONObject; [HttpGet] function GetComplaintMap: TJSONObject;
[HttpGet] function GetUnitMap: TJSONObject; [HttpGet] function GetUnitMap: TJSONObject;
[HttpGet] function GetComplaintDetails(const ComplaintId: string): TJSONObject; [HttpGet] function GetComplaintDetails(const ComplaintId: string): TJSONObject;
[HttpGet] function GetComplaintArchiveDetails(const ComplaintId: string): TJSONObject;
[HttpGet] function GetComplaintMemos(const CfsId: string): TJSONObject; [HttpGet] function GetComplaintMemos(const CfsId: string): TJSONObject;
[HttpGet] function GetComplaintHistory(const ComplaintId: string): TJSONObject; [HttpGet] function GetComplaintHistory(const ComplaintId: string): TJSONObject;
[HttpGet] function GetComplaintContacts(const ComplaintId: string): TJSONObject; [HttpGet] function GetComplaintContacts(const ComplaintId: string): TJSONObject;
......
...@@ -24,6 +24,7 @@ type ...@@ -24,6 +24,7 @@ type
function GetComplaintMap: TJSONObject; function GetComplaintMap: TJSONObject;
function GetUnitMap: TJSONObject; function GetUnitMap: TJSONObject;
function GetComplaintDetails(const ComplaintId: string): TJSONObject; function GetComplaintDetails(const ComplaintId: string): TJSONObject;
function GetComplaintArchiveDetails(const ComplaintId: string): TJSONObject;
function GetComplaintHistory(const ComplaintId: string): TJSONObject; function GetComplaintHistory(const ComplaintId: string): TJSONObject;
function GetComplaintContacts(const ComplaintId: string): TJSONObject; function GetComplaintContacts(const ComplaintId: string): TJSONObject;
function GetComplaintWarnings(const ComplaintId: string): TJSONObject; function GetComplaintWarnings(const ComplaintId: string): TJSONObject;
...@@ -443,7 +444,6 @@ begin ...@@ -443,7 +444,6 @@ begin
end; end;
function TApiService.GetComplaintDetails(const ComplaintId: string): TJSONObject; function TApiService.GetComplaintDetails(const ComplaintId: string): TJSONObject;
var var
obj: TJSONObject; obj: TJSONObject;
...@@ -525,6 +525,91 @@ begin ...@@ -525,6 +525,91 @@ begin
end; end;
function TApiService.GetComplaintArchiveDetails(const ComplaintId: string): TJSONObject;
var
obj: TJSONObject;
begin
Logger.Log(3,'---TApiService.GetComplaintArchiveDetails initiated: '+ComplaintId);
Result := TJSONObject.Create;
TXDataOperationContext.Current.Handler.ManagedObjects.Add(Result);
try
with ApiDB.uqComplaintDetails do
begin
ParamByName('COMPLAINTID').AsString := ComplaintId;
Open;
try
if Eof then raise EXDataHttpException.Create(404,'Complaint not found');
if not Locate('STATUS', 1, []) then
raise EXDataHttpException.Create(404,'Complaint archive not found');
obj := TJSONObject.Create;
TXDataOperationContext.Current.Handler.ManagedObjects.Add(obj);
obj.AddPair('ComplaintId', ApiDB.uqComplaintDetailsCOMPLAINTID.AsString);
obj.AddPair('CFSId', ApiDB.uqComplaintDetailsCFSID.AsString);
obj.AddPair('Complaint', ApiDB.uqComplaintDetailsCOMPLAINT.AsString);
obj.AddPair('Priority', ApiDB.uqComplaintDetailsPRIORITY.AsString);
obj.AddPair('DispatchCode', ApiDB.uqComplaintDetailsDISPATCHCODE.AsString);
obj.AddPair('DispatchCodeDesc', ApiDB.uqComplaintDetailsDISPATCH_CODE_DESC.AsString);
obj.AddPair('DispatchDistrict', ApiDB.uqComplaintDetailsDISPATCHDISTRICT.AsString);
obj.AddPair('Address', ApiDB.uqComplaintDetailsADDRESS.AsString);
obj.AddPair('Business', ApiDB.uqComplaintDetailsBUSINESS.AsString);
obj.AddPair('History', ApiDB.uqComplaintDetailsHISTORY.AsString);
obj.AddPair('Contacts', ApiDB.uqComplaintDetailsCONTACTS.AsString);
obj.AddPair('Warnings', ApiDB.uqComplaintDetailsWARNINGS.AsString);
if ApiDB.uqComplaintDetailsDATEREPORTED.IsNull then
obj.AddPair('DateReported', '')
else
obj.AddPair('DateReported', FormatDateTime('yyyy-mm-dd hh:nn:ss', ApiDB.uqComplaintDetailsDATEREPORTED.AsDateTime));
if ApiDB.uqComplaintDetailsDATERECEIVED.IsNull then
obj.AddPair('DateReceived', '')
else
obj.AddPair('DateReceived', FormatDateTime('yyyy-mm-dd hh:nn:ss', ApiDB.uqComplaintDetailsDATERECEIVED.AsDateTime));
if ApiDB.uqComplaintDetailsDATEDISPATCHED.IsNull then
obj.AddPair('DateDispatched', '')
else
obj.AddPair('DateDispatched', FormatDateTime('yyyy-mm-dd hh:nn:ss', ApiDB.uqComplaintDetailsDATEDISPATCHED.AsDateTime));
if ApiDB.uqComplaintDetailsDATERESPONDED.IsNull then
obj.AddPair('DateResponded', '')
else
obj.AddPair('DateResponded', FormatDateTime('yyyy-mm-dd hh:nn:ss', ApiDB.uqComplaintDetailsDATERESPONDED.AsDateTime));
if ApiDB.uqComplaintDetailsDATEARRIVED.IsNull then
obj.AddPair('DateArrived', '')
else
obj.AddPair('DateArrived', FormatDateTime('yyyy-mm-dd hh:nn:ss', ApiDB.uqComplaintDetailsDATEARRIVED.AsDateTime));
if ApiDB.uqComplaintDetailsDATECLEARED.IsNull then
obj.AddPair('DateCleared', '')
else
obj.AddPair('DateCleared', FormatDateTime('yyyy-mm-dd hh:nn:ss', ApiDB.uqComplaintDetailsDATECLEARED.AsDateTime));
Result.AddPair('data', obj);
finally
Close;
end;
end;
except
on E: EXDataHttpException do
begin
Logger.Log(3,'---TApiService.GetComplaintArchiveDetails not found');
raise;
end;
on E: Exception do
begin
Logger.Log(3,'---TApiService.GetComplaintArchiveDetails error: '+E.Message);
raise EXDataHttpException.Create(500,'Failed to load complaint archive details');
end;
end;
Logger.Log(3,'---TApiService.GetComplaintArchiveDetails End');
end;
function TApiService.GetComplaintMemos(const CfsId: string): TJSONObject; function TApiService.GetComplaintMemos(const CfsId: string): TJSONObject;
var var
data: TJSONArray; data: TJSONArray;
...@@ -612,16 +697,17 @@ begin ...@@ -612,16 +697,17 @@ begin
rowObj := TJSONObject.Create; rowObj := TJSONObject.Create;
dataArr.AddElement(rowObj); dataArr.AddElement(rowObj);
rowObj.AddPair('Complaint', FieldByName('COMPLAINT').AsString); rowObj.AddPair('ComplaintId', ApiDB.uqComplaintHistoryCOMPLAINTID.AsString);
rowObj.AddPair('Apartment', FieldByName('APARTMENT').AsString); rowObj.AddPair('Complaint', ApiDB.uqComplaintHistoryCOMPLAINT.AsString);
rowObj.AddPair('Apartment', ApiDB.uqComplaintHistoryAPARTMENT.AsString);
if FieldByName('DATEREPORTED').IsNull then if ApiDB.uqComplaintHistoryDATEREPORTED.IsNull then
rowObj.AddPair('DateReported', '') rowObj.AddPair('DateReported', '')
else else
rowObj.AddPair('DateReported', FormatDateTime('yyyy-mm-dd', FieldByName('DATEREPORTED').AsDateTime)); rowObj.AddPair('DateReported', FormatDateTime('yyyy-mm-dd', ApiDB.uqComplaintHistoryDATEREPORTED.AsDateTime));
rowObj.AddPair('DPriority', FieldByName('DPRIORITY').AsString); rowObj.AddPair('DPriority', ApiDB.uqComplaintHistoryDPRIORITY.AsString);
rowObj.AddPair('DCallType', FieldByName('DCALLTYPE').AsString); rowObj.AddPair('DCallType', ApiDB.uqComplaintHistoryDCALLTYPE.AsString);
Inc(returnedCount); Inc(returnedCount);
Next; Next;
......
...@@ -3,7 +3,7 @@ unit Common.Config; ...@@ -3,7 +3,7 @@ unit Common.Config;
interface interface
const const
defaultServerUrl = 'http://localhost:2009/emiMobile/'; defaultServerUrl = 'http://0.0.0.0:2009/emiMobile/';
type type
TServerConfig = class TServerConfig = class
......
[Settings] [Settings]
LogFileNum=610 LogFileNum=652
webClientVersion=0.1.0 webClientVersion=0.1.0
...@@ -186,6 +186,6 @@ begin ...@@ -186,6 +186,6 @@ begin
iniFile.Free; iniFile.Free;
end; end;
Logger.AddAppender(TMemoLogAppender.Create( memoLogLevel, FMain.memoinfo )); Logger.AddAppender(TMemoLogAppender.Create( memoLogLevel, FMain.memoinfo ));
Logger.AddAppender(TFileLogAppender.Create( fileLogLevel, 'webPoliceReports' )); Logger.AddAppender(TFileLogAppender.Create( fileLogLevel, 'emiMobileServer' ));
Application.Run; Application.Run;
end. end.
...@@ -104,7 +104,7 @@ ...@@ -104,7 +104,7 @@
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode> <AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo> <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Locale>1033</VerInfo_Locale> <VerInfo_Locale>1033</VerInfo_Locale>
<DCC_ExeOutput>.</DCC_ExeOutput> <DCC_ExeOutput>.\bin</DCC_ExeOutput>
<VerInfo_MajorVer>0</VerInfo_MajorVer> <VerInfo_MajorVer>0</VerInfo_MajorVer>
<VerInfo_MinorVer>9</VerInfo_MinorVer> <VerInfo_MinorVer>9</VerInfo_MinorVer>
<VerInfo_Release>3</VerInfo_Release> <VerInfo_Release>3</VerInfo_Release>
...@@ -196,12 +196,7 @@ ...@@ -196,12 +196,7 @@
<Source> <Source>
<Source Name="MainSource">emiMobileServer.dpr</Source> <Source Name="MainSource">emiMobileServer.dpr</Source>
</Source> </Source>
<Excluded_Packages> <Excluded_Packages/>
<Excluded_Packages Name="$(BDSBIN)\bcboffice2k290.bpl">Embarcadero C++Builder Office 2000 Servers Package</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\bcbofficexp290.bpl">Embarcadero C++Builder Office XP Servers Package</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dcloffice2k290.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dclofficexp290.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages>
</Excluded_Packages>
</Delphi.Personality> </Delphi.Personality>
<Deployment Version="5"> <Deployment Version="5">
<DeployFile LocalName="emiMobileServer.exe" Configuration="Debug" Class="ProjectOutput"> <DeployFile LocalName="emiMobileServer.exe" Configuration="Debug" Class="ProjectOutput">
......
{
"type": "FeatureCollection",
"name": "BFDDistrict",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{ "type": "Feature", "properties": { "SBE4_ID": 0, "NAME": "District A", "FROMLEFT": 0, "TOLEFT": 0, "FROMRIGHT": 0, "TORIGHT": 0, "DIRECTION": null, "STREET": null, "ST_TYPE": null, "ST_PREFIX": null, "ST_SUFFIX": null, "CITY_LEFT": null, "CITY_RIGHT": null, "LO_X_PRE": null, "LO_X_NAME": null, "LO_X_TYPE": null, "LO_X_SUF": null, "HI_X_PRE": null, "HI_X_NAME": null, "HI_X_TYPE": null, "HI_X_SUF": null, "LHS": null, "RHS": null, "BDY_LEFT": null, "BDY_RIGHT": null, "ST_CODE": null, "RECNUM_L": 0, "RECNUM_R": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -78.838580621137581, 42.832640624242444 ], [ -78.838579379349227, 42.832637828223341 ], [ -78.853769883224203, 42.832256243942119 ], [ -78.85371958445721, 42.832194871720155 ], [ -78.853733424580213, 42.83219689697404 ], [ -78.860055694936989, 42.831634192917498 ], [ -78.86013734228284, 42.832269841506786 ], [ -78.859896026339129, 42.832680803438883 ], [ -78.860331112959102, 42.833777534545568 ], [ -78.86034975462735, 42.834904906086862 ], [ -78.85768545019738, 42.835848144550688 ], [ -78.858114869151507, 42.837605053389701 ], [ -78.857536532421037, 42.838545513856914 ], [ -78.858096352651074, 42.839687337785485 ], [ -78.861864583480241, 42.838698386233297 ], [ -78.86205975340269, 42.838902003038619 ], [ -78.862692380919711, 42.838804946201897 ], [ -78.862728132922896, 42.839242703902777 ], [ -78.859568800903887, 42.840181676978965 ], [ -78.859407395065432, 42.841296969378085 ], [ -78.865712578238899, 42.852676330854607 ], [ -78.87162174026551, 42.851292456357271 ], [ -78.872016282892517, 42.851882361006176 ], [ -78.872097013700895, 42.852401028660957 ], [ -78.868731884242095, 42.853274149621917 ], [ -78.869204890923257, 42.85390708456859 ], [ -78.872490649359548, 42.852817958505078 ], [ -78.876741180919694, 42.858996499122377 ], [ -78.874396356987731, 42.859770389677344 ], [ -78.873619753263739, 42.859660821705866 ], [ -78.87399285072668, 42.859861633865819 ], [ -78.874543180109029, 42.860234969333924 ], [ -78.875014936030652, 42.860593987099257 ], [ -78.8750512940248, 42.85997418590776 ], [ -78.876811140388725, 42.859277953228293 ], [ -78.882510814894758, 42.867189761467436 ], [ -78.878932430206248, 42.868654634149287 ], [ -78.879480450569972, 42.869349562574541 ], [ -78.883495141721355, 42.868167220890896 ], [ -78.883750388309764, 42.868756350747567 ], [ -78.880095121304095, 42.870078422117274 ], [ -78.880646408234384, 42.870624672382412 ], [ -78.884421489903062, 42.869274555253369 ], [ -78.890271939124617, 42.87558582502659 ], [ -78.887965695107951, 42.876802504379924 ], [ -78.890098621163943, 42.876205913975724 ], [ -78.890590430583615, 42.876593705838609 ], [ -78.890916063781987, 42.877700346284939 ], [ -78.883205768958902, 42.877189774239035 ], [ -78.882993797488041, 42.877925279047915 ], [ -78.882327302445603, 42.877883805165943 ], [ -78.880207061295906, 42.877067857368601 ], [ -78.87805895026365, 42.874522552122691 ], [ -78.877556716095029, 42.874857610217347 ], [ -78.875958954885036, 42.873857441685928 ], [ -78.875159693178475, 42.873656461201733 ], [ -78.873157675465777, 42.873156643168144 ], [ -78.87265780839121, 42.873155108530398 ], [ -78.872054850493441, 42.872990241069282 ], [ -78.871559627886398, 42.872856077792747 ], [ -78.871258478968869, 42.873855583344678 ], [ -78.870956750411864, 42.874756419191691 ], [ -78.87055656243021, 42.876156833702851 ], [ -78.870258536657332, 42.877056203810682 ], [ -78.870259928280817, 42.877356655895099 ], [ -78.869957241093033, 42.878057077538543 ], [ -78.86975904878048, 42.87875723695614 ], [ -78.869556577509613, 42.879355910320399 ], [ -78.869387780475122, 42.879951837575966 ], [ -78.869358376966289, 42.88005615122713 ], [ -78.869159247170458, 42.880555980676171 ], [ -78.86905751475463, 42.88115722766284 ], [ -78.86885745593024, 42.881456810125457 ], [ -78.864656316400058, 42.880655101515977 ], [ -78.859757939693296, 42.879956310487458 ], [ -78.857356707881706, 42.879457262118258 ], [ -78.854257382550315, 42.87885554952485 ], [ -78.851756334480143, 42.8785568410702 ], [ -78.850856794926287, 42.878457395030267 ], [ -78.848757851920865, 42.877957459459736 ], [ -78.847059027846299, 42.877656785921261 ], [ -78.84545768790359, 42.877457442727305 ], [ -78.8440576714939, 42.87725761889191 ], [ -78.842556244378372, 42.876857758658176 ], [ -78.841757388131555, 42.876755214333393 ], [ -78.841556799502669, 42.876955998075758 ], [ -78.839957561167893, 42.87815595557732 ], [ -78.839358996383396, 42.878656627987034 ], [ -78.839156194113883, 42.879255275929467 ], [ -78.83835691774442, 42.879056837484171 ], [ -78.837456569994913, 42.878756929372337 ], [ -78.836758064766627, 42.878555457288982 ], [ -78.835756447512608, 42.878157034814144 ], [ -78.834855713376044, 42.87775563809948 ], [ -78.833955401951215, 42.877455839483304 ], [ -78.833058755274735, 42.877155998336157 ], [ -78.832856931977261, 42.877057576053375 ], [ -78.829257334160488, 42.878157567817688 ], [ -78.828657889567353, 42.878457937354909 ], [ -78.8267574133816, 42.880956240808032 ], [ -78.825555243453209, 42.882657282618005 ], [ -78.824056066742116, 42.884759488306194 ], [ -78.816657238717056, 42.884857093087646 ], [ -78.816056162884067, 42.884756847493165 ], [ -78.815257702748966, 42.884755696219727 ], [ -78.814156862880751, 42.884755313966757 ], [ -78.809555878954654, 42.884657430116576 ], [ -78.808555783918976, 42.884656712606812 ], [ -78.807556279992795, 42.884757426604551 ], [ -78.806257466997707, 42.884655722425009 ], [ -78.805055921622497, 42.884655256607296 ], [ -78.803757485744924, 42.88465776349981 ], [ -78.803455133300602, 42.884655628692954 ], [ -78.802455159595638, 42.884657546665778 ], [ -78.801354855037332, 42.884755737814196 ], [ -78.800855880420585, 42.885055770186042 ], [ -78.800455932255147, 42.884856198273617 ], [ -78.799555682779072, 42.884556101935864 ], [ -78.799654572990747, 42.877657757946196 ], [ -78.799856701247919, 42.874655534437835 ], [ -78.799857449623246, 42.871656406417138 ], [ -78.799635042492156, 42.871657704791218 ], [ -78.799608714716484, 42.871083266097898 ], [ -78.799283115590782, 42.871049664274494 ], [ -78.799454480449356, 42.868457790234544 ], [ -78.799407204649867, 42.867320014669311 ], [ -78.800073311118354, 42.866957357716529 ], [ -78.800044716534117, 42.864412395692526 ], [ -78.800371824261092, 42.864428623694991 ], [ -78.800013598039598, 42.864409573490128 ], [ -78.799945757015792, 42.86264032885358 ], [ -78.799955478268046, 42.861355618675994 ], [ -78.800087783614686, 42.854413335610161 ], [ -78.800402549685344, 42.847371835462368 ], [ -78.800465911964508, 42.845722712118793 ], [ -78.799110043197146, 42.84636759509597 ], [ -78.79856968562261, 42.845972008220215 ], [ -78.796901482216654, 42.845326143395887 ], [ -78.798679696151751, 42.842891687094514 ], [ -78.79742912862821, 42.842044107335376 ], [ -78.796593525881221, 42.841252458318557 ], [ -78.796593277967546, 42.841180348947155 ], [ -78.79561273987504, 42.841001923524573 ], [ -78.796653480378495, 42.838356812365419 ], [ -78.7973547812921, 42.83845708334983 ], [ -78.798455419987192, 42.838658042838404 ], [ -78.799854997104532, 42.83905596076432 ], [ -78.800114269943663, 42.839298827327589 ], [ -78.800121452152496, 42.841353971681812 ], [ -78.800954430165106, 42.841352391840893 ], [ -78.80105438597424, 42.839756154286384 ], [ -78.800954249264223, 42.838856343380748 ], [ -78.800955176875547, 42.838057919673417 ], [ -78.801056798578884, 42.837256505681758 ], [ -78.800956591162702, 42.836356612199886 ], [ -78.800957162531574, 42.835456609345087 ], [ -78.800856332175471, 42.834356493668217 ], [ -78.800856905099536, 42.833456490495223 ], [ -78.800854452246867, 42.832756825752362 ], [ -78.800854678804555, 42.831757987354088 ], [ -78.801656174913674, 42.831756462252542 ], [ -78.805656489050051, 42.831757053110763 ], [ -78.807255799586315, 42.831756626304951 ], [ -78.808654312733736, 42.831858151928195 ], [ -78.809556107062647, 42.831757511090629 ], [ -78.812457260200006, 42.83195756431401 ], [ -78.813556600253534, 42.831856606340295 ], [ -78.814854467616954, 42.831958231069144 ], [ -78.815254119976032, 42.832157755265499 ], [ -78.815357794453462, 42.831957212445182 ], [ -78.817654269166127, 42.831958024622892 ], [ -78.818556087729135, 42.831857422619095 ], [ -78.819555557802161, 42.831956835203073 ], [ -78.820756081390527, 42.831957151448407 ], [ -78.82385750949274, 42.831857222247173 ], [ -78.823955379359887, 42.831157347180735 ], [ -78.823956394179447, 42.830457675485583 ], [ -78.823857834211026, 42.829055689472924 ], [ -78.8239569963159, 42.82775761128412 ], [ -78.823956878334343, 42.826756138706585 ], [ -78.824270151467147, 42.826743955649128 ], [ -78.825254871013783, 42.826740809659682 ], [ -78.832859733663142, 42.826702349425297 ], [ -78.832970726887567, 42.825928159785164 ], [ -78.833854758436914, 42.825955589258797 ], [ -78.837158375362606, 42.825915168567825 ], [ -78.837726797591174, 42.829447708027431 ], [ -78.838478504947247, 42.832640028620709 ], [ -78.838580621137581, 42.832640624242444 ] ] ] ] } },
{ "type": "Feature", "properties": { "SBE4_ID": 1, "NAME": "District E", "FROMLEFT": 0, "TOLEFT": 0, "FROMRIGHT": 0, "TORIGHT": 0, "DIRECTION": null, "STREET": null, "ST_TYPE": null, "ST_PREFIX": null, "ST_SUFFIX": null, "CITY_LEFT": null, "CITY_RIGHT": null, "LO_X_PRE": null, "LO_X_NAME": null, "LO_X_TYPE": null, "LO_X_SUF": null, "HI_X_PRE": null, "HI_X_NAME": null, "HI_X_TYPE": null, "HI_X_SUF": null, "LHS": null, "RHS": null, "BDY_LEFT": null, "BDY_RIGHT": null, "ST_CODE": null, "RECNUM_L": 0, "RECNUM_R": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -78.83135838731252, 42.946055876655677 ], [ -78.830457761013733, 42.946856231049658 ], [ -78.829957986127056, 42.947054948618003 ], [ -78.836858858528231, 42.958456982912189 ], [ -78.83595805615208, 42.9583548178936 ], [ -78.831759186240831, 42.95835580296653 ], [ -78.83115725851971, 42.958255557825574 ], [ -78.829958131354147, 42.958255431111702 ], [ -78.828856385827848, 42.958356577970008 ], [ -78.82765685495157, 42.958254878182295 ], [ -78.826158798016664, 42.958255266970681 ], [ -78.825355700985639, 42.958256967700528 ], [ -78.824656694550697, 42.958156975888137 ], [ -78.822157505617739, 42.958156839199646 ], [ -78.820756503617915, 42.958156954762991 ], [ -78.819557377904218, 42.958156719090624 ], [ -78.818656729926502, 42.958057024236993 ], [ -78.817356630933958, 42.958057000472493 ], [ -78.815756379360749, 42.958655648454581 ], [ -78.814655722805838, 42.959055735912756 ], [ -78.814256710692703, 42.959256842446351 ], [ -78.813656408143274, 42.959557158732345 ], [ -78.812055603843234, 42.960056977439621 ], [ -78.810858317851512, 42.960556082171166 ], [ -78.80855649993903, 42.961455128370673 ], [ -78.808556641406597, 42.95905538611283 ], [ -78.807555691674963, 42.958955334769527 ], [ -78.8075556846577, 42.956555317351551 ], [ -78.803555667103964, 42.956555344613861 ], [ -78.803555710222753, 42.954555352043627 ], [ -78.808655616610892, 42.954655346219724 ], [ -78.808755637596704, 42.952255322156944 ], [ -78.810356727315778, 42.952155355087633 ], [ -78.810955498629298, 42.949456959125619 ], [ -78.803256895252787, 42.949356848211345 ], [ -78.798260549765104, 42.94926379980847 ], [ -78.798454639809037, 42.948655260106889 ], [ -78.798550139049141, 42.945208809996167 ], [ -78.798557412588266, 42.943856009896109 ], [ -78.798554783338417, 42.94095575828883 ], [ -78.798757866985625, 42.938156613636551 ], [ -78.798756824676403, 42.937857507547143 ], [ -78.798855410796321, 42.937256444303237 ], [ -78.798854712408485, 42.937056116455338 ], [ -78.798856706061073, 42.936556785168193 ], [ -78.798756895109364, 42.935755765988517 ], [ -78.798856604707169, 42.93545649758471 ], [ -78.798855208018779, 42.935055841755414 ], [ -78.798856159105142, 42.934257431455606 ], [ -78.798954580601659, 42.933557506750603 ], [ -78.798956563688861, 42.933055376437686 ], [ -78.798955520699749, 42.932756297523177 ], [ -78.798954477630886, 42.932457191154541 ], [ -78.798956609322019, 42.929856033293724 ], [ -78.799155762886727, 42.922757308165004 ], [ -78.799055197727725, 42.92175595902475 ], [ -78.798956070218281, 42.919056125478022 ], [ -78.799055128618349, 42.918556609769276 ], [ -78.799454283045222, 42.918457105177296 ], [ -78.800054256740182, 42.918156889411847 ], [ -78.800456783714296, 42.917955796927018 ], [ -78.801057105067628, 42.917757125798815 ], [ -78.80155672747378, 42.917555844750758 ], [ -78.802056207188116, 42.917357360535163 ], [ -78.802454989226121, 42.917156268155487 ], [ -78.80345780545899, 42.916756401201226 ], [ -78.803856903703789, 42.916656853904762 ], [ -78.804755137489181, 42.91625725926454 ], [ -78.805657092775974, 42.915857650327247 ], [ -78.806954527440098, 42.915355711896147 ], [ -78.807755983281623, 42.91505503448947 ], [ -78.808057645039966, 42.914856911604382 ], [ -78.808456723670673, 42.914757375724776 ], [ -78.809456090238214, 42.914456297072078 ], [ -78.810056088429604, 42.914156028667882 ], [ -78.810555550332339, 42.913957424994436 ], [ -78.811357082867673, 42.913656831921934 ], [ -78.811856489182247, 42.913455506238051 ], [ -78.812456391220152, 42.913155197963881 ], [ -78.81355576688965, 42.912656379465048 ], [ -78.813556198439798, 42.914640829675548 ], [ -78.81330446664127, 42.914579715671721 ], [ -78.81355622336676, 42.914755411822256 ], [ -78.814556580901453, 42.914756112336519 ], [ -78.815557162713134, 42.914756885970576 ], [ -78.816557594465252, 42.914757459094126 ], [ -78.817558165651363, 42.914755416513607 ], [ -78.818256145722728, 42.914756757777305 ], [ -78.819155785294967, 42.914757624719542 ], [ -78.820156244305437, 42.914755559662552 ], [ -78.821156446253028, 42.914657505838498 ], [ -78.821455090218222, 42.914656885101166 ], [ -78.822257239703006, 42.914556434655353 ], [ -78.822455128322289, 42.91455602152439 ], [ -78.823156988267698, 42.914557269928117 ], [ -78.823556423863408, 42.914556432537715 ], [ -78.824056614264222, 42.91455538195617 ], [ -78.825057080580791, 42.914556072803187 ], [ -78.826255435013962, 42.914556225453076 ], [ -78.827457447884839, 42.91455638519686 ], [ -78.828857461438815, 42.914556162759148 ], [ -78.829156067087453, 42.914555439698631 ], [ -78.832157862254618, 42.914655993557794 ], [ -78.832557335549936, 42.914655124679904 ], [ -78.837555965261672, 42.914655027677036 ], [ -78.838858697395693, 42.914654926337406 ], [ -78.842957736990499, 42.914656597685237 ], [ -78.84325638045668, 42.9146559200761 ], [ -78.843558756955673, 42.914655233203135 ], [ -78.847758513806397, 42.914656613445167 ], [ -78.848758980528913, 42.914656987399198 ], [ -78.851958257798302, 42.914655013461626 ], [ -78.852656778433314, 42.914754922998405 ], [ -78.85365812200979, 42.914955609374736 ], [ -78.853657047324589, 42.913855292993048 ], [ -78.853657967521158, 42.912357137990234 ], [ -78.85365967619083, 42.911056511983595 ], [ -78.854656859806852, 42.911155703833316 ], [ -78.855556445588121, 42.91115617512046 ], [ -78.856459765022805, 42.91115682250279 ], [ -78.859259447418182, 42.911155597178706 ], [ -78.862059586429183, 42.911255770601677 ], [ -78.865556836779717, 42.911156710343533 ], [ -78.865159677833972, 42.912455539180336 ], [ -78.864658777656672, 42.913954923753735 ], [ -78.864157479774619, 42.915355554909951 ], [ -78.861957308400946, 42.917556052161366 ], [ -78.860856832722632, 42.918557465223657 ], [ -78.859760042753081, 42.91955616966203 ], [ -78.859157947244356, 42.920155784666115 ], [ -78.858856876572062, 42.920455618453111 ], [ -78.858656530175679, 42.920755181814776 ], [ -78.856956990718302, 42.922257434331961 ], [ -78.856057477592657, 42.923156769606393 ], [ -78.853759739771817, 42.925357311533098 ], [ -78.852759287171324, 42.926256941150747 ], [ -78.851959523004112, 42.926955789183971 ], [ -78.851458130539228, 42.9275551540956 ], [ -78.851056247518528, 42.927855175636331 ], [ -78.850959569531824, 42.9279568697158 ], [ -78.85075872187268, 42.928154952031669 ], [ -78.849357066205357, 42.929554815991274 ], [ -78.848059054160757, 42.93075689229353 ], [ -78.847158434247248, 42.931456021774324 ], [ -78.846359083627647, 42.932256379439686 ], [ -78.845956921275459, 42.932556383500874 ], [ -78.845458740353124, 42.933056852948276 ], [ -78.844457613641666, 42.933854860213494 ], [ -78.843558140727509, 42.934855728084706 ], [ -78.842557083794873, 42.935656434765868 ], [ -78.842356232851728, 42.935857191087443 ], [ -78.841656567483184, 42.936456960649835 ], [ -78.841158271807103, 42.936954722350357 ], [ -78.839856210702692, 42.938156713358005 ], [ -78.838758734174164, 42.939155187600356 ], [ -78.837456087930008, 42.940255602049938 ], [ -78.835856446299658, 42.941757314897934 ], [ -78.835056290608691, 42.942456016559234 ], [ -78.834357116302002, 42.943157289902665 ], [ -78.833657690718923, 42.94385576071415 ], [ -78.833356381137804, 42.944155526831231 ], [ -78.832258592102392, 42.945156654906228 ], [ -78.83135838731252, 42.946055876655677 ] ] ], [ [ [ -78.81388190979429, 42.914719903009498 ], [ -78.81355622336676, 42.914755411822256 ], [ -78.813556198439798, 42.914640829675548 ], [ -78.81388190979429, 42.914719903009498 ] ] ] ] } },
{ "type": "Feature", "properties": { "SBE4_ID": 0, "NAME": "District B", "FROMLEFT": 0, "TOLEFT": 0, "FROMRIGHT": 0, "TORIGHT": 0, "DIRECTION": null, "STREET": null, "ST_TYPE": null, "ST_PREFIX": null, "ST_SUFFIX": null, "CITY_LEFT": null, "CITY_RIGHT": null, "LO_X_PRE": null, "LO_X_NAME": null, "LO_X_TYPE": null, "LO_X_SUF": null, "HI_X_PRE": null, "HI_X_NAME": null, "HI_X_TYPE": null, "HI_X_SUF": null, "LHS": null, "RHS": null, "BDY_LEFT": null, "BDY_RIGHT": null, "ST_CODE": null, "RECNUM_L": 0, "RECNUM_R": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -78.877556716095029, 42.874857610217347 ], [ -78.87805895026365, 42.874522552122691 ], [ -78.879767789463699, 42.87705099553893 ], [ -78.882677989722453, 42.878305611941379 ], [ -78.882994922991031, 42.877911145090273 ], [ -78.886812483749637, 42.878206759469876 ], [ -78.888732385034302, 42.878825339982058 ], [ -78.890247479896416, 42.881469631441725 ], [ -78.889835470396079, 42.882279055795166 ], [ -78.88897192071019, 42.881844428097786 ], [ -78.889386931765287, 42.881187695916303 ], [ -78.888452123743221, 42.879939802637892 ], [ -78.887206299012334, 42.879344207919118 ], [ -78.886363932196801, 42.879208313175972 ], [ -78.884891941620182, 42.879517868154529 ], [ -78.883809384665241, 42.88006768014219 ], [ -78.883881226506304, 42.880141055142744 ], [ -78.88543589722687, 42.879590628920212 ], [ -78.885349153009415, 42.880294746526879 ], [ -78.884856472862353, 42.880493851630128 ], [ -78.883953613363957, 42.880826369804623 ], [ -78.88391652991092, 42.880965390027278 ], [ -78.885261140223761, 42.880731366039186 ], [ -78.885412749814421, 42.880704405359175 ], [ -78.885432935061019, 42.881989614876254 ], [ -78.884934189912883, 42.882187199689177 ], [ -78.885149591608595, 42.882417749431362 ], [ -78.885990282873877, 42.881942759172496 ], [ -78.886902106250716, 42.881435964598211 ], [ -78.887623976098538, 42.881872685765536 ], [ -78.887295848770606, 42.88218147594376 ], [ -78.886665517494535, 42.882707970148083 ], [ -78.886325573274505, 42.883318314140141 ], [ -78.887935188133397, 42.882305309596234 ], [ -78.888194750681521, 42.882788008753764 ], [ -78.888461862582389, 42.883204230311826 ], [ -78.888197905618881, 42.883428944037398 ], [ -78.887713659596528, 42.883745449631128 ], [ -78.888459338075492, 42.884289799437973 ], [ -78.88896187969182, 42.884981344336815 ], [ -78.890170993132699, 42.886575763198067 ], [ -78.890483014674359, 42.886922466630416 ], [ -78.891329524845204, 42.887212943140796 ], [ -78.891358175386998, 42.887199415290638 ], [ -78.892133110897007, 42.887504971882784 ], [ -78.892385934056861, 42.887695510810936 ], [ -78.893348314393322, 42.888403903499388 ], [ -78.894057755479366, 42.888933744445872 ], [ -78.894612242514853, 42.889338469797835 ], [ -78.895036384546501, 42.889659996207968 ], [ -78.895501392294435, 42.890011208150497 ], [ -78.896121211532275, 42.890469582881344 ], [ -78.89683887897786, 42.890993347367832 ], [ -78.898918617390336, 42.892541080916487 ], [ -78.899432482892905, 42.892922022847635 ], [ -78.899905427513588, 42.893261231452982 ], [ -78.900631448154058, 42.893814911921822 ], [ -78.901000451860682, 42.894477001624736 ], [ -78.901287413342885, 42.894960225054838 ], [ -78.90149248475656, 42.895324097147316 ], [ -78.901762135284699, 42.895734270535478 ], [ -78.901820719343334, 42.895950462273227 ], [ -78.90191675573098, 42.898106772035554 ], [ -78.901983845860258, 42.899191788067803 ], [ -78.902018825485499, 42.900005496587902 ], [ -78.902111235070834, 42.901882460953765 ], [ -78.901354550045156, 42.901657838954542 ], [ -78.901009778825738, 42.901115975466546 ], [ -78.900610944128658, 42.900787295131039 ], [ -78.900920393124537, 42.901298197182662 ], [ -78.9009544677413, 42.901756192436423 ], [ -78.901617220150982, 42.902200478390171 ], [ -78.901603239445336, 42.902900259891958 ], [ -78.901588792822579, 42.903248195747921 ], [ -78.901565452389505, 42.904327206356093 ], [ -78.901560896419539, 42.906155900137307 ], [ -78.90160098289445, 42.914954584158387 ], [ -78.90117482292824, 42.914955618835442 ], [ -78.900833802550821, 42.914856453154684 ], [ -78.899063170890415, 42.914861349800091 ], [ -78.898064267951455, 42.914847414843535 ], [ -78.897133551252566, 42.914849969619191 ], [ -78.895662005310712, 42.914861026418535 ], [ -78.894377258499588, 42.914955942341805 ], [ -78.892967674896013, 42.914959763240532 ], [ -78.890079862876149, 42.915058955206973 ], [ -78.888175984523798, 42.915154442931687 ], [ -78.886661367371204, 42.91515846580203 ], [ -78.885854268732928, 42.91515247522581 ], [ -78.885368298366402, 42.91525127115856 ], [ -78.884273792034705, 42.915254153367037 ], [ -78.883068729321764, 42.915257314605014 ], [ -78.882272685221139, 42.915251269836823 ], [ -78.881860056726552, 42.915357218260048 ], [ -78.881359298348983, 42.915256972327974 ], [ -78.880060763516965, 42.915356407999973 ], [ -78.878357872938679, 42.915256651587946 ], [ -78.876760500452249, 42.915356819507785 ], [ -78.873359629522184, 42.915357198709401 ], [ -78.872758628860012, 42.915356003171667 ], [ -78.868857549841991, 42.915354823057719 ], [ -78.86655787398773, 42.915355047378718 ], [ -78.865057126814094, 42.915356061113151 ], [ -78.864157479774619, 42.915355554909951 ], [ -78.864658777656672, 42.913954923753735 ], [ -78.865159677833972, 42.912455539180336 ], [ -78.865556836779717, 42.911156710343533 ], [ -78.862059586429183, 42.911255770601677 ], [ -78.859259447418182, 42.911155597178706 ], [ -78.856459765022805, 42.91115682250279 ], [ -78.855556445588121, 42.91115617512046 ], [ -78.854656859806852, 42.911155703833316 ], [ -78.85365967619083, 42.911056511983595 ], [ -78.853657494698368, 42.910557187534138 ], [ -78.853659033437623, 42.910054973192565 ], [ -78.853756797638667, 42.909355082581932 ], [ -78.853658635474773, 42.908254994396067 ], [ -78.853759022902551, 42.908156005376249 ], [ -78.853759265986639, 42.907357483109244 ], [ -78.853758953862595, 42.906457521063999 ], [ -78.85375875366897, 42.905557531173962 ], [ -78.853758278971, 42.903757578583011 ], [ -78.853657613396891, 42.902056531765901 ], [ -78.853656698573374, 42.900155000825954 ], [ -78.853656069099998, 42.899156258847228 ], [ -78.853656302324623, 42.898355046346644 ], [ -78.85365785349488, 42.897855629658302 ], [ -78.853756805541735, 42.897457533816237 ], [ -78.853758344049041, 42.896955400639861 ], [ -78.853757469063879, 42.896755099652516 ], [ -78.853857405997729, 42.896557304389624 ], [ -78.853858943823525, 42.896055198573613 ], [ -78.853757551303204, 42.895056693911634 ], [ -78.853756908447806, 42.894055152318728 ], [ -78.853759577852927, 42.892957539513091 ], [ -78.853758060564701, 42.89175575126616 ], [ -78.853758304791938, 42.890957254144233 ], [ -78.853756111813098, 42.890455129209947 ], [ -78.853756712784602, 42.889755383336748 ], [ -78.853759059883188, 42.887755088297254 ], [ -78.853758944339788, 42.885156604458061 ], [ -78.853714464176306, 42.884361065673055 ], [ -78.853661332722666, 42.883318515317931 ], [ -78.85365725150217, 42.88325541562201 ], [ -78.853557511100931, 42.881757490201359 ], [ -78.853656661060612, 42.88055546197964 ], [ -78.853958681519828, 42.879657470565625 ], [ -78.854257382550315, 42.87885554952485 ], [ -78.857356707881706, 42.879457262118258 ], [ -78.859757939693296, 42.879956310487458 ], [ -78.864656316400058, 42.880655101515977 ], [ -78.86885745593024, 42.881456810125457 ], [ -78.86905751475463, 42.88115722766284 ], [ -78.869159247170458, 42.880555980676171 ], [ -78.869358376966289, 42.88005615122713 ], [ -78.869387780475122, 42.879951837575966 ], [ -78.869556577509613, 42.879355910320399 ], [ -78.86975904878048, 42.87875723695614 ], [ -78.869957241093033, 42.878057077538543 ], [ -78.870259928280817, 42.877356655895099 ], [ -78.870258536657332, 42.877056203810682 ], [ -78.87055656243021, 42.876156833702851 ], [ -78.870956750411864, 42.874756419191691 ], [ -78.871258478968869, 42.873855583344678 ], [ -78.871559627886398, 42.872856077792747 ], [ -78.87265780839121, 42.873155108530398 ], [ -78.873157675465777, 42.873156643168144 ], [ -78.87405764897936, 42.873357381992662 ], [ -78.875159693178475, 42.873656461201733 ], [ -78.875958954885036, 42.873857441685928 ], [ -78.87665858052506, 42.874256231783569 ], [ -78.877556716095029, 42.874857610217347 ] ] ] ] } },
{ "type": "Feature", "properties": { "SBE4_ID": 0, "NAME": "District C", "FROMLEFT": 0, "TOLEFT": 0, "FROMRIGHT": 0, "TORIGHT": 0, "DIRECTION": null, "STREET": null, "ST_TYPE": null, "ST_PREFIX": null, "ST_SUFFIX": null, "CITY_LEFT": null, "CITY_RIGHT": null, "LO_X_PRE": null, "LO_X_NAME": null, "LO_X_TYPE": null, "LO_X_SUF": null, "HI_X_PRE": null, "HI_X_NAME": null, "HI_X_TYPE": null, "HI_X_SUF": null, "LHS": null, "RHS": null, "BDY_LEFT": null, "BDY_RIGHT": null, "ST_CODE": null, "RECNUM_L": 0, "RECNUM_R": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -78.837456569994913, 42.878756929372337 ], [ -78.83835691774442, 42.879056837484171 ], [ -78.839156194113883, 42.879255275929467 ], [ -78.839358996383396, 42.878656627987034 ], [ -78.839957561167893, 42.87815595557732 ], [ -78.841556799502669, 42.876955998075758 ], [ -78.841757388131555, 42.876755214333393 ], [ -78.842556244378372, 42.876857758658176 ], [ -78.8440576714939, 42.87725761889191 ], [ -78.84545768790359, 42.877457442727305 ], [ -78.847059027846299, 42.877656785921261 ], [ -78.848757851920865, 42.877957459459736 ], [ -78.850856794926287, 42.878457395030267 ], [ -78.851756334480143, 42.8785568410702 ], [ -78.854257382550315, 42.87885554952485 ], [ -78.853958681519828, 42.879657470565625 ], [ -78.853656661060612, 42.88055546197964 ], [ -78.853557511100931, 42.881757490201359 ], [ -78.85365725150217, 42.88325541562201 ], [ -78.853661332722666, 42.883318515317931 ], [ -78.853714464176306, 42.884361065673055 ], [ -78.853758944339788, 42.885156604458061 ], [ -78.853759059883188, 42.887755088297254 ], [ -78.853756712784602, 42.889755383336748 ], [ -78.853756111813098, 42.890455129209947 ], [ -78.853758304791938, 42.890957254144233 ], [ -78.853758060564701, 42.89175575126616 ], [ -78.853759577852927, 42.892957539513091 ], [ -78.853756908447806, 42.894055152318728 ], [ -78.853757551303204, 42.895056693911634 ], [ -78.853858943823525, 42.896055198573613 ], [ -78.853857405997729, 42.896557304389624 ], [ -78.853757469063879, 42.896755099652516 ], [ -78.853758344049041, 42.896955400639861 ], [ -78.853756805541735, 42.897457533816237 ], [ -78.85365785349488, 42.897855629658302 ], [ -78.853656302324623, 42.898355046346644 ], [ -78.853656069099998, 42.899156258847228 ], [ -78.853656698573374, 42.900155000825954 ], [ -78.853657613396891, 42.902056531765901 ], [ -78.853758278971, 42.903757578583011 ], [ -78.85375875366897, 42.905557531173962 ], [ -78.853758953862595, 42.906457521063999 ], [ -78.853759265986639, 42.907357483109244 ], [ -78.853759022902551, 42.908156005376249 ], [ -78.853658635474773, 42.908254994396067 ], [ -78.853756797638667, 42.909355082581932 ], [ -78.853659033437623, 42.910054973192565 ], [ -78.853657494698368, 42.910557187534138 ], [ -78.85365967619083, 42.911056511983595 ], [ -78.853657967521158, 42.912357137990234 ], [ -78.853657047324589, 42.913855292993048 ], [ -78.85365812200979, 42.914955609374736 ], [ -78.852656778433314, 42.914754922998405 ], [ -78.851958257798302, 42.914655013461626 ], [ -78.848758980528913, 42.914656987399198 ], [ -78.847758513806397, 42.914656613445167 ], [ -78.843558756955673, 42.914655233203135 ], [ -78.84325638045668, 42.9146559200761 ], [ -78.842957736990499, 42.914656597685237 ], [ -78.838858697395693, 42.914654926337406 ], [ -78.837555965261672, 42.914655027677036 ], [ -78.832557335549936, 42.914655124679904 ], [ -78.832157862254618, 42.914655993557794 ], [ -78.829156067087453, 42.914555439698631 ], [ -78.828857461438815, 42.914556162759148 ], [ -78.827457447884839, 42.91455638519686 ], [ -78.826255435013962, 42.914556225453076 ], [ -78.825057080580791, 42.914556072803187 ], [ -78.824056614264222, 42.91455538195617 ], [ -78.823556423863408, 42.914556432537715 ], [ -78.823156988267698, 42.914557269928117 ], [ -78.822455128322289, 42.91455602152439 ], [ -78.822257239703006, 42.914556434655353 ], [ -78.821455090218222, 42.914656885101166 ], [ -78.821156446253028, 42.914657505838498 ], [ -78.820156244305437, 42.914755559662552 ], [ -78.819155785294967, 42.914757624719542 ], [ -78.818256145722728, 42.914756757777305 ], [ -78.817558165651363, 42.914755416513607 ], [ -78.816557594465252, 42.914757459094126 ], [ -78.815557162713134, 42.914756885970576 ], [ -78.814556580901453, 42.914756112336519 ], [ -78.81355622336676, 42.914755411822256 ], [ -78.81355576688965, 42.912656379465048 ], [ -78.812456391220152, 42.913155197963881 ], [ -78.811856489182247, 42.913455506238051 ], [ -78.811357082867673, 42.913656831921934 ], [ -78.810555550332339, 42.913957424994436 ], [ -78.810056088429604, 42.914156028667882 ], [ -78.809456090238214, 42.914456297072078 ], [ -78.808456723670673, 42.914757375724776 ], [ -78.808057645039966, 42.914856911604382 ], [ -78.807755983281623, 42.91505503448947 ], [ -78.806954527440098, 42.915355711896147 ], [ -78.805657092775974, 42.915857650327247 ], [ -78.804755137489181, 42.91625725926454 ], [ -78.803856903703789, 42.916656853904762 ], [ -78.80345780545899, 42.916756401201226 ], [ -78.802454989226121, 42.917156268155487 ], [ -78.802056207188116, 42.917357360535163 ], [ -78.80155672747378, 42.917555844750758 ], [ -78.801057105067628, 42.917757125798815 ], [ -78.800456783714296, 42.917955796927018 ], [ -78.800054256740182, 42.918156889411847 ], [ -78.799454283045222, 42.918457105177296 ], [ -78.799055128618349, 42.918556609769276 ], [ -78.799056743783282, 42.913655973762616 ], [ -78.799054506892517, 42.909855743480577 ], [ -78.799155722941677, 42.906757665138031 ], [ -78.799254604981854, 42.898756254692366 ], [ -78.79935567367923, 42.895655454002004 ], [ -78.799357519475777, 42.88975613471235 ], [ -78.799555682779072, 42.884556101935864 ], [ -78.800455932255147, 42.884856198273617 ], [ -78.800855880420585, 42.885055770186042 ], [ -78.801354855037332, 42.884755737814196 ], [ -78.802455159595638, 42.884657546665778 ], [ -78.803455133300602, 42.884655628692954 ], [ -78.803757485744924, 42.88465776349981 ], [ -78.805055921622497, 42.884655256607296 ], [ -78.806257466997707, 42.884655722425009 ], [ -78.807556279992795, 42.884757426604551 ], [ -78.808555783918976, 42.884656712606812 ], [ -78.809555878954654, 42.884657430116576 ], [ -78.814156862880751, 42.884755313966757 ], [ -78.815257702748966, 42.884755696219727 ], [ -78.816056162884067, 42.884756847493165 ], [ -78.816657238717056, 42.884857093087646 ], [ -78.824051345503236, 42.884759550740974 ], [ -78.824056055970587, 42.884756717006105 ], [ -78.825555243453209, 42.882657282618005 ], [ -78.8267574133816, 42.880956240808032 ], [ -78.828657889567353, 42.878457937354909 ], [ -78.829257334160488, 42.878157567817688 ], [ -78.832856931977261, 42.877057576053375 ], [ -78.833058755274735, 42.877155998336157 ], [ -78.833955401951215, 42.877455839483304 ], [ -78.834855713376044, 42.87775563809948 ], [ -78.835756447512608, 42.878157034814144 ], [ -78.836758064766627, 42.878555457288982 ], [ -78.837456569994913, 42.878756929372337 ] ] ] ] } },
{ "type": "Feature", "properties": { "SBE4_ID": 0, "NAME": "District D", "FROMLEFT": 0, "TOLEFT": 0, "FROMRIGHT": 0, "TORIGHT": 0, "DIRECTION": null, "STREET": null, "ST_TYPE": null, "ST_PREFIX": null, "ST_SUFFIX": null, "CITY_LEFT": null, "CITY_RIGHT": null, "LO_X_PRE": null, "LO_X_NAME": null, "LO_X_TYPE": null, "LO_X_SUF": null, "HI_X_PRE": null, "HI_X_NAME": null, "HI_X_TYPE": null, "HI_X_SUF": null, "LHS": null, "RHS": null, "BDY_LEFT": null, "BDY_RIGHT": null, "ST_CODE": null, "RECNUM_L": 0, "RECNUM_R": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -78.848357925732358, 42.958557155360594 ], [ -78.847558550346733, 42.958556314278027 ], [ -78.847159103369592, 42.958655986661867 ], [ -78.846658049234421, 42.95855559052405 ], [ -78.845757772716311, 42.958554968924986 ], [ -78.844659429161581, 42.958554682819461 ], [ -78.843456598624755, 42.958554733406494 ], [ -78.842257051866881, 42.958455875641029 ], [ -78.841158635672457, 42.958455665861948 ], [ -78.840157571072865, 42.958455117420101 ], [ -78.838958216436993, 42.958455112938751 ], [ -78.838158434253145, 42.95835531882836 ], [ -78.836858858528231, 42.958456982912189 ], [ -78.829957986127056, 42.947054948618003 ], [ -78.830457761013733, 42.946856231049658 ], [ -78.83135838731252, 42.946055876655677 ], [ -78.832258592102392, 42.945156654906228 ], [ -78.833356381137804, 42.944155526831231 ], [ -78.833657690718923, 42.94385576071415 ], [ -78.834357116302002, 42.943157289902665 ], [ -78.835056290608691, 42.942456016559234 ], [ -78.835856446299658, 42.941757314897934 ], [ -78.837456087930008, 42.940255602049938 ], [ -78.838758734174164, 42.939155187600356 ], [ -78.839856210702692, 42.938156713358005 ], [ -78.841158271807103, 42.936954722350357 ], [ -78.841656567483184, 42.936456960649835 ], [ -78.842356232851728, 42.935857191087443 ], [ -78.842557083794873, 42.935656434765868 ], [ -78.843558140727509, 42.934855728084706 ], [ -78.844457613641666, 42.933854860213494 ], [ -78.845458740353124, 42.933056852948276 ], [ -78.845956921275459, 42.932556383500874 ], [ -78.846359083627647, 42.932256379439686 ], [ -78.847158434247248, 42.931456021774324 ], [ -78.848059054160757, 42.93075689229353 ], [ -78.849357066205357, 42.929554815991274 ], [ -78.85075872187268, 42.928154952031669 ], [ -78.850959569531824, 42.9279568697158 ], [ -78.851056247518528, 42.927855175636331 ], [ -78.851458130539228, 42.9275551540956 ], [ -78.851959523004112, 42.926955789183971 ], [ -78.852759287171324, 42.926256941150747 ], [ -78.853759739771817, 42.925357311533098 ], [ -78.856057477592657, 42.923156769606393 ], [ -78.856956990718302, 42.922257434331961 ], [ -78.858656530175679, 42.920755181814776 ], [ -78.858856876572062, 42.920455618453111 ], [ -78.859157947244356, 42.920155784666115 ], [ -78.859760042753081, 42.91955616966203 ], [ -78.860856832722632, 42.918557465223657 ], [ -78.861957308400946, 42.917556052161366 ], [ -78.864157479774619, 42.915355554909951 ], [ -78.865057126814094, 42.915356061113151 ], [ -78.86655787398773, 42.915355047378718 ], [ -78.868857549841991, 42.915354823057719 ], [ -78.872758628860012, 42.915356003171667 ], [ -78.873359629522184, 42.915357198709401 ], [ -78.876760500452249, 42.915356819507785 ], [ -78.878357872938679, 42.915256651587946 ], [ -78.880060763516965, 42.915356407999973 ], [ -78.881359298348983, 42.915256972327974 ], [ -78.881860056726552, 42.915357218260048 ], [ -78.882272685221139, 42.915251269836823 ], [ -78.883068729321764, 42.915257314605014 ], [ -78.884273792034705, 42.915254153367037 ], [ -78.885368298366402, 42.91525127115856 ], [ -78.885854268732928, 42.91515247522581 ], [ -78.886672422971984, 42.915158436510609 ], [ -78.888164928925264, 42.915154472368307 ], [ -78.890066028293106, 42.915055944996219 ], [ -78.892973197591445, 42.914958732545394 ], [ -78.894377258499588, 42.914955942341805 ], [ -78.895675824733544, 42.914860988717805 ], [ -78.897168322242848, 42.914856907221662 ], [ -78.898109668762928, 42.914847290026792 ], [ -78.899051243879498, 42.914856809077392 ], [ -78.899673117636056, 42.914855092483272 ], [ -78.900855119132444, 42.914855753392153 ], [ -78.901159417838116, 42.914956980417145 ], [ -78.901511530128445, 42.914956002391477 ], [ -78.901259500262299, 42.915790463407561 ], [ -78.901039376175646, 42.9165211626134 ], [ -78.900803422995168, 42.917340120508733 ], [ -78.900642632086601, 42.917922293370644 ], [ -78.900352803555677, 42.918873736097275 ], [ -78.899966689539511, 42.920198582505577 ], [ -78.899497029021163, 42.92189358586883 ], [ -78.89950199452521, 42.921893572156002 ], [ -78.898955778359166, 42.924051207509997 ], [ -78.898959314199004, 42.924744023208717 ], [ -78.898966106163485, 42.926074777878405 ], [ -78.898997580075644, 42.927369108017722 ], [ -78.899015346081342, 42.927982092585005 ], [ -78.899797131705569, 42.930131477834024 ], [ -78.899824713903755, 42.930304182471211 ], [ -78.89998968080755, 42.930434992570987 ], [ -78.900817098187616, 42.93108823657095 ], [ -78.900824857978293, 42.930585100877963 ], [ -78.90132628418371, 42.930980937805437 ], [ -78.901834110429547, 42.930639013085603 ], [ -78.902728823511509, 42.930443681928907 ], [ -78.903109151324642, 42.930357845634006 ], [ -78.901834110429547, 42.930639013085603 ], [ -78.900659484006212, 42.929123959777144 ], [ -78.900580076597706, 42.926266420627407 ], [ -78.900429083107412, 42.922319764339214 ], [ -78.900760203399443, 42.921241687908463 ], [ -78.900915847459643, 42.920702745364295 ], [ -78.901546249652824, 42.919608991462646 ], [ -78.901818736656523, 42.919099082084145 ], [ -78.902109568540993, 42.917890121065405 ], [ -78.902235137734323, 42.917263840573362 ], [ -78.902332190342975, 42.916885163554234 ], [ -78.902181178734878, 42.915320070874564 ], [ -78.902124132571586, 42.914957051428722 ], [ -78.901515270083607, 42.914955690463479 ], [ -78.901515776779945, 42.914868491601403 ], [ -78.901518012111453, 42.914820720145464 ], [ -78.902133312499032, 42.914818734938109 ], [ -78.902013473047873, 42.912693915230498 ], [ -78.902533701297116, 42.911804550020491 ], [ -78.902754669155058, 42.91241524030513 ], [ -78.902915198716912, 42.912829692706374 ], [ -78.903067379972413, 42.913542508969392 ], [ -78.903271021262256, 42.914633587956949 ], [ -78.903586313334159, 42.916226591537594 ], [ -78.903778949397676, 42.917099452743621 ], [ -78.904186211959313, 42.919245250066467 ], [ -78.904440341493142, 42.920518157479009 ], [ -78.90462435719698, 42.921631183782786 ], [ -78.904737308753241, 42.922409657703007 ], [ -78.904809627095929, 42.922969833964459 ], [ -78.904909494683295, 42.923729878069061 ], [ -78.904963312104968, 42.924134968048868 ], [ -78.905138306699939, 42.92523964937368 ], [ -78.905314300750192, 42.926570915527613 ], [ -78.905514378516472, 42.927872068041225 ], [ -78.906210330417593, 42.929508631350856 ], [ -78.906212496791639, 42.929923496936539 ], [ -78.904706019158724, 42.93010111178603 ], [ -78.905197192220299, 42.930046811396345 ], [ -78.906216361094181, 42.92992699817907 ], [ -78.906115574986444, 42.932064584547803 ], [ -78.906825072161936, 42.93409383314517 ], [ -78.904965379070646, 42.932881019280011 ], [ -78.904645083186239, 42.932662492287299 ], [ -78.904309426718299, 42.932455367033597 ], [ -78.904007372774672, 42.932239695581686 ], [ -78.903451768029086, 42.931871460603965 ], [ -78.902201542601702, 42.931008740628926 ], [ -78.90202594441206, 42.930895716102775 ], [ -78.901875034453923, 42.930711282252666 ], [ -78.901398118730953, 42.931022774185323 ], [ -78.901651811431563, 42.931225910422974 ], [ -78.902350261746577, 42.931882739510314 ], [ -78.902915944600963, 42.932388693438718 ], [ -78.902629510589421, 42.932600797271924 ], [ -78.90386120948564, 42.933656869024439 ], [ -78.904459278893853, 42.933756743178414 ], [ -78.907262208987191, 42.93695979109124 ], [ -78.908521859033641, 42.938597978997493 ], [ -78.908726708704449, 42.939380438521361 ], [ -78.908730080667112, 42.939389593415029 ], [ -78.909516776232223, 42.94249073687056 ], [ -78.908916416369607, 42.943086737261048 ], [ -78.909717332335276, 42.943989928321862 ], [ -78.908911507135457, 42.944586541589423 ], [ -78.909517706327776, 42.945094129940117 ], [ -78.908916874063678, 42.945605236619571 ], [ -78.910401234703158, 42.953596504184752 ], [ -78.91267796524653, 42.95575904357041 ], [ -78.911761223912649, 42.95645513001049 ], [ -78.908360118215342, 42.958956305281539 ], [ -78.907559933526329, 42.959556760400766 ], [ -78.906759942770009, 42.96015441060144 ], [ -78.906559296799884, 42.960355305505615 ], [ -78.905758658446118, 42.960854199466368 ], [ -78.905059515844783, 42.961454324852951 ], [ -78.90406141411782, 42.962055311372481 ], [ -78.903362054777176, 42.962655454327887 ], [ -78.902561472684425, 42.963154298160894 ], [ -78.901761289295081, 42.963754712362615 ], [ -78.9009612024266, 42.964355120648463 ], [ -78.899159550375217, 42.965655144949189 ], [ -78.898359376221833, 42.966255535118037 ], [ -78.896461726581393, 42.96485586650212 ], [ -78.894559418319659, 42.963256015240091 ], [ -78.893858268674535, 42.962755823238531 ], [ -78.893261164733602, 42.962156457059415 ], [ -78.892959509184109, 42.960856745493309 ], [ -78.890458983145905, 42.958355523664345 ], [ -78.888960817281159, 42.958356844401585 ], [ -78.885061244442412, 42.958455047304646 ], [ -78.883058932473872, 42.958454819792294 ], [ -78.882158658648564, 42.958454484475844 ], [ -78.881758903828015, 42.958455527314996 ], [ -78.881157861160332, 42.958555843687328 ], [ -78.880059519299948, 42.958555897250605 ], [ -78.879260144717819, 42.958555277552378 ], [ -78.878557723983036, 42.95855709124055 ], [ -78.878060939280772, 42.958555572638929 ], [ -78.875158678177471, 42.958656381264539 ], [ -78.87425840060051, 42.958655874070374 ], [ -78.873260883445468, 42.958655715870663 ], [ -78.872457771560946, 42.958655030696043 ], [ -78.871460329053207, 42.958654856616953 ], [ -78.870358249228573, 42.958654826503142 ], [ -78.869259942906652, 42.958654886107276 ], [ -78.865557719794268, 42.958655787081888 ], [ -78.861257477462374, 42.958556554292315 ], [ -78.858359034813049, 42.958657010029732 ], [ -78.855657578720312, 42.958556430976316 ], [ -78.854656835161208, 42.958654869409195 ], [ -78.853957814556878, 42.958554946837822 ], [ -78.853659403684276, 42.958657229161389 ], [ -78.853259671690395, 42.958655373694626 ], [ -78.852859914568072, 42.958656315615869 ], [ -78.85175743026079, 42.958554639873995 ], [ -78.850958457227449, 42.958655289085193 ], [ -78.850558737387288, 42.958656222882844 ], [ -78.85005767815349, 42.958555923956126 ], [ -78.849459880382412, 42.958554516542854 ], [ -78.848357925732358, 42.958557155360594 ] ] ], [ [ [ -78.901518012111453, 42.914820720145464 ], [ -78.901516053815271, 42.914820815724703 ], [ -78.901516056764024, 42.91482072644893 ], [ -78.901518012111453, 42.914820720145464 ] ] ], [ [ [ -78.901516053815271, 42.914820815724703 ], [ -78.901515776779945, 42.914868491601403 ], [ -78.901511709782966, 42.91495540755421 ], [ -78.901511626800385, 42.914955682310051 ], [ -78.901511599202905, 42.914955682248291 ], [ -78.901516053815271, 42.914820815724703 ] ] ], [ [ [ -78.901515270083607, 42.914955690463479 ], [ -78.901515268331408, 42.914955992002454 ], [ -78.901511530128445, 42.914956002391477 ], [ -78.901511626800385, 42.914955682310051 ], [ -78.901515270083607, 42.914955690463479 ] ] ] ] } }
]
}
{
"AuthUrl" : "http://localhost:2009/emimobile/auth/",
"ApiUrl" : "http://localhost:2009/emimobile/api/",
"AppUrl" : "http://localhost:2009/emimobile/app/"
}
\ No newline at end of file
.login-card {
display: inline-block;
width: 300px; /* Adjust width as needed */
padding: 0;
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
background-color: #fff;
}
.card-header {
width: 100%;
text-align: left; /* Align text to the left */
background-color: #f8f9fa; /* Match the card background */
padding: 0.75rem 1.25rem;
border-bottom: 1px solid rgba(0, 0, 0, 0.125);
border-top-left-radius: 10px;
border-top-right-radius: 10px;
margin: 0; /* Remove any margin */
box-sizing: border-box; /* Ensure padding is included in the element's total width and height */
}
.mr-2 {
margin-right: 0.5rem;
}
.card-title {
margin: 0;
font-size: 1.25rem; /* Adjust font size as needed */
}
.card-body {
padding: 2rem;
}
.table tbody tr:hover {
background-color: #d1e7fd; /* Light blue color for hover effect */
cursor: pointer;
}
.form-input{
display: table;
}
.form-cells{
display: table-cell
}
.table tbody tr {
transition: background-color 0.3s ease;
}
.table {
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
border-radius: 5px;
}
@media (max-width: 1200px) {
.table-responsive {
display: block;
width: 100%;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.table thead {
display: none;
}
.table tbody, .table tr, .table td {
display: block;
width: 100%;
}
.table tr {
margin-bottom: 1rem;
}
.table td {
text-align: right;
padding-left: 50%; /* Adjust padding to accommodate the data-label */
position: relative;
}
.table td::before {
content: attr(data-label);
position: absolute;
left: 0;
width: 50%;
padding-left: 15px; /* Adjust as necessary */
font-weight: bold;
text-align: left;
}
.table td .transcript {
margin-top: 20px; /* Set top margin to 20px */
text-align: left; /* Ensure text alignment is left */
margin-left: 8px;
white-space: normal; /* Prevent text from being cut off */
}
}
.login-navbar {
max-width: 1200px; /* Set the max-width to match a medium screen */
margin: auto;
border-bottom-left-radius: 10px; /* Round the bottom left corner */
border-bottom-right-radius: 10px; /* Round the bottom right corner */
border: 1px solid #d3d3d3;
}
.navbar-toggler {
display: none;
}
.dropdown-menu a {
display: flex; /* Use flexbox for alignment */
align-items: center; /* Vertically center the content */
width: 100%; /* Ensure they take up the full width */
padding: 0.5rem 1rem; /* Add padding to make them clickable */
color: #000; /* Adjust the text color if necessary */
text-decoration: none; /* Remove underlines */
}
.dropdown-menu a:hover {
background-color: #204d74;
color: #fff;
}
.dropdown-menu a span {
flex-grow: 1; /* Make the span take up the remaining space */
}
/* Style for the selected number */
.selected-number .page-link {
background-color: #204d74;
color: #fff !important;
}
/* Style for the unselected numbers and text (previous/next) */
.pagination .page-item a,
.pagination .page-item span {
color: #204d74;
}
.pagination .page-item.active .page-link,
.pagination .page-item.active .page-link:hover,
.pagination .page-item.active .page-link:focus {
background-color: #204d74;
border-color: #204d74;
color: #fff !important;
}
/* This is needed to get rid of the line that was appearing. */
span.card {
border: none;
}
.modal-backdrop {
z-index: 1040 !important;
}
.modal {
z-index: 1055 !important;
}
object FViewComplaintArchive: TFViewComplaintArchive
Width = 640
Height = 480
object tblRemarksArc: TWebDBTableControl
Left = 102
Top = 128
Width = 191
Height = 147
ElementId = 'tbl_remarks_arc'
BorderColor = clSilver
ChildOrder = 8
ElementFont = efCSS
ElementHeaderClassName = 'table-light'
ElementTableClassName =
'table table-sm table-striped table-hover table-bordered mb-0 ali' +
'gn-middle'
Footer.ButtonActiveElementClassName = 'btn btn-primary'
Footer.ButtonElementClassName = 'btn btn-light'
Footer.DropDownElementClassName = 'form-control'
Footer.InputElementClassName = 'form-control'
Footer.LinkActiveElementClassName = 'link-primary'
Footer.LinkElementClassName = 'link-secondary'
Footer.ListElementClassName = 'pagination'
Footer.ListItemElementClassName = 'page-item'
Footer.ListLinkElementClassName = 'page-link'
Header.ButtonActiveElementClassName = 'btn btn-primary'
Header.ButtonElementClassName = 'btn btn-light'
Header.DropDownElementClassName = 'form-control'
Header.InputElementClassName = 'form-control'
Header.LinkActiveElementClassName = 'link-primary'
Header.LinkElementClassName = 'link-secondary'
Header.ListElementClassName = 'pagination'
Header.ListItemElementClassName = 'page-item'
Header.ListLinkElementClassName = 'page-link'
WordWrap = True
Columns = <
item
ElementClassName = 'd-none'
DataField = 'MemoType'
Title = 'Type'
TitleElementClassName = 'd-none'
end
item
DataField = 'Timestamp'
Title = 'Timestamp'
end
item
DataField = 'Remarks'
Title = 'Remarks'
end>
DataSource = wdsRemarksArc
end
object btnUntArc: TWebButton
Left = 378
Top = 85
Width = 96
Height = 25
Caption = 'UNT'
ChildOrder = 1
ElementID = 'btn_unt_arc'
ElementFont = efCSS
HeightStyle = ssAuto
HeightPercent = 100.000000000000000000
TabStop = False
WidthPercent = 100.000000000000000000
OnClick = btnUntArcClick
end
object btnREMArc: TWebButton
Left = 276
Top = 85
Width = 96
Height = 25
Caption = 'REM'
ChildOrder = 1
ElementID = 'btn_rem_arc'
ElementFont = efCSS
HeightStyle = ssAuto
HeightPercent = 100.000000000000000000
TabStop = False
WidthPercent = 100.000000000000000000
OnClick = btnREMArcClick
end
object btnE911Arc: TWebButton
Left = 166
Top = 85
Width = 96
Height = 25
Caption = 'E-911'
ChildOrder = 1
ElementID = 'btn_e911_arc'
ElementFont = efCSS
HeightStyle = ssAuto
HeightPercent = 100.000000000000000000
TabStop = False
WidthPercent = 100.000000000000000000
OnClick = btnE911ArcClick
end
object btnCmpArc: TWebButton
Left = 64
Top = 85
Width = 96
Height = 25
Caption = 'CMP'
ChildOrder = 1
ElementID = 'btn_cmp_arc'
ElementFont = efCSS
HeightStyle = ssAuto
HeightPercent = 100.000000000000000000
TabStop = False
WidthPercent = 100.000000000000000000
OnClick = btnCmpArcClick
end
object btnComplaintViewOnMapArc: TWebButton
Left = 342
Top = 259
Width = 96
Height = 25
Caption = 'Map'
ChildOrder = 1
ElementID = 'btn_complaint_view_on_map_arc'
ElementFont = efCSS
HeightStyle = ssAuto
HeightPercent = 100.000000000000000000
WidthPercent = 100.000000000000000000
OnClick = btnComplaintViewOnMapArcClick
end
object xdwcComplaintArchive: TXDataWebClient
Connection = DMConnection.ApiConnection
Left = 292
Top = 310
end
object xdwdsRemarksArc: TXDataWebDataSet
Left = 68
Top = 316
object xdwdsRemarksArcMemoId: TStringField
FieldName = 'MemoId'
end
object xdwdsRemarksArcCFSId: TStringField
FieldName = 'CFSId'
end
object xdwdsRemarksArcMemoType: TStringField
FieldName = 'MemoType'
end
object xdwdsRemarksArcTimestamp: TStringField
FieldName = 'Timestamp'
end
object xdwdsRemarksArcBadgeNumber: TStringField
FieldName = 'BadgeNumber'
end
object xdwdsRemarksArcRemarks: TStringField
FieldName = 'Remarks'
end
end
object wdsRemarksArc: TWebDataSource
DataSet = xdwdsRemarksArc
Left = 156
Top = 314
end
end
<div class="d-flex flex-column h-100 w-100 overflow-hidden">
<div class="flex-grow-1 d-flex flex-column overflow-auto bg-light p-2 p-md-3" style="min-height:0;">
<!-- Sticky block: Summary header + summary body -->
<div class="sticky-top bg-light" style="z-index:20;">
<!-- Summary header -->
<div class="card border-0 shadow-sm mb-2">
<div class="card-header bg-white py-2">
<button
class="btn btn-link text-decoration-none p-0 w-100 d-flex align-items-center justify-content-between summary-toggle"
type="button"
data-bs-toggle="collapse"
data-bs-target="#cdetails_summary_arc"
aria-expanded="true"
aria-controls="cdetails_summary_arc">
<span class="fw-semibold text-dark" id="lbl_summary_title_arc">Summary</span>
<span class="summary-chevron" aria-hidden="true">
<svg class="summary-chevron-icon" viewBox="0 0 16 16" focusable="false">
<path fill="currentColor" d="M7.646 5.354a.5.5 0 0 1 .708 0l5 5a.5.5 0 0 1-.708.708L8 6.414 3.354 11.06a.5.5 0 1 1-.708-.708l5-5z"/>
</svg>
</span>
</button>
</div>
</div>
<!-- Summary body -->
<div id="cdetails_summary_arc" class="collapse show">
<div class="card border-0 shadow-sm mb-2">
<div class="card-body py-2">
<table class="table table-sm mb-0 w-100">
<tbody>
<tr>
<th scope="row" class="fw-semibold text-nowrap pe-2 w-auto">Priority:</th>
<td class="w-100" id="lbl_priority_arc"></td>
</tr>
<tr>
<th scope="row" class="fw-semibold text-nowrap pe-2 w-auto">Status:</th>
<td class="w-100" id="lbl_status_arc"></td>
</tr>
<tr>
<th scope="row" class="fw-semibold text-nowrap pe-2 w-auto">Dispatch Code:</th>
<td class="w-100" id="lbl_dispatch_code_arc"></td>
</tr>
<tr>
<th scope="row" class="fw-semibold text-nowrap pe-2 w-auto">Dispatch District:</th>
<td class="w-100" id="lbl_dispatch_district_arc"></td>
</tr>
<tr>
<th scope="row" class="fw-semibold text-nowrap pe-2 w-auto">Address:</th>
<td class="w-100" id="lbl_address_arc"></td>
</tr>
<tr id="row_business_arc" class="d-none">
<th scope="row" class="fw-semibold text-nowrap pe-2 w-auto">Business:</th>
<td class="w-100" id="lbl_business_arc"></td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- Remarks toggle filters -->
<div class="pb-2">
<div class="d-flex flex-wrap gap-2 justify-content-center mt-2" id="row_remarks_toggles_arc">
<button type="button" class="btn btn-success btn-sm px-3 active" id="btn_cmp_arc" aria-pressed="true">CMP</button>
<button type="button" class="btn btn-success btn-sm px-3 active" id="btn_e911_arc" aria-pressed="true">E-911</button>
<button type="button" class="btn btn-success btn-sm px-3 active" id="btn_rem_arc" aria-pressed="true">REM</button>
<button type="button" class="btn btn-success btn-sm px-3 active" id="btn_unt_arc" aria-pressed="true">UNT</button>
</div>
</div>
</div>
</div>
<!-- Remarks table (scrolls with page) -->
<div class="card border-0 shadow-sm">
<div class="card-body p-0">
<div id="tbl_remarks_arc"></div>
</div>
</div>
</div>
<button id="btn_complaint_view_on_map_arc"
type="button"
class="btn btn-primary btn-sm shadow position-fixed"
style="right: 15px; bottom: 25px; z-index: 1040;">
Map
</button>
</div>
unit View.ComplaintArchive;
interface
uses
System.SysUtils, System.Classes, JS, Web,
WEBLib.Graphics, WEBLib.Controls, WEBLib.Forms, WEBLib.Dialogs,
Vcl.Controls, Vcl.StdCtrls, Data.DB,
WEBLib.StdCtrls, WEBLib.Grids, WEBLib.DBCtrls, WEBLib.DB,
XData.Web.Client, XData.Web.JsonDataset, XData.Web.Dataset,
ConnectionModule;
type
TFViewComplaintArchive = class(TWebForm)
tblRemarksArc: TWebDBTableControl;
xdwcComplaintArchive: TXDataWebClient;
xdwdsRemarksArc: TXDataWebDataSet;
xdwdsRemarksArcMemoId: TStringField;
xdwdsRemarksArcCFSId: TStringField;
xdwdsRemarksArcMemoType: TStringField;
xdwdsRemarksArcTimestamp: TStringField;
xdwdsRemarksArcBadgeNumber: TStringField;
xdwdsRemarksArcRemarks: TStringField;
wdsRemarksArc: TWebDataSource;
btnUntArc: TWebButton;
btnREMArc: TWebButton;
btnE911Arc: TWebButton;
btnCmpArc: TWebButton;
btnComplaintViewOnMapArc: TWebButton;
procedure WebFormCreate(Sender: TObject);
procedure btnCmpArcClick(Sender: TObject);
procedure btnE911ArcClick(Sender: TObject);
procedure btnREMArcClick(Sender: TObject);
procedure btnUntArcClick(Sender: TObject);
procedure btnComplaintViewOnMapArcClick(Sender: TObject);
private
FComplaintId: string;
FCfsId: string;
FAllMemos: TJSArray;
FShowCMP: Boolean;
FShowE911: Boolean;
FShowREM: Boolean;
FShowUNT: Boolean;
procedure WireUi;
procedure SetTextById(const Id, Value: string);
procedure SetHiddenById(const Id: string; Hidden: Boolean);
procedure SetButtonActive(aButton: TWebButton; Active: Boolean);
[async] procedure LoadArchiveAsync;
[async] procedure LoadMemosAsync;
procedure ApplyMemoFilters;
function GetMemoTypeCode(const MemoType: string): string;
function MemoTypeLabel(const MemoType: string): string;
public
class function CreateForm(const AHostId, AComplaintId: string): TFViewComplaintArchive;
end;
implementation
uses
View.Main;
{$R *.dfm}
class function TFViewComplaintArchive.CreateForm(const AHostId, AComplaintId: string): TFViewComplaintArchive;
begin
Result := TFViewComplaintArchive(inherited CreateNew(AHostId));
Result.FComplaintId := AComplaintId;
end;
procedure TFViewComplaintArchive.WebFormCreate(Sender: TObject);
begin
FAllMemos := nil;
FShowCMP := True;
FShowE911 := True;
FShowREM := True;
FShowUNT := True;
WireUi;
LoadArchiveAsync;
end;
procedure TFViewComplaintArchive.WireUi;
begin
// Nothing required here beyond component OnClick handlers;
// all element IDs are bound via the DFM.
end;
procedure TFViewComplaintArchive.SetTextById(const Id, Value: string);
var
el: TJSElement;
begin
el := Document.getElementById(Id);
if el <> nil then
el.innerHTML := Value;
end;
procedure TFViewComplaintArchive.SetHiddenById(const Id: string; Hidden: Boolean);
var
el: TJSHTMLElement;
begin
el := TJSHTMLElement(Document.getElementById(Id));
if el = nil then
Exit;
if Hidden then
el.classList.add('d-none')
else
el.classList.remove('d-none');
end;
procedure TFViewComplaintArchive.SetButtonActive(aButton: TWebButton; Active: Boolean);
var
el: TJSHTMLElement;
begin
if (aButton = nil) or (aButton.ElementHandle = nil) then
Exit;
el := TJSHTMLElement(aButton.ElementHandle);
if Active then
begin
el.classList.add('active');
el.setAttribute('aria-pressed', 'true');
end
else
begin
el.classList.remove('active');
el.setAttribute('aria-pressed', 'false');
end;
end;
[async] procedure TFViewComplaintArchive.LoadArchiveAsync;
var
resp: TXDataClientResponse;
rootObj: TJSObject;
dataObj: TJSObject;
business: string;
begin
resp := await(xdwcComplaintArchive.RawInvokeAsync('IApiService.GetComplaintArchiveDetails', [FComplaintId]));
rootObj := TJSObject(resp.Result);
dataObj := TJSObject(rootObj['data']);
// Summary title (optional)
SetTextById('lbl_summary_title_arc', 'Summary');
SetTextById('lbl_priority_arc', string(dataObj['Priority']));
SetTextById('lbl_dispatch_code_arc', string(dataObj['DispatchCodeDesc']));
SetTextById('lbl_dispatch_district_arc', string(dataObj['DispatchDistrict']));
SetTextById('lbl_address_arc', string(dataObj['Address']));
business := string(dataObj['Business']);
if business <> '' then
begin
SetTextById('lbl_business_arc', business);
SetHiddenById('row_business_arc', False);
end
else
SetHiddenById('row_business_arc', True);
// Status: same logic style as details; simplest is derive from timestamps if you want,
// but archive view can just show blank unless you prefer the full logic.
// If your archive endpoint includes a computed Status, you can display it directly.
if dataObj.hasOwnProperty('Status') then
SetTextById('lbl_status_arc', string(dataObj['Status']))
else
SetTextById('lbl_status_arc', '');
// CFSId is needed for memos
FCfsId := string(dataObj['CFSId']);
await(LoadMemosAsync);
end;
function TFViewComplaintArchive.MemoTypeLabel(const MemoType: string): string;
var
c: string;
begin
c := GetMemoTypeCode(MemoType);
if c = 'CMP' then Exit('CMP');
if c = 'E911' then Exit('E-911');
if c = 'REM' then Exit('REM');
if c = 'UNT' then Exit('UNT');
Result := MemoType;
end;
function TFViewComplaintArchive.GetMemoTypeCode(const MemoType: string): string;
var
mt: string;
begin
mt := LowerCase(Trim(MemoType));
// Match whatever your server returns in GetComplaintMemos:
// Keep these mappings aligned with ComplaintDetails.
if (mt = 'cmp') or (mt = 'complaint') then Exit('CMP');
if (mt = 'e-911') or (mt = 'e911') then Exit('E911');
if (mt = 'rem') or (mt = 'remarks') then Exit('REM');
if (mt = 'unt') or (mt = 'unit') then Exit('UNT');
Result := UpperCase(mt);
end;
[async] procedure TFViewComplaintArchive.LoadMemosAsync;
var
resp: TXDataClientResponse;
rootObj: TJSObject;
dataArr: TJSArray;
i: Integer;
memoObj: TJSObject;
memoType: string;
begin
// Reset dataset
xdwdsRemarksArc.Close;
resp := await(xdwcComplaintArchive.RawInvokeAsync('IApiService.GetComplaintMemos', [FCfsId]));
rootObj := TJSObject(resp.Result);
dataArr := TJSArray(rootObj['data']);
// Save master array for filtering
FAllMemos := dataArr;
// Add/normalize memo type label/code (client-side)
for i := 0 to dataArr.length - 1 do
begin
memoObj := TJSObject(dataArr[i]);
memoType := string(memoObj['MemoType']);
memoObj['MemoTypeCode'] := GetMemoTypeCode(memoType);
memoObj['MemoType'] := MemoTypeLabel(memoType);
end;
ApplyMemoFilters;
end;
procedure TFViewComplaintArchive.ApplyMemoFilters;
var
filtered: TJSArray;
i: Integer;
memoObj: TJSObject;
code: string;
ok: Boolean;
begin
if FAllMemos = nil then
Exit;
filtered := TJSArray.new;
for i := 0 to FAllMemos.length - 1 do
begin
memoObj := TJSObject(FAllMemos[i]);
code := string(memoObj['MemoTypeCode']);
ok := False;
if (code = 'CMP') and FShowCMP then ok := True;
if (code = 'E911') and FShowE911 then ok := True;
if (code = 'REM') and FShowREM then ok := True;
if (code = 'UNT') and FShowUNT then ok := True;
if ok then
filtered.push(memoObj);
end;
xdwdsRemarksArc.SetJsonData(filtered);
xdwdsRemarksArc.Open;
end;
procedure TFViewComplaintArchive.btnCmpArcClick(Sender: TObject);
begin
FShowCMP := not FShowCMP;
SetButtonActive(btnCmpArc, FShowCMP);
ApplyMemoFilters;
end;
procedure TFViewComplaintArchive.btnE911ArcClick(Sender: TObject);
begin
FShowE911 := not FShowE911;
SetButtonActive(btnE911Arc, FShowE911);
ApplyMemoFilters;
end;
procedure TFViewComplaintArchive.btnREMArcClick(Sender: TObject);
begin
FShowREM := not FShowREM;
SetButtonActive(btnREMArc, FShowREM);
ApplyMemoFilters;
end;
procedure TFViewComplaintArchive.btnUntArcClick(Sender: TObject);
begin
FShowUNT := not FShowUNT;
SetButtonActive(btnUntArc, FShowUNT);
ApplyMemoFilters;
end;
procedure TFViewComplaintArchive.btnComplaintViewOnMapArcClick(Sender: TObject);
begin
if Assigned(FViewMain) then
FViewMain.ShowMapFocusComplaint(FComplaintId);
end;
end.
object FViewComplaintDetails: TFViewComplaintDetails object FViewComplaintDetails: TFViewComplaintDetails
Width = 800 Width = 800
Height = 672 Height = 672
Caption = 'tbl_logs'
CSSLibrary = cssBootstrap CSSLibrary = cssBootstrap
ElementFont = efCSS ElementFont = efCSS
object btnHistory: TWebButton object btnHistory: TWebButton
...@@ -361,8 +360,8 @@ object FViewComplaintDetails: TFViewComplaintDetails ...@@ -361,8 +360,8 @@ object FViewComplaintDetails: TFViewComplaintDetails
ListSource = wdsWarnings ListSource = wdsWarnings
end end
object btnComplaintViewOnMap: TWebButton object btnComplaintViewOnMap: TWebButton
Left = 510 Left = 687
Top = 430 Top = 496
Width = 96 Width = 96
Height = 25 Height = 25
Caption = 'Map' Caption = 'Map'
...@@ -376,12 +375,12 @@ object FViewComplaintDetails: TFViewComplaintDetails ...@@ -376,12 +375,12 @@ object FViewComplaintDetails: TFViewComplaintDetails
end end
object xdwcComplaintDetails: TXDataWebClient object xdwcComplaintDetails: TXDataWebClient
Connection = DMConnection.ApiConnection Connection = DMConnection.ApiConnection
Left = 378 Left = 384
Top = 424 Top = 422
end end
object xdwdsRemarks: TXDataWebDataSet object xdwdsRemarks: TXDataWebDataSet
Left = 40 Left = 40
Top = 350 Top = 348
object xdwdsRemarksMemoId: TStringField object xdwdsRemarksMemoId: TStringField
FieldName = 'MemoId' FieldName = 'MemoId'
end end
...@@ -403,12 +402,15 @@ object FViewComplaintDetails: TFViewComplaintDetails ...@@ -403,12 +402,15 @@ object FViewComplaintDetails: TFViewComplaintDetails
end end
object wdsRemarks: TWebDataSource object wdsRemarks: TWebDataSource
DataSet = xdwdsRemarks DataSet = xdwdsRemarks
Left = 126 Left = 128
Top = 350 Top = 348
end end
object xdwdsHistory: TXDataWebDataSet object xdwdsHistory: TXDataWebDataSet
Left = 238 Left = 238
Top = 348 Top = 348
object xdwdsHistoryComplaintId: TStringField
FieldName = 'ComplaintId'
end
object xdwdsHistoryComplaint: TStringField object xdwdsHistoryComplaint: TStringField
FieldName = 'Complaint' FieldName = 'Complaint'
end end
...@@ -428,11 +430,11 @@ object FViewComplaintDetails: TFViewComplaintDetails ...@@ -428,11 +430,11 @@ object FViewComplaintDetails: TFViewComplaintDetails
object wdsHistory: TWebDataSource object wdsHistory: TWebDataSource
DataSet = xdwdsHistory DataSet = xdwdsHistory
Left = 328 Left = 328
Top = 350 Top = 348
end end
object xdwdsContacts: TXDataWebDataSet object xdwdsContacts: TXDataWebDataSet
Left = 436 Left = 438
Top = 352 Top = 348
object xdwdsContactsName: TStringField object xdwdsContactsName: TStringField
FieldName = 'Name' FieldName = 'Name'
end end
...@@ -448,12 +450,12 @@ object FViewComplaintDetails: TFViewComplaintDetails ...@@ -448,12 +450,12 @@ object FViewComplaintDetails: TFViewComplaintDetails
end end
object wdsContacts: TWebDataSource object wdsContacts: TWebDataSource
DataSet = xdwdsContacts DataSet = xdwdsContacts
Left = 530 Left = 532
Top = 352 Top = 348
end end
object xdwdsWarnings: TXDataWebDataSet object xdwdsWarnings: TXDataWebDataSet
Left = 634 Left = 612
Top = 492 Top = 422
object xdwdsWarningsCodeDesc: TStringField object xdwdsWarningsCodeDesc: TStringField
FieldName = 'CodeDesc' FieldName = 'CodeDesc'
end end
...@@ -466,7 +468,7 @@ object FViewComplaintDetails: TFViewComplaintDetails ...@@ -466,7 +468,7 @@ object FViewComplaintDetails: TFViewComplaintDetails
end end
object wdsWarnings: TWebDataSource object wdsWarnings: TWebDataSource
DataSet = xdwdsWarnings DataSet = xdwdsWarnings
Left = 728 Left = 712
Top = 492 Top = 422
end end
end end
...@@ -97,8 +97,8 @@ ...@@ -97,8 +97,8 @@
<button id="btn_complaint_view_on_map" <button id="btn_complaint_view_on_map"
type="button" type="button"
class="btn btn-primary btn-sm shadow position-fixed" class="btn btn-primary btn-sm shadow position-fixed"
style="right: 12px; bottom: 72px; z-index: 1040;"> style="right: 15px; bottom: 25px; z-index: 1040;">
View On Map Map
</button> </button>
</div> </div>
...@@ -54,6 +54,7 @@ type ...@@ -54,6 +54,7 @@ type
btnUnt: TWebButton; btnUnt: TWebButton;
lstWarnings: TWebDBListControl; lstWarnings: TWebDBListControl;
btnComplaintViewOnMap: TWebButton; btnComplaintViewOnMap: TWebButton;
xdwdsHistoryComplaintId: TStringField;
procedure btnRemarksClick(Sender: TObject); procedure btnRemarksClick(Sender: TObject);
procedure btnHistoryClick(Sender: TObject); procedure btnHistoryClick(Sender: TObject);
...@@ -560,6 +561,7 @@ begin ...@@ -560,6 +561,7 @@ begin
rootObj := TJSObject(resp.Result); rootObj := TJSObject(resp.Result);
dataObj := TJSObject(rootObj['data']); dataObj := TJSObject(rootObj['data']);
complaintText := string(dataObj['Complaint']); complaintText := string(dataObj['Complaint']);
priorityText := string(dataObj['Priority']); priorityText := string(dataObj['Priority']);
dispatchDescText := string(dataObj['DispatchCodeDesc']); dispatchDescText := string(dataObj['DispatchCodeDesc']);
......
...@@ -56,8 +56,8 @@ object FViewComplaints: TFViewComplaints ...@@ -56,8 +56,8 @@ object FViewComplaints: TFViewComplaints
'ustify-content-center gap-1"><button type="button" class="btn bt' + 'ustify-content-center gap-1"><button type="button" class="btn bt' +
'n-primary btn-sm complaint-details-btn" data-id="(%ComplaintId%)' + 'n-primary btn-sm complaint-details-btn" data-id="(%ComplaintId%)' +
'">Details</button><button type="button" class="btn btn-primary b' + '">Details</button><button type="button" class="btn btn-primary b' +
'tn-sm btn-complaint-map" data-id="(%ComplaintId%)">View On Map</' + 'tn-sm btn-complaint-map" data-id="(%ComplaintId%)">Map</button><' +
'button></div></div></div>' '/div></div></div>'
ListSource = wdsComplaints ListSource = wdsComplaints
end end
object xdwcComplaints: TXDataWebClient object xdwcComplaints: TXDataWebClient
...@@ -121,10 +121,4 @@ object FViewComplaints: TFViewComplaints ...@@ -121,10 +121,4 @@ object FViewComplaints: TFViewComplaints
Left = 156 Left = 156
Top = 410 Top = 410
end end
object tmrRefresh: TWebTimer
Interval = 30000
OnTimer = tmrRefreshTimer
Left = 164
Top = 44
end
end end
...@@ -31,20 +31,19 @@ type ...@@ -31,20 +31,19 @@ type
xdwdsComplaintsPriorityColor: TStringField; xdwdsComplaintsPriorityColor: TStringField;
xdwdsComplaintsPriorityTextColor: TStringField; xdwdsComplaintsPriorityTextColor: TStringField;
xdwdsComplaintsDistrictSector: TStringField; xdwdsComplaintsDistrictSector: TStringField;
tmrRefresh: TWebTimer;
xdwdsComplaintsBusiness: TStringField; xdwdsComplaintsBusiness: TStringField;
procedure WebFormCreate(Sender: TObject); procedure WebFormCreate(Sender: TObject);
procedure btnRefreshClick(Sender: TObject);
procedure tmrRefreshTimer(Sender: TObject);
procedure WebFormDestroy(Sender: TObject); procedure WebFormDestroy(Sender: TObject);
private private
FSelectProc: TSelectProc; FSelectProc: TSelectProc;
FLoading: Boolean; FLoading: Boolean;
FFirstLoad: Boolean;
[async] procedure GetComplaints; [async] procedure GetComplaints;
procedure HandleListClick(e: TJSMouseEvent); procedure HandleListClick(e: TJSMouseEvent);
procedure ShowHideBusinessRows; procedure ShowHideBusinessRows;
public public
property OnShowDetails: TSelectProc read FSelectProc write FSelectProc; property OnShowDetails: TSelectProc read FSelectProc write FSelectProc;
procedure RefreshData;
end; end;
var var
...@@ -57,19 +56,12 @@ implementation ...@@ -57,19 +56,12 @@ implementation
procedure TFViewComplaints.WebFormCreate(Sender: TObject); procedure TFViewComplaints.WebFormCreate(Sender: TObject);
begin begin
Document.addEventListener('click', @HandleListClick); Document.addEventListener('click', @HandleListClick);
ShowSpinner('spinner'); FFirstLoad := True;
tmrRefresh.Enabled := False;
GetComplaints; GetComplaints;
tmrRefresh.Enabled := True;
asm asm
if (!window.showComplaintDetails) { if (!window.showComplaintDetails) {
window.showComplaintDetails = function (id) { window.showComplaintDetails = function (id) {
console.log('JS bridge showComplaintDetails called, id=', id); pas['View.Main'].FViewMain.ShowComplaintDetails(id);
try {
pas['View.Main'].FViewMain.ShowComplaintDetails(id);
} catch (e) {
console.log('Error in TFViewMain.ShowComplaintDetails', e);
}
}; };
} }
end; end;
...@@ -139,18 +131,12 @@ begin ...@@ -139,18 +131,12 @@ begin
end; end;
end; end;
procedure TFViewComplaints.WebFormDestroy(Sender: TObject); procedure TFViewComplaints.WebFormDestroy(Sender: TObject);
begin begin
Document.removeEventListener('click', @HandleListClick); Document.removeEventListener('click', @HandleListClick);
end; end;
//Note: HTML for individual complaint cards can be found in the twebdblistcontrol HTMLString property //Note: HTML for individual complaint cards can be found in the twebdblistcontrol HTMLString property
procedure TFViewComplaints.btnRefreshClick(Sender: TObject);
begin
GetComplaints;
end;
[async] procedure TFViewComplaints.GetComplaints; [async] procedure TFViewComplaints.GetComplaints;
var var
xdcResponse: TXDataClientResponse; xdcResponse: TXDataClientResponse;
...@@ -161,7 +147,9 @@ begin ...@@ -161,7 +147,9 @@ begin
Exit; Exit;
FLoading := True; FLoading := True;
ShowSpinner('spinner');
if FFirstLoad then
ShowSpinner('spinner');
try try
try try
xdcResponse := await(xdwcComplaints.RawInvokeAsync('IApiService.GetComplaintList', [])); xdcResponse := await(xdwcComplaints.RawInvokeAsync('IApiService.GetComplaintList', []));
...@@ -182,13 +170,18 @@ begin ...@@ -182,13 +170,18 @@ begin
Utils.ShowErrorModal(E.Message); Utils.ShowErrorModal(E.Message);
end; end;
finally finally
HideSpinner('spinner');
FLoading := False; FLoading := False;
if FFirstLoad then
begin
HideSpinner('spinner');
FFirstLoad := False;
end;
end; end;
end; end;
procedure TFViewComplaints.tmrRefreshTimer(Sender: TObject); procedure TFViewComplaints.RefreshData;
begin begin
Console.Log('Complaints.RefreshData');
GetComplaints; GetComplaints;
end; end;
......
...@@ -76,7 +76,6 @@ procedure TFViewEditUser.btnCancelClick(Sender: TObject); ...@@ -76,7 +76,6 @@ procedure TFViewEditUser.btnCancelClick(Sender: TObject);
// Cancels the edit or addition // Cancels the edit or addition
begin begin
Info := 'Failure:Changes discarded!'; Info := 'Failure:Changes discarded!';
FViewMain.ShowUserForm(Info);
end; end;
procedure TFViewEditUser.btnCloseNotificationClick(Sender: TObject); procedure TFViewEditUser.btnCloseNotificationClick(Sender: TObject);
...@@ -222,7 +221,6 @@ begin ...@@ -222,7 +221,6 @@ begin
if (not Info.Contains('Failure')) then if (not Info.Contains('Failure')) then
begin begin
console.log('Navigating back to user list...'); console.log('Navigating back to user list...');
FViewMain.ShowUserForm(Info);
end end
else else
begin begin
......
object FViewMain: TFViewMain object FViewMain: TFViewMain
Width = 640 Width = 1208
Height = 586 Height = 810
CSSLibrary = cssBootstrap CSSLibrary = cssBootstrap
ElementFont = efCSS ElementFont = efCSS
OnCreate = WebFormCreate OnCreate = WebFormCreate
...@@ -16,18 +16,6 @@ object FViewMain: TFViewMain ...@@ -16,18 +16,6 @@ object FViewMain: TFViewMain
Visible = False Visible = False
WidthPercent = 100.000000000000000000 WidthPercent = 100.000000000000000000
end end
object wllblUserProfile: TWebLinkLabel
Left = 529
Top = 21
Width = 63
Height = 15
ElementID = 'dropdown.menu.userprofile'
Visible = False
HeightPercent = 100.000000000000000000
WidthPercent = 100.000000000000000000
OnClick = wllblUserProfileClick
Caption = ' User Profile'
end
object wllblLogout: TWebLinkLabel object wllblLogout: TWebLinkLabel
Left = 551 Left = 551
Top = 85 Top = 85
...@@ -61,7 +49,6 @@ object FViewMain: TFViewMain ...@@ -61,7 +49,6 @@ object FViewMain: TFViewMain
Visible = False Visible = False
HeightPercent = 100.000000000000000000 HeightPercent = 100.000000000000000000
WidthPercent = 100.000000000000000000 WidthPercent = 100.000000000000000000
OnClick = lblCallsListClick
Caption = 'Calls' Caption = 'Calls'
end end
object lblUsers: TWebLinkLabel object lblUsers: TWebLinkLabel
...@@ -74,7 +61,6 @@ object FViewMain: TFViewMain ...@@ -74,7 +61,6 @@ object FViewMain: TFViewMain
Visible = False Visible = False
HeightPercent = 100.000000000000000000 HeightPercent = 100.000000000000000000
WidthPercent = 100.000000000000000000 WidthPercent = 100.000000000000000000
OnClick = lblUsersClick
Caption = 'Users' Caption = 'Users'
end end
object lblMainTitle: TWebLabel object lblMainTitle: TWebLabel
...@@ -88,12 +74,12 @@ object FViewMain: TFViewMain ...@@ -88,12 +74,12 @@ object FViewMain: TFViewMain
HeightPercent = 100.000000000000000000 HeightPercent = 100.000000000000000000
WidthPercent = 100.000000000000000000 WidthPercent = 100.000000000000000000
end end
object WebPanel1: TWebPanel object pnlMain: TWebPanel
Left = 136 Left = 136
Top = 110 Top = 110
Width = 471 Width = 471
Height = 369 Height = 369
ElementID = 'main.webpanel' ElementID = 'pnl_main'
ChildOrder = 3 ChildOrder = 3
TabOrder = 0 TabOrder = 0
end end
...@@ -108,7 +94,7 @@ object FViewMain: TFViewMain ...@@ -108,7 +94,7 @@ object FViewMain: TFViewMain
end end
object WebMemo1: TWebMemo object WebMemo1: TWebMemo
Left = 136 Left = 136
Top = 467 Top = 469
Width = 471 Width = 471
Height = 83 Height = 83
ElementID = 'main.debugmemo' ElementID = 'main.debugmemo'
...@@ -121,8 +107,8 @@ object FViewMain: TFViewMain ...@@ -121,8 +107,8 @@ object FViewMain: TFViewMain
WidthPercent = 100.000000000000000000 WidthPercent = 100.000000000000000000
end end
object btnMap: TWebButton object btnMap: TWebButton
Left = 148 Left = 212
Top = 58 Top = 580
Width = 59 Width = 59
Height = 25 Height = 25
Caption = 'Map' Caption = 'Map'
...@@ -135,8 +121,8 @@ object FViewMain: TFViewMain ...@@ -135,8 +121,8 @@ object FViewMain: TFViewMain
OnClick = btnMapClick OnClick = btnMapClick
end end
object btnComplaints: TWebButton object btnComplaints: TWebButton
Left = 213 Left = 285
Top = 58 Top = 580
Width = 68 Width = 68
Height = 25 Height = 25
Caption = 'Complaints' Caption = 'Complaints'
...@@ -149,8 +135,8 @@ object FViewMain: TFViewMain ...@@ -149,8 +135,8 @@ object FViewMain: TFViewMain
OnClick = btnComplaintsClick OnClick = btnComplaintsClick
end end
object btnUnits: TWebButton object btnUnits: TWebButton
Left = 294 Left = 364
Top = 58 Top = 580
Width = 59 Width = 59
Height = 25 Height = 25
Caption = 'Units' Caption = 'Units'
...@@ -162,6 +148,55 @@ object FViewMain: TFViewMain ...@@ -162,6 +148,55 @@ object FViewMain: TFViewMain
WidthPercent = 100.000000000000000000 WidthPercent = 100.000000000000000000
OnClick = btnUnitsClick OnClick = btnUnitsClick
end end
object pnlMap: TWebPanel
Left = 708
Top = 99
Width = 237
Height = 436
ElementID = 'pnl_map'
ChildOrder = 3
TabOrder = 6
end
object pnlUnits: TWebPanel
Left = 740
Top = 180
Width = 227
Height = 139
ElementID = 'pnl_units'
ChildOrder = 3
TabOrder = 7
end
object pnlComplaints: TWebPanel
Left = 740
Top = 346
Width = 227
Height = 145
ElementID = 'pnl_complaints'
ChildOrder = 3
TabOrder = 8
end
object pnlDetails: TWebPanel
Left = 992
Top = 277
Width = 163
Height = 114
ElementID = 'pnl_details'
ChildOrder = 15
ElementFont = efCSS
TabOrder = 9
object btnDetailsModalClose: TWebButton
Left = 127
Top = 8
Width = 28
Height = 23
ElementID = 'btn_details_modal_close'
ElementFont = efCSS
HeightStyle = ssAuto
HeightPercent = 100.000000000000000000
WidthPercent = 100.000000000000000000
OnClick = btnDetailsModalCloseClick
end
end
object xdwcBadgeCounts: TXDataWebClient object xdwcBadgeCounts: TXDataWebClient
Connection = DMConnection.ApiConnection Connection = DMConnection.ApiConnection
Left = 44 Left = 44
...@@ -173,4 +208,10 @@ object FViewMain: TFViewMain ...@@ -173,4 +208,10 @@ object FViewMain: TFViewMain
Left = 42 Left = 42
Top = 360 Top = 360
end end
object tmrGlobalRefresh: TWebTimer
Interval = 30000
OnTimer = tmrGlobalRefreshTimer
Left = 42
Top = 434
end
end end
...@@ -13,16 +13,33 @@ ...@@ -13,16 +13,33 @@
<!-- Right: Connection label --> <!-- Right: Connection label -->
<span id="view.main.lblconnection" class="navbar-text text-light ms-auto"></span> <span id="view.main.lblconnection" class="navbar-text text-light ms-auto"></span>
</div> </div>
</nav> </nav>
<!-- Main content: fills space between navbars --> <!-- Main content: fills space between navbars -->
<main id="main.webpanel" class="flex-grow-1 position-relative p-0 overflow-hidden" style="min-height:0;"> <div id="pnl_main" class="flex-grow-1 position-relative p-0 overflow-hidden d-none" style="min-height:0;"></div>
<!-- TWebPanel content gets injected here --> <div id="pnl_map" class="flex-grow-1 position-relative p-0 overflow-hidden" style="min-height:0;"></div>
</main> <div id="pnl_units" class="flex-grow-1 position-relative p-0 overflow-hidden d-none" style="min-height:0;"></div>
<div id="pnl_complaints" class="flex-grow-1 position-relative p-0 overflow-hidden d-none" style="min-height:0;"></div>
<!-- Details modal (new panel pnl_details) -->
<div id="pnl_details"
class="position-fixed top-0 start-0 w-100 h-100 d-none d-flex justify-content-center align-items-center"
style="background: rgba(0,0,0,0.5); z-index:1060;">
<div class="card shadow-lg w-100 mx-2 d-flex flex-column" style="max-width: 98vw; height: 96%;">
<div class="card-header d-flex align-items-center justify-content-between">
<h5 class="card-title mb-0" id="lbl_details_title">Details</h5>
<button id="btn_details_modal_close" type="button" class="btn-close" aria-label="Close"></button>
</div>
<div class="card-body p-0 flex-grow-1 overflow-hidden" style="min-height:0;">
<div id="pnl_details_host" class="h-100"></div>
</div>
</div>
</div>
<!-- Bottom Nav --> <!-- Bottom Nav -->
<nav class="navbar navbar-dark bg-primary py-2 flex-shrink-0"> <nav id="bottom_nav" class="navbar navbar-dark bg-primary py-2 flex-shrink-0">
<div class="container-fluid"> <div class="container-fluid">
<div class="d-flex justify-content-center gap-3 w-100"> <div class="d-flex justify-content-center gap-3 w-100">
<button id="view.main.btnmap" type="button" class="btn btn-primary"> <button id="view.main.btnmap" type="button" class="btn btn-primary">
...@@ -86,4 +103,3 @@ ...@@ -86,4 +103,3 @@
</div> </div>
</div> </div>
</div> </div>
...@@ -6,14 +6,13 @@ uses ...@@ -6,14 +6,13 @@ uses
System.SysUtils, System.Classes, JS, Web, WEBLib.Graphics, WEBLib.Controls, System.SysUtils, System.Classes, JS, Web, WEBLib.Graphics, WEBLib.Controls,
WEBLib.Forms, WEBLib.Dialogs, WEBLib.ExtCtrls, Vcl.Controls, Vcl.StdCtrls, WEBLib.Forms, WEBLib.Dialogs, WEBLib.ExtCtrls, Vcl.Controls, Vcl.StdCtrls,
WEBLib.StdCtrls, Data.DB, XData.Web.JsonDataset, XData.Web.Dataset, WEBLib.StdCtrls, Data.DB, XData.Web.JsonDataset, XData.Web.Dataset,
App.Types, ConnectionModule, XData.Web.Client; App.Types, ConnectionModule, XData.Web.Client, View.Map, View.Units, View.Complaints;
type type
TFViewMain = class(TWebForm) TFViewMain = class(TWebForm)
lblUsername: TWebLabel; lblUsername: TWebLabel;
wllblUserProfile: TWebLinkLabel;
wllblLogout: TWebLinkLabel; wllblLogout: TWebLinkLabel;
WebPanel1: TWebPanel; pnlMain: TWebPanel;
WebMessageDlg1: TWebMessageDlg; WebMessageDlg1: TWebMessageDlg;
lblAppTitle: TWebLabel; lblAppTitle: TWebLabel;
WebMemo1: TWebMemo; WebMemo1: TWebMemo;
...@@ -25,39 +24,59 @@ type ...@@ -25,39 +24,59 @@ type
btnUnits: TWebButton; btnUnits: TWebButton;
tmrBadgeCounts: TWebTimer; tmrBadgeCounts: TWebTimer;
lblMainTitle: TWebLabel; lblMainTitle: TWebLabel;
pnlMap: TWebPanel;
pnlUnits: TWebPanel;
pnlComplaints: TWebPanel;
tmrGlobalRefresh: TWebTimer;
pnlDetails: TWebPanel;
btnDetailsModalClose: TWebButton;
procedure WebFormCreate(Sender: TObject); procedure WebFormCreate(Sender: TObject);
procedure mnuLogoutClick(Sender: TObject); procedure mnuLogoutClick(Sender: TObject);
procedure wllblUserProfileClick(Sender: TObject);
procedure wllblLogoutClick(Sender: TObject); procedure wllblLogoutClick(Sender: TObject);
procedure lblCallsListClick(Sender: TObject);
procedure lblUsersClick(Sender: TObject);
procedure btnUnitsClick(Sender: TObject); procedure btnUnitsClick(Sender: TObject);
procedure btnComplaintsClick(Sender: TObject); procedure btnComplaintsClick(Sender: TObject);
procedure btnMapClick(Sender: TObject); procedure btnMapClick(Sender: TObject);
procedure tmrBadgeCountsTimer(Sender: TObject); procedure tmrBadgeCountsTimer(Sender: TObject);
procedure tmrGlobalRefreshTimer(Sender: TObject);
procedure btnDetailsModalCloseClick(Sender: TObject);
private private
{ Private declarations } { Private declarations }
FUserInfo: string; FUserInfo: string;
FSearchSettings: string;
FChildForm: TWebForm; FChildForm: TWebForm;
FMapForm: TFViewMap;
FUnitsForm: TFViewUnits;
FComplaintsForm: TFViewComplaints;
FDetailsForm: TWebForm;
FLogoutProc: TLogoutProc; FLogoutProc: TLogoutProc;
FSearchProc: TSearchProc;
procedure ShowCrudForm( AFormClass: TWebFormClass );
//procedure EditUser( AParam, BParam, CParam, DParam, EParam: string);
function GetUserInfo: string;
[async] procedure RefreshBadgesAsync; [async] procedure RefreshBadgesAsync;
procedure ShowUnitDetails(UnitId: string); procedure ShowUnitDetails(UnitId: string);
procedure SetHeaderTitle(const title: string); procedure SetHeaderTitle(const title: string);
procedure HideDetailsModal;
procedure ShowDetailsModal(const titleText: string);
type TActivePanel = (apNone, apMap, apUnits, apComplaints);
var
FActivePanel: TActivePanel;
FGlobalRefreshTick: Integer;
FMapRefreshTick: Integer;
FUnitsRefreshTick: Integer;
FComplaintsRefreshTick: Integer;
procedure SetActivePanel(panel: TActivePanel);
procedure MarkPanelCreatedUpToDate(panel: TActivePanel);
procedure RefreshPanelIfNeeded(panel: TActivePanel);
procedure RefreshActivePanelFromTimer;
public public
{ Public declarations } { Public declarations }
class procedure Display(LogoutProc: TLogoutProc); class procedure Display(LogoutProc: TLogoutProc);
procedure ShowForm( AFormClass: TWebFormClass ); procedure ShowForm( AFormClass: TWebFormClass );
procedure EditUser( Mode, FullName, Username, Phone, Email: string; admin, active: boolean);
procedure ShowUserForm(Info: string);
procedure ShowComplaintDetails(ComplaintId: string); procedure ShowComplaintDetails(ComplaintId: string);
procedure SetActiveNavButton(const BtnId: string); procedure SetActiveNavButton(const BtnId: string);
procedure ShowMapFocusUnit(const unitId: string); procedure ShowMapFocusUnit(const unitId: string);
procedure ShowMapFocusComplaint(const complaintId: string); procedure ShowMapFocusComplaint(const complaintId: string);
procedure HidePanel(aPanel: TWebPanel);
procedure ShowPanel(aPanel: TWebPanel);
end; end;
var var
...@@ -69,10 +88,7 @@ uses ...@@ -69,10 +88,7 @@ uses
Auth.Service, Auth.Service,
View.Login, View.Login,
View.UserProfile, View.UserProfile,
View.Map,
View.Complaints,
View.ComplaintDetails, View.ComplaintDetails,
View.Units,
View.Admin, View.Admin,
View.Users, View.Users,
View.EditUser, View.EditUser,
...@@ -81,104 +97,156 @@ uses ...@@ -81,104 +97,156 @@ uses
{$R *.dfm} {$R *.dfm}
const
DETAILS_HOST_ID = 'pnl_details_host';
procedure TFViewMain.WebFormCreate(Sender: TObject); procedure TFViewMain.WebFormCreate(Sender: TObject);
var var
userName: string; userName: string;
begin begin
FUserInfo := GetUserInfo;
userName := JS.toString(AuthService.TokenPayload.Properties['user_name']); userName := JS.toString(AuthService.TokenPayload.Properties['user_name']);
lblUsername.Caption := ' ' + userName.ToLower + ' '; lblUsername.Caption := ' ' + userName.ToLower + ' ';
FChildForm := nil; FChildForm := nil;
if (not (JS.toBoolean(AuthService.TokenPayload.Properties['user_admin']))) then FDetailsForm := nil;
FActivePanel := apNone;
FGlobalRefreshTick := 0;
FMapRefreshTick := 0;
FUnitsRefreshTick := 0;
FComplaintsRefreshTick := 0;
if (not (JS.toBoolean(AuthService.TokenPayload.Properties['user_admin']))) then
lblUsers.Visible := false; lblUsers.Visible := false;
Utils.HideSpinner('spinner'); Utils.HideSpinner('spinner');
ShowForm(TFViewMap);
HidePanel(pnlMain);
ShowPanel(pnlMap);
HidePanel(pnlUnits);
HidePanel(pnlComplaints);
HidePanel(pnlDetails);
if not Assigned(FMapForm) then
begin
Application.CreateForm(TFViewMap, pnlMap.ElementID, TWebForm(FMapForm));
MarkPanelCreatedUpToDate(apMap);
end;
SetHeaderTitle('Map'); SetHeaderTitle('Map');
SetActiveNavButton('view.main.btnmap');
SetActivePanel(apMap);
RefreshBadgesAsync; RefreshBadgesAsync;
end; end;
procedure TFViewMain.SetHeaderTitle(const title: string);
var el: TJSElement; procedure TFViewMain.SetActivePanel(panel: TActivePanel);
begin begin
el := Document.getElementById('lbl_main_title'); FActivePanel := panel;
if el <> nil then
el.innerHTML := title
else
console.log('SetHeaderTitle: lbl_main_title not found');
end; end;
procedure TFViewMain.MarkPanelCreatedUpToDate(panel: TActivePanel);
procedure TFViewMain.lblUsersClick(Sender: TObject);
begin begin
ShowForm(TFViewUsers); case panel of
apMap: FMapRefreshTick := FGlobalRefreshTick;
apUnits: FUnitsRefreshTick := FGlobalRefreshTick;
apComplaints: FComplaintsRefreshTick := FGlobalRefreshTick;
end;
end; end;
procedure TFViewMain.lblCallsListClick(Sender: TObject); procedure TFViewMain.RefreshPanelIfNeeded(panel: TActivePanel);
var
needsRefresh: Boolean;
begin begin
ShowForm(TFViewComplaints); if FGlobalRefreshTick <= 0 then
Exit;
needsRefresh := False;
case panel of
apMap: needsRefresh := (FMapRefreshTick <> FGlobalRefreshTick);
apUnits: needsRefresh := (FUnitsRefreshTick <> FGlobalRefreshTick);
apComplaints: needsRefresh := (FComplaintsRefreshTick <> FGlobalRefreshTick);
end;
if not needsRefresh then
Exit;
Console.Log('GlobalRefresh: refreshing panel=' + IntToStr(Ord(panel)) + ' at tick=' + IntToStr(FGlobalRefreshTick));
case panel of
apMap:
if Assigned(FMapForm) then
FMapForm.RefreshData;
apUnits:
if Assigned(FUnitsForm) then
FUnitsForm.RefreshData;
apComplaints:
if Assigned(FComplaintsForm) then
FComplaintsForm.RefreshData;
end;
case panel of
apMap: FMapRefreshTick := FGlobalRefreshTick;
apUnits: FUnitsRefreshTick := FGlobalRefreshTick;
apComplaints: FComplaintsRefreshTick := FGlobalRefreshTick;
end;
end; end;
procedure TFViewMain.mnuLogoutClick(Sender: TObject); procedure TFViewMain.RefreshActivePanelFromTimer;
begin begin
FLogoutProc; RefreshPanelIfNeeded(FActivePanel);
end; end;
procedure TFViewMain.wllblLogoutClick(Sender: TObject); procedure TFViewMain.SetHeaderTitle(const title: string);
var el: TJSElement;
begin begin
FLogoutProc; el := Document.getElementById('lbl_main_title');
if el <> nil then
el.innerHTML := title
else
console.log('SetHeaderTitle: lbl_main_title not found');
end; end;
procedure TFViewMain.wllblUserProfileClick(Sender: TObject); procedure TFViewMain.mnuLogoutClick(Sender: TObject);
begin begin
ShowCrudForm(TFViewUserProfile); FLogoutProc;
end; end;
function TFViewMain.GetUserInfo: string; procedure TFViewMain.wllblLogoutClick(Sender: TObject);
var
userStr: string;
begin begin
userStr := '?username=' + JS.toString(AuthService.TokenPayload.Properties['user_name']); FLogoutProc;
userStr := userStr + '&fullname=' + JS.toString(AuthService.TokenPayload.Properties['user_fullname']);
userStr := userStr + '&agency=' + JS.toString(AuthService.TokenPayload.Properties['user_agency']);
userStr := userStr + '&badge=' + JS.toString(AuthService.TokenPayload.Properties['user_badge']);
userStr := userStr + '&userid=' + JS.toString(AuthService.TokenPayload.Properties['user_id']);
userStr := userStr + '&personnelid=' + JS.toString(AuthService.TokenPayload.Properties['user_personnelid']);
Result := userStr;
end; end;
procedure TFViewMain.btnComplaintsClick(Sender: TObject); procedure TFViewMain.btnComplaintsClick(Sender: TObject);
begin begin
SetHeaderTitle('Complaints');
SetActiveNavButton('view.main.btncomplaints');
ShowForm(TFViewComplaints); ShowForm(TFViewComplaints);
end;
if (FChildForm is TFViewComplaints) then
TFViewComplaints(FChildForm).OnShowDetails := procedure TFViewMain.btnDetailsModalCloseClick(Sender: TObject);
procedure(AComplaintId: string) begin
begin HideDetailsModal;
ShowComplaintDetails(AComplaintId);
end;
end; end;
procedure TFViewMain.btnMapClick(Sender: TObject); procedure TFViewMain.btnMapClick(Sender: TObject);
begin begin
SetHeaderTitle('Map');
SetActiveNavButton('view.main.btnmap');
ShowForm(TFViewMap); ShowForm(TFViewMap);
end; end;
procedure TFViewMain.btnUnitsClick(Sender: TObject); procedure TFViewMain.btnUnitsClick(Sender: TObject);
begin begin
SetHeaderTitle('Units');
SetActiveNavButton('view.main.btnunits');
ShowForm(TFViewUnits); ShowForm(TFViewUnits);
end; end;
class procedure TFViewMain.Display(LogoutProc: TLogoutProc); class procedure TFViewMain.Display(LogoutProc: TLogoutProc);
begin begin
if Assigned(FViewMain) then if Assigned(FViewMain) then
...@@ -188,47 +256,130 @@ begin ...@@ -188,47 +256,130 @@ begin
end; end;
procedure TFViewMain.ShowCrudForm(AFormClass: TWebFormClass); procedure TFViewMain.ShowForm(AFormClass: TWebFormClass);
begin begin
ShowForm(AFormClass); HideDetailsModal;
end;
if AFormClass = TFViewMap then
begin
ShowPanel(pnlMap);
HidePanel(pnlUnits);
HidePanel(pnlComplaints);
HidePanel(pnlMain);
procedure TFViewMain.ShowForm(AFormClass: TWebFormClass); SetHeaderTitle('Map');
begin SetActiveNavButton('view.main.btnmap');
if Assigned(FChildForm) then SetActivePanel(apMap);
if not Assigned(FMapForm) then
begin
Application.CreateForm(TFViewMap, pnlMap.ElementID, TWebForm(FMapForm));
MarkPanelCreatedUpToDate(apMap);
end
else
RefreshPanelIfNeeded(apMap);
Exit;
end;
if AFormClass = TFViewUnits then
begin
HidePanel(pnlMap);
ShowPanel(pnlUnits);
HidePanel(pnlComplaints);
HidePanel(pnlMain);
SetHeaderTitle('Units');
SetActiveNavButton('view.main.btnunits');
SetActivePanel(apUnits);
if not Assigned(FUnitsForm) then
begin
Application.CreateForm(TFViewUnits, pnlUnits.ElementID, TWebForm(FUnitsForm));
MarkPanelCreatedUpToDate(apUnits);
end
else
RefreshPanelIfNeeded(apUnits);
Exit;
end;
if AFormClass = TFViewComplaints then
begin
HidePanel(pnlMap);
HidePanel(pnlUnits);
ShowPanel(pnlComplaints);
HidePanel(pnlMain);
SetHeaderTitle('Complaints');
SetActiveNavButton('view.main.btncomplaints');
SetActivePanel(apComplaints);
if not Assigned(FComplaintsForm) then
begin
Application.CreateForm(TFViewComplaints, pnlComplaints.ElementID, TWebForm(FComplaintsForm));
MarkPanelCreatedUpToDate(apComplaints);
end
else
RefreshPanelIfNeeded(apComplaints);
Exit;
end;
// everything else (admin/users/etc)
SetActivePanel(apNone);
HidePanel(pnlMap);
HidePanel(pnlUnits);
HidePanel(pnlComplaints);
ShowPanel(pnlMain);
if Assigned(FChildForm) and (FChildForm <> FMapForm) and (FChildForm <> FUnitsForm) and (FChildForm <> FComplaintsForm) then
FChildForm.Free; FChildForm.Free;
Application.CreateForm(AFormClass, WebPanel1.ElementID, FChildForm);
Application.CreateForm(AFormClass, pnlMain.ElementID, FChildForm);
end; end;
procedure TFViewMain.EditUser( Mode, FullName, Username, Phone, Email: string; Admin, Active: boolean); procedure TFViewMain.HidePanel(aPanel: TWebPanel);
var
el: TJSHTMLElement;
begin begin
if Assigned(FChildForm) then if (aPanel = nil) or (aPanel.ElementHandle = nil) then
FChildForm.Free; Exit;
FChildForm := TFViewEditUser.CreateForm(WebPanel1.ElementID, Mode, FullName, Username, Phone, Email, Admin, Active);
el := TJSHTMLElement(aPanel.ElementHandle);
el.classList.add('d-none');
end; end;
procedure TFViewMain.ShowUserForm(Info: string); procedure TFViewMain.ShowPanel(aPanel: TWebPanel);
var
el: TJSHTMLElement;
begin begin
if Assigned(FChildForm) then if (aPanel = nil) or (aPanel.ElementHandle = nil) then
FChildForm.Free; Exit;
FChildForm := TFViewUsers.CreateForm(WebPanel1.ElementID, Info);
el := TJSHTMLElement(aPanel.ElementHandle);
el.classList.remove('d-none');
end; end;
procedure TFViewMain.ShowComplaintDetails(ComplaintId: string); procedure TFViewMain.ShowComplaintDetails(ComplaintId: string);
begin begin
SetHeaderTitle('Complaint Details'); ShowDetailsModal('Complaint Details');
if Assigned(FChildForm) then
FChildForm.Free; if Assigned(FDetailsForm) then
FChildForm := TFViewComplaintDetails.CreateForm(WebPanel1.ElementID, ComplaintId); FDetailsForm.Free;
FDetailsForm := TFViewComplaintDetails.CreateForm(DETAILS_HOST_ID, ComplaintId);
end; end;
procedure TFViewMain.ShowUnitDetails(UnitId: string); procedure TFViewMain.ShowUnitDetails(UnitId: string);
begin begin
SetHeaderTitle('Unit Details'); ShowDetailsModal('Unit Details');
if Assigned(FChildForm) then
FChildForm.Free; if Assigned(FDetailsForm) then
FChildForm := TFViewUnitDetails.CreateForm(WebPanel1.ElementID, UnitId); FDetailsForm.Free;
FDetailsForm := TFViewUnitDetails.CreateForm(DETAILS_HOST_ID, UnitId);
end; end;
...@@ -240,12 +391,10 @@ begin ...@@ -240,12 +391,10 @@ begin
c := TJSHTMLElement(btnComplaints.ElementHandle); c := TJSHTMLElement(btnComplaints.ElementHandle);
u := TJSHTMLElement(btnUnits.ElementHandle); u := TJSHTMLElement(btnUnits.ElementHandle);
// clear
m.classList.remove('active'); m.classList.remove('active');
c.classList.remove('active'); c.classList.remove('active');
u.classList.remove('active'); u.classList.remove('active');
// set
if btnId = 'view.main.btnmap' then if btnId = 'view.main.btnmap' then
m.classList.add('active') m.classList.add('active')
else if btnId = 'view.main.btncomplaints' then else if btnId = 'view.main.btncomplaints' then
...@@ -262,6 +411,13 @@ begin ...@@ -262,6 +411,13 @@ begin
end; end;
procedure TFViewMain.tmrGlobalRefreshTimer(Sender: TObject);
begin
Inc(FGlobalRefreshTick);
Console.Log('GlobalRefresh tick=' + IntToStr(FGlobalRefreshTick) + ' activePanel=' + IntToStr(Ord(FActivePanel)));
RefreshActivePanelFromTimer;
end;
[async] procedure TFViewMain.RefreshBadgesAsync; [async] procedure TFViewMain.RefreshBadgesAsync;
var var
resp: TXDataClientResponse; resp: TXDataClientResponse;
...@@ -296,8 +452,6 @@ procedure TFViewMain.ShowMapFocusUnit(const unitId: string); ...@@ -296,8 +452,6 @@ procedure TFViewMain.ShowMapFocusUnit(const unitId: string);
var var
pendingUnitId: string; pendingUnitId: string;
begin begin
SetHeaderTitle('Map');
SetActiveNavButton('view.main.btnmap');
ShowForm(TFViewMap); ShowForm(TFViewMap);
pendingUnitId := unitId; pendingUnitId := unitId;
...@@ -305,8 +459,8 @@ begin ...@@ -305,8 +459,8 @@ begin
window.setTimeout( window.setTimeout(
procedure procedure
begin begin
if (FChildForm <> nil) and (FChildForm is TFViewMap) then if Assigned(FMapForm) then
TFViewMap(FChildForm).FocusUnit(pendingUnitId); FMapForm.FocusUnit(pendingUnitId);
end, 50); end, 50);
end; end;
...@@ -314,19 +468,43 @@ procedure TFViewMain.ShowMapFocusComplaint(const complaintId: string); ...@@ -314,19 +468,43 @@ procedure TFViewMain.ShowMapFocusComplaint(const complaintId: string);
var var
pendingComplaintId: string; pendingComplaintId: string;
begin begin
SetHeaderTitle('Map');
SetActiveNavButton('view.main.btnmap');
ShowForm(TFViewMap); ShowForm(TFViewMap);
pendingComplaintId := complaintId; pendingComplaintId := complaintId;
window.setTimeout( window.setTimeout(
procedure procedure
begin begin
if (FChildForm <> nil) and (FChildForm is TFViewMap) then if Assigned(FMapForm) then
TFViewMap(FChildForm).FocusComplaint(pendingComplaintId); FMapForm.FocusComplaint(pendingComplaintId);
end, 50); end, 50);
end; end;
//------------------------------------------------------------------------------
procedure TFViewMain.HideDetailsModal;
begin
HidePanel(pnlDetails);
if Assigned(FDetailsForm) then
begin
FDetailsForm.Free;
FDetailsForm := nil;
end;
end;
procedure TFViewMain.ShowDetailsModal(const titleText: string);
var
el: TJSElement;
begin
ShowPanel(pnlDetails);
el := Document.getElementById('lbl_details_title');
if el <> nil then
el.innerHTML := titleText;
end;
end. end.
...@@ -72,17 +72,11 @@ object FViewMap: TFViewMap ...@@ -72,17 +72,11 @@ object FViewMap: TFViewMap
Left = 232 Left = 232
Top = 696 Top = 696
end end
object tmrRefresh: TWebTimer
Interval = 30000
OnTimer = tmrRefreshTimer
Left = 358
Top = 696
end
object tmrLocate: TWebTimer object tmrLocate: TWebTimer
Enabled = False Enabled = False
Interval = 100 Interval = 100
OnTimer = tmrLocateTimer OnTimer = tmrLocateTimer
Left = 174 Left = 222
Top = 74 Top = 52
end end
end end
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
</div> </div>
<div class="form-check"> <div class="form-check">
<input class="form-check-input" type="checkbox" id="map_filter_location"> <input class="form-check-input" type="checkbox" id="map_filter_location">
<label class="form-check-label" for="map_filter_location">Show Location</label> <label class="form-check-label" for="map_filter_location">Show My Location</label>
</div> </div>
</div> </div>
<div class="d-grid gap-2 mt-4"> <div class="d-grid gap-2 mt-4">
...@@ -50,7 +50,6 @@ ...@@ -50,7 +50,6 @@
class="btn btn-primary border shadow position-absolute bottom-0 end-0 me-2 mb-4" class="btn btn-primary border shadow position-absolute bottom-0 end-0 me-2 mb-4"
style="z-index:1000;"> style="z-index:1000;">
<i class="fa fa-crosshairs"></i> <i class="fa fa-crosshairs"></i>
<span class="d-none d-sm-inline">Locate</span>
</button> </button>
<!-- Filters (top-right) --> <!-- Filters (top-right) -->
......
...@@ -16,7 +16,6 @@ type ...@@ -16,7 +16,6 @@ type
lfMap: TTMSFNCLeaflet; lfMap: TTMSFNCLeaflet;
httpReqGeoJson: TWebHttpRequest; httpReqGeoJson: TWebHttpRequest;
xdwcMap: TXDataWebClient; xdwcMap: TXDataWebClient;
tmrRefresh: TWebTimer;
btnFindLocation: TWebButton; btnFindLocation: TWebButton;
tmrLocate: TWebTimer; tmrLocate: TWebTimer;
...@@ -25,7 +24,6 @@ type ...@@ -25,7 +24,6 @@ type
procedure lfMapCustomizeMarker(Sender: TObject; procedure lfMapCustomizeMarker(Sender: TObject;
var ACustomizeMarker: string); var ACustomizeMarker: string);
procedure lfMapCustomizeCSS(Sender: TObject; var ACustomizeCSS: string); procedure lfMapCustomizeCSS(Sender: TObject; var ACustomizeCSS: string);
procedure tmrRefreshTimer(Sender: TObject);
procedure btnFindLocationClick(Sender: TObject); procedure btnFindLocationClick(Sender: TObject);
procedure tmrLocateTimer(Sender: TObject); procedure tmrLocateTimer(Sender: TObject);
private private
...@@ -50,6 +48,7 @@ type ...@@ -50,6 +48,7 @@ type
public public
procedure FocusUnit(const unitId: string); procedure FocusUnit(const unitId: string);
procedure FocusComplaint(const complaintId: string); procedure FocusComplaint(const complaintId: string);
procedure RefreshData;
end; end;
var var
...@@ -70,20 +69,16 @@ begin ...@@ -70,20 +69,16 @@ begin
httpReqGeoJson.Execute; httpReqGeoJson.Execute;
asm asm
window.showComplaintDetails = function (id) { window.showComplaintDetails = function (id) {
console.log('JS bridge showComplaintDetails called, id=', id);
try { try {
pas['View.Main'].FViewMain.ShowComplaintDetails(id); pas['View.Main'].FViewMain.ShowComplaintDetails(id);
} catch (e) { } catch (e) {
console.log('Error in TFViewMain.ShowComplaintDetails', e);
} }
}; };
window.showUnitDetails = function (id) { window.showUnitDetails = function (id) {
console.log('JS bridge showUnitDetails called, id=', id);
try { try {
pas['View.Main'].FViewMain.ShowUnitDetails(id); pas['View.Main'].FViewMain.ShowUnitDetails(id);
} catch (e) { } catch (e) {
console.log('Error in TFViewMain.ShowUnitDetails', e);
} }
}; };
end; end;
...@@ -155,9 +150,7 @@ begin ...@@ -155,9 +150,7 @@ begin
try try
lfMap.Polygons.Clear; lfMap.Polygons.Clear;
Console.Log('GeoJSON len=' + AResponse.Length.ToString);
lfMap.LoadGeoJSONFromText(AResponse, True, Trim(FPendingUnitId) = ''); lfMap.LoadGeoJSONFromText(AResponse, True, Trim(FPendingUnitId) = '');
Console.Log('Loaded polygons count=' + lfMap.Polygons.Count.ToString);
for i := 0 to lfMap.Polygons.Count - 1 do for i := 0 to lfMap.Polygons.Count - 1 do
begin begin
...@@ -290,7 +283,6 @@ begin ...@@ -290,7 +283,6 @@ begin
// --- Swap Markers (no blank map while loading) --------------------------- // --- Swap Markers (no blank map while loading) ---------------------------
lfMap.BeginUpdate; lfMap.BeginUpdate;
try try
// Delete old unit/complaint markers right before adding new ones
for i := lfMap.Markers.Count - 1 downto 0 do for i := lfMap.Markers.Count - 1 downto 0 do
begin begin
m := lfMap.Markers[i]; m := lfMap.Markers[i];
...@@ -299,7 +291,7 @@ begin ...@@ -299,7 +291,7 @@ begin
lfMap.Markers.Delete(i); lfMap.Markers.Delete(i);
end; end;
// Add unit markers // Unit markers
if unitsData <> nil then if unitsData <> nil then
begin begin
for i := 0 to unitsData.Length - 1 do for i := 0 to unitsData.Length - 1 do
...@@ -404,12 +396,11 @@ begin ...@@ -404,12 +396,11 @@ begin
'</div>'; '</div>';
m.DataString := 'unit|' + unitId; m.DataString := 'unit|' + unitId;
console.log('Unit marker ds=' + m.DataString);
m.IconURL := CarIconForDistrict(dist); m.IconURL := CarIconForDistrict(dist);
end; end;
end; end;
// Add complaint markers // Complaint markers
if complaintsData <> nil then if complaintsData <> nil then
begin begin
for i := 0 to complaintsData.Length - 1 do for i := 0 to complaintsData.Length - 1 do
...@@ -645,14 +636,6 @@ begin ...@@ -645,14 +636,6 @@ begin
FDoFocusZoom := False; FDoFocusZoom := False;
end; end;
procedure TFViewMap.tmrRefreshTimer(Sender: TObject);
begin
if FLoadingPoints then
Exit;
LoadPointsAsync(False);
end;
procedure TFViewMap.btnFindLocationClick(Sender: TObject); procedure TFViewMap.btnFindLocationClick(Sender: TObject);
var var
coord: TTMSFNCMapsCoordinateRec; coord: TTMSFNCMapsCoordinateRec;
...@@ -662,6 +645,13 @@ begin ...@@ -662,6 +645,13 @@ begin
coord := CreateCoordinate(userLocationMarker.Latitude, userLocationMarker.Longitude); coord := CreateCoordinate(userLocationMarker.Latitude, userLocationMarker.Longitude);
lfMap.SetCenterCoordinate(coord); lfMap.SetCenterCoordinate(coord);
FPendingFocusCoord := coord;
FPendingFocusZoom := 17;
FDoFocusZoom := True;
tmrLocate.Interval := 250;
tmrLocate.Enabled := True;
end; end;
...@@ -758,6 +748,12 @@ begin ...@@ -758,6 +748,12 @@ begin
end; end;
procedure TFViewMap.RefreshData;
begin
Console.Log('Map.RefreshData');
LoadPointsAsync(False);
end;
end. end.
...@@ -95,7 +95,7 @@ ...@@ -95,7 +95,7 @@
<button id="btn_unit_view_on_map" <button id="btn_unit_view_on_map"
type="button" type="button"
class="btn btn-primary btn-sm shadow position-fixed" class="btn btn-primary btn-sm shadow position-fixed"
style="right: 12px; bottom: 72px; z-index: 1040;"> style="right: 15px; bottom: 25px; z-index: 1040;">
Map Map
</button> </button>
</div> </div>
......
...@@ -53,7 +53,7 @@ object FViewUnits: TFViewUnits ...@@ -53,7 +53,7 @@ object FViewUnits: TFViewUnits
'pe="button" class="btn btn-primary btn-sm btn-unit-details" data' + 'pe="button" class="btn btn-primary btn-sm btn-unit-details" data' +
'-unitid="(%UnitId%)">Details</button> <button type="button"' + '-unitid="(%UnitId%)">Details</button> <button type="button"' +
' class="btn btn-primary btn-sm btn-unit-map" data-unitid="(%Unit' + ' class="btn btn-primary btn-sm btn-unit-map" data-unitid="(%Unit' +
'Id%)">View On Map</button> </div> </div></div>' 'Id%)">Map</button> </div> </div></div>'
ListSource = wdsUnits ListSource = wdsUnits
end end
object wdsUnits: TWebDataSource object wdsUnits: TWebDataSource
...@@ -96,10 +96,4 @@ object FViewUnits: TFViewUnits ...@@ -96,10 +96,4 @@ object FViewUnits: TFViewUnits
Left = 58 Left = 58
Top = 410 Top = 410
end end
object tmrRefresh: TWebTimer
Interval = 30000
OnTimer = tmrRefreshTimer
Left = 172
Top = 22
end
end end
...@@ -25,16 +25,14 @@ type ...@@ -25,16 +25,14 @@ type
xdwdsUnitsOfficer1: TStringField; xdwdsUnitsOfficer1: TStringField;
xdwdsUnitsOfficer2: TStringField; xdwdsUnitsOfficer2: TStringField;
xdwdsUnitsCallType: TStringField; xdwdsUnitsCallType: TStringField;
tmrRefresh: TWebTimer;
procedure WebFormCreate(Sender: TObject); procedure WebFormCreate(Sender: TObject);
procedure btnRefreshClick(Sender: TObject);
procedure tmrRefreshTimer(Sender: TObject);
private private
FLoading: Boolean; FLoading: Boolean;
FFirstLoad: Boolean;
[async] procedure GetUnits; [async] procedure GetUnits;
procedure HandleListClick(e: TJSMouseEvent); procedure HandleListClick(e: TJSMouseEvent);
public public
procedure RefreshData;
end; end;
var var
...@@ -49,19 +47,13 @@ procedure TFViewUnits.WebFormCreate(Sender: TObject); ...@@ -49,19 +47,13 @@ procedure TFViewUnits.WebFormCreate(Sender: TObject);
begin begin
DMConnection.ApiConnection.Connected := True; DMConnection.ApiConnection.Connected := True;
Document.addEventListener('click', @HandleListClick); Document.addEventListener('click', @HandleListClick);
tmrRefresh.Enabled := False; FFirstLoad := True;
GetUnits; GetUnits;
tmrRefresh.Enabled := True;
asm asm
if (!window.showUnitDetails) { if (!window.showUnitDetails) {
window.showUnitDetails = function (id) { window.showUnitDetails = function (id) {
console.log('JS bridge showUnitDetails called, id=', id); pas['View.Main'].FViewMain.ShowUnitDetails(id);
try {
pas['View.Main'].FViewMain.ShowUnitDetails(id);
} catch (e) {
console.log('Error in TFViewMain.ShowUnitDetails', e);
}
}; };
} }
end; end;
...@@ -106,68 +98,56 @@ begin ...@@ -106,68 +98,56 @@ begin
e.stopPropagation; e.stopPropagation;
asm asm
try { pas['View.Main'].FViewMain.ShowMapFocusUnit(unitId);
pas['View.Main'].FViewMain.ShowMapFocusUnit(unitId);
} catch (e) {
console.log('ShowMapFocusUnit failed', e);
}
end; end;
end; end;
end; end;
end; end;
procedure TFViewUnits.btnRefreshClick(Sender: TObject); [async] procedure TFViewUnits.GetUnits;
begin
GetUnits;
end;
procedure TFViewUnits.GetUnits;
var var
xdcResponse: TXDataClientResponse; xdcResponse: TXDataClientResponse;
respObj: TJSObject; respObj: TJSObject;
unitCount: Integer; unitCount: Integer;
begin begin
if FLoading then Exit; if FLoading then
Exit;
FLoading := True; FLoading := True;
console.log('GetUnits: Invoking API...'); if FFirstLoad then
Utils.ShowSpinner('spinner'); Utils.ShowSpinner('spinner');
try try
try try
xdcResponse := await(xdwcUnits.RawInvokeAsync('IApiService.GetUnitList', [])); xdcResponse := await(xdwcUnits.RawInvokeAsync('IApiService.GetUnitList', []));
console.log('RawInvoke returned:', xdcResponse.Result);
respObj := TJSObject(xdcResponse.Result); respObj := TJSObject(xdcResponse.Result);
xdwdsUnits.Close; xdwdsUnits.Close;
console.log('Units dataset closed');
xdwdsUnits.SetJsonData(respObj['data']); xdwdsUnits.SetJsonData(respObj['data']);
console.log('JsonData set on units dataset:', respObj['data']);
xdwdsUnits.Open; xdwdsUnits.Open;
console.log('Units dataset opened. Record count:', xdwdsUnits.RecordCount);
unitCount := Integer(respObj['count']); unitCount := Integer(respObj['count']);
lblEntries.Caption := Format('%d units', [unitCount]); lblEntries.Caption := Format('%d units', [unitCount]);
console.log('Units label updated:', lblEntries.Caption);
except except
on E: EXDataClientRequestException do on E: EXDataClientRequestException do
begin
console.log('XData exception (units):', E.ErrorResult.ErrorMessage);
Utils.ShowErrorModal(E.ErrorResult.ErrorMessage); Utils.ShowErrorModal(E.ErrorResult.ErrorMessage);
end; on E: Exception do
Utils.ShowErrorModal(E.Message);
end; end;
finally finally
if FFirstLoad then
Utils.HideSpinner('spinner');
FFirstLoad := False;
FLoading := False; FLoading := False;
Utils.HideSpinner('spinner');
console.log('GetUnits complete');
end; end;
end; end;
procedure TFViewUnits.tmrRefreshTimer(Sender: TObject); procedure TFViewUnits.RefreshData;
begin begin
Console.Log('Units.RefreshData');
GetUnits; GetUnits;
end; end;
......
...@@ -150,7 +150,6 @@ begin ...@@ -150,7 +150,6 @@ begin
isActive := false isActive := false
else else
isActive := true; isActive := true;
FViewMain.EditUser('Edit', Username.innerText, FullName.innerText, PhoneNum.innerText, Email.innerText, isAdmin, isActive);
end; end;
...@@ -483,8 +482,7 @@ end; ...@@ -483,8 +482,7 @@ end;
procedure TFViewUsers.btnAddUserClick(Sender: TObject); procedure TFViewUsers.btnAddUserClick(Sender: TObject);
begin begin
//Info := ''; //Info := '';mm
FViewMain.EditUser('Add', '', '', '', '', false, true);
end; end;
procedure TFViewUsers.btnCloseNotificationClick(Sender: TObject); procedure TFViewUsers.btnCloseNotificationClick(Sender: TObject);
......
{
"type": "FeatureCollection",
"name": "BFDDistrict",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{ "type": "Feature", "properties": { "SBE4_ID": 0, "NAME": "District A", "FROMLEFT": 0, "TOLEFT": 0, "FROMRIGHT": 0, "TORIGHT": 0, "DIRECTION": null, "STREET": null, "ST_TYPE": null, "ST_PREFIX": null, "ST_SUFFIX": null, "CITY_LEFT": null, "CITY_RIGHT": null, "LO_X_PRE": null, "LO_X_NAME": null, "LO_X_TYPE": null, "LO_X_SUF": null, "HI_X_PRE": null, "HI_X_NAME": null, "HI_X_TYPE": null, "HI_X_SUF": null, "LHS": null, "RHS": null, "BDY_LEFT": null, "BDY_RIGHT": null, "ST_CODE": null, "RECNUM_L": 0, "RECNUM_R": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -78.838580621137581, 42.832640624242444 ], [ -78.838579379349227, 42.832637828223341 ], [ -78.853769883224203, 42.832256243942119 ], [ -78.85371958445721, 42.832194871720155 ], [ -78.853733424580213, 42.83219689697404 ], [ -78.860055694936989, 42.831634192917498 ], [ -78.86013734228284, 42.832269841506786 ], [ -78.859896026339129, 42.832680803438883 ], [ -78.860331112959102, 42.833777534545568 ], [ -78.86034975462735, 42.834904906086862 ], [ -78.85768545019738, 42.835848144550688 ], [ -78.858114869151507, 42.837605053389701 ], [ -78.857536532421037, 42.838545513856914 ], [ -78.858096352651074, 42.839687337785485 ], [ -78.861864583480241, 42.838698386233297 ], [ -78.86205975340269, 42.838902003038619 ], [ -78.862692380919711, 42.838804946201897 ], [ -78.862728132922896, 42.839242703902777 ], [ -78.859568800903887, 42.840181676978965 ], [ -78.859407395065432, 42.841296969378085 ], [ -78.865712578238899, 42.852676330854607 ], [ -78.87162174026551, 42.851292456357271 ], [ -78.872016282892517, 42.851882361006176 ], [ -78.872097013700895, 42.852401028660957 ], [ -78.868731884242095, 42.853274149621917 ], [ -78.869204890923257, 42.85390708456859 ], [ -78.872490649359548, 42.852817958505078 ], [ -78.876741180919694, 42.858996499122377 ], [ -78.874396356987731, 42.859770389677344 ], [ -78.873619753263739, 42.859660821705866 ], [ -78.87399285072668, 42.859861633865819 ], [ -78.874543180109029, 42.860234969333924 ], [ -78.875014936030652, 42.860593987099257 ], [ -78.8750512940248, 42.85997418590776 ], [ -78.876811140388725, 42.859277953228293 ], [ -78.882510814894758, 42.867189761467436 ], [ -78.878932430206248, 42.868654634149287 ], [ -78.879480450569972, 42.869349562574541 ], [ -78.883495141721355, 42.868167220890896 ], [ -78.883750388309764, 42.868756350747567 ], [ -78.880095121304095, 42.870078422117274 ], [ -78.880646408234384, 42.870624672382412 ], [ -78.884421489903062, 42.869274555253369 ], [ -78.890271939124617, 42.87558582502659 ], [ -78.887965695107951, 42.876802504379924 ], [ -78.890098621163943, 42.876205913975724 ], [ -78.890590430583615, 42.876593705838609 ], [ -78.890916063781987, 42.877700346284939 ], [ -78.883205768958902, 42.877189774239035 ], [ -78.882993797488041, 42.877925279047915 ], [ -78.882327302445603, 42.877883805165943 ], [ -78.880207061295906, 42.877067857368601 ], [ -78.87805895026365, 42.874522552122691 ], [ -78.877556716095029, 42.874857610217347 ], [ -78.875958954885036, 42.873857441685928 ], [ -78.875159693178475, 42.873656461201733 ], [ -78.873157675465777, 42.873156643168144 ], [ -78.87265780839121, 42.873155108530398 ], [ -78.872054850493441, 42.872990241069282 ], [ -78.871559627886398, 42.872856077792747 ], [ -78.871258478968869, 42.873855583344678 ], [ -78.870956750411864, 42.874756419191691 ], [ -78.87055656243021, 42.876156833702851 ], [ -78.870258536657332, 42.877056203810682 ], [ -78.870259928280817, 42.877356655895099 ], [ -78.869957241093033, 42.878057077538543 ], [ -78.86975904878048, 42.87875723695614 ], [ -78.869556577509613, 42.879355910320399 ], [ -78.869387780475122, 42.879951837575966 ], [ -78.869358376966289, 42.88005615122713 ], [ -78.869159247170458, 42.880555980676171 ], [ -78.86905751475463, 42.88115722766284 ], [ -78.86885745593024, 42.881456810125457 ], [ -78.864656316400058, 42.880655101515977 ], [ -78.859757939693296, 42.879956310487458 ], [ -78.857356707881706, 42.879457262118258 ], [ -78.854257382550315, 42.87885554952485 ], [ -78.851756334480143, 42.8785568410702 ], [ -78.850856794926287, 42.878457395030267 ], [ -78.848757851920865, 42.877957459459736 ], [ -78.847059027846299, 42.877656785921261 ], [ -78.84545768790359, 42.877457442727305 ], [ -78.8440576714939, 42.87725761889191 ], [ -78.842556244378372, 42.876857758658176 ], [ -78.841757388131555, 42.876755214333393 ], [ -78.841556799502669, 42.876955998075758 ], [ -78.839957561167893, 42.87815595557732 ], [ -78.839358996383396, 42.878656627987034 ], [ -78.839156194113883, 42.879255275929467 ], [ -78.83835691774442, 42.879056837484171 ], [ -78.837456569994913, 42.878756929372337 ], [ -78.836758064766627, 42.878555457288982 ], [ -78.835756447512608, 42.878157034814144 ], [ -78.834855713376044, 42.87775563809948 ], [ -78.833955401951215, 42.877455839483304 ], [ -78.833058755274735, 42.877155998336157 ], [ -78.832856931977261, 42.877057576053375 ], [ -78.829257334160488, 42.878157567817688 ], [ -78.828657889567353, 42.878457937354909 ], [ -78.8267574133816, 42.880956240808032 ], [ -78.825555243453209, 42.882657282618005 ], [ -78.824056066742116, 42.884759488306194 ], [ -78.816657238717056, 42.884857093087646 ], [ -78.816056162884067, 42.884756847493165 ], [ -78.815257702748966, 42.884755696219727 ], [ -78.814156862880751, 42.884755313966757 ], [ -78.809555878954654, 42.884657430116576 ], [ -78.808555783918976, 42.884656712606812 ], [ -78.807556279992795, 42.884757426604551 ], [ -78.806257466997707, 42.884655722425009 ], [ -78.805055921622497, 42.884655256607296 ], [ -78.803757485744924, 42.88465776349981 ], [ -78.803455133300602, 42.884655628692954 ], [ -78.802455159595638, 42.884657546665778 ], [ -78.801354855037332, 42.884755737814196 ], [ -78.800855880420585, 42.885055770186042 ], [ -78.800455932255147, 42.884856198273617 ], [ -78.799555682779072, 42.884556101935864 ], [ -78.799654572990747, 42.877657757946196 ], [ -78.799856701247919, 42.874655534437835 ], [ -78.799857449623246, 42.871656406417138 ], [ -78.799635042492156, 42.871657704791218 ], [ -78.799608714716484, 42.871083266097898 ], [ -78.799283115590782, 42.871049664274494 ], [ -78.799454480449356, 42.868457790234544 ], [ -78.799407204649867, 42.867320014669311 ], [ -78.800073311118354, 42.866957357716529 ], [ -78.800044716534117, 42.864412395692526 ], [ -78.800371824261092, 42.864428623694991 ], [ -78.800013598039598, 42.864409573490128 ], [ -78.799945757015792, 42.86264032885358 ], [ -78.799955478268046, 42.861355618675994 ], [ -78.800087783614686, 42.854413335610161 ], [ -78.800402549685344, 42.847371835462368 ], [ -78.800465911964508, 42.845722712118793 ], [ -78.799110043197146, 42.84636759509597 ], [ -78.79856968562261, 42.845972008220215 ], [ -78.796901482216654, 42.845326143395887 ], [ -78.798679696151751, 42.842891687094514 ], [ -78.79742912862821, 42.842044107335376 ], [ -78.796593525881221, 42.841252458318557 ], [ -78.796593277967546, 42.841180348947155 ], [ -78.79561273987504, 42.841001923524573 ], [ -78.796653480378495, 42.838356812365419 ], [ -78.7973547812921, 42.83845708334983 ], [ -78.798455419987192, 42.838658042838404 ], [ -78.799854997104532, 42.83905596076432 ], [ -78.800114269943663, 42.839298827327589 ], [ -78.800121452152496, 42.841353971681812 ], [ -78.800954430165106, 42.841352391840893 ], [ -78.80105438597424, 42.839756154286384 ], [ -78.800954249264223, 42.838856343380748 ], [ -78.800955176875547, 42.838057919673417 ], [ -78.801056798578884, 42.837256505681758 ], [ -78.800956591162702, 42.836356612199886 ], [ -78.800957162531574, 42.835456609345087 ], [ -78.800856332175471, 42.834356493668217 ], [ -78.800856905099536, 42.833456490495223 ], [ -78.800854452246867, 42.832756825752362 ], [ -78.800854678804555, 42.831757987354088 ], [ -78.801656174913674, 42.831756462252542 ], [ -78.805656489050051, 42.831757053110763 ], [ -78.807255799586315, 42.831756626304951 ], [ -78.808654312733736, 42.831858151928195 ], [ -78.809556107062647, 42.831757511090629 ], [ -78.812457260200006, 42.83195756431401 ], [ -78.813556600253534, 42.831856606340295 ], [ -78.814854467616954, 42.831958231069144 ], [ -78.815254119976032, 42.832157755265499 ], [ -78.815357794453462, 42.831957212445182 ], [ -78.817654269166127, 42.831958024622892 ], [ -78.818556087729135, 42.831857422619095 ], [ -78.819555557802161, 42.831956835203073 ], [ -78.820756081390527, 42.831957151448407 ], [ -78.82385750949274, 42.831857222247173 ], [ -78.823955379359887, 42.831157347180735 ], [ -78.823956394179447, 42.830457675485583 ], [ -78.823857834211026, 42.829055689472924 ], [ -78.8239569963159, 42.82775761128412 ], [ -78.823956878334343, 42.826756138706585 ], [ -78.824270151467147, 42.826743955649128 ], [ -78.825254871013783, 42.826740809659682 ], [ -78.832859733663142, 42.826702349425297 ], [ -78.832970726887567, 42.825928159785164 ], [ -78.833854758436914, 42.825955589258797 ], [ -78.837158375362606, 42.825915168567825 ], [ -78.837726797591174, 42.829447708027431 ], [ -78.838478504947247, 42.832640028620709 ], [ -78.838580621137581, 42.832640624242444 ] ] ] ] } },
{ "type": "Feature", "properties": { "SBE4_ID": 1, "NAME": "District E", "FROMLEFT": 0, "TOLEFT": 0, "FROMRIGHT": 0, "TORIGHT": 0, "DIRECTION": null, "STREET": null, "ST_TYPE": null, "ST_PREFIX": null, "ST_SUFFIX": null, "CITY_LEFT": null, "CITY_RIGHT": null, "LO_X_PRE": null, "LO_X_NAME": null, "LO_X_TYPE": null, "LO_X_SUF": null, "HI_X_PRE": null, "HI_X_NAME": null, "HI_X_TYPE": null, "HI_X_SUF": null, "LHS": null, "RHS": null, "BDY_LEFT": null, "BDY_RIGHT": null, "ST_CODE": null, "RECNUM_L": 0, "RECNUM_R": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -78.83135838731252, 42.946055876655677 ], [ -78.830457761013733, 42.946856231049658 ], [ -78.829957986127056, 42.947054948618003 ], [ -78.836858858528231, 42.958456982912189 ], [ -78.83595805615208, 42.9583548178936 ], [ -78.831759186240831, 42.95835580296653 ], [ -78.83115725851971, 42.958255557825574 ], [ -78.829958131354147, 42.958255431111702 ], [ -78.828856385827848, 42.958356577970008 ], [ -78.82765685495157, 42.958254878182295 ], [ -78.826158798016664, 42.958255266970681 ], [ -78.825355700985639, 42.958256967700528 ], [ -78.824656694550697, 42.958156975888137 ], [ -78.822157505617739, 42.958156839199646 ], [ -78.820756503617915, 42.958156954762991 ], [ -78.819557377904218, 42.958156719090624 ], [ -78.818656729926502, 42.958057024236993 ], [ -78.817356630933958, 42.958057000472493 ], [ -78.815756379360749, 42.958655648454581 ], [ -78.814655722805838, 42.959055735912756 ], [ -78.814256710692703, 42.959256842446351 ], [ -78.813656408143274, 42.959557158732345 ], [ -78.812055603843234, 42.960056977439621 ], [ -78.810858317851512, 42.960556082171166 ], [ -78.80855649993903, 42.961455128370673 ], [ -78.808556641406597, 42.95905538611283 ], [ -78.807555691674963, 42.958955334769527 ], [ -78.8075556846577, 42.956555317351551 ], [ -78.803555667103964, 42.956555344613861 ], [ -78.803555710222753, 42.954555352043627 ], [ -78.808655616610892, 42.954655346219724 ], [ -78.808755637596704, 42.952255322156944 ], [ -78.810356727315778, 42.952155355087633 ], [ -78.810955498629298, 42.949456959125619 ], [ -78.803256895252787, 42.949356848211345 ], [ -78.798260549765104, 42.94926379980847 ], [ -78.798454639809037, 42.948655260106889 ], [ -78.798550139049141, 42.945208809996167 ], [ -78.798557412588266, 42.943856009896109 ], [ -78.798554783338417, 42.94095575828883 ], [ -78.798757866985625, 42.938156613636551 ], [ -78.798756824676403, 42.937857507547143 ], [ -78.798855410796321, 42.937256444303237 ], [ -78.798854712408485, 42.937056116455338 ], [ -78.798856706061073, 42.936556785168193 ], [ -78.798756895109364, 42.935755765988517 ], [ -78.798856604707169, 42.93545649758471 ], [ -78.798855208018779, 42.935055841755414 ], [ -78.798856159105142, 42.934257431455606 ], [ -78.798954580601659, 42.933557506750603 ], [ -78.798956563688861, 42.933055376437686 ], [ -78.798955520699749, 42.932756297523177 ], [ -78.798954477630886, 42.932457191154541 ], [ -78.798956609322019, 42.929856033293724 ], [ -78.799155762886727, 42.922757308165004 ], [ -78.799055197727725, 42.92175595902475 ], [ -78.798956070218281, 42.919056125478022 ], [ -78.799055128618349, 42.918556609769276 ], [ -78.799454283045222, 42.918457105177296 ], [ -78.800054256740182, 42.918156889411847 ], [ -78.800456783714296, 42.917955796927018 ], [ -78.801057105067628, 42.917757125798815 ], [ -78.80155672747378, 42.917555844750758 ], [ -78.802056207188116, 42.917357360535163 ], [ -78.802454989226121, 42.917156268155487 ], [ -78.80345780545899, 42.916756401201226 ], [ -78.803856903703789, 42.916656853904762 ], [ -78.804755137489181, 42.91625725926454 ], [ -78.805657092775974, 42.915857650327247 ], [ -78.806954527440098, 42.915355711896147 ], [ -78.807755983281623, 42.91505503448947 ], [ -78.808057645039966, 42.914856911604382 ], [ -78.808456723670673, 42.914757375724776 ], [ -78.809456090238214, 42.914456297072078 ], [ -78.810056088429604, 42.914156028667882 ], [ -78.810555550332339, 42.913957424994436 ], [ -78.811357082867673, 42.913656831921934 ], [ -78.811856489182247, 42.913455506238051 ], [ -78.812456391220152, 42.913155197963881 ], [ -78.81355576688965, 42.912656379465048 ], [ -78.813556198439798, 42.914640829675548 ], [ -78.81330446664127, 42.914579715671721 ], [ -78.81355622336676, 42.914755411822256 ], [ -78.814556580901453, 42.914756112336519 ], [ -78.815557162713134, 42.914756885970576 ], [ -78.816557594465252, 42.914757459094126 ], [ -78.817558165651363, 42.914755416513607 ], [ -78.818256145722728, 42.914756757777305 ], [ -78.819155785294967, 42.914757624719542 ], [ -78.820156244305437, 42.914755559662552 ], [ -78.821156446253028, 42.914657505838498 ], [ -78.821455090218222, 42.914656885101166 ], [ -78.822257239703006, 42.914556434655353 ], [ -78.822455128322289, 42.91455602152439 ], [ -78.823156988267698, 42.914557269928117 ], [ -78.823556423863408, 42.914556432537715 ], [ -78.824056614264222, 42.91455538195617 ], [ -78.825057080580791, 42.914556072803187 ], [ -78.826255435013962, 42.914556225453076 ], [ -78.827457447884839, 42.91455638519686 ], [ -78.828857461438815, 42.914556162759148 ], [ -78.829156067087453, 42.914555439698631 ], [ -78.832157862254618, 42.914655993557794 ], [ -78.832557335549936, 42.914655124679904 ], [ -78.837555965261672, 42.914655027677036 ], [ -78.838858697395693, 42.914654926337406 ], [ -78.842957736990499, 42.914656597685237 ], [ -78.84325638045668, 42.9146559200761 ], [ -78.843558756955673, 42.914655233203135 ], [ -78.847758513806397, 42.914656613445167 ], [ -78.848758980528913, 42.914656987399198 ], [ -78.851958257798302, 42.914655013461626 ], [ -78.852656778433314, 42.914754922998405 ], [ -78.85365812200979, 42.914955609374736 ], [ -78.853657047324589, 42.913855292993048 ], [ -78.853657967521158, 42.912357137990234 ], [ -78.85365967619083, 42.911056511983595 ], [ -78.854656859806852, 42.911155703833316 ], [ -78.855556445588121, 42.91115617512046 ], [ -78.856459765022805, 42.91115682250279 ], [ -78.859259447418182, 42.911155597178706 ], [ -78.862059586429183, 42.911255770601677 ], [ -78.865556836779717, 42.911156710343533 ], [ -78.865159677833972, 42.912455539180336 ], [ -78.864658777656672, 42.913954923753735 ], [ -78.864157479774619, 42.915355554909951 ], [ -78.861957308400946, 42.917556052161366 ], [ -78.860856832722632, 42.918557465223657 ], [ -78.859760042753081, 42.91955616966203 ], [ -78.859157947244356, 42.920155784666115 ], [ -78.858856876572062, 42.920455618453111 ], [ -78.858656530175679, 42.920755181814776 ], [ -78.856956990718302, 42.922257434331961 ], [ -78.856057477592657, 42.923156769606393 ], [ -78.853759739771817, 42.925357311533098 ], [ -78.852759287171324, 42.926256941150747 ], [ -78.851959523004112, 42.926955789183971 ], [ -78.851458130539228, 42.9275551540956 ], [ -78.851056247518528, 42.927855175636331 ], [ -78.850959569531824, 42.9279568697158 ], [ -78.85075872187268, 42.928154952031669 ], [ -78.849357066205357, 42.929554815991274 ], [ -78.848059054160757, 42.93075689229353 ], [ -78.847158434247248, 42.931456021774324 ], [ -78.846359083627647, 42.932256379439686 ], [ -78.845956921275459, 42.932556383500874 ], [ -78.845458740353124, 42.933056852948276 ], [ -78.844457613641666, 42.933854860213494 ], [ -78.843558140727509, 42.934855728084706 ], [ -78.842557083794873, 42.935656434765868 ], [ -78.842356232851728, 42.935857191087443 ], [ -78.841656567483184, 42.936456960649835 ], [ -78.841158271807103, 42.936954722350357 ], [ -78.839856210702692, 42.938156713358005 ], [ -78.838758734174164, 42.939155187600356 ], [ -78.837456087930008, 42.940255602049938 ], [ -78.835856446299658, 42.941757314897934 ], [ -78.835056290608691, 42.942456016559234 ], [ -78.834357116302002, 42.943157289902665 ], [ -78.833657690718923, 42.94385576071415 ], [ -78.833356381137804, 42.944155526831231 ], [ -78.832258592102392, 42.945156654906228 ], [ -78.83135838731252, 42.946055876655677 ] ] ], [ [ [ -78.81388190979429, 42.914719903009498 ], [ -78.81355622336676, 42.914755411822256 ], [ -78.813556198439798, 42.914640829675548 ], [ -78.81388190979429, 42.914719903009498 ] ] ] ] } },
{ "type": "Feature", "properties": { "SBE4_ID": 0, "NAME": "District B", "FROMLEFT": 0, "TOLEFT": 0, "FROMRIGHT": 0, "TORIGHT": 0, "DIRECTION": null, "STREET": null, "ST_TYPE": null, "ST_PREFIX": null, "ST_SUFFIX": null, "CITY_LEFT": null, "CITY_RIGHT": null, "LO_X_PRE": null, "LO_X_NAME": null, "LO_X_TYPE": null, "LO_X_SUF": null, "HI_X_PRE": null, "HI_X_NAME": null, "HI_X_TYPE": null, "HI_X_SUF": null, "LHS": null, "RHS": null, "BDY_LEFT": null, "BDY_RIGHT": null, "ST_CODE": null, "RECNUM_L": 0, "RECNUM_R": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -78.877556716095029, 42.874857610217347 ], [ -78.87805895026365, 42.874522552122691 ], [ -78.879767789463699, 42.87705099553893 ], [ -78.882677989722453, 42.878305611941379 ], [ -78.882994922991031, 42.877911145090273 ], [ -78.886812483749637, 42.878206759469876 ], [ -78.888732385034302, 42.878825339982058 ], [ -78.890247479896416, 42.881469631441725 ], [ -78.889835470396079, 42.882279055795166 ], [ -78.88897192071019, 42.881844428097786 ], [ -78.889386931765287, 42.881187695916303 ], [ -78.888452123743221, 42.879939802637892 ], [ -78.887206299012334, 42.879344207919118 ], [ -78.886363932196801, 42.879208313175972 ], [ -78.884891941620182, 42.879517868154529 ], [ -78.883809384665241, 42.88006768014219 ], [ -78.883881226506304, 42.880141055142744 ], [ -78.88543589722687, 42.879590628920212 ], [ -78.885349153009415, 42.880294746526879 ], [ -78.884856472862353, 42.880493851630128 ], [ -78.883953613363957, 42.880826369804623 ], [ -78.88391652991092, 42.880965390027278 ], [ -78.885261140223761, 42.880731366039186 ], [ -78.885412749814421, 42.880704405359175 ], [ -78.885432935061019, 42.881989614876254 ], [ -78.884934189912883, 42.882187199689177 ], [ -78.885149591608595, 42.882417749431362 ], [ -78.885990282873877, 42.881942759172496 ], [ -78.886902106250716, 42.881435964598211 ], [ -78.887623976098538, 42.881872685765536 ], [ -78.887295848770606, 42.88218147594376 ], [ -78.886665517494535, 42.882707970148083 ], [ -78.886325573274505, 42.883318314140141 ], [ -78.887935188133397, 42.882305309596234 ], [ -78.888194750681521, 42.882788008753764 ], [ -78.888461862582389, 42.883204230311826 ], [ -78.888197905618881, 42.883428944037398 ], [ -78.887713659596528, 42.883745449631128 ], [ -78.888459338075492, 42.884289799437973 ], [ -78.88896187969182, 42.884981344336815 ], [ -78.890170993132699, 42.886575763198067 ], [ -78.890483014674359, 42.886922466630416 ], [ -78.891329524845204, 42.887212943140796 ], [ -78.891358175386998, 42.887199415290638 ], [ -78.892133110897007, 42.887504971882784 ], [ -78.892385934056861, 42.887695510810936 ], [ -78.893348314393322, 42.888403903499388 ], [ -78.894057755479366, 42.888933744445872 ], [ -78.894612242514853, 42.889338469797835 ], [ -78.895036384546501, 42.889659996207968 ], [ -78.895501392294435, 42.890011208150497 ], [ -78.896121211532275, 42.890469582881344 ], [ -78.89683887897786, 42.890993347367832 ], [ -78.898918617390336, 42.892541080916487 ], [ -78.899432482892905, 42.892922022847635 ], [ -78.899905427513588, 42.893261231452982 ], [ -78.900631448154058, 42.893814911921822 ], [ -78.901000451860682, 42.894477001624736 ], [ -78.901287413342885, 42.894960225054838 ], [ -78.90149248475656, 42.895324097147316 ], [ -78.901762135284699, 42.895734270535478 ], [ -78.901820719343334, 42.895950462273227 ], [ -78.90191675573098, 42.898106772035554 ], [ -78.901983845860258, 42.899191788067803 ], [ -78.902018825485499, 42.900005496587902 ], [ -78.902111235070834, 42.901882460953765 ], [ -78.901354550045156, 42.901657838954542 ], [ -78.901009778825738, 42.901115975466546 ], [ -78.900610944128658, 42.900787295131039 ], [ -78.900920393124537, 42.901298197182662 ], [ -78.9009544677413, 42.901756192436423 ], [ -78.901617220150982, 42.902200478390171 ], [ -78.901603239445336, 42.902900259891958 ], [ -78.901588792822579, 42.903248195747921 ], [ -78.901565452389505, 42.904327206356093 ], [ -78.901560896419539, 42.906155900137307 ], [ -78.90160098289445, 42.914954584158387 ], [ -78.90117482292824, 42.914955618835442 ], [ -78.900833802550821, 42.914856453154684 ], [ -78.899063170890415, 42.914861349800091 ], [ -78.898064267951455, 42.914847414843535 ], [ -78.897133551252566, 42.914849969619191 ], [ -78.895662005310712, 42.914861026418535 ], [ -78.894377258499588, 42.914955942341805 ], [ -78.892967674896013, 42.914959763240532 ], [ -78.890079862876149, 42.915058955206973 ], [ -78.888175984523798, 42.915154442931687 ], [ -78.886661367371204, 42.91515846580203 ], [ -78.885854268732928, 42.91515247522581 ], [ -78.885368298366402, 42.91525127115856 ], [ -78.884273792034705, 42.915254153367037 ], [ -78.883068729321764, 42.915257314605014 ], [ -78.882272685221139, 42.915251269836823 ], [ -78.881860056726552, 42.915357218260048 ], [ -78.881359298348983, 42.915256972327974 ], [ -78.880060763516965, 42.915356407999973 ], [ -78.878357872938679, 42.915256651587946 ], [ -78.876760500452249, 42.915356819507785 ], [ -78.873359629522184, 42.915357198709401 ], [ -78.872758628860012, 42.915356003171667 ], [ -78.868857549841991, 42.915354823057719 ], [ -78.86655787398773, 42.915355047378718 ], [ -78.865057126814094, 42.915356061113151 ], [ -78.864157479774619, 42.915355554909951 ], [ -78.864658777656672, 42.913954923753735 ], [ -78.865159677833972, 42.912455539180336 ], [ -78.865556836779717, 42.911156710343533 ], [ -78.862059586429183, 42.911255770601677 ], [ -78.859259447418182, 42.911155597178706 ], [ -78.856459765022805, 42.91115682250279 ], [ -78.855556445588121, 42.91115617512046 ], [ -78.854656859806852, 42.911155703833316 ], [ -78.85365967619083, 42.911056511983595 ], [ -78.853657494698368, 42.910557187534138 ], [ -78.853659033437623, 42.910054973192565 ], [ -78.853756797638667, 42.909355082581932 ], [ -78.853658635474773, 42.908254994396067 ], [ -78.853759022902551, 42.908156005376249 ], [ -78.853759265986639, 42.907357483109244 ], [ -78.853758953862595, 42.906457521063999 ], [ -78.85375875366897, 42.905557531173962 ], [ -78.853758278971, 42.903757578583011 ], [ -78.853657613396891, 42.902056531765901 ], [ -78.853656698573374, 42.900155000825954 ], [ -78.853656069099998, 42.899156258847228 ], [ -78.853656302324623, 42.898355046346644 ], [ -78.85365785349488, 42.897855629658302 ], [ -78.853756805541735, 42.897457533816237 ], [ -78.853758344049041, 42.896955400639861 ], [ -78.853757469063879, 42.896755099652516 ], [ -78.853857405997729, 42.896557304389624 ], [ -78.853858943823525, 42.896055198573613 ], [ -78.853757551303204, 42.895056693911634 ], [ -78.853756908447806, 42.894055152318728 ], [ -78.853759577852927, 42.892957539513091 ], [ -78.853758060564701, 42.89175575126616 ], [ -78.853758304791938, 42.890957254144233 ], [ -78.853756111813098, 42.890455129209947 ], [ -78.853756712784602, 42.889755383336748 ], [ -78.853759059883188, 42.887755088297254 ], [ -78.853758944339788, 42.885156604458061 ], [ -78.853714464176306, 42.884361065673055 ], [ -78.853661332722666, 42.883318515317931 ], [ -78.85365725150217, 42.88325541562201 ], [ -78.853557511100931, 42.881757490201359 ], [ -78.853656661060612, 42.88055546197964 ], [ -78.853958681519828, 42.879657470565625 ], [ -78.854257382550315, 42.87885554952485 ], [ -78.857356707881706, 42.879457262118258 ], [ -78.859757939693296, 42.879956310487458 ], [ -78.864656316400058, 42.880655101515977 ], [ -78.86885745593024, 42.881456810125457 ], [ -78.86905751475463, 42.88115722766284 ], [ -78.869159247170458, 42.880555980676171 ], [ -78.869358376966289, 42.88005615122713 ], [ -78.869387780475122, 42.879951837575966 ], [ -78.869556577509613, 42.879355910320399 ], [ -78.86975904878048, 42.87875723695614 ], [ -78.869957241093033, 42.878057077538543 ], [ -78.870259928280817, 42.877356655895099 ], [ -78.870258536657332, 42.877056203810682 ], [ -78.87055656243021, 42.876156833702851 ], [ -78.870956750411864, 42.874756419191691 ], [ -78.871258478968869, 42.873855583344678 ], [ -78.871559627886398, 42.872856077792747 ], [ -78.87265780839121, 42.873155108530398 ], [ -78.873157675465777, 42.873156643168144 ], [ -78.87405764897936, 42.873357381992662 ], [ -78.875159693178475, 42.873656461201733 ], [ -78.875958954885036, 42.873857441685928 ], [ -78.87665858052506, 42.874256231783569 ], [ -78.877556716095029, 42.874857610217347 ] ] ] ] } },
{ "type": "Feature", "properties": { "SBE4_ID": 0, "NAME": "District C", "FROMLEFT": 0, "TOLEFT": 0, "FROMRIGHT": 0, "TORIGHT": 0, "DIRECTION": null, "STREET": null, "ST_TYPE": null, "ST_PREFIX": null, "ST_SUFFIX": null, "CITY_LEFT": null, "CITY_RIGHT": null, "LO_X_PRE": null, "LO_X_NAME": null, "LO_X_TYPE": null, "LO_X_SUF": null, "HI_X_PRE": null, "HI_X_NAME": null, "HI_X_TYPE": null, "HI_X_SUF": null, "LHS": null, "RHS": null, "BDY_LEFT": null, "BDY_RIGHT": null, "ST_CODE": null, "RECNUM_L": 0, "RECNUM_R": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -78.837456569994913, 42.878756929372337 ], [ -78.83835691774442, 42.879056837484171 ], [ -78.839156194113883, 42.879255275929467 ], [ -78.839358996383396, 42.878656627987034 ], [ -78.839957561167893, 42.87815595557732 ], [ -78.841556799502669, 42.876955998075758 ], [ -78.841757388131555, 42.876755214333393 ], [ -78.842556244378372, 42.876857758658176 ], [ -78.8440576714939, 42.87725761889191 ], [ -78.84545768790359, 42.877457442727305 ], [ -78.847059027846299, 42.877656785921261 ], [ -78.848757851920865, 42.877957459459736 ], [ -78.850856794926287, 42.878457395030267 ], [ -78.851756334480143, 42.8785568410702 ], [ -78.854257382550315, 42.87885554952485 ], [ -78.853958681519828, 42.879657470565625 ], [ -78.853656661060612, 42.88055546197964 ], [ -78.853557511100931, 42.881757490201359 ], [ -78.85365725150217, 42.88325541562201 ], [ -78.853661332722666, 42.883318515317931 ], [ -78.853714464176306, 42.884361065673055 ], [ -78.853758944339788, 42.885156604458061 ], [ -78.853759059883188, 42.887755088297254 ], [ -78.853756712784602, 42.889755383336748 ], [ -78.853756111813098, 42.890455129209947 ], [ -78.853758304791938, 42.890957254144233 ], [ -78.853758060564701, 42.89175575126616 ], [ -78.853759577852927, 42.892957539513091 ], [ -78.853756908447806, 42.894055152318728 ], [ -78.853757551303204, 42.895056693911634 ], [ -78.853858943823525, 42.896055198573613 ], [ -78.853857405997729, 42.896557304389624 ], [ -78.853757469063879, 42.896755099652516 ], [ -78.853758344049041, 42.896955400639861 ], [ -78.853756805541735, 42.897457533816237 ], [ -78.85365785349488, 42.897855629658302 ], [ -78.853656302324623, 42.898355046346644 ], [ -78.853656069099998, 42.899156258847228 ], [ -78.853656698573374, 42.900155000825954 ], [ -78.853657613396891, 42.902056531765901 ], [ -78.853758278971, 42.903757578583011 ], [ -78.85375875366897, 42.905557531173962 ], [ -78.853758953862595, 42.906457521063999 ], [ -78.853759265986639, 42.907357483109244 ], [ -78.853759022902551, 42.908156005376249 ], [ -78.853658635474773, 42.908254994396067 ], [ -78.853756797638667, 42.909355082581932 ], [ -78.853659033437623, 42.910054973192565 ], [ -78.853657494698368, 42.910557187534138 ], [ -78.85365967619083, 42.911056511983595 ], [ -78.853657967521158, 42.912357137990234 ], [ -78.853657047324589, 42.913855292993048 ], [ -78.85365812200979, 42.914955609374736 ], [ -78.852656778433314, 42.914754922998405 ], [ -78.851958257798302, 42.914655013461626 ], [ -78.848758980528913, 42.914656987399198 ], [ -78.847758513806397, 42.914656613445167 ], [ -78.843558756955673, 42.914655233203135 ], [ -78.84325638045668, 42.9146559200761 ], [ -78.842957736990499, 42.914656597685237 ], [ -78.838858697395693, 42.914654926337406 ], [ -78.837555965261672, 42.914655027677036 ], [ -78.832557335549936, 42.914655124679904 ], [ -78.832157862254618, 42.914655993557794 ], [ -78.829156067087453, 42.914555439698631 ], [ -78.828857461438815, 42.914556162759148 ], [ -78.827457447884839, 42.91455638519686 ], [ -78.826255435013962, 42.914556225453076 ], [ -78.825057080580791, 42.914556072803187 ], [ -78.824056614264222, 42.91455538195617 ], [ -78.823556423863408, 42.914556432537715 ], [ -78.823156988267698, 42.914557269928117 ], [ -78.822455128322289, 42.91455602152439 ], [ -78.822257239703006, 42.914556434655353 ], [ -78.821455090218222, 42.914656885101166 ], [ -78.821156446253028, 42.914657505838498 ], [ -78.820156244305437, 42.914755559662552 ], [ -78.819155785294967, 42.914757624719542 ], [ -78.818256145722728, 42.914756757777305 ], [ -78.817558165651363, 42.914755416513607 ], [ -78.816557594465252, 42.914757459094126 ], [ -78.815557162713134, 42.914756885970576 ], [ -78.814556580901453, 42.914756112336519 ], [ -78.81355622336676, 42.914755411822256 ], [ -78.81355576688965, 42.912656379465048 ], [ -78.812456391220152, 42.913155197963881 ], [ -78.811856489182247, 42.913455506238051 ], [ -78.811357082867673, 42.913656831921934 ], [ -78.810555550332339, 42.913957424994436 ], [ -78.810056088429604, 42.914156028667882 ], [ -78.809456090238214, 42.914456297072078 ], [ -78.808456723670673, 42.914757375724776 ], [ -78.808057645039966, 42.914856911604382 ], [ -78.807755983281623, 42.91505503448947 ], [ -78.806954527440098, 42.915355711896147 ], [ -78.805657092775974, 42.915857650327247 ], [ -78.804755137489181, 42.91625725926454 ], [ -78.803856903703789, 42.916656853904762 ], [ -78.80345780545899, 42.916756401201226 ], [ -78.802454989226121, 42.917156268155487 ], [ -78.802056207188116, 42.917357360535163 ], [ -78.80155672747378, 42.917555844750758 ], [ -78.801057105067628, 42.917757125798815 ], [ -78.800456783714296, 42.917955796927018 ], [ -78.800054256740182, 42.918156889411847 ], [ -78.799454283045222, 42.918457105177296 ], [ -78.799055128618349, 42.918556609769276 ], [ -78.799056743783282, 42.913655973762616 ], [ -78.799054506892517, 42.909855743480577 ], [ -78.799155722941677, 42.906757665138031 ], [ -78.799254604981854, 42.898756254692366 ], [ -78.79935567367923, 42.895655454002004 ], [ -78.799357519475777, 42.88975613471235 ], [ -78.799555682779072, 42.884556101935864 ], [ -78.800455932255147, 42.884856198273617 ], [ -78.800855880420585, 42.885055770186042 ], [ -78.801354855037332, 42.884755737814196 ], [ -78.802455159595638, 42.884657546665778 ], [ -78.803455133300602, 42.884655628692954 ], [ -78.803757485744924, 42.88465776349981 ], [ -78.805055921622497, 42.884655256607296 ], [ -78.806257466997707, 42.884655722425009 ], [ -78.807556279992795, 42.884757426604551 ], [ -78.808555783918976, 42.884656712606812 ], [ -78.809555878954654, 42.884657430116576 ], [ -78.814156862880751, 42.884755313966757 ], [ -78.815257702748966, 42.884755696219727 ], [ -78.816056162884067, 42.884756847493165 ], [ -78.816657238717056, 42.884857093087646 ], [ -78.824051345503236, 42.884759550740974 ], [ -78.824056055970587, 42.884756717006105 ], [ -78.825555243453209, 42.882657282618005 ], [ -78.8267574133816, 42.880956240808032 ], [ -78.828657889567353, 42.878457937354909 ], [ -78.829257334160488, 42.878157567817688 ], [ -78.832856931977261, 42.877057576053375 ], [ -78.833058755274735, 42.877155998336157 ], [ -78.833955401951215, 42.877455839483304 ], [ -78.834855713376044, 42.87775563809948 ], [ -78.835756447512608, 42.878157034814144 ], [ -78.836758064766627, 42.878555457288982 ], [ -78.837456569994913, 42.878756929372337 ] ] ] ] } },
{ "type": "Feature", "properties": { "SBE4_ID": 0, "NAME": "District D", "FROMLEFT": 0, "TOLEFT": 0, "FROMRIGHT": 0, "TORIGHT": 0, "DIRECTION": null, "STREET": null, "ST_TYPE": null, "ST_PREFIX": null, "ST_SUFFIX": null, "CITY_LEFT": null, "CITY_RIGHT": null, "LO_X_PRE": null, "LO_X_NAME": null, "LO_X_TYPE": null, "LO_X_SUF": null, "HI_X_PRE": null, "HI_X_NAME": null, "HI_X_TYPE": null, "HI_X_SUF": null, "LHS": null, "RHS": null, "BDY_LEFT": null, "BDY_RIGHT": null, "ST_CODE": null, "RECNUM_L": 0, "RECNUM_R": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -78.848357925732358, 42.958557155360594 ], [ -78.847558550346733, 42.958556314278027 ], [ -78.847159103369592, 42.958655986661867 ], [ -78.846658049234421, 42.95855559052405 ], [ -78.845757772716311, 42.958554968924986 ], [ -78.844659429161581, 42.958554682819461 ], [ -78.843456598624755, 42.958554733406494 ], [ -78.842257051866881, 42.958455875641029 ], [ -78.841158635672457, 42.958455665861948 ], [ -78.840157571072865, 42.958455117420101 ], [ -78.838958216436993, 42.958455112938751 ], [ -78.838158434253145, 42.95835531882836 ], [ -78.836858858528231, 42.958456982912189 ], [ -78.829957986127056, 42.947054948618003 ], [ -78.830457761013733, 42.946856231049658 ], [ -78.83135838731252, 42.946055876655677 ], [ -78.832258592102392, 42.945156654906228 ], [ -78.833356381137804, 42.944155526831231 ], [ -78.833657690718923, 42.94385576071415 ], [ -78.834357116302002, 42.943157289902665 ], [ -78.835056290608691, 42.942456016559234 ], [ -78.835856446299658, 42.941757314897934 ], [ -78.837456087930008, 42.940255602049938 ], [ -78.838758734174164, 42.939155187600356 ], [ -78.839856210702692, 42.938156713358005 ], [ -78.841158271807103, 42.936954722350357 ], [ -78.841656567483184, 42.936456960649835 ], [ -78.842356232851728, 42.935857191087443 ], [ -78.842557083794873, 42.935656434765868 ], [ -78.843558140727509, 42.934855728084706 ], [ -78.844457613641666, 42.933854860213494 ], [ -78.845458740353124, 42.933056852948276 ], [ -78.845956921275459, 42.932556383500874 ], [ -78.846359083627647, 42.932256379439686 ], [ -78.847158434247248, 42.931456021774324 ], [ -78.848059054160757, 42.93075689229353 ], [ -78.849357066205357, 42.929554815991274 ], [ -78.85075872187268, 42.928154952031669 ], [ -78.850959569531824, 42.9279568697158 ], [ -78.851056247518528, 42.927855175636331 ], [ -78.851458130539228, 42.9275551540956 ], [ -78.851959523004112, 42.926955789183971 ], [ -78.852759287171324, 42.926256941150747 ], [ -78.853759739771817, 42.925357311533098 ], [ -78.856057477592657, 42.923156769606393 ], [ -78.856956990718302, 42.922257434331961 ], [ -78.858656530175679, 42.920755181814776 ], [ -78.858856876572062, 42.920455618453111 ], [ -78.859157947244356, 42.920155784666115 ], [ -78.859760042753081, 42.91955616966203 ], [ -78.860856832722632, 42.918557465223657 ], [ -78.861957308400946, 42.917556052161366 ], [ -78.864157479774619, 42.915355554909951 ], [ -78.865057126814094, 42.915356061113151 ], [ -78.86655787398773, 42.915355047378718 ], [ -78.868857549841991, 42.915354823057719 ], [ -78.872758628860012, 42.915356003171667 ], [ -78.873359629522184, 42.915357198709401 ], [ -78.876760500452249, 42.915356819507785 ], [ -78.878357872938679, 42.915256651587946 ], [ -78.880060763516965, 42.915356407999973 ], [ -78.881359298348983, 42.915256972327974 ], [ -78.881860056726552, 42.915357218260048 ], [ -78.882272685221139, 42.915251269836823 ], [ -78.883068729321764, 42.915257314605014 ], [ -78.884273792034705, 42.915254153367037 ], [ -78.885368298366402, 42.91525127115856 ], [ -78.885854268732928, 42.91515247522581 ], [ -78.886672422971984, 42.915158436510609 ], [ -78.888164928925264, 42.915154472368307 ], [ -78.890066028293106, 42.915055944996219 ], [ -78.892973197591445, 42.914958732545394 ], [ -78.894377258499588, 42.914955942341805 ], [ -78.895675824733544, 42.914860988717805 ], [ -78.897168322242848, 42.914856907221662 ], [ -78.898109668762928, 42.914847290026792 ], [ -78.899051243879498, 42.914856809077392 ], [ -78.899673117636056, 42.914855092483272 ], [ -78.900855119132444, 42.914855753392153 ], [ -78.901159417838116, 42.914956980417145 ], [ -78.901511530128445, 42.914956002391477 ], [ -78.901259500262299, 42.915790463407561 ], [ -78.901039376175646, 42.9165211626134 ], [ -78.900803422995168, 42.917340120508733 ], [ -78.900642632086601, 42.917922293370644 ], [ -78.900352803555677, 42.918873736097275 ], [ -78.899966689539511, 42.920198582505577 ], [ -78.899497029021163, 42.92189358586883 ], [ -78.89950199452521, 42.921893572156002 ], [ -78.898955778359166, 42.924051207509997 ], [ -78.898959314199004, 42.924744023208717 ], [ -78.898966106163485, 42.926074777878405 ], [ -78.898997580075644, 42.927369108017722 ], [ -78.899015346081342, 42.927982092585005 ], [ -78.899797131705569, 42.930131477834024 ], [ -78.899824713903755, 42.930304182471211 ], [ -78.89998968080755, 42.930434992570987 ], [ -78.900817098187616, 42.93108823657095 ], [ -78.900824857978293, 42.930585100877963 ], [ -78.90132628418371, 42.930980937805437 ], [ -78.901834110429547, 42.930639013085603 ], [ -78.902728823511509, 42.930443681928907 ], [ -78.903109151324642, 42.930357845634006 ], [ -78.901834110429547, 42.930639013085603 ], [ -78.900659484006212, 42.929123959777144 ], [ -78.900580076597706, 42.926266420627407 ], [ -78.900429083107412, 42.922319764339214 ], [ -78.900760203399443, 42.921241687908463 ], [ -78.900915847459643, 42.920702745364295 ], [ -78.901546249652824, 42.919608991462646 ], [ -78.901818736656523, 42.919099082084145 ], [ -78.902109568540993, 42.917890121065405 ], [ -78.902235137734323, 42.917263840573362 ], [ -78.902332190342975, 42.916885163554234 ], [ -78.902181178734878, 42.915320070874564 ], [ -78.902124132571586, 42.914957051428722 ], [ -78.901515270083607, 42.914955690463479 ], [ -78.901515776779945, 42.914868491601403 ], [ -78.901518012111453, 42.914820720145464 ], [ -78.902133312499032, 42.914818734938109 ], [ -78.902013473047873, 42.912693915230498 ], [ -78.902533701297116, 42.911804550020491 ], [ -78.902754669155058, 42.91241524030513 ], [ -78.902915198716912, 42.912829692706374 ], [ -78.903067379972413, 42.913542508969392 ], [ -78.903271021262256, 42.914633587956949 ], [ -78.903586313334159, 42.916226591537594 ], [ -78.903778949397676, 42.917099452743621 ], [ -78.904186211959313, 42.919245250066467 ], [ -78.904440341493142, 42.920518157479009 ], [ -78.90462435719698, 42.921631183782786 ], [ -78.904737308753241, 42.922409657703007 ], [ -78.904809627095929, 42.922969833964459 ], [ -78.904909494683295, 42.923729878069061 ], [ -78.904963312104968, 42.924134968048868 ], [ -78.905138306699939, 42.92523964937368 ], [ -78.905314300750192, 42.926570915527613 ], [ -78.905514378516472, 42.927872068041225 ], [ -78.906210330417593, 42.929508631350856 ], [ -78.906212496791639, 42.929923496936539 ], [ -78.904706019158724, 42.93010111178603 ], [ -78.905197192220299, 42.930046811396345 ], [ -78.906216361094181, 42.92992699817907 ], [ -78.906115574986444, 42.932064584547803 ], [ -78.906825072161936, 42.93409383314517 ], [ -78.904965379070646, 42.932881019280011 ], [ -78.904645083186239, 42.932662492287299 ], [ -78.904309426718299, 42.932455367033597 ], [ -78.904007372774672, 42.932239695581686 ], [ -78.903451768029086, 42.931871460603965 ], [ -78.902201542601702, 42.931008740628926 ], [ -78.90202594441206, 42.930895716102775 ], [ -78.901875034453923, 42.930711282252666 ], [ -78.901398118730953, 42.931022774185323 ], [ -78.901651811431563, 42.931225910422974 ], [ -78.902350261746577, 42.931882739510314 ], [ -78.902915944600963, 42.932388693438718 ], [ -78.902629510589421, 42.932600797271924 ], [ -78.90386120948564, 42.933656869024439 ], [ -78.904459278893853, 42.933756743178414 ], [ -78.907262208987191, 42.93695979109124 ], [ -78.908521859033641, 42.938597978997493 ], [ -78.908726708704449, 42.939380438521361 ], [ -78.908730080667112, 42.939389593415029 ], [ -78.909516776232223, 42.94249073687056 ], [ -78.908916416369607, 42.943086737261048 ], [ -78.909717332335276, 42.943989928321862 ], [ -78.908911507135457, 42.944586541589423 ], [ -78.909517706327776, 42.945094129940117 ], [ -78.908916874063678, 42.945605236619571 ], [ -78.910401234703158, 42.953596504184752 ], [ -78.91267796524653, 42.95575904357041 ], [ -78.911761223912649, 42.95645513001049 ], [ -78.908360118215342, 42.958956305281539 ], [ -78.907559933526329, 42.959556760400766 ], [ -78.906759942770009, 42.96015441060144 ], [ -78.906559296799884, 42.960355305505615 ], [ -78.905758658446118, 42.960854199466368 ], [ -78.905059515844783, 42.961454324852951 ], [ -78.90406141411782, 42.962055311372481 ], [ -78.903362054777176, 42.962655454327887 ], [ -78.902561472684425, 42.963154298160894 ], [ -78.901761289295081, 42.963754712362615 ], [ -78.9009612024266, 42.964355120648463 ], [ -78.899159550375217, 42.965655144949189 ], [ -78.898359376221833, 42.966255535118037 ], [ -78.896461726581393, 42.96485586650212 ], [ -78.894559418319659, 42.963256015240091 ], [ -78.893858268674535, 42.962755823238531 ], [ -78.893261164733602, 42.962156457059415 ], [ -78.892959509184109, 42.960856745493309 ], [ -78.890458983145905, 42.958355523664345 ], [ -78.888960817281159, 42.958356844401585 ], [ -78.885061244442412, 42.958455047304646 ], [ -78.883058932473872, 42.958454819792294 ], [ -78.882158658648564, 42.958454484475844 ], [ -78.881758903828015, 42.958455527314996 ], [ -78.881157861160332, 42.958555843687328 ], [ -78.880059519299948, 42.958555897250605 ], [ -78.879260144717819, 42.958555277552378 ], [ -78.878557723983036, 42.95855709124055 ], [ -78.878060939280772, 42.958555572638929 ], [ -78.875158678177471, 42.958656381264539 ], [ -78.87425840060051, 42.958655874070374 ], [ -78.873260883445468, 42.958655715870663 ], [ -78.872457771560946, 42.958655030696043 ], [ -78.871460329053207, 42.958654856616953 ], [ -78.870358249228573, 42.958654826503142 ], [ -78.869259942906652, 42.958654886107276 ], [ -78.865557719794268, 42.958655787081888 ], [ -78.861257477462374, 42.958556554292315 ], [ -78.858359034813049, 42.958657010029732 ], [ -78.855657578720312, 42.958556430976316 ], [ -78.854656835161208, 42.958654869409195 ], [ -78.853957814556878, 42.958554946837822 ], [ -78.853659403684276, 42.958657229161389 ], [ -78.853259671690395, 42.958655373694626 ], [ -78.852859914568072, 42.958656315615869 ], [ -78.85175743026079, 42.958554639873995 ], [ -78.850958457227449, 42.958655289085193 ], [ -78.850558737387288, 42.958656222882844 ], [ -78.85005767815349, 42.958555923956126 ], [ -78.849459880382412, 42.958554516542854 ], [ -78.848357925732358, 42.958557155360594 ] ] ], [ [ [ -78.901518012111453, 42.914820720145464 ], [ -78.901516053815271, 42.914820815724703 ], [ -78.901516056764024, 42.91482072644893 ], [ -78.901518012111453, 42.914820720145464 ] ] ], [ [ [ -78.901516053815271, 42.914820815724703 ], [ -78.901515776779945, 42.914868491601403 ], [ -78.901511709782966, 42.91495540755421 ], [ -78.901511626800385, 42.914955682310051 ], [ -78.901511599202905, 42.914955682248291 ], [ -78.901516053815271, 42.914820815724703 ] ] ], [ [ [ -78.901515270083607, 42.914955690463479 ], [ -78.901515268331408, 42.914955992002454 ], [ -78.901511530128445, 42.914956002391477 ], [ -78.901511626800385, 42.914955682310051 ], [ -78.901515270083607, 42.914955690463479 ] ] ] ] } }
]
}
...@@ -4,6 +4,7 @@ span.card { ...@@ -4,6 +4,7 @@ span.card {
border: none; border: none;
} }
/* --- Login Screen Styling --- */ /* --- Login Screen Styling --- */
.login-card { .login-card {
display: inline-block; /* Or use d-flex on the parent to center it */ display: inline-block; /* Or use d-flex on the parent to center it */
...@@ -85,3 +86,5 @@ html, body { ...@@ -85,3 +86,5 @@ html, body {
} }
...@@ -23,7 +23,8 @@ uses ...@@ -23,7 +23,8 @@ uses
View.ErrorPage in 'View.ErrorPage.pas' {FViewErrorPage: TWebForm} {*.html}, View.ErrorPage in 'View.ErrorPage.pas' {FViewErrorPage: TWebForm} {*.html},
View.ComplaintDetails in 'View.ComplaintDetails.pas' {FViewComplaintDetails: TWebForm} {*.html}, View.ComplaintDetails in 'View.ComplaintDetails.pas' {FViewComplaintDetails: TWebForm} {*.html},
View.UnitDetails in 'View.UnitDetails.pas' {FViewUnitDetails: TWebForm} {*.html}, View.UnitDetails in 'View.UnitDetails.pas' {FViewUnitDetails: TWebForm} {*.html},
uMapFilters in 'uMapFilters.pas'; uMapFilters in 'uMapFilters.pas',
View.ComplaintArchive in 'View.ComplaintArchive.pas' {FViewComplaintArchive: TWebForm} {*.html};
{$R *.res} {$R *.res}
......
...@@ -97,8 +97,9 @@ ...@@ -97,8 +97,9 @@
<VerInfo_MajorVer>0</VerInfo_MajorVer> <VerInfo_MajorVer>0</VerInfo_MajorVer>
<VerInfo_Release>3</VerInfo_Release> <VerInfo_Release>3</VerInfo_Release>
<TMSWebBrowser>1</TMSWebBrowser> <TMSWebBrowser>1</TMSWebBrowser>
<TMSWebSingleInstance>1</TMSWebSingleInstance>
<TMSUseJSDebugger>2</TMSUseJSDebugger> <TMSUseJSDebugger>2</TMSUseJSDebugger>
<TMSWebOutputPath>..\emiMobileServer\bin\static</TMSWebOutputPath>
<TMSWebSingleInstance>1</TMSWebSingleInstance>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''"> <PropertyGroup Condition="'$(Cfg_2)'!=''">
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols> <DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
...@@ -188,6 +189,11 @@ ...@@ -188,6 +189,11 @@
<DesignClass>TWebForm</DesignClass> <DesignClass>TWebForm</DesignClass>
</DCCReference> </DCCReference>
<DCCReference Include="uMapFilters.pas"/> <DCCReference Include="uMapFilters.pas"/>
<DCCReference Include="View.ComplaintArchive.pas">
<Form>FViewComplaintArchive</Form>
<FormType>dfm</FormType>
<DesignClass>TWebForm</DesignClass>
</DCCReference>
<None Include="index.html"/> <None Include="index.html"/>
<None Include="css\app.css"/> <None Include="css\app.css"/>
<None Include="css\spinner.css"/> <None Include="css\spinner.css"/>
...@@ -506,12 +512,7 @@ ...@@ -506,12 +512,7 @@
<Source> <Source>
<Source Name="MainSource">webEmiMobile.dpr</Source> <Source Name="MainSource">webEmiMobile.dpr</Source>
</Source> </Source>
<Excluded_Packages> <Excluded_Packages/>
<Excluded_Packages Name="$(BDSBIN)\bcboffice2k290.bpl">Embarcadero C++Builder Office 2000 Servers Package</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\bcbofficexp290.bpl">Embarcadero C++Builder Office XP Servers Package</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dcloffice2k290.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dclofficexp290.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages>
</Excluded_Packages>
</Delphi.Personality> </Delphi.Personality>
<Deployment Version="5"> <Deployment Version="5">
<DeployFile Condition="'$(SKIADIR)'==''" Required="true" LocalName="$(BDS)\bin64\sk4d.dll" Configuration="Debug" Class="Skia"> <DeployFile Condition="'$(SKIADIR)'==''" Required="true" LocalName="$(BDS)\bin64\sk4d.dll" Configuration="Debug" Class="Skia">
......
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