@7365admin1/layer-common 3.2.7 → 3.2.8-staging.201

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.
Files changed (283) hide show
  1. package/assets/css/primitives.css +1113 -0
  2. package/assets/css/screens.css +1097 -0
  3. package/assets/css/shell.css +258 -0
  4. package/assets/css/tokens.css +236 -0
  5. package/components/AcceptDialog.vue +17 -18
  6. package/components/AccessCard/AvailableStats.vue +24 -16
  7. package/components/AccessCardAddForm.vue +42 -42
  8. package/components/AccessCardAssignToUnitForm.vue +13 -21
  9. package/components/AccessCardDeleteDialog.vue +41 -39
  10. package/components/AccessCardDetailsDialog.vue +125 -79
  11. package/components/AccessCardPreviewDialog.vue +58 -84
  12. package/components/AccessCardQrTagging.vue +60 -63
  13. package/components/AccessCardReplaceForm.vue +27 -23
  14. package/components/AccessManagement.vue +86 -85
  15. package/components/AddEqupmentForm.vue +18 -22
  16. package/components/AddPassKeyToVisitor.vue +95 -73
  17. package/components/AppButton.vue +62 -0
  18. package/components/AppCard.vue +20 -0
  19. package/components/AppDateField.vue +49 -0
  20. package/components/AppField.vue +76 -0
  21. package/components/AppKpiTile.vue +65 -0
  22. package/components/AppSegmented.vue +38 -0
  23. package/components/AppSelect.vue +247 -0
  24. package/components/AreaChecklistHistoryLogs.vue +51 -44
  25. package/components/AreaChecklistHistoryMain.vue +14 -7
  26. package/components/AreaFormDialog.vue +71 -59
  27. package/components/AreaMain.vue +73 -107
  28. package/components/AttachmentsViewer.vue +84 -22
  29. package/components/AttendanceCheckInOutDialog.vue +85 -88
  30. package/components/AttendanceDetailsDialog.vue +57 -63
  31. package/components/AttendanceMain.vue +4 -3
  32. package/components/AttendanceMapSearchDialog.vue +42 -44
  33. package/components/AttendanceSettingsDialog.vue +79 -63
  34. package/components/Avatar/Main.vue +54 -2
  35. package/components/BillingMain.vue +26 -30
  36. package/components/BtnUploadFile.vue +53 -11
  37. package/components/BuildingForm.vue +34 -27
  38. package/components/BuildingManagement/buildings.vue +39 -39
  39. package/components/BuildingManagement/units.vue +26 -42
  40. package/components/BuildingUnitFormAdd.vue +20 -23
  41. package/components/BuildingUnitFormEdit.vue +8 -4
  42. package/components/BulletinBoardForm.vue +19 -24
  43. package/components/BulletinBoardManagement.vue +49 -57
  44. package/components/BulletinBoardView.vue +9 -6
  45. package/components/BulletinExpirationChip.vue +13 -4
  46. package/components/Button/Close.vue +2 -2
  47. package/components/CameraForm.vue +21 -22
  48. package/components/CameraMain.vue +50 -49
  49. package/components/Card/DeleteConfirmation.vue +24 -22
  50. package/components/Card/MemberInfoSummary.vue +28 -3
  51. package/components/Card/Toggle.vue +15 -3
  52. package/components/CardToolbar.vue +37 -0
  53. package/components/Carousel.vue +56 -36
  54. package/components/Chat/Bubbles.vue +43 -14
  55. package/components/Chat/Information.vue +49 -32
  56. package/components/Chat/ListCard.vue +38 -9
  57. package/components/Chat/Message.vue +41 -15
  58. package/components/Chat/Navigation.vue +27 -15
  59. package/components/Chat/SkeletonLoader.vue +9 -2
  60. package/components/ChecklistItemRow.vue +25 -1
  61. package/components/CleaningScheduleMain.vue +44 -49
  62. package/components/ClientDetailForm.vue +81 -56
  63. package/components/ClientMain.vue +92 -82
  64. package/components/ConfirmDialog.vue +14 -8
  65. package/components/Container/Standard.vue +9 -7
  66. package/components/CreateSubsciptionPlan.vue +148 -89
  67. package/components/DashboardEmptyState.vue +48 -3
  68. package/components/DashboardMain.vue +924 -676
  69. package/components/DashboardPanel.vue +84 -21
  70. package/components/DeliveryCompany.vue +34 -20
  71. package/components/Dialog/DeleteConfirmation.vue +20 -21
  72. package/components/Dialog/ReplaceAutofillPrompt.vue +19 -26
  73. package/components/Dialog/ReusablePrompt.vue +30 -29
  74. package/components/Dialog/UpdateMoreAction.vue +62 -59
  75. package/components/DocumentForm.vue +14 -21
  76. package/components/DocumentManagement.vue +162 -108
  77. package/components/DocumentViewer.vue +29 -12
  78. package/components/DrawImage.vue +29 -21
  79. package/components/EntryPass/QrTemplatePreview.vue +27 -16
  80. package/components/EntryPassInformation.vue +40 -10
  81. package/components/EntryPassMain.vue +49 -27
  82. package/components/EquipmentItemMain.vue +84 -97
  83. package/components/EquipmentManagementMain.vue +81 -103
  84. package/components/Facility/BookingSetup.vue +43 -52
  85. package/components/Feedback/Form.vue +26 -12
  86. package/components/FeedbackMain.vue +35 -49
  87. package/components/FileInput.vue +75 -58
  88. package/components/FileInputWithList.vue +59 -12
  89. package/components/FormDialog.vue +60 -21
  90. package/components/HidAccessLogDashboard.vue +512 -490
  91. package/components/HidCameraCaptureDialog.vue +216 -0
  92. package/components/HidEnabledGate.vue +67 -9
  93. package/components/HidIntercomManagement.vue +1322 -653
  94. package/components/HidQrCodeConfiguration.vue +1030 -258
  95. package/components/HidReaderForm.vue +142 -59
  96. package/components/HidReaderManagement.vue +211 -323
  97. package/components/HidServiceSettingsPanel.vue +44 -13
  98. package/components/HidUserEnrollment.vue +1185 -412
  99. package/components/HygieneUpdateMoreAction.vue +44 -44
  100. package/components/IncidentReport/Authorities.vue +30 -18
  101. package/components/IncidentReport/IncidentInformation.vue +10 -10
  102. package/components/IncidentReport/IncidentInformationDownload.vue +3 -4
  103. package/components/IncidentReport/affectedEntities.vue +41 -20
  104. package/components/Input/Date.vue +3 -0
  105. package/components/Input/DatePicker.vue +1 -2
  106. package/components/Input/DateTimePicker.vue +1 -1
  107. package/components/Input/File.vue +55 -10
  108. package/components/Input/FileV2.vue +39 -6
  109. package/components/Input/InputPhoneNumberV2.vue +2 -1
  110. package/components/Input/ListGroupSelection.vue +56 -8
  111. package/components/Input/NRICNumber.vue +1 -0
  112. package/components/Input/NewDate.vue +1 -0
  113. package/components/Input/Number.vue +1 -0
  114. package/components/Input/Password.vue +1 -0
  115. package/components/Input/PhoneNumber.vue +21 -1
  116. package/components/Input/VehicleNumber.vue +1 -0
  117. package/components/InputLabel.vue +2 -2
  118. package/components/InvitationClientForm.vue +21 -19
  119. package/components/InvitationForm.vue +15 -21
  120. package/components/InvitationMain.vue +46 -61
  121. package/components/Layout/Header.vue +263 -36
  122. package/components/Layout/NavigationDrawer.vue +300 -30
  123. package/components/ListItem.vue +33 -3
  124. package/components/LocalPagination.vue +27 -3
  125. package/components/ManageChecklistMain.vue +136 -86
  126. package/components/MemberInformation.vue +32 -16
  127. package/components/MemberMain.vue +113 -93
  128. package/components/MyAttendanceMain.vue +3 -5
  129. package/components/NavigationItem.vue +83 -3
  130. package/components/Nfc/NFCPatrolReportMain.vue +47 -33
  131. package/components/Nfc/NFCPatrolRouteForm.vue +18 -20
  132. package/components/Nfc/NFCPatrolRouteMain.vue +116 -103
  133. package/components/Nfc/NFCPatrolSettings.vue +14 -4
  134. package/components/Nfc/NFCTagForm.vue +22 -8
  135. package/components/Nfc/NFCTagMain.vue +41 -43
  136. package/components/Nfc/PatrolReport/DailyReportTab.vue +8 -1
  137. package/components/Nfc/PatrolReport/MonthlyReportTab.vue +8 -1
  138. package/components/Nfc/PatrolReport/MonthlyReportTable.vue +5 -3
  139. package/components/Nfc/PatrolReport/PatrolActivityTable.vue +26 -6
  140. package/components/Nfc/PatrolReport/PatrolReportTab.vue +8 -0
  141. package/components/Nfc/PatrolReport/PatrolRouteSummary.vue +41 -9
  142. package/components/Nfc/PatrolReport/RemarksDialog.vue +39 -9
  143. package/components/Nfc/PatrolReport/ReportEmptyState.vue +29 -9
  144. package/components/Nfc/PatrolReport/ReportFilters.vue +19 -10
  145. package/components/Nfc/PatrolReport/ReportLocationHeader.vue +32 -6
  146. package/components/Nfc/PatrolReport/SummaryReportTable.vue +28 -6
  147. package/components/NotificationSettings.vue +373 -0
  148. package/components/NumberSettingField.vue +9 -2
  149. package/components/OnlineFormConfigurationForm.vue +725 -237
  150. package/components/OnlineFormFill.vue +213 -106
  151. package/components/OnlineFormRenderPreview.vue +25 -30
  152. package/components/OnlineFormsConfiguration.vue +113 -109
  153. package/components/OrgViewDialog.vue +34 -16
  154. package/components/OvernightParkingAvailability.vue +49 -26
  155. package/components/OvernightParkingManagement.vue +78 -18
  156. package/components/PageHeader.vue +43 -0
  157. package/components/PassInformation.vue +109 -53
  158. package/components/PasswordConfirmation.vue +44 -26
  159. package/components/PeopleForm.vue +41 -20
  160. package/components/PhotoUpload.vue +110 -48
  161. package/components/PlaceholderComponent.vue +35 -19
  162. package/components/PlanActionsMenu.vue +12 -2
  163. package/components/PlanStatusBadge.vue +7 -8
  164. package/components/PlateNumberDisplay.vue +9 -6
  165. package/components/QrTemplate/PrintDialog.vue +66 -43
  166. package/components/RolePermissionFormCreate.vue +104 -79
  167. package/components/RolePermissionFormPreviewUpdate.vue +111 -109
  168. package/components/RolePermissionMain.vue +183 -81
  169. package/components/ScanVisitorQRCode.vue +99 -35
  170. package/components/ScheduleAreaMain.vue +34 -59
  171. package/components/ScheduleTaskForm.vue +61 -42
  172. package/components/ScheduleTaskMain.vue +56 -69
  173. package/components/SearchVehicleNumberUser.vue +39 -37
  174. package/components/ServiceProviderFormCreate.vue +29 -20
  175. package/components/ServiceProviderInvitationPrompt.vue +155 -0
  176. package/components/ServiceProviderMain.vue +601 -432
  177. package/components/Signature.vue +40 -34
  178. package/components/SignaturePad.vue +5 -29
  179. package/components/SiteSettings.vue +41 -11
  180. package/components/SiteSettingsWorkOrder.vue +61 -30
  181. package/components/SlideCardGroup.vue +35 -11
  182. package/components/Snackbar.vue +36 -3
  183. package/components/SpecificAttr.vue +18 -8
  184. package/components/StatusChip.vue +156 -0
  185. package/components/StockCard.vue +17 -12
  186. package/components/SubscriptionPlanTable.vue +207 -140
  187. package/components/SwitchContext.vue +201 -9
  188. package/components/TableHygiene.vue +36 -46
  189. package/components/TableList.vue +10 -10
  190. package/components/TableListSecondary.vue +105 -54
  191. package/components/TableMain.vue +251 -78
  192. package/components/TableV3.vue +61 -70
  193. package/components/TiptapEditor.vue +33 -40
  194. package/components/TiptapEditorQr.vue +5 -2
  195. package/components/Tooltip/Info.vue +69 -24
  196. package/components/UnitMain.vue +40 -60
  197. package/components/UnitPersonCard.vue +42 -13
  198. package/components/VehicleAddSelection.vue +48 -32
  199. package/components/VehicleForm.vue +112 -129
  200. package/components/VehicleManagement.vue +26 -12
  201. package/components/VehicleUpdateMoreAction.vue +59 -46
  202. package/components/VisitorDataFromScannedQRCodeForm.vue +90 -65
  203. package/components/VisitorForm.vue +774 -210
  204. package/components/VisitorFormSelection.vue +40 -37
  205. package/components/VisitorManagement.vue +239 -82
  206. package/components/VisitorPassKeyQRScanner.vue +65 -18
  207. package/components/VisitorSearchResultSummary.vue +60 -16
  208. package/components/VisitorSocketPopUp.vue +22 -14
  209. package/components/VisitorsReportPreview.vue +44 -29
  210. package/components/WorkOrder/Create.vue +26 -17
  211. package/components/WorkOrder/ListView.vue +38 -7
  212. package/components/WorkOrder/Main.vue +62 -59
  213. package/composables/useFeedback.ts +3 -3
  214. package/composables/useHidAmico.ts +269 -0
  215. package/composables/useHidNavigation.ts +2 -9
  216. package/composables/useMember.ts +3 -3
  217. package/composables/useNFCPatrolDailyReport.ts +13 -0
  218. package/composables/useNFCPatrolMonthlyReport.ts +22 -56
  219. package/composables/useNFCPatrolReport.ts +13 -0
  220. package/composables/useNotificationPreference.ts +87 -0
  221. package/composables/useOnlineFormPages.ts +2 -0
  222. package/composables/useRole.ts +22 -0
  223. package/composables/useServiceProvider.ts +3 -3
  224. package/composables/useServiceProviderInvitation.ts +145 -0
  225. package/composables/useSipWebPhone.ts +336 -0
  226. package/composables/useSubscriptionPlan.ts +62 -0
  227. package/composables/useThemePreference.ts +63 -0
  228. package/composables/useVisitor.ts +6 -1
  229. package/composables/useWebUsb.ts +127 -37
  230. package/composables/useWorkOrder.ts +17 -3
  231. package/error.vue +30 -6
  232. package/nuxt.config.ts +36 -0
  233. package/package.json +25 -4
  234. package/pages/[org]/[site]/access-mgmt/administrator/index.vue +2 -2
  235. package/pages/[org]/[site]/access-mgmt/{identity-mapping → hid-cards}/index.vue +2 -2
  236. package/pages/[org]/[site]/access-mgmt/intercom/index.vue +1 -1
  237. package/pages/notification-settings.vue +19 -0
  238. package/pages/payment-method-linked.vue +34 -10
  239. package/pages/require-customer.vue +48 -10
  240. package/pages/require-organization-membership.vue +32 -8
  241. package/pages/unauthorized.vue +29 -4
  242. package/plugins/secure-member.client.ts +21 -56
  243. package/plugins/vuetify.ts +69 -2
  244. package/types/nfc-patrol-report.ts +3 -2
  245. package/types/site.d.ts +71 -0
  246. package/types/subscription.ts +18 -11
  247. package/utils/breadcrumb.test.ts +108 -0
  248. package/utils/breadcrumb.ts +82 -0
  249. package/utils/dashboard.test.ts +118 -0
  250. package/utils/dashboard.ts +53 -0
  251. package/utils/data.test.ts +95 -0
  252. package/utils/data.ts +40 -2
  253. package/utils/hid-discover.test.ts +102 -0
  254. package/utils/list-page.test.ts +60 -0
  255. package/utils/list-page.ts +38 -0
  256. package/utils/materialSymbols.ts +363 -0
  257. package/utils/nav-sections.test.ts +190 -0
  258. package/utils/nav-sections.ts +151 -0
  259. package/utils/nfc-patrol-report.test.ts +130 -0
  260. package/utils/nfc-patrol-report.ts +101 -0
  261. package/utils/role.test.ts +69 -0
  262. package/utils/role.ts +10 -0
  263. package/utils/route-name.test.ts +85 -0
  264. package/utils/route-name.ts +24 -0
  265. package/utils/status.test.ts +110 -0
  266. package/utils/status.ts +135 -0
  267. package/utils/table-card.test.ts +84 -0
  268. package/utils/theme-aa-ledger.ts +148 -0
  269. package/utils/theme.test.ts +485 -7
  270. package/utils/theme.ts +295 -110
  271. package/.changeset/README.md +0 -8
  272. package/.changeset/config.json +0 -11
  273. package/.editorconfig +0 -12
  274. package/.github/workflows/main.yml +0 -17
  275. package/.github/workflows/publish-staging.yml +0 -47
  276. package/.github/workflows/publish.yml +0 -39
  277. package/PUBLISHING.md +0 -269
  278. package/components/HidIdentityMapping.vue +0 -975
  279. package/components/ScheduleTaskAreaFormDialog.vue +0 -144
  280. package/components/ScheduleTaskAreaUpdateMoreAction.vue +0 -109
  281. package/components/ScheduleTastTicketMain.vue +0 -182
  282. package/components/TableWithButton.vue +0 -94
  283. package/test/visitor-socket.test.mjs +0 -36
