@fishawack/lab-velocity 2.0.0-beta.4 → 2.0.0-beta.40

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 (108) hide show
  1. package/README.md +441 -37
  2. package/_Build/vue/components/basic/Button.vue +1 -1
  3. package/_Build/vue/components/form/Checkbox.vue +10 -0
  4. package/_Build/vue/components/form/Select.vue +223 -33
  5. package/_Build/vue/components/form/Spinner.vue +5 -0
  6. package/_Build/vue/components/layout/Alert.vue +5 -5
  7. package/_Build/vue/components/layout/Audit.vue +75 -0
  8. package/_Build/vue/{modules/AuthModule/components/VBreadcrumbs.vue → components/layout/Breadcrumbs.vue} +4 -4
  9. package/_Build/vue/{modules/AuthModule/components → components/layout}/Chips.vue +2 -2
  10. package/_Build/vue/components/layout/Footer.vue +11 -10
  11. package/_Build/vue/{modules/AuthModule/components/VFormFooter.vue → components/layout/FormFooter.vue} +13 -7
  12. package/_Build/vue/{modules/AuthModule/components → components/layout}/FormRole.vue +10 -8
  13. package/_Build/vue/components/layout/Layout.vue +76 -0
  14. package/_Build/vue/components/layout/Navigation.vue +77 -0
  15. package/_Build/vue/{modules/AuthModule/components/VPageHeader.vue → components/layout/PageHeader.vue} +7 -2
  16. package/_Build/vue/components/layout/SideBar.vue +26 -0
  17. package/_Build/vue/{modules/AuthModule/components/VTable.vue → components/layout/Table.vue} +32 -16
  18. package/_Build/vue/{modules/AuthModule/components/VTableSorter.vue → components/layout/TableSorter.vue} +68 -43
  19. package/_Build/vue/components/layout/pageTitle.vue +1 -1
  20. package/_Build/vue/components/navigation/MenuItem.vue +7 -2
  21. package/_Build/vue/components/navigation/MenuItemGroup.vue +7 -2
  22. package/_Build/vue/modules/AuthModule/js/axios.js +19 -0
  23. package/_Build/vue/modules/AuthModule/js/router.js +42 -88
  24. package/_Build/vue/modules/AuthModule/js/store.js +15 -6
  25. package/_Build/vue/modules/AuthModule/{adminRoutes/PCompanies/Children/partials → routes/PCompanies}/form.vue +51 -19
  26. package/_Build/vue/modules/AuthModule/routes/PCompanies/resource.js +273 -0
  27. package/_Build/vue/modules/AuthModule/routes/PTeams/resource.js +334 -0
  28. package/_Build/vue/modules/AuthModule/{adminRoutes/PUsers/Children/partials → routes/PUsers}/form.vue +68 -44
  29. package/_Build/vue/modules/AuthModule/routes/PUsers/resource.js +322 -0
  30. package/_Build/vue/modules/AuthModule/routes/account-exists.vue +2 -2
  31. package/_Build/vue/modules/AuthModule/routes/change-password.vue +23 -24
  32. package/_Build/vue/modules/AuthModule/routes/container.vue +2 -11
  33. package/_Build/vue/modules/AuthModule/routes/expired-reset.vue +4 -4
  34. package/_Build/vue/modules/AuthModule/routes/expired-verification.vue +9 -8
  35. package/_Build/vue/modules/AuthModule/routes/force-reset.vue +39 -50
  36. package/_Build/vue/modules/AuthModule/routes/forgot.vue +4 -4
  37. package/_Build/vue/modules/AuthModule/routes/login.vue +7 -11
  38. package/_Build/vue/modules/AuthModule/routes/logincallback.vue +1 -3
  39. package/_Build/vue/modules/AuthModule/routes/loginsso.vue +7 -9
  40. package/_Build/vue/modules/AuthModule/routes/logout.vue +1 -3
  41. package/_Build/vue/modules/AuthModule/routes/logoutheadless.vue +1 -3
  42. package/_Build/vue/modules/AuthModule/routes/register.vue +19 -21
  43. package/_Build/vue/modules/AuthModule/routes/reset.vue +14 -13
  44. package/_Build/vue/modules/AuthModule/routes/success-forgot.vue +8 -7
  45. package/_Build/vue/modules/AuthModule/routes/success-reset.vue +2 -2
  46. package/_Build/vue/modules/AuthModule/routes/success-verify.vue +1 -3
  47. package/_Build/vue/modules/AuthModule/routes/verify.vue +11 -14
  48. package/_Build/vue/modules/resource/Children/create.vue +81 -0
  49. package/_Build/vue/modules/resource/Children/edit.vue +106 -0
  50. package/_Build/vue/modules/resource/Children/index.vue +42 -0
  51. package/_Build/vue/modules/resource/Children/partials/form.vue +61 -0
  52. package/_Build/vue/modules/resource/Children/show.vue +144 -0
  53. package/_Build/vue/modules/resource/index.js +545 -0
  54. package/_Build/vue/modules/resource/parent.vue +63 -0
  55. package/_base.scss +0 -1
  56. package/_defaults.scss +2 -13
  57. package/_variables.scss +9 -4
  58. package/components/_alert.scss +5 -0
  59. package/components/_auth.scss +163 -0
  60. package/components/_basic.scss +55 -0
  61. package/components/_breadcrumbs.scss +39 -0
  62. package/components/_button.scss +304 -0
  63. package/components/_cascader.scss +12 -0
  64. package/components/_checkbox.scss +41 -0
  65. package/components/_chip.scss +24 -0
  66. package/components/_collapse.scss +24 -0
  67. package/components/_datepicker.scss +53 -0
  68. package/components/_descriptions.scss +2 -0
  69. package/components/_footer.scss +47 -0
  70. package/components/_form.scss +24 -0
  71. package/components/_header.scss +30 -0
  72. package/components/_icon.scss +25 -0
  73. package/components/_inputNumber.scss +22 -0
  74. package/components/_layout.scss +56 -0
  75. package/components/_link.scss +44 -0
  76. package/components/_loader.scss +43 -0
  77. package/components/_menu.scss +112 -0
  78. package/components/_modal.scss +24 -0
  79. package/components/_pageTitle.scss +8 -0
  80. package/components/_permissionLegend.scss +18 -0
  81. package/components/_select.scss +29 -0
  82. package/components/_sidebar.scss +41 -0
  83. package/components/_switch.scss +14 -0
  84. package/components/_table.scss +20 -0
  85. package/components/_tooltip.scss +4 -0
  86. package/components/_typography.scss +162 -0
  87. package/components/_upload.scss +15 -0
  88. package/components/_wysiwyg.scss +7 -0
  89. package/components/_wysiwyg2.scss +142 -0
  90. package/index.js +10 -1
  91. package/package.json +5 -3
  92. package/vendor.scss +0 -1
  93. package/_Build/vue/components/layout/sideBar.vue +0 -25
  94. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/Upload/upload.vue +0 -251
  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/show.vue +0 -262
  99. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/parent.vue +0 -36
  100. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/create.vue +0 -112
  101. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/edit.vue +0 -103
  102. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/index.vue +0 -112
  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/_Build/vue/{modules/AuthModule/components → components/layout}/AuthModal.vue +0 -0
  106. /package/_Build/vue/{modules/AuthModule/components → components/layout}/Chip.vue +0 -0
  107. /package/_Build/vue/{modules/AuthModule/components/VPasswordValidation.vue → components/layout/PasswordValidation.vue} +0 -0
  108. /package/_Build/vue/{modules/AuthModule/components/VRoleLegend.vue → components/layout/RoleLegend.vue} +0 -0
