@fishawack/lab-velocity 1.11.1 → 2.0.0-beta.10

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 (138) hide show
  1. package/README.md +177 -49
  2. package/_Build/vue/components/Icon.vue +33 -0
  3. package/_Build/vue/components/Svg.vue +45 -0
  4. package/{basic → _Build/vue/components/basic}/Button.vue +17 -19
  5. package/{basic → _Build/vue/components/basic}/link.vue +8 -7
  6. package/{form → _Build/vue/components/form}/Cascader.vue +13 -13
  7. package/{form → _Build/vue/components/form}/CheckboxGroup.vue +28 -6
  8. package/{form → _Build/vue/components/form}/DatePicker.vue +23 -7
  9. package/{form → _Build/vue/components/form}/InputNumber.vue +1 -2
  10. package/{form → _Build/vue/components/form}/Select.vue +10 -11
  11. package/_Build/vue/components/form/Spinner.vue +5 -0
  12. package/{form → _Build/vue/components/form}/Switch.vue +2 -2
  13. package/{form → _Build/vue/components/form}/Upload.vue +4 -6
  14. package/{form → _Build/vue/components/form}/Wysiwyg.vue +14 -14
  15. package/_Build/vue/components/form/Wysiwyg2.vue +577 -0
  16. package/{form → _Build/vue/components/form}/basic.vue +25 -7
  17. package/{form → _Build/vue/components/form}/file.vue +1 -1
  18. package/{form → _Build/vue/components/form}/input.js +2 -2
  19. package/{form → _Build/vue/components/form}/input.vue +31 -11
  20. package/{layout → _Build/vue/components/layout}/Alert.vue +10 -10
  21. package/_Build/vue/components/layout/Footer.vue +50 -0
  22. package/{layout → _Build/vue/components/layout}/Header.vue +5 -7
  23. package/_Build/vue/components/layout/Loader.vue +59 -0
  24. package/{layout → _Build/vue/components/layout}/Tooltip.vue +12 -12
  25. package/{layout → _Build/vue/components/layout}/pageTitle.vue +4 -4
  26. package/{layout → _Build/vue/components/layout}/sideBar.vue +4 -6
  27. package/{navigation → _Build/vue/components/navigation}/Breadcrumbs.vue +15 -10
  28. package/{navigation → _Build/vue/components/navigation}/BreadcrumbsItem.vue +6 -6
  29. package/_Build/vue/components/navigation/Menu.vue +14 -0
  30. package/_Build/vue/components/navigation/MenuItem.vue +20 -0
  31. package/_Build/vue/components/navigation/MenuItemGroup.vue +20 -0
  32. package/_Build/vue/components/navigation/SubMenu.vue +20 -0
  33. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/Upload/upload.vue +259 -0
  34. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/create.vue +62 -0
  35. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/edit.vue +98 -0
  36. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/index.vue +90 -0
  37. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/partials/form.vue +181 -0
  38. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/show.vue +267 -0
  39. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/parent.vue +36 -0
  40. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/create.vue +113 -0
  41. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/edit.vue +101 -0
  42. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/index.vue +112 -0
  43. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/partials/form.vue +174 -0
  44. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/show.vue +123 -0
  45. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/parent.vue +36 -0
  46. package/{AuthModule → _Build/vue/modules/AuthModule}/components/AuthModal.vue +30 -35
  47. package/_Build/vue/modules/AuthModule/components/Chip.vue +70 -0
  48. package/_Build/vue/modules/AuthModule/components/Chips.vue +26 -0
  49. package/_Build/vue/modules/AuthModule/components/FormRole.vue +117 -0
  50. package/_Build/vue/modules/AuthModule/components/VBreadcrumbs.vue +33 -0
  51. package/_Build/vue/modules/AuthModule/components/VFormFooter.vue +52 -0
  52. package/_Build/vue/modules/AuthModule/components/VPageHeader.vue +38 -0
  53. package/_Build/vue/modules/AuthModule/components/VPasswordValidation.vue +106 -0
  54. package/_Build/vue/modules/AuthModule/components/VRoleLegend.vue +43 -0
  55. package/_Build/vue/modules/AuthModule/components/VTable.vue +136 -0
  56. package/_Build/vue/modules/AuthModule/components/VTableSorter.vue +252 -0
  57. package/_Build/vue/modules/AuthModule/js/FakeAPI.js +78 -0
  58. package/_Build/vue/modules/AuthModule/js/axios.js +81 -0
  59. package/_Build/vue/modules/AuthModule/js/router.js +295 -0
  60. package/_Build/vue/modules/AuthModule/js/store.js +62 -0
  61. package/{AuthModule → _Build/vue/modules/AuthModule}/routes/account-exists.vue +6 -8
  62. package/{AuthModule → _Build/vue/modules/AuthModule}/routes/change-password.vue +39 -38
  63. package/{AuthModule → _Build/vue/modules/AuthModule}/routes/container.vue +4 -8
  64. package/{AuthModule → _Build/vue/modules/AuthModule}/routes/expired-reset.vue +17 -15
  65. package/{AuthModule → _Build/vue/modules/AuthModule}/routes/expired-verification.vue +21 -20
  66. package/{AuthModule → _Build/vue/modules/AuthModule}/routes/force-reset.vue +45 -40
  67. package/{AuthModule → _Build/vue/modules/AuthModule}/routes/forgot.vue +15 -11
  68. package/{AuthModule → _Build/vue/modules/AuthModule}/routes/login.vue +27 -26
  69. package/{AuthModule → _Build/vue/modules/AuthModule}/routes/logincallback.vue +6 -13
  70. package/_Build/vue/modules/AuthModule/routes/loginheadless.vue +21 -0
  71. package/{AuthModule → _Build/vue/modules/AuthModule}/routes/loginsso.vue +34 -29
  72. package/_Build/vue/modules/AuthModule/routes/logout.vue +19 -0
  73. package/_Build/vue/modules/AuthModule/routes/logoutheadless.vue +25 -0
  74. package/{AuthModule → _Build/vue/modules/AuthModule}/routes/register.vue +52 -37
  75. package/{AuthModule → _Build/vue/modules/AuthModule}/routes/reset.vue +29 -19
  76. package/{AuthModule → _Build/vue/modules/AuthModule}/routes/success-forgot.vue +22 -19
  77. package/{AuthModule → _Build/vue/modules/AuthModule}/routes/success-reset.vue +6 -6
  78. package/_Build/vue/modules/AuthModule/routes/success-verify.vue +30 -0
  79. package/{AuthModule → _Build/vue/modules/AuthModule}/routes/verify.vue +26 -26
  80. package/_base.scss +0 -1
  81. package/_defaults.scss +3 -15
  82. package/_variables.scss +24 -21
  83. package/components/_alert.scss +2 -2
  84. package/components/_auth.scss +163 -0
  85. package/components/_basic.scss +5 -4
  86. package/components/_breadcrumbs.scss +7 -8
  87. package/components/_button.scss +11 -12
  88. package/components/_cascader.scss +1 -1
  89. package/components/_checkbox.scss +27 -26
  90. package/components/_chip.scss +24 -0
  91. package/components/_collapse.scss +2 -3
  92. package/components/_datepicker.scss +7 -6
  93. package/components/_footer.scss +1 -1
  94. package/components/_form.scss +6 -4
  95. package/components/_header.scss +4 -5
  96. package/components/_icon.scss +4 -3
  97. package/components/_inputNumber.scss +4 -3
  98. package/components/_link.scss +7 -7
  99. package/components/_loader.scss +3 -4
  100. package/components/_menu.scss +22 -22
  101. package/{modules → components}/_modal.scss +3 -3
  102. package/components/_pageTitle.scss +3 -3
  103. package/components/_permissionLegend.scss +18 -0
  104. package/components/_select.scss +3 -2
  105. package/components/_sidebar.scss +5 -6
  106. package/components/_switch.scss +2 -2
  107. package/components/_table.scss +3 -3
  108. package/components/_tooltip.scss +2 -2
  109. package/components/_typography.scss +71 -62
  110. package/components/_upload.scss +1 -1
  111. package/components/_wysiwyg.scss +3 -2
  112. package/components/_wysiwyg2.scss +37 -31
  113. package/general.scss +1 -2
  114. package/index.js +38 -30
  115. package/package.json +104 -102
  116. package/vendor.scss +2 -3
  117. package/AuthModule/components/VPasswordValidation.vue +0 -66
  118. package/AuthModule/js/AuthAxios.js +0 -59
  119. package/AuthModule/js/AuthRoutes.js +0 -186
  120. package/AuthModule/js/AuthStore.js +0 -99
  121. package/AuthModule/js/FakeAPI.js +0 -84
  122. package/AuthModule/routes/loginheadless.vue +0 -16
  123. package/AuthModule/routes/logout.vue +0 -21
  124. package/AuthModule/routes/success-verify.vue +0 -29
  125. package/Icon.vue +0 -33
  126. package/Svg.vue +0 -40
  127. package/components/_input.scss +0 -0
  128. package/form/Wysiwyg2.vue +0 -278
  129. package/layout/Footer.vue +0 -35
  130. package/layout/Loader.vue +0 -39
  131. package/modules/_AuthModule.scss +0 -209
  132. package/modules/_AuthVariables.scss +0 -7
  133. package/navigation/Menu.vue +0 -16
  134. package/navigation/MenuItem.vue +0 -20
  135. package/navigation/MenuItemGroup.vue +0 -20
  136. package/navigation/SubMenu.vue +0 -20
  137. /package/{form → _Build/vue/components/form}/Checkbox.vue +0 -0
  138. /package/{form → _Build/vue/components/form}/color.vue +0 -0
