@7365admin1/layer-common 3.2.2-staging.128 → 3.2.2-staging.130

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.
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <v-card class="mb-2 pa-2 rounded-lg border-sm" elevation="0">
2
+ <v-card class="chat-listcard screen-card mb-2 pa-2" elevation="0">
3
3
  <v-row no-gutters align="center">
4
4
  <v-col cols="12" sm="4" class="d-flex justify-center align-center">
5
5
  <v-img
@@ -15,30 +15,30 @@
15
15
  <v-col cols="12" sm="8" class="py-2 pe-1">
16
16
  <v-row dense>
17
17
  <v-col cols="12" class="d-flex align-center flex-wrap">
18
- <span class="text-caption font-weight-medium me-1">Created by</span>
18
+ <span class="chat-listcard__label me-1">Created by</span>
19
19
 
20
- <v-avatar color="surface-variant" size="20" class="me-1">
20
+ <v-avatar class="chat-listcard__avatar me-1" size="20">
21
21
  <v-img
22
22
  v-if="userProfile"
23
23
  :src="userProfile"
24
24
  width="20"
25
25
  height="20"
26
26
  />
27
- <span v-else class="text-overline">
27
+ <span v-else class="chat-listcard__initials">
28
28
  {{ getNameInitials }}
29
29
  </span>
30
30
  </v-avatar>
31
31
 
32
- <span class="text-caption">{{ createdByName || "Unknown" }}</span>
32
+ <span class="chat-listcard__cell">{{ createdByName || "Unknown" }}</span>
33
33
  </v-col>
34
34
 
35
- <v-col cols="12" class="text-caption">Subject: {{ subject }}</v-col>
35
+ <v-col cols="12" class="chat-listcard__cell">Subject: {{ subject }}</v-col>
36
36
 
37
- <v-col cols="12" class="text-caption">
38
- Status: <span class="text-orange">{{ status }}</span>
37
+ <v-col cols="12" class="chat-listcard__cell d-flex align-center ga-1">
38
+ Status: <StatusChip :status="status" />
39
39
  </v-col>
40
40
 
41
- <v-col cols="12" class="text-caption">
41
+ <v-col cols="12" class="chat-listcard__cell">
42
42
  Date Created: {{ createdAt }}
43
43
  </v-col>
44
44
  </v-row>
@@ -60,3 +60,32 @@ defineProps({
60
60
  getNameInitials: Function,
61
61
  });
62
62
  </script>
63
+
64
+ <style scoped>
65
+ .chat-listcard {
66
+ font-family: var(--font-sans);
67
+ color: var(--text);
68
+ }
69
+
70
+ .chat-listcard__cell,
71
+ .chat-listcard__label {
72
+ font-size: var(--fs-cell-dense);
73
+ }
74
+
75
+ .chat-listcard__label {
76
+ font-weight: 600;
77
+ }
78
+
79
+ /* Was `color="surface-variant"` with `text-overline` initials - 10px letters
80
+ with 1.6px tracking inside a 20px circle, which drew as one clipped glyph. */
81
+ .chat-listcard__avatar {
82
+ background: var(--hover);
83
+ color: var(--text2);
84
+ }
85
+
86
+ .chat-listcard__initials {
87
+ font-size: 9px;
88
+ font-weight: 700;
89
+ letter-spacing: 0;
90
+ }
91
+ </style>
@@ -1,18 +1,17 @@
1
1
  <template>
2
2
  <v-sheet
3
- elevation="1"
3
+ elevation="0"
4
4
  rounded="0"
5
- class="fill-height d-flex flex-column"
6
- style="border-right: 1px solid #e0e0e0; border-top: 1px solid #e0e0e0"
5
+ class="chat-panel fill-height d-flex flex-column"
7
6
  >