@@ -8,7 +8,7 @@
8
8
  item-title="dial_code"
9
9
  item-value="code"
10
10
  hide-details
11
- class="px-0"
11
+ class="px-0 filter-field"
12
12
  :density="density"
13
13
  style="max-width: 110px"
14
14
  :rules="[...props.rules]"
@@ -31,6 +31,7 @@
31
31
 
32
32
  <v-mask-input
33
33
  v-model="input"
34
+ class="filter-field"
34
35
  :mask="currentMask"
35
36
  :rules="[...props.rules, validatePhone]"
36
37
  ref="maskRef"
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <v-input v-bind="attrs">
3
- <v-card width="100%" v-bind="attrs">
3
+ <v-card class="perm-list screen-card" elevation="0" width="100%" v-bind="attrs">
4
4
  <v-list
5
5
  v-model:selected="selected"
6
6
  lines="two"
@@ -18,14 +18,14 @@
18
18
  <v-list-group :value="permissionKey" fluid>
19
19
  <template v-slot:activator="{ props }">
20
20
  <v-list-item v-bind="props" density="compact">
21
- <span class="text-capitalize">
21
+ <span class="perm-list__group text-capitalize">
22
22
  {{ formatResourceLabel(String(permissionKey)) }}
23
23
  </span>
24
24
 