@@ -0,0 +1,334 @@
1
+ import { merge } from "lodash";
2
+ import { h, resolveComponent } from "vue";
3
+ import axios from "axios";
4
+ import { throttle } from "lodash";
5
+
6
+ import { columns } from "../../../resource/index.js";
7
+ import userResource from "../PUsers/resource.js";
8
+ import { defaultResource, meta } from "../../../resource/index.js";
9
+
10
+ import VelFormRole from "../../../../components/layout/FormRole.vue";
11
+ import Chip from "../../../../components/layout/Chip.vue";
12
+ import Chips from "../../../../components/layout/Chips.vue";
13
+ import VelRoleLegend from "../../../../components/layout/RoleLegend.vue";
14
+
15
+ import VelTableSorter from "../../../../components/layout/TableSorter.vue";
16
+ import VelButton from "../../../../components/basic/Button.vue";
17
+ import VelCheckbox from "../../../../components/form/Checkbox.vue";
18
+ import VelSelect from "../../../../components/form/Select.vue";
19
+
20
+ export default [
21
+ "teams",
22
+ {
23
+ icon: `icon-account-circle`,
24
+ api: {
25
+ params: {
26
+ index: ({ $route }) => ({
27
+ include: "company",
28
+ "filter[company_id]": $route.params.companiesId,
29
+ }),
30
+ show: () => ({
31
+ include: "company",
32
+ }),
33
+ },
34
+ },
35
+ permissions: {
36
+ create: ({ $store }) => $store.getters.can("write teams"),
37
+ edit: ({ $store }) => $store.getters.can("write teams"),
38
+ delete: ({ $store }) => $store.getters.can("delete teams"),
39
+ },
40
+ ...merge(
41
+ columns([
42
+ {
43
+ key: "name",
44
+ sortable: true,
45
+ },
46
+ {
47
+ key: "description",
48
+ },
49
+ {
50
+ key: "company_id",
51
+ label: "Company",
52
+ endpoint: "api/companies",
53
+ labelKey: "name",
54
+ filterable: true,
55
+ searchParam: "name",
56
+ condition: {
57
+ form: {
58
+ write: ({ $route, model }) =>
59
+ !$route.params.companiesId && !model?.company,
60
+ },
61
+ },
62
+ initial: ({ model, $route }) =>
63
+ model?.company ||
64
+ ($route.params.companiesId && {
65
+ id: $route.params.companiesId,
66
+ }),
67
+ preparation: ({ form }) => form.company_id?.id,
68
+ render: {
69
+ read: ({ model }) => h("span", model.company.name),
70
+ write: () => h(VelSelect),
71
+ },
72
+ },
73
+ {
74
+ key: "user_count",
75
+ label: "Users",
76
+ condition: {
77
+ form: false,
78
+ },
79
+ },
80
+ {
81
+ key: "roles",
82
+ initial: ({ model }) =>
83
+ model?.roles.map((val) => val.id) || [],
84
+ preparation: ({ form }) =>
85
+ form.roles?.map((d) =>
86
+ typeof d === "object" ? d.value : d,
87
+ ),
88
+ render: {
89
+ read: ({ model }) =>
90
+ h(
91
+ !model.overrides_roles_and_permissions ||
92
+ model.roles.length === 1
93
+ ? Chip
94
+ : Chips,
95
+ !model.overrides_roles_and_permissions
96
+ ? {
97
+ name: "inherited",
98
+ label: "Inherited",
99
+ }
100
+ : model.roles.length === 1
101
+ ? {
102
+ name: model.roles[0].name,
103
+ label: model.roles[0].label,
104
+ }
105
+ : { array: model.roles },
106
+ ),
107
+ write: ({ model, form }) =>
108
+ h(VelFormRole, {
109
+ overrides:
110
+ model?.overrides_roles_and_permissions,
111
+ form,
112
+ }),
113
+ },
114
+ },
115
+ ]),
116
+ {
117
+ index: {
118
+ layout: [
119
+ ...defaultResource.index.layout,
120
+ () =>
121
+ h(VelRoleLegend, {
122
+ class: "mt-5",
123
+ }),
124
+ ],
125
+ },
126
+ show: {
127
+ tabs: [
128
+ ...defaultResource.show.tabs,
129
+ ({ model }) => ({
130
+ label: "Access control",
131
+ component: h(VelFormRole, {
132
+ overrides:
133
+ model.overrides_roles_and_permissions,
134
+ form: { roles: model.roles.map((d) => d.id) },
135
+ readonly: true,
136
+ }),
137
+ }),
138
+ (props) => {
139
+ const { model, $store, $router, $route, ...rest } =
140
+ props;
141
+
142
+ return {
143
+ label: "Members",
144
+ component: h({
145
+ data: () => ({
146
+ scoped: true,
147
+ }),
148
+ mounted() {
149
+ this.emitter.on("reload-teams", () => {
150
+ this.reload();
151
+ });
152
+ },
153
+ beforeUnmount() {
154
+ this.emitter.off("reload-teams");
155
+ },
156
+ methods: {
157
+ reload: throttle(function () {
158
+ this.$refs.members.reload();
159
+ this.$refs.users.reload();
160
+ }, 1000),
161
+ },
162
+ render() {
163
+ return h("div", [
164
+ h("h3", "Members"),
165
+ (() => {
166
+ const resource = meta(
167
+ ...userResource,
168
+ );
169
+
170
+ resource.api.params.index = ({
171
+ $route,
172
+ }) => ({
173
+ include: "company",
174
+ "filter[teams.id]":
175
+ $route.params.teamsId,
176
+ });
177
+
178
+ resource.table.actions = [
179
+ ({ model }) =>
180
+ h({
181
+ data: () => ({
182
+ loading: false,
183
+ }),
184
+ render() {
185
+ return h(
186
+ VelButton,
187
+ {
188
+ tag: "a",
189
+ size: "small",
190
+ type: "warning",
191
+ loading:
192
+ this
193
+ .loading,
194
+ onClick:
195
+ async () => {
196
+ this.loading = true;
197
+
198
+ await axios.delete(
199
+ `api/teams/${$route.params.teamsId}/users/${model.id}`,
200
+ );
201
+
202
+ this.emitter.emit(
203
+ "reload-teams",
204
+ );
205
+ },
206
+ },
207
+ "Remove",
208
+ );
209
+ },
210
+ }),
211
+ ];
212
+
213
+ const props = {
214
+ model,
215
+ $store,
216
+ $router,
217
+ $route,
218
+ ...rest,
219
+ resource,
220
+ };
221
+
222
+ return h(
223
+ VelTableSorter,
224
+ merge(
225
+ resource.index.structure(
226
+ props,
227
+ ),
228
+ {
229
+ ref: "members",
230
+ },
231
+ ),
232
+ );
233
+ })(),
234
+ h("h3", "Users"),
235
+ h(VelCheckbox, {
236
+ label: "Only show users from this company",
237
+ class: "mt-2",
238
+ modelValue: this.scoped,
239
+ "onUpdate:modelValue": (
240
+ value,
241
+ ) => {
242
+ this.scoped = value;
243
+ this.$nextTick(() => {
244
+ this.$refs.users.reload();
245
+ });
246
+ },
247
+ }),
248
+ (() => {
249
+ const resource = meta(
250
+ ...userResource,
251
+ );
252
+
253
+ resource.api.params.index = ({
254
+ $route,
255
+ }) => ({
256
+ include: "company",
257
+ "filter[company_id]": this
258
+ .scoped
259
+ ? $route.params
260
+ .companiesId
261
+ : null,
262
+ "filter[teams.id]": `!${$route.params.teamsId}`,
263
+ });
264
+
265
+ resource.table.actions = [
266
+ ({ model }) =>
267
+ h({
268
+ data: () => ({
269
+ loading: false,
270
+ }),
271
+ render() {
272
+ return h(
273
+ VelButton,
274
+ {
275
+ tag: "a",
276
+ size: "small",
277
+ type: "primary",
278
+ loading:
279
+ this
280
+ .loading,
281
+ onClick:
282
+ async () => {
283
+ this.loading = true;
284
+
285
+ await axios.post(
286
+ `api/teams/${$route.params.teamsId}/users`,
287
+ {
288
+ id: model.id,
289
+ },
290
+ );
291
+
292
+ this.emitter.emit(
293
+ "reload-teams",
294
+ );
295
+ },
296
+ },
297
+ "Add",
298
+ );
299
+ },
300
+ }),
301
+ ];
302
+
303
+ const props = {
304
+ model,
305
+ $store,
306
+ $router,
307
+ $route,
308
+ ...rest,
309
+ resource,
310
+ };
311
+
312
+ return h(
313
+ VelTableSorter,
314
+ merge(
315
+ resource.index.structure(
316
+ props,
317
+ ),
318
+ {
319
+ ref: "users",
320
+ },
321
+ ),
322
+ );
323
+ })(),
324
+ ]);
325
+ },
326
+ }),
327
+ };
328
+ },
329
+ ],
330
+ },
331
+ },
332
+ ),
333
+ },
334
+ ];
@@ -2,7 +2,7 @@
2
2
  <template>
