@fishawack/lab-velocity 2.0.0-beta.6 → 2.0.0-beta.60

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 (111) hide show
  1. package/README.md +467 -36
  2. package/_Build/js/libs/build-id.js +14 -0
  3. package/_Build/js/libs/filters.js +36 -0
  4. package/_Build/js/libs/globals.js +7 -0
  5. package/_Build/js/libs/router.js +22 -0
  6. package/_Build/js/libs/routes.js +29 -0
  7. package/_Build/js/libs/store.js +21 -0
  8. package/_Build/js/libs/utility.js +161 -0
  9. package/_Build/vue/components/basic/Button.vue +1 -1
  10. package/_Build/vue/components/form/Avatar.vue +90 -0
  11. package/_Build/vue/components/form/Checkbox.vue +10 -0
  12. package/_Build/vue/components/form/InputNumber.vue +1 -1
  13. package/_Build/vue/components/form/Select.vue +221 -31
  14. package/_Build/vue/components/form/Wysiwyg2.vue +87 -2
  15. package/_Build/vue/components/form/wysiwyg2-video.js +41 -0
  16. package/_Build/vue/components/layout/Alert.vue +5 -5
  17. package/_Build/vue/components/layout/Audit.vue +158 -0
  18. package/_Build/vue/{modules/AuthModule/components/VBreadcrumbs.vue → components/layout/Breadcrumbs.vue} +4 -4
  19. package/_Build/vue/{modules/AuthModule/components → components/layout}/Chips.vue +2 -2
  20. package/_Build/vue/components/layout/Footer.vue +11 -10
  21. package/_Build/vue/{modules/AuthModule/components/VFormFooter.vue → components/layout/FormFooter.vue} +2 -2
  22. package/_Build/vue/{modules/AuthModule/components → components/layout}/FormRole.vue +8 -8
  23. package/_Build/vue/components/layout/Layout.vue +94 -0
  24. package/_Build/vue/components/layout/Navigation.vue +83 -0
  25. package/_Build/vue/{modules/AuthModule/components/VPageHeader.vue → components/layout/PageHeader.vue} +14 -8
  26. package/_Build/vue/components/layout/SideBar.vue +26 -0
  27. package/_Build/vue/{modules/AuthModule/components/VTable.vue → components/layout/Table.vue} +24 -12
  28. package/_Build/vue/{modules/AuthModule/components/VTableSorter.vue → components/layout/TableSorter.vue} +92 -48
  29. package/_Build/vue/components/layout/TokenDisplay.vue +52 -0
  30. package/_Build/vue/components/layout/pageTitle.vue +1 -1
  31. package/_Build/vue/components/navigation/Menu.vue +6 -1
  32. package/_Build/vue/components/navigation/MenuItem.vue +7 -2
  33. package/_Build/vue/components/navigation/MenuItemGroup.vue +7 -2
  34. package/_Build/vue/modules/AuthModule/js/axios.js +21 -1
  35. package/_Build/vue/modules/AuthModule/js/clear-cookies.js +34 -0
  36. package/_Build/vue/modules/AuthModule/js/guest-request.js +32 -0
  37. package/_Build/vue/modules/AuthModule/js/impersonation-banner.js +102 -0
  38. package/_Build/vue/modules/AuthModule/js/router.js +91 -114
  39. package/_Build/vue/modules/AuthModule/js/store.js +23 -6
  40. package/_Build/vue/modules/AuthModule/routes/PCompanies/columns.js +268 -0
  41. package/_Build/vue/modules/AuthModule/routes/PCompanies/resource.js +213 -0
  42. package/_Build/vue/modules/AuthModule/routes/PIntegrations/columns.js +58 -0
  43. package/_Build/vue/modules/AuthModule/routes/PIntegrations/resource.js +79 -0
  44. package/_Build/vue/modules/AuthModule/routes/PTeams/columns.js +78 -0
  45. package/_Build/vue/modules/AuthModule/routes/PTeams/resource.js +251 -0
  46. package/_Build/vue/modules/AuthModule/routes/PUsers/SetPasswordAction.vue +51 -0
  47. package/_Build/vue/modules/AuthModule/routes/PUsers/SetPasswordDialog.vue +138 -0
  48. package/_Build/vue/modules/AuthModule/routes/PUsers/columns.js +349 -0
  49. package/_Build/vue/modules/AuthModule/routes/PUsers/resource.js +239 -0
  50. package/_Build/vue/modules/AuthModule/routes/account-exists.vue +2 -2
  51. package/_Build/vue/modules/AuthModule/routes/change-password.vue +28 -32
  52. package/_Build/vue/modules/AuthModule/routes/container.vue +2 -11
  53. package/_Build/vue/modules/AuthModule/routes/expired-reset.vue +4 -4
  54. package/_Build/vue/modules/AuthModule/routes/expired-verification.vue +10 -9
  55. package/_Build/vue/modules/AuthModule/routes/force-reset.vue +44 -58
  56. package/_Build/vue/modules/AuthModule/routes/forgot.vue +10 -5
  57. package/_Build/vue/modules/AuthModule/routes/login.vue +12 -19
  58. package/_Build/vue/modules/AuthModule/routes/logincallback.vue +1 -3
  59. package/_Build/vue/modules/AuthModule/routes/loginsso.vue +14 -10
  60. package/_Build/vue/modules/AuthModule/routes/logout.vue +14 -5
  61. package/_Build/vue/modules/AuthModule/routes/logoutheadless.vue +16 -5
  62. package/_Build/vue/modules/AuthModule/routes/register.vue +24 -28
  63. package/_Build/vue/modules/AuthModule/routes/reset.vue +20 -14
  64. package/_Build/vue/modules/AuthModule/routes/success-forgot.vue +14 -8
  65. package/_Build/vue/modules/AuthModule/routes/success-reset.vue +2 -2
  66. package/_Build/vue/modules/AuthModule/routes/success-verify.vue +1 -3
  67. package/_Build/vue/modules/AuthModule/routes/verify.vue +11 -14
  68. package/_Build/vue/modules/resource/Children/create.vue +99 -0
  69. package/_Build/vue/modules/resource/Children/edit.vue +124 -0
  70. package/_Build/vue/modules/resource/Children/index.vue +42 -0
  71. package/_Build/vue/modules/resource/Children/partials/form.vue +111 -0
  72. package/_Build/vue/modules/resource/Children/show.vue +170 -0
  73. package/_Build/vue/modules/resource/index.js +562 -0
  74. package/_Build/vue/modules/resource/parent.vue +63 -0
  75. package/_Build/vue/modules/resource/trashable.js +104 -0
  76. package/_base.scss +0 -1
  77. package/_defaults.scss +2 -2
  78. package/components/_auth.scss +19 -61
  79. package/components/_datepicker.scss +1 -0
  80. package/components/_descriptions.scss +2 -0
  81. package/components/_footer.scss +1 -0
  82. package/components/_form.scss +18 -0
  83. package/components/_header.scss +3 -27
  84. package/components/_layout.scss +56 -0
  85. package/components/_menu.scss +0 -5
  86. package/components/_sidebar.scss +12 -27
  87. package/components/_table.scss +3 -0
  88. package/components/_token-display.scss +41 -0
  89. package/components/_wysiwyg2.scss +10 -0
  90. package/general.scss +1 -0
  91. package/index.js +31 -1
  92. package/package.json +7 -4
  93. package/_Build/vue/components/layout/sideBar.vue +0 -25
  94. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/Upload/upload.vue +0 -259
  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/partials/form.vue +0 -181
  99. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/show.vue +0 -266
  100. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/parent.vue +0 -36
  101. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/create.vue +0 -112
  102. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/edit.vue +0 -103
  103. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/index.vue +0 -112
  104. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/partials/form.vue +0 -173
  105. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/show.vue +0 -123
  106. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/parent.vue +0 -36
  107. package/components/_input.scss +0 -0
  108. /package/_Build/vue/{modules/AuthModule/components → components/layout}/AuthModal.vue +0 -0
  109. /package/_Build/vue/{modules/AuthModule/components → components/layout}/Chip.vue +0 -0
  110. /package/_Build/vue/{modules/AuthModule/components/VPasswordValidation.vue → components/layout/PasswordValidation.vue} +0 -0
  111. /package/_Build/vue/{modules/AuthModule/components/VRoleLegend.vue → components/layout/RoleLegend.vue} +0 -0
