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

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 (57) hide show
  1. package/README.md +148 -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/_Build/vue/modules/resource/Children/create.vue +76 -0
  29. package/_Build/vue/modules/resource/Children/edit.vue +109 -0
  30. package/_Build/vue/modules/resource/Children/index.vue +51 -0
  31. package/_Build/vue/modules/resource/Children/partials/form.vue +53 -0
  32. package/_Build/vue/modules/resource/Children/show.vue +145 -0
  33. package/_Build/vue/modules/resource/index.js +112 -0
  34. package/_Build/vue/modules/resource/parent.vue +41 -0
  35. package/components/_descriptions.scss +2 -0
  36. package/components/_footer.scss +1 -0
  37. package/components/_header.scss +3 -27
  38. package/components/_layout.scss +56 -0
  39. package/components/_sidebar.scss +12 -27
  40. package/index.js +7 -1
  41. package/package.json +3 -2
  42. package/_Build/vue/components/layout/sideBar.vue +0 -25
  43. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/Upload/upload.vue +0 -259
  44. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/create.vue +0 -62
  45. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/edit.vue +0 -98
  46. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/index.vue +0 -90
  47. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/Children/show.vue +0 -267
  48. package/_Build/vue/modules/AuthModule/adminRoutes/PCompanies/parent.vue +0 -36
  49. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/create.vue +0 -113
  50. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/edit.vue +0 -101
  51. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/index.vue +0 -112
  52. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/Children/show.vue +0 -123
  53. package/_Build/vue/modules/AuthModule/adminRoutes/PUsers/parent.vue +0 -36
  54. /package/_Build/vue/{modules/AuthModule/components → components/layout}/AuthModal.vue +0 -0
  55. /package/_Build/vue/{modules/AuthModule/components → components/layout}/Chip.vue +0 -0
  56. /package/_Build/vue/{modules/AuthModule/components/VPasswordValidation.vue → components/layout/PasswordValidation.vue} +0 -0
  57. /package/_Build/vue/{modules/AuthModule/components/VRoleLegend.vue → components/layout/RoleLegend.vue} +0 -0