25
25
  <template #prepend>
26
- <v-chip class="mr-2" small>
26
+ <span class="perm-list__count mr-2">
27
27
  {{ selectedActionCount(String(permissionKey)) }}
28
- </v-chip>
28
+ </span>
29
29
  </template>
30
30
  </v-list-item>
31
31
  </template>
@@ -34,13 +34,13 @@
34
34
  <v-divider></v-divider>
35
35
  <v-list-item v-if="attrs.readonly" density="compact">
36
36
  <template #title class="pl-2">
37
- <span class="text-subtitle-2 text-capitalize">
37
+ <span class="perm-list__title text-capitalize">
38
38
  {{ String(itemKey).replace(/-/g, " ") }}
39
39
  </span>
40
40
  </template>
41
41
 
42
42
  <template #subtitle class="pl-2">
43
- <span class="text-subtitle-2">{{ item.description }}</span>
43
+ <span class="perm-list__sub">{{ item.description }}</span>
44
44
  </template>
45
45
  </v-list-item>
46
46
 
@@ -50,13 +50,13 @@
50
50
  density="compact"
51
51
  >
52
52
  <template #title class="pl-2">
53
- <span class="text-subtitle-2 text-capitalize">
53
+ <span class="perm-list__title text-capitalize">
54
54
  {{ String(itemKey).replace(/-/g, " ") }}
