@fishawack/lab-velocity 2.0.0-beta.43 → 2.0.0-beta.45

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 (33) hide show
  1. package/README.md +25 -0
  2. package/_Build/vue/components/layout/PageHeader.vue +7 -6
  3. package/_Build/vue/components/layout/Table.vue +5 -0
  4. package/_Build/vue/components/layout/TableSorter.vue +1 -0
  5. package/_Build/vue/components/layout/TokenDisplay.vue +52 -0
  6. package/_Build/vue/modules/AuthModule/js/guest-request.js +32 -0
  7. package/_Build/vue/modules/AuthModule/js/impersonation-banner.js +102 -0
  8. package/_Build/vue/modules/AuthModule/js/router.js +61 -27
  9. package/_Build/vue/modules/AuthModule/js/store.js +8 -0
  10. package/_Build/vue/modules/AuthModule/routes/PCompanies/resource.js +2 -3
  11. package/_Build/vue/modules/AuthModule/routes/PIntegrations/columns.js +58 -0
  12. package/_Build/vue/modules/AuthModule/routes/PIntegrations/resource.js +53 -96
  13. package/_Build/vue/modules/AuthModule/routes/PTeams/columns.js +78 -0
  14. package/_Build/vue/modules/AuthModule/routes/PTeams/resource.js +206 -290
  15. package/_Build/vue/modules/AuthModule/routes/PUsers/SetPasswordAction.vue +51 -0
  16. package/_Build/vue/modules/AuthModule/routes/PUsers/SetPasswordDialog.vue +138 -0
  17. package/_Build/vue/modules/AuthModule/routes/PUsers/resource.js +39 -2
  18. package/_Build/vue/modules/AuthModule/routes/change-password.vue +6 -9
  19. package/_Build/vue/modules/AuthModule/routes/force-reset.vue +6 -9
  20. package/_Build/vue/modules/AuthModule/routes/forgot.vue +6 -1
  21. package/_Build/vue/modules/AuthModule/routes/login.vue +6 -9
  22. package/_Build/vue/modules/AuthModule/routes/loginsso.vue +7 -1
  23. package/_Build/vue/modules/AuthModule/routes/logout.vue +10 -2
  24. package/_Build/vue/modules/AuthModule/routes/register.vue +6 -8
  25. package/_Build/vue/modules/AuthModule/routes/reset.vue +6 -1
  26. package/_Build/vue/modules/AuthModule/routes/success-forgot.vue +6 -1
  27. package/_Build/vue/modules/resource/index.js +9 -1
  28. package/_Build/vue/modules/resource/trashable.js +104 -0
  29. package/components/_table.scss +3 -0
  30. package/components/_token-display.scss +41 -0
  31. package/general.scss +1 -0
  32. package/index.js +5 -0
  33. package/package.json +1 -1
@@ -0,0 +1,78 @@
1
+ import { h } from "vue";
2
+
3
+ import VelSelect from "../../../../components/form/Select.vue";
4
+ import VelFormRole from "../../../../components/layout/FormRole.vue";
5
+ import Chip from "../../../../components/layout/Chip.vue";
6
+ import Chips from "../../../../components/layout/Chips.vue";
7
+
8
+ export default [
9
+ {
10
+ key: "name",
11
+ sortable: true,
12
+ },
13
+ {
14
+ key: "description",
15
+ },
16
+ {
17
+ key: "company_id",
18
+ label: "Company",
19
+ endpoint: "api/companies",
20
+ labelKey: "name",
21
+ filterable: true,
22
+ searchParam: "name",
23
+ condition: {
24
+ form: {
25
+ write: ({ $route, model }) =>
26
+ !$route.params.companiesId && !model?.company,
27
+ },
28
+ },
29
+ initial: ({ model, $route }) =>
30
+ model?.company ||
31
+ ($route.params.companiesId && {
32
+ id: $route.params.companiesId,
33
+ }),
34
+ preparation: ({ form }) => form.company_id?.id,
35
+ render: {
36
+ read: ({ model }) => h("span", model.company.name),
37
+ write: () => h(VelSelect),
38
+ },
39
+ },
40
+ {
41
+ key: "user_count",
42
+ label: "Users",
43
+ condition: {
44
+ form: false,
45
+ },
46
+ },
47
+ {
48
+ key: "roles",
49
+ initial: ({ model }) => model?.roles.map((val) => val.id) || [],
50
+ preparation: ({ form }) =>
51
+ form.roles?.map((d) => (typeof d === "object" ? d.value : d)),
52
+ render: {
53
+ read: ({ model }) =>
54
+ h(
55
+ !model.overrides_roles_and_permissions ||
56
+ model.roles.length === 1
57
+ ? Chip
58
+ : Chips,
59
+ !model.overrides_roles_and_permissions
60
+ ? {
61
+ name: "inherited",
62
+ label: "Inherited",
63
+ }
64
+ : model.roles.length === 1
65
+ ? {
66
+ name: model.roles[0].name,
67
+ label: model.roles[0].label,
68
+ }
69
+ : { array: model.roles },
70
+ ),
71
+ write: ({ model, form }) =>
72
+ h(VelFormRole, {
73
+ overrides: model?.overrides_roles_and_permissions,
74
+ form,
75
+ }),
76
+ },
77
+ },
78
+ ];
@@ -1,21 +1,17 @@
1
1
  import { merge } from "lodash";
