@opengis/cms 0.0.2 → 0.0.3

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 (144) hide show
  1. package/.gitlab-ci.yml +36 -0
  2. package/config.example +21 -0
  3. package/docs/.vitepress/abbr.mjs +26 -0
  4. package/docs/.vitepress/config.mjs +119 -0
  5. package/docs/.vitepress/navigation.mjs +82 -0
  6. package/docs/.vitepress/theme/Layout.vue +17 -0
  7. package/docs/.vitepress/theme/components/NavigationLinks.vue +102 -0
  8. package/docs/.vitepress/theme/components/Panzoom.vue +169 -0
  9. package/docs/.vitepress/theme/index.mjs +15 -0
  10. package/docs/.vitepress/theme/style.scss +136 -0
  11. package/docs/abbr.json +4 -0
  12. package/docs/api/builder/cms.builder.delete.md +65 -0
  13. package/docs/api/builder/cms.builder.get.md +70 -0
  14. package/docs/api/builder/cms.builder.list.md +98 -0
  15. package/docs/api/builder/cms.builder.post.md +72 -0
  16. package/docs/api/builder/cms.builder.put.md +88 -0
  17. package/docs/api/category/cms.category.delete.md +60 -0
  18. package/docs/api/category/cms.category.get.md +61 -0
  19. package/docs/api/category/cms.category.list.md +77 -0
  20. package/docs/api/category/cms.category.post.md +62 -0
  21. package/docs/api/category/cms.category.put.md +78 -0
  22. package/docs/api/index.md +50 -0
  23. package/docs/api/manager/cms.manager.delete.md +64 -0
  24. package/docs/api/manager/cms.manager.get.md +72 -0
  25. package/docs/api/manager/cms.manager.list.md +96 -0
  26. package/docs/api/manager/cms.manager.post.md +70 -0
  27. package/docs/api/manager/cms.manager.put.md +86 -0
  28. package/docs/api/media/del.md +64 -0
  29. package/docs/api/media/edit.md +92 -0
  30. package/docs/api/media/list.md +70 -0
  31. package/docs/api/media/metadata.md +57 -0
  32. package/docs/api/media/preview.md +33 -0
  33. package/docs/api/media/upload.md +84 -0
  34. package/docs/db/erd.md +173 -0
  35. package/docs/db/index.md +7 -0
  36. package/docs/index.md +39 -0
  37. package/docs/public/logo-dark.svg +24 -0
  38. package/docs/public/logo-light.svg +24 -0
  39. package/docs/public/logo-short.svg +15 -0
  40. package/docs/public/logo.svg +19 -0
  41. package/docs/readme/index.md +6 -0
  42. package/docs/src/vs-button.vue +157 -0
  43. package/docs/vue/basic/button.md +144 -0
  44. package/docs/vue/index.md +9 -0
  45. package/index.html +14 -0
  46. package/package.json +2 -5
  47. package/server/app.js +25 -0
  48. package/server/config.js +5 -0
  49. package/server/index.js +23 -0
  50. package/server/migrations/media.sql +30 -0
  51. package/server/plugins/hook.js +91 -0
  52. package/server/plugins/vite.js +80 -0
  53. package/server/routes/builder/controllers/cms.builder.delete.js +21 -0
  54. package/server/routes/builder/controllers/cms.builder.get.js +17 -0
  55. package/server/routes/builder/controllers/cms.builder.list.js +16 -0
  56. package/server/routes/builder/controllers/cms.builder.post.js +21 -0
  57. package/server/routes/builder/controllers/cms.builder.put.js +23 -0
  58. package/server/routes/builder/index.mjs +22 -0
  59. package/server/routes/category/controllers/cms.category.delete.js +21 -0
  60. package/server/routes/category/controllers/cms.category.get.js +17 -0
  61. package/server/routes/category/controllers/cms.category.list.js +16 -0
  62. package/server/routes/category/controllers/cms.category.post.js +21 -0
  63. package/server/routes/category/controllers/cms.category.put.js +23 -0
  64. package/server/routes/category/index.mjs +22 -0
  65. package/server/routes/manager/controllers/cms.manager.delete.js +22 -0
  66. package/server/routes/manager/controllers/cms.manager.get.js +21 -0
  67. package/server/routes/manager/controllers/cms.manager.list.js +31 -0
  68. package/server/routes/manager/controllers/cms.manager.post.js +28 -0
  69. package/server/routes/manager/controllers/cms.manager.put.js +23 -0
  70. package/server/routes/manager/index.mjs +22 -0
  71. package/server/routes/media/controllers/delete.js +59 -0
  72. package/server/routes/media/controllers/edit.js +94 -0
  73. package/server/routes/media/controllers/list.js +74 -0
  74. package/server/routes/media/controllers/metadata.js +51 -0
  75. package/server/routes/media/controllers/preview.js +47 -0
  76. package/server/routes/media/controllers/upload.js +79 -0
  77. package/server/routes/media/index.mjs +16 -0
  78. package/server/routes/root.mjs +15 -0
  79. package/server/templates/cls/cms.category_type.json +10 -0
  80. package/server/templates/cls/cms.content_review_status.json +10 -0
  81. package/server/templates/cls/cms.content_status.json +10 -0
  82. package/server/templates/cls/cms.content_type.json +10 -0
  83. package/server/templates/cls/cms.lang.json +10 -0
  84. package/server/templates/page/login.html +59 -0
  85. package/server/templates/select/cms.category_id.sql +1 -0
  86. package/server/templates/select/cms.type_id.sql +1 -0
  87. package/src/App.vue +4 -0
  88. package/src/assets/tailwind/tailwind.js +62 -0
  89. package/src/assets/vue.svg +1 -0
  90. package/src/components/builder/vs-builder-content.vue +163 -0
  91. package/src/components/builder/vs-builder-menu.vue +142 -0
  92. package/src/components/formats/index.js +8 -0
  93. package/src/components/formats/vs-manager-table-date.vue +29 -0
  94. package/src/components/formats/vs-manager-table-switch.vue +16 -0
  95. package/src/components/icons/icon-actions.vue +24 -0
  96. package/src/components/icons/icon-arrow-left.vue +19 -0
  97. package/src/components/icons/icon-check.vue +23 -0
  98. package/src/components/icons/icon-chewron-right.vue +16 -0
  99. package/src/components/icons/icon-close.vue +22 -0
  100. package/src/components/icons/icon-edit.vue +22 -0
  101. package/src/components/icons/icon-folder.vue +18 -0
  102. package/src/components/icons/icon-folder2.vue +17 -0
  103. package/src/components/icons/icon-home.vue +16 -0
  104. package/src/components/icons/icon-image.vue +18 -0
  105. package/src/components/icons/icon-logo.vue +22 -0
  106. package/src/components/icons/icon-media.vue +22 -0
  107. package/src/components/icons/icon-point.vue +11 -0
  108. package/src/components/icons/icon-search.vue +22 -0
  109. package/src/components/icons/icon-table.vue +22 -0
  110. package/src/components/icons/icon-users.vue +18 -0
  111. package/src/components/icons/icon.plus.vue +18 -0
  112. package/src/components/manager/children/vs-manager-collection-content.vue +55 -0
  113. package/src/components/manager/children/vs-manager-collection-item-content.vue +116 -0
  114. package/src/components/manager/children/vs-manager-single-content.vue +112 -0
  115. package/src/components/manager/manager-table/vs-manager-colection-table-add.vue +84 -0
  116. package/src/components/manager/manager-table/vs-manager-collection-table.vue +59 -0
  117. package/src/components/manager/vs-manager-menu.vue +73 -0
  118. package/src/components/media/Breadcrumb.vue +73 -0
  119. package/src/components/shared-components/vs-not-data.vue +213 -0
  120. package/src/components/vs-main-menu.vue +53 -0
  121. package/src/helpers/debounce.js +10 -0
  122. package/src/helpers/translite.js +19 -0
  123. package/src/main.js +30 -0
  124. package/src/misc/import-file.js +32 -0
  125. package/src/pages/vs-builder.vue +22 -0
  126. package/src/pages/vs-layout.vue +17 -0
  127. package/src/pages/vs-manager.vue +30 -0
  128. package/src/pages/vs-media.vue +398 -0
  129. package/src/router/router.js +9 -0
  130. package/src/router/routes.config.js +40 -0
  131. package/src/style.css +0 -0
  132. package/src/templates/form-columns.js +70 -0
  133. package/src/templates/form-template.js +22 -0
  134. package/test/config.js +17 -0
  135. package/test/files/eye.svg +4 -0
  136. package/test/helper.js +30 -0
  137. package/test/routes/builder.test.js +99 -0
  138. package/test/routes/category.test.js +97 -0
  139. package/test/routes/manager.test.js +103 -0
  140. package/test/routes/media.test.js +252 -0
  141. package/vite.config.js +37 -0
  142. package/editor/dist/cms.js +0 -5900
  143. package/editor/dist/cms.umd.cjs +0 -19
  144. /package/{editor/dist → public}/vite.svg +0 -0
