oceanhelm 0.0.15 → 0.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/oceanhelm.es.js +1014 -999
- package/dist/oceanhelm.es.js.map +1 -1
- package/dist/oceanhelm.umd.js +4 -4
- package/dist/oceanhelm.umd.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/src/components/Reports.vue +198 -567
- package/src/components/VesselList.vue +15 -16
- package/src/utils/sidebarConfig.js +31 -22
|
@@ -41,9 +41,11 @@
|
|
|
41
41
|
<button class="btn btn-outline-secondary" @click="openReportForm('manual')">
|
|
42
42
|
<i class="bi bi-file-earmark-plus"></i> Manual Report
|
|
43
43
|
</button>
|
|
44
|
+
<!--
|
|
44
45
|
<button class="btn btn-primary" @click="showNewFolderModal = true">
|
|
45
46
|
<i class="bi bi-folder-plus"></i> New Folder
|
|
46
47
|
</button>
|
|
48
|
+
-->
|
|
47
49
|
</div>
|
|
48
50
|
</div>
|
|
49
51
|
</div>
|
|
@@ -272,8 +274,9 @@
|
|
|
272
274
|
</span>
|
|
273
275
|
</div>
|
|
274
276
|
<div class="af-actions">
|
|
275
|
-
|
|
276
|
-
|
|
277
|
+
<!-- FIX: opens manual report modal pre-linked to this folder -->
|
|
278
|
+
<button class="rc-btn" style="color:#6f42c1;"
|
|
279
|
+
@click.stop="openManualReportForFolder(folder)" title="Add Report / Files">
|
|
277
280
|
<i class="bi bi-file-earmark-plus"></i>
|
|
278
281
|
</button>
|
|
279
282
|
<button class="rc-btn rc-btn--danger"
|
|
@@ -304,8 +307,10 @@
|
|
|
304
307
|
|
|
305
308
|
<div class="ffi-empty" v-if="folder.files.length === 0">
|
|
306
309
|
<i class="bi bi-inbox me-1"></i>Empty folder
|
|
307
|
-
|
|
308
|
-
|
|
310
|
+
<!-- FIX: opens manual report modal instead of raw file picker -->
|
|
311
|
+
<button class="btn btn-sm btn-outline-secondary ms-2"
|
|
312
|
+
@click="openManualReportForFolder(folder)">
|
|
313
|
+
<i class="bi bi-file-earmark-plus me-1"></i>Add Report
|
|
309
314
|
</button>
|
|
310
315
|
</div>
|
|
311
316
|
</div>
|
|
@@ -362,8 +367,12 @@
|
|
|
362
367
|
<i
|
|
363
368
|
:class="reportForm.report_type === 'manual' ? 'bi bi-file-earmark-text me-2' : 'bi bi-shield-check me-2'"></i>
|
|
364
369
|
{{ reportForm.report_type === 'manual' ? 'New Manual Report' : 'Submit QHSE Report' }}
|
|
370
|
+
<!-- Show folder context badge when opened from a folder -->
|
|
371
|
+
<span v-if="reportForm.folderName" class="folder-context-badge">
|
|
372
|
+
<i class="bi bi-folder-fill me-1"></i>{{ reportForm.folderName }}
|
|
373
|
+
</span>
|
|
365
374
|
</h5>
|
|
366
|
-
<div class="modal-type-toggle" v-if="!pendingContext">
|
|
375
|
+
<div class="modal-type-toggle" v-if="!pendingContext && !reportForm.folderId">
|
|
367
376
|
<button :class="['type-toggle-btn', { active: reportForm.report_type === 'qhse' }]"
|
|
368
377
|
@click="reportForm.report_type = 'qhse'">
|
|
369
378
|
<i class="bi bi-shield-check me-1"></i>QHSE
|
|
@@ -689,7 +698,7 @@
|
|
|
689
698
|
</div>
|
|
690
699
|
</div>
|
|
691
700
|
|
|
692
|
-
<!-- Hidden file input for user folders -->
|
|
701
|
+
<!-- Hidden file input for user folders (kept for legacy, no longer primary path) -->
|
|
693
702
|
<input ref="fileInput" type="file" multiple style="display:none;" @change="handleFileSelection" />
|
|
694
703
|
</div>
|
|
695
704
|
</template>
|
|
@@ -785,7 +794,6 @@ export default {
|
|
|
785
794
|
this.reportForm.entity_subtype = ctx.entity_subtype;
|
|
786
795
|
this.reportForm.entity_duration = ctx.entity_duration;
|
|
787
796
|
this.reportForm.entity_participants = ctx.entity_participants;
|
|
788
|
-
// Pre-fill findings with the entity objective for incidents
|
|
789
797
|
if (ctx.entity_type === 'incident' && ctx.entity_objectives) {
|
|
790
798
|
this.reportForm.findings = ctx.entity_objectives;
|
|
791
799
|
}
|
|
@@ -816,7 +824,7 @@ export default {
|
|
|
816
824
|
emptyForm() {
|
|
817
825
|
return {
|
|
818
826
|
report_type: 'qhse', manual_category: 'General', manual_ref: '',
|
|
819
|
-
title: '', submittedBy: '', vessel: '', folderId: '',
|
|
827
|
+
title: '', submittedBy: '', vessel: '', folderId: '', folderName: '',
|
|
820
828
|
date: new Date().toISOString().split('T')[0],
|
|
821
829
|
findings: '', correctiveActions: '', files: [],
|
|
822
830
|
entity_type: '', entity_id: '', entity_ref: '', entity_label: '',
|
|
@@ -824,7 +832,6 @@ export default {
|
|
|
824
832
|
entity_duration: '', entity_participants: null,
|
|
825
833
|
selectedMissing: '',
|
|
826
834
|
drillChecklist: [true, true, true, true, true],
|
|
827
|
-
// incident-specific structured fields
|
|
828
835
|
inc_consequences: '',
|
|
829
836
|
inc_factors: '',
|
|
830
837
|
inc_immediate_action: '',
|
|
@@ -899,6 +906,15 @@ export default {
|
|
|
899
906
|
this.showReportModal = true;
|
|
900
907
|
},
|
|
901
908
|
|
|
909
|
+
// ─── FIX: Open manual report modal pre-linked to a custom folder ─────────
|
|
910
|
+
openManualReportForFolder(folder) {
|
|
911
|
+
this.reportForm = this.emptyForm();
|
|
912
|
+
this.reportForm.report_type = 'manual';
|
|
913
|
+
this.reportForm.folderId = folder.id;
|
|
914
|
+
this.reportForm.folderName = folder.name;
|
|
915
|
+
this.showReportModal = true;
|
|
916
|
+
},
|
|
917
|
+
|
|
902
918
|
closeReportForm() { this.showReportModal = false; },
|
|
903
919
|
|
|
904
920
|
clearEntityLink() {
|
|
@@ -929,37 +945,49 @@ export default {
|
|
|
929
945
|
|
|
930
946
|
requestSubmitReport() {
|
|
931
947
|
if (!this.reportForm.title || !this.reportForm.submittedBy || !this.reportForm.findings) return;
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
948
|
+
|
|
949
|
+
const isManual = this.reportForm.report_type === 'manual';
|
|
950
|
+
|
|
951
|
+
// ── FIX: never send entity_id for manual reports ──────────────────────
|
|
952
|
+
// The DB column has gen_random_uuid() as default, so omitting it
|
|
953
|
+
// (or sending undefined) lets Postgres generate it automatically.
|
|
954
|
+
// Sending null explicitly triggers the NOT NULL constraint violation.
|
|
955
|
+
const payload = {
|
|
956
|
+
entity_type: isManual ? 'manual' : (this.reportForm.entity_type || null),
|
|
957
|
+
entity_ref: isManual
|
|
958
|
+
? (this.reportForm.manual_ref || null)
|
|
959
|
+
: (this.reportForm.entity_ref || null),
|
|
960
|
+
title: this.reportForm.title,
|
|
961
|
+
submittedBy: this.reportForm.submittedBy,
|
|
962
|
+
vessel: this.reportForm.vessel || null,
|
|
963
|
+
date: this.reportForm.date,
|
|
964
|
+
findings: this.reportForm.findings,
|
|
965
|
+
correctiveActions: this.reportForm.correctiveActions || null,
|
|
966
|
+
folderId: this.reportForm.folderId || null,
|
|
967
|
+
folderName: this.reportForm.folderName || null,
|
|
968
|
+
manual_category: isManual ? this.reportForm.manual_category : null,
|
|
969
|
+
files: this.reportForm.files,
|
|
970
|
+
entity_subtype: this.reportForm.entity_subtype || null,
|
|
971
|
+
entity_creator: this.reportForm.entity_creator || null,
|
|
972
|
+
entity_objectives: this.reportForm.entity_objectives || null,
|
|
973
|
+
entity_duration: this.reportForm.entity_duration || null,
|
|
953
974
|
entity_participants: this.reportForm.entity_participants || null,
|
|
954
|
-
drill_checklist:
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
975
|
+
drill_checklist: [...this.reportForm.drillChecklist],
|
|
976
|
+
inc_consequences: this.reportForm.inc_consequences || null,
|
|
977
|
+
inc_factors: this.reportForm.inc_factors || null,
|
|
978
|
+
inc_immediate_action:this.reportForm.inc_immediate_action || null,
|
|
979
|
+
inc_direct_cause: this.reportForm.inc_direct_cause || null,
|
|
980
|
+
inc_root_cause: this.reportForm.inc_root_cause || null,
|
|
981
|
+
inc_remarks: this.reportForm.inc_remarks || null,
|
|
982
|
+
};
|
|
983
|
+
|
|
984
|
+
// Only include entity_id when it's a real linked entity (drill/incident)
|
|
985
|
+
// For manual reports we omit the key entirely so the DB default fires
|
|
986
|
+
if (!isManual && this.reportForm.entity_id) {
|
|
987
|
+
payload.entity_id = this.reportForm.entity_id;
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
this.$emit('report-submit-requested', payload);
|
|
963
991
|
},
|
|
964
992
|
|
|
965
993
|
resetForm() { this.reportForm = this.emptyForm(); },
|
|
@@ -983,7 +1011,6 @@ export default {
|
|
|
983
1011
|
this.viewingReport = null;
|
|
984
1012
|
},
|
|
985
1013
|
|
|
986
|
-
// Closes the modal immediately, then emits so ReportsView can confirm + delete
|
|
987
1014
|
requestDeleteReport(reportId) {
|
|
988
1015
|
this.closeViewer();
|
|
989
1016
|
this.$emit('report-delete-requested', reportId);
|
|
@@ -1117,7 +1144,6 @@ export default {
|
|
|
1117
1144
|
doc.text('Quality, Health, Safety & Environment Management System', pageW / 2, 17, { align: 'center' });
|
|
1118
1145
|
y = 30;
|
|
1119
1146
|
|
|
1120
|
-
// Ref badge
|
|
1121
1147
|
if (report.entityRef) {
|
|
1122
1148
|
doc.setFillColor(240, 245, 255);
|
|
1123
1149
|
doc.roundedRect(pageW - margin - 44, 26, 44, 8, 2, 2, 'F');
|
|
@@ -1135,19 +1161,16 @@ export default {
|
|
|
1135
1161
|
doc.line(margin + contentW / 2, y, margin + contentW / 2, y + 28);
|
|
1136
1162
|
doc.line(margin, y + 14, margin + contentW / 2, y + 14);
|
|
1137
1163
|
|
|
1138
|
-
// Vessel name
|
|
1139
1164
|
doc.setFontSize(8); doc.setFont('helvetica', 'bold'); doc.setTextColor(80, 90, 110);
|
|
1140
1165
|
doc.text('VESSEL:', margin + 3, y + 6);
|
|
1141
1166
|
doc.setFont('helvetica', 'bold'); doc.setTextColor(20, 20, 20); doc.setFontSize(10);
|
|
1142
1167
|
doc.text(String(report.vessel || '—').toUpperCase(), margin + 22, y + 6);
|
|
1143
1168
|
|
|
1144
|
-
// Date / place
|
|
1145
1169
|
doc.setFontSize(8); doc.setFont('helvetica', 'bold'); doc.setTextColor(80, 90, 110);
|
|
1146
1170
|
doc.text('DATE / PLACE:', margin + 3, y + 20);
|
|
1147
1171
|
doc.setFont('helvetica', 'normal'); doc.setTextColor(20, 20, 20);
|
|
1148
1172
|
doc.text(`${report.date || '—'} / ${report.vessel || '—'}`, margin + 33, y + 20);
|
|
1149
1173
|
|
|
1150
|
-
// Kind of drill
|
|
1151
1174
|
const hx = margin + contentW / 2 + 3;
|
|
1152
1175
|
doc.setFontSize(8); doc.setFont('helvetica', 'bold'); doc.setTextColor(80, 90, 110);
|
|
1153
1176
|
doc.text('KIND OF DRILL:', hx, y + 6);
|
|
@@ -1171,15 +1194,12 @@ export default {
|
|
|
1171
1194
|
const participantCount = report.entity_participants || 0;
|
|
1172
1195
|
sectionHeading(`Crew Participation — ${participantCount} member${participantCount !== 1 ? 's' : ''} participated`);
|
|
1173
1196
|
|
|
1174
|
-
// Parse crew from findings if prefixed with CREW:
|
|
1175
1197
|
const crewLines = (() => {
|
|
1176
1198
|
const raw = (report.findings || '').trim();
|
|
1177
1199
|
if (/^CREW:/i.test(raw)) {
|
|
1178
|
-
// Everything up to first blank line after CREW: is the crew list
|
|
1179
1200
|
const crewSection = raw.replace(/^CREW:\s*/i, '').split(/\n\n/)[0];
|
|
1180
1201
|
return crewSection.split(/[\n,]+/).map(s => s.trim()).filter(Boolean);
|
|
1181
1202
|
}
|
|
1182
|
-
// Fallback: show drill master + submitter
|
|
1183
1203
|
const list = [];
|
|
1184
1204
|
if (report.entity_creator) list.push(`${report.entity_creator} (Drill Master)`);
|
|
1185
1205
|
if (report.submittedBy && report.submittedBy !== report.entity_creator)
|
|
@@ -1187,7 +1207,6 @@ export default {
|
|
|
1187
1207
|
return list;
|
|
1188
1208
|
})();
|
|
1189
1209
|
|
|
1190
|
-
// Table header
|
|
1191
1210
|
checkPage(14);
|
|
1192
1211
|
const colNr = margin, wNr = 12;
|
|
1193
1212
|
const colName = margin + wNr, wName = contentW - wNr;
|
|
@@ -1222,7 +1241,7 @@ export default {
|
|
|
1222
1241
|
}
|
|
1223
1242
|
y += 4;
|
|
1224
1243
|
|
|
1225
|
-
// ── Comments checklist
|
|
1244
|
+
// ── Comments checklist ────────────────────────────────────────────────
|
|
1226
1245
|
sectionHeading('Comments');
|
|
1227
1246
|
const checkQuestions = [
|
|
1228
1247
|
'Is the reaction of crew members satisfactory?',
|
|
@@ -1231,7 +1250,6 @@ export default {
|
|
|
1231
1250
|
'Was debriefing conducted on completion of drill?',
|
|
1232
1251
|
'Is time log of various activities marked on checklist?',
|
|
1233
1252
|
];
|
|
1234
|
-
// Parse stored answers (array of booleans). Fall back to all-true if absent.
|
|
1235
1253
|
const checkAnswers = (() => {
|
|
1236
1254
|
const raw = report.drill_checklist || report.drillChecklist;
|
|
1237
1255
|
if (Array.isArray(raw)) return raw;
|
|
@@ -1239,7 +1257,7 @@ export default {
|
|
|
1239
1257
|
})();
|
|
1240
1258
|
checkQuestions.forEach((q, idx) => {
|
|
1241
1259
|
checkPage(9);
|
|
1242
|
-
const yes = checkAnswers[idx] !== false;
|
|
1260
|
+
const yes = checkAnswers[idx] !== false;
|
|
1243
1261
|
doc.setFontSize(8.5); doc.setFont('helvetica', 'normal'); doc.setTextColor(30, 30, 30);
|
|
1244
1262
|
doc.text(`${idx + 1}. ${q}`, margin + 3, y + 5);
|
|
1245
1263
|
if (yes) {
|
|
@@ -1258,11 +1276,9 @@ export default {
|
|
|
1258
1276
|
y += 3;
|
|
1259
1277
|
|
|
1260
1278
|
// ── Drill scenario / findings ─────────────────────────────────────────
|
|
1261
|
-
// Strip the CREW: block from findings before printing
|
|
1262
1279
|
const scenarioText = (() => {
|
|
1263
1280
|
const raw = (report.findings || '').trim();
|
|
1264
1281
|
if (/^CREW:/i.test(raw)) {
|
|
1265
|
-
// Remove everything up to the first blank line
|
|
1266
1282
|
const parts = raw.split(/\n\n+/);
|
|
1267
1283
|
return parts.slice(1).join('\n\n').trim();
|
|
1268
1284
|
}
|
|
@@ -1282,7 +1298,7 @@ export default {
|
|
|
1282
1298
|
y += 4;
|
|
1283
1299
|
}
|
|
1284
1300
|
|
|
1285
|
-
// ──
|
|
1301
|
+
// ── Corrective actions ────────────────────────────────────────────────
|
|
1286
1302
|
if (report.correctiveActions) {
|
|
1287
1303
|
sectionHeading('Suggestions for Improvement & Corrective Actions');
|
|
1288
1304
|
checkPage(10);
|
|
@@ -1323,9 +1339,6 @@ export default {
|
|
|
1323
1339
|
} catch (e) { console.warn('Could not embed image', imgFile.name, e); }
|
|
1324
1340
|
}
|
|
1325
1341
|
|
|
1326
|
-
// ── Signature block ───────────────────────────────────────────────────
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
1342
|
// ── Footer ────────────────────────────────────────────────────────────
|
|
1330
1343
|
const totalPages = doc.getNumberOfPages();
|
|
1331
1344
|
for (let p = 1; p <= totalPages; p++) {
|
|
@@ -1352,12 +1365,6 @@ export default {
|
|
|
1352
1365
|
if (y + needed > 275) { doc.addPage(); y = 20; }
|
|
1353
1366
|
};
|
|
1354
1367
|
|
|
1355
|
-
/**
|
|
1356
|
-
* Bordered labelled box — mirrors the Near Miss Report form style.
|
|
1357
|
-
* label — small-caps field label shown inside the top of the box
|
|
1358
|
-
* text — content (may be null/empty — leaves a blank writable area)
|
|
1359
|
-
* minHeight — minimum box height in mm
|
|
1360
|
-
*/
|
|
1361
1368
|
const labelledBox = (label, text, minHeight = 18) => {
|
|
1362
1369
|
const bodyText = text ? doc.splitTextToSize(String(text), contentW - 6) : [];
|
|
1363
1370
|
const textH = bodyText.length * 5.5;
|
|
@@ -1368,13 +1375,11 @@ export default {
|
|
|
1368
1375
|
doc.setLineWidth(0.35);
|
|
1369
1376
|
doc.rect(margin, y, contentW, boxH, 'S');
|
|
1370
1377
|
|
|
1371
|
-
// Label
|
|
1372
1378
|
doc.setFontSize(7.5); doc.setFont('helvetica', 'bold'); doc.setTextColor(70, 80, 100);
|
|
1373
1379
|
const labelLines = doc.splitTextToSize(label.toUpperCase(), contentW - 6);
|
|
1374
1380
|
labelLines.forEach((ll, i) => doc.text(ll, margin + 3, y + 5 + i * 4));
|
|
1375
1381
|
const labelH = labelLines.length * 4 + 2;
|
|
1376
1382
|
|
|
1377
|
-
// Thin rule under label
|
|
1378
1383
|
doc.setDrawColor(200, 208, 220); doc.setLineWidth(0.2);
|
|
1379
1384
|
doc.line(margin + 1, y + labelH + 2, margin + contentW - 1, y + labelH + 2);
|
|
1380
1385
|
|
|
@@ -1399,7 +1404,6 @@ export default {
|
|
|
1399
1404
|
doc.text(`Date: ${report.date || '—'}`, pageW - margin, 13, { align: 'right' });
|
|
1400
1405
|
y = 20;
|
|
1401
1406
|
|
|
1402
|
-
// Form number + submitted by row
|
|
1403
1407
|
doc.setFontSize(8); doc.setFont('helvetica', 'bold'); doc.setTextColor(80, 90, 110);
|
|
1404
1408
|
doc.text('FORM NUMBER:', margin, y + 4);
|
|
1405
1409
|
doc.setFont('helvetica', 'normal'); doc.setTextColor(20, 20, 20);
|
|
@@ -1410,7 +1414,6 @@ export default {
|
|
|
1410
1414
|
doc.text(report.submittedBy || '—', pageW / 2 + 28, y + 4);
|
|
1411
1415
|
y += 10;
|
|
1412
1416
|
|
|
1413
|
-
// ── 2-col meta: vessel | severity/type ───────────────────────────────
|
|
1414
1417
|
const halfW = (contentW - 2) / 2;
|
|
1415
1418
|
doc.setDrawColor(140, 150, 165); doc.setLineWidth(0.35);
|
|
1416
1419
|
doc.rect(margin, y, halfW, 14, 'S');
|
|
@@ -1427,7 +1430,6 @@ export default {
|
|
|
1427
1430
|
);
|
|
1428
1431
|
y += 18;
|
|
1429
1432
|
|
|
1430
|
-
// Management office + date
|
|
1431
1433
|
doc.setDrawColor(140, 150, 165); doc.setLineWidth(0.35);
|
|
1432
1434
|
doc.rect(margin, y, halfW, 10, 'S');
|
|
1433
1435
|
doc.rect(margin + halfW + 2, y, halfW, 10, 'S');
|
|
@@ -1439,38 +1441,25 @@ export default {
|
|
|
1439
1441
|
doc.text(report.date || '—', margin + halfW + 5, y + 9);
|
|
1440
1442
|
y += 14;
|
|
1441
1443
|
|
|
1442
|
-
// ── Labelled content boxes ────────────────────────────────────────────
|
|
1443
|
-
|
|
1444
1444
|
labelledBox('Description of Event', report.findings, 24);
|
|
1445
|
-
|
|
1446
1445
|
labelledBox(
|
|
1447
1446
|
'Possible Consequences\n(e.g. Personal injury, damage, collision, grounding, fire, pollution etc.)',
|
|
1448
|
-
report.inc_consequences || null,
|
|
1449
|
-
18
|
|
1447
|
+
report.inc_consequences || null, 18
|
|
1450
1448
|
);
|
|
1451
|
-
|
|
1452
1449
|
labelledBox(
|
|
1453
1450
|
'Relevant Factors / Conditions Surrounding the Event\n(e.g. weather, lighting etc.)',
|
|
1454
|
-
report.inc_factors || null,
|
|
1455
|
-
18
|
|
1451
|
+
report.inc_factors || null, 18
|
|
1456
1452
|
);
|
|
1457
|
-
|
|
1458
1453
|
labelledBox('Immediate Action Taken', report.inc_immediate_action || null, 16);
|
|
1459
|
-
|
|
1460
1454
|
labelledBox(
|
|
1461
1455
|
'Direct Cause\n(e.g. failure to follow procedures, inadequate or defective equipment etc.)',
|
|
1462
|
-
report.inc_direct_cause || null,
|
|
1463
|
-
18
|
|
1456
|
+
report.inc_direct_cause || null, 18
|
|
1464
1457
|
);
|
|
1465
|
-
|
|
1466
1458
|
labelledBox(
|
|
1467
1459
|
'Root Cause\n(e.g. lack of training, personal factors, job factors, control management factors, instructions not clear etc.)',
|
|
1468
|
-
report.inc_root_cause || null,
|
|
1469
|
-
18
|
|
1460
|
+
report.inc_root_cause || null, 18
|
|
1470
1461
|
);
|
|
1471
|
-
|
|
1472
1462
|
labelledBox('Action Taken on Board to Avoid Re-occurrence', report.correctiveActions || null, 18);
|
|
1473
|
-
|
|
1474
1463
|
labelledBox('Any Other Remarks', report.inc_remarks || null, 16);
|
|
1475
1464
|
|
|
1476
1465
|
// ── Embedded images ───────────────────────────────────────────────────
|
|
@@ -1495,14 +1484,12 @@ export default {
|
|
|
1495
1484
|
} catch (e) { console.warn('Could not embed image', imgFile.name, e); }
|
|
1496
1485
|
}
|
|
1497
1486
|
|
|
1498
|
-
// ── Closed-out note ───────────────────────────────────────────────────
|
|
1499
1487
|
checkPage(14);
|
|
1500
1488
|
y += 4;
|
|
1501
1489
|
doc.setFontSize(8.5); doc.setFont('helvetica', 'italic'); doc.setTextColor(100, 110, 130);
|
|
1502
1490
|
doc.text('Closed out on board / Office support required (delete as applicable)', margin, y);
|
|
1503
1491
|
y += 8;
|
|
1504
1492
|
|
|
1505
|
-
// ── Footer ────────────────────────────────────────────────────────────
|
|
1506
1493
|
const totalPages = doc.getNumberOfPages();
|
|
1507
1494
|
for (let p = 1; p <= totalPages; p++) {
|
|
1508
1495
|
doc.setPage(p);
|
|
@@ -1682,6 +1669,7 @@ export default {
|
|
|
1682
1669
|
this.activeTab = 'folders';
|
|
1683
1670
|
},
|
|
1684
1671
|
|
|
1672
|
+
// Legacy raw file picker — kept in case parent still uses files-add-requested directly
|
|
1685
1673
|
selectFolder(folder) { this.selectedFolder = folder; this.$refs.fileInput.click(); },
|
|
1686
1674
|
|
|
1687
1675
|
handleFileSelection(event) {
|
|
@@ -1921,15 +1909,8 @@ export default {
|
|
|
1921
1909
|
}
|
|
1922
1910
|
|
|
1923
1911
|
@keyframes flash-highlight {
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
100% {
|
|
1927
|
-
background: #fffbf0
|
|
1928
|
-
}
|
|
1929
|
-
|
|
1930
|
-
50% {
|
|
1931
|
-
background: #fff3cd
|
|
1932
|
-
}
|
|
1912
|
+
0%, 100% { background: #fffbf0 }
|
|
1913
|
+
50% { background: #fff3cd }
|
|
1933
1914
|
}
|
|
1934
1915
|
|
|
1935
1916
|
.rc-type-bar {
|
|
@@ -1940,17 +1921,9 @@ export default {
|
|
|
1940
1921
|
width: 4px;
|
|
1941
1922
|
}
|
|
1942
1923
|
|
|
1943
|
-
.rc-type-bar.drill {
|
|
1944
|
-
|
|
1945
|
-
}
|
|
1946
|
-
|
|
1947
|
-
.rc-type-bar.incident {
|
|
1948
|
-
background: #dc3545;
|
|
1949
|
-
}
|
|
1950
|
-
|
|
1951
|
-
.rc-type-bar.manual {
|
|
1952
|
-
background: #6f42c1;
|
|
1953
|
-
}
|
|
1924
|
+
.rc-type-bar.drill { background: #17a2b8; }
|
|
1925
|
+
.rc-type-bar.incident { background: #dc3545; }
|
|
1926
|
+
.rc-type-bar.manual { background: #6f42c1; }
|
|
1954
1927
|
|
|
1955
1928
|
.rc-badge {
|
|
1956
1929
|
font-size: 9px;
|
|
@@ -1962,20 +1935,9 @@ export default {
|
|
|
1962
1935
|
flex-shrink: 0;
|
|
1963
1936
|
}
|
|
1964
1937
|
|
|
1965
|
-
.rc-badge.drill {
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
}
|
|
1969
|
-
|
|
1970
|
-
.rc-badge.incident {
|
|
1971
|
-
background: #f8d7da;
|
|
1972
|
-
color: #721c24;
|
|
1973
|
-
}
|
|
1974
|
-
|
|
1975
|
-
.rc-badge.manual {
|
|
1976
|
-
background: #ede9f6;
|
|
1977
|
-
color: #383d72;
|
|
1978
|
-
}
|
|
1938
|
+
.rc-badge.drill { background: #d1ecf1; color: #0c5460; }
|
|
1939
|
+
.rc-badge.incident { background: #f8d7da; color: #721c24; }
|
|
1940
|
+
.rc-badge.manual { background: #ede9f6; color: #383d72; }
|
|
1979
1941
|
|
|
1980
1942
|
.rc-body {
|
|
1981
1943
|
display: flex;
|
|
@@ -2032,27 +1994,10 @@ export default {
|
|
|
2032
1994
|
text-overflow: ellipsis;
|
|
2033
1995
|
}
|
|
2034
1996
|
|
|
2035
|
-
.rc-folder-pill.drill {
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
}
|
|
2040
|
-
|
|
2041
|
-
.rc-folder-pill.incident {
|
|
2042
|
-
background: #fce8ea;
|
|
2043
|
-
border-color: #dc3545;
|
|
2044
|
-
color: #721c24;
|
|
2045
|
-
}
|
|
2046
|
-
|
|
2047
|
-
.rc-folder-pill.manual {
|
|
2048
|
-
background: #f0ebfa;
|
|
2049
|
-
border-color: #6f42c1;
|
|
2050
|
-
color: #383d72;
|
|
2051
|
-
}
|
|
2052
|
-
|
|
2053
|
-
.rc-folder-pill:hover {
|
|
2054
|
-
filter: brightness(.92);
|
|
2055
|
-
}
|
|
1997
|
+
.rc-folder-pill.drill { background: #e8f7fa; border-color: #17a2b8; color: #0c5460; }
|
|
1998
|
+
.rc-folder-pill.incident { background: #fce8ea; border-color: #dc3545; color: #721c24; }
|
|
1999
|
+
.rc-folder-pill.manual { background: #f0ebfa; border-color: #6f42c1; color: #383d72; }
|
|
2000
|
+
.rc-folder-pill:hover { filter: brightness(.92); }
|
|
2056
2001
|
|
|
2057
2002
|
.rc-actions {
|
|
2058
2003
|
display: flex;
|
|
@@ -2076,35 +2021,25 @@ export default {
|
|
|
2076
2021
|
color: #495057;
|
|
2077
2022
|
}
|
|
2078
2023
|
|
|
2079
|
-
.rc-btn:disabled {
|
|
2080
|
-
|
|
2081
|
-
|
|
2082
|
-
}
|
|
2083
|
-
|
|
2084
|
-
.rc-btn--
|
|
2085
|
-
background: #2a5298;
|
|
2086
|
-
color: #fff;
|
|
2087
|
-
border-color: #2a5298;
|
|
2088
|
-
}
|
|
2089
|
-
|
|
2090
|
-
.rc-btn--download {
|
|
2091
|
-
color: #28a745;
|
|
2092
|
-
}
|
|
2093
|
-
|
|
2094
|
-
.rc-btn--download:hover:not(:disabled) {
|
|
2095
|
-
background: #28a745;
|
|
2096
|
-
color: #fff;
|
|
2097
|
-
border-color: #28a745;
|
|
2098
|
-
}
|
|
2024
|
+
.rc-btn:disabled { opacity: .5; cursor: not-allowed; }
|
|
2025
|
+
.rc-btn--view:hover:not(:disabled) { background: #2a5298; color: #fff; border-color: #2a5298; }
|
|
2026
|
+
.rc-btn--download { color: #28a745; }
|
|
2027
|
+
.rc-btn--download:hover:not(:disabled) { background: #28a745; color: #fff; border-color: #28a745; }
|
|
2028
|
+
.rc-btn--danger { color: #dc3545; }
|
|
2029
|
+
.rc-btn--danger:hover:not(:disabled) { background: #dc3545; color: #fff; border-color: #dc3545; }
|
|
2099
2030
|
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
|
|
2106
|
-
|
|
2107
|
-
border
|
|
2031
|
+
/* ─── Folder context badge in modal header ─── */
|
|
2032
|
+
.folder-context-badge {
|
|
2033
|
+
display: inline-flex;
|
|
2034
|
+
align-items: center;
|
|
2035
|
+
font-size: 11px;
|
|
2036
|
+
font-weight: 600;
|
|
2037
|
+
background: rgba(255, 255, 255, .2);
|
|
2038
|
+
border: 1px solid rgba(255, 255, 255, .35);
|
|
2039
|
+
border-radius: 12px;
|
|
2040
|
+
padding: 2px 10px;
|
|
2041
|
+
margin-left: 10px;
|
|
2042
|
+
color: rgba(255, 255, 255, .9);
|
|
2108
2043
|
}
|
|
2109
2044
|
|
|
2110
2045
|
/* ─── Crew hint ─── */
|
|
@@ -2171,22 +2106,12 @@ export default {
|
|
|
2171
2106
|
transition: border-color .18s;
|
|
2172
2107
|
}
|
|
2173
2108
|
|
|
2174
|
-
.auto-folder-card.drill {
|
|
2175
|
-
|
|
2176
|
-
}
|
|
2177
|
-
|
|
2178
|
-
.auto-folder-card.incident {
|
|
2179
|
-
border-left: 4px solid #dc3545;
|
|
2180
|
-
}
|
|
2181
|
-
|
|
2182
|
-
.auto-folder-card.manual {
|
|
2183
|
-
border-left: 4px solid #6f42c1;
|
|
2184
|
-
}
|
|
2109
|
+
.auto-folder-card.drill { border-left: 4px solid #17a2b8; }
|
|
2110
|
+
.auto-folder-card.incident { border-left: 4px solid #dc3545; }
|
|
2111
|
+
.auto-folder-card.manual { border-left: 4px solid #6f42c1; }
|
|
2185
2112
|
|
|
2186
2113
|
.auto-folder-card:hover,
|
|
2187
|
-
.auto-folder-card.is-open {
|
|
2188
|
-
border-color: #adb5bd;
|
|
2189
|
-
}
|
|
2114
|
+
.auto-folder-card.is-open { border-color: #adb5bd; }
|
|
2190
2115
|
|
|
2191
2116
|
.user-folder-card {
|
|
2192
2117
|
border: 1.5px solid #e9ecef;
|
|
@@ -2198,9 +2123,7 @@ export default {
|
|
|
2198
2123
|
}
|
|
2199
2124
|
|
|
2200
2125
|
.user-folder-card:hover,
|
|
2201
|
-
.user-folder-card.is-open {
|
|
2202
|
-
border-color: #adb5bd;
|
|
2203
|
-
}
|
|
2126
|
+
.user-folder-card.is-open { border-color: #adb5bd; }
|
|
2204
2127
|
|
|
2205
2128
|
.af-header {
|
|
2206
2129
|
display: flex;
|
|
@@ -2212,34 +2135,19 @@ export default {
|
|
|
2212
2135
|
transition: background .15s;
|
|
2213
2136
|
}
|
|
2214
2137
|
|
|
2215
|
-
.af-header:hover {
|
|
2216
|
-
background: #f8f9fa;
|
|
2217
|
-
}
|
|
2138
|
+
.af-header:hover { background: #f8f9fa; }
|
|
2218
2139
|
|
|
2219
2140
|
.af-icon-wrap {
|
|
2220
2141
|
position: relative;
|
|
2221
2142
|
flex-shrink: 0;
|
|
2222
2143
|
}
|
|
2223
2144
|
|
|
2224
|
-
.af-folder-icon {
|
|
2225
|
-
font-size: 2.1rem;
|
|
2226
|
-
}
|
|
2227
|
-
|
|
2228
|
-
.color--drill {
|
|
2229
|
-
color: #17a2b8;
|
|
2230
|
-
}
|
|
2231
|
-
|
|
2232
|
-
.color--incident {
|
|
2233
|
-
color: #dc3545;
|
|
2234
|
-
}
|
|
2145
|
+
.af-folder-icon { font-size: 2.1rem; }
|
|
2235
2146
|
|
|
2236
|
-
.color--
|
|
2237
|
-
|
|
2238
|
-
}
|
|
2239
|
-
|
|
2240
|
-
.color--user {
|
|
2241
|
-
color: #f0ad4e;
|
|
2242
|
-
}
|
|
2147
|
+
.color--drill { color: #17a2b8; }
|
|
2148
|
+
.color--incident { color: #dc3545; }
|
|
2149
|
+
.color--manual { color: #6f42c1; }
|
|
2150
|
+
.color--user { color: #f0ad4e; }
|
|
2243
2151
|
|
|
2244
2152
|
.af-count-badge {
|
|
2245
2153
|
position: absolute;
|
|
@@ -2333,9 +2241,7 @@ export default {
|
|
|
2333
2241
|
transition: border-color .15s;
|
|
2334
2242
|
}
|
|
2335
2243
|
|
|
2336
|
-
.ffi:hover {
|
|
2337
|
-
border-color: #adb5bd;
|
|
2338
|
-
}
|
|
2244
|
+
.ffi:hover { border-color: #adb5bd; }
|
|
2339
2245
|
|
|
2340
2246
|
.ffi--report {
|
|
2341
2247
|
border-color: #c5d0ee;
|
|
@@ -2343,9 +2249,7 @@ export default {
|
|
|
2343
2249
|
cursor: pointer;
|
|
2344
2250
|
}
|
|
2345
2251
|
|
|
2346
|
-
.ffi--report:hover {
|
|
2347
|
-
border-color: #2a5298;
|
|
2348
|
-
}
|
|
2252
|
+
.ffi--report:hover { border-color: #2a5298; }
|
|
2349
2253
|
|
|
2350
2254
|
.ffi-icon {
|
|
2351
2255
|
width: 34px;
|
|
@@ -2358,20 +2262,9 @@ export default {
|
|
|
2358
2262
|
flex-shrink: 0;
|
|
2359
2263
|
}
|
|
2360
2264
|
|
|
2361
|
-
.ffi-icon--pdf {
|
|
2362
|
-
|
|
2363
|
-
|
|
2364
|
-
}
|
|
2365
|
-
|
|
2366
|
-
.ffi-icon--img {
|
|
2367
|
-
background: #e8f5e9;
|
|
2368
|
-
color: #28a745;
|
|
2369
|
-
}
|
|
2370
|
-
|
|
2371
|
-
.ffi-icon--generic {
|
|
2372
|
-
background: #e9ecef;
|
|
2373
|
-
color: #6c757d;
|
|
2374
|
-
}
|
|
2265
|
+
.ffi-icon--pdf { background: #ffeaea; color: #dc3545; }
|
|
2266
|
+
.ffi-icon--img { background: #e8f5e9; color: #28a745; }
|
|
2267
|
+
.ffi-icon--generic { background: #e9ecef; color: #6c757d; }
|
|
2375
2268
|
|
|
2376
2269
|
.ffi-meta {
|
|
2377
2270
|
flex: 1;
|
|
@@ -2390,10 +2283,7 @@ export default {
|
|
|
2390
2283
|
text-overflow: ellipsis;
|
|
2391
2284
|
}
|
|
2392
2285
|
|
|
2393
|
-
.ffi-sub {
|
|
2394
|
-
font-size: 11px;
|
|
2395
|
-
color: #6c757d;
|
|
2396
|
-
}
|
|
2286
|
+
.ffi-sub { font-size: 11px; color: #6c757d; }
|
|
2397
2287
|
|
|
2398
2288
|
.ffi-acts {
|
|
2399
2289
|
display: flex;
|
|
@@ -2433,20 +2323,9 @@ export default {
|
|
|
2433
2323
|
flex-shrink: 0;
|
|
2434
2324
|
}
|
|
2435
2325
|
|
|
2436
|
-
.mini-badge.drill {
|
|
2437
|
-
|
|
2438
|
-
|
|
2439
|
-
}
|
|
2440
|
-
|
|
2441
|
-
.mini-badge.incident {
|
|
2442
|
-
background: #f8d7da;
|
|
2443
|
-
color: #721c24;
|
|
2444
|
-
}
|
|
2445
|
-
|
|
2446
|
-
.mini-badge.manual {
|
|
2447
|
-
background: #ede9f6;
|
|
2448
|
-
color: #383d72;
|
|
2449
|
-
}
|
|
2326
|
+
.mini-badge.drill { background: #d1ecf1; color: #0c5460; }
|
|
2327
|
+
.mini-badge.incident { background: #f8d7da; color: #721c24; }
|
|
2328
|
+
.mini-badge.manual { background: #ede9f6; color: #383d72; }
|
|
2450
2329
|
|
|
2451
2330
|
/* ─── Modals ─── */
|
|
2452
2331
|
.modal {
|
|
@@ -2459,9 +2338,7 @@ export default {
|
|
|
2459
2338
|
justify-content: center;
|
|
2460
2339
|
}
|
|
2461
2340
|
|
|
2462
|
-
.modal.show {
|
|
2463
|
-
display: flex;
|
|
2464
|
-
}
|
|
2341
|
+
.modal.show { display: flex; }
|
|
2465
2342
|
|
|
2466
2343
|
.modal-dialog {
|
|
2467
2344
|
max-width: 500px;
|
|
@@ -2469,9 +2346,7 @@ export default {
|
|
|
2469
2346
|
margin: 1.5rem auto;
|
|
2470
2347
|
}
|
|
2471
2348
|
|
|
2472
|
-
.modal-dialog.modal-lg {
|
|
2473
|
-
max-width: 780px;
|
|
2474
|
-
}
|
|
2349
|
+
.modal-dialog.modal-lg { max-width: 780px; }
|
|
2475
2350
|
|
|
2476
2351
|
.modal-content {
|
|
2477
2352
|
background: #fff;
|
|
@@ -2531,15 +2406,8 @@ export default {
|
|
|
2531
2406
|
transition: all .2s;
|
|
2532
2407
|
}
|
|
2533
2408
|
|
|
2534
|
-
.type-toggle-btn.active {
|
|
2535
|
-
|
|
2536
|
-
color: #2a5298;
|
|
2537
|
-
}
|
|
2538
|
-
|
|
2539
|
-
.type-toggle-btn:hover:not(.active) {
|
|
2540
|
-
color: #fff;
|
|
2541
|
-
background: rgba(255, 255, 255, .2);
|
|
2542
|
-
}
|
|
2409
|
+
.type-toggle-btn.active { background: #fff; color: #2a5298; }
|
|
2410
|
+
.type-toggle-btn:hover:not(.active) { color: #fff; background: rgba(255, 255, 255, .2); }
|
|
2543
2411
|
|
|
2544
2412
|
.btn-close {
|
|
2545
2413
|
background: transparent;
|
|
@@ -2550,9 +2418,7 @@ export default {
|
|
|
2550
2418
|
color: inherit;
|
|
2551
2419
|
}
|
|
2552
2420
|
|
|
2553
|
-
.btn-close:hover {
|
|
2554
|
-
opacity: 1;
|
|
2555
|
-
}
|
|
2421
|
+
.btn-close:hover { opacity: 1; }
|
|
2556
2422
|
|
|
2557
2423
|
/* ─── Report Form ─── */
|
|
2558
2424
|
.rpt-entity-box {
|
|
@@ -2579,20 +2445,9 @@ export default {
|
|
|
2579
2445
|
flex-shrink: 0;
|
|
2580
2446
|
}
|
|
2581
2447
|
|
|
2582
|
-
.entity-chip.drill {
|
|
2583
|
-
|
|
2584
|
-
|
|
2585
|
-
}
|
|
2586
|
-
|
|
2587
|
-
.entity-chip.incident {
|
|
2588
|
-
background: #f8d7da;
|
|
2589
|
-
color: #721c24;
|
|
2590
|
-
}
|
|
2591
|
-
|
|
2592
|
-
.entity-chip.manual {
|
|
2593
|
-
background: #ede9f6;
|
|
2594
|
-
color: #383d72;
|
|
2595
|
-
}
|
|
2448
|
+
.entity-chip.drill { background: #d1ecf1; color: #0c5460; }
|
|
2449
|
+
.entity-chip.incident { background: #f8d7da; color: #721c24; }
|
|
2450
|
+
.entity-chip.manual { background: #ede9f6; color: #383d72; }
|
|
2596
2451
|
|
|
2597
2452
|
.input-row {
|
|
2598
2453
|
display: grid;
|
|
@@ -2636,14 +2491,8 @@ export default {
|
|
|
2636
2491
|
box-shadow: 0 0 0 3px rgba(42, 82, 152, .1);
|
|
2637
2492
|
}
|
|
2638
2493
|
|
|
2639
|
-
textarea.form-control {
|
|
2640
|
-
|
|
2641
|
-
min-height: 80px;
|
|
2642
|
-
}
|
|
2643
|
-
|
|
2644
|
-
select.form-control {
|
|
2645
|
-
cursor: pointer;
|
|
2646
|
-
}
|
|
2494
|
+
textarea.form-control { resize: vertical; min-height: 80px; }
|
|
2495
|
+
select.form-control { cursor: pointer; }
|
|
2647
2496
|
|
|
2648
2497
|
.file-drop-zone {
|
|
2649
2498
|
border: 2px dashed #ced4da;
|
|
@@ -2655,9 +2504,7 @@ select.form-control {
|
|
|
2655
2504
|
min-height: 80px;
|
|
2656
2505
|
}
|
|
2657
2506
|
|
|
2658
|
-
.file-drop-zone:hover {
|
|
2659
|
-
border-color: #2a5298;
|
|
2660
|
-
}
|
|
2507
|
+
.file-drop-zone:hover { border-color: #2a5298; }
|
|
2661
2508
|
|
|
2662
2509
|
.attached-files {
|
|
2663
2510
|
display: flex;
|
|
@@ -2685,9 +2532,7 @@ select.form-control {
|
|
|
2685
2532
|
transition: background .15s;
|
|
2686
2533
|
}
|
|
2687
2534
|
|
|
2688
|
-
.attached-chip--link:hover {
|
|
2689
|
-
background: #dce4f8;
|
|
2690
|
-
}
|
|
2535
|
+
.attached-chip--link:hover { background: #dce4f8; }
|
|
2691
2536
|
|
|
2692
2537
|
.attached-chip button {
|
|
2693
2538
|
background: none;
|
|
@@ -2718,11 +2563,7 @@ select.form-control {
|
|
|
2718
2563
|
margin-bottom: 20px;
|
|
2719
2564
|
}
|
|
2720
2565
|
|
|
2721
|
-
.view-item {
|
|
2722
|
-
display: flex;
|
|
2723
|
-
flex-direction: column;
|
|
2724
|
-
gap: 3px;
|
|
2725
|
-
}
|
|
2566
|
+
.view-item { display: flex; flex-direction: column; gap: 3px; }
|
|
2726
2567
|
|
|
2727
2568
|
.view-item label {
|
|
2728
2569
|
font-size: 11px;
|
|
@@ -2732,10 +2573,7 @@ select.form-control {
|
|
|
2732
2573
|
color: #6c757d;
|
|
2733
2574
|
}
|
|
2734
2575
|
|
|
2735
|
-
.view-item span {
|
|
2736
|
-
font-size: 14px;
|
|
2737
|
-
color: #212529;
|
|
2738
|
-
}
|
|
2576
|
+
.view-item span { font-size: 14px; color: #212529; }
|
|
2739
2577
|
|
|
2740
2578
|
.ref-mono {
|
|
2741
2579
|
font-family: monospace;
|
|
@@ -2744,9 +2582,7 @@ select.form-control {
|
|
|
2744
2582
|
font-weight: 700;
|
|
2745
2583
|
}
|
|
2746
2584
|
|
|
2747
|
-
.view-section {
|
|
2748
|
-
margin-bottom: 18px;
|
|
2749
|
-
}
|
|
2585
|
+
.view-section { margin-bottom: 18px; }
|
|
2750
2586
|
|
|
2751
2587
|
.view-section label {
|
|
2752
2588
|
font-size: 12px;
|
|
@@ -2782,99 +2618,26 @@ select.form-control {
|
|
|
2782
2618
|
gap: 6px;
|
|
2783
2619
|
}
|
|
2784
2620
|
|
|
2785
|
-
.btn:disabled {
|
|
2786
|
-
|
|
2787
|
-
|
|
2788
|
-
}
|
|
2789
|
-
|
|
2790
|
-
.btn-
|
|
2791
|
-
|
|
2792
|
-
|
|
2793
|
-
}
|
|
2794
|
-
|
|
2795
|
-
.btn-
|
|
2796
|
-
|
|
2797
|
-
}
|
|
2798
|
-
|
|
2799
|
-
.btn-
|
|
2800
|
-
|
|
2801
|
-
|
|
2802
|
-
}
|
|
2803
|
-
|
|
2804
|
-
.btn-success:hover:not(:disabled) {
|
|
2805
|
-
background: #218838;
|
|
2806
|
-
}
|
|
2807
|
-
|
|
2808
|
-
.btn-secondary {
|
|
2809
|
-
background: #6c757d;
|
|
2810
|
-
color: #fff;
|
|
2811
|
-
}
|
|
2812
|
-
|
|
2813
|
-
.btn-secondary:hover:not(:disabled) {
|
|
2814
|
-
background: #5a6268;
|
|
2815
|
-
}
|
|
2816
|
-
|
|
2817
|
-
.btn-danger {
|
|
2818
|
-
background: #dc3545;
|
|
2819
|
-
color: #fff;
|
|
2820
|
-
}
|
|
2821
|
-
|
|
2822
|
-
.btn-danger:hover:not(:disabled) {
|
|
2823
|
-
background: #c82333;
|
|
2824
|
-
}
|
|
2825
|
-
|
|
2826
|
-
.btn-warning {
|
|
2827
|
-
background: #f0ad4e;
|
|
2828
|
-
color: #664d03;
|
|
2829
|
-
}
|
|
2830
|
-
|
|
2831
|
-
.btn-warning:hover {
|
|
2832
|
-
background: #e0972e;
|
|
2833
|
-
}
|
|
2834
|
-
|
|
2835
|
-
.btn-outline-primary {
|
|
2836
|
-
background: transparent;
|
|
2837
|
-
border: 1.5px solid #2a5298;
|
|
2838
|
-
color: #2a5298;
|
|
2839
|
-
}
|
|
2840
|
-
|
|
2841
|
-
.btn-outline-primary:hover:not(:disabled) {
|
|
2842
|
-
background: #2a5298;
|
|
2843
|
-
color: #fff;
|
|
2844
|
-
}
|
|
2845
|
-
|
|
2846
|
-
.btn-outline-secondary {
|
|
2847
|
-
background: transparent;
|
|
2848
|
-
border: 1.5px solid #6c757d;
|
|
2849
|
-
color: #6c757d;
|
|
2850
|
-
}
|
|
2851
|
-
|
|
2852
|
-
.btn-outline-secondary:hover:not(:disabled) {
|
|
2853
|
-
background: #6c757d;
|
|
2854
|
-
color: #fff;
|
|
2855
|
-
}
|
|
2856
|
-
|
|
2857
|
-
.btn-link {
|
|
2858
|
-
background: none;
|
|
2859
|
-
border: none;
|
|
2860
|
-
padding: 0;
|
|
2861
|
-
font-size: 13px;
|
|
2862
|
-
text-decoration: none;
|
|
2863
|
-
cursor: pointer;
|
|
2864
|
-
}
|
|
2865
|
-
|
|
2866
|
-
.btn-sm {
|
|
2867
|
-
padding: 5px 12px;
|
|
2868
|
-
font-size: 12px;
|
|
2869
|
-
}
|
|
2621
|
+
.btn:disabled { opacity: .6; cursor: not-allowed; }
|
|
2622
|
+
.btn-primary { background: #2a5298; color: #fff; }
|
|
2623
|
+
.btn-primary:hover:not(:disabled) { background: #1e3c72; }
|
|
2624
|
+
.btn-success { background: #28a745; color: #fff; }
|
|
2625
|
+
.btn-success:hover:not(:disabled) { background: #218838; }
|
|
2626
|
+
.btn-secondary { background: #6c757d; color: #fff; }
|
|
2627
|
+
.btn-secondary:hover:not(:disabled) { background: #5a6268; }
|
|
2628
|
+
.btn-danger { background: #dc3545; color: #fff; }
|
|
2629
|
+
.btn-danger:hover:not(:disabled) { background: #c82333; }
|
|
2630
|
+
.btn-warning { background: #f0ad4e; color: #664d03; }
|
|
2631
|
+
.btn-warning:hover { background: #e0972e; }
|
|
2632
|
+
.btn-outline-primary { background: transparent; border: 1.5px solid #2a5298; color: #2a5298; }
|
|
2633
|
+
.btn-outline-primary:hover:not(:disabled) { background: #2a5298; color: #fff; }
|
|
2634
|
+
.btn-outline-secondary { background: transparent; border: 1.5px solid #6c757d; color: #6c757d; }
|
|
2635
|
+
.btn-outline-secondary:hover:not(:disabled) { background: #6c757d; color: #fff; }
|
|
2636
|
+
.btn-link { background: none; border: none; padding: 0; font-size: 13px; text-decoration: none; cursor: pointer; }
|
|
2637
|
+
.btn-sm { padding: 5px 12px; font-size: 12px; }
|
|
2870
2638
|
|
|
2871
2639
|
/* ─── Loading / Spinners ─── */
|
|
2872
|
-
.loading-container {
|
|
2873
|
-
display: flex;
|
|
2874
|
-
flex-direction: column;
|
|
2875
|
-
align-items: center;
|
|
2876
|
-
padding: 40px 20px;
|
|
2877
|
-
}
|
|
2640
|
+
.loading-container { display: flex; flex-direction: column; align-items: center; padding: 40px 20px; }
|
|
2878
2641
|
|
|
2879
2642
|
.spinner {
|
|
2880
2643
|
border: 4px solid #f3f3f3;
|
|
@@ -2906,96 +2669,30 @@ select.form-control {
|
|
|
2906
2669
|
animation: spin .7s linear infinite;
|
|
2907
2670
|
}
|
|
2908
2671
|
|
|
2909
|
-
@keyframes spin {
|
|
2910
|
-
to {
|
|
2911
|
-
transform: rotate(360deg);
|
|
2912
|
-
}
|
|
2913
|
-
}
|
|
2672
|
+
@keyframes spin { to { transform: rotate(360deg); } }
|
|
2914
2673
|
|
|
2915
2674
|
/* ─── Utilities ─── */
|
|
2916
|
-
.fw-bold {
|
|
2917
|
-
|
|
2918
|
-
}
|
|
2919
|
-
|
|
2920
|
-
.
|
|
2921
|
-
|
|
2922
|
-
}
|
|
2923
|
-
|
|
2924
|
-
.
|
|
2925
|
-
|
|
2926
|
-
}
|
|
2927
|
-
|
|
2928
|
-
.
|
|
2929
|
-
|
|
2930
|
-
}
|
|
2931
|
-
|
|
2932
|
-
.
|
|
2933
|
-
|
|
2934
|
-
}
|
|
2935
|
-
|
|
2936
|
-
.
|
|
2937
|
-
margin-left: 4px;
|
|
2938
|
-
}
|
|
2939
|
-
|
|
2940
|
-
.ms-2 {
|
|
2941
|
-
margin-left: 8px;
|
|
2942
|
-
}
|
|
2943
|
-
|
|
2944
|
-
.mt-2 {
|
|
2945
|
-
margin-top: 8px;
|
|
2946
|
-
}
|
|
2947
|
-
|
|
2948
|
-
.mt-3 {
|
|
2949
|
-
margin-top: 16px;
|
|
2950
|
-
}
|
|
2951
|
-
|
|
2952
|
-
.mt-4 {
|
|
2953
|
-
margin-top: 24px;
|
|
2954
|
-
}
|
|
2955
|
-
|
|
2956
|
-
.mb-0 {
|
|
2957
|
-
margin-bottom: 0;
|
|
2958
|
-
}
|
|
2959
|
-
|
|
2960
|
-
.text-muted {
|
|
2961
|
-
color: #6c757d !important;
|
|
2962
|
-
}
|
|
2963
|
-
|
|
2964
|
-
.text-danger {
|
|
2965
|
-
color: #dc3545 !important;
|
|
2966
|
-
}
|
|
2967
|
-
|
|
2968
|
-
.text-success {
|
|
2969
|
-
color: #28a745 !important;
|
|
2970
|
-
}
|
|
2971
|
-
|
|
2972
|
-
.text-primary {
|
|
2973
|
-
color: #2a5298 !important;
|
|
2974
|
-
}
|
|
2975
|
-
|
|
2976
|
-
.text-warning {
|
|
2977
|
-
color: #f0ad4e !important;
|
|
2978
|
-
}
|
|
2979
|
-
|
|
2980
|
-
.d-flex {
|
|
2981
|
-
display: flex;
|
|
2982
|
-
}
|
|
2983
|
-
|
|
2984
|
-
.gap-2 {
|
|
2985
|
-
gap: 8px;
|
|
2986
|
-
}
|
|
2987
|
-
|
|
2988
|
-
.justify-content-between {
|
|
2989
|
-
justify-content: space-between;
|
|
2990
|
-
}
|
|
2991
|
-
|
|
2992
|
-
.text-center {
|
|
2993
|
-
text-align: center;
|
|
2994
|
-
}
|
|
2995
|
-
|
|
2996
|
-
.empty-state {
|
|
2997
|
-
padding: 60px 20px;
|
|
2998
|
-
}
|
|
2675
|
+
.fw-bold { font-weight: 700; }
|
|
2676
|
+
.fw-semibold { font-weight: 600; }
|
|
2677
|
+
.me-1 { margin-right: 4px; }
|
|
2678
|
+
.me-2 { margin-right: 8px; }
|
|
2679
|
+
.me-auto { margin-right: auto; }
|
|
2680
|
+
.ms-1 { margin-left: 4px; }
|
|
2681
|
+
.ms-2 { margin-left: 8px; }
|
|
2682
|
+
.mt-2 { margin-top: 8px; }
|
|
2683
|
+
.mt-3 { margin-top: 16px; }
|
|
2684
|
+
.mt-4 { margin-top: 24px; }
|
|
2685
|
+
.mb-0 { margin-bottom: 0; }
|
|
2686
|
+
.text-muted { color: #6c757d !important; }
|
|
2687
|
+
.text-danger { color: #dc3545 !important; }
|
|
2688
|
+
.text-success { color: #28a745 !important; }
|
|
2689
|
+
.text-primary { color: #2a5298 !important; }
|
|
2690
|
+
.text-warning { color: #f0ad4e !important; }
|
|
2691
|
+
.d-flex { display: flex; }
|
|
2692
|
+
.gap-2 { gap: 8px; }
|
|
2693
|
+
.justify-content-between { justify-content: space-between; }
|
|
2694
|
+
.text-center { text-align: center; }
|
|
2695
|
+
.empty-state { padding: 60px 20px; }
|
|
2999
2696
|
|
|
3000
2697
|
/* ─── Incident Fields Box ─── */
|
|
3001
2698
|
.incident-fields-box {
|
|
@@ -3019,12 +2716,7 @@ select.form-control {
|
|
|
3019
2716
|
gap: 6px;
|
|
3020
2717
|
}
|
|
3021
2718
|
|
|
3022
|
-
.field-hint {
|
|
3023
|
-
font-size: 11px;
|
|
3024
|
-
color: #adb5bd;
|
|
3025
|
-
margin-bottom: 4px;
|
|
3026
|
-
margin-top: -2px;
|
|
3027
|
-
}
|
|
2719
|
+
.field-hint { font-size: 11px; color: #adb5bd; margin-bottom: 4px; margin-top: -2px; }
|
|
3028
2720
|
|
|
3029
2721
|
/* ─── Drill Checklist ─── */
|
|
3030
2722
|
.drill-checklist-box {
|
|
@@ -3045,18 +2737,9 @@ select.form-control {
|
|
|
3045
2737
|
gap: 6px;
|
|
3046
2738
|
}
|
|
3047
2739
|
|
|
3048
|
-
.checklist-hint {
|
|
3049
|
-
font-size: 11px;
|
|
3050
|
-
font-weight: 400;
|
|
3051
|
-
color: #adb5bd;
|
|
3052
|
-
margin-left: 4px;
|
|
3053
|
-
}
|
|
2740
|
+
.checklist-hint { font-size: 11px; font-weight: 400; color: #adb5bd; margin-left: 4px; }
|
|
3054
2741
|
|
|
3055
|
-
.checklist-grid {
|
|
3056
|
-
display: flex;
|
|
3057
|
-
flex-direction: column;
|
|
3058
|
-
gap: 6px;
|
|
3059
|
-
}
|
|
2742
|
+
.checklist-grid { display: flex; flex-direction: column; gap: 6px; }
|
|
3060
2743
|
|
|
3061
2744
|
.checklist-item {
|
|
3062
2745
|
display: flex;
|
|
@@ -3071,19 +2754,10 @@ select.form-control {
|
|
|
3071
2754
|
user-select: none;
|
|
3072
2755
|
}
|
|
3073
2756
|
|
|
3074
|
-
.checklist-item:hover {
|
|
3075
|
-
|
|
3076
|
-
background: #f5f8ff;
|
|
3077
|
-
}
|
|
2757
|
+
.checklist-item:hover { border-color: #2a5298; background: #f5f8ff; }
|
|
2758
|
+
.checklist-item.checked { border-color: #28a745; background: #f0fff4; }
|
|
3078
2759
|
|
|
3079
|
-
.checklist-
|
|
3080
|
-
border-color: #28a745;
|
|
3081
|
-
background: #f0fff4;
|
|
3082
|
-
}
|
|
3083
|
-
|
|
3084
|
-
.checklist-checkbox input[type="checkbox"] {
|
|
3085
|
-
display: none;
|
|
3086
|
-
}
|
|
2760
|
+
.checklist-checkbox input[type="checkbox"] { display: none; }
|
|
3087
2761
|
|
|
3088
2762
|
.custom-check {
|
|
3089
2763
|
width: 22px;
|
|
@@ -3098,23 +2772,10 @@ select.form-control {
|
|
|
3098
2772
|
transition: all .18s;
|
|
3099
2773
|
}
|
|
3100
2774
|
|
|
3101
|
-
.checklist-item.checked .custom-check {
|
|
3102
|
-
|
|
3103
|
-
border-color: #28a745;
|
|
3104
|
-
color: #fff;
|
|
3105
|
-
}
|
|
2775
|
+
.checklist-item.checked .custom-check { background: #28a745; border-color: #28a745; color: #fff; }
|
|
2776
|
+
.checklist-item:not(.checked) .custom-check { background: #fff8f8; border-color: #dc3545; color: #dc3545; }
|
|
3106
2777
|
|
|
3107
|
-
.checklist-
|
|
3108
|
-
background: #fff8f8;
|
|
3109
|
-
border-color: #dc3545;
|
|
3110
|
-
color: #dc3545;
|
|
3111
|
-
}
|
|
3112
|
-
|
|
3113
|
-
.checklist-q {
|
|
3114
|
-
flex: 1;
|
|
3115
|
-
font-size: 13px;
|
|
3116
|
-
color: #212529;
|
|
3117
|
-
}
|
|
2778
|
+
.checklist-q { flex: 1; font-size: 13px; color: #212529; }
|
|
3118
2779
|
|
|
3119
2780
|
.checklist-answer {
|
|
3120
2781
|
font-size: 10px;
|
|
@@ -3124,46 +2785,16 @@ select.form-control {
|
|
|
3124
2785
|
flex-shrink: 0;
|
|
3125
2786
|
}
|
|
3126
2787
|
|
|
3127
|
-
.answer-yes {
|
|
3128
|
-
|
|
3129
|
-
color: #155724;
|
|
3130
|
-
}
|
|
3131
|
-
|
|
3132
|
-
.answer-no {
|
|
3133
|
-
background: #f8d7da;
|
|
3134
|
-
color: #721c24;
|
|
3135
|
-
}
|
|
2788
|
+
.answer-yes { background: #d4edda; color: #155724; }
|
|
2789
|
+
.answer-no { background: #f8d7da; color: #721c24; }
|
|
3136
2790
|
|
|
3137
2791
|
@media (max-width: 640px) {
|
|
3138
|
-
.input-row {
|
|
3139
|
-
|
|
3140
|
-
}
|
|
3141
|
-
|
|
3142
|
-
.
|
|
3143
|
-
|
|
3144
|
-
}
|
|
3145
|
-
|
|
3146
|
-
.btn {
|
|
3147
|
-
padding: 8px 12px;
|
|
3148
|
-
font-size: 12px;
|
|
3149
|
-
}
|
|
3150
|
-
|
|
3151
|
-
.tab-btn {
|
|
3152
|
-
padding: 8px 10px;
|
|
3153
|
-
font-size: 12px;
|
|
3154
|
-
}
|
|
3155
|
-
|
|
3156
|
-
.modal-type-toggle {
|
|
3157
|
-
display: none;
|
|
3158
|
-
}
|
|
3159
|
-
|
|
3160
|
-
.rc-folder-pill {
|
|
3161
|
-
display: none;
|
|
3162
|
-
}
|
|
3163
|
-
|
|
3164
|
-
.af-header {
|
|
3165
|
-
padding: 12px 14px;
|
|
3166
|
-
gap: 10px;
|
|
3167
|
-
}
|
|
2792
|
+
.input-row { grid-template-columns: 1fr; }
|
|
2793
|
+
.btn-group-split { gap: 5px; }
|
|
2794
|
+
.btn { padding: 8px 12px; font-size: 12px; }
|
|
2795
|
+
.tab-btn { padding: 8px 10px; font-size: 12px; }
|
|
2796
|
+
.modal-type-toggle { display: none; }
|
|
2797
|
+
.rc-folder-pill { display: none; }
|
|
2798
|
+
.af-header { padding: 12px 14px; gap: 10px; }
|
|
3168
2799
|
}
|
|
3169
2800
|
</style>
|