Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
Binary file modified docs/lad/images/radio-log-dialog.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/lad/images/radio-log-status-change.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/lad/images/radio-log-task-team.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion docs/lad/incident-register.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ Each team in the expanded incident's taskings list has the same four actions as

![Incident tasking action buttons](images/incident-tasking-actions.png)

- **Radio Log** (against the incident): opens [New Radio Log](logs-and-messages.md#new-radio-log), logged against the incident and including the team's callsign.
- **Radio Log** (against the incident): opens [New Radio Log](logs-and-messages.md#new-radio-log) with the incident and team filled in. You can also [change the team's status](logs-and-messages.md#changing-the-teams-status) when you submit.
- **Message Team** (against the incident): opens [Send SMS](logs-and-messages.md#send-sms) with the team members as recipients, associated with the incident.
- **Open in Remote Tab**: opens the team in the Beacon remote tab.
- **Focus on map**: focuses the Situation Map on the team's radio location, if matched.
Expand Down
46 changes: 42 additions & 4 deletions docs/lad/logs-and-messages.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,55 @@ LAD can create radio logs and ops log entries, and send SMS to team members, wit

## New Radio Log

Clicking a **Radio Log** button opens the New Radio Log dialog. The title shows the team's callsign, plus the incident ID if opened against an incident.
Clicking a **Radio Log** button opens the New Radio Log dialog. It is the same dialog as [New Ops Log](#new-ops-log), with the *Radio* contact method already selected. The title shows the team's callsign, plus the incident ID if opened against an incident.

- Clicking Radio Log against a **team on an incident** creates the log against that incident.
- Clicking Radio Log against the **team** itself does not associate it with an incident.
- Clicking Radio Log on a **tasking** (a team on an incident) fills in the **Incident** and **Team** fields, and the subject is the team's callsign. The log is created against that incident, and you can [change the team's status](#changing-the-teams-status) at the same time.
- Clicking Radio Log on a **team** fills in the **Team** field and the subject, but does not associate the log with an incident. If you pick an incident that the team is tasked to, you can change the team's status too.
- Clicking Radio Log in the [register controls](interface.md#register-controls) opens the dialog with nothing filled in.

![New Radio Log dialog](images/radio-log-dialog.png)

Clicking **Submit** creates a new ops log entry. The subject is the team's Beacon name followed by your message, and the entry has the *Radio* tag applied. If created against an incident, it is visible in that incident's *Notes* / *Ops Log Entries*.
Add any other tags you need, enter your message in **Text**, then click **Submit**. The entry is created with the tags you selected. If created against an incident, it is visible in that incident's *Notes* / *Ops Log Entries*.

![Resulting radio log entry](images/radio-log-entry.png)

The Spotlight [`radio`](spotlight.md#radio-log-command--radio) command opens the same dialog with the incident and team filled in, the same as clicking Radio Log on a tasking.

### Changing the Team's Status

When the **Incident** and **Team** fields point at a team that is tasked to that incident, the bottom of the dialog shows the team's current status for that incident, followed by **update to** and a status menu. This happens straight away when the dialog is opened from a tasking. It also happens when you fill the fields in yourself, for example after opening it from a team row or the register controls, and in the New Ops Log dialog:

- **Incident**: pick the incident from the suggestions. Typing the ID without picking it doesn't attach the log to the incident, so the status menu doesn't appear.
- **Team**: type the team's callsign, or pick a trackable asset that is matched to the team.

The menu starts at **No change** and lists the same statuses as [Tasking Status](tasking.md#tasking-status). Statuses the team can't change to from its current status are greyed out.

![Status change in New Radio Log](images/radio-log-status-change.png)

- Picking a status does not change anything straight away. The change is made when you click **Submit**, and the button shows the status, for example **Submit & On site**.
- If the status needs more information (a time, ETA, ETC or reason), a **Status change** box appears at the bottom of the dialog, and the dialog scrolls down to it. It works the same way as in the tasking status dropdown.
- **Complete** opens Beacon's *Team Completion* dialog in the remote tab after the log entry is saved.
- If you change the **Incident** or **Team** field, the status menu follows: it switches to that team's tasking on that incident, or is hidden if there isn't one. Any status you'd picked is cleared.

When you click **Submit**, LAD changes the status first and only saves the log entry if that worked:

- If the status change fails, the dialog shows why and stays open. Nothing is logged, so you can fix it or pick **No change** and submit again.
- If the team's status changed while the dialog was open (for example, someone else set it in Beacon) and the status you picked is no longer available, the dialog says so and nothing is submitted.
- If the status changes but the log entry fails to save, the dialog tells you. Submitting again only retries the log entry; the status is not sent twice.

### Tasking the Team from a Log

If the **Incident** and **Team** fields point at a team that isn't tasked to that incident (or whose tasking there is complete, called off or removed), the bottom of the dialog says so and offers two buttons instead of the status menu:

![Task Team in New Radio Log](images/radio-log-task-team.png)

- **Task Team**: tasks the team to the incident when you click **Submit**.
- **Task Team & SMS**: tasks the team when you click **Submit**, then opens [Send SMS](#send-sms) addressed to the team, pre-filled with the incident details, once the dialog has closed. This is the same message as [Instant Task](tasking.md#tasking-the-team)'s **Task & SMS Details**.

Click a button again to unselect it. Nothing happens until you click **Submit**, and the button shows what will happen, for example **Submit, Task Team & SMS**. The team must be a known team: type its callsign or pick one of its trackable assets.

As with a status change, LAD tasks the team first and only saves the log entry if that worked. If tasking fails, the dialog shows why and nothing is logged. If the team is tasked but the log entry fails to save, submitting again only retries the log entry and doesn't task the team twice, and Send SMS still opens once it saves. If someone else tasks the team to the incident while the dialog is open, the dialog says so and the status menu is shown instead.

## New Ops Log

Clicking an **Ops Log** button opens the New Ops Log dialog. It works the same way as Beacon notes: select tags, enter a subject and text. If opened from an incident it is automatically attached to that incident. You can also enter a team to pre-fill the subject with the team's name.
Expand Down
2 changes: 1 addition & 1 deletion docs/lad/spotlight.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ Creates a radio log against a team on an incident. Works the same way as `task`:

![Team and incident matched](images/spotlight-radio-3.png)

4. Press <kbd>Enter</kbd> to open the [New Radio Log](logs-and-messages.md#new-radio-log) dialog.
4. Press <kbd>Enter</kbd> to open the [New Radio Log](logs-and-messages.md#new-radio-log) dialog with the incident and team filled in. If the team is tasked to the incident you can [change its status](logs-and-messages.md#changing-the-teams-status); if not, you can [task it](logs-and-messages.md#tasking-the-team-from-a-log).

### Ops Log command — `log`

Expand Down
5 changes: 4 additions & 1 deletion docs/lad/tasking.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@ nav_order: 8

# Tasking Teams

There are three ways to task a team to an incident in LAD:
There are four ways to task a team to an incident in LAD:

- **Instant Task**: click **Task** on an incident in the [Incident Register](incident-register.md#incident-actions), or **Task Team** in its [map popup](situation-map.md#incident-popup-actions).
- **Drag & drop**: drag an incident onto a team in the Team Register.
- **Spotlight**: type `task`, then a team and an incident. See [Task Team command](spotlight.md#task-team-command--task).
- **From a radio or ops log**: fill in the log's **Incident** and **Team**, then choose **Task Team** or **Task Team & SMS**. The team is tasked when you submit the log. See [Tasking the Team from a Log](logs-and-messages.md#tasking-the-team-from-a-log).

Once tasked, the tasking shows under the team in the [Team Register](team-register.md#team-taskings) and under the incident in the [Incident Register](incident-register.md#incident-taskings-actions), where you can [update its status](#tasking-status).

Expand Down Expand Up @@ -67,4 +68,6 @@ Each tasking shows its status, in both registers and in the incident's map popup

![Tasking status dropdown](images/tasking-status.png)

You can also change a tasking's status while logging a radio message: click the tasking's **Radio Log** button and pick the new status at the bottom of the dialog. See [Changing the Team's Status](logs-and-messages.md#changing-the-teams-status).

To change the order of a team's taskings, see [Reordering Taskings](team-register.md#reordering-taskings).
4 changes: 2 additions & 2 deletions docs/lad/team-register.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ Every team row has four action buttons, whether or not the team is expanded:

![Team row action buttons](images/team-row-actions.png)

- **Radio Log**: opens [New Radio Log](logs-and-messages.md#new-radio-log) against the team.
- **Radio Log**: opens [New Radio Log](logs-and-messages.md#new-radio-log) with the team filled in. The log isn't attached to an incident.
- **Message Team**: opens [Send SMS](logs-and-messages.md#send-sms) with the team members as recipients. Greyed out if the team has no members.
- **Open in Remote Tab**: opens the team's edit page in the Beacon [remote tab](getting-started.md#remote-beacon-tab), e.g. to change the team's name or members.
- **Focus on map**: focuses the Situation Map on the team's radio location. Greyed out if no radios are matched.
Expand Down Expand Up @@ -114,7 +114,7 @@ Click **Refresh** to reload the team's tasking details.

Each tasking in the list has four actions:

- **Radio Log** (against the incident): opens [New Radio Log](logs-and-messages.md#new-radio-log), logged against the incident and including the team's callsign.
- **Radio Log** (against the incident): opens [New Radio Log](logs-and-messages.md#new-radio-log) with the incident and team filled in. You can also [change the team's status](logs-and-messages.md#changing-the-teams-status) when you submit.
- **Message Team** (against the incident): opens [Send SMS](logs-and-messages.md#send-sms) with the team members as recipients, associated with the incident.
- **Open Incident in Remote Tab**: opens the incident in the Beacon remote tab.
- **Focus on map**: focuses the Situation Map on the incident if it is geocoded and within your incident filters. Greyed out if the incident is outside your filters or has no GPS location (it won't be on the map).
Expand Down
10 changes: 10 additions & 0 deletions docs/whats-new/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,16 @@ section of the LAD guide with a full https://lighthouse.ses.nsw.gov.au/guides/la
The home page shows the first three `##` entries, so keep the title short.
-->

## LAD radio logs with status changes

*15 October 2026*

- **Change a team's status from a radio log.** When a radio or ops log's **Incident** and **Team** fields point at a team tasked to that incident (straight away when you open **Radio Log** from a tasking, or once you fill them in), the bottom of the dialog shows the team's current status with an **update to** menu. The new status is only set when you click **Submit**, and the log entry is only saved if the status change worked. If it doesn't, the dialog explains why and nothing is logged. See [Changing the Team's Status](https://lighthouse.ses.nsw.gov.au/guides/lad/logs-and-messages.html#changing-the-teams-status).
- **Task a team from a radio or ops log.** If the team in the log isn't tasked to the incident, choose **Task Team** or **Task Team & SMS** at the bottom of the dialog. The team is tasked when you click **Submit**, before the log entry is saved, and **Task Team & SMS** opens Send SMS once the dialog closes. See [Tasking the Team from a Log](https://lighthouse.ses.nsw.gov.au/guides/lad/logs-and-messages.html#tasking-the-team-from-a-log).
- **Radio Log on teams and taskings, and the Spotlight `radio` command, open the full dialog.** It now uses the same dialog as New Ops Log, with the *Radio* tag already selected, so you can add other tags. The incident, team and subject are filled in for you. See [New Radio Log](https://lighthouse.ses.nsw.gov.au/guides/lad/logs-and-messages.html#new-radio-log).
- If a log entry fails to save, the **Submit** button no longer stays stuck on *Submitting…*.
- In dark mode, selected tags in the New Ops Log and New Radio Log dialogs are readable.

## LAD map and dark mode fixes

*15 October 2026 · [v2026.10.15](https://github.com/NSWSESMembers/Lighthouse/releases/tag/v2026.10.15)*
Expand Down
60 changes: 60 additions & 0 deletions scripts/lad-docs/capture.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,22 @@ async function openPhotos(page) {
await settle(page, 1200);
}

/**
* Open New Radio Log from the Radio Log button on DEM01's tasking under
* 2610-1207 (70006), so the incident, team and status change are all filled.
*/
async function openTaskingRadioLog(page) {
await closeConfigAndLoad(page);
const row = page.locator('tr.job-row[data-job-id="70006"]');
await row.scrollIntoViewIfNeeded();
await row.locator('[data-bind*="toggleAndExpand"]').first().click();
await settle(page, 800);
await row.locator('button[title="Radio Log"]:visible').first().click();
await page.locator('#CreateOpsLogModal').waitFor({ state: 'visible' });
await page.locator('#OpsLogTextInput').fill('Team arrived on scene, starting roof assessment.');
await settle(page, 600);
}

/** Open the Trackable Asset Library from the config modal's rail link (saves + loads, then opens it). */
async function openAssetLibrary(page) {
await page.locator('#configModal button:has-text("Trackable Asset Library")').click();
Expand Down Expand Up @@ -387,6 +403,50 @@ const SHOTS = {
}),
},

// New Radio Log opened from a tasking: Radio tag selected, incident and
// team filled, current status + "update to" in the footer.
'radio-log-dialog': {
launch: { viewport: { width: 1400, height: 1000 } },
run: openTaskingRadioLog,
target: (page) => page.locator('#CreateOpsLogModal .modal-content'),
},

// ...with On site picked: the status change details and the footer.
'radio-log-status-change': {
launch: { viewport: { width: 1400, height: 1000 } },
run: async (page) => {
await openTaskingRadioLog(page);
await page.locator('#CreateOpsLogModal .modal-footer .dropup .dropdown-toggle').click();
await page.locator('#CreateOpsLogModal .modal-footer .dropdown-item:has-text("On site")').click();
await page.locator('#CreateOpsLogModal .ops-log-status-details button:has-text("+30")').click();
// don't capture the +30 button in its hover/focus state
await page.mouse.move(0, 0);
await page.evaluate(() => document.activeElement?.blur());
await settle(page, 800);
},
target: (page) => unionOf(page, '#CreateOpsLogModal .ops-log-status-details, #CreateOpsLogModal .modal-footer', 0),
},

// Blank New Radio Log pointed at a team that isn't tasked to the incident
// (DEM02 on 2610-1207): the Task Team / Task Team & SMS choice in the footer.
'radio-log-task-team': {
launch: { viewport: { width: 1400, height: 1000 } },
run: async (page) => {
await closeConfigAndLoad(page);
await page.locator('#paneTop button[title="Radio Log"]:visible').first().click();
await page.locator('#CreateOpsLogModal').waitFor({ state: 'visible' });
await settle(page, 600); // the dialog focuses Text once shown
await page.locator('#CreateOpsLogModal input[placeholder^="Search by incident"]').fill('2610-1207');
await page.locator('#CreateOpsLogModal ul[data-ops-log-dropdown="job"] button').first().dispatchEvent('mousedown');
await page.locator('#CreateOpsLogModal input[placeholder^="Search by team"]').fill('DEM02');
await page.locator('#OpsLogTextInput').fill('DEM02 available, tasking to this incident.');
await page.locator('#CreateOpsLogModal .modal-footer button:has-text("Task Team & SMS")').click();
await page.mouse.move(0, 0);
await settle(page, 600);
},
target: (page) => page.locator('#CreateOpsLogModal .modal-footer'),
},

spotlight: {
run: async (page) => {
await closeConfigAndLoad(page);
Expand Down
19 changes: 17 additions & 2 deletions scripts/lad-docs/mockBeacon.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,24 @@ export function createMockRouter(scenario, { log = () => {}, photoImages = null
const method = route.request().method();
let m;

// Task a team (JSON {TeamIds, JobIds}) -- creates the tasking, and returns
// the created rows as Beacon does (LAD treats an empty result as failure).
if (method === 'POST' && p === '/Api/v1/Tasking') {
const body = route.request().postDataJSON() || {};
const rows = (body.TeamIds || []).flatMap((teamId) => (body.JobIds || []).map((jobId) => scenario.createTasking(teamId, jobId))).filter(Boolean);
log(`[mock] POST ${p} -> ${rows.length} tasking(s) created`);
return json(route, rows);
}
// Create an ops log entry (form-encoded) -- returns the created entry.
if (method === 'POST' && p === '/Api/v1/OperationsLog') {
const entry = scenario.createOpsLogEntry(new URLSearchParams(route.request().postData() || ''));
log(`[mock] POST ${p} -> ops log ${entry.Id}`);
return json(route, entry);
}

if (method !== 'GET') {
// Writes (task/untask, status changes, ops log, SMS...) succeed with
// nothing changed -- enough for click-throughs not to error.
// Other writes (untask, status changes, SMS...) succeed with nothing
// changed -- enough for click-throughs not to error.
log(`[mock] ${method} ${p} (accepted, no-op)`);
return route.fulfill({ status: 200, contentType: 'application/json', body: 'null' });
}
Expand Down
Loading
Loading