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

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 (90) hide show
  1. package/README.md +160 -38
  2. package/_Build/vue/components/Icon.vue +33 -0
  3. package/_Build/vue/components/Svg.vue +45 -0
  4. package/_Build/vue/components/basic/Button.vue +109 -0
  5. package/_Build/vue/components/basic/link.vue +64 -0
  6. package/_Build/vue/components/form/Cascader.vue +85 -0
  7. package/_Build/vue/components/form/Checkbox.vue +39 -0
  8. package/_Build/vue/components/form/CheckboxGroup.vue +91 -0
  9. package/_Build/vue/components/form/DatePicker.vue +116 -0
  10. package/_Build/vue/components/form/InputNumber.vue +89 -0
  11. package/_Build/vue/components/form/Select.vue +109 -0
  12. package/_Build/vue/components/form/Spinner.vue +5 -0
  13. package/_Build/vue/components/form/Switch.vue +63 -0
  14. package/_Build/vue/components/form/Upload.vue +101 -0
  15. package/_Build/vue/components/form/Wysiwyg.vue +127 -0
  16. package/_Build/vue/components/form/Wysiwyg2.vue +577 -0
  17. package/_Build/vue/components/form/basic.vue +106 -0
  18. package/_Build/vue/components/form/color.vue +22 -0
  19. package/_Build/vue/components/form/file.vue +89 -0
  20. package/_Build/vue/components/form/input.js +79 -0
  21. package/_Build/vue/components/form/input.vue +105 -0
  22. package/_Build/vue/components/layout/Alert.vue +38 -0
  23. package/_Build/vue/components/layout/Footer.vue +50 -0
  24. package/_Build/vue/components/layout/Header.vue +13 -0
  25. package/_Build/vue/components/layout/Loader.vue +59 -0
  26. package/_Build/vue/components/layout/Tooltip.vue +46 -0
  27. package/_Build/vue/components/layout/pageTitle.vue +18 -0
  28. package/_Build/vue/components/layout/sideBar.vue +25 -0
  29. package/_Build/vue/components/navigation/Breadcrumbs.vue +37 -0
  30. package/_Build/vue/components/navigation/BreadcrumbsItem.vue +19 -0
  31. package/_Build/vue/components/navigation/Menu.vue +14 -0
  32. package/_Build/vue/components/navigation/MenuItem.vue +20 -0
  33. package/_Build/vue/components/navigation/MenuItemGroup.vue +20 -0
  34. package/_Build/vue/components/navigation/SubMenu.vue +20 -0
  35. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/Upload/upload.vue +259 -0
  36. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/create.vue +62 -0
  37. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/edit.vue +98 -0
  38. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/index.vue +90 -0
  39. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/partials/form.vue +181 -0
  40. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/show.vue +267 -0
  41. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/parent.vue +36 -0
  42. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/create.vue +113 -0
  43. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/edit.vue +101 -0
  44. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/index.vue +112 -0
  45. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/partials/form.vue +174 -0
  46. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/show.vue +123 -0
  47. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/parent.vue +36 -0
  48. package/_Build/vue/modules/AuthModule/components/AuthModal.vue +105 -0
  49. package/_Build/vue/modules/AuthModule/components/Chip.vue +70 -0
  50. package/_Build/vue/modules/AuthModule/components/Chips.vue +26 -0
  51. package/_Build/vue/modules/AuthModule/components/FormRole.vue +117 -0
  52. package/_Build/vue/modules/AuthModule/components/VBreadcrumbs.vue +33 -0
  53. package/_Build/vue/modules/AuthModule/components/VFormFooter.vue +52 -0
  54. package/_Build/vue/modules/AuthModule/components/VPageHeader.vue +38 -0
  55. package/_Build/vue/modules/AuthModule/components/VPasswordValidation.vue +106 -0
  56. package/_Build/vue/modules/AuthModule/components/VRoleLegend.vue +43 -0
  57. package/_Build/vue/modules/AuthModule/components/VTable.vue +136 -0
  58. package/_Build/vue/modules/AuthModule/components/VTableSorter.vue +252 -0
  59. package/_Build/vue/modules/AuthModule/js/FakeAPI.js +78 -0
  60. package/_Build/vue/modules/AuthModule/js/axios.js +81 -0
  61. package/_Build/vue/modules/AuthModule/js/router.js +295 -0
  62. package/_Build/vue/modules/AuthModule/js/store.js +62 -0
  63. package/_Build/vue/modules/AuthModule/routes/account-exists.vue +33 -0
  64. package/_Build/vue/modules/AuthModule/routes/change-password.vue +163 -0
  65. package/_Build/vue/modules/AuthModule/routes/container.vue +34 -0
  66. package/_Build/vue/modules/AuthModule/routes/expired-reset.vue +78 -0
  67. package/_Build/vue/modules/AuthModule/routes/expired-verification.vue +101 -0
  68. package/_Build/vue/modules/AuthModule/routes/force-reset.vue +147 -0
  69. package/_Build/vue/modules/AuthModule/routes/forgot.vue +91 -0
  70. package/_Build/vue/modules/AuthModule/routes/login.vue +139 -0
  71. package/_Build/vue/modules/AuthModule/routes/logincallback.vue +39 -0
  72. package/_Build/vue/modules/AuthModule/routes/loginheadless.vue +21 -0
  73. package/_Build/vue/modules/AuthModule/routes/loginsso.vue +132 -0
  74. package/_Build/vue/modules/AuthModule/routes/logout.vue +19 -0
  75. package/_Build/vue/modules/AuthModule/routes/logoutheadless.vue +25 -0
  76. package/_Build/vue/modules/AuthModule/routes/register.vue +171 -0
  77. package/_Build/vue/modules/AuthModule/routes/reset.vue +133 -0
  78. package/_Build/vue/modules/AuthModule/routes/success-forgot.vue +120 -0
  79. package/_Build/vue/modules/AuthModule/routes/success-reset.vue +35 -0
  80. package/_Build/vue/modules/AuthModule/routes/success-verify.vue +30 -0
  81. package/_Build/vue/modules/AuthModule/routes/verify.vue +110 -0
  82. package/_base.scss +0 -1
  83. package/_defaults.scss +2 -13
  84. package/_variables.scss +9 -4
  85. package/{modules/_AuthModule.scss → components/_auth.scss} +19 -68
  86. package/package.json +3 -8
  87. package/vendor.scss +0 -1
  88. package/components/_input.scss +0 -0
  89. package/modules/_AuthVariables.scss +0 -7
  90. /package/{modules → components}/_modal.scss +0 -0