55
55
  </span>
56
56
  </template>
57
57
 
58
58
  <template #subtitle class="pl-2">
59
- <span class="text-subtitle-2 text-capitalize">
59
+ <span class="perm-list__sub text-capitalize">
60
60
  {{ String(item.description).replace(/-/g, " ") }}
61
61
  </span>
62
62
  </template>
@@ -101,3 +101,51 @@ const selectedActionCount = (resource: string) => {
101
101
  .length;
102
102
  };
103
103
  </script>
104
+
105
+ <style scoped>
106
+ .perm-list {
107
+ font-family: var(--font-sans);
108
+ }
109
+
110
+ .perm-list__group {
111
+ font-size: var(--fs-cell);
112
+ font-weight: 600;
113
+ color: var(--text);
114
+ }
115
+
116
+ /**
117
+ * The count beside each permission group. The handoff draws no counter here at
118
+ * all, so this is the neutral chip's own geometry - 999px, 12px/700, the tone
119
+ * wash - rather than a new shape: a `v-chip small`, which is what it was, is
120
+ * 24px of Vuetify grey with its own font.
121
+ */
122
+ .perm-list__count {
123
+ display: inline-flex;
124
+ align-items: center;
125
+ justify-content: center;
126
+ min-width: 24px;
127
+ height: 20px;
128
+ padding: 0 8px;
129
+ border-radius: var(--r-pill);
130
+ background: var(--hover);
131
+ color: var(--text2);
132
+ font-size: var(--fs-chip);
133
+ font-weight: 700;
134
+ }
135
+
136
+ /* A ticked row was Vuetify's own rgb(224,224,224) slab - a light-theme grey
137
+ painted on the dark theme too. Same emphasis, on the design's hover wash. */
138
+ .perm-list :deep(.v-list-item--active) {
139
+ background: var(--hover);
140
+ }
141
+
142
+ .perm-list__title {
143
+ font-size: var(--fs-cell);
144
+ color: var(--text);
145
+ }
146
+
147
+ .perm-list__sub {
148
+ font-size: var(--fs-cell-dense);
149
+ color: var(--muted);
150
+ }
151
+ </style>
@@ -1,6 +1,7 @@
1
1
  <template>
