@fishawack/lab-velocity 2.0.0-beta.5 → 2.0.0-beta.50

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 (111) hide show
  1. package/README.md +467 -36
  2. package/_Build/js/libs/build-id.js +14 -0
  3. package/_Build/js/libs/filters.js +36 -0
  4. package/_Build/js/libs/globals.js +7 -0
  5. package/_Build/js/libs/router.js +22 -0
  6. package/_Build/js/libs/routes.js +29 -0
  7. package/_Build/js/libs/store.js +21 -0
  8. package/_Build/js/libs/utility.js +161 -0
  9. package/_Build/vue/components/basic/Button.vue +1 -1
  10. package/_Build/vue/components/form/Avatar.vue +90 -0
  11. package/_Build/vue/components/form/Checkbox.vue +10 -0
  12. package/_Build/vue/components/form/InputNumber.vue +1 -1
  13. package/_Build/vue/components/form/Select.vue +223 -33
  14. package/_Build/vue/components/form/Spinner.vue +5 -0
  15. package/_Build/vue/components/layout/Alert.vue +5 -5
  16. package/_Build/vue/components/layout/Audit.vue +143 -0
  17. package/_Build/vue/{modules/AuthModule/components/VBreadcrumbs.vue → components/layout/Breadcrumbs.vue} +4 -4
  18. package/_Build/vue/{modules/AuthModule/components → components/layout}/Chips.vue +2 -2
  19. package/_Build/vue/components/layout/Footer.vue +11 -10
  20. package/_Build/vue/{modules/AuthModule/components/VFormFooter.vue → components/layout/FormFooter.vue} +13 -7
  21. package/_Build/vue/{modules/AuthModule/components → components/layout}/FormRole.vue +10 -8
  22. package/_Build/vue/components/layout/Layout.vue +94 -0
  23. package/_Build/vue/components/layout/Navigation.vue +77 -0
  24. package/_Build/vue/{modules/AuthModule/components/VPageHeader.vue → components/layout/PageHeader.vue} +14 -8
  25. package/_Build/vue/components/layout/SideBar.vue +26 -0
  26. package/_Build/vue/{modules/AuthModule/components/VTable.vue → components/layout/Table.vue} +37 -16
  27. package/_Build/vue/{modules/AuthModule/components/VTableSorter.vue → components/layout/TableSorter.vue} +108 -52
  28. package/_Build/vue/components/layout/TokenDisplay.vue +52 -0
  29. package/_Build/vue/components/layout/pageTitle.vue +1 -1
  30. package/_Build/vue/components/navigation/MenuItem.vue +7 -2
  31. package/_Build/vue/components/navigation/MenuItemGroup.vue +7 -2
  32. package/_Build/vue/modules/AuthModule/js/axios.js +21 -1
  33. package/_Build/vue/modules/AuthModule/js/guest-request.js +32 -0
  34. package/_Build/vue/modules/AuthModule/js/impersonation-banner.js +102 -0
  35. package/_Build/vue/modules/AuthModule/js/router.js +91 -114
  36. package/_Build/vue/modules/AuthModule/js/store.js +23 -6
  37. package/_Build/vue/modules/AuthModule/routes/PCompanies/columns.js +268 -0
  38. package/_Build/vue/modules/AuthModule/routes/PCompanies/resource.js +213 -0
  39. package/_Build/vue/modules/AuthModule/routes/PIntegrations/columns.js +58 -0
  40. package/_Build/vue/modules/AuthModule/routes/PIntegrations/resource.js +79 -0
  41. package/_Build/vue/modules/AuthModule/routes/PTeams/columns.js +78 -0
  42. package/_Build/vue/modules/AuthModule/routes/PTeams/resource.js +251 -0
  43. package/_Build/vue/modules/AuthModule/routes/PUsers/SetPasswordAction.vue +51 -0
  44. package/_Build/vue/modules/AuthModule/routes/PUsers/SetPasswordDialog.vue +138 -0
  45. package/_Build/vue/modules/AuthModule/routes/PUsers/columns.js +349 -0
  46. package/_Build/vue/modules/AuthModule/routes/PUsers/resource.js +239 -0
  47. package/_Build/vue/modules/AuthModule/routes/account-exists.vue +2 -2
  48. package/_Build/vue/modules/AuthModule/routes/change-password.vue +28 -32
  49. package/_Build/vue/modules/AuthModule/routes/container.vue +2 -11
  50. package/_Build/vue/modules/AuthModule/routes/expired-reset.vue +4 -4
  51. package/_Build/vue/modules/AuthModule/routes/expired-verification.vue +10 -9
  52. package/_Build/vue/modules/AuthModule/routes/force-reset.vue +44 -58
  53. package/_Build/vue/modules/AuthModule/routes/forgot.vue +10 -5
  54. package/_Build/vue/modules/AuthModule/routes/login.vue +12 -19
  55. package/_Build/vue/modules/AuthModule/routes/logincallback.vue +1 -3
  56. package/_Build/vue/modules/AuthModule/routes/loginsso.vue +14 -10
  57. package/_Build/vue/modules/AuthModule/routes/logout.vue +17 -5
  58. package/_Build/vue/modules/AuthModule/routes/logoutheadless.vue +1 -3
  59. package/_Build/vue/modules/AuthModule/routes/register.vue +24 -28
  60. package/_Build/vue/modules/AuthModule/routes/reset.vue +20 -14
  61. package/_Build/vue/modules/AuthModule/routes/success-forgot.vue +14 -8
  62. package/_Build/vue/modules/AuthModule/routes/success-reset.vue +2 -2
  63. package/_Build/vue/modules/AuthModule/routes/success-verify.vue +1 -3
  64. package/_Build/vue/modules/AuthModule/routes/verify.vue +11 -14
  65. package/_Build/vue/modules/resource/Children/create.vue +81 -0
  66. package/_Build/vue/modules/resource/Children/edit.vue +106 -0
  67. package/_Build/vue/modules/resource/Children/index.vue +42 -0
  68. package/_Build/vue/modules/resource/Children/partials/form.vue +111 -0
  69. package/_Build/vue/modules/resource/Children/show.vue +166 -0
  70. package/_Build/vue/modules/resource/index.js +561 -0
  71. package/_Build/vue/modules/resource/parent.vue +63 -0
  72. package/_Build/vue/modules/resource/trashable.js +104 -0
  73. package/_base.scss +0 -1
  74. package/_defaults.scss +2 -13
  75. package/_variables.scss +9 -4
  76. package/{modules/_AuthModule.scss → components/_auth.scss} +19 -68
  77. package/components/_datepicker.scss +1 -0
  78. package/components/_descriptions.scss +2 -0
  79. package/components/_footer.scss +1 -0
  80. package/components/_form.scss +18 -0
  81. package/components/_header.scss +3 -27
  82. package/components/_layout.scss +56 -0
  83. package/components/_menu.scss +0 -5
  84. package/components/_sidebar.scss +12 -27
  85. package/components/_table.scss +3 -0
  86. package/components/_token-display.scss +41 -0
  87. package/general.scss +1 -0
  88. package/index.js +31 -1
  89. package/package.json +7 -4
  90. package/vendor.scss +0 -1
  91. package/_Build/vue/components/layout/sideBar.vue +0 -25
  92. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/Upload/upload.vue +0 -251
  93. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/create.vue +0 -62
  94. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/edit.vue +0 -98
  95. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/index.vue +0 -90
  96. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/partials/form.vue +0 -173
  97. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/show.vue +0 -262
  98. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/parent.vue +0 -36
  99. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/create.vue +0 -112
  100. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/edit.vue +0 -103
  101. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/index.vue +0 -112
  102. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/partials/form.vue +0 -169
  103. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/show.vue +0 -120
  104. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/parent.vue +0 -36
  105. package/components/_input.scss +0 -0
  106. package/modules/_AuthVariables.scss +0 -7
  107. /package/_Build/vue/{modules/AuthModule/components → components/layout}/AuthModal.vue +0 -0
  108. /package/_Build/vue/{modules/AuthModule/components → components/layout}/Chip.vue +0 -0
  109. /package/_Build/vue/{modules/AuthModule/components/VPasswordValidation.vue → components/layout/PasswordValidation.vue} +0 -0
  110. /package/_Build/vue/{modules/AuthModule/components/VRoleLegend.vue → components/layout/RoleLegend.vue} +0 -0
  111. /package/{modules → components}/_modal.scss +0 -0