@@ -0,0 +1,20 @@
1
+ <template>
2
+ <el-sub-menu :index="index" class="vel-sub-menu">
3
+ <template #title>
4
+ <slot name="title" />
5
+ </template>
6
+ <template #default>
7
+ <slot name="default" />
8
+ </template>
9
+ </el-sub-menu>
10
+ </template>
11
+
12
+ <script>
13
+ import { ElSubMenu } from "element-plus";
14
+ export default {
15
+ components: {
16
+ ElSubMenu,
17
+ },
18
+ props: ["index"],
19
+ };
20
+ </script>
@@ -0,0 +1,259 @@
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/2">
6
+ <div class="grid__1/1 grid justify-between mb-4 items-end">
7
+ <h2 class="h1">User import</h2>
8
+ <div>
9
+ <VelButton
10
+ tag="a"
11
+ type="secondary"
12
+ href="/media/content/files/example.csv"
13
+ download
14
+ >
15
+ <GIcon
16
+ class="fill-1 mr-0.5"
17
+ name="icon-download"
18
+ embed
19
+ artboard
20
+ />
21
+ Download example file
22
+ </VelButton>
23
+ </div>
24
+ </div>
25
+ <div class="grid__1/1">
26
+ <VelSelect
27
+ v-model="form.roles"
28
+ placeholder="Select"
29
+ multiple
30
+ name="roles"
31
+ :error="form.errors"
32
+ label="Roles"
33
+ :options="[
34
+ {
35
+ label: 'Administrator',
36
+ value: '1',
37
+ },
38
+ {
39
+ label: 'Subscriber',
40
+ value: '2',
41
+ },
42
+ ]"
43
+ />
44
+
45
+ <VelSelect
46
+ v-if="form.roles && form.roles.length"
47
+ v-model="form.permissions"
48
+ placeholder="Select"
49
+ multiple
50
+ name="permissions"
51
+ :error="form.errors"
52
+ label="Permissions"
53
+ :options="[
54
+ {
55
+ label: `Inherit Permissions`,
56
+ value: null,
57
+ },
58
+ //{ // temporarily disabled as not used yet
59
+ // label: &quot;Approve Content&quot;,
60
+ // value: &quot;2&quot;
61
+ //},
62
+ {
63
+ label: 'View content',
64
+ value: '3',
65
+ },
66
+ {
67
+ label: 'Write content',
68
+ value: '4',
69
+ disabled: !form.roles.includes(1),
70
+ },
71
+ {
72
+ label: 'Delete content',
73
+ value: '5',
74
+ disabled: !form.roles.includes(1),
75
+ },
76
+ ]"
77
+ />
78
+ </div>
79
+ <div class="grid__1/1">
80
+ <hr class="my-3 hr-muted" />
81
+
82
+ <VelUpload
83
+ ref="upload"
84
+ v-model="form.files"
85
+ name="files"
86
+ label="Upload spreadsheet"
87
+ :auto-upload="false"
88
+ :limit="1"
89
+ :on-exceed="handleExceed"
90
+ >
91
+ <template #trigger>
92
+ <VelButton
93
+ class="mt"
94
+ type="primary"
95
+ :disabled="form.processing || form.files.length"
96
+ >Select file</VelButton
97
+ >
98
+ </template>
99
+
100
+ <VelButton
101
+ class="ml relative button--spinner"
102
+ type="success"
103
+ :disabled="form.processing || !form.files.length"
104
+ @click="submitUpload"
105
+ >
106
+ <span :class="{ active: !form.processing }"
107
+ >Upload</span
108
+ >
109
+ <VelSpinner :class="{ active: form.processing }" />
110
+ </VelButton>
111
+
112
+ <small class="block my color-muted"
113
+ >Upload one spreadsheet with a size less than
114
+ 50MB</small
115
+ >
116
+ </VelUpload>
117
+ </div>
118
+ </div>
119
+ </div>
120
+ </template>
121
+
122
+ <script>
123
+ "use strict";
124
+
125
+ import Form from "form-backend-validation";
126
+ import { ElMessageBox, genFileId } from "element-plus";
127
+ import VelButton from "../../../../../../components/basic/Button.vue";
128
+ import VelSelect from "../../../../../../components/form/Select.vue";
129
+ import VelUpload from "../../../../../../components/form/Upload.vue";
130
+ import VelSpinner from "../../../../../../components/form/Spinner.vue";
131
+
132
+ export default {
133
+ name: "Create",
134
+
135
+ components: {
136
+ VBreadcrumbs: require("../../../../components/VBreadcrumbs.vue")
137
+ .default,
138
+ VelButton,
139
+ VelSelect,
140
+ VelUpload,
141
+ VelSpinner,
142
+ },
143
+
144
+ data() {
145
+ return {
146
+ id: null,
147
+ breadcrumbs: [
148
+ {
149
+ href: {
150
+ name: "index",
151
+ },
152
+ text: "Home",
153
+ },
154
+ ],
155
+ form: new Form(
156
+ {
157
+ step: 0,
158
+ files: [],
159
+ roles: [2],
160
+ permissions: [null],
161
+ company_id: null,
162
+ },
163
+ {
164
+ http: window.axios,
165
+ },
166
+ ),
167
+ };
168
+ },
169
+
170
+ watch: {
171
+ "form.roles": {
172
+ handler(newVal) {
173
+ const subscriptions = [
174
+ 3, // view content
175
+ 4, // write content
176
+ 5, // delete content
177
+ ];
178
+
179
+ if (!newVal.includes(1)) {
180
+ this.form.permissions = this.form.permissions.filter(
181
+ (item) => subscriptions.includes(item),
182
+ );
183
+
184
+ if (!newVal.includes(2)) {
185
+ this.form.permissions = this.form.permissions.filter(
186
+ (item) => !subscriptions.includes(item),
187
+ );
188
+ }
189
+ }
190
+ },
191
+ },
192
+ },
193
+
194
+ async mounted() {
195
+ this.id = this.$route.params.id;
196
+ this.form.company_id = this.id;
197
+ window.axios.get(`/api/companies/${this.id}`).then((res) => {
198
+ const company = res.data.data;
199
+ this.breadcrumbs.push(
200
+ {
201
+ href: {
202
+ name: "companies.show",
203
+ param: this.id,
204
+ },
205
+ text: company.name,
206
+ },
207
+ {
208
+ href: {
209
+ name: "companies.pload",
210
+ },
211
+ text: "User upload",
212
+ },
213
+ );
214
+ });
215
+ },
216
+
217
+ methods: {
218
+ submitUpload() {
219
+ this.form.post(`/api/users/import`).then(({ data }) => {
220
+ this.open(data);
221
+ });
222
+ },
223
+
224
+ handleExceed(files) {
225
+ this.$refs.upload.clearFiles();
226
+
227
+ const file = files[0];
228
+ file.uid = genFileId();
229
+
230
+ this.$refs.upload.handleStart(file);
231
+ },
232
+
233
+ open(data) {
234
+ let html = "Succesfully imported all users";
235
+
236
+ if (data.length > 0) {
237
+ html =
238
+ "Errors detected on upload following emails were not added to the system<table>";
239
+ for (let x = 0; x < data.length; x++) {
240
+ html += `<tr><td>${data[x].email}</td></tr>`;
241
+ }
242
+ html += "</table>";
243
+ }
244
+
245
+ ElMessageBox.alert(html, {
246
+ confirmButtonText: "Ok",
247
+ dangerouslyUseHTMLString: true,
248
+ })
249
+ .then(() => {
250
+ this.$router.replace({
251
+ name: "companies.show",
252
+ params: { id: this.id },
253
+ });
254
+ })
255
+ .catch(() => {});
256
+ },
257
+ },
258
+ };
259
+ </script>
@@ -0,0 +1,62 @@
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>
@@ -0,0 +1,98 @@
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>
@@ -0,0 +1,90 @@
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>