2
2
  <v-text-field
3
3
  v-model.trim="model"
4
+ class="filter-field"
4
5
  :rules="rules"
5
6
  :maxlength="maxlength"
6
7
  :placeholder="placeholder"
@@ -113,6 +113,7 @@ const modifyDatePart = (
113
113
  <template>
114
114
  <v-text-field
115
115
  ref="inputRef"
116
+ class="filter-field"
116
117
  v-model="dateValue"
117
118
  placeholder="MM/DD/YYYY"
118
119
  @input="formatDate"
@@ -102,6 +102,7 @@ const restoreCursor = () => {
102
102
  ref="inputRef"
103
103
  v-model="formattedValue"
104
104
  v-bind="attrs"
105
+ class="filter-field"
105
106
  type="text"
106
107
  @keydown="handleKeyDown"
107
108
  >
@@ -2,6 +2,7 @@
2
2
  <v-text-field
3
3
  id="_password"
4
4
  v-model="password"
5
+ class="filter-field"
5
6
  placeholder="Password"
6
7
  :type="showPassword ? 'text' : 'password'"
7
8
  :append-inner-icon="showPassword ? 'mdi-eye-off' : 'mdi-eye'"
@@ -17,9 +17,10 @@
17
17
  zIndex: 3000
18
18
  }"
19
19
  no-data-text="No countries available"
20
+ class="filter-field"
20
21
  >
21
22
  <template #selection="{ item }">
22
- <span class="text-body-2">{{ item.raw.dialCode }}</span>
23
+ <span class="phone-input__code">{{ item.raw.dialCode }}</span>
23
24
  </template>
24
25
  <template #item="{ item }">
25
26
  <v-list-item-title>
@@ -38,6 +39,7 @@
38
39
  :rules="phoneValidationRules"
39
40
  hide-details="auto"
40
41
  type="tel"
42
+ class="filter-field"
41
43
  @input="handlePhoneInput"
42
44
  />
43
45
  </v-col>
@@ -186,3 +188,21 @@ watch(localDialCode, () => {
186
188
  }
187
189
  });
