@opengis/cms 0.0.58 → 0.0.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 (129) hide show
  1. package/README.md +131 -131
  2. package/dist/{ArticlesPage-CFjE_cw_.js → ArticlesPage-BjYzvTWM.js} +3 -3
  3. package/dist/{CollectionsBreadcrumb-BCxeRikP.js → CollectionsBreadcrumb-HePNJb-d.js} +1 -1
  4. package/dist/CollectionsBreadcrumb.vue_vue_type_script_setup_true_lang-BJh-tjam.js +53 -0
  5. package/dist/{Dashboard-C1eGscNd.js → Dashboard-CXkg_pk8.js} +132 -132
  6. package/dist/EditCollectionPage-BycuD920.js +188 -0
  7. package/dist/{MenuAddPage-D-p3gFgm.js → MenuAddPage-QTnwCoGh.js} +1 -1
  8. package/dist/{MenuBody-rN5j4YBu.js → MenuBody-Bi0ONVZf.js} +2 -2
  9. package/dist/{MenuItemPage-BoJw885D.js → MenuItemPage-B7Y9KFyb.js} +3 -3
  10. package/dist/{MenuList-DFEBS0NB.js → MenuList-BLIpeqSd.js} +53 -53
  11. package/dist/{MenuPage-BCZB_S8j.js → MenuPage-3W6jZ15H.js} +1 -1
  12. package/dist/{MenuWrapper-AZ_8s-zd.js → MenuWrapper-OrOv6sOb.js} +1 -1
  13. package/dist/{MonacoEditor-Db-3Jc3E.js → MonacoEditor-ByPT8pnv.js} +1 -1
  14. package/dist/MonacoEditor.vue_vue_type_script_setup_true_lang-C8cip9Ci.js +84 -0
  15. package/dist/{UniversalTable-CzqPG-tY.js → UniversalTable-GBd_pStq.js} +80 -80
  16. package/dist/{UniversalTablePagination-4gL47A7I.js → UniversalTablePagination-Dw2hc0nc.js} +46 -46
  17. package/dist/{contentForm-CtMhQTG0.js → contentForm-yMn63kza.js} +48 -48
  18. package/dist/index.js +5 -5
  19. package/dist/{vs-builder-monaco-B3Jj0V31.js → vs-builder-monaco-Cw-f19gc.js} +1 -1
  20. package/input-types.json +9 -9
  21. package/locales/en.json +815 -815
  22. package/locales/uk.json +813 -813
  23. package/module/cms/cls/content.status.json +17 -17
  24. package/module/cms/cls/user_type.json +9 -9
  25. package/module/cms/form/admin.users.form.json +77 -77
  26. package/module/cms/select/cms.page_type.sql +1 -1
  27. package/module/cms/select/news_tag_id.sql +11 -11
  28. package/module/cms/table/admin.users.table.json +53 -53
  29. package/module/cms/table/collection.default.table.json +96 -96
  30. package/module/cms/table/single.default.table.json +116 -116
  31. package/package.json +2 -1
  32. package/plugin.js +43 -43
  33. package/server/app.js +35 -35
  34. package/server/config.js +4 -4
  35. package/server/functions/getContent.js +45 -45
  36. package/server/functions/getDraftKey.js +22 -22
  37. package/server/functions/getSearchData.js +31 -31
  38. package/server/functions/getTags.js +30 -30
  39. package/server/functions/getUser.js +27 -27
  40. package/server/functions/utils/mock.reply.js +55 -55
  41. package/server/index.js +22 -22
  42. package/server/migrations/fixes.sql +129 -129
  43. package/server/migrations/site.sql +595 -595
  44. package/server/plugins/adminHook.js +78 -78
  45. package/server/plugins/hook.js +59 -59
  46. package/server/plugins/vite.js +75 -75
  47. package/server/routes/category/controllers/cms.category.delete.js +21 -21
  48. package/server/routes/category/controllers/cms.category.get.js +17 -17
  49. package/server/routes/category/controllers/cms.category.list.js +16 -16
  50. package/server/routes/category/controllers/cms.category.post.js +21 -21
  51. package/server/routes/category/controllers/cms.category.put.js +23 -23
  52. package/server/routes/category/index.mjs +22 -22
  53. package/server/routes/cms/controllers/cmsStat.js +55 -55
  54. package/server/routes/cms/controllers/cmsSuggest.js +57 -57
  55. package/server/routes/cms/controllers/deleteContent.js +113 -113
  56. package/server/routes/cms/controllers/deleteMedia.js +76 -76
  57. package/server/routes/cms/controllers/downloadMedia.js +84 -84
  58. package/server/routes/cms/controllers/getContent.js +113 -113
  59. package/server/routes/cms/controllers/getContentBySlug.js +93 -93
  60. package/server/routes/cms/controllers/getPermissions.js +15 -15
  61. package/server/routes/cms/controllers/insertContent.js +217 -217
  62. package/server/routes/cms/controllers/listMedia.js +155 -155
  63. package/server/routes/cms/controllers/metadataMedia.js +39 -39
  64. package/server/routes/cms/controllers/properties.get.js +18 -18
  65. package/server/routes/cms/controllers/properties.post.js +99 -99
  66. package/server/routes/cms/controllers/searchContent.js +214 -214
  67. package/server/routes/cms/controllers/setPermissions.js +49 -49
  68. package/server/routes/cms/controllers/translate.js +89 -89
  69. package/server/routes/cms/controllers/updateContent.js +266 -266
  70. package/server/routes/cms/controllers/uploadMedia.js +79 -79
  71. package/server/routes/cms/functions/getSettings.js +48 -48
  72. package/server/routes/cms/index.mjs +112 -112
  73. package/server/routes/cms/utils/additionalData.js +35 -35
  74. package/server/routes/cms/utils/getCollection.js +89 -89
  75. package/server/routes/cms/utils/getSingle.js +188 -188
  76. package/server/routes/cms/utils/inputTypes.js +5 -5
  77. package/server/routes/cms/utils/insertContentLocalization.js +104 -104
  78. package/server/routes/cms/utils/requestTranslation.js +113 -85
  79. package/server/routes/cms/utils/updateLocalization.js +47 -47
  80. package/server/routes/cmsSpace/controllers/deleteSpace.js +25 -25
  81. package/server/routes/cmsSpace/controllers/getSpaces.js +27 -27
  82. package/server/routes/cmsSpace/controllers/insertSpace.js +21 -21
  83. package/server/routes/cmsSpace/controllers/updateSpace.js +23 -23
  84. package/server/routes/cmsSpace/index.mjs +20 -20
  85. package/server/routes/contentType/controllers/addContentType.js +160 -160
  86. package/server/routes/contentType/controllers/contentTypeList.js +54 -54
  87. package/server/routes/contentType/controllers/delContentType.js +75 -75
  88. package/server/routes/contentType/controllers/editContentType.js +88 -88
  89. package/server/routes/contentType/controllers/getContentType.js +65 -65
  90. package/server/routes/contentType/index.mjs +35 -35
  91. package/server/routes/contentType/utils/updateContents.js +44 -44
  92. package/server/routes/contentType/utils/updateCustomContentTable.js +53 -53
  93. package/server/routes/feedback/controllers/email.list.js +24 -24
  94. package/server/routes/feedback/controllers/feedback.js +48 -48
  95. package/server/routes/feedback/controllers/feedback.list.js +37 -37
  96. package/server/routes/feedback/controllers/news.subscriptions.js +44 -44
  97. package/server/routes/feedback/index.mjs +71 -71
  98. package/server/routes/logs/controllers/export.user.logs.js +77 -77
  99. package/server/routes/logs/controllers/user.logs.js +44 -44
  100. package/server/routes/logs/index.mjs +9 -9
  101. package/server/routes/menu/controllers/addMenu.js +37 -37
  102. package/server/routes/menu/controllers/delMenu.js +31 -31
  103. package/server/routes/menu/controllers/editMenu.js +41 -41
  104. package/server/routes/menu/controllers/getMenu.js +24 -24
  105. package/server/routes/menu/functions/getMenu.js +50 -50
  106. package/server/routes/menu/index.mjs +13 -13
  107. package/server/routes/migration/controllers/collectionToCustom.js +137 -137
  108. package/server/routes/migration/index.mjs +8 -8
  109. package/server/routes/root.mjs +8 -8
  110. package/server/routes/tags/controllers/add.tags.js +24 -24
  111. package/server/routes/tags/controllers/del.tags.js +19 -19
  112. package/server/routes/tags/controllers/edit.tags.js +25 -25
  113. package/server/routes/tags/controllers/get.tags.js +15 -15
  114. package/server/routes/tags/index.mjs +14 -14
  115. package/server/templates/cls/cms.category_type.json +9 -9
  116. package/server/templates/cls/cms.content_review_status.json +9 -9
  117. package/server/templates/cls/cms.content_status.json +9 -9
  118. package/server/templates/cls/cms.content_type.json +9 -9
  119. package/server/templates/cls/cms.lang.json +9 -9
  120. package/server/templates/page/login.html +126 -126
  121. package/server/templates/select/core.user_mentioned.sql +1 -1
  122. package/utils.d.ts +52 -52
  123. package/utils.js +8 -8
  124. package/dist/CollectionsBreadcrumb.vue_vue_type_script_setup_true_lang-umRzB5mY.js +0 -53
  125. package/dist/EditCollectionPage-DIr1tdtn.js +0 -187
  126. package/dist/MonacoEditor.vue_vue_type_script_setup_true_lang-B1DrxmQX.js +0 -84
  127. package/dist/images/logo.png +0 -0
  128. package/dist/index.html +0 -29
  129. package/dist/vite.svg +0 -1