@@ -1,173 +0,0 @@
1
- <!-- eslint-disable vue/no-mutating-props -->
2
- <template>
3
- <form class="" @submit.prevent="submit">
4
- <el-basic
5
- v-model="form.name"
6
- name="name"
7
- :error="form.errors"
8
- type="text"
9
- placeholder="Name"
10
- label="Company name"
11
- >
12
- <template #label>
13
- Company name <sup class="color-status-red-100">*</sup>
14
- </template>
15
- </el-basic>
16
-
17
- <el-select
18
- v-if="method === 'patch'"
19
- v-model="form.primary_contact"
20
- name="primary_contact"
21
- :error="form.errors"
22
- placeholder="Primary Contact"
23
- label="Primary Contact"
24
- :options="
25
- users?.map(({ name, id }) => ({
26
- label: name,
27
- value: id,
28
- }))
29
- "
30
- />
31
-
32
- <hr class="my-3 hr-muted" />
33
-
34
- <p class="my-0">Domain/s <sup class="color-status-red-100">*</sup></p>
35
-
36
- <ul class="list-none pl-0 mt mb-2">
37
- <li
38
- v-for="(path, index) in form.domains"
39
- :key="index"
40
- class="mb-0.5"
41
- >
42
- <el-input
43
- v-model="form.domains[index]"
44
- placeholder="avalerehealth.com"
45
- >
46
- <template #prepend>@</template>
47
- <template #append>
48
- <el-button
49
- type="danger"
50
- @click="form.domains.splice(index, 1)"
51
- >
52
- <GSvg class="vel-icon" name="trash" />
53
- </el-button>
54
- </template>
55
- </el-input>
56
-
57
- <small
58
- v-if="form.errors && form.errors.has(`domains.${index}`)"
59
- class="form__error vel-basic__error"
60
- v-text="form.errors.first(`domains.${index}`)"
61
- ></small>
62
- </li>
63
- </ul>
64
-
65
- <div>
66
- <el-button @click="form.domains.push('')">
67
- Add Domain
68
-
69
- <GIcon name="icon-plus" embed asis class="fill-0 ml" />
70
- </el-button>
71
- </div>
72
-
73
- <hr class="my-5 hr-muted" />
74
-
75
- <template v-if="$store.getters.can('edit roles')">
76
- <FormRole :form="form" />
77
-
78
- <hr class="my-5 hr-muted" />
79
- </template>
80
-
81
- <template v-if="$store.getters.can('edit sso')">
82
- <h3 class="h3 mb-2">SSO Settings</h3>
83
-
84
- <el-select
85
- v-model="form.sso_type"
86
- name="sso_type"
87
- :error="form.errors"
88
- placeholder="Please Select"
89
- label="Provider"
90
- clearable
91
- :options="[
92
- {
93
- value: 'azure',
94
- label: 'azure',
95
- },
96
- {
97
- value: 'google',
98
- label: 'google',
99
- },
100
- ]"
101
- />
102
- <el-basic
103
- v-model="form.sso_client_id"
104
- name="sso_client_id"
105
- :error="form.errors"
106
- type="text"
107
- placeholder="Key"
108
- label="Key"
109
- />
110
- <el-basic
111
- v-model="form.sso_tenant"
112
- name="sso_tenant"
113
- :error="form.errors"
114
- type="text"
115
- placeholder="Tenant"
116
- label="Tenant"
117
- />
118
- <el-basic
119
- v-model="form.sso_client_secret"
120
- name="sso_client_secret"
121
- :error="form.errors"
122
- type="password"
123
- placeholder="Secret"
124
- label="Secret"
125
- />
126
-
127
- <hr class="my-3 hr-muted" />
128
- </template>
129
-
130
- <VFormFooter :form="form" />
131
- </form>
132
- </template>
133
-
134
- <!-- eslint-disable vue/no-mutating-props -->
135
- <script>
136
- import axios from "axios";
137
-
138
- export default {
139
- components: {
140
- VFormFooter: require("../../../../components/VFormFooter.vue").default,
141
- FormRole: require("../../../../components/FormRole.vue").default,
142
- },
143
-
144
- props: {
145
- form: {
146
- required: true,
147
- type: Object,
148
- },
149
- submit: {
150
- required: true,
151
- type: Function,
152
- },
153
- method: {
154
- required: true,
155
- type: String,
156
- },
157
- },
158
-
159
- data() {
160
- return {
161
- users: [],
162
- };
163
- },
164
-
165
- mounted() {
166
- axios
167
- .getAll(`/api/users?filter[company_id]=${this.$route.params.id}`)
168
- .then((res) => {
169
- this.users = res.data.data;
170
- });
171
- },
172
- };
173
- </script>
@@ -1,262 +0,0 @@
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
- <el-button
25
- v-if="company.primary_contact"
26
- type="primary"
27
- @click="sendWelcome"
28
- >
29
- Send welcome email
30
- </el-button>
31
-
32
- <el-button
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
- </el-button>
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
- <el-button
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
- </el-button>
131
- </template>
132
- </VTableSorter>
133
- </template>
134
-
135
- <div v-else class="absolute transform-center text-center">
136
- <GSpinner class="fill-5" />
137
- <p v-text="`Loading...`" />
138
- </div>
139
- </div>
140
- </div>
141
- </template>
142
-
143
- <script>
144
- import axios from "axios";
145
-
146
- export default {
147
- name: "PShow",
148
-
149
- components: {
150
- VBreadcrumbs: require("../../../components/VBreadcrumbs.vue").default,
151
- VTableSorter: require("../../../components/VTableSorter.vue").default,
152
- VPageHeader: require("../../../components/VPageHeader.vue").default,
153
- },
154
- props: {
155
- breadcrumbs: {
156
- type: Array,
157
- required: true,
158
- },
159
- },
160
-
161
- data() {
162
- return {
163
- processing: false,
164
- company: null,
165
- id: null,
166
- addBreadcrumbs: [...this.$props.breadcrumbs],
167
- jsonData: {
168
- label: "user",
169
- multiLabel: "users",
170
- pageLink: "users",
171
- api: "/api/users",
172
- searchable: {
173
- label: "Search users",
174
- value: "name",
175
- },
176
- tableStructure: [
177
- {
178
- label: "Name",
179
- key: "name",
180
- sortable: true,
181
- },
182
- {
183
- label: "Email",
184
- key: "email",
185
- sortable: true,
186
- },
187
- {
188
- label: "Role",
189
- component: {
190
- module: (row) => {
191
- if (
192
- !row.overrides_roles_and_permissions ||
193
- row.roles.length === 1
194
- )
195
- return require("../../../components/Chip.vue")
196
- .default;
197
-
198
- return require("../../../components/Chips.vue")
199
- .default;
200
- },
201
- props: (row) => {
202
- if (!row.overrides_roles_and_permissions)
203
- return {
204
- name: "inherited",
205
- label: "Inherited",
206
- };
207
-
208
- return row.roles.length === 1
209
- ? {
210
- name: row.roles[0].name,
211
- label: row.roles[0].label,
212
- }
213
- : { array: row.roles };
214
- },
215
- },
216
- },
217
- ],
218
- },
219
- };
220
- },
221
-
222
- mounted() {
223
- this.id = this.$route.params.id;
224
-
225
- axios
226
- .get(`/api/companies/${this.id}?include=primary_contact`)
227
- .then((res) => {
228
- this.company = res.data.data;
229
- this.addBreadcrumbs.push({
230
- href: {
231
- name: "companies.show",
232
- param: this.company.id,
233
- },
234
- text: this.company.name,
235
- });
236
- });
237
- },
238
-
239
- methods: {
240
- async sendWelcome() {
241
- try {
242
- const res = await axios.post(
243
- `/api/companies/${this.id}/welcome`,
244
- );
245
- this.$notify({
246
- title: "Success",
247
- message: res.data.message,
248
- type: "success",
249
- });
250
-
251
- this.company.primary_contact_contacted = true;
252
- } catch (e) {
253
- this.$notify({
254
- title: "Warning",
255
- message: e.response?.data?.message || e.message,
256
- type: "warning",
257
- });
258
- }
259
- },
260
- },
261
- };
262
- </script>
@@ -1,36 +0,0 @@
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>
@@ -1,112 +0,0 @@
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
-
20
- export default {
21
- name: "PCreate",
22
-
23
- components: {
24
- VBreadcrumbs: require("../../../components/VBreadcrumbs.vue").default,
25
- XForm: require("./partials/form.vue").default,
26
- },
27
-
28
- props: {
29
- breadcrumbs: {
30
- type: Array,
31
- required: true,
32
- },
33
- },
34
-
35
- data() {
36
- return {
37
- form: new Form(
38
- {
39
- name: null,
40
- email: null,
41
- roles: [],
42
- notify_user: true,
43
- company_id: null,
44
- force_password_change: true,
45
- set_password: true,
46
- password: null,
47
- password_confirmation: null,
48
- },
49
- {
50
- resetOnSuccess: false,
51
- },
52
- ),
53
- };
54
- },
55
-
56
- methods: {
57
- generatePassword(
58
- length = 20,
59
- characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~!@-#$",
60
- ) {
61
- return Array.from(crypto.getRandomValues(new Uint32Array(length)))
62
- .map((x) => characters[x % characters.length])
63
- .join("");
64
- },
65
- async submit() {
66
- try {
67
- if (this.form.set_password) {
68
- const password = this.generatePassword();
69
- this.form.password = password;
70
- this.form.password_confirmation = password;
71
- }
72
-
73
- let res = await this.form.post(`/api/users`);
74
-
75
- if (!this.form.set_password) {
76
- this.open(res.data.id);
77
- } else {
78
- this.$notify({
79
- title: "Success",
80
- message: "User created a notified of their new account",
81
- type: "success",
82
- });
83
-
84
- this.$router.replace({
85
- name: "users.show",
86
- params: { id: res.data.id },
87
- });
88
- }
89
- } catch (e) {
90
- this.$root.errors(e);
91
- }
92
- },
93
- open(id) {
94
- ElMessageBox.alert(
95
- `<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>`,
96
- "User Created",
97
- {
98
- confirmButtonText: "Ok",
99
- dangerouslyUseHTMLString: true,
100
- },
101
- )
102
- .then(() => {
103
- this.$router.replace({
104
- name: "users.show",
105
- params: { id },
106
- });
107
- })
108
- .catch(() => {});
109
- },
110
- },
111
- };
112
- </script>
@@ -1,103 +0,0 @@
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
- errors: this.$root.errors,
90
- });
91
- }
92
-
93
- this.$router.replace({
94
- name: "users.show",
95
- params: { id: res.data.id },
96
- });
97
- } catch (e) {
98
- this.$root.errors(e);
99
- }
100
- },
101
- },
102
- };
103
- </script>