188
190
  </script>
191
+
192
+ <style scoped>
193
+ /**
194
+ * The dial-code selector and the number beside it. Both were factory Vuetify
195
+ * fields - Roboto, 4px radius, Vuetify's own border - inside forms whose every
196
+ * other field is already the design's. `.filter-field` is that field, and it is
197
+ * what `MemberInformation`, `VehicleForm` and `VisitorForm` already put around
198
+ * this control, so the two halves now match their own row.
199
+ *
200
+ * The selected dial code was `text-body-2`, Vuetify's 14px/400 Roboto scale.
201
+ * It is the same ink as a table cell, so it takes the cell's tokens.
202
+ */
203
+ .phone-input__code {
204
+ font-family: var(--font-sans);
205
+ font-size: var(--fs-cell);
206
+ color: var(--text);
207
+ }
208
+ </style>
@@ -1,6 +1,7 @@
1
1
  <template>
2
2
  <v-text-field
3
3
  v-model="model"
4
+ class="filter-field"
4
5
  :rules="rules"
5
6
  :maxlength="maxlength"
6
7
  :placeholder="placeholder"
@@ -1,6 +1,6 @@
1
1
  <template>
2
- <span :class="`text-subtitle-2 font-weight-medium ${props.class}`">
3
- {{ title }} <span v-if="props.required" class="text-error">*</span>
2
+ <span :class="`app-input-label ${props.class}`">
3
+ {{ title }} <span v-if="props.required" class="app-input-label__req">*</span>
4
4
  </span>
5
5
  </template>
6
6
 
@@ -1,14 +1,8 @@
1
1
  <template>
2
- <v-card width="100%">
3
- <v-toolbar>
4
- <v-row no-gutters class="fill-height px-6" align="center">
5
- <span class="font-weight-bold text-h5">
6
- {{ props.title }}
7
- </span>
8
- </v-row>
9
- </v-toolbar>
2
+ <v-card width="100%" class="screen-modal">
3
+ <v-card-title>{{ props.title }}</v-card-title>
10
4
 
11
- <v-card-text style="max-height: 100vh; overflow-y: auto">
5
+ <v-card-text class="screen-modal__body">
12
6
  <v-form v-model="validForm" ref="form" :disabled="disable">
13
7
  <v-row no-gutters>
14
8
 
@@ -17,6 +11,7 @@
17
11
  <InputLabel title="Email" required />
18
12
  <v-text-field
19
13
  v-model="invite.email"
14
+ class="filter-field"
20
15
  density="comfortable"
21
16
  :rules="[requiredRule, emailRule]"
22
17
  :loading="loading.verifyingEmail"
@@ -37,6 +32,7 @@
37
32
  multiple
38
33
  chips
39
34
  closable-chips
35
+ class="filter-field"
40
36
  density="comfortable"
41
37
  :rules="[requiredRule]"
42
38
  @update:model-value="handleUpdateApp"
@@ -50,8 +46,9 @@
50
46
  <v-checkbox-btn
51
47
  :model-value="invite.app.includes(item.raw.value)"
52
48
  :disabled="item.raw.disabled"
53
- color="black"
54
- density="comfortable"
49
+ color="primary"
50
+ class="filter-field"
51
+ density="comfortable"
55
52
  />
56
53
  </template>
57
54
 
@@ -79,6 +76,7 @@
79
76
  :items="roles"
80
77
  item-title="name"
81
78
  item-value="_id"
79
+ class="filter-field"
82
80
  density="comfortable"
83
81
  :rules="[requiredRule]"
84
82
  />
@@ -90,6 +88,7 @@
90
88
  <v-autocomplete
91
89
  v-model="invite.site"