@@ -0,0 +1,213 @@
1
+ <template>
2
+ <div class="w-full">
3
+ <div
4
+ class="p-5 min-h-[500px] flex flex-col justify-center items-center text-center"
5
+ >
6
+ <svg
7
+ class="w-48 mx-auto"
8
+ viewBox="0 0 178 90"
9
+ fill="none"
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ >
12
+ <rect
13
+ x="27"
14
+ y="50.5"
15
+ width="124"
16
+ height="39"
17
+ rx="7.5"
18
+ fill="currentColor"
19
+ class="fill-white dark:fill-neutral-800"
20
+ ></rect>
21
+ <rect
22
+ x="27"
23
+ y="50.5"
24
+ width="124"
25
+ height="39"
26
+ rx="7.5"
27
+ stroke="currentColor"
28
+ class="stroke-gray-50 dark:stroke-neutral-700/10"
29
+ ></rect>
30
+ <rect
31
+ x="34.5"
32
+ y="58"
33
+ width="24"
34
+ height="24"
35
+ rx="4"
36
+ fill="currentColor"
37
+ class="fill-gray-50 dark:fill-neutral-700/30"
38
+ ></rect>
39
+ <rect
40
+ x="66.5"
41
+ y="61"
42
+ width="60"
43
+ height="6"
44
+ rx="3"
45
+ fill="currentColor"
46
+ class="fill-gray-50 dark:fill-neutral-700/30"
47
+ ></rect>
48
+ <rect
49
+ x="66.5"
50
+ y="73"
51
+ width="77"
52
+ height="6"
53
+ rx="3"
54
+ fill="currentColor"
55
+ class="fill-gray-50 dark:fill-neutral-700/30"
56
+ ></rect>
57
+ <rect
58
+ x="19.5"
59
+ y="28.5"
60
+ width="139"
61
+ height="39"
62
+ rx="7.5"
63
+ fill="currentColor"
64
+ class="fill-white dark:fill-neutral-800"
65
+ ></rect>
66
+ <rect
67
+ x="19.5"
68
+ y="28.5"
69
+ width="139"
70
+ height="39"
71
+ rx="7.5"
72
+ stroke="currentColor"
73
+ class="stroke-gray-100 dark:stroke-neutral-700/30"
74
+ ></rect>
75
+ <rect
76
+ x="27"
77
+ y="36"
78
+ width="24"
79
+ height="24"
80
+ rx="4"
81
+ fill="currentColor"
82
+ class="fill-gray-100 dark:fill-neutral-700/70"
83
+ ></rect>
84
+ <rect
85
+ x="59"
86
+ y="39"
87
+ width="60"
88
+ height="6"
89
+ rx="3"
90
+ fill="currentColor"
91
+ class="fill-gray-100 dark:fill-neutral-700/70"
92
+ ></rect>
93
+ <rect
94
+ x="59"
95
+ y="51"
96
+ width="92"
97
+ height="6"
98
+ rx="3"
99
+ fill="currentColor"
100
+ class="fill-gray-100 dark:fill-neutral-700/70"
101
+ ></rect>
102
+ <g filter="url(#filter1)">
103
+ <rect
104
+ x="12"
105
+ y="6"
106
+ width="154"
107
+ height="40"
108
+ rx="8"
109
+ fill="currentColor"
110
+ class="fill-white dark:fill-neutral-800"
111
+ shape-rendering="crispEdges"
112
+ ></rect>
113
+ <rect
114
+ x="12.5"
115
+ y="6.5"
116
+ width="153"
117
+ height="39"
118
+ rx="7.5"
119
+ stroke="currentColor"
120
+ class="stroke-gray-100 dark:stroke-neutral-700/60"
121
+ shape-rendering="crispEdges"
122
+ ></rect>
123
+ <rect
124
+ x="20"
125
+ y="14"
126
+ width="24"
127
+ height="24"
128
+ rx="4"
129
+ fill="currentColor"
130
+ class="fill-gray-200 dark:fill-neutral-700"
131
+ ></rect>
132
+ <rect
133
+ x="52"
134
+ y="17"
135
+ width="60"
136
+ height="6"
137
+ rx="3"
138
+ fill="currentColor"
139
+ class="fill-gray-200 dark:fill-neutral-700"
140
+ ></rect>
141
+ <rect
142
+ x="52"
143
+ y="29"
144
+ width="106"
145
+ height="6"
146
+ rx="3"
147
+ fill="currentColor"
148
+ class="fill-gray-200 dark:fill-neutral-700"
149
+ ></rect>
150
+ </g>
151
+ <defs>
152
+ <filter
153
+ id="filter1"
154
+ x="0"
155
+ y="0"
156
+ width="178"
157
+ height="64"
158
+ filterUnits="userSpaceOnUse"
159
+ color-interpolation-filters="sRGB"
160
+ >
161
+ <feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood>
162
+ <feColorMatrix
163
+ in="SourceAlpha"
164
+ type="matrix"
165
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
166
+ result="hardAlpha"
167
+ ></feColorMatrix>
168
+ <feOffset dy="6"></feOffset>
169
+ <feGaussianBlur stdDeviation="6"></feGaussianBlur>
170
+ <feComposite in2="hardAlpha" operator="out"></feComposite>
171
+ <feColorMatrix
172
+ type="matrix"
173
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.03 0"
174
+ ></feColorMatrix>
175
+ <feBlend
176
+ mode="normal"
177
+ in2="BackgroundImageFix"
178
+ result="effect1_dropShadow_1187_14810"
179
+ ></feBlend>
180
+ <feBlend
181
+ mode="normal"
182
+ in="SourceGraphic"
183
+ in2="effect1_dropShadow_1187_14810"
184
+ result="shape"
185
+ ></feBlend>
186
+ </filter>
187
+ </defs>
188
+ </svg>
189
+ <div class="max-w-sm mx-auto mt-6">
190
+ <p class="font-medium text-gray-800 dark:text-neutral-200">
191
+ {{ title }}
192
+ </p>
193
+ <p class="mt-2 text-sm text-gray-500 dark:text-neutral-500">
194
+ {{ text }}
195
+ </p>
196
+ </div>
197
+ </div>
198
+ </div>
199
+ </template>
200
+
201
+ <script>
202
+ export default {
203
+ props: {
204
+ title: { type: String, default: () => "Дані для відображення відсутні" },
205
+ text: {
206
+ type: String,
207
+ default: () => "Змініть параметри пошуку або спробуйте пізніше",
208
+ },
209
+ },
210
+ };
211
+ </script>
212
+
213
+ <style lang="scss" scoped></style>
@@ -0,0 +1,53 @@
1
+ <template>
2
+ <nav class="w-[60px] border-r">
3
+ <div class="h-[60px] w-[60px] flex items-center justify-center">
4
+ <IconLogo />
5
+ </div>
6
+ <ul class="flex flex-col gap-2 items-center">
7
+ <li v-for="item in navList" :key="item?.name">
8
+ <VsPopover trigger="hover" placement="right">
9
+ <template #reference>
10
+ <router-link
11
+ :to="item?.path"
12
+ :class="[$route?.name?.includes(item?.name) ? 'bg-gray-200' : '']"
13
+ class="h-[40px] w-[40px] rounded-xl hover:bg-gray-200 text-gray-500 flex items-center justify-center duration-300"
14
+ >
15
+ <component :is="item?.icon" heigth="20" width="20" />
16
+ </router-link>
17
+ </template>
18
+ {{ item?.ua }}
19
+ </VsPopover>
20
+ </li>
21
+ </ul>
22
+ </nav>
23
+ </template>
24
+
25
+ <script setup>
26
+ import IconLogo from "./icons/icon-logo.vue";
27
+ import IconEdit from "./icons/icon-edit.vue";
28
+ import IconMedia from "./icons/icon-media.vue";
29
+ import IconTable from "./icons/icon-table.vue";
30
+
31
+ const navList = [
32
+ {
33
+ ua: "Менеджер контенту",
34
+ icon: IconEdit,
35
+ path: "/cms/manager",
36
+ name: "manager",
37
+ },
38
+ {
39
+ ua: "Генератор контенту",
40
+ icon: IconTable,
41
+ path: "/cms/builder",
42
+ name: "builder",
43
+ },
44
+ {
45
+ ua: "Медіатека",
46
+ icon: IconMedia,
47
+ path: "/cms/media",
48
+ name: "media",
49
+ },
50
+ ];
51
+ </script>
52
+
53
+ <style lang="scss" scoped></style>
@@ -0,0 +1,10 @@
1
+ const debounce = (fn, delay = 300) => {
2
+ let timeoutId;
3
+
4
+ return function (...args) {
5
+ clearTimeout(timeoutId);
6
+ timeoutId = setTimeout(() => { fn.apply(this, args); }, delay);
7
+ };
8
+ };
9
+
10
+ export default debounce;
@@ -0,0 +1,19 @@
1
+ export const translit = (str) => {
2
+ const map = {
3
+ 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'e', 'ж': 'zh',
4
+ 'з': 'z', 'и': 'i', 'й': 'y', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', 'о': 'o',
5
+ 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u', 'ф': 'f', 'х': 'kh', 'ц': 'ts',
6
+ 'ч': 'ch', 'ш': 'sh', 'щ': 'shch', 'ы': 'y', 'э': 'e', 'ю': 'yu', 'я': 'ya',
7
+ 'ь': '', 'ъ': '', 'є': 'ye', 'і': 'i', 'ї': 'yi', 'ґ': 'g'
8
+ };
9
+
10
+ return str
11
+ .toLowerCase()
12
+ .split('')
13
+ .map(char => map[char] || char)
14
+ .join('')
15
+ .replace(/[^a-z0-9\s-]/g, '')
16
+ .replace(/\s+/g, '-')
17
+ .replace(/-+/g, '-')
18
+ .trim('-');
19
+ }
package/src/main.js ADDED
@@ -0,0 +1,30 @@
1
+ import { createApp } from 'vue'
2
+ import './style.css'
3
+ import router from './router/router'
4
+ import App from './App.vue'
5
+ import './assets/tailwind/tailwind.js';
6
+ import v3core from '@opengis/v3-core';
7
+
8
+ import '@opengis/v3-core/dist/style.css';
9
+
10
+ window.tailwind = {
11
+ config: {
12
+ darkMode: 'class'
13
+ }
14
+ };
15
+
16
+ const app = createApp(App);
17
+ v3core.install(app, createApp);
18
+
19
+ // async function run() {
20
+ // const res = await fetch("/user");
21
+ // const data = await res.json();
22
+ // app.config.globalProperties.$settings = data.settings;
23
+ // app.config.globalProperties.$user = data.user;
24
+
25
+ // }
26
+ // run();
27
+
28
+ window.app = { router };
29
+ app.use(router);
30
+ app.mount('#app');
@@ -0,0 +1,32 @@
1
+ import VsBuilderContent from "../components/builder/vs-builder-content.vue";
2
+ import VsManagerCollectionContent from "../components/manager/children/vs-manager-collection-content.vue";
3
+ import VsManagerCollectionItemContent from "../components/manager/children/vs-manager-collection-item-content.vue";
4
+ import VsManagerSingleContent from "../components/manager/children/vs-manager-single-content.vue";
5
+ import VsBuilder from "../pages/vs-builder.vue";
6
+ import VsManager from "../pages/vs-manager.vue";
7
+ import VsMedia from "../pages/vs-media.vue";
8
+
9
+ const components = {
10
+ "vs-builder": VsBuilder,
11
+ "vs-builder-content": VsBuilderContent,
12
+ "vs-manager": VsManager,
13
+ "vs-manager-collection-content": VsManagerCollectionContent,
14
+ "vs-manager-collection-item-content": VsManagerCollectionItemContent,
15
+ "vs-manager-single-content": VsManagerSingleContent,
16
+ "vs-media": VsMedia
17
+ }
18
+
19
+ const install = (app) => {
20
+ Object.entries(components)?.forEach(([name, component])=> app.component(name, component))
21
+ };
22
+
23
+ const library = {
24
+ install,
25
+ components
26
+ };
27
+
28
+ if (typeof window !== 'undefined') {
29
+ window.v3Cms = library;
30
+ }
31
+
32
+ export default library;
@@ -0,0 +1,22 @@
1
+ <template>
2
+ <div class="w-full bg-[#f6f6f9] h-full h-[calc(100vh-60px)]">
3
+ <div class="flex h-full">
4
+ <VsBuilderMenu v-model:UPDATE="UPDATE" />
5
+ <router-view v-slot="{ Component }">
6
+ <component v-if="Component" :is="Component" :UPDATE />
7
+ <VsNotData
8
+ class="pt-[100px]"
9
+ v-else
10
+ text="Оберіть один з існуючих пунктів меню, або створіть новий"
11
+ />
12
+ </router-view>
13
+ </div>
14
+ </div>
15
+ </template>
16
+ <script setup>
17
+ import { ref } from "vue";
18
+ import VsBuilderMenu from "../components/builder/vs-builder-menu.vue";
19
+ import VsNotData from "../components/shared-components/vs-not-data.vue";
20
+
21
+ const UPDATE = ref({});
22
+ </script>
@@ -0,0 +1,17 @@
1
+ <template>
2
+ <div class="relative h-[100vh] w-[100vw] flex">
3
+ <VsMainMenu/>
4
+ <router-view/>
5
+ </div>
6
+ </template>
7
+ <script>
8
+ import VsMainMenu from '../components/vs-main-menu.vue'
9
+ export default{
10
+ components:{
11
+ VsMainMenu
12
+ }
13
+ }
14
+ </script>
15
+ <style lang="scss" scoped>
16
+
17
+ </style>
@@ -0,0 +1,30 @@
1
+ <template>
2
+ <div class="w-full bg-[#f6f6f9] h-[calc(100vh-60px)]">
3
+ <div class="flex">
4
+ <VsManagerMenu />
5
+ <div class="w-full flex justify-center">
6
+ <div class="p-[20px] w-full max-w-[1440px]">
7
+ <button
8
+ @click="$router.back()"
9
+ class="text-blue-500 flex gap-2 items-center hover:text-blue-700 duration-300"
10
+ >
11
+ <IconArrowLeft :template /> Повернутися назад
12
+ </button>
13
+ <router-view v-slot="{ Component }">
14
+ <component v-if="Component" :is="Component" />
15
+ <VsNotData
16
+ class="pt-[100px]"
17
+ v-else
18
+ text="Оберіть один з існуючих пунктів меню, або створіть новий"
19
+ />
20
+ </router-view>
21
+ </div>
22
+ </div>
23
+ </div>
24
+ </div>
25
+ </template>
26
+ <script setup>
27
+ import VsManagerMenu from "../components/manager/vs-manager-menu.vue";
28
+ import VsNotData from "../components/shared-components/vs-not-data.vue";
29
+ import IconArrowLeft from "../components/icons/icon-arrow-left.vue";
30
+ </script>