8
- <div style="border-bottom: 1px solid #e0e0e0" class="px-4 pt-4 pb-2 mb-2">
9
- <h3 class="text-h6">
7
+ <div class="chat-panel__head px-4 pt-4 pb-2 mb-2">
8
+ <h3 class="screen-card-title">
10
9
  {{ type === "workOrder" ? "Work Order" : "Feedback" }} Chat
11
10
  </h3>
12
11
  </div>
13
12
 
14
13
  <v-sheet
15
- class="overflow-y-auto flex-grow-1 pa-3"
14
+ class="chat-panel__thread overflow-y-auto flex-grow-1 pa-3"
16
15
  :style="{ height: 'calc(100vh - 300px)', overflowX: 'hidden' }"
17
16
  >
18
17
  <v-row
@@ -35,10 +34,11 @@
35
34
  </v-row>
36
35
  </v-sheet>
37
36
 
38
- <v-card class="mx-4 mb-4 mt-2 pa-3 rounded-lg" elevation="2">
37
+ <v-card class="screen-card mx-4 mb-4 mt-2 pa-3" elevation="0">
39
38
  <v-row no-gutters align="end">
40
39
  <v-col cols="10">
41
40
  <v-textarea
41
+ class="filter-field"
42
42
  label="Message"
43
43
  auto-grow
44
44
  hide-details
@@ -47,9 +47,7 @@
47
47
  />
48
48
  </v-col>
49
49
  <v-col cols="2" class="pl-2">
50
- <v-btn color="primary-button" block class="pa-4 py-6 text-capitalize"
51
- >Send</v-btn
52
- >
50
+ <v-btn class="screen-btn-primary" variant="flat" block>Send</v-btn>
53
51
  </v-col>
54
52
  </v-row>
55
53
 
@@ -57,23 +55,27 @@
57
55
 
58
56
  <v-row justify="start" no-gutters align="center">
59
57
  <v-col cols="auto">
60
- <v-icon size="20" class="mr-3">mdi-paperclip</v-icon>
58
+ <v-icon size="20" class="chat-panel__tool mr-3">mdi-paperclip</v-icon>
61
59
  </v-col>
62
60
 
63
61
  <v-col cols="auto">
64
- <v-icon size="20" class="mr-3">mdi-emoticon-happy-outline</v-icon>
62
+ <v-icon size="20" class="chat-panel__tool mr-3"
63
+ >mdi-emoticon-happy-outline</v-icon
64
+ >
65
65
  </v-col>
66
66
 
67
67
  <v-col cols="auto">
68
68
  <v-menu location="top" offset="10">
69
69
  <template #activator="{ props }">
70
70
  <v-btn icon v-bind="props" density="compact" variant="text">
71
- <v-icon size="20" color="gray">mdi-message-outline</v-icon>
71
+ <v-icon size="20" class="chat-panel__tool"
72
+ >mdi-message-outline</v-icon
73
+ >
72
74
  </v-btn>
73
75
  </template>
74
76
 
75
- <v-card min-width="350" class="rounded-lg">
76
- <v-card-title class="text-subtitle-1 font-weight-medium pb-1"
77
+ <v-card min-width="350" class="screen-card">
78
+ <v-card-title class="screen-card-title pb-1"
77
79
  >Quick Chat</v-card-title
78
80
  >
79
81
  <v-divider class="mb-1" />
@@ -156,3 +158,27 @@ const selectQuickChat = (msg: string) => {
156
158
  console.log("Quick Chat Selected:", msg);
157
159
  };
158
160
  </script>
161
+
162
+ <style scoped>
163
+ /* The panel's two rules were hard-coded `1px solid #e0e0e0`, which is a light-
164
+ theme hairline drawn on the dark theme as well. Same lines, on `--border`. */
165
+ .chat-panel {
166
+ background: var(--card);
167
+ border-right: 1px solid var(--border);
168
+ border-top: 1px solid var(--border);
169
+ }
170
+
171
+ .chat-panel__head {
172
+ border-bottom: 1px solid var(--border);
173
+ }
174
+
175
+ .chat-panel__thread {
176
+ background: var(--bg);
177
+ }
178
+
179
+ /* Was a bare icon and one `color="gray"` - not a token, and not the same tone
180
+ as the icon beside it. */
181
+ .chat-panel__tool {
182
+ color: var(--muted);
183
+ }
184
+ </style>
@@ -1,31 +1,24 @@
1
1
  <template>