@@ -0,0 +1,145 @@
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="model">
11
+ <div class="bg-0 p-3 box-shadow-1 border-r-4 mb-6">
12
+ <VelPageHeader
13
+ :icon="resource.icon"
14
+ :title="`${model.name} ${model.last_name ?? ''}`"
15
+ >
16
+ <template
17
+ v-for="(row, index) in resource.show.actions"
18
+ :key="index"
19
+ >
20
+ <template v-if="row.render">
21
+ <component :is="row.render(this)" />
22
+ </template>
23
+ </template>
24
+ <VelButton
25
+ v-if="resource.permissions.edit"
26
+ tag="a"
27
+ type="primary"
28
+ @click="
29
+ $router.push({
30
+ name: `${resource.name}.edit`,
31
+ param: model.id,
32
+ })
33
+ "
34
+ >
35
+ <GIcon
36
+ class="fill-0 mr-0.5 icon--0.5"
37
+ name="icon-edit"
38
+ embed
39
+ artboard
40
+ />
41
+ Edit {{ resource.singular }}
42
+ </VelButton>
43
+ </VelPageHeader>
44
+
45
+ <hr class="my-3 hr-muted" />
46
+
47
+ <template
48
+ v-for="(row, index) in resource.show.structure"
49
+ :key="index"
50
+ >
51
+ <template v-if="row.render">
52
+ <component :is="row.render(this)" />
53
+ </template>
54
+ <el-descriptions v-else border column="1">
55
+ <el-descriptions-item
56
+ v-for="(item, i) in row"
57
+ :key="i"
58
+ :label-width="'20%'"
59
+ >
60
+ <template #label>
61
+ {{
62
+ item.label ||
63
+ item.key[0].toUpperCase() +
64
+ item.key.slice(1)
65
+ }}
66
+ </template>
67
+
68
+ <template v-if="item.render">
69
+ <component :is="item.render(this)" />
70
+ </template>
71
+ <template v-else>
72
+ {{ model[item.key] }}
73
+ </template>
74
+ </el-descriptions-item>
75
+ </el-descriptions>
76
+
77
+ <hr
78
+ v-if="index < resource.show.structure.length - 1"
79
+ class="my-3 hr-muted"
80
+ />
81
+ </template>
82
+ </div>
83
+ </template>
84
+
85
+ <div v-else class="absolute transform-center text-center">
86
+ <VelSpinner />
87
+ </div>
88
+ </div>
89
+ </div>
90
+ </template>
91
+
92
+ <script>
93
+ import axios from "axios";
94
+ import VelSpinner from "../../../components/form/Spinner.vue";
95
+ import VelButton from "../../../components/basic/Button.vue";
96
+ import { ElDescriptions, ElDescriptionsItem } from "element-plus";
97
+
98
+ export default {
99
+ components: {
100
+ VBreadcrumbs: require("../../../components/layout/Breadcrumbs.vue")
101
+ .default,
102
+ VelPageHeader: require("../../../components/layout/PageHeader.vue")
103
+ .default,
104
+ VelSpinner,
105
+ VelButton,
106
+ ElDescriptions,
107
+ ElDescriptionsItem,
108
+ },
109
+
110
+ props: {
111
+ breadcrumbs: {
112
+ type: Array,
113
+ required: true,
114
+ },
115
+ resource: {
116
+ type: Object,
117
+ required: true,
118
+ },
119
+ },
120
+
121
+ data() {
122
+ return {
123
+ model: null,
124
+ addBreadcrumbs: [...this.$props.breadcrumbs],
125
+ };
126
+ },
127
+
128
+ mounted() {
129
+ axios
130
+ .get(
131
+ `${this.resource.api}/${this.$route.params.id}?${this.resource.defaults}`,
132
+ )
133
+ .then((res) => {
134
+ this.model = res.data.data;
135
+ this.addBreadcrumbs.push({
136
+ href: {
137
+ name: `${this.resource.name}.show`,
138
+ param: this.model.id,
139
+ },
140
+ text: this.model.name,
141
+ });
142
+ });
143
+ },
144
+ };
145
+ </script>
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+
3
+ import { merge } from "lodash";
4
+
5
+ import { h } from "vue";
6
+
7
+ import VTableSorter from "../../components/layout/TableSorter.vue";
8
+
9
+ export function meta(name, properties = {}) {
10
+ const singular = properties.singular || name.slice(0, -1);
11
+
12
+ return merge(
13
+ {
14
+ name,
15
+ title: properties.title || name[0].toUpperCase() + name.slice(1),
16
+ singular,
17
+ label: singular,
18
+ multiLabel: name,
19
+ pageLink: name,
20
+ api: `/api/${name}`,
21
+ permissions: {
22
+ create: true,
23
+ edit: true,
24
+ },
25
+ searchable: {
26
+ value: "name",
27
+ label: `Search ${name}`,
28
+ },
29
+ form: {
30
+ component: null,
31
+ fields: () => ({}),
32
+ },
33
+ table: {
34
+ structure: [],
35
+ },
36
+ index: {
37
+ actions: [],
38
+ structure: [
39
+ {
40
+ render: ({ resource }) =>
41
+ h(VTableSorter, {
42
+ key: "PIndex",
43
+ "json-data": {
44
+ ...resource,
45
+ tableStructure: resource.table.structure,
46
+ },
47
+ defaults: resource.defaults,
48
+ "fixed-height": false,
49
+ "display-edit-action":
50
+ resource.permissions.create,
51
+ }),
52
+ },
53
+ ],
54
+ },
55
+ show: {
56
+ actions: [],
57
+ structure: [],
58
+ },
59
+ defaults: "",
60
+ icon: `icon-${singular}`,
61
+ },
62
+ properties,
63
+ );
64
+ }
65
+
66
+ // Export resource
67
+ export function routes(node, name, properties = {}) {
68
+ return [
69
+ {
70
+ path: `/${name}`,
71
+ component: node ? "" : require("../resource/parent.vue").default,
72
+ meta: {
73
+ resource: meta(name, properties),
74
+ },
75
+ children: [
76
+ {
77
+ path: "",
78
+ component: node
79
+ ? ""
80
+ : require("../resource/Children/index.vue").default,
81
+ name: `${name}.index`,
82
+ },
83
+ {
84
+ path: "create",
85
+ component: node
86
+ ? ""
87
+ : require("../resource/Children/create.vue").default,
88
+ name: `${name}.create`,
89
+ },
90
+ {
91
+ path: ":id",
92
+ component: node
93
+ ? ""
94
+ : require("../resource/Children/show.vue").default,
95
+ name: `${name}.show`,
96
+ },
97
+ {
98
+ path: ":id/edit",
99
+ component: node
100
+ ? ""
101
+ : require("../resource/Children/edit.vue").default,
102
+ name: `${name}.edit`,
103
+ },
104
+ ],
105
+ },
106
+ ];
107
+ }
108
+
109
+ export default {
110
+ routes,
111
+ meta,
112
+ };
@@ -0,0 +1,41 @@
1
+ <template>
2
+ <PageTitle :title="resource.title" />
3
+
4
+ <router-view
5
+ :key="$route.path"
6
+ :breadcrumbs="breadcrumbs"
7
+ :resource="resource"
8
+ />
9
+ </template>
10
+
11
+ <script>
12
+ import PageTitle from "../../components/layout/pageTitle.vue";
13
+
14
+ export default {
15
+ components: {
16
+ PageTitle,
17
+ },
18
+
19
+ computed: {
20
+ resource() {
21
+ return this.$route.meta.resource;
22
+ },
23
+ breadcrumbs() {
24
+ return [
25
+ {
26
+ href: {
27
+ name: "index",
28
+ },
29
+ text: "Home",
30
+ },
31
+ {
32
+ href: {
33
+ name: `${this.resource.name}.index`,
34
+ },
35
+ text: this.resource.title,
36
+ },
37
+ ];
38
+ },
39
+ },
40
+ };
41
+ </script>
@@ -0,0 +1,2 @@
1
+ @import "element-plus/theme-chalk/el-descriptions";
2
+ @import "element-plus/theme-chalk/el-descriptions-item";
@@ -3,6 +3,7 @@
3
3
  padding: $spacing * 3 $spacing * 3 $spacing * 2 $spacing * 3;