3
3
  <form class="" @submit.prevent="submit">
4
4
  <template v-if="method !== 'patch'">
5
- <el-basic
5
+ <VelBasic
6
6
  v-model="form.name"
7
7
  name="name"
8
8
  :error="form.errors"
@@ -11,7 +11,7 @@
11
11
  label="Name"
12
12
  />
13
13
 
14
- <el-basic
14
+ <VelBasic
15
15
  v-model="form.email"
16
16
  placeholder="Email"
17
17
  label="Email"
@@ -24,41 +24,50 @@
24
24
 
25
25
  <hr class="my-3 hr-muted" />
26
26
 
27
- <el-checkbox
28
- v-model="form.notify_user"
29
- name="notify_user"
30
- :error="form.errors"
31
- label="Send email to notify user of account and password"
32
- />
33
- <el-checkbox
34
- v-model="form.force_password_change"
35
- name="force_password_change"
36
- :error="form.errors"
37
- label="Force password change on first login"
38
- />
39
- <el-checkbox
40
- v-model="form.set_password"
41
- name="set_password"
42
- :error="form.errors"
43
- label="Auto generate password"
44
- />
45
- <template v-if="!form.set_password">
46
- <el-basic
47
- v-model="form.password"
48
- name="password"
27
+ <template v-if="isSSOCompany">
28
+ <p class="mb-3">
29
+ This user belongs to an SSO-enabled company. They
30
+ will authenticate via SSO on first login. No
31
+ password is required.
32
+ </p>
33
+ </template>
34
+ <template v-else>
35
+ <VelCheckbox
36
+ v-model="form.notify_user"
37
+ name="notify_user"
38
+ :error="form.errors"
39
+ label="Send email to notify user of account and password"
40
+ />
41
+ <VelCheckbox
42
+ v-model="form.force_password_change"
43
+ name="force_password_change"
49
44
  :error="form.errors"
