@ozdao/martyrs 0.2.541 → 0.2.542

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 (171) hide show
  1. package/dist/_virtual/index.cjs +4 -4
  2. package/dist/_virtual/index.js +4 -4
  3. package/dist/_virtual/index2.cjs +3 -6
  4. package/dist/_virtual/index2.cjs.map +1 -1
  5. package/dist/_virtual/index2.js +2 -5
  6. package/dist/_virtual/index2.js.map +1 -1
  7. package/dist/{main-BpBtIUcJ.js → main-ByKkD9qa.js} +2724 -3143
  8. package/dist/main-Czyu-VcC.cjs +11 -0
  9. package/dist/martyrs/src/components/FieldTags/BlockTags.vue.cjs +30 -21
  10. package/dist/martyrs/src/components/FieldTags/BlockTags.vue.cjs.map +1 -1
  11. package/dist/martyrs/src/components/FieldTags/BlockTags.vue.js +32 -23
  12. package/dist/martyrs/src/components/FieldTags/BlockTags.vue.js.map +1 -1
  13. package/dist/martyrs/src/components/FieldTags/FieldTags.vue2.cjs +235 -0
  14. package/dist/martyrs/src/components/FieldTags/FieldTags.vue2.cjs.map +1 -0
  15. package/dist/martyrs/src/components/FieldTags/FieldTags.vue2.js +235 -0
  16. package/dist/martyrs/src/components/FieldTags/FieldTags.vue2.js.map +1 -0
  17. package/dist/martyrs/src/components/Marquee/Marquee.vue.cjs +17 -8
  18. package/dist/martyrs/src/components/Marquee/Marquee.vue.cjs.map +1 -1
  19. package/dist/martyrs/src/components/Marquee/Marquee.vue.js +17 -8
  20. package/dist/martyrs/src/components/Marquee/Marquee.vue.js.map +1 -1
  21. package/dist/martyrs/src/components/Spoiler/{Spoiler.vue.cjs → Spoiler.vue2.cjs} +2 -2
  22. package/dist/martyrs/src/components/Spoiler/Spoiler.vue2.cjs.map +1 -0
  23. package/dist/martyrs/src/components/Spoiler/{Spoiler.vue.js → Spoiler.vue2.js} +2 -2
  24. package/dist/martyrs/src/components/Spoiler/{Spoiler.vue.cjs.map → Spoiler.vue2.js.map} +1 -1
  25. package/dist/martyrs/src/components/Tab/{Tab.vue.cjs → Tab.vue2.cjs} +2 -2
  26. package/dist/martyrs/src/components/Tab/Tab.vue2.cjs.map +1 -0
  27. package/dist/martyrs/src/components/Tab/{Tab.vue.js → Tab.vue2.js} +2 -2
  28. package/dist/martyrs/src/components/Tab/{Tab.vue.cjs.map → Tab.vue2.js.map} +1 -1
  29. package/dist/martyrs/src/components/UploadImage/UploadImage.vue.cjs +161 -42
  30. package/dist/martyrs/src/components/UploadImage/UploadImage.vue.cjs.map +1 -1
  31. package/dist/martyrs/src/components/UploadImage/UploadImage.vue.js +162 -43
  32. package/dist/martyrs/src/components/UploadImage/UploadImage.vue.js.map +1 -1
  33. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.cjs +1 -1
  34. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +1 -1
  35. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs +1 -1
  36. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
  37. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.cjs +1 -1
  38. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.js +1 -1
  39. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +4 -4
  40. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.cjs +1 -1
  41. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +1 -1
  42. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.cjs +1 -1
  43. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +1 -1
  44. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.cjs +1 -1
  45. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +1 -1
  46. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +0 -3
  47. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs.map +1 -1
  48. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +0 -3
  49. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js.map +1 -1
  50. package/dist/martyrs/src/modules/constructor/components/elements/Card.vue.js +2 -2
  51. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +21 -21
  52. package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.cjs +1 -1
  53. package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.js +1 -1
  54. package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.cjs +1 -1
  55. package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.js +1 -1
  56. package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.cjs +1 -1
  57. package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.js +1 -1
  58. package/dist/martyrs/src/modules/globals/views/components/sections/SectionPageTitle.vue.cjs +1 -1
  59. package/dist/martyrs/src/modules/globals/views/components/sections/SectionPageTitle.vue.js +1 -1
  60. package/dist/martyrs/src/modules/globals/views/components/sections/Walkthrough.vue.cjs +1 -1
  61. package/dist/martyrs/src/modules/globals/views/components/sections/Walkthrough.vue.js +1 -1
  62. package/dist/martyrs/src/modules/landing/components/sections/SectionGuide.vue.cjs +1 -1
  63. package/dist/martyrs/src/modules/landing/components/sections/SectionGuide.vue.js +1 -1
  64. package/dist/martyrs/src/modules/marketplace/views/components/layouts/Marketplace.vue.cjs +1 -1
  65. package/dist/martyrs/src/modules/marketplace/views/components/layouts/Marketplace.vue.js +1 -1
  66. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +11 -11
  67. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +12 -12
  68. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +16 -16
  69. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +16 -16
  70. package/dist/martyrs/src/modules/notifications/components/pages/Notifications.vue.cjs +1 -1
  71. package/dist/martyrs/src/modules/notifications/components/pages/Notifications.vue.js +1 -1
  72. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs +1 -1
  73. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +1 -1
  74. package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.cjs +1 -1
  75. package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.js +1 -1
  76. package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.cjs +3 -4
  77. package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.cjs.map +1 -1
  78. package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.js +3 -4
  79. package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.js.map +1 -1
  80. package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.cjs +1 -1
  81. package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js +20 -20
  82. package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.cjs +3 -4
  83. package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.cjs.map +1 -1
  84. package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js +3 -4
  85. package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js.map +1 -1
  86. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +4 -5
  87. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs.map +1 -1
  88. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +4 -5
  89. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js.map +1 -1
  90. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs +3 -4
  91. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs.map +1 -1
  92. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +3 -4
  93. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js.map +1 -1
  94. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +1 -1
  95. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +7 -7
  96. package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.cjs +1 -1
  97. package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js +1 -1
  98. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs +1 -1
  99. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +1 -1
  100. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +46 -38
  101. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs.map +1 -1
  102. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +52 -44
  103. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js.map +1 -1
  104. package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs +1 -1
  105. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +1 -1
  106. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +1 -1
  107. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +1 -1
  108. package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs +2 -2
  109. package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +2 -2
  110. package/dist/martyrs/src/modules/products/components/sections/FilterProducts.vue.cjs +1 -1
  111. package/dist/martyrs/src/modules/products/components/sections/FilterProducts.vue.js +1 -1
  112. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.cjs +1 -1
  113. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +1 -1
  114. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs +1 -1
  115. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +1 -1
  116. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs +1 -1
  117. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js +1 -1
  118. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.cjs +1 -1
  119. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
  120. package/dist/martyrs/src/modules/spots/components/pages/Spot.vue.cjs +1 -1
  121. package/dist/martyrs/src/modules/spots/components/pages/Spot.vue.js +1 -1
  122. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.cjs +1 -1
  123. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +11 -11
  124. package/dist/martyrs.cjs.js +1 -1
  125. package/dist/martyrs.css +1 -1
  126. package/dist/martyrs.es.js +1 -1
  127. package/dist/node_modules/.pnpm/lodash.merge@4.6.2/node_modules/lodash.merge/index.cjs +1 -1
  128. package/dist/node_modules/.pnpm/lodash.merge@4.6.2/node_modules/lodash.merge/index.js +1 -1
  129. package/dist/style.css +129 -129
  130. package/dist/{web-DsdyXC8n.js → web-BklgIiYr.js} +1 -1
  131. package/dist/{web-C9bVm6Nw.cjs → web-CQBm7C6L.cjs} +1 -1
  132. package/package.json +1 -1
  133. package/src/components/FieldTags/BlockTags.vue +28 -16
  134. package/src/components/FieldTags/FieldTags.vue +327 -508
  135. package/src/components/Marquee/Marquee.vue +25 -14
  136. package/src/components/UploadImage/UploadImage.vue +192 -18
  137. package/src/modules/community/components/pages/CreateBlogPost.vue +0 -1
  138. package/src/modules/products/components/pages/CategoryEdit.vue +53 -39
  139. package/dist/_virtual/index3.cjs +0 -5
  140. package/dist/_virtual/index3.cjs.map +0 -1
  141. package/dist/_virtual/index3.js +0 -5
  142. package/dist/_virtual/index3.js.map +0 -1
  143. package/dist/main-7IA3UHca.cjs +0 -11
  144. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.cjs +0 -480
  145. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.cjs.map +0 -1
  146. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.js +0 -480
  147. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.js.map +0 -1
  148. package/dist/martyrs/src/components/FieldTags/create-tags.cjs +0 -52
  149. package/dist/martyrs/src/components/FieldTags/create-tags.cjs.map +0 -1
  150. package/dist/martyrs/src/components/FieldTags/create-tags.js +0 -52
  151. package/dist/martyrs/src/components/FieldTags/create-tags.js.map +0 -1
  152. package/dist/martyrs/src/components/FieldTags/tag-input.vue2.cjs +0 -32
  153. package/dist/martyrs/src/components/FieldTags/tag-input.vue2.cjs.map +0 -1
  154. package/dist/martyrs/src/components/FieldTags/tag-input.vue2.js +0 -32
  155. package/dist/martyrs/src/components/FieldTags/tag-input.vue2.js.map +0 -1
  156. package/dist/martyrs/src/components/FieldTags/vue-tags-input.props.cjs +0 -329
  157. package/dist/martyrs/src/components/FieldTags/vue-tags-input.props.cjs.map +0 -1
  158. package/dist/martyrs/src/components/FieldTags/vue-tags-input.props.js +0 -329
  159. package/dist/martyrs/src/components/FieldTags/vue-tags-input.props.js.map +0 -1
  160. package/dist/martyrs/src/components/Spoiler/Spoiler.vue.js.map +0 -1
  161. package/dist/martyrs/src/components/Tab/Tab.vue.js.map +0 -1
  162. package/dist/node_modules/.pnpm/fast-deep-equal@3.1.3/node_modules/fast-deep-equal/index.cjs +0 -39
  163. package/dist/node_modules/.pnpm/fast-deep-equal@3.1.3/node_modules/fast-deep-equal/index.cjs.map +0 -1
  164. package/dist/node_modules/.pnpm/fast-deep-equal@3.1.3/node_modules/fast-deep-equal/index.js +0 -39
  165. package/dist/node_modules/.pnpm/fast-deep-equal@3.1.3/node_modules/fast-deep-equal/index.js.map +0 -1
  166. package/src/components/FieldTags/FieldTagsNew.vue +0 -366
  167. package/src/components/FieldTags/README.md +0 -513
  168. package/src/components/FieldTags/create-tags.js +0 -97
  169. package/src/components/FieldTags/tag-input.vue +0 -55
  170. package/src/components/FieldTags/vue-tags-input.props.js +0 -342
  171. package/src/components/FieldTags/vue-tags-input.scss +0 -149
