Filter source UI

This commit is contained in:
Daniel Ponte 2025-02-22 19:20:23 -05:00
parent 6d7c82c3a8
commit df180cf42c
6 changed files with 67 additions and 8 deletions

View file

@ -49,6 +49,25 @@
<mat-icon>close</mat-icon> <mat-icon>close</mat-icon>
</button> </button>
</mat-form-field> </mat-form-field>
<mat-form-field class="filterBox" subscriptSizing="dynamic">
<mat-label>Source Filter</mat-label>
<input
matInput
name="sourceFilter"
type="text"
autocomplete="off"
formControlName="sourceFilter"
/>
<button
class="clearBtn"
*ngIf="form.controls['sourceFilter'].value"
matSuffix
mat-icon-button
(click)="form.controls['sourceFilter'].setValue('')"
>
<mat-icon>close</mat-icon>
</button>
</mat-form-field>
<mat-form-field class="tagSelect" subscriptSizing="dynamic"> <mat-form-field class="tagSelect" subscriptSizing="dynamic">
<mat-label>Any Tags</mat-label> <mat-label>Any Tags</mat-label>
<mat-select <mat-select
@ -163,14 +182,26 @@
<a <a
href="javascript:void(0)" href="javascript:void(0)"
class="tgFilter" class="tgFilter"
(click)="searchFilter(tgAlpha)" (click)="searchTGFilter(tgAlpha)"
>{{ tgAlpha }}</a >{{ tgAlpha }}</a
> >
</td> </td>
</ng-container> </ng-container>
<ng-container matColumnDef="talker"> <ng-container matColumnDef="talker">
<th mat-header-cell *matHeaderCellDef>Source</th> <th mat-header-cell *matHeaderCellDef>Source</th>
<td mat-cell *matCellDef="let call" [innerHTML]="call | talker"></td> <td mat-cell *matCellDef="let call">
@let tlkAlias = call | talker;
@if (tlkAlias) {
<a
href="javascript:void(0)"
class="srcFilter"
(click)="searchSrcFilter(tlkAlias)"
>{{ tlkAlias }}</a
>
} @else {
&mdash;
}
</td>
</ng-container> </ng-container>
<ng-container matColumnDef="duration"> <ng-container matColumnDef="duration">
<th mat-header-cell *matHeaderCellDef class="durationHdr">Duration</th> <th mat-header-cell *matHeaderCellDef class="durationHdr">Duration</th>

View file

