@7365admin1/layer-common 3.2.2-staging.111 → 3.2.2-staging.113
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/assets/css/screens.css +70 -0
- package/components/AccessCardAssignToUnitForm.vue +13 -21
- package/components/AccessCardDeleteDialog.vue +41 -39
- package/components/AccessCardReplaceForm.vue +27 -23
- package/components/AddEqupmentForm.vue +18 -22
- package/components/AttendanceDetailsDialog.vue +57 -63
- package/components/BuildingForm.vue +31 -26
- package/components/BulletinBoardForm.vue +18 -23
- package/components/CameraForm.vue +20 -21
- package/components/ConfirmDialog.vue +14 -8
- package/components/Dialog/ReplaceAutofillPrompt.vue +19 -26
- package/components/Dialog/ReusablePrompt.vue +30 -29
- package/components/Dialog/UpdateMoreAction.vue +62 -59
- package/components/DocumentForm.vue +14 -21
- package/components/DocumentViewer.vue +29 -12
- package/components/InvitationClientForm.vue +21 -19
- package/components/InvitationForm.vue +15 -21
- package/components/OrgViewDialog.vue +34 -16
- package/components/PasswordConfirmation.vue +44 -26
- package/components/ScheduleTaskAreaFormDialog.vue +48 -51
- package/components/ScheduleTaskAreaUpdateMoreAction.vue +57 -62
- package/components/ServiceProviderFormCreate.vue +29 -20
- package/components/ServiceProviderInvitationPrompt.vue +48 -43
- package/package.json +1 -1
package/assets/css/screens.css
CHANGED
|
@@ -242,6 +242,76 @@
|
|
|
242
242
|
font-size: var(--fs-cell);
|
|
243
243
|
}
|
|
244
244
|
|
|
245
|
+
/**
|
|
246
|
+
* ...and the same size again, because inside a real dialog the rule above
|
|
247
|
+
* never reached the glass. Vuetify scopes
|
|
248
|
+
*
|
|
249
|
+
* .v-dialog > .v-overlay__content > .v-card > .v-card-text { font-size: inherit }
|
|
250
|
+
*
|
|
251
|
+
* which is a FOUR-class chain against our one, so a `.screen-modal__body` in a
|
|
252
|
+
* `v-dialog` inherited the root 16px instead of the design's 13.5px --fs-cell.
|
|
253
|
+
* Measured on `AccessCardDeleteDialog`: 16px/400 where --fs-cell is 13.5px.
|
|
254
|
+
* It is invisible in a harness that mounts the card WITHOUT its dialog, which
|
|
255
|
+
* is how it survived. Naming the same chain plus the card's own class wins it
|
|
256
|
+
* back on specificity alone - no `!important`, same technique as the button
|
|
257
|
+
* height fix.
|
|
258
|
+
*/
|
|
259
|
+
.v-dialog > .v-overlay__content > .v-card.screen-modal > .screen-modal__body {
|
|
260
|
+
font-size: var(--fs-cell);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* The design's modal footer, literal from the prototype's Create Role dialog:
|
|
265
|
+
*
|
|
266
|
+
* <div style="display:flex;gap:10px;padding:16px 22px;
|
|
267
|
+
* border-top:1px solid var(--border)">
|
|
268
|
+
* <button style="flex:1; ...ghost">Cancel</button>
|
|
269
|
+
* <button style="flex:1; ...primary">Submit</button>
|
|
270
|
+
*
|
|
271
|
+
* Two EQUAL-WIDTH buttons on a bordered strip, ghost first. Stated once
|
|
272
|
+
* because the product opens confirm dialogs from a couple of dozen components
|
|
273
|
+
* and each of them was drawing its own footer by hand.
|
|
274
|
+
*/
|
|
275
|
+
.screen-modal__footer {
|
|
276
|
+
display: flex;
|
|
277
|
+
gap: 10px;
|
|
278
|
+
padding: 16px 22px;
|
|
279
|
+
border-top: 1px solid var(--border);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
.screen-modal__footer > .v-btn,
|
|
283
|
+
.screen-modal__footer > .app-btn {
|
|
284
|
+
flex: 1;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* The modal's close control, literal from the same Create Role dialog:
|
|
289
|
+
*
|
|
290
|
+
* <button style="display:flex;align-items:center;justify-content:center;
|
|
291
|
+
* width:32px;height:32px;border:none;border-radius:8px;
|
|
292
|
+
* background:transparent;color:var(--muted);"
|
|
293
|
+
* style-hover="background:var(--hover)">close</button>
|
|
294
|
+
*
|
|
295
|
+
* Borderless and 32px square - NOT `.screen-icon-btn`, which is the bordered
|
|
296
|
+
* 40px square the design draws in a toolbar. The glyph is 19px.
|
|
297
|
+
*/
|
|
298
|
+
.screen-modal__close {
|
|
299
|
+
width: 32px;
|
|
300
|
+
height: 32px;
|
|
301
|
+
min-width: 32px;
|
|
302
|
+
border-radius: 8px;
|
|
303
|
+
background: transparent;
|
|
304
|
+
color: var(--muted);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
.screen-modal__close:hover {
|
|
308
|
+
background: var(--hover);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
.screen-modal__close .v-icon {
|
|
312
|
+
font-size: 19px;
|
|
313
|
+
}
|
|
314
|
+
|
|
245
315
|
/**
|
|
246
316
|
* The design's two buttons, for the dialogs and toolbars that draw their own.
|
|
247
317
|
*
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<v-card width="100%">
|
|
3
|
-
<v-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
</v-row>
|
|
7
|
-
</v-toolbar>
|
|
8
|
-
<v-card-text style="max-height: 100vh; overflow-y: auto" class="pa-0">
|
|
2
|
+
<v-card width="100%" class="screen-modal">
|
|
3
|
+
<v-card-title>Assign Access Card to Unit</v-card-title>
|
|
4
|
+
|
|
5
|
+
<v-card-text class="screen-modal__body pa-0">
|
|
9
6
|
<v-form v-model="validForm" :disabled="loading">
|
|
10
7
|
<v-row no-gutters class="px-6 pt-4 pb-2">
|
|
11
8
|
<!-- Building -->
|
|
@@ -147,10 +144,10 @@
|
|
|
147
144
|
/>
|
|
148
145
|
<div class="text-caption mt-1">
|
|
149
146
|
<template v-if="availableLoading">
|
|
150
|
-
<span class="
|
|
147
|
+
<span class="screen-hint">Loading available count...</span>
|
|
151
148
|
</template>
|
|
152
149
|
<template v-else-if="availableCount !== null">
|
|
153
|
-
<span :class="availableCount === 0 ? 'text-error' : '
|
|
150
|
+
<span :class="availableCount === 0 ? 'text-error' : 'screen-hint'">
|
|
154
151
|
Available: {{ availableCount }}
|
|
155
152
|
</span>
|
|
156
153
|
</template>
|
|
@@ -160,29 +157,24 @@
|
|
|
160
157
|
</v-form>
|
|
161
158
|
</v-card-text>
|
|
162
159
|
|
|
163
|
-
<v-
|
|
160
|
+
<v-card-actions class="screen-modal__footer">
|
|
164
161
|
<v-row no-gutters>
|
|
165
|
-
<v-col cols="6">
|
|
162
|
+
<v-col cols="6" class="pr-2">
|
|
166
163
|
<v-btn
|
|
167
|
-
tile
|
|
168
164
|
block
|
|
169
|
-
variant="
|
|
170
|
-
class="text-none"
|
|
171
|
-
size="48"
|
|
165
|
+
variant="outlined"
|
|
166
|
+
class="text-none screen-btn-ghost"
|
|
172
167
|
@click="cancel"
|
|
173
168
|
:disabled="loading"
|
|
174
169
|
>
|
|
175
170
|
Cancel
|
|
176
171
|
</v-btn>
|
|
177
172
|
</v-col>
|
|
178
|
-
<v-col cols="6">
|
|
173
|
+
<v-col cols="6" class="pl-2">
|
|
179
174
|
<v-btn
|
|
180
|
-
tile
|
|
181
175
|
block
|
|
182
176
|
variant="flat"
|
|
183
|
-
|
|
184
|
-
class="text-none"
|
|
185
|
-
size="48"
|
|
177
|
+
class="text-none screen-btn-primary"
|
|
186
178
|
:disabled="!validForm || loading || availableCount === 0 || (availableCount !== null && form.quantity > availableCount)"
|
|
187
179
|
:loading="loading"
|
|
188
180
|
@click="submit"
|
|
@@ -191,7 +183,7 @@
|
|
|
191
183
|
</v-btn>
|
|
192
184
|
</v-col>
|
|
193
185
|
</v-row>
|
|
194
|
-
</v-
|
|
186
|
+
</v-card-actions>
|
|
195
187
|
</v-card>
|
|
196
188
|
</template>
|
|
197
189
|
<script setup lang="ts">
|
|
@@ -1,20 +1,28 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
<!-- 520px is the handoff's `--modal-w`; the card wears `.screen-modal` for
|
|
3
|
+
the 16px corner, the `--card` surface and the modal shadow. The two
|
|
4
|
+
`v-toolbar`s it used for the title row and the footer were grey slabs
|
|
5
|
+
that stay grey on the dark theme - a `v-card-title` and the shared
|
|
6
|
+
`.screen-modal__footer` are the same rows on the card's own surface. -->
|
|
7
|
+
<v-dialog :model-value="modelValue" width="520" persistent>
|
|
8
|
+
<v-card class="screen-modal" width="100%">
|
|
9
|
+
<v-card-title>Delete Card</v-card-title>
|
|
7
10
|
|
|
8
|
-
<v-card-text>
|
|
9
|
-
<p class="text-
|
|
11
|
+
<v-card-text class="screen-modal__body">
|
|
12
|
+
<p class="text-center mb-4">
|
|
10
13
|
Are you sure you want to delete this card? This action cannot be
|
|
11
14
|
undone.
|
|
12
15
|
</p>
|
|
13
16
|
|
|
14
17
|
<v-form v-model="validForm" :disabled="loading">
|
|
15
18
|
<InputLabel class="text-capitalize font-weight-bold" title="Remarks" required />
|
|
19
|
+
<!-- Still a `v-textarea`, not an `AppField`: Delete Card is gated on
|
|
20
|
+
`validForm`, which only exists because this `:rules` runs.
|
|
21
|
+
`.filter-field` gives it the design's 10px corner and 13.5px
|
|
22
|
+
type without taking the validation away. -->
|
|
16
23
|
<v-textarea
|
|
17
24
|
v-model="remarks"
|
|
25
|
+
class="filter-field"
|
|
18
26
|
placeholder="Enter remarks..."
|
|
19
27
|
persistent-placeholder
|
|
20
28
|
rows="3"
|
|
@@ -29,38 +37,32 @@
|
|
|
29
37
|
</v-row>
|
|
30
38
|
</v-card-text>
|
|
31
39
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
>
|
|
59
|
-
Delete Card
|
|
60
|
-
</v-btn>
|
|
61
|
-
</v-col>
|
|
62
|
-
</v-row>
|
|
63
|
-
</v-toolbar>
|
|
40
|
+
<!-- The design's footer: two equal-width buttons, ghost then primary, on
|
|
41
|
+
a bordered strip. The confirming button was a hardcoded color="black"
|
|
42
|
+
fill - the same black on both themes. The handoff draws no
|
|
43
|
+
destructive button, so it takes the primary shape like every other
|
|
44
|
+
modal's confirm; the destructive-variant gap stays a design
|
|
45
|
+
decision. `loading` keeps it a v-btn: AppButton has no in-flight
|
|
46
|
+
state, and this is the only signal the delete is running. -->
|
|
47
|
+
<div class="screen-modal__footer">
|
|
48
|
+
<v-btn
|
|
49
|
+
variant="outlined"
|
|
50
|
+
class="screen-btn-ghost"
|
|
51
|
+
:disabled="loading"
|
|
52
|
+
@click="handleClose"
|
|
53
|
+
>
|
|
54
|
+
Close
|
|
55
|
+
</v-btn>
|
|
56
|
+
<v-btn
|
|
57
|
+
variant="flat"
|
|
58
|
+
class="screen-btn-primary"
|
|
59
|
+
:loading="loading"
|
|
60
|
+
:disabled="!validForm || loading"
|
|
61
|
+
@click="handleConfirm"
|
|
62
|
+
>
|
|
63
|
+
Delete Card
|
|
64
|
+
</v-btn>
|
|
65
|
+
</div>
|
|
64
66
|
</v-card>
|
|
65
67
|
</v-dialog>
|
|
66
68
|
</template>
|
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<v-card width="100%">
|
|
3
|
-
<v-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
</v-row>
|
|
7
|
-
</v-toolbar>
|
|
8
|
-
<v-card-text style="max-height: 100vh; overflow-y: auto" class="pa-0">
|
|
2
|
+
<v-card width="100%" class="screen-modal">
|
|
3
|
+
<v-card-title>Replace Access Card</v-card-title>
|
|
4
|
+
|
|
5
|
+
<v-card-text class="screen-modal__body pa-0">
|
|
9
6
|
<v-form v-model="validForm" :disabled="loading">
|
|
10
7
|
<v-row no-gutters class="px-6 pt-4 pb-6">
|
|
11
8
|
<!-- Card being replaced -->
|
|
12
9
|
<v-col cols="12" class="px-1 mb-4">
|
|
13
|
-
|
|
10
|
+
<!-- `text-grey` is a fixed Vuetify grey - the SAME grey on the dark
|
|
11
|
+
page, where it is the hardest thing on the card to read.
|
|
12
|
+
`.screen-hint` is the design's `--muted`, which follows the theme. -->
|
|
13
|
+
<div class="text-caption screen-hint mb-1 font-weight-bold">
|
|
14
14
|
Card being replaced
|
|
15
15
|
</div>
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
<!-- A card NUMBER, not a status word, so it takes the design's
|
|
17
|
+
dotless tag shape and is given its tone explicitly rather than
|
|
18
|
+
having one guessed from the text. -->
|
|
19
|
+
<StatusChip tone="warn" :dot="false" :label="card.cardNo" />
|
|
19
20
|
</v-col>
|
|
20
21
|
|
|
21
22
|
<!-- Replacement card -->
|
|
@@ -25,8 +26,12 @@
|
|
|
25
26
|
title="Replacement Card"
|
|
26
27
|
required
|
|
27
28
|
/>
|
|
29
|
+
<!-- Both inputs keep their `:rules`: Replace is gated on
|
|
30
|
+
`validForm`. `.filter-field` gives them the design's shape
|
|
31
|
+
without touching the validation. -->
|
|
28
32
|
<v-autocomplete
|
|
29
33
|
v-model="form.replacementCardId"
|
|
34
|
+
class="filter-field"
|
|
30
35
|
density="compact"
|
|
31
36
|
:items="replacementOptions"
|
|
32
37
|
hide-details="auto"
|
|
@@ -48,6 +53,7 @@
|
|
|
48
53
|
/>
|
|
49
54
|
<v-textarea
|
|
50
55
|
v-model="form.remarks"
|
|
56
|
+
class="filter-field"
|
|
51
57
|
density="compact"
|
|
52
58
|
hide-details="auto"
|
|
53
59
|
placeholder="Enter remarks..."
|
|
@@ -61,29 +67,27 @@
|
|
|
61
67
|
</v-form>
|
|
62
68
|
</v-card-text>
|
|
63
69
|
|
|
64
|
-
|
|
70
|
+
<!-- Was a second `v-toolbar` - a grey slab that stayed grey in dark theme,
|
|
71
|
+
with square (`tile`) 48px buttons and a hardcoded `color="black"`
|
|
72
|
+
primary. Same two buttons, same order, on the card's own surface. -->
|
|
73
|
+
<v-card-actions class="screen-modal__footer">
|
|
65
74
|
<v-row no-gutters>
|
|
66
|
-
<v-col cols="6">
|
|
75
|
+
<v-col cols="6" class="pr-2">
|
|
67
76
|
<v-btn
|
|
68
|
-
tile
|
|
69
77
|
block
|
|
70
|
-
variant="
|
|
71
|
-
class="text-none"
|
|
72
|
-
size="48"
|
|
78
|
+
variant="outlined"
|
|
79
|
+
class="text-none screen-btn-ghost"
|
|
73
80
|
@click="cancel"
|
|
74
81
|
:disabled="loading"
|
|
75
82
|
>
|
|
76
83
|
Cancel
|
|
77
84
|
</v-btn>
|
|
78
85
|
</v-col>
|
|
79
|
-
<v-col cols="6">
|
|
86
|
+
<v-col cols="6" class="pl-2">
|
|
80
87
|
<v-btn
|
|
81
|
-
tile
|
|
82
88
|
block
|
|
83
89
|
variant="flat"
|
|
84
|
-
|
|
85
|
-
class="text-none"
|
|
86
|
-
size="48"
|
|
90
|
+
class="text-none screen-btn-primary"
|
|
87
91
|
:disabled="!validForm || loading"
|
|
88
92
|
:loading="loading"
|
|
89
93
|
@click="submit"
|
|
@@ -92,7 +96,7 @@
|
|
|
92
96
|
</v-btn>
|
|
93
97
|
</v-col>
|
|
94
98
|
</v-row>
|
|
95
|
-
</v-
|
|
99
|
+
</v-card-actions>
|
|
96
100
|
</v-card>
|
|
97
101
|
</template>
|
|
98
102
|
<script setup lang="ts">
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<v-dialog v-model="showDialog" max-width="450">
|
|
3
|
-
<v-card>
|
|
4
|
-
<v-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
{{ prop.mode === "edit" ? "Edit Equipment" : "Add New Equipment" }}
|
|
8
|
-
</span>
|
|
9
|
-
</v-row>
|
|
10
|
-
</v-toolbar>
|
|
3
|
+
<v-card class="screen-modal">
|
|
4
|
+
<v-card-title class="text-capitalize">
|
|
5
|
+
{{ prop.mode === "edit" ? "Edit Equipment" : "Add New Equipment" }}
|
|
6
|
+
</v-card-title>
|
|
11
7
|
|
|
12
|
-
<v-card-text class="pa-4">
|
|
8
|
+
<v-card-text class="screen-modal__body pa-4">
|
|
13
9
|
<v-form ref="formRef" v-model="valid">
|
|
14
10
|
<v-row no-gutters class="pa-0">
|
|
15
11
|
<v-col cols="12" class="pa-0 mb-2">
|
|
@@ -39,7 +35,7 @@
|
|
|
39
35
|
variant="outlined"
|
|
40
36
|
placeholder="Enter equipment name"
|
|
41
37
|
hide-details="auto"
|
|
42
|
-
class="mb-0"
|
|
38
|
+
class="mb-0 filter-field"
|
|
43
39
|
/>
|
|
44
40
|
</v-col>
|
|
45
41
|
|
|
@@ -58,35 +54,35 @@
|
|
|
58
54
|
variant="outlined"
|
|
59
55
|
placeholder="Select unitOfMeasurement"
|
|
60
56
|
hide-details="auto"
|
|
61
|
-
class="mb-0"
|
|
57
|
+
class="mb-0 filter-field"
|
|
62
58
|
/>
|
|
63
59
|
</v-col>
|
|
64
60
|
</v-row>
|
|
65
61
|
</v-form>
|
|
66
62
|
</v-card-text>
|
|
67
63
|
|
|
68
|
-
|
|
64
|
+
<!-- Was a `v-toolbar` footer: a grey slab holding a bare-text Cancel and
|
|
65
|
+
a `rounded-0`, `color="black"` primary - a square black button that
|
|
66
|
+
ignored the theme. Same two buttons on the card's own surface, with
|
|
67
|
+
the design's radius and accent fill. -->
|
|
68
|
+
<v-card-actions class="screen-modal__footer">
|
|
69
69
|
<v-row no-gutters>
|
|
70
|
-
<v-col cols="6" class="
|
|
70
|
+
<v-col cols="6" class="pr-2">
|
|
71
71
|
<v-btn
|
|
72
72
|
block
|
|
73
|
-
variant="
|
|
74
|
-
class="text-none"
|
|
75
|
-
size="large"
|
|
73
|
+
variant="outlined"
|
|
74
|
+
class="text-none screen-btn-ghost"
|
|
76
75
|
@click="close"
|
|
77
|
-
height="48"
|
|
78
76
|
>
|
|
79
77
|
Cancel
|
|
80
78
|
</v-btn>
|
|
81
79
|
</v-col>
|
|
82
80
|
|
|
83
|
-
<v-col cols="6" class="
|
|
81
|
+
<v-col cols="6" class="pl-2">
|
|
84
82
|
<v-btn
|
|
85
83
|
block
|
|
86
84
|
variant="flat"
|
|
87
|
-
|
|
88
|
-
class="text-none font-weight-bold rounded-0"
|
|
89
|
-
height="48"
|
|
85
|
+
class="text-none screen-btn-primary"
|
|
90
86
|
:loading="submitting"
|
|
91
87
|
@click="submit"
|
|
92
88
|
>
|
|
@@ -94,7 +90,7 @@
|
|
|
94
90
|
</v-btn>
|
|
95
91
|
</v-col>
|
|
96
92
|
</v-row>
|
|
97
|
-
</v-
|
|
93
|
+
</v-card-actions>
|
|
98
94
|
</v-card>
|
|
99
95
|
</v-dialog>
|
|
100
96
|
</template>
|
|
@@ -4,16 +4,14 @@
|
|
|
4
4
|
:max-width="attendance?.checkOut?.timestamp ? 900 : 500"
|
|
5
5
|
persistent
|
|
6
6
|
>
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
</v-row>
|
|
14
|
-
</v-toolbar>
|
|
7
|
+
<!-- The card wears `.screen-modal` (16px corner, `--card`, the modal
|
|
8
|
+
shadow). The `v-toolbar` that stood in for the title row and the one
|
|
9
|
+
that stood in for the footer were both fixed grey slabs that stay grey
|
|
10
|
+
on the dark theme. -->
|
|
11
|
+
<v-card class="screen-modal">
|
|
12
|
+
<v-card-title class="text-capitalize">Attendance Details</v-card-title>
|
|
15
13
|
|
|
16
|
-
<v-card-text class="pa-6">
|
|
14
|
+
<v-card-text class="screen-modal__body pa-6">
|
|
17
15
|
<v-row v-if="attendance" dense>
|
|
18
16
|
<v-col :cols="attendance.checkOut?.timestamp ? 6 : 12">
|
|
19
17
|
<v-row dense>
|
|
@@ -21,14 +19,14 @@
|
|
|
21
19
|
<InputLabel title="Check In" />
|
|
22
20
|
</v-col>
|
|
23
21
|
<v-col cols="12" class="mb-1">
|
|
24
|
-
<span class="
|
|
22
|
+
<span class="att-dlg__time">{{
|
|
25
23
|
attendance.checkIn?.timestamp
|
|
26
24
|
? formatDate(attendance.checkIn.timestamp)
|
|
27
25
|
: "N/A"
|
|
28
26
|
}}</span>
|
|
29
27
|
</v-col>
|
|
30
28
|
<v-col cols="12" class="mb-2">
|
|
31
|
-
<span class="
|
|
29
|
+
<span class="screen-hint att-dlg__meta">
|
|
32
30
|
{{
|
|
33
31
|
attendance.checkIn?.location?.latitude &&
|
|
34
32
|
attendance.checkIn?.location?.longitude
|
|
@@ -38,29 +36,21 @@
|
|
|
38
36
|
</span>
|
|
39
37
|
</v-col>
|
|
40
38
|
<v-col cols="12">
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
>
|
|
39
|
+
<!-- Was an inline `border: 1px solid rgba(0,0,0,.12)` - a
|
|
40
|
+
literal black rule that is the same black on the dark
|
|
41
|
+
theme. `--border` is that rule in each theme, and the
|
|
42
|
+
frame takes the design's inner radius. -->
|
|
43
|
+
<div v-if="attendance.checkIn?.img" class="att-dlg__frame">
|
|
47
44
|
<v-img
|
|
48
45
|
:src="getFileUrl(attendance.checkIn.img)"
|
|
49
46
|
height="280"
|
|
50
47
|
width="100%"
|
|
51
48
|
cover
|
|
52
49
|
></v-img>
|
|
53
|
-
</
|
|
54
|
-
<v-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
class="pa-8 text-center"
|
|
58
|
-
style="border: 1px solid rgba(0, 0, 0, 0.12); height: 280px"
|
|
59
|
-
>
|
|
60
|
-
<span class="text-caption text-medium-emphasis"
|
|
61
|
-
>No image</span
|
|
62
|
-
>
|
|
63
|
-
</v-card>
|
|
50
|
+
</div>
|
|
51
|
+
<div class="att-dlg__frame att-dlg__frame--empty pa-8 text-center" v-else>
|
|
52
|
+
<span class="screen-hint att-dlg__meta">No image</span>
|
|
53
|
+
</div>
|
|
64
54
|
</v-col>
|
|
65
55
|
</v-row>
|
|
66
56
|
</v-col>
|
|
@@ -71,12 +61,12 @@
|
|
|
71
61
|
<InputLabel title="Check Out" />
|
|
72
62
|
</v-col>
|
|
73
63
|
<v-col cols="12" class="mb-1">
|
|
74
|
-
<span class="
|
|
64
|
+
<span class="att-dlg__time">{{
|
|
75
65
|
formatDate(attendance.checkOut.timestamp)
|
|
76
66
|
}}</span>
|
|
77
67
|
</v-col>
|
|
78
68
|
<v-col cols="12" class="mb-2">
|
|
79
|
-
<span class="
|
|
69
|
+
<span class="screen-hint att-dlg__meta">
|
|
80
70
|
{{
|
|
81
71
|
attendance.checkOut?.location?.latitude &&
|
|
82
72
|
attendance.checkOut?.location?.longitude
|
|
@@ -86,29 +76,17 @@
|
|
|
86
76
|
</span>
|
|
87
77
|
</v-col>
|
|
88
78
|
<v-col cols="12">
|
|
89
|
-
<v-
|
|
90
|
-
v-if="attendance.checkOut?.img"
|
|
91
|
-
variant="outlined"
|
|
92
|
-
class="pa-0"
|
|
93
|
-
style="border: 1px solid rgba(0, 0, 0, 0.12)"
|
|
94
|
-
>
|
|
79
|
+
<div v-if="attendance.checkOut?.img" class="att-dlg__frame">
|
|
95
80
|
<v-img
|
|
96
81
|
:src="getFileUrl(attendance.checkOut.img)"
|
|
97
82
|
height="280"
|
|
98
83
|
width="100%"
|
|
99
84
|
cover
|
|
100
85
|
></v-img>
|
|
101
|
-
</
|
|
102
|
-
<v-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
class="pa-8 text-center"
|
|
106
|
-
style="border: 1px solid rgba(0, 0, 0, 0.12); height: 280px"
|
|
107
|
-
>
|
|
108
|
-
<span class="text-caption text-medium-emphasis"
|
|
109
|
-
>No image</span
|
|
110
|
-
>
|
|
111
|
-
</v-card>
|
|
86
|
+
</div>
|
|
87
|
+
<div class="att-dlg__frame att-dlg__frame--empty pa-8 text-center" v-else>
|
|
88
|
+
<span class="screen-hint att-dlg__meta">No image</span>
|
|
89
|
+
</div>
|
|
112
90
|
</v-col>
|
|
113
91
|
</v-row>
|
|
114
92
|
</v-col>
|
|
@@ -121,22 +99,11 @@
|
|
|
121
99
|
</v-row>
|
|
122
100
|
</v-card-text>
|
|
123
101
|
|
|
124
|
-
<
|
|
125
|
-
<v-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
variant="text"
|
|
130
|
-
class="text-none"
|
|
131
|
-
size="large"
|
|
132
|
-
@click="close"
|
|
133
|
-
height="48"
|
|
134
|
-
>
|
|
135
|
-
Close
|
|
136
|
-
</v-btn>
|
|
137
|
-
</v-col>
|
|
138
|
-
</v-row>
|
|
139
|
-
</v-toolbar>
|
|
102
|
+
<div class="screen-modal__footer">
|
|
103
|
+
<v-btn variant="outlined" class="screen-btn-ghost" @click="close">
|
|
104
|
+
Close
|
|
105
|
+
</v-btn>
|
|
106
|
+
</div>
|
|
140
107
|
</v-card>
|
|
141
108
|
</v-dialog>
|
|
142
109
|
</template>
|
|
@@ -183,3 +150,30 @@ watch(showDialog, (newVal) => {
|
|
|
183
150
|
}
|
|
184
151
|
});
|
|
185
152
|
</script>
|
|
153
|
+
|
|
154
|
+
<style scoped>
|
|
155
|
+
/* `text-body-1` was 1rem/400 and `text-caption text-medium-emphasis` was
|
|
156
|
+
0.75rem on Vuetify's 60%-alpha ink. The handoff names no type for a
|
|
157
|
+
label/value detail row, so both take the established cell and hint. */
|
|
158
|
+
.att-dlg__time {
|
|
159
|
+
font-size: var(--fs-cell);
|
|
160
|
+
font-weight: var(--fw-cell);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.att-dlg__meta {
|
|
164
|
+
font-size: var(--fs-breadcrumb);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.att-dlg__frame {
|
|
168
|
+
border: 1px solid var(--border);
|
|
169
|
+
border-radius: var(--r-inner);
|
|
170
|
+
overflow: hidden;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.att-dlg__frame--empty {
|
|
174
|
+
height: 280px;
|
|
175
|
+
display: flex;
|
|
176
|
+
align-items: center;
|
|
177
|
+
justify-content: center;
|
|
178
|
+
}
|
|
179
|
+
</style>
|