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

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 (50) hide show
  1. package/README.md +31 -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/components/_descriptions.scss +2 -0
  29. package/components/_footer.scss +1 -0
  30. package/components/_header.scss +3 -27
  31. package/components/_layout.scss +56 -0
  32. package/components/_sidebar.scss +12 -27
  33. package/index.js +7 -1
  34. package/package.json +1 -1
  35. package/_Build/vue/components/layout/sideBar.vue +0 -25
  36. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/Upload/upload.vue +0 -259
  37. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/create.vue +0 -62
  38. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/edit.vue +0 -98
  39. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/index.vue +0 -90
  40. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/show.vue +0 -267
  41. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/parent.vue +0 -36
  42. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/create.vue +0 -113
  43. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/edit.vue +0 -101
  44. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/index.vue +0 -112
  45. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/show.vue +0 -123
  46. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/parent.vue +0 -36
  47. /package/_Build/vue/{modules/AuthModule/components → components/layout}/AuthModal.vue +0 -0
  48. /package/_Build/vue/{modules/AuthModule/components → components/layout}/Chip.vue +0 -0
  49. /package/_Build/vue/{modules/AuthModule/components/VPasswordValidation.vue → components/layout/PasswordValidation.vue} +0 -0
  50. /package/_Build/vue/{modules/AuthModule/components/VRoleLegend.vue → components/layout/RoleLegend.vue} +0 -0
@@ -1,62 +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 Company</h2>
8
- </div>
9
- <div class="mt grid__1/2">
10
- <XForm ref="form" :form="form" :submit="submit" />
11
- </div>
12
- </div>
13
- </div>
14
- </template>
15
-
16
- <script>
17
- import Form from "form-backend-validation";
18
-
19
- export default {
20
- name: "PCreate",
21
-
22
- components: {
23
- VBreadcrumbs: require("../../../components/VBreadcrumbs.vue").default,
24
- XForm: require("./partials/form.vue").default,
25
- },
26
-
27
- props: {
28
- breadcrumbs: {
29
- type: Array,
30
- required: true,
31
- },
32
- },
33
-
34
- data() {
35
- return {
36
- form: new Form({
37
- name: null,
38
- domains: [],
39
- roles: [],
40
- sso_client_id: undefined,
41
- sso_tenant: undefined,
42
- sso_client_secret: undefined,
43
- sso_type: undefined,
44
- }),
45
- };
46
- },
47
-
48
- methods: {
49
- async submit() {
50
- try {
51
- let res = await this.form.post(`/api/companies`);
52
- this.$router.replace({
53
- name: "companies.show",
54
- params: { id: res.data.id },
55
- });
56
- } catch (e) {
57
- console.log(e);
58
- }
59
- },
60
- },
61
- };
62
- </script>
@@ -1,98 +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 Company</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
- export default {
29
- name: "PEdit",
30
-
31
- components: {
32
- VBreadcrumbs: require("../../../components/VBreadcrumbs.vue").default,
33
- XForm: require("./partials/form.vue").default,
34
- },
35
-
36
- props: {
37
- breadcrumbs: {
38
- type: Array,
39
- required: true,
40
- },
41
- },
42
-
43
- data() {
44
- return {
45
- id: null,
46
- form: new Form({
47
- name: null,
48
- domains: [],
49
- roles: [],
50
- primary_contact: null,
51
- sso_client_id: undefined,
52
- sso_tenant: undefined,
53
- sso_client_secret: undefined,
54
- sso_type: undefined,
55
- }),
56
- addBreadcrumbs: [...this.$props.breadcrumbs],
57
- };
58
- },
59
-
60
- async mounted() {
61
- this.id = this.$route.params.id;
62
- window.axios
63
- .get(`/api/companies/${this.id}?include=primary_contact`)
64
- .then((res) => {
65
- const company = res.data.data;
66
- this.form.name = company.name;
67
- this.form.primary_contact = company?.primary_contact?.id;
68
- this.form.domains = company.domains;
69
- this.form.roles = company.roles.map((val) => val.id);
70
- this.form.sso_client_id = company.sso_client_id;
71
- this.form.sso_tenant = company.sso_tenant;
72
- this.form.sso_client_secret = company.sso_client_secret;
73
- this.form.sso_type = company.sso_type;
74
- this.addBreadcrumbs.push({
75
- href: {
76
- name: "companies.show",
77
- param: this.id,
78
- },
79
- text: company.name,
80
- });
81
- });
82
- },
83
-
84
- methods: {
85
- async submit() {
86
- try {
87
- let res = await this.form.patch(`/api/companies/${this.id}`);
88
- this.$router.replace({
89
- name: "companies.show",
90
- params: { id: res.data.id },
91
- });
92
- } catch (e) {
93
- console.log(e);
94
- }
95
- },
96
- },
97
- };
98
- </script>
@@ -1,90 +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
- <h2 class="h1 pb-4">
7
- {{ breadcrumbs[breadcrumbs.length - 1].text }}
8
- </h2>
9
-
10
- <VTableSorter
11
- key="PIndex"
12
- :json-data="jsonData"
13
- api="companies"
14
- :fixed-height="false"
15
- :display-edit-action="$store.getters.can('write companies')"
16
- />
17
-
18
- <VRoleLegend class="mt-5" />
19
- </div>
20
- </div>
21
- </template>
22
-
23
- <script>
24
- export default {
25
- name: "PIndex",
26
-
27
- components: {
28
- VBreadcrumbs: require("../../../components/VBreadcrumbs.vue").default,
29
- VTableSorter: require("../../../components/VTableSorter.vue").default,
30
- VRoleLegend: require("../../../components/VRoleLegend.vue").default,
31
- },
32
-
33
- props: {
34
- breadcrumbs: {
35
- type: Array,
36
- required: true,
37
- },
38
- },
39
-
40
- data() {
41
- return {
42
- jsonData: {
43
- label: "company",
44
- multiLabel: "companies",
45
- pageLink: "companies",
46
- api: "/api/companies",
47
- searchable: {
48
- label: "Search companies",
49
- value: "name",
50
- },
51
- tableStructure: [
52
- {
53
- label: "Name",
54
- key: "name",
55
- sortable: true,
56
- },
57
- {
58
- label: "Total users",
59
- key: "user_count",
60
- sortable: false,
61
- width: "150",
62
- },
63
- {
64
- label: "Role",
65
- component: {
66
- module: (row) => {
67
- if (row.roles.length === 1)
68
- return require("../../../components/Chip.vue")
69
- .default;
70
-
71
- return require("../../../components/Chips.vue")
72
- .default;
73
- },
74
- props: (row) =>
75
- row.roles.length === 1
76
- ? {
77
- name: row.roles[0].name,
78
- label: row.roles[0].label,
79
- }
80
- : { array: row.roles },
81
- },
82
- },
83
- ],
84
- },
85
- };
86
- },
87
-
88
- mounted() {},
89
- };
90
- </script>
@@ -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>