@fishawack/lab-velocity 2.0.0-beta.11 → 2.0.0-beta.13

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 (57) hide show
  1. package/README.md +148 -6
  2. package/_Build/vue/components/layout/Alert.vue +5 -5
  3. package/_Build/vue/{modules/AuthModule/components/VBreadcrumbs.vue → components/layout/Breadcrumbs.vue} +4 -4
  4. package/_Build/vue/{modules/AuthModule/components → components/layout}/Chips.vue +2 -2
  5. package/_Build/vue/components/layout/Footer.vue +11 -10
  6. package/_Build/vue/{modules/AuthModule/components/VFormFooter.vue → components/layout/FormFooter.vue} +2 -2
  7. package/_Build/vue/{modules/AuthModule/components → components/layout}/FormRole.vue +7 -7
  8. package/_Build/vue/components/layout/Layout.vue +74 -0
  9. package/_Build/vue/components/layout/Navigation.vue +77 -0
  10. package/_Build/vue/{modules/AuthModule/components/VPageHeader.vue → components/layout/PageHeader.vue} +7 -2
  11. package/_Build/vue/components/layout/SideBar.vue +26 -0
  12. package/_Build/vue/{modules/AuthModule/components/VTable.vue → components/layout/Table.vue} +6 -15
  13. package/_Build/vue/{modules/AuthModule/components/VTableSorter.vue → components/layout/TableSorter.vue} +15 -17
  14. package/_Build/vue/components/layout/pageTitle.vue +1 -1
  15. package/_Build/vue/components/navigation/MenuItem.vue +7 -2
  16. package/_Build/vue/components/navigation/MenuItemGroup.vue +7 -2
  17. package/_Build/vue/modules/AuthModule/js/router.js +21 -89
  18. package/_Build/vue/modules/AuthModule/js/store.js +13 -4
  19. package/_Build/vue/modules/AuthModule/{adminRoutes/PCompanies/Children/partials → routes/PCompanies}/form.vue +15 -8
  20. package/_Build/vue/modules/AuthModule/routes/PCompanies/resource.js +180 -0
  21. package/_Build/vue/modules/AuthModule/{adminRoutes/PUsers/Children/partials → routes/PUsers}/form.vue +15 -8
  22. package/_Build/vue/modules/AuthModule/routes/PUsers/resource.js +214 -0
  23. package/_Build/vue/modules/AuthModule/routes/change-password.vue +9 -8
  24. package/_Build/vue/modules/AuthModule/routes/container.vue +2 -11
  25. package/_Build/vue/modules/AuthModule/routes/force-reset.vue +9 -8
  26. package/_Build/vue/modules/AuthModule/routes/register.vue +9 -8
  27. package/_Build/vue/modules/AuthModule/routes/reset.vue +9 -8
  28. package/_Build/vue/modules/resource/Children/create.vue +76 -0
  29. package/_Build/vue/modules/resource/Children/edit.vue +109 -0
  30. package/_Build/vue/modules/resource/Children/index.vue +51 -0
  31. package/_Build/vue/modules/resource/Children/partials/form.vue +53 -0
  32. package/_Build/vue/modules/resource/Children/show.vue +145 -0
  33. package/_Build/vue/modules/resource/index.js +112 -0
  34. package/_Build/vue/modules/resource/parent.vue +41 -0
  35. package/components/_descriptions.scss +2 -0
  36. package/components/_footer.scss +1 -0
  37. package/components/_header.scss +3 -27
  38. package/components/_layout.scss +56 -0
  39. package/components/_sidebar.scss +12 -27
  40. package/index.js +7 -1
  41. package/package.json +3 -2
  42. package/_Build/vue/components/layout/sideBar.vue +0 -25
  43. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/Upload/upload.vue +0 -259
  44. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/create.vue +0 -62
  45. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/edit.vue +0 -98
  46. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/index.vue +0 -90
  47. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/show.vue +0 -267
  48. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/parent.vue +0 -36
  49. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/create.vue +0 -113
  50. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/edit.vue +0 -101
  51. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/index.vue +0 -112
  52. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/show.vue +0 -123
  53. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/parent.vue +0 -36
  54. /package/_Build/vue/{modules/AuthModule/components → components/layout}/AuthModal.vue +0 -0
  55. /package/_Build/vue/{modules/AuthModule/components → components/layout}/Chip.vue +0 -0
  56. /package/_Build/vue/{modules/AuthModule/components/VPasswordValidation.vue → components/layout/PasswordValidation.vue} +0 -0
  57. /package/_Build/vue/{modules/AuthModule/components/VRoleLegend.vue → components/layout/RoleLegend.vue} +0 -0
@@ -1,267 +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
- 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>
@@ -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,113 +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
- 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>
@@ -1,101 +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
- }
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>
@@ -1,112 +0,0 @@
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>