92
90
  :items="sites"
91
+ class="filter-field"
93
92
  density="comfortable"
94
93
  :rules="[requiredRule]"
95
94
  @update:model-value="handleUpdateSite"
@@ -109,21 +108,24 @@
109
108
  </v-card-text>
110
109
 
111
110
  <!-- ACTION -->
112
- <v-toolbar density="compact">
111
+ <v-card-actions class="screen-modal__footer">
113
112
  <v-row no-gutters>
114
- <v-col cols="6">
115
- <v-btn block variant="text" class="text-none" size="48" @click="cancel">
113
+ <v-col cols="6" class="pr-2">
114
+ <v-btn
115
+ block
116
+ variant="outlined"
117
+ class="text-none screen-btn-ghost"
118
+ @click="cancel"
119
+ >
116
120
  Cancel
117
121
  </v-btn>
118
122
  </v-col>
119
123
 
120
- <v-col cols="6">
124
+ <v-col cols="6" class="pl-2">
121
125
  <v-btn
122
126
  block
123
127
  variant="flat"
124
- color="black"
125
- class="text-none"
126
- size="48"
128
+ class="text-none screen-btn-primary"
127
129
  :disabled="!validForm"
128
130
  :loading="loading.submittingForm"
129
131
  @click="submit"
@@ -132,7 +134,7 @@
132
134
  </v-btn>
133
135
  </v-col>
134
136
  </v-row>
135
- </v-toolbar>
137
+ </v-card-actions>
136
138
  </v-card>
137
139
  </template>
138
140
 
@@ -1,13 +1,8 @@
1
1
  <template>
2
- <v-card width="100%">
3
- <v-toolbar>
4
- <v-row no-gutters class="fill-height px-6" align="center">
5
- <span class="font-weight-bold text-h5">
6
- {{ props.title }}
7
- </span>
8
- </v-row>
9
- </v-toolbar>
10
- <v-card-text style="max-height: 100vh; overflow-y: auto">
2
+ <v-card width="100%" class="screen-modal">
3
+ <v-card-title>{{ props.title }}</v-card-title>
4
+
5
+ <v-card-text class="screen-modal__body">
11
6
  <v-form v-model="validForm" ref="form" :disabled="disable">
12
7
  <v-row no-gutters>
13
8
  <v-col cols="12" class="mt-2">
@@ -16,6 +11,7 @@
16
11
  <v-col cols="12">
17
12
  <v-text-field
18
13
  v-model="invite.email"
14
+ class="filter-field"
19
15
  density="comfortable"
20
16
  :rules="[requiredRule, emailRule]"
21
17
  :loading="loading.verifyingEmail"
@@ -34,6 +30,7 @@
34
30
  <v-col cols="12">
35
31
  <v-autocomplete
36
32
  v-model="invite.app"
33
+ class="filter-field"
37
34
  density="comfortable"
38
35
  :rules="[requiredRule]"
39
36
  :items="apps"
@@ -53,6 +50,7 @@
53
50
  item-title="name"
54
51
  item-value="_id"
55
52
  :rules="[requiredRule]"
53
+ class="filter-field"
56
54
  density="comfortable"
57
55
  ></v-autocomplete>
58
56
  </v-col>
@@ -66,6 +64,7 @@
66
64
  <v-autocomplete
67
65
  v-model="invite.site"
68
66
  :items="sites"
67
+ class="filter-field"
69
68
  density="comfortable"
70
69
  :rules="[requiredRule]"
71
70
  @update:model-value="handleUpdateSite"
@@ -99,29 +98,24 @@
99
98
  </v-form>
100
99
  </v-card-text>
101
100
 
102
- <v-toolbar density="compact">
101
+ <v-card-actions class="screen-modal__footer">
103
102
  <v-row no-gutters>
104
- <v-col cols="6">
103
+ <v-col cols="6" class="pr-2">
105
104
  <v-btn
106
- tile
107
105
  block
108
- variant="text"
109
- class="text-none"
110
- size="48"
106
+ variant="outlined"
107
+ class="text-none screen-btn-ghost"
111
108
  @click="cancel"
112
109
  >
113
110
  {{ props.cancelText }}
114
111
  </v-btn>
115
112
  </v-col>
116
113
 
117
- <v-col cols="6">
114
+ <v-col cols="6" class="pl-2">
118
115
  <v-btn
119
- tile
120
116
  block
121
117
  variant="flat"
122
- color="black"
123
- class="text-none"
124
- size="48"
118
+ class="text-none screen-btn-primary"
125
119
  :disabled="!validForm"
126
120
  :loading="loading.submittingForm"
127
121
  @click="submit"
@@ -130,7 +124,7 @@
130
124
  </v-btn>
131
125
  </v-col>