@ -86,7 +86,7 @@ form {
} }
.filterBox { .filterBox {
flex: 1 1 300px; flex: 1 1 200px;
} }
.durationFilter { .durationFilter {
@ -94,13 +94,14 @@ form {
} }
.tagSelect { .tagSelect {
flex: 1 1 250px; flex: 1 1 220px;
} }
.in-incident { .in-incident {
background-color: rgb(59, 0, 59); background-color: rgb(59, 0, 59);
} }
a.tgFilter:hover { a.tgFilter:hover,
a.srcFilter:hover {
text-decoration: underline; text-decoration: underline;
} }

View file

@ -112,6 +112,7 @@ export class CallsComponent {
start: new FormControl(this.lTime(new Date())), start: new FormControl(this.lTime(new Date())),
end: new FormControl(null), end: new FormControl(null),
filter: new FormControl(''), filter: new FormControl(''),
sourceFilter: new FormControl(''),
duration: new FormControl(0), duration: new FormControl(0),
tagsAny: new FormControl<string[]>([]), tagsAny: new FormControl<string[]>([]),
tagsNot: new FormControl<string[]>([]), tagsNot: new FormControl<string[]>([]),
@ -139,12 +140,18 @@ export class CallsComponent {
return numSelected === numRows; return numSelected === numRows;
} }
searchFilter(filt: string | null) { searchTGFilter(filt: string | null) {
if (filt) { if (filt) {
this.form.controls['filter'].setValue(filt); this.form.controls['filter'].setValue(filt);
} }
} }
searchSrcFilter(filt: string | null) {
if (filt) {
this.form.controls['sourceFilter'].setValue(filt);
}
}
buildParams(p: PageEvent, serverPage: number): CallsListParams { buildParams(p: PageEvent, serverPage: number): CallsListParams {
const par: CallsListParams = { const par: CallsListParams = {
start: new Date(this.form.controls['start'].value!), start: new Date(this.form.controls['start'].value!),
@ -167,6 +174,10 @@ export class CallsComponent {
this.form.controls['filter'].value != '' this.form.controls['filter'].value != ''
? this.form.controls['filter'].value ? this.form.controls['filter'].value
: null, : null,
sourceFilter:
this.form.controls['sourceFilter'].value != ''
? this.form.controls['sourceFilter'].value
: null,
atLeastSeconds: atLeastSeconds:
this.form.controls['duration'].value != null && this.form.controls['duration'].value != null &&
this.form.controls['duration'].value > 0 this.form.controls['duration'].value > 0

View file

@ -33,12 +33,12 @@ export class DatePipe implements PipeTransform {
pure: true, pure: true,
}) })
export class TalkerPipe implements PipeTransform { export class TalkerPipe implements PipeTransform {
transform(call: CallRecord, args?: any): string { transform(call: CallRecord, args?: any): string | null {
if (call.talkerAlias != null) { if (call.talkerAlias != null) {
return call.talkerAlias; return call.talkerAlias;
} }
return '&mdash;'; return null;
} }
} }
@ -175,6 +175,7 @@ export interface CallsListParams {
page: number; page: number;
perPage: number; perPage: number;
tgFilter: string | null; tgFilter: string | null;
sourceFilter: string | null;
atLeastSeconds: number | null; atLeastSeconds: number | null;
} }

View file

@ -102,6 +102,18 @@
{{ call | talkgroup: "alpha" | async }} {{ call | talkgroup: "alpha" | async }}
</td> </td>
</ng-container> </ng-container>
<ng-container matColumnDef="talker">
<th mat-header-cell *matHeaderCellDef>Source</th>
<td mat-cell *matCellDef="let call">
@let tlkAlias = call | talker;
@if (tlkAlias) {
{{ tlkAlias }}
} @else {
&mdash;
}
</td>
</ng-container>
<ng-container matColumnDef="duration"> <ng-container matColumnDef="duration">
<th mat-header-cell *matHeaderCellDef class="durationHdr">Duration</th> <th mat-header-cell *matHeaderCellDef class="durationHdr">Duration</th>
<td mat-cell *matCellDef="let call" class="duration"> <td mat-cell *matCellDef="let call" class="duration">

View file

@ -35,6 +35,7 @@ import {
TimePipe, TimePipe,
DatePipe, DatePipe,
DownloadURLPipe, DownloadURLPipe,
TalkerPipe,
} from '../../calls/calls.service'; } from '../../calls/calls.service';
import { CallPlayerComponent } from '../../calls/player/call-player/call-player.component'; import { CallPlayerComponent } from '../../calls/player/call-player/call-player.component';
import { FmtDatePipe } from '../incidents.component'; import { FmtDatePipe } from '../incidents.component';
@ -141,6 +142,7 @@ export class IncidentEditDialogComponent {
MatIconModule, MatIconModule,
MatCardModule, MatCardModule,
FixedPointPipe, FixedPointPipe,
TalkerPipe,
TimePipe, TimePipe,
DatePipe, DatePipe,
TalkgroupPipe, TalkgroupPipe,
@ -169,6 +171,7 @@ export class IncidentComponent {
'system', 'system',
'group', 'group',
'talkgroup', 'talkgroup',
'talker',
'duration', 'duration',
]; ];
callsResult = new MatTableDataSource<IncidentCall>(); callsResult = new MatTableDataSource<IncidentCall>();