@@ -0,0 +1,124 @@
1
+ <template>
2
+ <div class="container px-6 tablet:px-4 mobile:px-2 mb-8 ml-0 mr-0">
3
+ <div class="grid__1/1">
4
+ <div class="grid__1/1 mb-4">
5
+ <h2 class="h1">Edit {{ resource.singular }}</h2>
6
+ </div>
7
+ <div :class="resource.form.class">
8
+ <component
9
+ :is="resource.form.component ?? 'XForm'"
10
+ ref="form"
11
+ :form="form"
12
+ :submit="submit"
13
+ :method="method"
14
+ :resource="resource"
15
+ :model="model"
16
+ />
17
+ </div>
18
+ </div>
19
+ </div>
20
+ </template>
21
+
22
+ <script>
23
+ import Form from "form-backend-validation";
24
+
25
+ export default {
26
+ components: {
27
+ XForm: require("./partials/form.vue").default,
28
+ },
29
+
30
+ props: {
31
+ resource: {
32
+ type: Object,
33
+ required: true,
34
+ },
35
+ },
36
+
37
+ data() {
38
+ return {
39
+ form: null,
40
+ model: null,
41
+ method: "patch",
42
+ };
43
+ },
44
+
45
+ beforeMount() {
46
+ this.form = new Form(
47
+ { _method: "PATCH", ...this.resource.form.fields(this) },
48
+ {
49
+ resetOnSuccess: false,
50
+ },
51
+ );
52
+ },
53
+
54
+ async mounted() {
55
+ window.axios
56
+ .get(
57
+ `${this.resource.api.endpoint(this)}/${this.$route.params[this.resource.id]}`,
58
+ {
59
+ params: this.resource.api.params.show(this),
60
+ },
61
+ )
62
+ .then((res) => {
63
+ this.model = res.data.data;
64
+
65
+ // Set initial form data
66
+ Object.entries(this.resource.form.fields(this)).forEach(
67
+ ([key, value]) => {
68
+ this.form[key] = value;
69
+ },
70
+ );
71
+ });
72
+ },
73
+
74
+ methods: {
75
+ async submit() {
76
+ if (this.resource.form.submit) {
77
+ await this.resource.form.submit(this);
78
+ } else {
79
+ const hold = { ...this.form.data() };
80
+
81
+ try {
82
+ this.form.populate(this.resource.form.preparation(this));
83
+
84
+ let res = await this.form.post(
85
+ `${this.resource.api.endpoint(this)}/${this.model.id}`,
86
+ );
87
+
88
+ this.emitter?.emit("resource:saved", {
89
+ resource: this.resource,
90
+ model: res.data,
91
+ });
92
+
93
+ const redirect = this.resource.form.redirect
94
+ ? this.resource.form.redirect({
95
+ resource: this.resource,
96
+ model: res.data,
97
+ form: this.form,
98
+ $store: this.$store,
99
+ $router: this.$router,
100
+ method: this.method,
101
+ })
102
+ : {
103
+ name: `${this.resource.routeName}.show`,
104
+ params: {
105
+ [this.resource.id]: res.data.id,
106
+ },
107
+ };
108
+
109
+ this.$router.replace(redirect);
110
+ } catch (e) {
111
+ console.log(e);
112
+ } finally {
113
+ if (
114
+ !this.form.successful ||
115
+ !this.form.__options.resetOnSuccess
116
+ ) {
117
+ this.form.populate(hold);
118
+ }
119
+ }
120
+ }
121
+ },
122
+ },
123
+ };
124
+ </script>
@@ -0,0 +1,42 @@
1
+ <template>
2
+ <div class="container px-6 tablet:px-4 mobile:px-2 mb-8 ml-0 mr-0">
3
+ <div class="grid__1/1">
4
+ <div class="flex gap items-center justify-end">
5
+ <template
6
+ v-for="(render, index) in resource.index.actions"
7
+ :key="index"
8
+ >
9
+ <component :is="render(this)" />
10
+ </template>
11
+ </div>
12
+
13
+ <template
14
+ v-for="(render, index) in resource.index.layout"
15
+ :key="index"
16
+ >
17
+ <component :is="render(this)" />
18
+ </template>
19
+ </div>
20
+ </div>
21
+ </template>
22
+
23
+ <script>
24
+ export default {
25
+ provide() {
26
+ return {
27
+ additionalInfo: { resource: this.resource },
28
+ };
29
+ },
30
+
31
+ props: {
32
+ resource: {
33
+ type: Object,
34
+ required: true,
35
+ },
36
+ depth: {
37
+ type: Number,
38
+ required: true,
39
+ },
40
+ },
41
+ };
42
+ </script>
@@ -0,0 +1,111 @@
1
+ <!-- eslint-disable vue/no-mutating-props -->
2
+ <template>
3
+ <form @submit.prevent="submit" class="vel-resource-form">
4
+ <component
5
+ :is="segment.group ? 'fieldset' : 'div'"
6
+ v-for="(segment, sIndex) in segments"
7
+ :key="sIndex"
8
+ :class="{ 'vel-form-group': segment.group }"
9
+ >
10
+ <legend v-if="segment.group">
11
+ {{ segment.group.title || formatGroupKey(segment.groupKey) }}
12
+ </legend>
13
+ <div :class="segment.group?.class" :style="segment.group?.style">
14
+ <component
15
+ v-for="(item, iIndex) in segment.items"
16
+ :key="`${sIndex}-${iIndex}`"
17
+ :is="item.render ? item.render(_self) : 'VelBasic'"
18
+ v-model="form[item.key]"
19
+ :type="item.type || 'text'"
20
+ :error="form.errors"
21
+ :name="item.key"
22
+ :placeholder="
23
+ item.placeholder ||
24
+ item.label ||
25
+ item.key[0].toUpperCase() + item.key.slice(1)
26
+ "
27
+ :label="
28
+ item.label ||
29
+ item.key[0].toUpperCase() + item.key.slice(1)
30
+ "
31
+ v-bind="item"
32
+ />
33
+ </div>
34
+ </component>
35
+
36
+ <VelFormFooter :loading="form.processing" />
37
+ </form>
38
+ </template>
39
+
40
+ <script>
41
+ export default {
42
+ components: {
43
+ VelFormFooter: require("../../../../components/layout/FormFooter.vue")
44
+ .default,
45
+ VelBasic: require("../../../../components/form/basic.vue").default,
46
+ },
47
+
48
+ props: {
49
+ form: {
50
+ required: true,
51
+ type: Object,
52
+ },
53
+ submit: {
54
+ required: true,
55
+ type: Function,
56
+ },
57
+ method: {
58
+ type: String,
59
+ default: "post",
60
+ },
61
+ resource: {
62
+ required: true,
63
+ type: Object,
64
+ },
65
+ model: {
66
+ type: Object,
67
+ default: null,
68
+ },
69
+ },
70
+
71
+ computed: {
72
+ _self() {
73
+ return this;
74
+ },
75
+ segments() {
76
+ const items = this.resource.form.structure(this);
77
+ const groups = this.resource.form.groups || {};
78
+ const segments = [];
79
+ const groupSegments = {};
80
+
81
+ for (const item of items) {
82
+ if (item.groupKey && groups[item.groupKey]) {
83
+ if (groupSegments[item.groupKey]) {
84
+ groupSegments[item.groupKey].items.push(item);
85
+ } else {
86
+ const segment = {
87
+ groupKey: item.groupKey,
88
+ group: groups[item.groupKey],
89
+ items: [item],
90
+ };
91
+ groupSegments[item.groupKey] = segment;
92
+ segments.push(segment);
93
+ }
94
+ } else {
95
+ segments.push({ group: null, items: [item] });
96
+ }
97
+ }
98
+
99
+ return segments;
100
+ },
101
+ },
102
+
103
+ methods: {
104
+ formatGroupKey(key) {
105
+ return key
106
+ .replace(/[-_]/g, " ")
107
+ .replace(/\b\w/g, (c) => c.toUpperCase());
108
+ },
109
+ },
110
+ };
111
+ </script>
@@ -0,0 +1,170 @@
1
+ <template>
2
+ <!-- Render nested router view if this isn't the deepest route -->
3
+ <router-view v-if="!deepestRoute" v-slot="{ Component }">
4
+ <component :is="Component" :depth="depth + 1" />
5
+ </router-view>
6
+
7
+ <template v-else>
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="model">
11
+ <div class="bg-0 p-3 box-shadow-1 border-r-4 mb-6">
12
+ <VelPageHeader
13
+ :icon="resource.icon"
14
+ :title="
15
+ resource.modelTitle
16
+ ? resource.modelTitle(this)
17
+ : `${model.name ?? model.id} ${model.last_name ?? ''}`
18
+ "
19
+ >
20
+ <template
21
+ v-for="(rendered, index) in renderedActions"
22
+ :key="index"
23
+ >
24
+ <component :is="rendered" />
25
+ </template>
26
+ </VelPageHeader>
27
+
28
+ <hr class="my-3 hr-muted" />
29
+
30
+ <el-tabs v-model="active" type="card">
31
+ <template
32
+ v-for="(rendered, index) in renderedTabs"
33
+ :key="index"
34
+ >
35
+ <el-tab-pane :lazy="true" :name="index">
36
+ <template #label>
37
+ <span class="align-middle-dive">
38
+ <GIcon
39
+ v-if="rendered.icon"
40
+ class="icon icon--text mr"
41
+ :name="rendered.icon"
42
+ />
43
+ <span>{{
44
+ rendered.label ||
45
+ `Tab ${index + 1}`
46
+ }}</span>
47
+ </span>
48
+ </template>
49
+ <component
50
+ :is="rendered.component || rendered"
51
+ />
52
+ </el-tab-pane>
53
+ </template>
54
+ </el-tabs>
55
+ </div>
56
+ </template>
57
+ <div v-else class="absolute transform-center text-center">
58
+ <VelSpinner />
59
+ </div>
60
+ </div>
61
+ </div>
62
+ </template>
63
+ </template>
64
+
65
+ <script>
66
+ import { h, shallowRef } from "vue";
67
+ import axios from "axios";
68
+ import VelSpinner from "../../../components/form/Spinner.vue";
69
+ import VelButton from "../../../components/basic/Button.vue";
70
+ import VelAudit from "../../../components/layout/Audit.vue";
71
+ import { ElTabs, ElTabPane } from "element-plus";
72
+
73
+ export default {
74
+ components: {
75
+ VelPageHeader: require("../../../components/layout/PageHeader.vue")
76
+ .default,
77
+ VelSpinner,
78
+ VelButton,
79
+ ElTabs,
80
+ ElTabPane,
81
+ },
82
+
83
+ props: {
84
+ breadcrumbs: {
85
+ type: Array,
86
+ required: true,
87
+ },
88
+ resource: {
89
+ type: Object,
90
+ required: true,
91
+ },
92
+ depth: {
93
+ type: Number,
94
+ required: true,
95
+ },
96
+ },
97
+
98
+ setup() {
99
+ const model = shallowRef(null);
100
+ return { model };
101
+ },
102
+
103
+ data() {
104
+ return {
105
+ active: 0,
106
+ };
107
+ },
108
+
109
+ computed: {
110
+ // This boolean helps determine if we are the final depth of route being rendered
111
+ deepestRoute() {
112
+ return (
113
+ this.depth ===
114
+ this.$route.matched.filter((d) => d.components).length
115
+ );
116
+ },
117
+
118
+ // Compute rendered layout once
119
+ renderedTabs() {
120
+ const tabs = this.resource.show.tabs
121
+ .map((render) => render(this))
122
+ .filter((d) => d);
123
+
124
+ if (this.resource.auditable) {
125
+ const auditableType =
126
+ typeof this.resource.auditable === "string"
127
+ ? this.resource.auditable
128
+ : this.resource.singular.replace(/ /g, "_");
129
+
130
+ tabs.push({
131
+ label: "History",
132
+ icon: "icon-time",
133
+ component: h(VelAudit, {
134
+ auditableType,
135
+ auditableId: this.model.id,
136
+ }),
137
+ });
138
+ }
139
+
140
+ return tabs;
141
+ },
142
+
143
+ // Compute rendered actions once
144
+ renderedActions() {
145
+ return this.resource.show.actions
146
+ .map((render) => render(this))
147
+ .filter((d) => d);
148
+ },
149
+ },
150
+
151
+ mounted() {
152
+ if (!this.deepestRoute) {
153
+ return;
154
+ }
155
+
156
+ const showParams = this.resource.api.params.show(this);
157
+
158
+ axios
159
+ .get(
160
+ `${this.resource.api.endpoint(this)}/${this.$route.params[`${this.resource.id}`]}`,
161
+ {
162
+ params: showParams,
163
+ },
164
+ )
165
+ .then((res) => {
166
+ this.model = res.data.data;
167
+ });
168
+ },
169
+ };
170
+ </script>