@@ -0,0 +1,267 @@
1
+ <template>
2
+ <VBreadcrumbs
3
+ :items="addBreadcrumbs"
4
+ class="mb-8"
5
+ container-classes="m-0"
6
+ />
7
+
8
+ <div class="container px-6 tablet:px-4 mobile:px-2 mb-8 ml-0 mr-0">
9
+ <div class="grid__1/1">
10
+ <template v-if="company">
11
+ <div class="bg-0 p-3 box-shadow-1 border-r-4 mb-6">
12
+ <VPageHeader icon="icon-business" :title="company.name">
13
+ <!--
14
+ Temporarily disabled
15
+ <el-button tag="a" type="secondary" :href="`/companies/${company.id}/upload`">
16
+ <GIcon class="fill-1 mr-0.5" name="icon-plus" embed artboard /> Import users
17
+ </el-button>
18
+ <el-button tag="a" type="secondary" :href="`/api/companies/${company.id}/export`">
19
+ <GIcon class="fill-1 mr-0.5" name="icon-download" embed artboard /> Export users
20
+ </el-button>
21
+ Temporarily disabled
22
+ -->
23
+
24
+ <VelButton
25
+ v-if="company.primary_contact"
26
+ type="primary"
27
+ @click="sendWelcome"
28
+ >
29
+ Send welcome email
30
+ </VelButton>
31
+
32
+ <VelButton
33
+ v-if="$store.getters.can('write companies')"
34
+ tag="a"
35
+ type="primary"
36
+ @click="
37
+ $router.push({
38
+ name: 'companies.edit',
39
+ param: company.id,
40
+ })
41
+ "
42
+ >
43
+ <GIcon
44
+ class="fill-0 mr-0.5"
45
+ name="icon-edit"
46
+ embed
47
+ artboard
48
+ />
49
+ Edit company
50
+ </VelButton>
51
+ </VPageHeader>
52
+
53
+ <hr class="my-3 hr-muted" />
54
+
55
+ <table>
56
+ <tbody>
57
+ <tr>
58
+ <td class="p">Domains</td>
59
+ <td class="p">
60
+ {{ company.domains.join(", ") }}
61
+ </td>
62
+ </tr>
63
+ <tr>
64
+ <td class="p">SSO Enabled</td>
65
+ <td class="p">
66
+ {{ company.sso_enabled }}
67
+ </td>
68
+ </tr>
69
+ <tr>
70
+ <td class="p">Primary Contact</td>
71
+ <td class="p">
72
+ {{ company.primary_contact?.name }}
73
+ </td>
74
+ </tr>
75
+ <tr>
76
+ <td class="p">Primary Contact Email</td>
77
+ <td class="p">
78
+ {{ company.primary_contact?.email }}
79
+ </td>
80
+ </tr>
81
+ <tr>
82
+ <td class="p">Primary Contact Contacted</td>
83
+ <td class="p">
84
+ {{ !!company.primary_contact_contacted }}
85
+ </td>
86
+ </tr>
87
+ <tr>
88
+ <td class="p">Total users</td>
89
+ <td class="p">
90
+ {{ company.user_count }}
91
+ </td>
92
+ </tr>
93
+ </tbody>
94
+ </table>
95
+
96
+ <hr class="my-3 hr-muted" />
97
+
98
+ <FormRole
99
+ :form="{ roles: company.roles.map((d) => d.id) }"
100
+ :readonly="true"
101
+ />
102
+ </div>
103
+
104
+ <VTableSorter
105
+ key="PShow"
106
+ api="users"
107
+ :json-data="jsonData"
108
+ :defaults="`filter[company_id]=${id}`"
109
+ :fixed-height="false"
110
+ >
111
+ <template #table-action>
112
+ <VelButton
113
+ type="primary"
114
+ tag="a"
115
+ class="ml-2"
116
+ @click="
117
+ $router.push({
118
+ name: `${jsonData.pageLink}.create`,
119
+ query: { company_id: id },
120
+ })
121
+ "
122
+ >
123
+ <GIcon
124
+ name="icon-plus"
125
+ embed
126
+ asis
127
+ class="fill-0 mr-0.5"
128
+ />
129
+ Create new {{ jsonData.label }}
130
+ </VelButton>
131
+ </template>
132
+ </VTableSorter>
133
+ </template>
134
+
135
+ <div v-else class="absolute transform-center text-center">
136
+ <VelSpinner class="fill-5" />
137
+ </div>
138
+ </div>
139
+ </div>
140
+ </template>
141
+
142
+ <script>
143
+ import axios from "axios";
144
+ import VelButton from "../../../../../components/basic/Button.vue";
145
+ import VelSpinner from "../../../../../components/form/Spinner.vue";
146
+ import { ElNotification } from "element-plus";
147
+
148
+ export default {
149
+ name: "PShow",
150
+
151
+ components: {
152
+ VBreadcrumbs: require("../../../components/VBreadcrumbs.vue").default,
153
+ VTableSorter: require("../../../components/VTableSorter.vue").default,
154
+ VPageHeader: require("../../../components/VPageHeader.vue").default,
155
+ FormRole: require("../../../components/FormRole.vue").default,
156
+ VelSpinner,
157
+ VelButton,
158
+ },
159
+ props: {
160
+ breadcrumbs: {
161
+ type: Array,
162
+ required: true,
163
+ },
164
+ },
165
+
166
+ data() {
167
+ return {
168
+ processing: false,
169
+ company: null,
170
+ id: null,
171
+ addBreadcrumbs: [...this.$props.breadcrumbs],
172
+ jsonData: {
173
+ label: "user",
174
+ multiLabel: "users",
175
+ pageLink: "users",
176
+ api: "/api/users",
177
+ searchable: {
178
+ label: "Search users",
179
+ value: "name",
180
+ },
181
+ tableStructure: [
182
+ {
183
+ label: "Name",
184
+ key: "name",
185
+ sortable: true,
186
+ },
187
+ {
188
+ label: "Email",
189
+ key: "email",
190
+ sortable: true,
191
+ },
192
+ {
193
+ label: "Role",
194
+ component: {
195
+ module: (row) => {
196
+ if (
197
+ !row.overrides_roles_and_permissions ||
198
+ row.roles.length === 1
199
+ )
200
+ return require("../../../components/Chip.vue")
201
+ .default;
202
+
203
+ return require("../../../components/Chips.vue")
204
+ .default;
205
+ },
206
+ props: (row) => {
207
+ if (!row.overrides_roles_and_permissions)
208
+ return {
209
+ name: "inherited",
210
+ label: "Inherited",
211
+ };
212
+
213
+ return row.roles.length === 1
214
+ ? {
215
+ name: row.roles[0].name,
216
+ label: row.roles[0].label,
217
+ }
218
+ : { array: row.roles };
219
+ },
220
+ },
221
+ },
222
+ ],
223
+ },
224
+ };
225
+ },
226
+
227
+ mounted() {
228
+ this.id = this.$route.params.id;
229
+
230
+ axios
231
+ .get(`/api/companies/${this.id}?include=primary_contact`)
232
+ .then((res) => {
233
+ this.company = res.data.data;
234
+ this.addBreadcrumbs.push({
235
+ href: {
236
+ name: "companies.show",
237
+ param: this.company.id,
238
+ },
239
+ text: this.company.name,
240
+ });
241
+ });
242
+ },
243
+
244
+ methods: {
245
+ async sendWelcome() {
246
+ try {
247
+ const res = await axios.post(
248
+ `/api/companies/${this.id}/welcome`,
249
+ );
250
+ ElNotification({
251
+ title: "Success",
252
+ message: res.data.message,
253
+ type: "success",
254
+ });
255
+
256
+ this.company.primary_contact_contacted = true;
257
+ } catch (e) {
258
+ ElNotification({
259
+ title: "Warning",
260
+ message: e.response?.data?.message || e.message,
261
+ type: "warning",
262
+ });
263
+ }
264
+ },
265
+ },
266
+ };
267
+ </script>
@@ -0,0 +1,36 @@
1
+ <template>
2
+ <PageTitle title="Companies" />
3
+
4
+ <router-view :key="$route.path" :breadcrumbs="breadcrumbs" />
5
+ </template>
6
+
7
+ <script>
8
+ import PageTitle from "../../../../components/layout/pageTitle.vue";
9
+
10
+ export default {
11
+ name: "PCompanies",
12
+
13
+ components: {
14
+ PageTitle,
15
+ },
16
+
17
+ data() {
18
+ return {
19
+ breadcrumbs: [
20
+ {
21
+ href: {
22
+ name: "index",
23
+ },
24
+ text: "Home",
25
+ },
26
+ {
27
+ href: {
28
+ name: "companies.index",
29
+ },
30
+ text: "Companies",
31
+ },
32
+ ],
33
+ };
34
+ },
35
+ };
36
+ </script>
@@ -0,0 +1,113 @@
1
+ <template>
2
+ <VBreadcrumbs :items="breadcrumbs" class="mb-8" container-classes="m-0" />
3
+
4
+ <div class="container px-6 tablet:px-4 mobile:px-2 mb-8 ml-0 mr-0">
5
+ <div class="grid__1/1">
6
+ <div class="grid__1/1 mb-4">
7
+ <h2 class="h1">Create User</h2>
8
+ </div>
9
+ <div class="grid__1/2">
10
+ <XForm ref="form" :form="form" :submit="submit" />
11
+ </div>
12
+ </div>
13
+ </div>
14
+ </template>
15
+
16
+ <script>
17
+ import { ElMessageBox } from "element-plus";
18
+ import Form from "form-backend-validation";
19
+ import { ElNotification } from "element-plus";
20
+
21
+ export default {
22
+ name: "PCreate",
23
+
24
+ components: {
25
+ VBreadcrumbs: require("../../../components/VBreadcrumbs.vue").default,
26
+ XForm: require("./partials/form.vue").default,
27
+ },
28
+
29
+ props: {
30
+ breadcrumbs: {
31
+ type: Array,
32
+ required: true,
33
+ },
34
+ },
35
+
36
+ data() {
37
+ return {
38
+ form: new Form(
39
+ {
40
+ name: null,
41
+ email: null,
42
+ roles: [],
43
+ notify_user: true,
44
+ company_id: null,
45
+ force_password_change: true,
46
+ set_password: true,
47
+ password: null,
48
+ password_confirmation: null,
49
+ },
50
+ {
51
+ resetOnSuccess: false,
52
+ },
53
+ ),
54
+ };
55
+ },
56
+
57
+ methods: {
58
+ generatePassword(
59
+ length = 20,
60
+ characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~!@-#$",
61
+ ) {
62
+ return Array.from(crypto.getRandomValues(new Uint32Array(length)))
63
+ .map((x) => characters[x % characters.length])
64
+ .join("");
65
+ },
66
+ async submit() {
67
+ try {
68
+ if (this.form.set_password) {
69
+ const password = this.generatePassword();
70
+ this.form.password = password;
71
+ this.form.password_confirmation = password;
72
+ }
73
+
74
+ let res = await this.form.post(`/api/users`);
75
+
76
+ if (!this.form.set_password) {
77
+ this.open(res.data.id);
78
+ } else {
79
+ ElNotification({
80
+ title: "Success",
81
+ message: "User created a notified of their new account",
82
+ type: "success",
83
+ });
84
+
85
+ this.$router.replace({
86
+ name: "users.show",
87
+ params: { id: res.data.id },
88
+ });
89
+ }
90
+ } catch (e) {
91
+ console.log(e);
92
+ }
93
+ },
94
+ open(id) {
95
+ ElMessageBox.alert(
96
+ `<p>The password below will not be shown again. Ensure you've taken a copy if you plan to send manually. <br><br><strong>Email</strong>: ${this.form.email}<br> <strong>Password</strong>: ${this.form.password}</p>`,
97
+ "User Created",
98
+ {
99
+ confirmButtonText: "Ok",
100
+ dangerouslyUseHTMLString: true,
101
+ },
102
+ )
103
+ .then(() => {
104
+ this.$router.replace({
105
+ name: "users.show",
106
+ params: { id },
107
+ });
108
+ })
109
+ .catch(() => {});
110
+ },
111
+ },
112
+ };
113
+ </script>
@@ -0,0 +1,101 @@
1
+ <template>
2
+ <VBreadcrumbs
3
+ :items="addBreadcrumbs"
4
+ class="mb-8"
5
+ container-classes="m-0"
6
+ />
7
+
8
+ <div class="container px-6 tablet:px-4 mobile:px-2 mb-8 ml-0 mr-0">
9
+ <div class="grid__1/1">
10
+ <div class="grid__1/1 mb-4">
11
+ <h2 class="h1">Edit User</h2>
12
+ </div>
13
+ <div class="grid__1/2">
14
+ <XForm
15
+ :id="id"
16
+ ref="form"
17
+ :form="form"
18
+ :submit="submit"
19
+ method="patch"
20
+ />
21
+ </div>
22
+ </div>
23
+ </div>
24
+ </template>
25
+
26
+ <script>
27
+ import Form from "form-backend-validation";
28
+
29
+ export default {
30
+ name: "PEdit",
31
+
32
+ components: {
33
+ VBreadcrumbs: require("../../../components/VBreadcrumbs.vue").default,
34
+ XForm: require("./partials/form.vue").default,
35
+ },
36
+
37
+ props: {
38
+ breadcrumbs: {
39
+ type: Array,
40
+ required: true,
41
+ },
42
+ },
43
+
44
+ data() {
45
+ return {
46
+ id: null,
47
+ form: new Form({
48
+ name: null,
49
+ email: null,
50
+ company_id: null,
51
+ roles: [],
52
+ }),
53
+ addBreadcrumbs: [...this.$props.breadcrumbs],
54
+ };
55
+ },
56
+
57
+ async mounted() {
58
+ this.id = this.$route.params.id;
59
+ window.axios
60
+ .get(`/api/users/${this.id}?include=company`)
61
+ .then((res) => {
62
+ const user = res.data.data;
63
+ this.form.name = user.name;
64
+ this.form.email = user.email;
65
+ this.form.company_id = user.company_id;
66
+ this.form.roles = user.overrides_roles_and_permissions
67
+ ? user.roles.map((val) => {
68
+ return val.id;
69
+ })
70
+ : [];
71
+ this.addBreadcrumbs.push({
72
+ href: {
73
+ name: "users.show",
74
+ param: this.id,
75
+ },
76
+ text: user.name,
77
+ });
78
+ });
79
+ },
80
+
81
+ methods: {
82
+ async submit() {
83
+ try {
84
+ let res = await this.form.patch(`/api/users/${this.id}`);
85
+
86
+ // if changing ourselves, re-fetch user data
87
+ if (res.data.id === this.$store.state.auth.user.id) {
88
+ await this.$store.dispatch("getUser");
89
+ }
90
+
91
+ this.$router.replace({
92
+ name: "users.show",
93
+ params: { id: res.data.id },
94
+ });
95
+ } catch (e) {
96
+ console.log(e);
97
+ }
98
+ },
99
+ },
100
+ };
101
+ </script>
@@ -0,0 +1,112 @@
1
+ <template>
2
+ <VBreadcrumbs :items="breadcrumbs" />
3
+
4
+ <div class="container px-6 tablet:px-4 mobile:px-2 mb-8 ml-0 mr-0">
5
+ <div class="grid__1/1">
6
+ <h2 class="h1 pb-4">
7
+ {{ breadcrumbs[breadcrumbs.length - 1].text }}
8
+ </h2>
9
+
10
+ <VTableSorter
11
+ key="PIndex"
12
+ api="users"
13
+ :json-data="jsonData"
14
+ defaults="include=company"
15
+ :fixed-height="false"
16
+ :display-edit-action="$store.getters.can('write users')"
17
+ />
18
+
19
+ <VRoleLegend class="mt-5" />
20
+ </div>
21
+ </div>
22
+ </template>
23
+
24
+ <script>
25
+ export default {
26
+ name: "PIndex",
27
+
28
+ components: {
29
+ VBreadcrumbs: require("../../../components/VBreadcrumbs.vue").default,
30
+ VTableSorter: require("../../../components/VTableSorter.vue").default,
31
+ VRoleLegend: require("../../../components/VRoleLegend.vue").default,
32
+ },
33
+
34
+ props: {
35
+ breadcrumbs: {
36
+ type: Array,
37
+ required: true,
38
+ },
39
+ },
40
+
41
+ data() {
42
+ return {
43
+ jsonData: {
44
+ label: "user",
45
+ multiLabel: "users",
46
+ pageLink: "users",
47
+ api: "/api/users",
48
+ searchable: {
49
+ label: "Search users",
50
+ value: "email",
51
+ },
52
+ tableStructure: [
53
+ {
54
+ label: "Name",
55
+ key: "name",
56
+ sortable: true,
57
+ },
58
+ {
59
+ label: "Email",
60
+ key: "email",
61
+ sortable: true,
62
+ },
63
+ {
64
+ label: "Company",
65
+ sortable: true,
66
+ component: {
67
+ is: () => "router-link",
68
+ props: (row) => ({
69
+ to: {
70
+ name: "companies.show",
71
+ params: { id: row.company_id },
72
+ },
73
+ text: row.company.name,
74
+ }),
75
+ },
76
+ },
77
+ {
78
+ label: "Role",
79
+ component: {
80
+ module: (row) => {
81
+ if (
82
+ !row.overrides_roles_and_permissions ||
83
+ row.roles.length === 1
84
+ )
85
+ return require("../../../components/Chip.vue")
86
+ .default;
87
+
88
+ return require("../../../components/Chips.vue")
89
+ .default;
90
+ },
91
+ props: (row) => {
92
+ if (!row.overrides_roles_and_permissions)
93
+ return {
94
+ name: "inherited",
95
+ label: "Inherited",
96
+ };
97
+
98
+ return row.roles.length === 1
99
+ ? {
100
+ name: row.roles[0].name,
101
+ label: row.roles[0].label,
102
+ }
103
+ : { array: row.roles };
104
+ },
105
+ },
106
+ },
107
+ ],
108
+ },
109
+ };
110
+ },
111
+ };
112
+ </script>