2
- <v-sheet
3
- elevation="1"
4
- rounded="0"
5
- class="pa-4 fill-height"
6
- style="border-right: 1px solid #e0e0e0; border-top: 1px solid #e0e0e0"
7
- >
8
- <h3 class="text-h6 mb-4">{{ title }}</h3>
2
+ <v-sheet elevation="0" rounded="0" class="chat-nav pa-4 fill-height">
3
+ <h3 class="screen-card-title mb-4">{{ title }}</h3>
9
4
 
10
5
  <v-text-field
11
6
  v-model="search"
12
7
  @input="_search"
13
8
  label="Search"
14
9
  prepend-inner-icon="mdi-magnify"
15
- density="compact"
16
10
  hide-details
17
11
  variant="outlined"
18
- class="mb-4"
12
+ class="filter-field mb-4"
19
13
  />
20
14
 
21
15
  <v-select
22
16
  label="Filter by Status"
23
17
  :items="['All', 'In Progress', 'To Do', 'Done']"
24
18
  v-model="selectedStatus"
25
- density="compact"
26
19
  hide-details
27
20
  variant="outlined"
28
- class="mb-4"
21
+ class="filter-field mb-4"
29
22
  />
30
23
 
31
24
  <v-row dense class="mb-4" align="center">
@@ -43,7 +36,7 @@
43
36
  v-bind="props"
44
37
  v-model="startDate"
45
38
  label="Start Date"
46
- density="compact"
39
+ class="filter-field"
47
40
  variant="outlined"
48
41
  readonly
49
42
  hide-details
@@ -63,7 +56,7 @@
63
56
  </v-col>
64
57
 
65
58
  <v-col cols="2" class="d-flex align-center justify-center">
66
- <span class="text-subtitle-2">to</span>
59
+ <span class="chat-nav__to">to</span>
67
60
  </v-col>
68
61
 
69
62
  <v-col cols="5">
@@ -80,7 +73,7 @@
80
73
  v-bind="props"
81
74
  v-model="endDate"
82
75
  label="End Date"
83
- density="compact"
76
+ class="filter-field"
84
77
  variant="outlined"
85
78
  readonly
86
79
  hide-details
@@ -101,7 +94,7 @@
101
94
  </v-row>
102
95
 
103
96
  <v-sheet
104
- class="overflow-y-auto flex-grow-1 pa-3"
97
+ class="chat-nav__list overflow-y-auto flex-grow-1 pa-3"
105
98
  :style="{ height: 'calc(100vh - 320px)', overflowX: 'hidden' }"
106
99
  >
107
100
  <v-row dense>
@@ -148,3 +141,22 @@ function _search() {
148
141
  emit("search", search.value);
149
142
  }
150
143
  </script>
144
+
145
+ <style scoped>
146
+ /* Same two hard-coded #e0e0e0 hairlines the chat panel carried, on --border. */
147
+ .chat-nav {
148
+ background: var(--card);
149
+ border-right: 1px solid var(--border);
150
+ border-top: 1px solid var(--border);
151
+ }
152
+
153
+ .chat-nav__list {
154
+ background: var(--bg);
155
+ }
156
+
157
+ .chat-nav__to {
158
+ font-family: var(--font-sans);
159
+ font-size: var(--fs-cell);
160
+ color: var(--muted);
161
+ }
162
+ </style>
@@ -98,11 +98,15 @@
98
98
  </template>
99
99
  </TableMain>
100
100
  <div v-else class="pa-4">