50
- type="password"
51
- placeholder="Password"
52
- label="Password"
45
+ label="Force password change on first login"
53
46
  />
54
- <el-basic
55
- v-model="form.password_confirmation"
56
- name="password_confirmation"
47
+ <VelCheckbox
48
+ v-model="form.set_password"
49
+ name="set_password"
57
50
  :error="form.errors"
58
- type="password"
59
- placeholder="Password Confirmation"
60
- label="Password Confirmation"
51
+ label="Auto generate password"
61
52
  />
53
+ <template v-if="!form.set_password">
54
+ <VelBasic
55
+ v-model="form.password"
56
+ name="password"
57
+ :error="form.errors"
58
+ type="password"
59
+ placeholder="Password"
60
+ label="Password"
61
+ />
62
+ <VelBasic
63
+ v-model="form.password_confirmation"
64
+ name="password_confirmation"
65
+ :error="form.errors"
66
+ type="password"
67
+ placeholder="Password Confirmation"
68
+ label="Password Confirmation"
69
+ />
70
+ </template>
62
71
  </template>
63
72
 
64
73
  <hr class="my-5 hr-muted" />
@@ -66,22 +75,26 @@
66
75
 
67
76
  <template v-if="$store.getters.can('edit roles')">
68
77
  <template v-if="enableRoles">
