Loading…
GO CERT network notice
{{ sa.title }}
{{ sa.body }}
System messages
{{ m.actions ? 'Network visit request' : 'Network visit' }}
{{ m.title }}
{{ m.body }}
{{ pendingCount }} pending registration{{ pendingCount > 1 ? 's' : '' }} awaiting approval
Review →
📢 Announcements
No announcements.
Total Events
{{ events.length }}
Active Now
{{ activeEvents.length }}
Event Hours
{{ totalHours }}
Cred Hours
{{ minsToHours(trainingMinutes) }}
Events Attended
{{ uniqueEventsCount }}
0?'pending-users':'users')">
Members ({{ pendingCount }} pending)
{{ users.length }}
Active Events
No active events right now.
{{ ev.name }}
{{ ev.currently_present }} checked in
Upcoming
{{ ev.name }}
{{ ev.event_type_name }}
Upcoming
No events.
No check-ins found.
📅 {{ group.event_name }} — {{ group.date }}
| Member | Role | Checked In | Checked Out | Duration | |
|---|---|---|---|---|---|
{{ initials(ci.user_name) }} {{ ci.user_name }} |
{{ ci.user_roles||'—' }} | {{ fmtDatetime(ci.checked_in_at) }} | {{ ci.checked_out_at?fmtDatetime(ci.checked_out_at):'—' }} | {{ duration(ci.checked_in_at,ci.checked_out_at) }} |
|
| Member | Roles | Event | Checked In | Checked Out | Duration | |
|---|---|---|---|---|---|---|
{{ initials(ci.user_name) }} {{ ci.user_name }} |
{{ ci.user_roles||'—' }} | {{ ci.event_name||eventNameById(ci.event_id) }} | {{ fmtDatetime(ci.checked_in_at) }} | {{ ci.checked_out_at?fmtDatetime(ci.checked_out_at):'—' }} | {{ duration(ci.checked_in_at,ci.checked_out_at) }} |
|
Select an event above to view its report.
{{ eventReport.parentName || eventReport.event.name }}
Multi-Day Event Summary
Sessions
{{ eventReport.children.length }}
Total Attendees
{{ Object.keys(eventReport.memberTotals).length }}
Total Hours
{{ minsToHours(eventReport.grandTotalMins) }}
| Member | Sessions | Total Hours |
|---|---|---|
| {{ name }} | {{ mt.sessions }} | {{ minsToHours(mt.minutes) }} |
Date
{{ fmtDate(eventReport.children[eventReport.activeChildIdx].event.event_date)||'—' }}
Attendees
{{ eventReport.children[eventReport.activeChildIdx].attendees.length }}
Total Hours
{{ minsToHours(eventReport.children[eventReport.activeChildIdx].total_minutes) }}
| Member | Role | Check In | Check Out | Hours |
|---|---|---|---|---|
| {{ a.name }} | {{ a.roles||'—' }} | {{ fmtDatetime(a.first_in) }} | Still present{{ fmtDatetime(a.last_out) }} | {{ minsToHours(a.total_minutes) }} (running) |
Date
{{ fmtDate(eventReport.event.event_date) }}
Attendees
{{ eventReport.attendees.length }}
Total Hours
{{ minsToHours(eventReport.total_minutes) }}
Still Present
{{ eventReport.attendees.filter(a=>a.still_present>0).length }}
| Member | Roles | Check In | Check Out | Hours |
|---|---|---|---|---|
| {{ a.name }} | {{ a.roles||'—' }} | {{ fmtDatetime(a.first_in) }} | Still present{{ fmtDatetime(a.last_out) }} | {{ minsToHours(a.total_minutes) }} (running) |
1
Import Events
Paste or upload a CSV. Columns:
Name, Date (YYYY-MM-DD), Start Time (HH:MM), End Time (HH:MM), Location, Event Type{{ eventImportParsed.length }} events ready
| Name | Date | Time | Location | Type |
|---|---|---|---|---|
| {{ e.name }} | {{ fmtDate(e.event_date) }} | {{ e.start_time }}–{{ e.end_time }} | {{ e.location||'—' }} | {{ e.event_type||'—' }} |
Results: {{ eventImportResults.filter(r=>r.status==='imported').length }} imported, {{ eventImportResults.filter(r=>r.status==='skipped').length }} skipped, {{ eventImportResults.filter(r=>r.status==='error').length }} errors
{{ r.status==='imported'?'✓':r.status==='skipped'?'—':'✗' }}
{{ r.name }} {{ fmtDate(r.event_date) }}
ID: {{ r.id }}
{{ r.error }}
2
Import Check-ins
Columns:
Member Email (or First Last), Role, Check-in Time (YYYY-MM-DD HH:MM), Check-out Time{{ checkinImportParsed.length }} check-ins ready
| Event | Member | Role | Check-in | Check-out |
|---|---|---|---|---|
| {{ c.event_name }} | {{ c.member }} | {{ c.role||'—' }} | {{ c.checked_in_at }} | {{ c.checked_out_at||'—' }} |
Results: {{ checkinImportResults.filter(r=>r.status==='imported').length }} imported, {{ checkinImportResults.filter(r=>r.status==='error').length }} errors
{{ r.status==='imported'?'✓':'✗' }}
{{ r.member }} @ {{ r.event_name }}
{{ r.error }}
{{ approvedUsers.length }} member{{ approvedUsers.length===1?'':'s' }}
No members match.
No pending members.
{{ inactiveUsers.length }} inactive member{{ inactiveUsers.length===1?'':'s' }}
No inactive members.
{{ filteredLoginHistory.length }} entries
No login history yet.
| Member | Login Time (Eastern) | IP Address |
|---|---|---|
| {{ row.member_name }} | {{ fmtDatetime(row.logged_in_at) }} | {{ row.ip_address||'—' }} |
No credentials assigned yet.
Forms module coming soon.
ICS 309 — Communications Log
No ICS 309 logs yet.
| Incident Name | Operational Period | Radio Net | Operator | Messages | Created | |
|---|---|---|---|---|---|---|
| {{ f.incident_name||'—' }} | {{ fmtDate(f.op_period_date_from) }} {{ f.op_period_time_from ? f.op_period_time_from.slice(0,5) : '' }} – {{ fmtDate(f.op_period_date_to) }} {{ f.op_period_time_to ? f.op_period_time_to.slice(0,5) : '' }} | {{ f.radio_net||'—' }} | {{ f.operator_name||f.created_by_name||'—' }} | {{ f.entry_count }} | {{ fmtDate(f.created_at) }} |
Open logs you can continue
Logs another net control started on an event that is not finished. Open one to take over net control and carry on in the same log.
| Incident Name | Net control now | Radio Net | Messages | Last change | |
|---|---|---|---|---|---|
| {{ f.incident_name||'—' }} | {{ f.operator_name||f.created_by_name||'—' }} | {{ f.radio_net||'—' }} | {{ f.entry_count }} | {{ fmtDatetime(f.updated_at) }} |
{{ i309Form.id ? 'Edit' : 'New' }} ICS 309 — Communications Log
1. Incident Name
2. Operational Period
3. Radio Net and Operator
Net control now: {{ i309Form.operator_name || '—' }}
The log is saved, the change is added to it with this time, and the new net control continues the same log.
Net control changes
{{ c.when }} — {{ c.from }} → {{ c.to }} ({{ c.note }})
4. Communications Log
From and To list the members checked in{{ i309EventName() ? ' to ' + i309EventName() : '' }}; other names can be typed.
No members are checked in right now, so From and To are typed.
| Date | Time | From | To | Message | |
|---|---|---|---|---|---|
No messages yet. Click Add Message.
5. Prepared By
📡 Connected to an offline host
The team is working offline. This device uses the copy on the host computer, over the local network.
Your check-ins, equipment, ICS 214, Incident Action Plan and After Action Report changes are saved on the host and uploaded from there when the team is back online.
Nothing is kept on this device.
{{ gcOff.offline ? '📴' : '🌐' }}
{{ gcOff.offline ? 'Offline mode' : 'Online' }}
Working from the copy downloaded {{ gcOffWhen }}. You can check members in and out (including at the Check-In Station),
issue and edit equipment, fill in ICS 214 forms, work on Incident Action Plans and write, submit and merge After Action Reports. Other pages show the downloaded copy and can't be changed.
Going somewhere without a connection? Download first. This copies the {{ gcTeam.name || 'team' }} data you can see
to this computer and switches to offline mode. When you're back online, upload your changes.
{{ gcOffMsg }}
Share with other devices
Let phones and laptops on the same Wi-Fi (or this computer's hotspot) use this offline copy. Their changes are saved here and uploaded with yours.
Needs a download with "Also let other devices connect" ticked. Upload or leave offline mode, then download again.
Needs a download with "Also let other devices connect" ticked. Upload or leave offline mode, then download again.
{{ gcHub.error }}
Join code
{{ gcHub.code }}
On the other device, open
{{ a }}
This computer has no network address. Connect it to the Wi-Fi (or turn on its hotspot).
Phones: add mobile.html to the address.
- The browser warns that the connection is not private (the certificate is made by this computer). Choose Advanced, then Proceed.
- Sign in with your own email, and the join code as the password.
Connected:
nobody yet
{{ i ? ', ' : '' }}{{ c.name }}
Keep this window open while sharing: the other devices are answered from it. Changes made on other devices are uploaded with this computer's sign-in and marked with who made them.
Waiting to upload ({{ gcOff.pending.length }})
{{ gcOffTime(c.at) }}
{{ c.label }}
Not saved ({{ gcOff.failed.length }})
The server refused these changes, usually because the record was changed or removed by someone else while you were offline.
{{ gcOffTime(c.at) }}
{{ c.label }}
{{ c.error }}
{{ c.error }}
How it works
The download holds only this team's data, and only what you are allowed to see. It stays on this computer, under your sign-in.
Changes made offline keep the time they were made, so check-in hours are right. Each change is saved once even if the upload is interrupted and repeated.
Stay signed in while offline: signing in needs a connection.
Last upload: {{ new Date(gcOff.lastUpload).toLocaleString() }}.
You do not have permission to perform check-ins. A team admin can turn on "Can perform check-ins" in your member profile.
No events today. Members can only be scanned in to an event that is on today's date and not completed.
{{ +gcScanEvent.currently_present || 0 }} checked in now · {{ gcScanEvent.location }}
{{ !gcScanResult.ok ? '⚠️' : (gcScanResult.isIn ? '✅' : '👋') }}
{{ gcScanResult.name }}
{{ gcScanResult.isIn ? 'Checked in' : 'Checked out' }} · {{ gcScanResult.event }} · {{ gcScanResult.squad }}
{{ gcAssignMsg }}
{{ gcScanResult.msg }}
Sending...
Camera
{{ gcCamMsg || 'No hand-held scanner? Use the computer\'s camera to read members\' QR codes.' }}
This session
{{ gcScanLog.length }}
Members you scan appear here.
{{ r.at }}
{{ r.isIn ? 'In' : 'Out' }}
No links yet. Add training sites, weather, radio references and other useful links for the team.
{{ g.category }}
{{ gcCt.contacts.length ? 'No contacts match.' : 'No contacts yet. Add the people and agencies you want at hand. Choose who can see each one: only you, your whole team, or the whole GO CERT network.' }}
{{ gcFolderName }}
No documents here yet.
Files up to {{ gcMaxLabel }}: PDF, Word, Excel, PowerPoint, OpenDocument, text/CSV, images or ZIP.
A member may check in to another GO CERT team's event once both teams have approved: their own team and the team that holds the event. Approved visitors can be scanned at the other team's Check-In Station with their own QR code, or check themselves in below. The other team sees the visitor's name, phone number and call signs.
Network visits are not turned on for your team. Ask the GO CERT administrator (admin.gocert.net) to turn them on.
Events you can check in to
| {{ ev.name }} {{ ev.host_team }} · {{ fmtDate(ev.event_date) }} {{ (ev.start_time||'').slice(0,5) }}-{{ ev.end_time.slice(0,5) }} · {{ ev.location }} |
Ask to visit another team
Your team's command staff decide first, then the other team's.
Your requests
You have not asked to visit any team.
| {{ r.host_team }} {{ r.note }} |
{{ gcVisStatus(r) }} |
Members of our team asking to visit other teams
No requests.
| {{ r.member_name }} → {{ r.host_team }} {{ r.note }} |
{{ gcVisStatus(r) }} |
Members of other teams asking to visit our events
Shown once the member's own team has approved.
No requests.
| {{ r.member_name }} ({{ r.home_team }}) {{ r.note }} |
{{ r.host_status==='approved' ? 'Approved' : (r.host_status==='denied' ? 'Declined' : 'Waiting for us') }} |
Ask for a member of our team
Pick the member, then the team and Send request above. Your team's approval is given at once; the other team still decides.
What other GO CERT teams share with the network. Items appear here when the other team shares them with the whole network or with your team, and the GO CERT administrator has turned sharing on for that team. Items marked command staff only are shown only to command staff.
Your team shares: {{ gcSharingOn.join(', ') }}nothing yet (set by the GO CERT administrator)
Your team shares: {{ gcSharingOn.join(', ') }}nothing yet (set by the GO CERT administrator)
Ask for a new feature or report a bug. The GO CERT administrator sees these on admin.gocert.net and posts updates here as work is done. Your team's network administrators can all see them. Platform version: {{ gcVersion }}.
{{ nr.error }}
No requests yet.
| # | Type | Title | Status | Done in | Filed |
|---|---|---|---|---|---|
| {{ r.id }} | {{ r.kind==='bug' ? 'Bug' : 'Feature' }} | {{ r.title }} | {{ nrStatus(r.status) }} | {{ r.fixed_in_version || '' }} | {{ fmtDate(r.created_at) }} |
#{{ nr.detail.id }} · {{ nr.detail.kind==='bug' ? 'Bug report' : 'Feature request' }} · {{ nr.detail.priority }} priority · filed by {{ nr.detail.submitter_name }} on {{ fmtDate(nr.detail.created_at) }} (version {{ nr.detail.version_reported }})
{{ nr.detail.title }}
{{ nrStatus(nr.detail.status) }}
in version {{ nr.detail.fixed_in_version }}
{{ nr.detail.description }}
Updates
{{ fmtDatetime(u.created_at) }} · {{ u.author_name || 'GO CERT' }} (GO CERT administrator)
{{ nrStatus(u.status) }}
version {{ u.version }}
{{ u.note }}
No shared upcoming events from other teams.
No posts from other teams.
{{ p.title }}
{{ (p.event_date||'').slice(0,16) }} · {{ p.location }}
{{ p.body }}
Nothing shared yet.
Share our upcoming events
Events you share appear on the Network page of the teams you choose once the GO CERT administrator turns on event sharing for your team. Command-staff-only events are never shared.
No upcoming events.
Our network posts
Trainings, resources or contacts you want other teams to know about. Library links and documents are shared from their own pages.
No posts yet.
{{ gcNet.categories[p.category] || p.category }}
Private{{ gcShareSummary(p) }}
{{ p.title }}
{{ p.body }}
Which calendar does your team use?
In Google Calendar: next to the calendar, ⋮ › Settings and sharing › Integrate calendar › Secret address in iCal format. Keep it private.
Not available yet: the GO CERT administrator needs to add Google sign-in to the site.
Connected as {{ gcCal.google_email }}.
{{ gcCal.calendars_error }}
Switching calendars never deletes events. Events members checked in to always stay.
Using: {{ gcCal.mode_label }} ({{ gcCal.google_calendar_name }}).
Last sync {{ gcCal.last_sync_at }}: {{ gcCal.last_sync_message }}Not synced yet.
Leave blank to use the team name ({{ gcBrand.name }}). A name ending in "CERT" keeps the accent color on CERT.
PNG, JPG, GIF or WebP, up to 1 MB each.
Incident Action Plans
No Incident Action Plans yet. Start one for an event, or from scratch.
{{ iapHeaderName }}
{{ iapCur.status==='final' ? 'Final' : 'Draft' }}
Saving…
Unsaved changes
{{ iapSaveMsg }}
You can read this plan. Administrators and command, planning and communications staff can change it.
{{ iapSaveMsg }}
ICS {{ iapSchema.tab }} {{ iapSchema.title }}
1. Incident name {{ iapHeaderName || '—' }}
2. Operational period {{ iapHeaderPeriod || '—' }}
{{ iapSchema.about }}
Boxes with a list offer your members, squads and divisions: pick one or type your own. Blue boxes were filled in for you from the other forms; type over them to change them.
{{ iapToolMsg }}
None yet. Anything you type below is saved as the first one.
{{ sec.title }}
| {{ iapColLabel(c) }} | |
|---|---|
{{ i + 1 }}
{{ iapData[g.cols[0].labelFrom] || g.g.toUpperCase() }}
{{ c.label }}
Total {{ (sec.table.cols.find(c=>c.k===sec.table.sum)||{}).label }}: {{ iapSum(sec.table) }}
{{ hrtRangeText }}
{{ hrt.error }}
No hours recorded in this timeframe.
Total hours
{{ minsToHours(hrt.total) }}
Types
{{ hrt.rows.length }}
| Type of hours | Category | Events / items | Members | Hours | Share |
|---|---|---|---|---|---|
| {{ r.label }} | {{ hrtKindLabel(r.kind) }} | {{ r.kind==='event' ? r.events : r.items }} | {{ r.members }} | {{ minsToHours(r.minutes) }} | {{ hrt.total ? Math.round(r.minutes*100/hrt.total) : 0 }}% |
| Total | {{ minsToHours(hrt.total) }} | ||||
Event hours are dated by check-in day and include event travel time. Training and credential hours are dated by the issued date. Members counts people within each type, so rows can overlap.
After Action Reports
Write your report for an event
Everyone who took part can fill in their own report. Only you and command staff can read it.
{{ aar.cur.kind==='master' ? 'Master report' : (aar.cur.author_name || 'Report') }} · {{ aar.cur.name }}
{{ aarStatusLabel }}
Saving…Unsaved changes{{ aar.msg }}
This is {{ aar.cur.author_name }}'s report. You can read it; only they can change it.
Approved by {{ aar.cur.approved_name }} on {{ (aar.cur.approved_at||'').slice(0,10) }}. Reopen it to make changes.
Submitted. Command staff can read it and merge it into the master report. You may also make it the master report. Reopen it as a draft to change it.
Built from: {{ (aar.cur.source_names||[]).join(', ') || 'submitted reports' }}. Only command staff can see this report.
{{ aar.msg }}
1. Mission identification
2. Executive summary
Briefly summarize the incident, the team's response, key successes, and major challenges.
3. Analysis of performance
4. Lessons learned
Summarize key takeaways for future operations, communications (AAR audio logs), and safety protocols.
5. Improvement plan (corrective actions)
| Issue / area for improvement | Corrective action required (SMART goal) | Responsible party | Target date | ||
|---|---|---|---|---|---|
| {{ i + 1 }}. |
6. Signatures & approvals
Event Assignments
My assignments
You have not been assigned to a squad or role yet.
| Event | Date | Squad | Role | |
|---|---|---|---|---|
| {{ m.event_name }} | {{ fmtDate(m.event_date) }} | {{ m.team_name || '—' }} | {{ m.role_name || '—' }} |
Are you coming?
{{ crew.cur.rsvp.counts.yes }} going · {{ crew.cur.rsvp.counts.maybe }} maybe · {{ crew.cur.rsvp.counts.no }} can't
Click your answer again to clear it. Only command staff can see who answered what.
| Member | Answer |
|---|---|
| {{ r.member_name }} | {{ {yes:'Going',maybe:'Maybe',no:"Can't make it"}[r.response] }} |
Squads for this event
No squads exist yet — add them under Event Squads.
Members can only be placed on the squads chosen here. If none are chosen, any squad can be used. Taking a squad off removes members from it.
{{ crewEventSquadNames.length ? crewEventSquadNames.join(', ') : 'No squads have been chosen for this event.' }}
Event Squads
Squads you can place members on for an event, for example Alpha, Medical or Communications. Event roles are managed under Events > Event Roles.
Tagged Equipment
The print preview for {{ eqt.printed.count }} label(s) is open in another window. Once they have printed:
No equipment is tagged yet. Add the types in Logistics > Equipment Catalog, then choose "Tag new items" to give each physical item its own label.
| Tag | Item | Serial | Status | Held by | Label | ||
|---|---|---|---|---|---|---|---|
| {{ a.tag_code }} | {{ a.item_name }} {{ a.category }} |
{{ a.serial_no || '—' }} | {{ a.status }} | {{ eqtHolder(a) || '—' }} (location) | {{ a.label_printed_at ? 'Printed ' + fmtDate(a.label_printed_at) : 'Not printed' }} | ||
| Nothing matches. | |||||||
No locations yet. Add the places equipment is kept (a trailer, a vehicle, a shelf, a cabinet) and print a label for each. Scanning a location label, then equipment labels, puts the equipment there.
| Tag | Location | Items there | Label | ||
|---|---|---|---|---|---|
| {{ l.tag_code }} | {{ l.name }} {{ l.description }} |
{{ l.item_count }} | {{ l.label_printed_at ? 'Printed ' + fmtDate(l.label_printed_at) : 'Not printed' }} |
Tag type
Both hold the same tag number, so you can change this at any time and reprint. QR codes are smaller and any phone camera reads them. Bar codes read quickly with an inexpensive hand-held scanner; reading them with a camera needs a browser that supports it (Chrome on Android or Mac).
Now: {{ eqt.settings.code_type==='code128' ? 'Bar codes' : 'QR codes' }} · tags start with {{ eqt.settings.prefix }}- · next is {{ eqt.settings.prefix }}-{{ String(eqt.settings.next_seq).padStart(5,'0') }} · labels: {{ eqtStocks().find(s=>s.id===eqt.settings.label_stock).name }} · "{{ eqt.settings.label_note }}"
Admin, Command Staff and CIC can scan equipment.
{{ eqt.target.type==='member' ? '👤' : '📍' }} {{ eqt.target.name }}
Or scan the member's check-in QR code or a location label. Then scan each item.
Scan each item being returned. It goes back in stock and is taken off whoever held it.
Scan an item, a location label or a member's QR code to see what it is and what is held.
{{ eqt.result.ok ? '✅' : '⚠️' }}
{{ eqt.result.msg }}
{{ eqt.result.sub }}
Sending...
{{ eqt.lookup.asset.tag_code }}
{{ eqt.lookup.asset.item_name }} {{ eqt.lookup.asset.status }}
{{ eqtHolder(eqt.lookup.asset) ? 'With ' + eqtHolder(eqt.lookup.asset) + (eqt.lookup.asset.holder_type==='location' ? ' (location)' : '') : 'In stock' }} · Serial {{ eqt.lookup.asset.serial_no }}
{{ eqt.lookup.asset.notes }}
{{ eqtFmtWhen(g.created_at) }} · {{ g.action==='created' ? 'Tagged' : g.action==='status' ? 'Marked ' + g.note : g.action==='returned' ? 'Returned to stock' : (g.action==='moved' ? 'Moved to ' : 'Assigned to ') + (g.member_name || g.location_name || '') }}
{{ eqt.lookup.kind==='member' ? '👤 ' + eqt.lookup.member.name : '📍 ' + eqt.lookup.location.name }}
{{ eqt.lookup.items.length }} item(s) {{ eqt.lookup.kind==='member' ? 'held' : 'kept here' }}
{{ a.tag_code }} {{ a.item_name }}
This session
Nothing scanned yet.
| Time | Tag | Item | Result | |
|---|---|---|---|---|
| {{ l.at }} | {{ l.tag }} | {{ l.name || '' }} | {{ l.text }} |
Camera
Use a phone or laptop camera instead of a hand-held scanner.
{{ eqt.camMsg }}
Only the team network administrator or a member with the Admin team role can change permissions.
Each column is a team role; each row is a menu item (or an action inside one). Tick a box to give everyone with that team role the permission.
A member who holds several team roles gets all of them. Rows marked always on cannot be removed.
Network administrators always hold every permission. Only they and members with the Admin team role can open this page.
The portal checks these on the server, so a hidden menu item is also closed to a direct link.
{{ perm.err }}
Unsaved changes
| Menu item |
{{ r.name }}
{{ r.members }} member{{ r.members===1?'':'s' }} · {{ permCount(r.id) }} on
Standard
|
|---|---|
| {{ sec.name }} | {{ permSectionFull(r.id, sec) ? 'none' : 'all' }} |
| {{ row.action ? '↳ ' : '' }}{{ row.label }} always on |
{{ calMonthLabel }}
{{ d }}
Create an event?
Do you want to create an event on {{ fmtDate(calNewDay) }}?
{{ calSelectedEvent.name }}
📅 {{ fmtDate(calSelectedEvent.event_date) }}
🕐 {{ calSelectedEvent.start_time }} – {{ calSelectedEvent.end_time }}
📍 {{ calSelectedEvent.location }}
{{ calSelectedEvent.description }}
Are you attending?
{{ calSelectedEvent.is_completed?'Completed':'Active' }}
{{ calSelectedEvent.event_type_name }}
No events available.
{{ ev.name }}
{{ ev.description }}
{{ ev.currently_present }} attending{{ crewMineLabel(ev.id) }}
No attendance history yet.
Events attended
{{ uniqueEventsCount }}
Event Hours
{{ totalHours }}
Credential Hours
{{ minsToHours(trainingMinutes) }}
{{ ct.ctype }} · {{ ct.source }}: {{ minsToHours(ct.mins) }}
Active now
{{ myOpenCheckins.length }}
{{ collapsedHistory[group.label] ? '▶' : '▼' }}
{{ group.label }}
{{ group.checkins.length }} session{{ group.checkins.length===1?'':'s' }}
{{ fmtDate(group.latestDate) }}
{{ ci.parent_event_name ? ci.event_name : ci.event_name }}
{{ fmtDatetime(ci.checked_in_at) }}
· Out {{ fmtDatetime(ci.checked_out_at) }} · {{ duration(ci.checked_in_at,ci.checked_out_at) }}
Active
{{ collapsedHistory['__time_entries__'] ? '▶' : '▼' }}
Manual Time Entries
{{ myTimeEntries.length }}
{{ te.description }}
{{ fmtDate(te.entry_date) }} · {{ te.start_time }}–{{ te.end_time }} · {{ minsToHours(te.minutes) }}
{{ collapsedHistory['__credentials__'] ? '▶' : '▼' }}
Credentials
{{ myCredentials.length }}
{{ cr.name }}
Issued: {{ fmtDate(cr.issued_date) }}
· Expires: {{ fmtDate(cr.expiry_date) }}
· {{ cr.hours_worth }}h training
hours excluded
{{ cr.notes }}
No data yet.
| Member | Role | Events | Event Hours | Cred Hours | Total |
|---|---|---|---|---|---|
| {{ r.name }} | {{ r.role||'—' }} | {{ r.event_count || '—' }} | {{ minsToHours(r.total_minutes) }} |
{{ minsToHours(r.cred_mins) }}
—
{{ ct.ctype }} · {{ ct.source }}: {{ minsToHours(ct.mins) }}
|
{{ minsToHours(r.total_minutes + (r.cred_mins||0)) }} |
| {{ reportHoursRoleMember ? reportHoursRoleDrilldown[0].name : 'All members' }} {{ reportHoursRoleYear === 'all' ? 'All time' : reportHoursRoleYear }} | {{ minsToHours(reportHoursRoleDrilldown.reduce((s,r)=>s+r.total_minutes,0)) }} | {{ minsToHours(reportHoursRoleDrilldown.reduce((s,r)=>s+(r.cred_mins||0),0)) }} | {{ minsToHours(reportHoursRoleDrilldown.reduce((s,r)=>s+r.total_minutes+(r.cred_mins||0),0)) }} | ||
No data yet.
Select a member to view their attendance history.
Events attended
{{ memberHistoryEventsCount }}
Hours
{{ minsToHours(memberHistoryFilteredMins) }}
Credentials
{{ memberHistoryCredentials.length }}
{{ collapsedMemberHistory['__credentials__'] ? '▶' : '▼' }}
Credentials
{{ memberHistoryCredentials.length }}
{{ cr.name }}
Issued: {{ fmtDate(cr.issued_date) }}
· Expires: {{ fmtDate(cr.expiry_date) }}
· {{ cr.hours_worth }}h training
hours excluded
{{ cr.notes }}
{{ yrGroup.year }}
{{ minsToHours(Math.round(yrGroup.checkins.filter(c=>c.checked_out_at).reduce((s,c)=>s+Math.round((new Date(c.checked_out_at)-new Date(c.checked_in_at))/60000),0))) }}
{{ collapsedMemberHistory[yrGroup.year+':'+group.label] ? '▶' : '▼' }}
{{ group.label }}
{{ group.checkins.length }}
{{ fmtDate(group.latestDate) }}
{{ ci.event_name }}
{{ fmtDatetime(ci.checked_in_at) }}
· Out {{ fmtDatetime(ci.checked_out_at) }} · {{ duration(ci.checked_in_at,ci.checked_out_at) }}
Active
{{ ci.user_roles }}
{{ collapsedMemberHistory[group.label] ? '▶' : '▼' }}
{{ group.label }}
{{ group.checkins.length }} session{{ group.checkins.length===1?'':'s' }}
{{ fmtDate(group.latestDate) }}
{{ ci.event_name }}
{{ fmtDatetime(ci.checked_in_at) }}
· Out {{ fmtDatetime(ci.checked_out_at) }} · {{ duration(ci.checked_in_at,ci.checked_out_at) }}
Active
{{ ci.user_roles }}
{{ collapsedMemberHistory['__time_entries__'] ? '▶' : '▼' }}
Manual Time Entries
{{ memberHistoryTimeEntries.length }}
{{ te.description }}
{{ fmtDate(te.entry_date) }} · {{ te.start_time }}–{{ te.end_time }} · {{ minsToHours(te.minutes) }}
No attendance records for this member.
No members or credentials found.
| Member | {{ cr.name }} |
|---|---|
| {{ m.member_name }} | ✓ — |
Define the types of equipment that can be issued to members.
No equipment items defined yet.
All equipment currently issued to members.
No equipment issued yet.
{{ timeEntries.length }} entr{{ timeEntries.length===1?'y':'ies' }}
No manual time entries yet.
| Member | Description | Date | Start | End | Duration | Added by | |
|---|---|---|---|---|---|---|---|
| {{ te.member_name }} | {{ te.description }} | {{ fmtDate(te.entry_date) }} | {{ te.start_time }} | {{ te.end_time }} | {{ minsToHours(te.minutes) }} | {{ te.created_by_name }} |
|
No manual time entries yet.
| Member | Entries | Total Hours |
|---|---|---|
| {{ r.name }} | {{ r.entry_count }} | {{ minsToHours(r.total_minutes) }} |
{{ initials(auth.name) }}
{{ auth.name }}
{{ auth.email }}
Team network administrator
Member ID & check-in QR code
Member ID
{{ profileForm.member_no }}
This ID and QR code are assigned to you and stay the same. Show the QR code to Command Staff to check in to an event.
Account
Contact & Details
Radio
{{ profileForm.gmrs_callsign||'—' }}
{{ profileForm.ham_callsign||'—' }}
{{ profileForm.tactical_callsign||'—' }}
Call signs are managed by Command Staff. Contact an admin to update.