@fishawack/lab-velocity 2.0.0-beta.6 → 2.0.0-beta.60

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 +221 -31
  14. package/_Build/vue/components/form/Wysiwyg2.vue +87 -2
  15. package/_Build/vue/components/form/wysiwyg2-video.js +41 -0
  16. package/_Build/vue/components/layout/Alert.vue +5 -5
  17. package/_Build/vue/components/layout/Audit.vue +158 -0
  18. package/_Build/vue/{modules/AuthModule/components/VBreadcrumbs.vue → components/layout/Breadcrumbs.vue} +4 -4
  19. package/_Build/vue/{modules/AuthModule/components → components/layout}/Chips.vue +2 -2
  20. package/_Build/vue/components/layout/Footer.vue +11 -10
  21. package/_Build/vue/{modules/AuthModule/components/VFormFooter.vue → components/layout/FormFooter.vue} +2 -2
  22. package/_Build/vue/{modules/AuthModule/components → components/layout}/FormRole.vue +8 -8
  23. package/_Build/vue/components/layout/Layout.vue +94 -0
  24. package/_Build/vue/components/layout/Navigation.vue +83 -0
  25. package/_Build/vue/{modules/AuthModule/components/VPageHeader.vue → components/layout/PageHeader.vue} +14 -8
  26. package/_Build/vue/components/layout/SideBar.vue +26 -0
  27. package/_Build/vue/{modules/AuthModule/components/VTable.vue → components/layout/Table.vue} +24 -12
  28. package/_Build/vue/{modules/AuthModule/components/VTableSorter.vue → components/layout/TableSorter.vue} +92 -48
  29. package/_Build/vue/components/layout/TokenDisplay.vue +52 -0
  30. package/_Build/vue/components/layout/pageTitle.vue +1 -1
  31. package/_Build/vue/components/navigation/Menu.vue +6 -1
  32. package/_Build/vue/components/navigation/MenuItem.vue +7 -2
  33. package/_Build/vue/components/navigation/MenuItemGroup.vue +7 -2
  34. package/_Build/vue/modules/AuthModule/js/axios.js +21 -1
  35. package/_Build/vue/modules/AuthModule/js/clear-cookies.js +34 -0
  36. package/_Build/vue/modules/AuthModule/js/guest-request.js +32 -0
  37. package/_Build/vue/modules/AuthModule/js/impersonation-banner.js +102 -0
  38. package/_Build/vue/modules/AuthModule/js/router.js +91 -114
  39. package/_Build/vue/modules/AuthModule/js/store.js +23 -6
  40. package/_Build/vue/modules/AuthModule/routes/PCompanies/columns.js +268 -0
  41. package/_Build/vue/modules/AuthModule/routes/PCompanies/resource.js +213 -0
  42. package/_Build/vue/modules/AuthModule/routes/PIntegrations/columns.js +58 -0
  43. package/_Build/vue/modules/AuthModule/routes/PIntegrations/resource.js +79 -0
  44. package/_Build/vue/modules/AuthModule/routes/PTeams/columns.js +78 -0
  45. package/_Build/vue/modules/AuthModule/routes/PTeams/resource.js +251 -0
  46. package/_Build/vue/modules/AuthModule/routes/PUsers/SetPasswordAction.vue +51 -0
  47. package/_Build/vue/modules/AuthModule/routes/PUsers/SetPasswordDialog.vue +138 -0
  48. package/_Build/vue/modules/AuthModule/routes/PUsers/columns.js +349 -0
  49. package/_Build/vue/modules/AuthModule/routes/PUsers/resource.js +239 -0
  50. package/_Build/vue/modules/AuthModule/routes/account-exists.vue +2 -2
  51. package/_Build/vue/modules/AuthModule/routes/change-password.vue +28 -32
  52. package/_Build/vue/modules/AuthModule/routes/container.vue +2 -11
  53. package/_Build/vue/modules/AuthModule/routes/expired-reset.vue +4 -4
  54. package/_Build/vue/modules/AuthModule/routes/expired-verification.vue +10 -9
  55. package/_Build/vue/modules/AuthModule/routes/force-reset.vue +44 -58
  56. package/_Build/vue/modules/AuthModule/routes/forgot.vue +10 -5
  57. package/_Build/vue/modules/AuthModule/routes/login.vue +12 -19
  58. package/_Build/vue/modules/AuthModule/routes/logincallback.vue +1 -3
  59. package/_Build/vue/modules/AuthModule/routes/loginsso.vue +14 -10
  60. package/_Build/vue/modules/AuthModule/routes/logout.vue +14 -5
  61. package/_Build/vue/modules/AuthModule/routes/logoutheadless.vue +16 -5
  62. package/_Build/vue/modules/AuthModule/routes/register.vue +24 -28
  63. package/_Build/vue/modules/AuthModule/routes/reset.vue +20 -14
  64. package/_Build/vue/modules/AuthModule/routes/success-forgot.vue +14 -8
  65. package/_Build/vue/modules/AuthModule/routes/success-reset.vue +2 -2
  66. package/_Build/vue/modules/AuthModule/routes/success-verify.vue +1 -3
  67. package/_Build/vue/modules/AuthModule/routes/verify.vue +11 -14
  68. package/_Build/vue/modules/resource/Children/create.vue +99 -0
  69. package/_Build/vue/modules/resource/Children/edit.vue +124 -0
  70. package/_Build/vue/modules/resource/Children/index.vue +42 -0
  71. package/_Build/vue/modules/resource/Children/partials/form.vue +111 -0
  72. package/_Build/vue/modules/resource/Children/show.vue +170 -0
  73. package/_Build/vue/modules/resource/index.js +562 -0
  74. package/_Build/vue/modules/resource/parent.vue +63 -0
  75. package/_Build/vue/modules/resource/trashable.js +104 -0
  76. package/_base.scss +0 -1
  77. package/_defaults.scss +2 -2
  78. package/components/_auth.scss +19 -61
  79. package/components/_datepicker.scss +1 -0
  80. package/components/_descriptions.scss +2 -0
  81. package/components/_footer.scss +1 -0
  82. package/components/_form.scss +18 -0
  83. package/components/_header.scss +3 -27
  84. package/components/_layout.scss +56 -0
  85. package/components/_menu.scss +0 -5
  86. package/components/_sidebar.scss +12 -27
  87. package/components/_table.scss +3 -0
  88. package/components/_token-display.scss +41 -0
  89. package/components/_wysiwyg2.scss +10 -0
  90. package/general.scss +1 -0
  91. package/index.js +31 -1
  92. package/package.json +7 -4
  93. package/_Build/vue/components/layout/sideBar.vue +0 -25
  94. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/Upload/upload.vue +0 -259
  95. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/create.vue +0 -62
  96. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/edit.vue +0 -98
  97. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/index.vue +0 -90
  98. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/partials/form.vue +0 -181
  99. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/show.vue +0 -266
  100. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/parent.vue +0 -36
  101. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/create.vue +0 -112
  102. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/edit.vue +0 -103
  103. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/index.vue +0 -112
  104. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/partials/form.vue +0 -173
  105. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/show.vue +0 -123
  106. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/parent.vue +0 -36
  107. package/components/_input.scss +0 -0
  108. /package/_Build/vue/{modules/AuthModule/components → components/layout}/AuthModal.vue +0 -0
  109. /package/_Build/vue/{modules/AuthModule/components → components/layout}/Chip.vue +0 -0
  110. /package/_Build/vue/{modules/AuthModule/components/VPasswordValidation.vue → components/layout/PasswordValidation.vue} +0 -0
  111. /package/_Build/vue/{modules/AuthModule/components/VRoleLegend.vue → components/layout/RoleLegend.vue} +0 -0