69
- <el-button
70
- type="secondary"
78
+ <VelButton
71
79
  @click="
72
80
  form.roles = [];
73
81
  enableRoles = false;
74
82
  "
75
83
  >
76
84
  Reset roles
77
- </el-button>
78
- <FormRole :form="form" />
85
+ </VelButton>
86
+ <VelFormRole :form="form" />
79
87
  </template>
80
88
  <template v-else>
81
- <el-button @click="enableRoles = true">
82
- <GIcon name="icon-plus" embed asis class="fill-0 mr" />
89
+ <VelButton @click="enableRoles = true">
90
+ <GIcon
91
+ name="icon-plus"
92
+ embed
93
+ asis
94
+ class="fill-0 icon--0.5 mr"
95
+ />
83
96
  Override roles
84
- </el-button>
97
+ </VelButton>
85
98
  <p class="mt-2">
86
99
  Roles will be inherited from the company level.
87
100
  </p>
@@ -89,18 +102,26 @@
89
102
  <hr class="my-5 hr-muted" />
90
103
  </template>
91
104
 
92
- <VFormFooter :loading="form.processing" />
105
+ <VelFormFooter :loading="form.processing" />
93
106
  </form>
94
107
  </template>
95
108
 
96
109
  <script>
97
110
  import axios from "axios";
98
111
  import { debounce } from "lodash";
112
+ import VelButton from "../../../../components/basic/Button.vue";
113
+ import VelCheckbox from "../../../../components/form/Checkbox.vue";
114
+ import VelBasic from "../../../../components/form/basic.vue";
115
+ import VelFormRole from "../../../../components/layout/FormRole.vue";
116
+ import VelFormFooter from "../../../../components/layout/FormFooter.vue";
99
117
 
100
118
  export default {
101
119
  components: {
102
- VFormFooter: require("../../../../components/VFormFooter.vue").default,
103
- FormRole: require("../../../../components/FormRole.vue").default,
120
+ VelFormFooter,
121
+ VelFormRole,
122
+ VelCheckbox,
123
+ VelButton,
124
+ VelBasic,
104
125
  },
105
126
  props: {
106
127
  form: {
@@ -112,8 +133,8 @@ export default {
112
133
  type: Function,
113
134
  },
114
135
  method: {
115
- required: true,
116
136
  type: String,
137
+ default: "post",
117
138
  },
118
139
  },
119
140
 
@@ -129,6 +150,9 @@ export default {
129
150
  domain() {
130
151
  return this.form.email?.split("@")[1];
131
152
  },
153
+ isSSOCompany() {
154
+ return !!this.company?.sso_enabled;
155
+ },
132
156
  },
133
157
 
134
158
  watch: {