2
- import { h, resolveComponent } from "vue";
2
+ import { h } from "vue";
3
3
  import axios from "axios";
4
4
  import { throttle } from "lodash";
5
5
 
6
- import { columns } from "../../../resource/index.js";
6
+ import { columns, defaultResource, meta } from "../../../resource/index.js";
7
7
  import userResource from "../PUsers/resource.js";
8
- import { defaultResource, meta } from "../../../resource/index.js";
8
+ import teamsColumns from "./columns.js";
9
9
 
10
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
11
  import VelRoleLegend from "../../../../components/layout/RoleLegend.vue";
14
-
15
12
  import VelTableSorter from "../../../../components/layout/TableSorter.vue";
16
13
  import VelButton from "../../../../components/basic/Button.vue";
17
14
  import VelCheckbox from "../../../../components/form/Checkbox.vue";
18
- import VelSelect from "../../../../components/form/Select.vue";
19
15
 
20
16
  export default [
21
17
  "teams",
@@ -33,303 +29,223 @@ export default [
33
29
  },
34
30
  },
35
31
  auditable: true,
32
+ trashable: true,
36
33
  permissions: {
37
34
  create: ({ $store }) => $store.getters.can("write teams"),
38
35
  edit: ({ $store }) => $store.getters.can("write teams"),
39
36
  delete: ({ $store }) => $store.getters.can("delete teams"),
40
37
  },