101
- <v-card variant="outlined" class="pa-4">
102
- <div class="text-subtitle-1">
101
+ <!--
102
+ Was an outlined `v-card` painted from Vuetify's own `surface`. The
103
+ design's card, and the notice at the design's cell size.
104
+ -->
105
+ <AppCard class="pa-4">
106
+ <div class="cs-no-permission">
103
107
  You do not have permission to view cleaning schedules.
104
108
  </div>
105
- </v-card>
109
+ </AppCard>
106
110
  </div>
107
111
  </v-col>
108
112
  </v-row>
@@ -327,3 +331,11 @@ function showMessage(msg: string, color: string = "error") {
327
331
  }
328
332
  }
329
333
  </script>
334
+
335
+ <style scoped>
336
+ .cs-no-permission {
337
+ font-family: var(--font-sans);
338
+ font-size: var(--fs-cell);
339
+ color: var(--muted);
340
+ }
341
+ </style>
@@ -4,32 +4,25 @@
4
4
  transition="dialog-top-transition"
5
5
  max-width="1000"
6
6
  >
7
- <v-card class="pa-1">
8
- <v-toolbar>
9
- <v-spacer></v-spacer>
10
- <v-btn icon="mdi-close" @click="emit('onCloseDialog')" />
11
- </v-toolbar>
12
- <canvas id="imageCanvas" />
13
- <v-card-title class="text-end">
7
+ <v-card class="screen-modal">
8
+ <div class="draw-image__head">
14
9
  <v-btn
15
- color="orange-darken-3"
16
- size="small"
17
- variant="flat"
18
- style="height: 40px; margin-right: 12px"
19
- @click="onClearDrawing()"
20
- >
10
+ class="screen-modal__close"
11
+ variant="text"
12
+ icon="mdi-close"
13
+ aria-label="Close"
14
+ @click="emit('onCloseDialog')"
15
+ />
16
+ </div>
17
+ <canvas id="imageCanvas" />
18
+ <div class="screen-modal__footer">
19
+ <v-btn class="screen-btn-ghost" variant="outlined" @click="onClearDrawing()">
21
20
  Clear Drawing
22
21
  </v-btn>
23
- <v-btn
24
- color="blue-darken-3"
25
- size="small"
26
- variant="flat"
27
- style="height: 40px"
28
- @click="submit"
29
- >
22
+ <v-btn class="screen-btn-primary" variant="flat" @click="submit">
30
23
  Submit
31
24
  </v-btn>
32
- </v-card-title>
25
+ </div>
33
26
  </v-card>
34
27
  </v-dialog>
35
28
  </template>
@@ -170,3 +163,18 @@ async function onClearDrawing() {
170
163
  ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
171
164
  }
172
165
  </script>
166
+
167
+ <style scoped>
168
+ /* The design's modal has a title row; this dialog has never had a title, only
169
+ a close - so the row keeps that and just moves the close onto the design's
170
+ borderless 32px square. No copy invented. */
171
+ .draw-image__head {
172
+ display: flex;
173
+ justify-content: flex-end;
174
+ padding: 12px 12px 0;
175
+ }
176
+
177
+ /* The canvas itself is untouched: its width/height are computed in script from
178
+ its own bounding box, so a layout rule here would quietly move the drawing
179
+ coordinates - a behaviour change no render can prove. */
180
+ </style>
@@ -198,22 +198,28 @@
198
198
  </v-dialog>
199
199
 
200
200
  <!-- Main Equipment Item Dialog -->
201
+ <!--
202
+ All three dialogs were hand-drawn: a 20px/700 title bar, a divider, and a
203
+ `v-card-actions` footer of two 56px block buttons with square corners, the
204
+ confirm one on `color="black"` - not a token, so it painted a light-theme
205
+ fill on the dark theme. The shared `.screen-modal` shape now. Same fields,
206
+ same labels, same handlers, same busy states.
207
+ -->
201
208
  <v-dialog v-model="dialogEquipmentItem" max-width="540" persistent>