@@ -1,127 +1,127 @@
1
- <!DOCTYPE html>
2
- <html lang="en" dir="">
3
-
4
- <head>
5
- <!-- scripts -->
6
- <script src="https://cdn.tailwindcss.com"></script>
7
- <script src="/src/assets/tailwind-3.4.17.js"></script>
8
- <!-- <script src="https://cdn.softpro.ua/assets/js/tailwind-3.4.17.js"></script> -->
9
- </head>
10
-
11
- <body class="bg-[#f3f4f6] flex items-center flex-1 w-full h-[100vh] overflow-x-hidden min-h-full ">
12
- <main class="w-full">
13
- <div class="flex w-full max-w-sm mx-auto overflow-hidden bg-white rounded-lg shadow-lg dark:bg-gray-800 lg:max-w-4xl">
14
- <div id="background-image" class="hidden bg-cover lg:block lg:w-1/2 bg-center" style="background-image: url('https://nipo.gov.ua/wp-content/uploads/2023/02/Pro_nas_2301-768x512.jpg');"></div>
15
-
16
- <div class="w-full px-6 py-8 md:px-8 lg:w-1/2">
17
- <div class="flex justify-center mx-auto">
18
- <img class="w-auto h-7 sm:h-16" id="logo-cms" src="https://nipo.gov.ua/wp-content/uploads/2023/01/IP_office_logo_UA-1-1.png" alt="logo">
19
- </div>
20
-
21
- <p id="site-name" class="mt-3 mb-[32px] text-xl text-center text-gray-600 dark:text-gray-200">
22
- Український національний офіс інтелектуальної власності та інновацій
23
- </p>
24
-
25
- <form action="/api/login" method="get" >
26
- <div class="mt-4">
27
- <label class="block mb-2 text-sm font-medium text-gray-600 dark:text-gray-200" for="LoggingEmailAddress">Електронна пошта / Логін</label>
28
- <input name="username" id="LoggingEmailAddress" class="block w-full px-4 py-2 text-gray-700 bg-white border rounded-lg dark:bg-gray-800 dark:text-gray-300 dark:border-gray-600 focus:border-blue-400 focus:ring-opacity-40 dark:focus:border-blue-300 focus:outline-none focus:ring focus:ring-blue-300" type="text">
29
- </div>
30
-
31
- <div class="mt-4">
32
- <div class="flex justify-between">
33
- <label class="block mb-2 text-sm font-medium text-gray-600 dark:text-gray-200" for="loggingPassword">Пароль</label>
34
- <!-- <a class="text-xs text-gray-500 dark:text-gray-300 hover:underline">Forget Password?</a> -->
35
- </div>
36
-
37
- <input id="loggingPassword" name="password" class="block w-full px-4 py-2 text-gray-700 bg-white border rounded-lg dark:bg-gray-800 dark:text-gray-300 dark:border-gray-600 focus:border-blue-400 focus:ring-opacity-40 dark:focus:border-blue-300 focus:outline-none focus:ring focus:ring-blue-300" type="password">
38
- </div>
39
-
40
- <div class="mt-6">
41
- <button type="submit" class="w-full px-6 py-3 text-sm font-medium tracking-wide text-white capitalize transition-colors duration-300 transform bg-gray-800 rounded-lg hover:bg-gray-700 focus:outline-none focus:ring focus:ring-gray-300 focus:ring-opacity-50">
42
- Увійти
43
- </button>
44
-
45
- {{!-- <a href="https://nsdi.gov.ua/auth/redirect"
46
- class="block text-center mt-2 w-full px-6 py-3 text-sm font-medium tracking-wide text-white capitalize transition-colors duration-300 transform bg-gray-800 rounded-lg hover:bg-gray-700 focus:outline-none focus:ring focus:ring-gray-300 focus:ring-opacity-50">
47
- Авторизуватись з
48
- <span class="ml-2 inline-flex items-center bg-white text-gray-900 px-2 py-1 rounded-md">
49
- ID GOV UA
50
- </span>
51
- </a> --}}
52
- {{!--<a
53
- href="https://id.softpro.ua/oauth/authorize?response_type=code&provider=google&client_id=photo-client-123&redirect_uri={{coalesce protocol 'https'}}://{{req.raw.headers.host}}/auth/by_data&scope=profile email"
54
- class="flex items-center justify-center mt-4 text-gray-600 transition-colors duration-300 transform border rounded-lg hover:bg-gray-50">
55
- <div class="px-4 py-2">
56
- <svg class="w-6 h-6" viewBox="0 0 40 40">
57
- <path
58
- d="M36.3425 16.7358H35V16.6667H20V23.3333H29.4192C28.045 27.2142 24.3525 30 20 30C14.4775 30 10 25.5225 10 20C10 14.4775 14.4775 9.99999 20 9.99999C22.5492 9.99999 24.8683 10.9617 26.6342 12.5325L31.3483 7.81833C28.3717 5.04416 24.39 3.33333 20 3.33333C10.7958 3.33333 3.33335 10.7958 3.33335 20C3.33335 29.2042 10.7958 36.6667 20 36.6667C29.2042 36.6667 36.6667 29.2042 36.6667 20C36.6667 18.8825 36.5517 17.7917 36.3425 16.7358Z"
59
- fill="#FFC107"></path>
60
- <path
61
- d="M5.25497 12.2425L10.7308 16.2583C12.2125 12.59 15.8008 9.99999 20 9.99999C22.5491 9.99999 24.8683 10.9617 26.6341 12.5325L31.3483 7.81833C28.3716 5.04416 24.39 3.33333 20 3.33333C13.5983 3.33333 8.04663 6.94749 5.25497 12.2425Z"
62
- fill="#FF3D00"></path>
63
- <path
64
- d="M20 36.6667C24.305 36.6667 28.2167 35.0192 31.1742 32.34L26.0159 27.975C24.3425 29.2425 22.2625 30 20 30C15.665 30 11.9842 27.2359 10.5975 23.3784L5.16254 27.5659C7.92087 32.9634 13.5225 36.6667 20 36.6667Z"
65
- fill="#4CAF50"></path>
66
- <path
67
- d="M36.3425 16.7358H35V16.6667H20V23.3333H29.4192C28.7592 25.1975 27.56 26.805 26.0133 27.9758C26.0142 27.975 26.015 27.975 26.0158 27.9742L31.1742 32.3392C30.8092 32.6708 36.6667 28.3333 36.6667 20C36.6667 18.8825 36.5517 17.7917 36.3425 16.7358Z"
68
- fill="#1976D2"></path>
69
- </svg>
70
- </div>
71
-
72
- <span class="w-5/6 px-4 py-3 font-bold text-center"> Увійти через Google</span>
73
- </a>--}}
74
- </div>
75
-
76
- </form>
77
- </div>
78
- </div>
79
- </main>
80
-
81
- </body>
82
-
83
-
84
- <script>
85
- const error = location.search.includes('wrong_pass')
86
- if (error) {
87
- document.getElementById('login_error').innerHTML = 'Не вірний користувач або пароль';
88
- }
89
-
90
- // Отримання даних з налаштувань
91
- (async function() {
92
- try {
93
- const response = await fetch('/api/settings');
94
- const data = await response.json();
95
- const siteInfo = data?.settings?.site_info || {};
96
-
97
- // Оновлення назви сайту
98
- if (siteInfo.name) {
99
- const nameElement = document.getElementById('site-name');
100
- if (nameElement) {
101
- nameElement.textContent = siteInfo.name;
102
- }
103
- }
104
-
105
- // Оновлення логотипу CMS
106
- if (siteInfo['logo-cms']) {
107
- const logoElement = document.getElementById('logo-cms');
108
- if (logoElement) {
109
- logoElement.src = siteInfo['logo-cms'];
110
- logoElement.alt = siteInfo.name || 'logo';
111
- }
112
- }
113
-
114
- // Оновлення фонового зображення для логіну
115
- if (siteInfo['image-login']) {
116
- const bgElement = document.getElementById('background-image');
117
- if (bgElement) {
118
- bgElement.style.backgroundImage = `url('${siteInfo['image-login']}')`;
119
- }
120
- }
121
- } catch (error) {
122
- console.error('Помилка при завантаженні налаштувань:', error);
123
- }
124
- })();
125
- </script>
126
-
1
+ <!DOCTYPE html>
2
+ <html lang="en" dir="">
3
+
4
+ <head>
5
+ <!-- scripts -->
6
+ <script src="https://cdn.tailwindcss.com"></script>
7
+ <script src="/src/assets/tailwind-3.4.17.js"></script>
8
+ <!-- <script src="https://cdn.softpro.ua/assets/js/tailwind-3.4.17.js"></script> -->
9
+ </head>
10
+
11
+ <body class="bg-[#f3f4f6] flex items-center flex-1 w-full h-[100vh] overflow-x-hidden min-h-full ">
12
+ <main class="w-full">
13
+ <div class="flex w-full max-w-sm mx-auto overflow-hidden bg-white rounded-lg shadow-lg dark:bg-gray-800 lg:max-w-4xl">
14
+ <div id="background-image" class="hidden bg-cover lg:block lg:w-1/2 bg-center" style="background-image: url('https://nipo.gov.ua/wp-content/uploads/2023/02/Pro_nas_2301-768x512.jpg');"></div>
15
+
16
+ <div class="w-full px-6 py-8 md:px-8 lg:w-1/2">
17
+ <div class="flex justify-center mx-auto">
18
+ <img class="w-auto h-7 sm:h-16" id="logo-cms" src="https://nipo.gov.ua/wp-content/uploads/2023/01/IP_office_logo_UA-1-1.png" alt="logo">
19
+ </div>
20
+
21
+ <p id="site-name" class="mt-3 mb-[32px] text-xl text-center text-gray-600 dark:text-gray-200">
22
+ Український національний офіс інтелектуальної власності та інновацій
23
+ </p>
24
+
25
+ <form action="/api/login" method="get" >
26
+ <div class="mt-4">
27
+ <label class="block mb-2 text-sm font-medium text-gray-600 dark:text-gray-200" for="LoggingEmailAddress">Електронна пошта / Логін</label>
28
+ <input name="username" id="LoggingEmailAddress" class="block w-full px-4 py-2 text-gray-700 bg-white border rounded-lg dark:bg-gray-800 dark:text-gray-300 dark:border-gray-600 focus:border-blue-400 focus:ring-opacity-40 dark:focus:border-blue-300 focus:outline-none focus:ring focus:ring-blue-300" type="text">
29
+ </div>
30
+
31
+ <div class="mt-4">
32
+ <div class="flex justify-between">
33
+ <label class="block mb-2 text-sm font-medium text-gray-600 dark:text-gray-200" for="loggingPassword">Пароль</label>
34
+ <!-- <a class="text-xs text-gray-500 dark:text-gray-300 hover:underline">Forget Password?</a> -->
35
+ </div>
36
+
37
+ <input id="loggingPassword" name="password" class="block w-full px-4 py-2 text-gray-700 bg-white border rounded-lg dark:bg-gray-800 dark:text-gray-300 dark:border-gray-600 focus:border-blue-400 focus:ring-opacity-40 dark:focus:border-blue-300 focus:outline-none focus:ring focus:ring-blue-300" type="password">
38
+ </div>
39
+
40
+ <div class="mt-6">
41
+ <button type="submit" class="w-full px-6 py-3 text-sm font-medium tracking-wide text-white capitalize transition-colors duration-300 transform bg-gray-800 rounded-lg hover:bg-gray-700 focus:outline-none focus:ring focus:ring-gray-300 focus:ring-opacity-50">
42
+ Увійти
43
+ </button>
44
+
45
+ {{!-- <a href="https://nsdi.gov.ua/auth/redirect"
46
+ class="block text-center mt-2 w-full px-6 py-3 text-sm font-medium tracking-wide text-white capitalize transition-colors duration-300 transform bg-gray-800 rounded-lg hover:bg-gray-700 focus:outline-none focus:ring focus:ring-gray-300 focus:ring-opacity-50">
47
+ Авторизуватись з
48
+ <span class="ml-2 inline-flex items-center bg-white text-gray-900 px-2 py-1 rounded-md">
49
+ ID GOV UA
50
+ </span>
51
+ </a> --}}
52
+ {{!--<a
53
+ href="https://id.softpro.ua/oauth/authorize?response_type=code&provider=google&client_id=photo-client-123&redirect_uri={{coalesce protocol 'https'}}://{{req.raw.headers.host}}/auth/by_data&scope=profile email"
54
+ class="flex items-center justify-center mt-4 text-gray-600 transition-colors duration-300 transform border rounded-lg hover:bg-gray-50">
55
+ <div class="px-4 py-2">
56
+ <svg class="w-6 h-6" viewBox="0 0 40 40">
57
+ <path
58
+ d="M36.3425 16.7358H35V16.6667H20V23.3333H29.4192C28.045 27.2142 24.3525 30 20 30C14.4775 30 10 25.5225 10 20C10 14.4775 14.4775 9.99999 20 9.99999C22.5492 9.99999 24.8683 10.9617 26.6342 12.5325L31.3483 7.81833C28.3717 5.04416 24.39 3.33333 20 3.33333C10.7958 3.33333 3.33335 10.7958 3.33335 20C3.33335 29.2042 10.7958 36.6667 20 36.6667C29.2042 36.6667 36.6667 29.2042 36.6667 20C36.6667 18.8825 36.5517 17.7917 36.3425 16.7358Z"
59
+ fill="#FFC107"></path>
60
+ <path
61
+ d="M5.25497 12.2425L10.7308 16.2583C12.2125 12.59 15.8008 9.99999 20 9.99999C22.5491 9.99999 24.8683 10.9617 26.6341 12.5325L31.3483 7.81833C28.3716 5.04416 24.39 3.33333 20 3.33333C13.5983 3.33333 8.04663 6.94749 5.25497 12.2425Z"
62
+ fill="#FF3D00"></path>
63
+ <path
64
+ d="M20 36.6667C24.305 36.6667 28.2167 35.0192 31.1742 32.34L26.0159 27.975C24.3425 29.2425 22.2625 30 20 30C15.665 30 11.9842 27.2359 10.5975 23.3784L5.16254 27.5659C7.92087 32.9634 13.5225 36.6667 20 36.6667Z"
65
+ fill="#4CAF50"></path>
66
+ <path
67
+ d="M36.3425 16.7358H35V16.6667H20V23.3333H29.4192C28.7592 25.1975 27.56 26.805 26.0133 27.9758C26.0142 27.975 26.015 27.975 26.0158 27.9742L31.1742 32.3392C30.8092 32.6708 36.6667 28.3333 36.6667 20C36.6667 18.8825 36.5517 17.7917 36.3425 16.7358Z"
68
+ fill="#1976D2"></path>
69
+ </svg>
70
+ </div>
71
+
72
+ <span class="w-5/6 px-4 py-3 font-bold text-center"> Увійти через Google</span>
73
+ </a>--}}
74
+ </div>
75
+
76
+ </form>
77
+ </div>
78
+ </div>
79
+ </main>
80
+
81
+ </body>
82
+
83
+
84
+ <script>
85
+ const error = location.search.includes('wrong_pass')
86
+ if (error) {
87
+ document.getElementById('login_error').innerHTML = 'Не вірний користувач або пароль';
88
+ }
89
+
90
+ // Отримання даних з налаштувань
91
+ (async function() {
92
+ try {
93
+ const response = await fetch('/api/settings');
94
+ const data = await response.json();
95
+ const siteInfo = data?.settings?.site_info || {};
96
+
97
+ // Оновлення назви сайту
98
+ if (siteInfo.name) {
99
+ const nameElement = document.getElementById('site-name');
100
+ if (nameElement) {
101
+ nameElement.textContent = siteInfo.name;
102
+ }
103
+ }
104
+
105
+ // Оновлення логотипу CMS
106
+ if (siteInfo['logo-cms']) {
107
+ const logoElement = document.getElementById('logo-cms');
108
+ if (logoElement) {
109
+ logoElement.src = siteInfo['logo-cms'];
110
+ logoElement.alt = siteInfo.name || 'logo';
111
+ }
112
+ }
113
+
114
+ // Оновлення фонового зображення для логіну
115
+ if (siteInfo['image-login']) {
116
+ const bgElement = document.getElementById('background-image');
117
+ if (bgElement) {
118
+ bgElement.style.backgroundImage = `url('${siteInfo['image-login']}')`;
119
+ }
120
+ }
121
+ } catch (error) {
122
+ console.error('Помилка при завантаженні налаштувань:', error);
123
+ }
124
+ })();
125
+ </script>
126
+
127
127
  </html>