@@ -1,181 +0,0 @@
1
- <!-- eslint-disable vue/no-mutating-props -->
2
- <template>
3
- <form class="" @submit.prevent="submit">
4
- <VelBasic
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
- </VelBasic>
16
-
17
- <VelSelect
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
- <VelButton
49
- type="danger"
50
- @click="form.domains.splice(index, 1)"
51
- >
52
- <GSvg class="vel-icon" name="trash" />
53
- </VelButton>
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
- <VelButton @click="form.domains.push('')">
67
- Add Domain
68
-
69
- <GIcon name="icon-plus" embed asis class="fill-0 ml" />
70
- </VelButton>
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
- <VelSelect
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
- <VelBasic
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
- <VelBasic
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
- <VelBasic
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
- import VelButton from "../../../../../../components/basic/Button.vue";
138
- import VelSelect from "../../../../../../components/form/Select.vue";
139
- import VelBasic from "../../../../../../components/form/basic.vue";
140
- import { ElInput } from "element-plus";
141
-
142
- export default {
143
- components: {
144
- VFormFooter: require("../../../../components/VFormFooter.vue").default,
145
- FormRole: require("../../../../components/FormRole.vue").default,
146
- VelButton,
147
- VelSelect,
148
- VelBasic,
149
- ElInput,
150
- },
151
-
152
- props: {
153
- form: {
154
- required: true,
155
- type: Object,
156
- },
157
- submit: {
158
- required: true,
159
- type: Function,
160
- },
161
- method: {
162
- required: true,
163
- type: String,
164
- },
165
- },
166
-
167
- data() {
168
- return {
169
- users: [],
170
- };
171
- },
172
-
173
- mounted() {
174
- axios
175
- .getAll(`/api/users?filter[company_id]=${this.$route.params.id}`)
176
- .then((res) => {
177
- this.users = res.data.data;
178
- });
179
- },
180
- };
181
- </script>
@@ -1,266 +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
- <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
-
147
- export default {
148
- name: "PShow",
149
-
150
- components: {
151
- VBreadcrumbs: require("../../../components/VBreadcrumbs.vue").default,
152
- VTableSorter: require("../../../components/VTableSorter.vue").default,
153
- VPageHeader: require("../../../components/VPageHeader.vue").default,
154
- FormRole: require("../../../components/FormRole.vue").default,
155
- VelSpinner,
156
- VelButton,
157
- },
158
- props: {
159
- breadcrumbs: {
160
- type: Array,
161
- required: true,
162
- },
163
- },
164
-
165
- data() {
166
- return {
167
- processing: false,
168
- company: null,
169
- id: null,
170
- addBreadcrumbs: [...this.$props.breadcrumbs],
171
- jsonData: {
172
- label: "user",
173
- multiLabel: "users",
174
- pageLink: "users",
175
- api: "/api/users",
176
- searchable: {
177
- label: "Search users",
178
- value: "name",
179
- },
180
- tableStructure: [
181
- {
182
- label: "Name",
183
- key: "name",
184
- sortable: true,
185
- },
186
- {
187
- label: "Email",
188
- key: "email",
189
- sortable: true,
190
- },
191
- {
192
- label: "Role",
193
- component: {
194
- module: (row) => {
195
- if (
196
- !row.overrides_roles_and_permissions ||
197
- row.roles.length === 1
198
- )
199
- return require("../../../components/Chip.vue")
200
- .default;
201
-
202
- return require("../../../components/Chips.vue")
203
- .default;
204
- },
205
- props: (row) => {
206
- if (!row.overrides_roles_and_permissions)
207
- return {
208
- name: "inherited",
209
- label: "Inherited",
210
- };
211
-
212
- return row.roles.length === 1
213
- ? {
214
- name: row.roles[0].name,
215
- label: row.roles[0].label,
216
- }
217
- : { array: row.roles };
218
- },
219
- },
220
- },
221
- ],
222
- },
223
- };
224
- },
225
-
226
- mounted() {
227
- this.id = this.$route.params.id;
228
-
229
- axios
230
- .get(`/api/companies/${this.id}?include=primary_contact`)
231
- .then((res) => {
232
- this.company = res.data.data;
233
- this.addBreadcrumbs.push({
234
- href: {
235
- name: "companies.show",
236
- param: this.company.id,
237
- },
238
- text: this.company.name,
239
- });
240
- });
241
- },
242
-
243
- methods: {
244
- async sendWelcome() {
245
- try {
246
- const res = await axios.post(
247
- `/api/companies/${this.id}/welcome`,
248
- );
249
- this.$notify({
250
- title: "Success",
251
- message: res.data.message,
252
- type: "success",
253
- });
254
-
255
- this.company.primary_contact_contacted = true;
256
- } catch (e) {
257
- this.$notify({
258
- title: "Warning",
259
- message: e.response?.data?.message || e.message,
260
- type: "warning",
261
- });
262
- }
263
- },
264
- },
265
- };
266
- </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>