202
- <v-card>
203
- <v-card-title class="d-flex align-center pa-4">
204
- <span class="text-h6 font-weight-bold">Equipment Item</span>
209
+ <v-card class="screen-modal">
210
+ <v-card-title class="d-flex align-center">
211
+ Equipment Item
205
212
  <v-spacer />
206
213
  <v-btn
207
214
  icon="mdi-close"
208
215
  variant="text"
209
- size="small"
216
+ class="screen-modal__close"
217
+ aria-label="Close"
210
218
  @click="dialogEquipmentItem = false"
211
219
  />
212
220
  </v-card-title>
213
221
 
214
- <v-divider />
215
-
216
- <v-card-text class="pa-6">
222
+ <v-card-text class="screen-modal__body">
217
223
  <v-form ref="equipmentItemFormRef">
218
224
  <!-- Add Equipment Section -->
219
225
  <v-row no-gutters class="mb-4">
@@ -374,49 +380,40 @@
374
380
  </v-form>
375
381
  </v-card-text>
376
382
 
377
- <v-divider />
378
-
379
- <v-card-actions class="pa-0">
380
- <v-row no-gutters>
381
- <v-col cols="6">
382
- <v-btn
383
- block
384
- variant="text"
385
- size="large"
386
- height="56"
387
- class="text-none font-weight-medium rounded-0"
388
- @click="dialogEquipmentItem = false"
389
- >
390
- Cancel
391
- </v-btn>
392
- </v-col>
393
- <v-col cols="6">
394
- <v-btn
395
- block
396
- variant="flat"
397
- color="black"
398
- size="large"
399
- height="56"
400
- class="text-none font-weight-bold rounded-0"
401
- :loading="submitting"
402
- @click="_equipmentItem()"
403
- >
404
- Checkout Item
405
- </v-btn>
406
- </v-col>
407
- </v-row>
408
- </v-card-actions>
383
+ <div class="screen-modal__footer">
384
+ <v-btn
385
+ class="screen-btn-ghost"
386
+ variant="outlined"
387
+ :disabled="submitting"
388
+ @click="dialogEquipmentItem = false"
389
+ >
390
+ Cancel
391
+ </v-btn>
392
+ <v-btn
393
+ class="screen-btn-primary"
394
+ variant="flat"
395
+ :loading="submitting"
396
+ @click="_equipmentItem()"
397
+ >
398
+ Checkout Item
399
+ </v-btn>
400
+ </div>
409
401
  </v-card>
410
402
  </v-dialog>
411
403
 
412
404
  <Snackbar v-model="messageSnackbar" :text="message" :color="messageColor" />
413
405
 
414
406
  <v-dialog v-model="dialogPhotoForItem" max-width="720" persistent>
415
- <v-card rounded="lg">
416
- <v-card-title class="d-flex align-center pa-4">
407
+ <v-card class="screen-modal">
408
+ <v-card-title class="d-flex align-center">
417
409
  <div>
418
- <div class="text-h6 font-weight-bold">Item Photos</div>
419
- <div class="text-caption text-medium-emphasis">
410
+ Item Photos
411
+ <!--
412
+ The handoff draws no sub-line under a modal title. `--muted` at
413
+ 12px, the figure batch I's `AttachmentsViewer` settled on, rather
414
+ than a third number.
415
+ -->
416
+ <div class="eqi-modal-sub">
420
417
  {{ equipmentItems[activePhotoIndex ?? 0]?.supplyName || "Item" }}
421
418
  </div>
422
419
  </div>
@@ -426,15 +423,14 @@
426
423
  <v-btn
427
424
  icon="mdi-close"
428
425
  variant="text"
429
- size="small"
426
+ class="screen-modal__close"
427
+ aria-label="Close"
430
428
  @click="dialogPhotoForItem = false"