4
4
  box-sizing: border-box;
5
5
  width: 100%;
6
+ margin-top: 6 * $spacing;
6
7
 
7
8
  svg {
8
9
  // width: 3 * $spacing;
@@ -1,45 +1,21 @@
1
1
  .vel-header {
2
2
  border-bottom: solid get-ratio(1px) $color4;
3
3
  background-color: $color0;
4
- width: 100%;
5
- box-sizing: border-box;
6
4
  display: flex;
7
- flex-wrap: wrap;
8
5
  align-items: center;
9
- align-content: center;
10
- flex-basis: 100%;
11
6
  justify-content: space-between;
12
7
  padding: 1.5 * $spacing 3 * $spacing;
13
-
14
- > * {
15
- max-width: 50%;
16
- flex-basis: 50%;
17
- justify-content: flex-end !important;
18
- }
19
-
20
- .icon {
21
- min-width: $spacing * 2.5;
22
- max-width: $spacing * 2.5;
23
- width: $spacing * 2.5;
24
- height: $spacing * 2.5;
25
- margin-right: 0.5 * $spacing;
26
- }
27
8
  }
28
9
 
29
10
  .vel-header__list {
30
11
  display: flex;
31
- flex-wrap: wrap;
32
- align-items: stretch;
33
- align-content: stretch;
34
- flex-basis: 100%;
35
- padding-right: 1.5 * $spacing;
36
- margin-left: -1.5 * $spacing;
37
- margin-right: -1.5 * $spacing;
38
12
 
39
13
  > div {
40
14
  align-items: center;
15
+
41
16
  &:not(:last-child) {
42
17
  position: relative;
18
+
43
19
  &::after {
44
20
  position: absolute;
45
21
  content: "";
@@ -47,7 +23,7 @@
47
23
  height: 75%;
48
24
  transform: translateY(-50%);
49
25
  top: 50%;
50
- right: 0px;
26
+ right: 0;
51
27
  }
52
28
  }
53
29
  }
@@ -0,0 +1,56 @@
1
+ html,
2
+ body {
3
+ height: 100%;
4
+ margin: 0;
5
+ }
6
+
7
+ .vel-app {
8
+ display: flex;
9
+ flex-direction: column;
10
+ height: 100dvh;
11
+ }
12
+
13
+ .vel-header {
14
+ flex: 0 0 auto;
15
+ }
16
+
17
+ .vel-content {
18
+ flex: 1 1 auto;
19
+ min-height: 0; /* allow shrinking */
20
+ display: flex;
21
+ overflow: auto; /* main scroll container */
22
+ }
23
+
24
+ .vel-sidebar {
25
+ min-height: 0;
26
+ }
27
+
28
+ .vel-sidebar__inner {
29
+ position: sticky;
30
+ top: 0;
31
+ display: flex;
32
+ flex-direction: column;
33
+ max-height: 100%;
34
+ }
35
+
36
+ .vel-sidebar__top {
37
+ flex: 1 1 auto;
38
+ min-height: 0;
39
+ overflow: auto; /* optional scroll */
40
+ }
41
+
42
+ .vel-sidebar__bottom {
43
+ flex: 0 0 auto;
44
+ }
45
+
46
+ .vel-main {
47
+ flex: 1 1 auto;
48
+ min-height: 0;
49
+ overflow: auto;
50
+ display: flex;
51
+ flex-direction: column;
52
+ }
53
+
54
+ .vel-main__inner {
55
+ flex-grow: 1;
56
+ }
@@ -1,56 +1,41 @@
1
- .vel-side-bar {
2
- flex-basis: $spacing * 7.5;
1
+ .vel-sidebar {
2
+ width: $spacing * 7.5;
3
+ padding-top: $spacing * 2;
3
4
  display: flex;
4
5
  flex-direction: column;
5
- box-shadow: 0px $spacing * 0.5 $spacing * 0.5 0px hsla(0, 0%, 0%, 0.251);
6
- min-height: 10vh;
7
- max-height: 100vh;
8
- overflow: hidden;
9
- transition: flex-basis 0.3s ease-in-out;
6
+ box-shadow: 0 $spacing * 0.5 $spacing * 0.5 0 hsla(0, 0, 0, 0.251);
7
+ transition: width 0.3s ease-in-out;
10
8
  background-color: $color0;
11
9
 
12
- position: sticky;
13
- top: 0vh;
14
- padding-top: 2 * $spacing;
15
- min-width: get-ratio(64px);
16
- flex-basis: get-ratio(64px);
17
-
18
10
  > div {
19
11
  &:first-child {
20
- flex-grow: 0.8;
21
- }
22
- &:last-child {
23
- margin-bottom: 5.5vh;
12
+ flex: 1;
24
13
  }
25
14
  }
26
15
 
27
16
  &.active {
28
- flex-basis: 31.5 * $spacing;
29
- min-width: 31.5 * $spacing;
17
+ width: 31.5 * $spacing;
30
18
 
31
- .vel-side-bar__button {
19
+ .vel-sidebar__button {
32
20
  transform: rotateY(180deg);
33
21
  }
34
22
  }
35
23
  }
36
24
 
37
- .vel-side-bar__button {
25
+ .vel-sidebar__button {
38
26
  outline: none;
39
27
  background-color: transparent;
40
28
  border: none;
41
29
  cursor: pointer;
30
+
42
31
  &:focus {
43
32
  outline: 1px solid;
44
33
  }
45
34
  }
46
35
 
47
- .vel-side-bar__bottom {
36
+ .vel-sidebar__bottom {
48
37
  display: flex;
49
38
  justify-content: flex-end;
50
39
  border-top: solid 1px #e6e6e6;
51
- padding: $spacing $spacing * 1.5;
52
- }
53
-
54
- main {
55
- overflow: hidden;
40
+ padding: $spacing * 2;
56
41
  }
package/index.js CHANGED
@@ -8,6 +8,8 @@ export const Auth = {
8
8
  Store,
9
9
  };
10
10
 
11
+ export { default as Resource } from "./_Build/vue/modules/resource/index.js";
12
+
11
13
  export { default as Button } from "./_Build/vue/components/basic/Button.vue";
12
14
  export { default as Link } from "./_Build/vue/components/basic/link.vue";
13
15
 
@@ -24,9 +26,13 @@ export { default as Wysiwyg2 } from "./_Build/vue/components/form/Wysiwyg2.vue";
24
26
  export { default as Upload } from "./_Build/vue/components/form/Upload.vue";
25
27
  export { default as InputNumber } from "./_Build/vue/components/form/InputNumber.vue";
26
28
 
27
- export { default as SideBar } from "./_Build/vue/components/layout/sideBar.vue";
29
+ export { default as Chip } from "./_Build/vue/components/layout/Chip.vue";
30
+ export { default as Chips } from "./_Build/vue/components/layout/Chips.vue";
31
+ export { default as SideBar } from "./_Build/vue/components/layout/SideBar.vue";
28
32
  export { default as Footer } from "./_Build/vue/components/layout/Footer.vue";
29
33
  export { default as Header } from "./_Build/vue/components/layout/Header.vue";
34
+ export { default as Layout } from "./_Build/vue/components/layout/Layout.vue";
35
+ export { default as Navigation } from "./_Build/vue/components/layout/Navigation.vue";
30
36
  export { default as PageTitle } from "./_Build/vue/components/layout/pageTitle.vue";
31
37
  export { default as Alert } from "./_Build/vue/components/layout/Alert.vue";
32
38
  export { default as Tooltip } from "./_Build/vue/components/layout/Tooltip.vue";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fishawack/lab-velocity",
3
- "version": "2.0.0-beta.11",
3
+ "version": "2.0.0-beta.13",
4
4
  "description": "Avalere Health branded style system",
5
5
  "scripts": {
6
6
  "setup": "npm ci || npm i && npm run content",
@@ -64,7 +64,8 @@
64
64
  "*.scss",
65
65
  "components",
66
66
  "_Build/vue/components",
67
- "_Build/vue/modules/AuthModule"
67
+ "_Build/vue/modules/AuthModule",
68
+ "_Build/vue/modules/resource"
68
69
  ],
69
70
  "main": "index.js",
70
71
  "release": {
@@ -1,25 +0,0 @@
1
- <template>
2
- <div class="vel-side-bar" :class="{ active: active }">
3
- <div>
4
- <slot name="navigation" />
5
- </div>
6
-
7
- <div class="vel-side-bar__bottom">
8
- <button class="vel-side-bar__button" @click="active = !active">
9
- <slot name="expand"> > </slot>
10
- </button>
11
- </div>
12
- </div>
13
- </template>
14
-
15
- <script>
16
- export default {
17
- name: "SideBar",
18
-
19
- data() {
20
- return {
21
- active: true,
22
- };
23
- },
24
- };
25
- </script>