@7365admin1/layer-common 3.2.2-staging.116 → 3.2.2-staging.120
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/components/AddPassKeyToVisitor.vue +95 -73
- package/components/BulletinBoardView.vue +9 -6
- package/components/CameraMain.vue +35 -47
- package/components/DeliveryCompany.vue +34 -20
- package/components/IncidentReport/Authorities.vue +30 -18
- package/components/MemberInformation.vue +23 -16
- package/components/NotificationSettings.vue +66 -54
- package/components/OnlineFormsConfiguration.vue +41 -42
- package/components/OvernightParkingAvailability.vue +49 -26
- package/components/ScanVisitorQRCode.vue +64 -28
- package/components/SearchVehicleNumberUser.vue +39 -37
- package/components/SiteSettings.vue +4 -1
- package/components/VehicleAddSelection.vue +48 -32
- package/components/VehicleForm.vue +112 -129
- package/components/VehicleUpdateMoreAction.vue +59 -46
- package/components/VisitorDataFromScannedQRCodeForm.vue +90 -65
- package/components/VisitorFormSelection.vue +40 -37
- package/components/VisitorPassKeyQRScanner.vue +65 -18
- package/components/VisitorSocketPopUp.vue +21 -13
- package/components/VisitorsReportPreview.vue +41 -29
- package/package.json +1 -1
|
@@ -1,36 +1,24 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<v-card width="100%">
|
|
3
|
-
<v-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
tile
|
|
23
|
-
block
|
|
24
|
-
variant="text"
|
|
25
|
-
class="text-none"
|
|
26
|
-
size="48"
|
|
27
|
-
@click="cancel"
|
|
28
|
-
>
|
|
29
|
-
Cancel
|
|
30
|
-
</v-btn>
|
|
31
|
-
</v-col>
|
|
32
|
-
</v-row>
|
|
33
|
-
</v-toolbar>
|
|
2
|
+
<v-card width="100%" class="screen-modal vehicle-add">
|
|
3
|
+
<v-card-title>Add Vehicle</v-card-title>
|
|
4
|
+
|
|
5
|
+
<div class="screen-modal__body vehicle-add__body">
|
|
6
|
+
<p class="vehicle-add__hint">Please Select Status</p>
|
|
7
|
+
<AppButton
|
|
8
|
+
v-for="item in selection"
|
|
9
|
+
:key="item.value"
|
|
10
|
+
class="vehicle-add__option"
|
|
11
|
+
@click="select(item.value)"
|
|
12
|
+
>
|
|
13
|
+
{{ item.label }}
|
|
14
|
+
</AppButton>
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
<div class="vehicle-add__footer">
|
|
18
|
+
<AppButton variant="ghost" class="vehicle-add__cancel" @click="cancel">
|
|
19
|
+
Cancel
|
|
20
|
+
</AppButton>
|
|
21
|
+
</div>
|
|
34
22
|
</v-card>
|
|
35
23
|
</template>
|
|
36
24
|
|
|
@@ -56,3 +44,31 @@ function select(value: TVehicleType | 'seasonpass') {
|
|
|
56
44
|
emit("select", value);
|
|
57
45
|
}
|
|
58
46
|
</script>
|
|
47
|
+
|
|
48
|
+
<style scoped>
|
|
49
|
+
/* The three choices are full-width by the screen's own design, so the only
|
|
50
|
+
thing said here is the width and the stack - the button itself is AppButton. */
|
|
51
|
+
.vehicle-add__body {
|
|
52
|
+
padding: 20px;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.vehicle-add__hint {
|
|
56
|
+
margin: 0 0 14px;
|
|
57
|
+
text-align: center;
|
|
58
|
+
font-size: var(--fs-cell);
|
|
59
|
+
color: var(--muted);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.vehicle-add__option {
|
|
63
|
+
display: flex;
|
|
64
|
+
width: 100%;
|
|
65
|
+
margin-bottom: 10px;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.vehicle-add__footer {
|
|
69
|
+
display: flex;
|
|
70
|
+
justify-content: flex-end;
|
|
71
|
+
gap: 8px;
|
|
72
|
+
padding: 0 20px 20px;
|
|
73
|
+
}
|
|
74
|
+
</style>
|
|
@@ -1,24 +1,19 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<v-card width="100%" :loading="processing">
|
|
3
|
-
<
|
|
4
|
-
<v-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
<v-card-text style="max-height: 100vh; overflow-y: auto" class="pa-5 my-3">
|
|
19
|
-
<span class="text-subtitle-1 w-100 font-weight-bold mb-3"
|
|
20
|
-
>General Information</span
|
|
21
|
-
>
|
|
2
|
+
<v-card width="100%" class="screen-modal vehicle-form" :loading="processing">
|
|
3
|
+
<div class="vehicle-form__head">
|
|
4
|
+
<v-card-title class="text-capitalize">
|
|
5
|
+
{{ prop.mode }} Vehicle ({{ formatVehicleType(type) }})
|
|
6
|
+
</v-card-title>
|
|
7
|
+
<AppButton
|
|
8
|
+
variant="icon"
|
|
9
|
+
icon="mdi-close"
|
|
10
|
+
aria-label="Close"
|
|
11
|
+
@click="emit('close:all')"
|
|
12
|
+
/>
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
<div class="screen-modal__body vehicle-form__body filter-field">
|
|
16
|
+
<span class="vehicle-form__section">General Information</span>
|
|
22
17
|
<v-form
|
|
23
18
|
ref="formRef"
|
|
24
19
|
v-model="validForm"
|
|
@@ -209,24 +204,20 @@
|
|
|
209
204
|
:cols="newPlateNumbers.length > 1 ? '1' : '0'"
|
|
210
205
|
class="d-flex align-start"
|
|
211
206
|
>
|
|
212
|
-
<
|
|
213
|
-
icon="mdi-delete-outline"
|
|
214
|
-
variant="text"
|
|
215
|
-
color="error"
|
|
207
|
+
<AppButton
|
|
216
208
|
v-if="newPlateNumbers.length > 1"
|
|
209
|
+
variant="icon"
|
|
210
|
+
icon="mdi-delete-outline"
|
|
211
|
+
class="vehicle-form__remove"
|
|
212
|
+
:aria-label="`Remove plate ${index + 1}`"
|
|
217
213
|
@click="removePlate(index)"
|
|
218
214
|
/>
|
|
219
215
|
</v-col>
|
|
220
216
|
</v-row>
|
|
221
217
|
|
|
222
|
-
<
|
|
223
|
-
prepend-icon="mdi-plus"
|
|
224
|
-
variant="outlined"
|
|
225
|
-
class="text-none"
|
|
226
|
-
@click="addPlate"
|
|
227
|
-
>
|
|
218
|
+
<AppButton variant="ghost" icon="mdi-plus" @click="addPlate">
|
|
228
219
|
Add Plate
|
|
229
|
-
</
|
|
220
|
+
</AppButton>
|
|
230
221
|
</template>
|
|
231
222
|
</template>
|
|
232
223
|
|
|
@@ -300,21 +291,19 @@
|
|
|
300
291
|
|
|
301
292
|
<v-col cols="12" :class="[showSubscriptionDateOptions && 'mt-5']">
|
|
302
293
|
<v-row justify="center">
|
|
303
|
-
<v-col cols="6">
|
|
304
|
-
<
|
|
305
|
-
|
|
306
|
-
color="primary"
|
|
307
|
-
variant="text"
|
|
308
|
-
class="text-none font-weight-bold"
|
|
309
|
-
:text="
|
|
310
|
-
showSubscriptionDateOptions
|
|
311
|
-
? 'Hide Subscription Options'
|
|
312
|
-
: 'Show Subscription Options'
|
|
313
|
-
"
|
|
294
|
+
<v-col cols="6" class="d-flex justify-center">
|
|
295
|
+
<AppButton
|
|
296
|
+
variant="ghost"
|
|
314
297
|
@click="
|
|
315
298
|
showSubscriptionDateOptions = !showSubscriptionDateOptions
|
|
316
299
|
"
|
|
317
|
-
|
|
300
|
+
>
|
|
301
|
+
{{
|
|
302
|
+
showSubscriptionDateOptions
|
|
303
|
+
? "Hide Subscription Options"
|
|
304
|
+
: "Show Subscription Options"
|
|
305
|
+
}}
|
|
306
|
+
</AppButton>
|
|
318
307
|
</v-col>
|
|
319
308
|
</v-row>
|
|
320
309
|
</v-col>
|
|
@@ -323,82 +312,41 @@
|
|
|
323
312
|
<v-col cols="12">
|
|
324
313
|
<v-row no-gutters>
|
|
325
314
|
<v-col cols="12" class="text-center">
|
|
326
|
-
<span
|
|
327
|
-
class="text-none text-subtitle-2 font-weight-medium text-error"
|
|
328
|
-
>
|
|
329
|
-
{{ message }}
|
|
330
|
-
</span>
|
|
315
|
+
<span class="vehicle-form__error">{{ message }}</span>
|
|
331
316
|
</v-col>
|
|
332
317
|
</v-row>
|
|
333
318
|
</v-col>
|
|
334
319
|
</v-row>
|
|
335
320
|
</v-form>
|
|
336
|
-
</
|
|
337
|
-
<v-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
variant="text"
|
|
350
|
-
class="text-none"
|
|
351
|
-
size="48"
|
|
352
|
-
@click="back"
|
|
353
|
-
text="Back to Selection"
|
|
354
|
-
/>
|
|
355
|
-
<v-btn
|
|
356
|
-
v-else
|
|
357
|
-
tile
|
|
358
|
-
block
|
|
359
|
-
variant="text"
|
|
360
|
-
class="text-none"
|
|
361
|
-
size="48"
|
|
362
|
-
@click="close"
|
|
363
|
-
text="Close"
|
|
364
|
-
/>
|
|
365
|
-
</v-col>
|
|
366
|
-
<v-col cols="6">
|
|
367
|
-
<v-btn
|
|
368
|
-
tile
|
|
369
|
-
block
|
|
370
|
-
variant="flat"
|
|
371
|
-
color="black"
|
|
372
|
-
class="text-none"
|
|
373
|
-
size="48"
|
|
374
|
-
:disabled="!validForm || processing"
|
|
375
|
-
@click="submit"
|
|
376
|
-
:text="prop.mode == 'add' ? 'Submit' : 'Update'"
|
|
377
|
-
/>
|
|
378
|
-
</v-col>
|
|
379
|
-
</v-row>
|
|
380
|
-
</v-toolbar>
|
|
321
|
+
</div>
|
|
322
|
+
<p v-if="errorMessage" class="vehicle-form__error vehicle-form__error--block">
|
|
323
|
+
{{ errorMessage }}
|
|
324
|
+
</p>
|
|
325
|
+
<div class="vehicle-form__footer">
|
|
326
|
+
<AppButton v-if="prop.mode === 'add'" variant="ghost" @click="back">
|
|
327
|
+
Back to Selection
|
|
328
|
+
</AppButton>
|
|
329
|
+
<AppButton v-else variant="ghost" @click="close">Close</AppButton>
|
|
330
|
+
<AppButton :disabled="!validForm || processing" @click="submit">
|
|
331
|
+
{{ prop.mode == "add" ? "Submit" : "Update" }}
|
|
332
|
+
</AppButton>
|
|
333
|
+
</div>
|
|
381
334
|
|
|
382
335
|
<v-dialog v-model="showMatchingPeopleDialog" max-width="700" persistent>
|
|
383
|
-
<v-card :loading="checkingUnit">
|
|
384
|
-
<
|
|
385
|
-
<v-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
/>
|
|
396
|
-
</span>
|
|
397
|
-
</v-row>
|
|
398
|
-
</v-toolbar-title>
|
|
399
|
-
</v-toolbar>
|
|
336
|
+
<v-card class="screen-modal vehicle-match" :loading="checkingUnit">
|
|
337
|
+
<div class="vehicle-form__head">
|
|
338
|
+
<v-card-title>
|
|
339
|
+
Matching Records for "{{ searchUnitName ?? "-" }}"
|
|
340
|
+
</v-card-title>
|
|
341
|
+
<AppButton
|
|
342
|
+
variant="icon"
|
|
343
|
+
icon="mdi-close"
|
|
344
|
+
aria-label="Close"
|
|
345
|
+
@click="handleCloseMatchDialog"
|
|
346
|
+
/>
|
|
347
|
+
</div>
|
|
400
348
|
|
|
401
|
-
<
|
|
349
|
+
<div class="screen-modal__body vehicle-match__body">
|
|
402
350
|
<v-list lines="three">
|
|
403
351
|
<v-list-item
|
|
404
352
|
v-if="matchingPeople.length > 0 || checkingUnit"
|
|
@@ -414,24 +362,19 @@
|
|
|
414
362
|
NRIC: {{ v.nric || "-" }}
|
|
415
363
|
</v-list-item-subtitle>
|
|
416
364
|
|
|
417
|
-
<div class="mt-1">
|
|
418
|
-
<
|
|
365
|
+
<div class="mt-1 d-flex flex-wrap ga-1">
|
|
366
|
+
<StatusChip
|
|
419
367
|
v-for="p in v.plates"
|
|
420
368
|
:key="p?.plateNumber"
|
|
421
|
-
|
|
422
|
-
|
|
369
|
+
tone="neutral"
|
|
370
|
+
:dot="false"
|
|
423
371
|
>
|
|
424
372
|
{{ p?.plateNumber }}
|
|
425
|
-
</
|
|
373
|
+
</StatusChip>
|
|
426
374
|
</div>
|
|
427
375
|
|
|
428
376
|
<template #append>
|
|
429
|
-
<v
|
|
430
|
-
variant="flat"
|
|
431
|
-
color="primary"
|
|
432
|
-
@click="selectPeopleRecord(v)"
|
|
433
|
-
>Select</v-btn
|
|
434
|
-
>
|
|
377
|
+
<AppButton @click="selectPeopleRecord(v)">Select</AppButton>
|
|
435
378
|
</template>
|
|
436
379
|
</v-list-item>
|
|
437
380
|
<v-empty-state
|
|
@@ -441,16 +384,13 @@
|
|
|
441
384
|
subtitle="The NRIC you entered does not match any existing records."
|
|
442
385
|
>
|
|
443
386
|
<template #actions>
|
|
444
|
-
<
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
@click="showMatchingPeopleDialog = false"
|
|
448
|
-
>Close</v-btn
|
|
449
|
-
>
|
|
387
|
+
<AppButton @click="showMatchingPeopleDialog = false">
|
|
388
|
+
Close
|
|
389
|
+
</AppButton>
|
|
450
390
|
</template>
|
|
451
391
|
</v-empty-state>
|
|
452
392
|
</v-list>
|
|
453
|
-
</
|
|
393
|
+
</div>
|
|
454
394
|
</v-card>
|
|
455
395
|
</v-dialog>
|
|
456
396
|
</v-card>
|
|
@@ -1123,4 +1063,47 @@ onMounted(() => {
|
|
|
1123
1063
|
.class-readonly {
|
|
1124
1064
|
pointer-events: none;
|
|
1125
1065
|
}
|
|
1066
|
+
|
|
1067
|
+
.vehicle-form__head {
|
|
1068
|
+
display: flex;
|
|
1069
|
+
align-items: center;
|
|
1070
|
+
justify-content: space-between;
|
|
1071
|
+
padding-right: 12px;
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
.vehicle-form__body,
|
|
1075
|
+
.vehicle-match__body {
|
|
1076
|
+
padding: 4px 20px 0;
|
|
1077
|
+
}
|
|
1078
|
+
|
|
1079
|
+
.vehicle-form__section {
|
|
1080
|
+
display: block;
|
|
1081
|
+
margin-bottom: 4px;
|
|
1082
|
+
font-size: var(--fs-cell);
|
|
1083
|
+
font-weight: 800;
|
|
1084
|
+
color: var(--text);
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
.vehicle-form__remove {
|
|
1088
|
+
color: var(--err);
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
.vehicle-form__error {
|
|
1092
|
+
font-size: var(--fs-cell);
|
|
1093
|
+
font-weight: 500;
|
|
1094
|
+
color: var(--err);
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
.vehicle-form__error--block {
|
|
1098
|
+
width: 100%;
|
|
1099
|
+
margin: 0;
|
|
1100
|
+
text-align: center;
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
.vehicle-form__footer {
|
|
1104
|
+
display: flex;
|
|
1105
|
+
justify-content: flex-end;
|
|
1106
|
+
gap: 8px;
|
|
1107
|
+
padding: 16px 20px 20px;
|
|
1108
|
+
}
|
|
1126
1109
|
</style>
|
|
@@ -1,55 +1,37 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<v-card width="100%">
|
|
3
|
-
<v-
|
|
4
|
-
<
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
<template v-else>
|
|
8
|
-
<v-row no-gutters class="fill-height px-6" align="center">
|
|
9
|
-
<span class="font-weight-bold text-h5 text-capitalize">{{
|
|
10
|
-
title
|
|
11
|
-
}}</span>
|
|
12
|
-
</v-row>
|
|
13
|
-
</template>
|
|
14
|
-
</v-toolbar>
|
|
2
|
+
<v-card width="100%" class="screen-modal more-action">
|
|
3
|
+
<template v-if="$slots.header">
|
|
4
|
+
<slot name="header" :title="title" :onClose="onClose" />
|
|
5
|
+
</template>
|
|
6
|
+
<v-card-title v-else class="text-capitalize">{{ title }}</v-card-title>
|
|
15
7
|
|
|
16
|
-
<
|
|
8
|
+
<div class="screen-modal__body more-action__body">
|
|
17
9
|
<slot name="content" />
|
|
18
|
-
</
|
|
10
|
+
</div>
|
|
19
11
|
|
|
20
|
-
<
|
|
21
|
-
<
|
|
22
|
-
<v-col :cols="canDelete || canUpdate ? 6 : 12" class="pa-0">
|
|
23
|
-
<v-btn block variant="text" class="text-none" size="large" @click="emit('close')" height="48">
|
|
24
|
-
Close
|
|
25
|
-
</v-btn>
|
|
26
|
-
</v-col>
|
|
12
|
+
<div class="more-action__footer">
|
|
13
|
+
<AppButton variant="ghost" @click="emit('close')">Close</AppButton>
|
|
27
14
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
More actions
|
|
33
|
-
</v-btn>
|
|
34
|
-
</template>
|
|
15
|
+
<v-menu v-if="canDelete || canUpdate">
|
|
16
|
+
<template #activator="{ props }">
|
|
17
|
+
<AppButton v-bind="props">More actions</AppButton>
|
|
18
|
+
</template>
|
|
35
19
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
20
|
+
<v-list class="more-action__menu">
|
|
21
|
+
<v-list-item v-if="canUpdate" @click="emit('edit')">
|
|
22
|
+
<v-list-item-title class="more-action__item">
|
|
23
|
+
{{ editButtonLabel }}
|
|
24
|
+
</v-list-item-title>
|
|
25
|
+
</v-list-item>
|
|
42
26
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
</v-row>
|
|
52
|
-
</v-toolbar>
|
|
27
|
+
<v-list-item v-if="canDelete" @click="emit('delete')">
|
|
28
|
+
<v-list-item-title class="more-action__item more-action__item--danger">
|
|
29
|
+
{{ deleteButtonLabel }}
|
|
30
|
+
</v-list-item-title>
|
|
31
|
+
</v-list-item>
|
|
32
|
+
</v-list>
|
|
33
|
+
</v-menu>
|
|
34
|
+
</div>
|
|
53
35
|
</v-card>
|
|
54
36
|
</template>
|
|
55
37
|
|
|
@@ -81,4 +63,35 @@ const emit = defineEmits(["close", "edit", "delete"]);
|
|
|
81
63
|
const { canUpdate, editButtonLabel, deleteButtonLabel, title } = prop;
|
|
82
64
|
</script>
|
|
83
65
|
|
|
84
|
-
<style scoped
|
|
66
|
+
<style scoped>
|
|
67
|
+
.more-action__body {
|
|
68
|
+
padding: 4px 20px;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.more-action__footer {
|
|
72
|
+
display: flex;
|
|
73
|
+
justify-content: flex-end;
|
|
74
|
+
gap: 8px;
|
|
75
|
+
padding: 16px 20px 20px;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* The dropdown is teleported out of the card, so it needs the card's own
|
|
79
|
+
surface and rule said again rather than inheriting Vuetify's grey sheet. */
|
|
80
|
+
.more-action__menu {
|
|
81
|
+
padding: 4px 0;
|
|
82
|
+
background: var(--card);
|
|
83
|
+
border: 1px solid var(--border);
|
|
84
|
+
border-radius: var(--r-inner);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.more-action__item {
|
|
88
|
+
font-size: var(--fs-cell);
|
|
89
|
+
font-weight: var(--fw-btn);
|
|
90
|
+
color: var(--text);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* The delete row was Vuetify's `text-red`; same meaning, on the token. */
|
|
94
|
+
.more-action__item--danger {
|
|
95
|
+
color: var(--err);
|
|
96
|
+
}
|
|
97
|
+
</style>
|