431
429
  />
432
430
  </v-card-title>
433
431
 
434
- <v-divider />
435
-
436
432
  <!-- Body -->
437
- <v-card-text class="pa-6" v-if="activePhotoIndex !== null">
433
+ <v-card-text class="screen-modal__body" v-if="activePhotoIndex !== null">
438
434
  <PhotoUpload
439
435
  title="Add / Take Photos"
440
436
  v-model="currentPhotos"
@@ -443,63 +439,42 @@
443
439
  />
444
440
  </v-card-text>
445
441
 
446
- <v-divider />
447
-
448
442
  <!-- Footer -->
449
- <v-card-actions class="pa-0">
450
- <v-row no-gutters class="w-100">
451
- <v-col cols="6">
452
- <v-btn
453
- block
454
- variant="text"
455
- size="large"
456
- height="56"
457
- class="text-none font-weight-medium rounded-0"
458
- @click="dialogPhotoForItem = false"
459
- >
460
- Cancel
461
- </v-btn>
462
- </v-col>
463
-
464
- <v-col cols="6">
465
- <v-btn
466
- block
467
- variant="flat"
468
- color="black"
469
- size="large"
470
- height="56"
471
- class="text-none font-weight-bold rounded-0"
472
- @click="dialogPhotoForItem = false"
473
- >
474
- Done
475
- </v-btn>
476
- </v-col>
477
- </v-row>
478
- </v-card-actions>
443
+ <div class="screen-modal__footer">
444
+ <v-btn
445
+ class="screen-btn-ghost"
446
+ variant="outlined"
447
+ @click="dialogPhotoForItem = false"
448
+ >
449
+ Cancel
450
+ </v-btn>
451
+ <v-btn
452
+ class="screen-btn-primary"
453
+ variant="flat"
454
+ @click="dialogPhotoForItem = false"
455
+ >
456
+ Done
457
+ </v-btn>
458
+ </div>
479
459
  </v-card>
480
460
  </v-dialog>
481
461
 
482
462
  <v-dialog v-model="showAttachmentDialog" max-width="720" persistent>
483
- <v-card rounded="lg">
484
- <v-card-title class="d-flex align-center pa-4">
485
- <div>
486
- <div class="text-h6 font-weight-bold">Attachment</div>
487
- </div>
488
-
463
+ <v-card class="screen-modal">
464
+ <v-card-title class="d-flex align-center">
465
+ Attachment
489
466
  <v-spacer />
490
-
491
467
  <v-btn
492
468
  icon="mdi-close"
493
469
  variant="text"
494
- size="small"
470
+ class="screen-modal__close"
471
+ aria-label="Close"
495
472
  @click="(showAttachmentDialog = false), (attachmentUrl = '')"
496
473
  />
497
474
  </v-card-title>
498
475
 
499
- <v-divider />
500
-
501
476
  <!-- Body -->
502
- <v-card-text class="pa-6">
477
+ <v-card-text class="screen-modal__body">
503
478
  <v-img :src="attachmentUrl" contain />
504
479
  </v-card-text>
505
480
  </v-card>
@@ -817,4 +792,18 @@ const currentPhotoIds = computed({
817
792
  });
818
793
  </script>
819
794
 
820
- <style scoped></style>
795
+ <style scoped>
796
+ /*
797
+ The sub-line under the "Item Photos" title. The handoff draws no such line,
798
+ so it takes the figure already settled on for one: `--muted` at 12px.
799
+ Scoped to `.v-card-title` because Vuetify's own title rule would otherwise
800
+ hand it the 20px it gives everything inside.
801
+ */
802
+ .screen-modal .v-card-title .eqi-modal-sub {
803
+ font-family: var(--font-sans);
804
+ font-size: 12px;
805
+ font-weight: 400;
806
+ line-height: 1.4;
807
+ color: var(--muted);
808
+ }
809
+ </style>