Skip to content

Feature/interface signaller UI #1076

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 143 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
143 commits
Select commit Hold shift + click to select a range
96eb4bd
Add signaller modal
lukasrad02 Jun 13, 2023
9cfabf9
WIP
lukasrad02 Jun 14, 2023
0b7d2ec
Add working layer system
lukasrad02 Jun 14, 2023
bd68667
Detect hotkey collisions case insensitively
lukasrad02 Jun 15, 2023
b9ad151
Add hotkey indicator
lukasrad02 Jun 15, 2023
c4fa656
Add hotkey indicator to shared module
lukasrad02 Jun 15, 2023
032bf98
Use replay subject to detect state in indicator
lukasrad02 Jun 15, 2023
b89dd6b
Implement region selection
lukasrad02 Jun 15, 2023
a818017
Scroll to selected region
lukasrad02 Jun 15, 2023
e41e6fe
Allow removing hotkeys by hotkey instance
lukasrad02 Jun 15, 2023
358fb3b
Add hotkey for radiograms and auto-select region
lukasrad02 Jun 15, 2023
4f5652d
Add component for region overview
lukasrad02 Jun 15, 2023
5340c9c
Reset selected region when it is deleted
lukasrad02 Jun 16, 2023
0148616
Show current leader
lukasrad02 Jun 16, 2023
db0b501
Use hotkeys service in searchable dropdown
lukasrad02 Jun 16, 2023
a4fa149
Show info+command columns or warning without leader
lukasrad02 Jun 16, 2023
c8d1365
Size columns evenly
lukasrad02 Jun 16, 2023
c88a821
WIP: Allow requesting information
lukasrad02 Jun 16, 2023
c84495b
Run prettier
lukasrad02 Jun 22, 2023
7217295
Add keys to radiograms
lukasrad02 Jun 22, 2023
d0a7879
Add UI to query information
lukasrad02 Jun 22, 2023
fc4d700
Add personnel count to requestable information
lukasrad02 Jun 22, 2023
79071b5
Add transfer connections to requestable information
lukasrad02 Jun 22, 2023
e88cdb3
Remove unnecessary initializers and assertions
lukasrad02 Jun 22, 2023
c01bf64
Add required resources to requestable information
lukasrad02 Jun 22, 2023
d9598ad
Show 0 for not required resources
lukasrad02 Jun 26, 2023
02977e0
Remove finished todo comment
lukasrad02 Jun 26, 2023
063e51c
Refactor information requests
lukasrad02 Jun 26, 2023
20048f0
Fix some details after the refactoring
lukasrad02 Jun 26, 2023
54fb005
Remove comma after interaction name
lukasrad02 Jun 26, 2023
8e4c4fe
Implement secondary option and adjustable labels
lukasrad02 Jun 26, 2023
c1582a7
Replace hotkey library
lukasrad02 Jun 26, 2023
42cf05c
Use callback from hotkey
lukasrad02 Jun 26, 2023
28f6fc6
WIP
lukasrad02 Jun 26, 2023
d488a04
Allow configuration of recurring reports
lukasrad02 Jun 27, 2023
bb7b211
Add component fpr editing of event based reports
lukasrad02 Jun 27, 2023
fb8f7bc
Configure event based reports with hotkeys
lukasrad02 Jun 28, 2023
e4408a8
Make details modal reusable
lukasrad02 Jun 28, 2023
f7af3e5
Remove obsolete code
lukasrad02 Jun 28, 2023
dc57330
Allow configuration of all recurring reports
lukasrad02 Jun 28, 2023
faca4f3
Make transfer connections editable
lukasrad02 Jun 28, 2023
f20694b
Allow `+` as hotkey
lukasrad02 Jun 28, 2023
9e9f56c
Remove hotkey layers on destroy
lukasrad02 Jun 28, 2023
f58d542
Ensure details modal can be closed with escape
lukasrad02 Jun 28, 2023
bfe9db4
Prevent using hotkeys as text input
lukasrad02 Jun 28, 2023
ec9beda
Display shift key as up arrow
lukasrad02 Jun 28, 2023
ba262cc
Add keyboard navigation for transfer connections
lukasrad02 Jun 28, 2023
a26902f
Run prettier
lukasrad02 Jun 28, 2023
85602b1
Fix cypress test
lukasrad02 Jun 28, 2023
ebb623f
Add virtual region for EOC
lukasrad02 Jun 28, 2023
e2385bb
Create subfolder for details modal
lukasrad02 Jun 28, 2023
78d1a14
Fix tab index in details modal
lukasrad02 Jun 29, 2023
998d8aa
Allow configuration of wich trays to transport
lukasrad02 Jun 29, 2023
ff1ea66
Fix tab index in transfer point editor
lukasrad02 Jun 29, 2023
2afc8b6
Add patient status dropdown
lukasrad02 Jun 29, 2023
c61afe4
Add tab index
lukasrad02 Jun 29, 2023
e4e1ec5
Prevent submission of outer forms
lukasrad02 Jun 29, 2023
f86fb82
Add patient status dropdown to module
lukasrad02 Jun 29, 2023
667e8f1
Allow starting transport with maximum category
lukasrad02 Jun 29, 2023
8e450ed
Emit selected option instead of identifier
lukasrad02 Jun 30, 2023
c17e5e7
Add modal to send vehicles
lukasrad02 Jun 30, 2023
b34f2af
Remove todo
lukasrad02 Jun 30, 2023
1e87d02
Add modal to configure request target
lukasrad02 Jun 30, 2023
a14ba07
Some small fixes to provide vehicles editor
lukasrad02 Jun 30, 2023
dda45b7
Swap letters and digits for hotkeys
lukasrad02 Jul 2, 2023
502f302
Rename identifier property to key
lukasrad02 Jul 2, 2023
276dde4
Unify dropdown options and signaller interactions
lukasrad02 Jul 2, 2023
955d080
Remove obsolete code
lukasrad02 Jul 2, 2023
3989ed6
Change way inactive hotkeys are hidden
lukasrad02 Jul 3, 2023
ab56963
Implement interaction filter
lukasrad02 Jul 3, 2023
d21c9b0
Enable filter for information interactions
lukasrad02 Jul 3, 2023
ad2423f
Enable filter for command interactions
lukasrad02 Jul 3, 2023
3a39c39
Improve explanation for editTransferConnections
lukasrad02 Jul 4, 2023
be14e33
Wording: Improve missing transfer connection
lukasrad02 Jul 5, 2023
5d80e50
Wording: use other word for location
lukasrad02 Jul 5, 2023
96636fc
Wording: Disambiguation between staging/providing
lukasrad02 Jul 5, 2023
933e053
Wording: name treatment progress consistently
lukasrad02 Jul 5, 2023
85ed4d1
Wording: transfer progress in managed regions
lukasrad02 Jul 5, 2023
2f5a47c
Improve connection editor
lukasrad02 Jul 5, 2023
e45e8f4
Only embed radiograms of the current region
lukasrad02 Jul 5, 2023
232a4d8
Add regions overview tab
lukasrad02 Jul 5, 2023
9beb6c3
Show table of all radions and their leaders
lukasrad02 Jul 5, 2023
68c61bc
Indicate loading and success state of commands
lukasrad02 Jul 7, 2023
6ff522b
Store whether alarm groups have been sent
lukasrad02 Jul 10, 2023
5531751
Reorganize HTML templates
lukasrad02 Jul 10, 2023
5ea6344
Allow sending alarm groups from eoc tab
lukasrad02 Jul 10, 2023
55d73ab
Hide accept/deny buttons until radiogram is accepted
lukasrad02 Jul 10, 2023
7c2bcf5
Highlight total number of patients in radiogram
lukasrad02 Jul 10, 2023
9d85a96
Disable hotkeys when component is removed
lukasrad02 Jul 10, 2023
91357e5
Disable all lower hotkeys in details modal
lukasrad02 Jul 10, 2023
fc42632
Provide vehicles by type instead of specific ones
lukasrad02 Jul 10, 2023
c839b51
Disable alarm group selection if there are no groups
lukasrad02 Jul 10, 2023
59db04f
Update details modal hotkey description
lukasrad02 Jul 10, 2023
ebd492f
Add information requests to the EOC
lukasrad02 Jul 12, 2023
5213bee
Send alarm groups from EOC tab in signaller modal
lukasrad02 Jul 12, 2023
c8468b7
Remove finished todos
lukasrad02 Jul 12, 2023
04bb0ab
Blur unread radiograms
lukasrad02 Jul 12, 2023
703a885
Add return button to radiograms
lukasrad02 Jul 12, 2023
4e27cfe
Add vehicle occupations as reportable information
lukasrad02 Jul 12, 2023
0097993
Fix typos in some radiogram components
lukasrad02 Jul 12, 2023
521613a
Increase blur radius of unread radiograms
lukasrad02 Jul 12, 2023
4a0f5a3
Fix broken backend test
lukasrad02 Jul 12, 2023
a14b075
Fix alarm group cypress tests
lukasrad02 Jul 12, 2023
0278083
Improve command description
lukasrad02 Jul 13, 2023
fefd123
Fix transport editor modal title
lukasrad02 Jul 13, 2023
5f0907c
Fix hotkey collision
lukasrad02 Jul 13, 2023
15dace3
Fix region selector on small screens
lukasrad02 Jul 17, 2023
e5ce102
Adapt to dependency updates
lukasrad02 May 19, 2025
bbdc384
Fix some linter warnings, run prettier
lukasrad02 May 19, 2025
09c30c3
Adapt to changed send alarm group action
lukasrad02 May 20, 2025
f7847d6
Add migration
lukasrad02 May 20, 2025
0b2a0d4
Handle empty resource requests correctly
lukasrad02 May 20, 2025
4099e1f
Remove unused reference, correctly handle hotkeys
lukasrad02 May 22, 2025
b37f263
Improve error and success messages
lukasrad02 May 28, 2025
bd6a3c9
Extract magic number to constant
lukasrad02 May 31, 2025
0ed0f60
Remove unnecessary condition
lukasrad02 May 31, 2025
a347472
Make error message actually indicate an error
lukasrad02 May 31, 2025
b0e7e7a
Fix typo
lukasrad02 Jun 2, 2025
42b6d02
Use ngbTooltip instead of title
lukasrad02 Jun 2, 2025
ac0f9e2
Add missing hotkey
lukasrad02 Jun 2, 2025
343695f
Adhere to naming convention
lukasrad02 Jun 2, 2025
de38327
Consistent variable naming
lukasrad02 Jun 2, 2025
725d48a
Remove all hotkey layers on destroy
lukasrad02 Jun 2, 2025
f6ea4ad
Fix NG0100 in hotkey indicator
lukasrad02 Jun 12, 2025
7163fdc
Add missing autoClose attribute
lukasrad02 Jun 12, 2025
97dcc6a
Remove unused import, fix TS error
lukasrad02 Jul 2, 2025
3c49bd8
Remove hotkey, restore previous layout
lukasrad02 Jul 3, 2025
c439f7f
Allo use of tabindex attribute
lukasrad02 Jul 4, 2025
2623a06
Distinguish keys on radiograms
lukasrad02 Jul 4, 2025
fbd0e58
Merge branch 'dev' into feature/interface-signaller-ui
lukasrad02 Jul 4, 2025
104c9c8
Add IFS UI to changelog
lukasrad02 Jul 9, 2025
8375922
Fix typo in changelog
lukasrad02 Jul 15, 2025
255fcd5
Fix type assertion
lukasrad02 Jul 15, 2025
9b8e6cd
Hide hotkeys in details modal if they're not used
lukasrad02 Jul 15, 2025
24d684f
Add unit to interval variables
lukasrad02 Jul 15, 2025
7639167
Add padding after label
lukasrad02 Jul 15, 2025
544ddec
Add type constraint
lukasrad02 Jul 15, 2025
ada2e29
Correctly handle errors from both actions
lukasrad02 Jul 15, 2025
69ceb28
Use more appropriate, domain-specific wording
lukasrad02 Jul 15, 2025
76f8912
Make hotkey callback parameters optional
lukasrad02 Jul 15, 2025
1d63b5c
Simplify and explain condition
lukasrad02 Jul 15, 2025
9b6fa4d
Support multiple, whitespace-separated filters
lukasrad02 Jul 16, 2025
2e497a8
Remove todo (moved to #1093)
lukasrad02 Jul 16, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .eslint/angular-template.eslintrc.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,5 @@ module.exports = {
'@angular-eslint/template/no-autofocus': 'off',
'@angular-eslint/template/no-call-expression': ['error'],
'@angular-eslint/template/no-negated-async': 'warn',
'@angular-eslint/template/no-positive-tabindex': 'warn',
},
};
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ and this project does **not** adhere to [Semantic Versioning](https://semver.org
- In the patient popup, there is a now a tab with a QR Code of the patient identifier. It is also
possible to set custom QR code contents for each patient to support complexer systems.
- Berliner Feuerwehr is now mentioned as member of the project consortium.
- There is a dedicated view for "interface signallers" to participate in an exercise with simulated regions. Interface signallers can request information from simulated regions on behalf of the incident command and forward instructions back to the simulated regions.

### Fixed

Expand Down
1 change: 1 addition & 0 deletions backend/src/fuesim-server.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ describe('Exercise saving', () => {
id: uuid(),
type: 'alarmGroup',
name: 'Alarm Group',
sent: false,
},
},
null
Expand Down
16 changes: 9 additions & 7 deletions frontend/cypress/e2e/exercise.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -246,8 +246,14 @@ describe('A trainer on the exercise page', () => {
cy.dragToMap('[data-cy=draggableTransferPointDiv]');
cy.get('[data-cy=trainerToolbarExecutionButton]').click();
cy.get('[data-cy=trainerToolbarControlCenterButton]').click();
cy.get('[data-cy=sendAlarmGroupChooseAlarmGroupButton]')
.first()
.click();
cy.get('[data-cy=searchableDropdownOptionButton] > :nth-child(1)')
.first()
.click();
cy.get('[data-cy=sendAlarmGroupChooseTargetButton]').first().click();
cy.get('[data-cy=sendAlarmGroupChooseTargetSelect] > :nth-child(1)')
cy.get('[data-cy=searchableDropdownOptionButton] > :nth-child(1)')
.first()
.click();
cy.get('[data-cy=sendAlarmGroupSendButton]').click();
Expand Down Expand Up @@ -474,9 +480,7 @@ describe('A trainer on the exercise page', () => {
cy.get(
'[data-cy=transferPointPopupAddOtherTransferPointButton]'
).click();
cy.get(
'[data-cy=transferPointPopupAddOtherTransferPointDropdownButton]'
)
cy.get('[data-cy=searchableDropdownOptionButton]')
.first()
.click({ force: true });

Expand Down Expand Up @@ -519,9 +523,7 @@ describe('A trainer on the exercise page', () => {
cy.get(
'[data-cy=transferPointPopupAddOtherTransferPointButton]'
).click();
cy.get(
'[data-cy=transferPointPopupAddOtherTransferPointDropdownButton]'
)
cy.get('[data-cy=searchableDropdownOptionButton]')
.first()
.click({ force: true });
cy.get('[data-cy=transferPointPopupDurationInput]')
Expand Down
7 changes: 7 additions & 0 deletions frontend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
"chart.js": "^4.4.8",
"class-validator": "^0.14.1",
"digital-fuesim-manv-shared": "file:../shared",
"hotkeys-js": "^3.10.3",
"immer": "^10.1.1",
"lodash-es": "4.17.21",
"ng-qrcode": "^19.0.1",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,17 @@ <h4 class="modal-title">Leitstelle</h4>
></button>
</div>
<div class="modal-body" style="min-height: 60vh">
<app-send-alarm-group-interface></app-send-alarm-group-interface>
<div class="card">
<h5 class="card-header">Alarmieren</h5>
<div class="card-body">
<app-send-alarm-group-interface />
</div>
</div>
<br />
<app-eoc-log-interface></app-eoc-log-interface>
<div class="card">
<h5 class="card-header">Einsatztagebuch</h5>
<div class="card-body">
<app-eoc-log-interface />
</div>
</div>
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,12 @@ import {
import { SharedModule } from 'src/app/shared/shared.module';
import { FormsModule } from '@angular/forms';
import { EmergencyOperationsCenterModalComponent } from './emergency-operations-center-modal/emergency-operations-center-modal.component';
import { SendAlarmGroupInterfaceComponent } from './send-alarm-group-interface/send-alarm-group-interface.component';
import { EocLogInterfaceComponent } from './eoc-log-interface/eoc-log-interface.component';
import { TransferTargetDropdownComponent } from './transfer-target-dropdown/transfer-target-dropdown.component';

@NgModule({
declarations: [
EmergencyOperationsCenterModalComponent,
SendAlarmGroupInterfaceComponent,
EocLogInterfaceComponent,
TransferTargetDropdownComponent,
],
imports: [
CommonModule,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,54 +1,47 @@
<div class="card">
<h5 class="card-header">Einsatztagebuch</h5>

<div class="p-3 border-bottom">
<textarea
[(ngModel)]="newLogEntry"
[appAutofocus]="true"
maxlength="65535"
placeholder="Schreiben Sie den neuen Eintrag in dieses Feld..."
class="form-control no-validation mb-3"
></textarea>
<button
type="button"
class="btn btn-primary w-100"
[disabled]="newLogEntry === ''"
(click)="addEocLogEntry()"
>
Eintrag speichern
</button>
<div class="p-3 border-bottom">
<textarea
[(ngModel)]="newLogEntry"
[appAutofocus]="true"
maxlength="65535"
placeholder="Schreiben Sie den neuen Eintrag in dieses Feld..."
class="form-control no-validation mb-3"
></textarea>
<button
type="button"
class="btn btn-primary w-100"
[disabled]="newLogEntry === ''"
(click)="addEocLogEntry()"
>
Eintrag speichern
</button>
</div>
<ng-container *ngIf="eocLogEntries$ | async as eocLogEntries">
<div *ngIf="eocLogEntries.length === 0" class="text-muted p-3">
Es sind noch keine Einträge vorhanden.
</div>
<ng-container *ngIf="eocLogEntries$ | async as eocLogEntries">
<div *ngIf="eocLogEntries.length === 0" class="text-muted p-3">
Es sind noch keine Einträge vorhanden.
</div>

<ul
*ngIf="eocLogEntries.length > 0"
style="max-height: 50vh; overflow: auto"
class="list-group list-group-flush"
>
<li
*ngFor="let eocLogEntry of eocLogEntries"
class="list-group-item"
>
<div class="row">
<div class="col-2">
<span class="fw-bold">
{{ eocLogEntry.exerciseTimestamp | formatDuration }}
</span>
<br />
von
<span class="font-monospace">
{{ eocLogEntry.clientName }}
</span>
</div>
<ul
*ngIf="eocLogEntries.length > 0"
style="max-height: 50vh; overflow: auto"
class="list-group list-group-flush"
>
<li *ngFor="let eocLogEntry of eocLogEntries" class="list-group-item">
<div class="row">
<div class="col-2">
<span class="fw-bold">
{{ eocLogEntry.exerciseTimestamp | formatDuration }}
</span>
<br />
von
<span class="font-monospace">
{{ eocLogEntry.clientName }}
</span>
</div>

<div class="col" style="white-space: pre-wrap">
{{ eocLogEntry.message }}
</div>
<div class="col" style="white-space: pre-wrap">
{{ eocLogEntry.message }}
</div>
</li>
</ul>
</ng-container>
</div>
</div>
</li>
</ul>
</ng-container>

This file was deleted.

Loading
Loading