@@ -69,6 +69,7 @@ const loopInterval = ref(null)
69
69
  const resizeObserver = ref(null)
70
70
  const checkInterval = ref(null)
71
71
  const resizeTimeout = ref(null)
72
+ const previousSize = ref({ width: 0, height: 0 })
72
73
 
73
74
  const widthMin = ref('100%')
74
75
  const widthContainer = ref(0)
@@ -152,11 +153,22 @@ const checkForClone = async () => {
152
153
  resizeObserver.value.disconnect()
153
154
  }
154
155
 
155
- resizeObserver.value = new ResizeObserver(() => {
156
- clearTimeout(resizeTimeout.value)
157
- resizeTimeout.value = setTimeout(() => {
158
- calculateClones()
159
- }, 150)
156
+ resizeObserver.value = new ResizeObserver((entries) => {
157
+ const entry = entries[0]
158
+ const newWidth = entry.contentRect.width
159
+ const newHeight = entry.contentRect.height
160
+
161
+ // Only recalculate if size changed significantly (more than 1px)
162
+ const widthChanged = Math.abs(newWidth - previousSize.value.width) > 1
163
+ const heightChanged = Math.abs(newHeight - previousSize.value.height) > 1
164
+
165
+ if (widthChanged || heightChanged) {
166
+ previousSize.value = { width: newWidth, height: newHeight }
167
+ clearTimeout(resizeTimeout.value)
168
+ resizeTimeout.value = setTimeout(() => {
169
+ calculateClones()
170
+ }, 300)
171
+ }
160
172
  })
161
173
 
162
174
  resizeObserver.value.observe(marqueeOverlayContainer.value)
@@ -188,7 +200,7 @@ const getCurrentStyle = computed(() => {
188
200
  '--pauseOnHover': `${props.pauseOnHover ? 'paused' : 'running'}`,
189
201
  '--pauseOnClick': `${props.pauseOnClick ? 'paused' : 'running'}`,
190
202
  '--pauseAnimation': `${(props.vertical && verticalAnimationPause.value) || props.pause ? 'paused' : 'running'}`,
191
- '--gradient-color': `rgba(${props.gradientColor}, 1), rgba(${props.gradientColor}, 0)`,
203
+ '--gradient-color': props.gradientColor,
192
204
  '--gradient-length': `${gradientLength.value}`,
193
205
  '--min-width': `${widthMin.value}`,
194
206
  '--min-height': `${heightMin.value}`,
@@ -258,9 +270,9 @@ watch(
258
270
  (newVal, oldVal) => {
259
271
  if (newVal !== oldVal) {
260
272
  if (newVal) {
261
- emits('onResume')
262
- } else {
263
273
  emits('onPause')
274
+ } else {
275
+ emits('onResume')
264
276
  }
265
277
  }
266
278
  }
@@ -271,20 +283,19 @@ watch(
271
283
  .vue3-marquee {
272
284
  display: flex !important;
273
285
  position: relative;
286
+ will-change: transform;
287
+ transform: translateZ(0);
288
+ backface-visibility: hidden;
274
289
 
275
290
  .marquee {
276
291
  flex: 0 0 auto;
277
292
  min-width: var(--min-width);
278
293
  min-height: var(--min-height);
279
294
  z-index: 1;
280
- will-change: transform;
281
- transform: translateZ(0);
282
- backface-visibility: hidden;
283
295
 
284
296
  animation: var(--orientation) var(--duration) linear var(--delay) var(--loops);
285
297
  animation-play-state: var(--pauseAnimation);
286
298
  animation-direction: var(--direction);
287
- contain: layout style paint;
288
299
  }
289
300
 
290
301
  .overlay {
@@ -325,7 +336,7 @@ watch(
325
336
  }
326
337
 
327
338
  .overlay::before,.overlay::after {
328
- background: linear-gradient(to right, var(--gradient-color));
339
+ background: linear-gradient(to right, var(--gradient-color), transparent);
329
340
  height: 100%;
330
341
  width: var(--gradient-length);
331
342
  }
@@ -351,7 +362,7 @@ watch(
351
362
  }
352
363
 
353
364
  .overlay::before, .overlay::after {
354
- background: linear-gradient(to bottom, var(--gradient-color));
365
+ background: linear-gradient(to bottom, var(--gradient-color), transparent);
355
366
  height: var(--gradient-length);
356
367
  width: 100%;
357
368
  }
@@ -1,40 +1,116 @@
1
1
  <template>
2
- <div
3
- @click="onComponentClick"
4
- @drop="onDrop"
5
- @dragover.prevent
6
- class="image-upload-area flex-v-center flex-h-center flex">
2
+ <div class="upload-image-wrapper flex-v-center flex-nowrap flex gap-small" :class="{'with-text': text}">
3
+ <div
4
+ @click="onComponentClick"
5
+ @drop="onDrop"
6
+ @dragover.prevent
7
+ class="pos-relative bg-light radius-small br-solid br-1px br-black-transp-10 h-100 aspect-1x1 flex-v-center flex-h-center flex cursor-pointer"
8
+ >
7
9
  <img loading="lazy"
8
- v-if="imageUrl || photo"
9
- :src="(FILE_SERVER_URL || '') + (imageUrl || photo)"
10
+ v-if="imageUrl || photo || previewUrl"
11
+ :src="previewUrl || (FILE_SERVER_URL || '') + (imageUrl || photo)"
10
12
  alt="Uploaded image"
11
- class="w-100 h-100 object-fit-cover"
12
- />
13
+ class="pos-absolute z-index-1 w-100 h-100 object-fit-cover"
14
+ />
13
15
 
14
- <div v-else class="flex-v-center flex-h-center flex w-100 h-100 bg-second" >
15
- <svg class="i-medium" width="104" height="104" viewBox="0 0 104 104" fill="none" xmlns="http://www.w3.org/2000/svg">
16
- <path fill="rgb(var(--white))" d="M21.2784 37.2973C18.8466 34.6628 18.8466 30.6098 21.2784 27.9753L47.2179 2.03584C48.6364 0.81993 50.2577 0.211974 51.8789 0.211974C53.5001 0.211974 55.1213 0.81993 56.5399 2.03584L82.4793 27.9753C84.9111 30.6098 84.9111 34.6628 82.4793 37.2973C79.8448 39.7291 75.7918 39.7291 73.1573 37.2973L58.3637 22.301V71.5454C58.3637 75.1932 55.5266 78.0303 51.8789 78.0303C48.2311 78.0303 45.394 75.1932 45.394 71.5454V22.301L30.6004 37.2973C27.966 39.7291 23.9129 39.7291 21.2784 37.2973ZM97.2729 71.5454C100.921 71.5454 103.758 74.3825 103.758 78.0303V97.4849C103.758 101.133 100.921 103.97 97.2729 103.97H6.48486C2.83713 103.97 0 101.133 0 97.4849V78.0303C0 74.3825 2.83713 71.5454 6.48486 71.5454H38.9092C38.9092 78.6382 44.7861 84.5151 51.8789 84.5151C58.9717 84.5151 64.8486 78.6382 64.8486 71.5454H97.2729ZM87.5456 92.6212C90.1801 92.6212 92.4092 90.392 92.4092 87.7576C92.4092 85.1231 90.1801 82.8939 87.5456 82.8939C84.9111 82.8939 82.682 85.1231 82.682 87.7576C82.682 90.392 84.9111 92.6212 87.5456 92.6212Z"/>
17
- </svg>
16
+ <div v-else class="flex-v-center z-index-2 flex-h-center flex w-100 h-100 bg-second" >
17
+ <IconUpload class="i-medium upload-icon" fill="rgb(var(--white))" />
18
+ </div>
19
+
20
+ <!-- Hover controls -->
21
+ <div class="z-index-2 hover-controls pos-absolute w-100 h-100 flex-v-center flex-h-center flex">
22
+ <div v-if="!imageUrl && !photo && !previewUrl" class="hover-upload-icon">
23
+ <IconUpload class="i-medium" fill="rgb(var(--white))" />
24
+ </div>
25
+ <div v-else class="hover-buttons flex gap-small">
26
+ <button @click.stop="onComponentClick" class="hover-button radius-small pd-thin bg-main t-white br-none cursor-pointer">
27
+ <IconUpload class="i-semi" fill="rgb(var(--white))" />
28
+ </button>
29
+ <button @click.stop="deleteImage" class="hover-button radius-small pd-thin bg-danger t-white br-none cursor-pointer">
30
+ <IconDelete class="i-semi" fill="rgb(var(--white))" />
31
+ </button>
32
+ </div>
33
+ </div>
34
+
35
+ <!-- Loading overlay -->
36
+ <div v-if="loading" class="z-index-2 loading-overlay pos-absolute w-100 h-100 flex-v-center flex-h-center flex">
37
+ <Loader :centered="false" />
18
38
  </div>
19
39
 
20
40
  <input type="file" name="file" ref="fileInput" @change="onFileChange" style="display: none"/>
41
+ </div>
42
+
43
+ <!-- Text block -->
44
+ <div v-if="text" class="upload-text-block flex flex-column">
45
+ <span class="mn-b-small t-medium">{{ textConfig.title }}</span>
46
+ <span class="mn-b-medium t-transp">{{ textConfig.subtitle }}</span>
47
+ <div v-if="!imageUrl && !photo && !previewUrl">
48
+ <button @click="onComponentClick" class="button button-small w-max bg-main t-black cursor-pointer">
49
+ {{ textConfig.buttonText }}
50
+ </button>
51
+ </div>
52
+ <div v-else class="flex gap-thin">
53
+ <button @click="onComponentClick" class="button button-small w-max bg-second t-white cursor-pointer">
54
+ Upload
55
+ </button>
56
+ <button @click="deleteImage" class="button button-small w-max bg-red t-white cursor-pointer">
57
+ Delete
58
+ </button>
59
+ </div>
60
+ </div>
21
61
  </div>
22
62
  </template>
23
63
 
24
64
  <script setup>
25
- import { ref, watch } from 'vue';
65
+ import { ref, watch, computed } from 'vue';
26
66
  import axios from 'axios';
67
+ import Loader from '@martyrs/src/components/Loader/Loader.vue';
68
+ import IconUpload from '@martyrs/src/modules/icons/navigation/IconUpload.vue';
69
+ import IconDelete from '@martyrs/src/modules/icons/navigation/IconDelete.vue';
27
70
 
28
71
  const imageUrl = ref(null);
29
72
  const fileInput = ref(null);
73
+ const previewUrl = ref(null);
74
+ const loading = ref(false);
30
75
 
31
- const props = defineProps([
32
- 'uploadPath', // only necessary prop
33
- 'photo' // new prop for holding the image url
34
- ]);
76
+ const props = defineProps({
77
+ uploadPath: {
78
+ type: String,
79
+ required: true
80
+ },
81
+ photo: {
82
+ type: String,
83
+ default: null
84
+ },
85
+ text: {
86
+ type: [Object, Boolean],
87
+ default: null
88
+ }
89
+ });
35
90
 
36
91
  const emit = defineEmits(['update:photo', 'error']);
37
92
 
93
+ // Text configuration with defaults
94
+ const textConfig = computed(() => {
95
+ const defaults = {
96
+ title: 'Upload Image',
97
+ subtitle: 'Drag & drop your image here or click button. Supported: JPG, PNG, GIF. Max size: 2MB',
98
+ buttonText: 'Choose Image'
99
+ };
100
+
101
+ if (props.text === true) {
102
+ return defaults;
103
+ } else if (typeof props.text === 'object' && props.text !== null) {
104
+ return {
105
+ title: props.text.title || defaults.title,
106
+ subtitle: props.text.subtitle || defaults.subtitle,
107
+ buttonText: props.text.buttonText || defaults.buttonText
108
+ };
109
+ }
110
+
111
+ return defaults;
112
+ });
113
+
38
114
  watch(props, ({photo}) => {
39
115
  if(photo) imageUrl.value = photo;
40
116
  });
@@ -50,10 +126,19 @@ async function onFileChange(e) {
50
126
  return;
51
127
  }
52
128
 
129
+ // Create preview from file
130
+ const reader = new FileReader();
131
+ reader.onload = (e) => {
132
+ previewUrl.value = e.target.result;
133
+ };
134
+ reader.readAsDataURL(file);
135
+
53
136
  let formData = new FormData();
54
137
  formData.append("file", file);
55
138
 
56
139
  console.log("Sending file:", file.name); // Логируем имя файла перед отправкой
140
+
141
+ loading.value = true;
57
142
 
58
143
  try {
59
144
  const $axios = axios.create({ baseURL: process.env.API_URL, withCredentials: true });
@@ -61,10 +146,14 @@ async function onFileChange(e) {
61
146
  let response = await $axios.post(`/api/upload/multiple?folderName=${encodeURIComponent(props.uploadPath)}`, formData);
62
147
  console.log("Upload response:", response); // Логируем ответ сервера
63
148
  imageUrl.value = response.data[0].filepath;
149
+ previewUrl.value = null; // Clear preview after successful upload
64
150
  emit('update:photo', imageUrl.value);
65
151
  } catch (error) {
66
152
  emit('error', error);
67
153
  console.error("Upload error:", error); // Логируем ошибку
154
+ previewUrl.value = null; // Clear preview on error
155
+ } finally {
156
+ loading.value = false;
68
157
  }
69
158
  }
70
159
 
@@ -77,4 +166,89 @@ function onDrop(e) {
77
166
  }
78
167
  });
79
168
  }
169
+
170
+ function deleteImage() {
171
+ imageUrl.value = null;
172
+ previewUrl.value = null;
173
+ emit('update:photo', null);
174
+ // Reset file input
175
+ if (fileInput.value) {
176
+ fileInput.value.value = '';
177
+ }
178
+ }
80
179
  </script>
180
+
181
+ <style scoped>
182
+ .image-upload-area {
183
+ overflow: hidden;
184
+ transition: all 0.3s ease;
185
+ }
186
+
187
+ .image-upload-area:hover {
188
+ opacity: 0.95;
189
+ }
190
+
191
+ /* Hover controls */
192
+ .hover-controls {
193
+ top: 0;
194
+ left: 0;
195
+ background: rgba(0, 0, 0, 0.7);
196
+ opacity: 0;
197
+ transition: opacity 0.3s ease;
198
+ pointer-events: none;
199
+ }
200
+
201
+ .image-upload-area:hover .hover-controls {
202
+ opacity: 1;
203
+ pointer-events: all;
204
+ }
205
+
206
+ .hover-upload-icon {
207
+ animation: pulse 1.5s infinite;
208
+ }
209
+
210
+ .hover-button {
211
+ transition: transform 0.2s ease, background-color 0.2s ease;
212
+ }
213
+
214
+ .hover-button:hover {
215
+ transform: scale(1.1);
216
+ }
217
+
218
+ .hover-button:active {
219
+ transform: scale(0.95);
220
+ }
221
+
222
+ /* Loading overlay */
223
+ .loading-overlay {
224
+ top: 0;
225
+ left: 0;
226
+ background: rgba(255, 255, 255, 0.9);
227
+ z-index: 10;
228
+ }
229
+
230
+ /* Animations */
231
+ @keyframes pulse {
232
+ 0% {
233
+ transform: scale(1);
234
+ opacity: 1;
235
+ }
236
+ 50% {
237
+ transform: scale(1.05);
238
+ opacity: 0.8;
239
+ }
240
+ 100% {
241
+ transform: scale(1);
242
+ opacity: 1;
243
+ }
244
+ }
245
+
246
+ /* Upload icon in empty state */
247
+ .upload-icon {
248
+ transition: transform 0.3s ease;
249
+ }
250
+
251
+ .image-upload-area:hover .upload-icon {
252
+ transform: scale(1.1);
253
+ }
254
+ </style>
@@ -130,7 +130,6 @@ import Textarea from '@martyrs/src/modules/constructor/components/elements/Texta
130
130
  import Constructor from '@martyrs/src/modules/constructor/components/sections/Constructor.vue';
131
131
 
132
132
  import Popup from '@martyrs/src/components/Popup/Popup.vue'
133
- import FieldTags from '@martyrs/src/components/FieldTags/FieldTags.vue'
134
133
  import BlockTags from '@martyrs/src/components/FieldTags/BlockTags.vue'
135
134
  import Checkbox from '@martyrs/src/components/Checkbox/Checkbox.vue'
136
135
  import Field from '@martyrs/src/components/Field/Field.vue'
@@ -17,36 +17,41 @@
17
17
  title="Profile"
18
18
  class="mn-b-thin"
19
19
  >
20
- <div class="cols-auto-1fr mn-b-thin w-100 ">
20
+
21
+ <Select
22
+ v-model:select="categories.state.current.status"
23
+ label="Status"
24
+ :options="[
25
+ 'draft',
26
+ 'internal',
27
+ 'published',
28
+ 'removed'
29
+ ]"
30
+ placeholder="Select category"
31
+ class="pos-relative mn-b-thin w-100 bg-white radius-small pd-medium"
32
+ />
33
+
34
+ <Field
35
+ v-model:field="categories.state.current.name"
36
+ label="Name"
37
+ placeholder="Enter category name"
38
+ class="w-100 mn-b-thin bg-white radius-small pd-medium"
39
+ />
40
+
41
+ <div class="w-100 mn-b-thin bg-white radius-small pd-medium cols-1">
21
42
  <UploadImage
22
- v-model:photo="categories.state.current.photo"
43
+ v-model:photo="categories.state.current.photo"
23
44
  :uploadPath="'categories'"
24
- class="aspect-1x1 h-100 o-hidden mn-r-small radius-extra"
45
+ :text="{
46
+ title: 'Upload category image',
47
+ subtitle: 'Supported: JPG, PNG, GIF. Max size: 5MB',
48
+ buttonText: 'Select Image'
49
+ }"
50
+ class="pos-relative"
25
51
  />
26
- <Field
27
- v-model:field="categories.state.current.name"
28
- label="Name"
29
- placeholder="Enter category name"
30
- class="w-100 bg-white radius-small pd-medium"
31
- />
32
52
  </div>
33
53
 
34
- <div class="mn-b-thin w-100 flex-nowrap gap-thin flex">
35
- <Field
36
- v-model:field="categories.state.current.order"
37
- label="Order"
38
- :disabled="true"
39
- class="w-40 bg-white radius-small pd-medium"
40
- />
41
- <Field
42
- v-model:field="categories.state.current.slug"
43
- label="Slug"
44
- placeholder="Enter category slug"
45
- :disabled="route.params.category ? true : false"
46
- class="w-100 bg-white radius-small pd-medium"
47
- />
48
- </div>
49
-
54
+
50
55
  <Field
51
56
  v-if="route.params.category"
52
57
  v-model:field="categories.state.current.url"
@@ -54,19 +59,25 @@
54
59
  :disabled="true"
55
60
  class="w-100 bg-white radius-small pd-medium mn-b-thin"
56
61
  />
62
+
57
63
 
58
- <Select
59
- v-model:select="categories.state.current.status"
60
- label="Status"
61
- :options="[
62
- 'draft',
63
- 'internal',
64
- 'published',
65
- 'removed'
66
- ]"
67
- placeholder="Select category"
68
- class="pos-relative w-100 bg-white radius-small pd-medium"
69
- />
64
+ <div class="mn-b-thin w-100 flex-nowrap gap-thin flex">
65
+ <Field
66
+ v-model:field="categories.state.current.order"
67
+ label="Order"
68
+ :disabled="true"
69
+ class="w-40 bg-white radius-small pd-medium"
70
+ />
71
+ <Field
72
+ v-model:field="categories.state.current.slug"
73
+ label="Slug"
74
+ placeholder="Enter category slug"
75
+ :disabled="route.params.category ? true : false"
76
+ class="w-100 bg-white radius-small pd-medium"
77
+ />
78
+ </div>
79
+
80
+
70
81
 
71
82
  <!-- <div class="flex-v-center flex-nowrap flex">
72
83
  <h4 class="mn-r-thin t-medium">Localization</h4>
@@ -125,8 +136,11 @@
125
136
  class="w-100 bg-white radius-small pd-medium"
126
137
  />
127
138
  <FieldTags
128
- v-model:tags="item.options"
129
- placeholder="Add filter options"
139
+ v-model="item.options"
140
+ :placeholder="'Add filter options'"
141
+ :separators="[',', ';']"
142
+ :add-on-key="[13, ',', ';']"
143
+ :max-tags="20"
130
144
  class="w-100 bg-white radius-small pd-medium"
131
145
  />
132
146
  <div
@@ -1,5 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- var lodash_merge = { exports: {} };
4
- exports.__module = lodash_merge;
5
- //# sourceMappingURL=index3.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index3.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,5 +0,0 @@
1
- var lodash_merge = { exports: {} };
2
- export {
3
- lodash_merge as __module
4
- };
5
- //# sourceMappingURL=index3.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}