132
126
  </v-row>
133
- </v-toolbar>
127
+ </v-card-actions>
134
128
  </v-card>
135
129
  </template>
136
130
 
@@ -1,67 +1,45 @@
1
1
  <template>
2
- <v-row no-gutters>
3
- <v-col cols="12" class="mb-2">
4
- <v-row no-gutters>
5
- <v-btn
6
- class="text-none mr-2"
7
- rounded="pill"
8
- variant="tonal"
9
- size="large"
10
- @click="inviteMember()"
11
- v-if="props.inviteMember"
12
- >
13
- Invite member
14
- </v-btn>
15
- </v-row>
16
- </v-col>
2
+ <div>
3
+ <!-- The design's page scaffold: a title with the action on the right of
4
+ that line, then ONE row inside the card - the two tabs on the left,
5
+ refresh, the range and the pager on the right. The tabs route exactly
6
+ as they did; only where they sit has changed. -->
7
+ <PageHeader title="Invitations">
8
+ <template v-if="props.inviteMember" #actions>
9
+ <AppButton @click="inviteMember()">Invite member</AppButton>
10
+ </template>
11
+ </PageHeader>
12
+
13
+ <v-row no-gutters>
17
14
  <v-col cols="12">
18
- <v-card width="100%" variant="outlined" border="thin" rounded="lg">
19
- <v-toolbar density="compact" color="grey-lighten-4">
20
- <template #prepend>
21
- <v-btn
22
- fab
23
- icon
24
- density="comfortable"
25
- @click="getVerifications()"
15
+ <AppCard class="table-card">
16
+ <CardToolbar :count="pageRange">
17
+ <template #tabs>
18
+ <NuxtLink
19
+ v-for="tab in invitationTabs"
20
+ :key="tab.status"
21
+ class="app-tab"
22
+ :class="{ 'app-tab--active': props.status === tab.status }"
23
+ :to="{ name: props.route, params: { status: tab.status } }"
26
24
  >
27
- <v-icon>mdi-refresh</v-icon>
28
- </v-btn>
25
+ {{ tab.label }}
26
+ </NuxtLink>
29
27
  </template>
30
28
 
31
- <template #append>
32
- <v-row no-gutters justify="end" align="center">
33
- <span class="mr-2 text-caption text-fontgray">
34
- {{ pageRange }}
35
- </span>
36
- <local-pagination
37
- v-model="page"
38
- :length="pages"
39
- @update:value="getVerifications"
40
- />
41
- </v-row>
42
- </template>
43
-
44
- <template #extension>
45
- <v-tabs>
46
- <v-tab
47
- :to="{
48
- name: props.route,
49
- params: { status: 'pending' },
50
- }"
51
- >
52
- Pending
53
- </v-tab>
54
- <v-tab
55
- :to="{
56
- name: props.route,
57
- params: { status: 'expired' },
58
- }"
59
- >
60
- Expired
61
- </v-tab>
62
- </v-tabs>
29
+ <template #right>
30
+ <AppButton
31
+ variant="icon"
32
+ icon="mdi-refresh"
33
+ aria-label="Refresh"
34
+ @click="getVerifications()"
35
+ />
36
+ <local-pagination
37
+ v-model="page"
38
+ :length="pages"
39
+ @update:value="getVerifications"
40
+ />
63
41
  </template>
64
- </v-toolbar>
42
+ </CardToolbar>
65
43
 
66
44
  <v-data-table
67
45
  :headers="headers"
@@ -77,7 +55,7 @@
77
55
  <span class="text-caption font-weight-bold text-capitalize">
78
56
  permissions
79
57
  </span>
80
- <v-chip>{{ value.length }}</v-chip>
58
+ <StatusChip :dot="false" tone="info" :label="String(value.length)" />
81
59
  </template>
82
60
  <template #item.createdAt="{ item }">
83
61
  {{ item.createdAt ? formatDate(item.createdAt) : "" }}
@@ -103,7 +81,7 @@
103
81
  {{ formatStatus(value) }}
104
82
  </template>
105
83
  </v-data-table>
106
- </v-card>
84
+ </AppCard>
107
85
  </v-col>
108
86
 
109
87
  <ConfirmDialog
@@ -153,10 +131,17 @@
153
131
  :app="props.app"
154
132
  />
155
133
  </v-dialog>
156
- </v-row>
134
+ </v-row>
135
+ </div>
157
136
  </template>
158
137
 
159
138
  <script setup lang="ts">
139
+ /** The same two tabs, same labels, same routes. */
140
+ const invitationTabs = [
141
+ { status: "pending", label: "Pending" },
142
+ { status: "expired", label: "Expired" },
143
+ ];
144
+
160
145
  const props = defineProps({
161
146
  app: {
162
147
  type: String,