41
- ...merge(
42
- columns([
43
- {
44
- key: "name",
45
- sortable: true,
46
- },
47
- {
48
- key: "description",
49
- },
50
- {
51
- key: "company_id",
52
- label: "Company",
53
- endpoint: "api/companies",
54
- labelKey: "name",
55
- filterable: true,
56
- searchParam: "name",
57
- condition: {
58
- form: {
59
- write: ({ $route, model }) =>
60
- !$route.params.companiesId && !model?.company,
61
- },
62
- },
63
- initial: ({ model, $route }) =>
64
- model?.company ||
65
- ($route.params.companiesId && {
66
- id: $route.params.companiesId,
38
+ ...merge(columns(teamsColumns), {
39
+ index: {
40
+ layout: [
41
+ ...defaultResource.index.layout,
42
+ () =>
43
+ h(VelRoleLegend, {
44
+ class: "mt-5",
67
45
  }),
68
- preparation: ({ form }) => form.company_id?.id,
69
- render: {
70
- read: ({ model }) => h("span", model.company.name),
71
- write: () => h(VelSelect),
72
- },
73
- },
74
- {
75
- key: "user_count",
76
- label: "Users",
77
- condition: {
78
- form: false,
79
- },
80
- },
81
- {
82
- key: "roles",
83
- initial: ({ model }) =>
84
- model?.roles.map((val) => val.id) || [],
85
- preparation: ({ form }) =>
86
- form.roles?.map((d) =>
87
- typeof d === "object" ? d.value : d,
88
- ),
89
- render: {
90
- read: ({ model }) =>
91
- h(
92
- !model.overrides_roles_and_permissions ||
93
- model.roles.length === 1
94
- ? Chip
95
- : Chips,
96
- !model.overrides_roles_and_permissions
97
- ? {
98
- name: "inherited",
99
- label: "Inherited",
100
- }
101
- : model.roles.length === 1
102
- ? {
103
- name: model.roles[0].name,
104
- label: model.roles[0].label,
105
- }
106
- : { array: model.roles },
107
- ),
108
- write: ({ model, form }) =>
109
- h(VelFormRole, {
110
- overrides:
111
- model?.overrides_roles_and_permissions,
112
- form,
113
- }),
114
- },
115
- },
116
- ]),
117
- {
118
- index: {
119
- layout: [
120
- ...defaultResource.index.layout,
121
- () =>
122
- h(VelRoleLegend, {
123
- class: "mt-5",
124
- }),
125
- ],
126
- },
127
- show: {
128
- tabs: [
129
- ...defaultResource.show.tabs,
130
- ({ model }) => ({
131
- label: "Access control",
132
- component: h(VelFormRole, {
133
- overrides:
134
- model.overrides_roles_and_permissions,
135
- form: { roles: model.roles.map((d) => d.id) },
136
- readonly: true,
137
- }),
46
+ ],
47
+ },
48
+ show: {
49
+ tabs: [
50
+ ...defaultResource.show.tabs,
51
+ ({ model }) => ({
52
+ label: "Access control",
53
+ component: h(VelFormRole, {
54
+ overrides: model.overrides_roles_and_permissions,
55
+ form: { roles: model.roles.map((d) => d.id) },
56
+ readonly: true,
138
57
  }),
139
- (props) => {
140
- const { model, $store, $router, $route, ...rest } =
141
- props;
142
-
143
- return {
144
- label: "Members",
145
- component: h({
146
- data: () => ({
147
- scoped: true,
148
- }),
149
- mounted() {
150
- this.emitter.on("reload-teams", () => {
151
- this.reload();
152
- });
153
- },
154
- beforeUnmount() {
155
- this.emitter.off("reload-teams");
156
- },
157
- methods: {
158
- reload: throttle(function () {
159
- this.$refs.members.reload();
160
- this.$refs.users.reload();
161
- }, 1000),
162
- },
163
- render() {
164
- return h("div", [
165
- h("h3", "Members"),
166
- (() => {
167
- const resource = meta(
168
- ...userResource,
169
- );
170
-
171
- resource.api.params.index = ({
172
- $route,
173
- }) => ({
174
- include: "company",
175
- "filter[teams.id]":
176
- $route.params.teamsId,
177
- });
178
-
179
- resource.table.actions = [
180
- ({ model }) =>
181
- h({
182
- data: () => ({
183
- loading: false,
184
- }),
185
- render() {
186
- return h(
187
- VelButton,
188
- {
189
- tag: "a",
190
- size: "small",
191
- type: "warning",
192
- loading:
193
- this
194
- .loading,
195
- onClick:
196
- async () => {
197
- this.loading = true;
198
-
199
- await axios.delete(
200
- `api/teams/${$route.params.teamsId}/users/${model.id}`,
201
- );
202
-
203
- this.emitter.emit(
204
- "reload-teams",
205
- );
206
- },
207
- },
208
- "Remove",
209
- );
210
- },
58
+ }),
59
+ (props) => {
60
+ const { model, $store, $router, $route, ...rest } =
61
+ props;
62
+
63
+ return {
64
+ label: "Members",
65
+ component: h({
66
+ data: () => ({
67
+ scoped: true,
68
+ }),
69
+ mounted() {
70
+ this.emitter.on("reload-teams", () => {
71
+ this.reload();
72
+ });
73
+ },
74
+ beforeUnmount() {
75
+ this.emitter.off("reload-teams");
76
+ },
77
+ methods: {
78
+ reload: throttle(function () {
79
+ this.$refs.members.reload();
80
+ this.$refs.users.reload();
81
+ }, 1000),
82
+ },
83
+ render() {
84
+ return h("div", [
85
+ h("h3", "Members"),
86
+ (() => {
87
+ const resource = meta(
88
+ ...userResource,
89
+ );
90
+
91
+ resource.api.params.index = ({
92
+ $route,
93
+ }) => ({
94
+ include: "company",
95
+ "filter[teams.id]":
96
+ $route.params.teamsId,
97
+ });
98
+
99
+ resource.table.actions = [
100
+ ({ model }) =>
101
+ h({
102
+ data: () => ({
103
+ loading: false,
211
104
  }),
212
- ];
213
-
214
- const props = {
215
- model,
216
- $store,
217
- $router,
218
- $route,
219
- ...rest,
220
- resource,
221
- };
222
-
223
- return h(
224
- VelTableSorter,
225
- merge(
226
- resource.index.structure(
227
- props,
228
- ),
229
- {
230
- ref: "members",
105
+ render() {
106
+ return h(
107
+ VelButton,
108
+ {
109
+ tag: "a",
110
+ size: "small",
111
+ type: "warning",
112
+ loading:
113
+ this
114
+ .loading,
115
+ onClick:
116
+ async () => {
117
+ this.loading = true;
118
+
119
+ await axios.delete(
120
+ `api/teams/${$route.params.teamsId}/users/${model.id}`,
121
+ );
122
+
123
+ this.emitter.emit(
124
+ "reload-teams",
125
+ );
126
+ },
127
+ },
128
+ "Remove",
129
+ );
231
130
  },
131
+ }),
132
+ ];
133
+
134
+ const props = {
135
+ model,
136
+ $store,
137
+ $router,
138
+ $route,
139
+ ...rest,
140
+ resource,
141
+ };
142
+
143
+ return h(
144
+ VelTableSorter,
145
+ merge(
146
+ resource.index.structure(
147
+ props,
232
148
  ),
233
- );
234
- })(),
235
- h("h3", "Users"),
236
- h(VelCheckbox, {
237
- label: "Only show users from this company",
238
- class: "mt-2",
239
- modelValue: this.scoped,
240
- "onUpdate:modelValue": (
241
- value,
242
- ) => {
243
- this.scoped = value;
244
- this.$nextTick(() => {
245
- this.$refs.users.reload();
246
- });
247
- },
248
- }),
249
- (() => {
250
- const resource = meta(
251
- ...userResource,
252
- );
253
-
254
- resource.api.params.index = ({
255
- $route,
256
- }) => ({
257
- include: "company",
258
- "filter[company_id]": this
259
- .scoped
260
- ? $route.params
261
- .companiesId
262
- : null,
263
- "filter[teams.id]": `!${$route.params.teamsId}`,
149
+ {
150
+ ref: "members",
151
+ },
152
+ ),
153
+ );
154
+ })(),
155
+ h("h3", "Users"),
156
+ h(VelCheckbox, {
157
+ label: "Only show users from this company",
158
+ class: "mt-2",
159
+ modelValue: this.scoped,
160
+ "onUpdate:modelValue": (value) => {
161
+ this.scoped = value;
162
+ this.$nextTick(() => {
163
+ this.$refs.users.reload();
264
164
  });
265
-
266
- resource.table.actions = [
267
- ({ model }) =>
268
- h({
269
- data: () => ({
270
- loading: false,
271
- }),
272
- render() {
273
- return h(
274
- VelButton,
275
- {
276
- tag: "a",
277
- size: "small",
278
- type: "primary",
279
- loading:
280
- this
281
- .loading,
282
- onClick:
283
- async () => {
284
- this.loading = true;
285
-
286
- await axios.post(
287
- `api/teams/${$route.params.teamsId}/users`,
288
- {
289
- id: model.id,
290
- },
291
- );
292
-
293
- this.emitter.emit(
294
- "reload-teams",
295
- );
296
- },
297
- },
298
- "Add",
299
- );
300
- },
165
+ },
166
+ }),
167
+ (() => {
168
+ const resource = meta(
169
+ ...userResource,
170
+ );
171
+
172
+ resource.api.params.index = ({
173
+ $route,
174
+ }) => ({
175
+ include: "company",
176
+ "filter[company_id]": this
177
+ .scoped
178
+ ? $route.params.companiesId
179
+ : null,
180
+ "filter[teams.id]": `!${$route.params.teamsId}`,
181
+ });
182
+
183
+ resource.table.actions = [
184
+ ({ model }) =>
185
+ h({
186
+ data: () => ({
187
+ loading: false,
301
188
  }),
302
- ];
303
-
304
- const props = {
305
- model,
306
- $store,
307
- $router,
308
- $route,
309
- ...rest,
310
- resource,
311
- };
312
-
313
- return h(
314
- VelTableSorter,
315
- merge(
316
- resource.index.structure(
317
- props,
318
- ),
319
- {
320
- ref: "users",
189
+ render() {
190
+ return h(
191
+ VelButton,
192
+ {
193
+ tag: "a",
194
+ size: "small",
195
+ type: "primary",
196
+ loading:
197
+ this
198
+ .loading,
199
+ onClick:
200
+ async () => {
201
+ this.loading = true;
202
+
203
+ await axios.post(
204
+ `api/teams/${$route.params.teamsId}/users`,
205
+ {
206
+ id: model.id,
207
+ },
208
+ );
209
+
210
+ this.emitter.emit(
211
+ "reload-teams",
212
+ );
213
+ },
214
+ },
215
+ "Add",
216
+ );
321
217
  },
218
+ }),
219
+ ];
220
+
221
+ const props = {
222
+ model,
223
+ $store,
224
+ $router,
225
+ $route,
226
+ ...rest,
227
+ resource,
228
+ };
229
+
230
+ return h(
231
+ VelTableSorter,
232
+ merge(
233
+ resource.index.structure(
234
+ props,
322
235
  ),
323
- );
324
- })(),
325
- ]);
326
- },
327
- }),
328
- };
329
- },
330
- ],
331
- },
236
+ {
237
+ ref: "users",
238
+ },
239
+ ),
240
+ );
241
+ })(),
242
+ ]);
243
+ },
244
+ }),
245
+ };
246
+ },
247
+ ],
332
248
  },
333
- ),
249
+ }),
334
250
  },
335
251
  ];