@@ -1,2 +1,2 @@
1
- select uid, coalesce(sur_name,'')||coalesce(' '||user_name,'') as text, email from admin.users
1
+ select uid, coalesce(sur_name,'')||coalesce(' '||user_name,'') as text, email from admin.users
2
2
  where enabled order by coalesce(sur_name,'')||coalesce(' '||user_name,'')
package/utils.d.ts CHANGED
@@ -1,52 +1,52 @@
1
- interface ContentParam {
2
- slug?: string;
3
- locale?: string;
4
- ttl?: number;
5
- page?: number;
6
- fields?: string;
7
- limit?: number;
8
- filter?: string;
9
- tags?: any;
10
- state?: string;
11
- contextQuery?: string;
12
- collection?: string;
13
- }
14
-
15
- interface MenuParam {
16
- locale?: string;
17
- ttl?: number;
18
- page?: number;
19
- limit?: number;
20
- }
21
-
22
- interface SettingParam {
23
- entity?: string;
24
- keys?: string;
25
- uid?: number;
26
- ttl?: number;
27
- }
28
-
29
- interface Setting {
30
- entity?: string;
31
- keys?: string;
32
- uid?: number;
33
- ttl?: number;
34
- }
35
-
36
- interface SearchParam {
37
- contentType?: string;
38
- filter?: string;
39
- search?: string;
40
- locale?: string;
41
- tags?: string;
42
- page?: number;
43
- limit?: number;
44
- asc?: number;
45
- ttl?: number;
46
- }
47
-
48
- export function getContent(param?: ContentParam): any;
49
- export function getMenu(slug: string, param?: MenuParam): any;
50
- export function getSettings(param?: SettingParam): any;
51
- export function getUser(cookies: string | Record<string, any>): any;
52
- export function getSearchData(param: SearchParam): any;
1
+ interface ContentParam {
2
+ slug?: string;
3
+ locale?: string;
4
+ ttl?: number;
5
+ page?: number;
6
+ fields?: string;
7
+ limit?: number;
8
+ filter?: string;
9
+ tags?: any;
10
+ state?: string;
11
+ contextQuery?: string;
12
+ collection?: string;
13
+ }
14
+
15
+ interface MenuParam {
16
+ locale?: string;
17
+ ttl?: number;
18
+ page?: number;
19
+ limit?: number;
20
+ }
21
+
22
+ interface SettingParam {
23
+ entity?: string;
24
+ keys?: string;
25
+ uid?: number;
26
+ ttl?: number;
27
+ }
28
+
29
+ interface Setting {
30
+ entity?: string;
31
+ keys?: string;
32
+ uid?: number;
33
+ ttl?: number;
34
+ }
35
+
36
+ interface SearchParam {
37
+ contentType?: string;
38
+ filter?: string;
39
+ search?: string;
40
+ locale?: string;
41
+ tags?: string;
42
+ page?: number;
43
+ limit?: number;
44
+ asc?: number;
45
+ ttl?: number;
46
+ }
47
+
48
+ export function getContent(param?: ContentParam): any;
49
+ export function getMenu(slug: string, param?: MenuParam): any;
50
+ export function getSettings(param?: SettingParam): any;
51
+ export function getUser(cookies: string | Record<string, any>): any;
52
+ export function getSearchData(param: SearchParam): any;
package/utils.js CHANGED
@@ -1,8 +1,8 @@
1
- export { default as getMenu } from "./server/routes/menu/functions/getMenu.js";
2
- export { default as getContent } from "./server/functions/getContent.js";
3
- export { default as getSettings } from "./server/routes/cms/functions/getSettings.js";
4
- export { default as getUser } from "./server/functions/getUser.js";
5
- export { default as getSearchData } from "./server/functions/getSearchData.js";
6
- export { default as getTags } from "./server/functions/getTags.js";
7
-
8
- export default null;
1
+ export { default as getMenu } from "./server/routes/menu/functions/getMenu.js";
2
+ export { default as getContent } from "./server/functions/getContent.js";
3
+ export { default as getSettings } from "./server/routes/cms/functions/getSettings.js";
4
+ export { default as getUser } from "./server/functions/getUser.js";
5
+ export { default as getSearchData } from "./server/functions/getSearchData.js";
6
+ export { default as getTags } from "./server/functions/getTags.js";
7
+
8
+ export default null;
@@ -1,53 +0,0 @@
1
- import { defineComponent as b, openBlock as e, createElementBlock as t, createElementVNode as s, createVNode as c, unref as n, toDisplayString as u, Fragment as r, createBlock as x, createCommentVNode as k, renderList as h } from "vue";
2
- import { Layers as g, ChevronRight as i } from "lucide-vue-next";
3
- const p = { class: "flex items-center space-x-1 mb-4 overflow-hidden" }, w = { class: "truncate block max-w-[12rem]" }, f = ["onClick"], v = { class: "truncate block max-w-[20rem]" }, y = {
4
- key: 1,
5
- class: "flex gap-x-1 items-center px-2 py-1 rounded text-sm font-medium text-slate-700 dark:text-slate-300 min-w-0 overflow-hidden whitespace-nowrap text-ellipsis"
6
- }, C = { class: "truncate block max-w-[20rem]" }, V = /* @__PURE__ */ b({
7
- __name: "CollectionsBreadcrumb",
8
- props: {
9
- items: {},
10
- loading: { type: Boolean }
11
- },
12
- emits: ["navigate"],
13
- setup(a) {
14
- return (d, l) => (e(), t("div", p, [
15
- s("button", {
16
- class: "flex gap-x-1 items-center px-2 py-1 rounded text-sm font-medium transition-all duration-200 text-blue-600 dark:text-blue-400 bg-blue-50 dark:bg-blue-900/20 hover:bg-blue-100 dark:hover:bg-blue-900/30 min-w-0 overflow-hidden whitespace-nowrap text-ellipsis",
17
- onClick: l[0] || (l[0] = (o) => d.$emit("navigate", "collections"))
18
- }, [
19
- c(n(g), { class: "w-3 h-3 flex-shrink-0" }),
20
- s("span", w, u(d.$t("cms.navigation.collections")), 1)
21
- ]),
22
- a.loading ? (e(), t(r, { key: 0 }, [
23
- c(n(i), { class: "w-3 h-3 text-slate-400 dark:text-slate-500 flex-shrink-0" }),
24
- l[1] || (l[1] = s("div", { class: "h-7 w-24 rounded bg-slate-200 dark:bg-slate-700 animate-pulse" }, null, -1)),
25
- c(n(i), { class: "w-3 h-3 text-slate-400 dark:text-slate-500 flex-shrink-0" }),
26
- l[2] || (l[2] = s("div", { class: "h-7 w-20 rounded bg-slate-200 dark:bg-slate-700 animate-pulse" }, null, -1))
27
- ], 64)) : (e(), t(r, { key: 1 }, [
28
- a.items.length > 0 ? (e(), x(n(i), {
29
- key: 0,
30
- class: "w-3 h-3 text-slate-400 dark:text-slate-500 flex-shrink-0"
31
- })) : k("", !0),
32
- (e(!0), t(r, null, h(a.items, (o, m) => (e(), t(r, { key: m }, [
33
- m < a.items.length - 1 ? (e(), t("button", {
34
- key: 0,
35
- class: "flex gap-x-1 items-center px-2 py-1 rounded text-sm font-medium transition-all duration-200 text-blue-700 dark:text-blue-300 bg-blue-50 dark:bg-blue-900/20 hover:bg-blue-100 dark:hover:bg-blue-900/30 min-w-0 overflow-hidden whitespace-nowrap text-ellipsis",
36
- onClick: (B) => d.$emit("navigate", o.route)
37
- }, [
38
- s("span", v, u(o.label), 1)
39
- ], 8, f)) : (e(), t("span", y, [
40
- s("span", C, u(o.label), 1)
41
- ])),
42
- m < a.items.length - 1 ? (e(), x(n(i), {
43
- key: 2,
44
- class: "w-3 h-3 text-slate-400 dark:text-slate-500 flex-shrink-0"
45
- })) : k("", !0)
46
- ], 64))), 128))
47
- ], 64))
48
- ]));
49
- }
50
- });
51
- export {
52
- V as _
53
- };
@@ -1,187 +0,0 @@
1
- import { defineAsyncComponent as k, defineComponent as z, inject as E, ref as u, computed as m, onMounted as S, openBlock as v, createElementBlock as h, createVNode as q, createElementVNode as n, createTextVNode as D, toDisplayString as d, unref as T, Fragment as O, renderList as R, normalizeClass as W, createBlock as J, resolveDynamicComponent as M, createCommentVNode as Y } from "vue";
2
- import { useRoute as G, useRouter as H } from "vue-router";
3
- import { useI18n as K } from "vue-i18n";
4
- import { notify as $ } from "@opengis/core";
5
- import { _ as P } from "./CollectionsBreadcrumb.vue_vue_type_script_setup_true_lang-umRzB5mY.js";
6
- const Q = {
7
- monaco: k(() => import("./vs-builder-monaco-B3Jj0V31.js")),
8
- edit: k(() => import("./vs-builder-edit-D-q1o8tF.js")),
9
- preview: k(() => import("./vs-builder-preview-BH4VAM3a.js"))
10
- }, X = { class: "mx-auto max-w-[90%]" }, Z = { class: "flex items-center justify-between mb-6" }, ee = { class: "mb-2 text-2xl font-semibold text-gray-900" }, te = { class: "lowercase" }, oe = { class: "text-gray-600" }, ne = { class: "flex items-center gap-2" }, se = { class: "w-full" }, ie = { class: "flex items-center w-full h-10 max-w-md grid-cols-3 p-1 mb-6 bg-white border border-gray-200 rounded-md text-muted-foreground" }, re = ["onClick"], ae = {
11
- key: 0,
12
- class: "mx-auto bg-white rounded-md py-4 px-2 bg-opacity-50"
13
- }, ve = /* @__PURE__ */ z({
14
- __name: "EditCollectionPage",
15
- setup(le) {
16
- const { t: s } = K(), j = E("cms.fetchContentTypes"), p = u("edit"), r = u({ yaml: "", data: { columns: [], type: "collection" } }), w = u({}), x = u(""), i = G(), b = H(), I = u(!1), _ = u(!0), C = u(""), A = m(() => [
17
- // {
18
- // name: "YAML",
19
- // id: "monaco",
20
- // },
21
- {
22
- name: s("cms.builder.edit"),
23
- id: "edit"
24
- },
25
- {
26
- name: s("cms.builder.preview"),
27
- id: "preview"
28
- }
29
- ]), a = m(() => {
30
- if (typeof i.params.collection == "string" && typeof i.params.contentId == "string")
31
- return i.params.collection;
32
- const e = i.params.id;
33
- return e === "edit" ? i.params.collection : e;
34
- }), g = m(() => typeof i.params.contentId == "string" ? i.params.contentId : null), L = m(() => {
35
- if (a.value && g.value)
36
- return `/collections/${a.value}/${g.value}`;
37
- const e = i.query.from;
38
- return typeof e == "string" && e.startsWith("/") ? e : null;
39
- }), N = m(() => {
40
- if (C.value)
41
- return C.value;
42
- const e = i.query.fromLabel;
43
- return typeof e == "string" && e.trim() ? e.trim() : null;
44
- }), F = m(() => {
45
- const o = [
46
- {
47
- label: x.value || a.value,
48
- route: `collections/${a.value}`
49
- },
50
- {
51
- label: s("cms.collections.edit")
52
- }
53
- ];
54
- return L.value && N.value && o.splice(1, 0, {
55
- label: N.value,
56
- route: L.value
57
- }), o;
58
- }), B = (e) => {
59
- if (e) {
60
- if (e.startsWith("/")) {
61
- b.push(e);
62
- return;
63
- }
64
- b.push(`/${e}`);
65
- }
66
- }, U = async () => {
67
- var e;
68
- try {
69
- if (_.value = !0, !a.value)
70
- return;
71
- if (g.value) {
72
- const f = await fetch(
73
- `/api/cms/${a.value}/${g.value}`
74
- );
75
- if (f.ok) {
76
- const c = await f.json(), y = Array.isArray(c == null ? void 0 : c.rows) ? c.rows[0] : c;
77
- y != null && y.title && (C.value = y.title);
78
- }
79
- }
80
- const t = await (await fetch(`/api/cms-type/${a.value}`)).json(), l = {
81
- ...t,
82
- columns: Array.isArray(t.columns) ? t.columns : (e = Object.entries((t == null ? void 0 : t.columns) || {})) == null ? void 0 : e.map(([f, c]) => ({
83
- ...c,
84
- name: f
85
- }))
86
- };
87
- r.value = {
88
- ...r.value,
89
- data: l
90
- }, x.value = l.title || l.name;
91
- } catch (o) {
92
- console.error(o);
93
- } finally {
94
- _.value = !1, I.value = !0;
95
- }
96
- }, V = async () => {
97
- var e, o;
98
- try {
99
- if (await w.value.validate()) {
100
- $({
101
- type: "warning",
102
- title: s("cms.common.actions.warning"),
103
- message: s("cms.builder.editFieldFailed")
104
- });
105
- return;
106
- }
107
- const l = a.value;
108
- if (!l)
109
- return;
110
- const f = await fetch(
111
- `/api/cms-type/${l}`,
112
- {
113
- method: "PUT",
114
- headers: {
115
- "Content-Type": "application/json"
116
- },
117
- body: JSON.stringify(p.value === "monaco" ? (e = r.value) == null ? void 0 : e.yaml : (o = r.value) == null ? void 0 : o.data)
118
- }
119
- );
120
- b.back(), j && j(), $({
121
- type: "success",
122
- title: s("cms.common.actions.success"),
123
- message: s("cms.collections.collectionCreated")
124
- });
125
- } catch (t) {
126
- console.error(t), $({
127
- type: "error",
128
- title: s("cms.common.actions.error"),
129
- message: s("cms.collections.collectionCreationFailed")
130
- });
131
- }
132
- };
133
- return S(() => {
134
- U();
135
- }), (e, o) => (v(), h("div", X, [
136
- q(P, {
137
- items: F.value,
138
- loading: _.value,
139
- onNavigate: B
140
- }, null, 8, ["items", "loading"]),
141
- n("div", Z, [
142
- n("div", null, [
143
- n("h1", ee, [
144
- D(d(e.$t("cms.builder.editCollection")) + ": ", 1),
145
- n("span", te, ' "' + d(x.value) + '" ', 1)
146
- ]),
147
- n("p", oe, d(e.$t("cms.builder.editContentForYourSite")), 1)
148
- ]),
149
- n("div", ne, [
150
- n("a", {
151
- onClick: o[0] || (o[0] = (t) => T(b).back()),
152
- class: "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border bg-background hover:text-accent-foreground h-10 px-4 py-2 border-gray-300 text-gray-700 hover:bg-gray-50"
153
- }, d(e.$t("cms.common.actions.back")), 1),
154
- n("button", {
155
- onClick: V,
156
- class: "inline-flex items-center justify-center gap-2 whitespace-nowrap text-white rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 text-primary-foreground h-10 px-4 py-2 bg-blue-600 hover:bg-blue-700"
157
- }, d(e.$t("cms.common.actions.save")), 1)
158
- ])
159
- ]),
160
- n("div", se, [
161
- n("div", ie, [
162
- (v(!0), h(O, null, R(A.value, (t) => (v(), h("button", {
163
- key: t.id,
164
- onClick: (l) => p.value = t.id,
165
- class: W([
166
- "inline-flex flex-1 items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm data-[state=active]:bg-blue-50 data-[state=active]:text-blue-700 data-[state=active]:border-blue-200",
167
- t.id === p.value ? "bg-blue-50 text-blue-700 border-blue-200" : ""
168
- ])
169
- }, d(t.name), 11, re))), 128))
170
- ])
171
- ]),
172
- I.value ? (v(), h("div", ae, [
173
- (v(), J(M(T(Q)[p.value]), {
174
- yaml: r.value.yaml,
175
- "onUpdate:yaml": o[1] || (o[1] = (t) => r.value.yaml = t),
176
- data: r.value.data,
177
- "onUpdate:data": o[2] || (o[2] = (t) => r.value.data = t),
178
- form: w.value,
179
- "onUpdate:form": o[3] || (o[3] = (t) => w.value = t)
180
- }, null, 40, ["yaml", "data", "form"]))
181
- ])) : Y("", !0)
182
- ]));
183
- }
184
- });
185
- export {
186
- ve as default
187
- };