{{ system.name }}
-
{{ talkgroup.alphaTag }}
diff --git a/client/src/app/components/rdio-scanner/rdio-scanner.component.scss b/client/src/app/components/rdio-scanner/rdio-scanner.component.scss
index 7a1f6a0..4bd5b54 100644
--- a/client/src/app/components/rdio-scanner/rdio-scanner.component.scss
+++ b/client/src/app/components/rdio-scanner/rdio-scanner.component.scss
@@ -9,7 +9,7 @@
* {
user-select: none;
- }
+ }
&,
.mat-sidenav,
@@ -59,10 +59,13 @@
&:active {
top: 4px;
+ transform: scale(.98);
+ transform-origin: bottom center;
}
&.off::after,
- &.on::after {
+ &.on::after,
+ &.partial::after {
content: '';
border-radius: 4px;
display: block;
@@ -82,6 +85,11 @@
background: rgb(100, 230, 50);
box-shadow: 1px 1px 1px rgb(255, 255, 255) inset, 0 0 3px 2px rgb(100, 230, 50);
}
+
+ &.partial::after {
+ background: rgb(230, 165, 50);
+ box-shadow: 1px 1px 1px rgb(255, 255, 255) inset, 0 0 3px 2px rgb(230, 165, 50);
+ }
}
.rdio-button {
@@ -200,6 +208,12 @@
}
}
+ .rdio-main,
+ .rdio-search,
+ .rdio-select {
+ min-width: 370px;
+ }
+
.rdio-main {
box-sizing: border-box;
margin: auto;
@@ -208,7 +222,6 @@
justify-content: center;
max-width: 640px;
min-height: 100%;
- min-width: 270px;
padding: 24px;
}
@@ -311,4 +324,24 @@
}
}
}
+
+ @media (min-width: 720px) {
+ .rdio-button {
+ width: calc(20% - 8px);
+ }
+
+ .rdio-button-mini {
+ width: calc(10% - 8px);
+ }
+ }
+
+ @media (min-width: 1200px) {
+ .rdio-button {
+ width: calc(10% - 8px);
+ }
+
+ .rdio-button-mini {
+ width: calc(5% - 8px);
+ }
+ }
}
diff --git a/client/src/app/components/rdio-scanner/rdio-scanner.component.ts b/client/src/app/components/rdio-scanner/rdio-scanner.component.ts
index 414cf35..08cf4ac 100644
--- a/client/src/app/components/rdio-scanner/rdio-scanner.component.ts
+++ b/client/src/app/components/rdio-scanner/rdio-scanner.component.ts
@@ -12,6 +12,17 @@ declare var webkitAudioContext: any;
const LOCAL_STORAGE_KEY = 'rdio-scanner';
+enum RdioScannerGroupStatus {
+ Off = 'off',
+ On = 'on',
+ Partial = 'partial',
+}
+
+interface RdioScannerGroup {
+ name: string;
+ status: RdioScannerGroupStatus;
+}
+
interface RdioScannerSelection {
[key: string]: {
[key: string]: boolean;
@@ -40,6 +51,7 @@ export class AppRdioScannerComponent implements OnDestroy, OnInit {
get displayTag() { return this._displayTag; }
get displayTalkgroup() { return this._displayTalkgroup; }
get displayUnit() { return this._displayUnit; }
+ get groups() { return this._groups; }
get livefeedPaused() { return this._livefeedPaused; }
get livefeedStatus() { return !!this.livefeedSubscription; }
get searchForm() { return this._searchForm; }
@@ -71,6 +83,7 @@ export class AppRdioScannerComponent implements OnDestroy, OnInit {
private _displayTag = 'Tag';
private _displayTalkgroup = 0;
private _displayUnit = 0;
+ private _groups: RdioScannerGroup[] = [];
private _livefeedPaused = false;
private _searchForm: FormGroup = this.ngFormBuilder.group({
date: [null],
@@ -162,6 +175,8 @@ export class AppRdioScannerComponent implements OnDestroy, OnInit {
}
}
+ this.buildGroups();
+
if (this.call && !(this.selection && this.selection[this.call.system] &&
this._selection[this.call.system][this.call.talkgroup])) {
this.skip();
@@ -422,6 +437,38 @@ export class AppRdioScannerComponent implements OnDestroy, OnInit {
}
}
+ toggleGroup(name: string): void {
+ const group = this.groups.find((_group) => _group.name === name);
+
+ if (group) {
+ const status = group.status === RdioScannerGroupStatus.On ? false : true;
+
+ this.systems.forEach((system) => {
+ system.talkgroups.forEach((talkgroup) => {
+ if (talkgroup.group === name) {
+ this.selection[system.system][talkgroup.dec] = status;
+ }
+ });
+ });
+
+ this.buildGroups();
+
+ if (this.call && !(this.selection && this.selection[this.call.system] &&
+ this._selection[this.call.system][this.call.talkgroup])) {
+ this.skip();
+ }
+
+ if (this.livefeedStatus) {
+ this.unsubscribeLivefeed();
+ this.subscribeLivefeed();
+ }
+
+ this.writeSelection();
+
+ this.cleanQueue();
+ }
+ }
+
toggleSearchPanel(opened = !this.searchPanelOpened): void {
if (opened) {
this.loadStoredCalls();
@@ -460,9 +507,42 @@ export class AppRdioScannerComponent implements OnDestroy, OnInit {
events.forEach((event) => document.body.addEventListener(event, bootstrap));
}
- private cleanQueue(): void {
- const queueLength = this.callQueue.length;
+ private buildGroups(): void {
+ const groups: RdioScannerGroup[] = [];
+ this.systems.forEach((system: RdioScannerSystem) => {
+ system.talkgroups
+ .forEach((talkgroup: RdioScannerTalkgroup) => {
+ const group = groups.find((_group) => _group.name === talkgroup.group);
+
+ if (!group) {
+ const allOn = this.systems.every((sys) => {
+ return sys.talkgroups.filter((tg) => tg.group === talkgroup.group)
+ .every((tg) => this.selection[sys.system][tg.dec]);
+ });
+
+ const allOff = this.systems.every((sys) => {
+ return sys.talkgroups.filter((tg) => tg.group === talkgroup.group)
+ .every((tg) => !this.selection[sys.system][tg.dec]);
+ });
+
+ const name = talkgroup.group;
+
+ const status = allOn ? RdioScannerGroupStatus.On
+ : allOff ? RdioScannerGroupStatus.Off
+ : RdioScannerGroupStatus.Partial;
+
+ groups.push({ name, status });
+ }
+ });
+ });
+
+ groups.sort((a, b) => a.name.localeCompare(b.name));
+
+ this.groups.splice(0, this.groups.length, ...groups);
+ }
+
+ private cleanQueue(): void {
this._callQueue = this.callQueue.filter((call: RdioScannerCall) => {
return this.selection && this.selection[call.system] && this.selection[call.system][call.talkgroup];
});
@@ -476,53 +556,6 @@ export class AppRdioScannerComponent implements OnDestroy, OnInit {
.concat(' Hz');
}
- private processCall(call: RdioScannerCall): void {
- if (call !== null && typeof call === 'object') {
- call = this.transformCall(call);
- this.queue(call);
- }
- }
-
- private processSystems(systems: RdioScannerSystem[]): void {
- if (Array.isArray(systems)) {
- this.systems.splice(0, this.systems.length, ...systems);
-
- this.readSelection();
- this.rebuildSelection();
- this.writeSelection();
- }
- }
-
- private readSelection(): any {
- if (window instanceof Window && window.localStorage instanceof Storage) {
- try {
- this._selection = JSON.parse(window.localStorage.getItem(LOCAL_STORAGE_KEY));
- } catch (err) {
- this._selection = {};
- }
- }
- }
-
- private rebuildSelection(): void {
- this._selection = this.systems.reduce((sa, sv) => {
- const tgs = sv.talkgroups.map((tg) => tg.dec.toString());
-
- if (Array.isArray(sa[sv.system])) {
- Object.keys(sa[sv.system]).forEach((tg) => {
- if (!tgs.includes(tg)) {
- delete sa[sv.system][tg];
- }
- });
- }
-
- sa[sv.system] = sv.talkgroups.reduce((ta, tv) => {
- ta[tv.dec] = typeof ta[tv.dec] === 'boolean' ? ta[tv.dec] : true;
- return ta;
- }, sa[sv.system] || {});
- return sa;
- }, this.selection || {});
- }
-
private async loadStoredCalls(filters?: any): Promise {
const limit = this.searchResultsBuffer.length;
@@ -602,6 +635,55 @@ export class AppRdioScannerComponent implements OnDestroy, OnInit {
}
}
+ private processCall(call: RdioScannerCall): void {
+ if (call !== null && typeof call === 'object') {
+ call = this.transformCall(call);
+ this.queue(call);
+ }
+ }
+
+ private processSystems(systems: RdioScannerSystem[]): void {
+ if (Array.isArray(systems)) {
+ this.systems.splice(0, this.systems.length, ...systems);
+
+ this.readSelection();
+ this.rebuildSelection();
+ this.writeSelection();
+
+ this.buildGroups();
+ }
+ }
+
+ private readSelection(): any {
+ if (window instanceof Window && window.localStorage instanceof Storage) {
+ try {
+ this._selection = JSON.parse(window.localStorage.getItem(LOCAL_STORAGE_KEY));
+ } catch (err) {
+ this._selection = {};
+ }
+ }
+ }
+
+ private rebuildSelection(): void {
+ this._selection = this.systems.reduce((sa, sv) => {
+ const tgs = sv.talkgroups.map((tg) => tg.dec.toString());
+
+ if (Array.isArray(sa[sv.system])) {
+ Object.keys(sa[sv.system]).forEach((tg) => {
+ if (!tgs.includes(tg)) {
+ delete sa[sv.system][tg];
+ }
+ });
+ }
+
+ sa[sv.system] = sv.talkgroups.reduce((ta, tv) => {
+ ta[tv.dec] = typeof ta[tv.dec] === 'boolean' ? ta[tv.dec] : true;
+ return ta;
+ }, sa[sv.system] || {});
+ return sa;
+ }, this.selection || {});
+ }
+
private subscribeSearchForm(): void {
let lastValue = this.searchForm.value;
diff --git a/docs/examples/trunk-recorder/talkgroups/HQ.csv b/docs/examples/trunk-recorder/talkgroups/HQ.csv
index 0cfa93d..a447735 100644
--- a/docs/examples/trunk-recorder/talkgroups/HQ.csv
+++ b/docs/examples/trunk-recorder/talkgroups/HQ.csv
@@ -1,3 +1,3 @@
-1001,3e9,D,BLAINVILLE *1,HQ Blainville Main,Utilities,Utilities,1
-1002,3ea,D,BLAINVILLE *2,HQ Blainville Travail,Utilities,1
-1003,3eb,D,BLAINVILLE *3,HQ Blainville Autre,Utilities,2
\ No newline at end of file
+1001,3e9,D,BLAINVILLE *1,HQ Blainville Main,Utilities,UTILITY,1
+1002,3ea,D,BLAINVILLE *2,HQ Blainville Travail,Utilities,UTILITY,1
+1003,3eb,D,BLAINVILLE *3,HQ Blainville Autre,Utilities,UTILITY,1
diff --git a/docs/examples/trunk-recorder/talkgroups/RSP25MTL1.csv b/docs/examples/trunk-recorder/talkgroups/RSP25MTL1.csv
index 1254aae..ee47a2e 100644
--- a/docs/examples/trunk-recorder/talkgroups/RSP25MTL1.csv
+++ b/docs/examples/trunk-recorder/talkgroups/RSP25MTL1.csv
@@ -1,37 +1,37 @@
-54241,d3e1,D,ALPHA 1,MRC TDB Fire Alpha 1,Fire Dispatch,Fire,1
-54242,d3e2,D,BRAVO 1,MRC TDB Fire Bravo 1,Fire Talk,Fire,1
-54243,d3e3,D,BRAVO 2,MRC TDB Fire Bravo 2,Fire Talk,Fire,1
-54248,d3e8,D,BRAVO 3,MRC TDB Fire Bravo 3,Fire Talk,Fire,1
-54251,d3eb,D,BRAVO 4,MRC TDB Fire Bravo 4,Fire Talk,Fire,1
-54261,d3f5,D,BRAVO 5,MRC TDB Fire Bravo 5,Fire Talk,Fire,1
-54244,d3e4,D,BRAVO 6,MRC TDB Fire Bravo 6,Fire Talk,Fire,1
-54129,d371,D,BRAVO 7,MRC TDB Fire Bravo 7,Fire Talk,Fire,1
-54125,d36d,D,BRAVO 8,MRC TDB Fire Bravo 8,Fire Talk,Fire,1
-54005,d2f5,D,D-M FD,Deux-Montagnes Fire Dispatch,Fire Dispatch,Fire,1
-54239,d3df,D,SADP FD,Ste-Anne-des-Plaines Fire Dispatch,Fire Dispatch,Fire,1
-54200,d3b8,D,ST ANN,St-Eustache General Announcement,Fire Talk,Fire,2
-54201,d3b9,D,SE GEN,St-Eustache General,Fire Talk,Fire,2
-54202,d3ba,D,SE OP1,St-Eustache Operations,Fire Talk,Fire,2
-54203,d3bb,D,SE PRV,St-Eustache Prevention,Fire Tac,Fire,2
-54206,d3be,D,SE CCU,St-Eustache Mesure d'Urgence,Interop,Fire,2
-56201,db89,D,DSURGEN,YUL Security Dispatch,Security,Security,2
-56202,db8a,D,DSURTAC,YUL Security Tactical,Security,Security,2
-56203,db8b,D,DSUROP,YUL Security Operations,Security,Security,2
-56211,db93,D,DINCOPS,YUL Fire Dispatch,Fire Dispatch,Fire,1
-56212,db94,D,DINCTAC,YUL Tactical,Fire Tac,Fire,1
-56218,db9a,D,DCCU,YUL CCU,Utilities,Utility,3
-56221,db9d,D,DBATIM,YUL Batiment,Utilities,Utility,3
-56222,db9e,D,DSCHAMP,YUL SCHAMP,Utilities,Utility,3
-56223,db9f,D,DFOULE,YUL Foule,Utilities,Utility,3
-56224,dba0,D,DACCES,YUL Acces,Utilities,Utility,3
-56225,dba1,D,DELECTR,YUL Electricity,Utilities,Utility,3
-56226,dba2,D,DPISTE,YUL Piste,Utilities,Utility,3
-56227,dba3,D,DTABLIER,YUL Tablier,Utilities,Utility,3
-56228,dba4,D,DVTP,YUL VTP,Utilities,Utility,3
-56229,dba5,D,DPONT,YUL Pont,Utilities,Utility,3
-56232,dba8,D,DINSTALL,YUL Install,Utilities,Utility,3
-56204,db8c,D,MSURGEN,YMX Security Dispatch,Security,Security,3
-56213,db95,D,MINCOPS,YMX Fire Dispatch,Fire Dispatch,Fire,1
-56214,db96,D,MINCTAC,YMX Fire Tactical,Fire Tac,Fire,1
-56219,db9b,D,MCCU,YMX CCU,Utilities,Utility,3
-56231,dba7,D,MPISTE,YMX PISTE,Utilities,Utility,3
+54241,d3e1,D,ALPHA 1,MRC TDB Fire Alpha 1,Fire Dispatch,FIRE,1
+54242,d3e2,D,BRAVO 1,MRC TDB Fire Bravo 1,Fire Talk,FIRE,1
+54243,d3e3,D,BRAVO 2,MRC TDB Fire Bravo 2,Fire Talk,FIRE,1
+54248,d3e8,D,BRAVO 3,MRC TDB Fire Bravo 3,Fire Talk,FIRE,1
+54251,d3eb,D,BRAVO 4,MRC TDB Fire Bravo 4,Fire Talk,FIRE,1
+54261,d3f5,D,BRAVO 5,MRC TDB Fire Bravo 5,Fire Talk,FIRE,1
+54244,d3e4,D,BRAVO 6,MRC TDB Fire Bravo 6,Fire Talk,FIRE,1
+54129,d371,D,BRAVO 7,MRC TDB Fire Bravo 7,Fire Talk,FIRE,1
+54125,d36d,D,BRAVO 8,MRC TDB Fire Bravo 8,Fire Talk,FIRE,1
+54005,d2f5,D,D-M FD,Deux-Montagnes Fire Dispatch,Fire Dispatch,FIRE,1
+54239,d3df,D,SADP FD,Ste-Anne-des-Plaines Fire Dispatch,Fire Dispatch,FIRE,1
+54200,d3b8,D,ST ANN,St-Eustache General Announcement,Fire Talk,FIRE,2
+54201,d3b9,D,SE GEN,St-Eustache General,Fire Talk,FIRE,2
+54202,d3ba,D,SE OP1,St-Eustache Operations,Fire Talk,FIRE,2
+54203,d3bb,D,SE PRV,St-Eustache Prevention,Fire Tac,FIRE,2
+54206,d3be,D,SE CCU,St-Eustache Mesure d'urgence,Interop,EMERGENCY,2
+56201,db89,D,DSURGEN,YUL Security Dispatch,Security,SECURITY,2
+56202,db8a,D,DSURTAC,YUL Security Tactical,Security,SECURITY,2
+56203,db8b,D,DSUROP,YUL Security Operations,Security,SECURITY,2
+56211,db93,D,DINCOPS,YUL Fire Dispatch,Fire Dispatch,FIRE,1
+56212,db94,D,DINCTAC,YUL Tactical,Fire Tac,FIRE,1
+56218,db9a,D,DCCU,YUL CCU,Mesure d'urgence,EMERGENCY,3
+56221,db9d,D,DBATIM,YUL Batiment,Utilities,UTILITY,3
+56222,db9e,D,DSCHAMP,YUL SCHAMP,Utilities,UTILITY,3
+56223,db9f,D,DFOULE,YUL Foule,Utilities,UTILITY,3
+56224,dba0,D,DACCES,YUL Acces,Utilities,UTILITY,3
+56225,dba1,D,DELECTR,YUL Electricity,Utilities,UTILITY,3
+56226,dba2,D,DPISTE,YUL Piste,Utilities,UTILITY,3
+56227,dba3,D,DTABLIER,YUL Tablier,Utilities,UTILITY,3
+56228,dba4,D,DVTP,YUL VTP,Utilities,UTILITY,3
+56229,dba5,D,DPONT,YUL Pont,Utilities,UTILITY,3
+56232,dba8,D,DINSTALL,YUL Install,Utilities,UTILITY,3
+56204,db8c,D,MSURGEN,YMX Security Dispatch,Security,SECURITY,3
+56213,db95,D,MINCOPS,YMX Fire Dispatch,Fire Dispatch,FIRE,1
+56214,db96,D,MINCTAC,YMX Fire Tactical,Fire Tac,FIRE,1
+56219,db9b,D,MCCU,YMX CCU,Mesure d'urgence,EMERGENCY,3
+56231,dba7,D,MPISTE,YMX PISTE,Utilities,UTILITY,3
diff --git a/docs/examples/trunk-recorder/talkgroups/RSP25MTL5.csv b/docs/examples/trunk-recorder/talkgroups/RSP25MTL5.csv
index 3bdefaf..5b35858 100644
--- a/docs/examples/trunk-recorder/talkgroups/RSP25MTL5.csv
+++ b/docs/examples/trunk-recorder/talkgroups/RSP25MTL5.csv
@@ -1,9 +1,9 @@
-54153,d389,D,ASSOMP FD,L'Assomption Fire Dispatch,Fire Dispatch,Fire,1
-54171,d39b,D,MASCOU FD,Mascouche Fire Dispatch,Fire Dispatch,Fire,1
-54141,d37d,D,REPENT FD1,Repentigny Fire Dispatch 1,Fire Dispatch,Fire,1
-54142,d37e,D,REPENT FD2,Repentigny Fire Dispatch 2,Fire Talk,Fire,1
-54143,d37f,D,REPENT FO,Repentigny Fire Operations,Fire Talk,Fire,1
-54144,d380,D,REPENT FP,Repentigny Fire Prevention,Fire Talk,Fire,1
-54145,d381,D,REPENT EM,Repentigny Emergency Measure,Fire Talk,Fire,1
-54231,d3d7,D,TERREB FD,Terrebonne Fire Dispatch,Fire Dispatch,Fire,1
-54232,d3d8,D,TERREB FO,Terrebonne Fire Operations,Fire Tac,Fire,1
+54153,d389,D,ASSOMP FD,L'Assomption Fire Dispatch,Fire Dispatch,FIRE,1
+54171,d39b,D,MASCOU FD,Mascouche Fire Dispatch,Fire Dispatch,FIRE,1
+54141,d37d,D,REPENT FD1,Repentigny Fire Dispatch 1,Fire Dispatch,FIRE,1
+54142,d37e,D,REPENT FD2,Repentigny Fire Dispatch 2,Fire Talk,FIRE,1
+54143,d37f,D,REPENT FO,Repentigny Fire Operations,Fire Talk,FIRE,1
+54144,d380,D,REPENT FP,Repentigny Fire Prevention,Fire Talk,FIRE,1
+54145,d381,D,REPENT EM,Repentigny Emergency Measure,Fire Talk,FIRE,1
+54231,d3d7,D,TERREB FD,Terrebonne Fire Dispatch,Fire Dispatch,FIRE,1
+54232,d3d8,D,TERREB FO,Terrebonne Fire Operations,Fire Tac,FIRE,1
diff --git a/docs/examples/trunk-recorder/talkgroups/SERAM.csv b/docs/examples/trunk-recorder/talkgroups/SERAM.csv
index 4bee24d..674afbd 100644
--- a/docs/examples/trunk-recorder/talkgroups/SERAM.csv
+++ b/docs/examples/trunk-recorder/talkgroups/SERAM.csv
@@ -1,47 +1,47 @@
-60040,ea88,D,GENERALE,SERAM Appel generale,Fire Dispatch,Fire,1
-60041,ea89,D,A1 REPART,Repartition,Fire Dispatch,Fire,1
-50001,c351,D,SG 1,SERAM Regroupement 1,Fire Dispatch,Fire,1
-50002,c352,D,SG 2,SERAM Regroupement 2,Fire Dispatch,Fire,1
-50003,c353,D,SG 3,SERAM Regroupement 3,Fire Dispatch,Fire,1
-50004,c354,D,SG 4,SERAM Regroupement 4,Fire Dispatch,Fire,1
-50005,c355,D,SG 5,SERAM Regroupement 5,Fire Dispatch,Fire,1
-50006,c356,D,SG 6,SERAM Regroupement 6,Fire Dispatch,Fire,1
-50007,c357,D,SG 7,SERAM Regroupement 7,Fire Dispatch,Fire,1
-50008,c358,D,SG 8,SERAM Regroupement 8,Fire Dispatch,Fire,1
-60051,ea93,D,CMD 3,SERAM Commandement 3,Fire Dispatch,Fire,1
-60052,ea94,D,CMD 4,SERAM Commandement 4,Fire Dispatch,Fire,1
-60053,ea95,D,CMD 5,SERAM Commandement 5,Fire Dispatch,Fire,1
-60054,ea96,D,CMD 6,SERAM Commandement 6,Fire Dispatch,Fire,1
-60055,ea97,D,CMD 7,SERAM Commandement 7,Fire Dispatch,Fire,1
-60056,ea98,D,CMD 8,SERAM Commandement 8,Fire Dispatch,Fire,1
-60059,ea9b,D,CMD 11,SERAM Commandement 11,Fire Dispatch,Fire,1
-60091,eabb,D,CMD 12,SERAM Commandement 12,Fire Dispatch,Fire,1
-60092,eabc,D,CMD 13,SERAM Commandement 13,Fire Dispatch,Fire,1
-60057,ea99,D,CMD 14,SERAM Commandement 14,Fire Dispatch,Fire,1
-60061,ea9d,D,OPS 3,SERAM Operations 3,Fire Tac,Fire,1
-60062,ea9e,D,OPS 4,SERAM Operations 4,Fire Tac,Fire,1
-60063,ea9f,D,OPS 5,SERAM Operations 5,Fire Tac,Fire,1
-60064,eaa0,D,OPS 6,SERAM Operations 6,Fire Tac,Fire,1
-60065,eaa1,D,OPS 7,SERAM Operations 7,Fire Tac,Fire,1
-60066,eaa2,D,OPS 8,SERAM Operations 8,Fire Tac,Fire,1
-60069,eaa2,D,OPS 11,SERAM Operations 11,Fire Tac,Fire,1
-60093,eabd,D,OPS 12,SERAM Operations 12,Fire Tac,Fire,1
-60094,eabe,D,OPS 13,SERAM Operations 13,Fire Tac,Fire,1
-60067,eaa3,D,OPS 14,SERAM Operations 14,Fire Tac,Fire,1
-60042,ea8a,D,PR A,SERAM First Responders A,Fire Dispatch,Fire,1
-60043,ea8b,D,PR B,SERAM First Responders B,Fire Dispatch,Fire,1
-60058,ea9a,D,PCM A,SERAM Commandement A,Fire Tac,Fire,1
-60068,eaa4,D,PCM B,SERAM Commandement B,Fire Tac,Fire,1
-60080,eab0,D,PCM C,SERAM Commandement C,Fire Tac,Fire,1
-60081,eab1,D,935 A,SERAM 935 A,Fire Tac,Fire,1
-60082,eab2,D,935 B,SERAM 935 B,Fire Tac,Fire,1
-60079,eaaf,D,935 C,SERAM 935 C,Fire Tac,Fire,1
-60149,eaf5,D,EMERGENCY,SERAM Emergency,Fire-Tac,Fire,1
-60071,eaa7,D,SC 1,SERAM Civil Security 1,Emergency Ops,Emergency,1
-60072,eaa8,D,SC 2,SERAM Civil Security 2,Emergency Ops,Emergency,1
-60101,eac5,D,FORM 1,SERAM Training 1,Fire-Talk,Fire,2
-60102,eac6,D,FORM 2,SERAM Training 2,Fire-Talk,Fire,2
-60111,eacf,D,LIAISON,SERAM Liaison,Fire-Talk,Fire,2
-60112,ead0,D,LOGISTIC,SERAM Logistic,Fire-Talk,Fire,2
-60114,ead4,D,PREV RCI,SERAM Prevention RCI,Fire-Talk,Fire,2
-60294,eb86,D,DSRC MEDIA,SERAM Media,Info,Info,2
+60040,ea88,D,GENERALE,SERAM Appel generale,Fire Dispatch,FIRE,1
+60041,ea89,D,A1 REPART,Repartition,Fire Dispatch,FIRE,1
+50001,c351,D,SG 1,SERAM Regroupement 1,Fire Dispatch,FIRE,1
+50002,c352,D,SG 2,SERAM Regroupement 2,Fire Dispatch,FIRE,1
+50003,c353,D,SG 3,SERAM Regroupement 3,Fire Dispatch,FIRE,1
+50004,c354,D,SG 4,SERAM Regroupement 4,Fire Dispatch,FIRE,1
+50005,c355,D,SG 5,SERAM Regroupement 5,Fire Dispatch,FIRE,1
+50006,c356,D,SG 6,SERAM Regroupement 6,Fire Dispatch,FIRE,1
+50007,c357,D,SG 7,SERAM Regroupement 7,Fire Dispatch,FIRE,1
+50008,c358,D,SG 8,SERAM Regroupement 8,Fire Dispatch,FIRE,1
+60051,ea93,D,CMD 3,SERAM Commandement 3,Fire Dispatch,FIRE,1
+60052,ea94,D,CMD 4,SERAM Commandement 4,Fire Dispatch,FIRE,1
+60053,ea95,D,CMD 5,SERAM Commandement 5,Fire Dispatch,FIRE,1
+60054,ea96,D,CMD 6,SERAM Commandement 6,Fire Dispatch,FIRE,1
+60055,ea97,D,CMD 7,SERAM Commandement 7,Fire Dispatch,FIRE,1
+60056,ea98,D,CMD 8,SERAM Commandement 8,Fire Dispatch,FIRE,1
+60059,ea9b,D,CMD 11,SERAM Commandement 11,Fire Dispatch,FIRE,1
+60091,eabb,D,CMD 12,SERAM Commandement 12,Fire Dispatch,FIRE,1
+60092,eabc,D,CMD 13,SERAM Commandement 13,Fire Dispatch,FIRE,1
+60057,ea99,D,CMD 14,SERAM Commandement 14,Fire Dispatch,FIRE,1
+60061,ea9d,D,OPS 3,SERAM Operations 3,Fire Tac,FIRE,1
+60062,ea9e,D,OPS 4,SERAM Operations 4,Fire Tac,FIRE,1
+60063,ea9f,D,OPS 5,SERAM Operations 5,Fire Tac,FIRE,1
+60064,eaa0,D,OPS 6,SERAM Operations 6,Fire Tac,FIRE,1
+60065,eaa1,D,OPS 7,SERAM Operations 7,Fire Tac,FIRE,1
+60066,eaa2,D,OPS 8,SERAM Operations 8,Fire Tac,FIRE,1
+60069,eaa2,D,OPS 11,SERAM Operations 11,Fire Tac,FIRE,1
+60093,eabd,D,OPS 12,SERAM Operations 12,Fire Tac,FIRE,1
+60094,eabe,D,OPS 13,SERAM Operations 13,Fire Tac,FIRE,1
+60067,eaa3,D,OPS 14,SERAM Operations 14,Fire Tac,FIRE,1
+60042,ea8a,D,PR A,SERAM First Responders A,Fire Dispatch,FIRE,1
+60043,ea8b,D,PR B,SERAM First Responders B,Fire Dispatch,FIRE,1
+60058,ea9a,D,PCM A,SERAM Commandement A,Fire Tac,FIRE,1
+60068,eaa4,D,PCM B,SERAM Commandement B,Fire Tac,FIRE,1
+60080,eab0,D,PCM C,SERAM Commandement C,Fire Tac,FIRE,1
+60081,eab1,D,935 A,SERAM 935 A,Fire Tac,FIRE,1
+60082,eab2,D,935 B,SERAM 935 B,Fire Tac,FIRE,1
+60079,eaaf,D,935 C,SERAM 935 C,Fire Tac,FIRE,1
+60149,eaf5,D,EMERGENCY,SERAM Emergency,Fire-Tac,EMERGENCY,1
+60071,eaa7,D,SC 1,SERAM Civil Security 1,Emergency Ops,EMERGENCY,1
+60072,eaa8,D,SC 2,SERAM Civil Security 2,Emergency Ops,EMERGENCY,1
+60101,eac5,D,FORM 1,SERAM Training 1,Fire-Talk,FIRE,2
+60102,eac6,D,FORM 2,SERAM Training 2,Fire-Talk,FIRE,2
+60111,eacf,D,LIAISON,SERAM Liaison,Fire-Talk,FIRE,2
+60112,ead0,D,LOGISTIC,SERAM Logistic,Fire-Talk,FIRE,2
+60114,ead4,D,PREV RCI,SERAM Prevention RCI,Fire-Talk,FIRE,2
+60294,eb86,D,DSRC MEDIA,SERAM Media,Info,INFO,2
diff --git a/docs/images/rdio_scanner_select.png b/docs/images/rdio_scanner_select.png
index fb9fd2c..40f0080 100644
Binary files a/docs/images/rdio_scanner_select.png and b/docs/images/rdio_scanner_select.png differ
diff --git a/package.json b/package.json
index 8d968c2..d5b1352 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "rdio-scanner",
- "version": "2.1.0",
+ "version": "2.5.0",
"private": true,
"main": "run.js",
"scripts": {
diff --git a/server/package-lock.json b/server/package-lock.json
index 0c7b473..327759b 100644
--- a/server/package-lock.json
+++ b/server/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "rdio-scanner-server",
- "version": "2.1.0",
+ "version": "2.5.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -25,9 +25,9 @@
},
"dependencies": {
"@types/node": {
- "version": "10.17.11",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.11.tgz",
- "integrity": "sha512-dNd2pp8qTzzNLAs3O8nH3iU9DG9866KHq9L3ISPB7DOGERZN81nW/5/g/KzMJpCU8jrbCiMRBzV9/sCEdRosig=="
+ "version": "10.17.13",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.13.tgz",
+ "integrity": "sha512-pMCcqU2zT4TjqYFrWtYHKal7Sl30Ims6ulZ4UFXxI4xbtQqK/qqKwkDoBFCfooRqqmRu9vY3xaJRwxSh673aYg=="
}
}
},
@@ -211,9 +211,9 @@
"integrity": "sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ=="
},
"@types/keygrip": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.1.tgz",
- "integrity": "sha1-/1QEYtL7TQqIRBzq8n0oewHD2Hg="
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz",
+ "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw=="
},
"@types/koa": {
"version": "2.11.0",
@@ -368,35 +368,36 @@
}
},
"apollo-cache-control": {
- "version": "0.8.9",
- "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.8.9.tgz",
- "integrity": "sha512-EFRAEL13QkMbXhl0NSABVS0wfiKYIVV4sDR+XNtRy3EWf2rWw7xulYFDMPiujjtElF2qjTswzcpLtYOXgOZN9A==",
+ "version": "0.8.10",
+ "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.8.10.tgz",
+ "integrity": "sha512-1/CAEidIoY1PWw2mhwZChchK4fvLdHfdoB7AEikWMYFSbjYY6ZiayT+Q3z48wsiS/LTNugF/YJDJHQi4+qjuug==",
"requires": {
"apollo-server-env": "^2.4.3",
- "graphql-extensions": "^0.10.8"
+ "graphql-extensions": "^0.10.9"
}
},
"apollo-datasource": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.6.3.tgz",
- "integrity": "sha512-gRYyFVpJgHE2hhS+VxMeOerxXQ/QYxWG7T6QddfugJWYAG9DRCl65e2b7txcGq2NP3r+O1iCm4GNwhRBDJbd8A==",
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.6.4.tgz",
+ "integrity": "sha512-u4eu6Q94q6KuZacZfdo4vCevA81F4QWeTYEXUvoksQMJpiacPHHe0DJrofKVKvxngUp5kCi1RnPXSc6kBY+/oA==",
"requires": {
- "apollo-server-caching": "^0.5.0",
+ "apollo-server-caching": "^0.5.1",
"apollo-server-env": "^2.4.3"
}
},
"apollo-engine-reporting": {
- "version": "1.4.12",
- "resolved": "https://registry.npmjs.org/apollo-engine-reporting/-/apollo-engine-reporting-1.4.12.tgz",
- "integrity": "sha512-W1PpXaXSrqZu4Ae9NrjWXtTL9HFbQPynQLiGDAsDmCsL/wRAVyl6qRhVteSj7drwgXgAH5TwtUCnjJgSI+ixlg==",
+ "version": "1.4.13",
+ "resolved": "https://registry.npmjs.org/apollo-engine-reporting/-/apollo-engine-reporting-1.4.13.tgz",
+ "integrity": "sha512-p5fVmQigNGXoxCHnu8Bb6itNfwtjGnoyLf9i4oP0vfdSnTjaNI8KM7zXv16t1YnE/wsqYuieCnleoPSBReTy9Q==",
"requires": {
"apollo-engine-reporting-protobuf": "^0.4.4",
"apollo-graphql": "^0.3.4",
- "apollo-server-caching": "^0.5.0",
+ "apollo-server-caching": "^0.5.1",
"apollo-server-env": "^2.4.3",
- "apollo-server-types": "^0.2.9",
+ "apollo-server-errors": "^2.3.4",
+ "apollo-server-types": "^0.2.10",
"async-retry": "^1.2.1",
- "graphql-extensions": "^0.10.8"
+ "graphql-extensions": "^0.10.9"
}
},
"apollo-engine-reporting-protobuf": {
@@ -438,33 +439,33 @@
}
},
"apollo-server-caching": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.5.0.tgz",
- "integrity": "sha512-l7ieNCGxUaUAVAAp600HjbUJxVaxjJygtPV0tPTe1Q3HkPy6LEWoY6mNHV7T268g1hxtPTxcdRu7WLsJrg7ufw==",
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.5.1.tgz",
+ "integrity": "sha512-L7LHZ3k9Ao5OSf2WStvQhxdsNVplRQi7kCAPfqf9Z3GBEnQ2uaL0EgO0hSmtVHfXTbk5CTRziMT1Pe87bXrFIw==",
"requires": {
"lru-cache": "^5.0.0"
}
},
"apollo-server-core": {
- "version": "2.9.14",
- "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.9.14.tgz",
- "integrity": "sha512-Vc8TicXFFZGuEgo5AY1Ey0XuvHn7NQS1y7WxOQnr85KJ2zeRa6uIT8tU+73ZObzan3nlm9ysYtfSXh2QL21oyg==",
+ "version": "2.9.15",
+ "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.9.15.tgz",
+ "integrity": "sha512-MgqtxZkUO2u7cSDQjp8feQlyHT/iZlKv3TV5kNy+xa9ewbfiR/qjziMsz46x+oVPBah+VH9WbGShSbVO0b2TJA==",
"requires": {
"@apollographql/apollo-tools": "^0.4.0",
"@apollographql/graphql-playground-html": "1.6.24",
"@types/graphql-upload": "^8.0.0",
"@types/ws": "^6.0.0",
- "apollo-cache-control": "^0.8.9",
- "apollo-datasource": "^0.6.3",
- "apollo-engine-reporting": "^1.4.12",
- "apollo-server-caching": "^0.5.0",
+ "apollo-cache-control": "^0.8.10",
+ "apollo-datasource": "^0.6.4",
+ "apollo-engine-reporting": "^1.4.13",
+ "apollo-server-caching": "^0.5.1",
"apollo-server-env": "^2.4.3",
"apollo-server-errors": "^2.3.4",
- "apollo-server-plugin-base": "^0.6.9",
- "apollo-server-types": "^0.2.9",
- "apollo-tracing": "^0.8.9",
+ "apollo-server-plugin-base": "^0.6.10",
+ "apollo-server-types": "^0.2.10",
+ "apollo-tracing": "^0.8.10",
"fast-json-stable-stringify": "^2.0.0",
- "graphql-extensions": "^0.10.8",
+ "graphql-extensions": "^0.10.9",
"graphql-tag": "^2.9.2",
"graphql-tools": "^4.0.0",
"graphql-upload": "^8.0.2",
@@ -488,9 +489,9 @@
"integrity": "sha512-Y0PKQvkrb2Kd18d1NPlHdSqmlr8TgqJ7JQcNIfhNDgdb45CnqZlxL1abuIRhr8tiw8OhVOcFxz2KyglBi8TKdA=="
},
"apollo-server-express": {
- "version": "2.9.14",
- "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.9.14.tgz",
- "integrity": "sha512-ai+VKPlOUzJsbSQcazjATNtWwdgcvZBWBCbTF7ZUC9Uo6FfSlKOmP3raQAq+gKqsnFwv34p4k17c/Asw5ZjSMQ==",
+ "version": "2.9.15",
+ "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.9.15.tgz",
+ "integrity": "sha512-RrPFAW6QqxAGAlubdvxjluGc7SOr70H69ElLxDgXy3HREXN25Y4XZoCE+L3PoURwFy2mNtITZeDO7JKW1cbHNg==",
"requires": {
"@apollographql/graphql-playground-html": "1.6.24",
"@types/accepts": "^1.3.5",
@@ -498,8 +499,8 @@
"@types/cors": "^2.8.4",
"@types/express": "4.17.1",
"accepts": "^1.3.5",
- "apollo-server-core": "^2.9.14",
- "apollo-server-types": "^0.2.9",
+ "apollo-server-core": "^2.9.15",
+ "apollo-server-types": "^0.2.10",
"body-parser": "^1.18.3",
"cors": "^2.8.4",
"express": "^4.17.1",
@@ -511,30 +512,30 @@
}
},
"apollo-server-plugin-base": {
- "version": "0.6.9",
- "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.6.9.tgz",
- "integrity": "sha512-75rorl0y07PK7A/U1Oe9unLIGgbmy1T6uaCQ5zl8zy+mtmFFcH1nYERfXZha1eTDWLCx0F/xNI6YJmWxSisc5w==",
+ "version": "0.6.10",
+ "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.6.10.tgz",
+ "integrity": "sha512-/xT7UT/tbCDIoTQ4lcEQsJ0ACh7h7QG0BDmeSlDXjwDuENRI50bQ2QoluCMPitZXGe+FCQfLhvzFgzbsZGT0IA==",
"requires": {
- "apollo-server-types": "^0.2.9"
+ "apollo-server-types": "^0.2.10"
}
},
"apollo-server-types": {
- "version": "0.2.9",
- "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.2.9.tgz",
- "integrity": "sha512-Iu9twx3lycH41F8shmrb33b4y0mNBz1chBdTIaSgIMmNwPDR4xs4eB6iyTK5swnaYC1eW+c+t5lHRUk7yexs/g==",
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.2.10.tgz",
+ "integrity": "sha512-ke9ViPEWfW+2XLe66CaKGVZdS7duSLbamSKSprmmeMBd8s6tmjf0FumUVxV7X4quxPZi0OPo8x0LoLU7GWsmaA==",
"requires": {
"apollo-engine-reporting-protobuf": "^0.4.4",
- "apollo-server-caching": "^0.5.0",
+ "apollo-server-caching": "^0.5.1",
"apollo-server-env": "^2.4.3"
}
},
"apollo-tracing": {
- "version": "0.8.9",
- "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.8.9.tgz",
- "integrity": "sha512-DYHPUW0rFcxxtI8+qU3leNU+fKfq9NPTjgPMr/AJmxKfsdOI6QgfVzVP/khiik0kU0+BMl5zBplwEDDdgbkUlg==",
+ "version": "0.8.10",
+ "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.8.10.tgz",
+ "integrity": "sha512-EjToHqHdDrjj0xBRnbie57lz3U81Onrs55YqHhvzaMv8gDAeKX3rnXiw5EfYZNxR7uutoyXH0iNKaYPyolWbZA==",
"requires": {
"apollo-server-env": "^2.4.3",
- "graphql-extensions": "^0.10.8"
+ "graphql-extensions": "^0.10.9"
}
},
"apollo-utilities": {
@@ -606,9 +607,9 @@
"integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
},
"async-retry": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.2.3.tgz",
- "integrity": "sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q==",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.1.tgz",
+ "integrity": "sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA==",
"requires": {
"retry": "0.12.0"
}
@@ -1031,9 +1032,9 @@
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
"core-js": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.0.tgz",
- "integrity": "sha512-AHPTNKzyB+YwgDWoSOCaid9PUSEF6781vsfiK8qUz62zRR448/XgK2NtCbpiUGizbep8Lrpt0Du19PpGGZvw3Q=="
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.2.tgz",
+ "integrity": "sha512-hIE5dXkRzRvnZ5vhkRfQxUvDxQZmD9oueA08jDYRBKJHx+VIl/Pne/e0A4x9LObEEthC/TqiZybUoNM4tRgnKg=="
},
"core-util-is": {
"version": "1.0.2",
@@ -1279,26 +1280,27 @@
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
},
"es-abstract": {
- "version": "1.16.0",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz",
- "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==",
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz",
+ "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==",
"requires": {
- "es-to-primitive": "^1.2.0",
+ "es-to-primitive": "^1.2.1",
"function-bind": "^1.1.1",
"has": "^1.0.3",
- "has-symbols": "^1.0.0",
- "is-callable": "^1.1.4",
- "is-regex": "^1.0.4",
- "object-inspect": "^1.6.0",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.1.5",
+ "is-regex": "^1.0.5",
+ "object-inspect": "^1.7.0",
"object-keys": "^1.1.1",
- "string.prototype.trimleft": "^2.1.0",
- "string.prototype.trimright": "^2.1.0"
+ "object.assign": "^4.1.0",
+ "string.prototype.trimleft": "^2.1.1",
+ "string.prototype.trimright": "^2.1.1"
}
},
"es-to-primitive": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
- "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
"requires": {
"is-callable": "^1.1.4",
"is-date-object": "^1.0.1",
@@ -1356,9 +1358,9 @@
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
"eslint": {
- "version": "6.7.2",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.7.2.tgz",
- "integrity": "sha512-qMlSWJaCSxDFr8fBPvJM9kJwbazrhNcBU3+DszDW1OlEwKBBRWsJc7NJFelvwQpanHCR14cOLD41x8Eqvo3Nng==",
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
+ "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
@@ -1922,13 +1924,13 @@
}
},
"graphql-extensions": {
- "version": "0.10.8",
- "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.10.8.tgz",
- "integrity": "sha512-cUcc014vz+pfwcER8pc4ts/WWhDCrC9jhNFIiWYYntd2TshS+tZFsZ362i4P2VYLbpYCgFiO+xRY1f2mylyz5A==",
+ "version": "0.10.9",
+ "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.10.9.tgz",
+ "integrity": "sha512-NJdV8aGVGCrcm1Pbq8IbmV5FfLCAEPxgplh9EJU7qAP+Z4PenkuH6V6RAPRqIwwZ287m8/aDXKW+X0qFe8gyUQ==",
"requires": {
"@apollographql/apollo-tools": "^0.4.0",
"apollo-server-env": "^2.4.3",
- "apollo-server-types": "^0.2.9"
+ "apollo-server-types": "^0.2.10"
}
},
"graphql-subscriptions": {
@@ -1995,9 +1997,9 @@
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
},
"has-symbols": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
- "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q="
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
},
"has-unicode": {
"version": "2.0.1",
@@ -2173,9 +2175,9 @@
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
},
"inquirer": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.1.tgz",
- "integrity": "sha512-V1FFQ3TIO15det8PijPLFR9M9baSlnRs9nL7zWu1MNVA2T9YVl9ZbrHJhYs7e9X8jeMZ3lr2JH/rdHFgNCBdYw==",
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.3.tgz",
+ "integrity": "sha512-+OiOVeVydu4hnCGLCSX+wedovR/Yzskv9BFqUNNKq9uU2qg7LCcCo3R86S2E7WLo0y/x2pnEZfZe1CoYnORUAw==",
"dev": true,
"requires": {
"ansi-escapes": "^4.2.1",
@@ -2254,9 +2256,9 @@
"integrity": "sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI="
},
"is-callable": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
- "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA=="
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
+ "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q=="
},
"is-ci": {
"version": "1.2.1",
@@ -2267,9 +2269,9 @@
}
},
"is-date-object": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
- "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY="
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+ "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g=="
},
"is-extglob": {
"version": "2.1.1",
@@ -2337,11 +2339,11 @@
"integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ="
},
"is-regex": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
- "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
+ "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
"requires": {
- "has": "^1.0.1"
+ "has": "^1.0.3"
}
},
"is-retry-allowed": {
@@ -2355,11 +2357,11 @@
"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
},
"is-symbol": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
- "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+ "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
"requires": {
- "has-symbols": "^1.0.0"
+ "has-symbols": "^1.0.1"
}
},
"is-typedarray": {
@@ -2543,12 +2545,12 @@
}
},
"mariadb": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-2.1.4.tgz",
- "integrity": "sha512-CMLbIKZCzxero94luo25IKpboEuUCvA2g2+NMUBdRYpBCDmnsiQ8kwdgqvuVQ13a4/ZKr87BC1nbe4b3UZXXmQ==",
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-2.1.5.tgz",
+ "integrity": "sha512-uRHtjc0bg+Rt91LvIaZNo8tLcYs9YPiiW9Mke/BavFzg0MnctJBDkqZW9X59NyrRGDd7Oz9UshTWgmUpfDZc0Q==",
"requires": {
"@types/geojson": "^7946.0.7",
- "@types/node": "^12.12.11",
+ "@types/node": "^13.1.4",
"denque": "^1.4.1",
"iconv-lite": "^0.5.0",
"long": "^4.0.0",
@@ -2556,9 +2558,9 @@
},
"dependencies": {
"@types/node": {
- "version": "12.12.21",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.21.tgz",
- "integrity": "sha512-8sRGhbpU+ck1n0PGAUgVrWrWdjSW2aqNeyC15W88GRsMpSwzv6RJGlLhE7s2RhVSOdyDmxbqlWSeThq4/7xqlA=="
+ "version": "13.1.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-13.1.4.tgz",
+ "integrity": "sha512-Lue/mlp2egZJoHXZr4LndxDAd7i/7SQYhV0EjWfb/a4/OZ6tuVwMCVPiwkU5nsEipxEf7hmkSU7Em5VQ8P5NGA=="
},
"iconv-lite": {
"version": "0.5.0",
@@ -2743,9 +2745,9 @@
"dev": true
},
"mysql2": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.0.2.tgz",
- "integrity": "sha512-n9Tiw8LzrfOnH1CLFw0AWJlkQLOWMSr2Q+/aF5jRJ7SRRJLGrY9FidhyoTEhF0FxQYE+xABvXwiZl4b61Mt4eg==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.1.0.tgz",
+ "integrity": "sha512-9kGVyi930rG2KaHrz3sHwtc6K+GY9d8wWk1XRSYxQiunvGcn4DwuZxOwmK11ftuhhwrYDwGx9Ta4VBwznJn36A==",
"requires": {
"cardinal": "^2.1.1",
"denque": "^1.4.1",
@@ -2994,9 +2996,9 @@
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
},
"object-inspect": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz",
- "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ=="
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
+ "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw=="
},
"object-keys": {
"version": "1.1.1",
@@ -3008,13 +3010,24 @@
"resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz",
"integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk="
},
- "object.getownpropertydescriptors": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
- "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
+ "object.assign": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
"requires": {
"define-properties": "^1.1.2",
- "es-abstract": "^1.5.1"
+ "function-bind": "^1.1.1",
+ "has-symbols": "^1.0.0",
+ "object-keys": "^1.0.11"
+ }
+ },
+ "object.getownpropertydescriptors": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
+ "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1"
}
},
"on-finished": {
@@ -3174,14 +3187,15 @@
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
},
"pg": {
- "version": "7.15.1",
- "resolved": "https://registry.npmjs.org/pg/-/pg-7.15.1.tgz",
- "integrity": "sha512-o293Pxx5bNRpTv3Dh4+IIhPbTw19Bo4zvppLgR+MAV2I7AF3sMr9gPB4JPvBffWb24pDfC+7Ghe6xh2VxVMBpQ==",
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/pg/-/pg-7.17.0.tgz",
+ "integrity": "sha512-70Q4ZzIdPgwMPb3zUIzAUwigNJ4v5vsWdMED6OzXMfOECeYTvTm7iSC3FpKizu/R1BHL8Do3bLs6ltGfOTAnqg==",
"requires": {
"buffer-writer": "2.0.0",
"packet-reader": "1.0.0",
"pg-connection-string": "0.1.3",
- "pg-pool": "^2.0.7",
+ "pg-packet-stream": "^1.1.0",
+ "pg-pool": "^2.0.9",
"pg-types": "^2.1.0",
"pgpass": "1.x",
"semver": "4.3.2"
@@ -3204,10 +3218,15 @@
"resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
"integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="
},
+ "pg-packet-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pg-packet-stream/-/pg-packet-stream-1.1.0.tgz",
+ "integrity": "sha512-kRBH0tDIW/8lfnnOyTwKD23ygJ/kexQVXZs7gEyBljw4FYqimZFxnMMx50ndZ8In77QgfGuItS5LLclC2TtjYg=="
+ },
"pg-pool": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.8.tgz",
- "integrity": "sha512-UE4H+4PT53RbwYaGxkeVDcMcp1g8EmYo91qeUugijsHwzV/RDpYVRWzmfiDisEQZhVDzyf/GUctNOrh+ZPJCGA=="
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.9.tgz",
+ "integrity": "sha512-gNiuIEKNCT3OnudQM2kvgSnXsLkSpd6mS/fRnqs6ANtrke6j8OY5l9mnAryf1kgwJMWLg0C1N1cYTZG1xmEYHQ=="
},
"pg-types": {
"version": "2.2.0",
@@ -3550,9 +3569,9 @@
}
},
"rxjs": {
- "version": "6.5.3",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz",
- "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==",
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+ "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
"dev": true,
"requires": {
"tslib": "^1.9.0"
@@ -3826,18 +3845,18 @@
}
},
"string.prototype.trimleft": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz",
- "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz",
+ "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==",
"requires": {
"define-properties": "^1.1.3",
"function-bind": "^1.1.1"
}
},
"string.prototype.trimright": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz",
- "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz",
+ "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==",
"requires": {
"define-properties": "^1.1.3",
"function-bind": "^1.1.1"
diff --git a/server/package.json b/server/package.json
index 1e152e9..5034d06 100644
--- a/server/package.json
+++ b/server/package.json
@@ -1,6 +1,6 @@
{
"name": "rdio-scanner-server",
- "version": "2.1.0",
+ "version": "2.5.0",
"private": true,
"main": "index.js",
"scripts": {
@@ -10,25 +10,25 @@
"author": "Chrystian Huot",
"license": "LICENSE",
"dependencies": {
- "apollo-datasource": "^0.6.3",
- "apollo-server-express": "^2.9.14",
+ "apollo-datasource": "^0.6.4",
+ "apollo-server-express": "^2.9.15",
"camelcase": "^5.3.1",
"cors": "^2.8.5",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"graphql": "^14.5.8",
"helmet": "^3.21.2",
- "mariadb": "^2.1.4",
+ "mariadb": "^2.1.5",
"multer": "^1.4.2",
- "mysql2": "^2.0.2",
+ "mysql2": "^2.1.0",
"nodemon": "^2.0.2",
- "pg": "^7.15.1",
+ "pg": "^7.17.0",
"sequelize": "^5.21.3",
"sequelize-cli": "^5.5.1",
"sqlite3": "^4.1.1",
"uuid": "^3.3.3"
},
"devDependencies": {
- "eslint": "^6.7.2"
+ "eslint": "^6.8.0"
}
}
diff --git a/server/routes/trunk-recorder-system-upload.js b/server/routes/trunk-recorder-system-upload.js
index 426b64e..534835e 100644
--- a/server/routes/trunk-recorder-system-upload.js
+++ b/server/routes/trunk-recorder-system-upload.js
@@ -52,7 +52,7 @@ module.exports = ({ pubsub, store }) => (req, res) => upload.fields([
}
const emit = () => {
- store.rdioScannerSystem.findAll().then((systems) => {
+ store.rdioScannerSystem.findAll({ order: [['system', 'ASC']]}).then((systems) => {
pubsub.publish('rdioScannerSystems', { rdioScannerSystems: systemReducer(systems) });
})
};
@@ -60,12 +60,21 @@ module.exports = ({ pubsub, store }) => (req, res) => upload.fields([
if (system.talkgroups.length) {
system.talkgroups = JSON.stringify(system.talkgroups);
- store.rdioScannerSystem.upsert(system)
- .then(() => {
- emit();
- res.send(`System ${system.name} imported successfully.\n`);
- })
- .catch((err) => res.send(err.message));
+ store.rdioScannerSystem.findOne({ where: { system: system.system } })
+ .then((rdioScannerSystem) => {
+ if (rdioScannerSystem) {
+ rdioScannerSystem.update(system).then(() => {
+ emit();
+ res.send(`System ${system.name} updated successfully.\n`);
+ });
+
+ } else {
+ store.rdioScannerSystem.create(system).then(() => {
+ emit();
+ res.send(`System ${system.name} imported successfully.\n`);
+ });
+ }
+ });
} else {
store.rdioScannerSystem.destroy({ where: { system: system.system } })