@ozdao/martyrs 0.2.468 → 0.2.470

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 (135) hide show
  1. package/dist/{Media-DwVcRIAX.mjs → Media-C4Ges_Sd.mjs} +1 -1
  2. package/dist/{Media-DCGbUujy.js → Media-CR0V1zvB.js} +1 -1
  3. package/dist/chats.server.js +14 -13
  4. package/dist/chats.server.mjs +14 -13
  5. package/dist/globals.server.js +20 -12
  6. package/dist/globals.server.mjs +20 -12
  7. package/dist/{main-DEHjtgLs.mjs → main-CTcal9qN.mjs} +900 -884
  8. package/dist/{main-UVdexuMN.js → main-CsZAG5Wz.js} +5 -5
  9. package/dist/martyrs/src/components/Block/Block.vue.cjs +1 -1
  10. package/dist/martyrs/src/components/Block/Block.vue.js +1 -1
  11. package/dist/martyrs/src/components/SelectMulti/{SelectMulti.vue2.cjs → SelectMulti.vue.cjs} +2 -2
  12. package/dist/martyrs/src/components/SelectMulti/{SelectMulti.vue2.js.map → SelectMulti.vue.cjs.map} +1 -1
  13. package/dist/martyrs/src/components/SelectMulti/{SelectMulti.vue2.js → SelectMulti.vue.js} +2 -2
  14. package/dist/martyrs/src/components/SelectMulti/SelectMulti.vue.js.map +1 -0
  15. package/dist/martyrs/src/components/Tooltip/{Tooltip.vue.cjs → Tooltip.vue2.cjs} +2 -2
  16. package/dist/martyrs/src/components/Tooltip/Tooltip.vue2.cjs.map +1 -0
  17. package/dist/martyrs/src/components/Tooltip/{Tooltip.vue.js → Tooltip.vue2.js} +2 -2
  18. package/dist/martyrs/src/components/Tooltip/{Tooltip.vue.cjs.map → Tooltip.vue2.js.map} +1 -1
  19. package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.cjs +1 -1
  20. package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.js +1 -1
  21. package/dist/martyrs/src/modules/chats/store/chat.store.cjs +47 -16
  22. package/dist/martyrs/src/modules/chats/store/chat.store.cjs.map +1 -1
  23. package/dist/martyrs/src/modules/chats/store/chat.store.js +47 -16
  24. package/dist/martyrs/src/modules/chats/store/chat.store.js.map +1 -1
  25. package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.cjs +1 -1
  26. package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.cjs.map +1 -1
  27. package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.js +1 -1
  28. package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.js.map +1 -1
  29. package/dist/martyrs/src/modules/community/components/pages/Blog.vue.cjs +1 -1
  30. package/dist/martyrs/src/modules/community/components/pages/Blog.vue.cjs.map +1 -1
  31. package/dist/martyrs/src/modules/community/components/pages/Blog.vue.js +1 -1
  32. package/dist/martyrs/src/modules/community/components/pages/Blog.vue.js.map +1 -1
  33. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.cjs +4 -1
  34. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.cjs.map +1 -1
  35. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +4 -1
  36. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js.map +1 -1
  37. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +3 -3
  38. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs.map +1 -1
  39. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +3 -3
  40. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js.map +1 -1
  41. package/dist/martyrs/src/modules/constructor/components/elements/VideoPlayer.vue.cjs +1 -1
  42. package/dist/martyrs/src/modules/constructor/components/elements/VideoPlayer.vue.cjs.map +1 -1
  43. package/dist/martyrs/src/modules/constructor/components/elements/VideoPlayer.vue.js +1 -1
  44. package/dist/martyrs/src/modules/constructor/components/elements/VideoPlayer.vue.js.map +1 -1
  45. package/dist/martyrs/src/modules/constructor/components/sections/Constructor.vue.cjs +9 -9
  46. package/dist/martyrs/src/modules/constructor/components/sections/Constructor.vue.cjs.map +1 -1
  47. package/dist/martyrs/src/modules/constructor/components/sections/Constructor.vue.js +9 -9
  48. package/dist/martyrs/src/modules/constructor/components/sections/Constructor.vue.js.map +1 -1
  49. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs +2 -2
  50. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs.map +1 -1
  51. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +2 -2
  52. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js.map +1 -1
  53. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs +1 -1
  54. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +1 -1
  55. package/dist/martyrs/src/modules/globals/globals.client.cjs +0 -9
  56. package/dist/martyrs/src/modules/globals/globals.client.cjs.map +1 -1
  57. package/dist/martyrs/src/modules/globals/globals.client.js +0 -9
  58. package/dist/martyrs/src/modules/globals/globals.client.js.map +1 -1
  59. package/dist/martyrs/src/modules/globals/views/classes/globals.websocket.cjs +40 -97
  60. package/dist/martyrs/src/modules/globals/views/classes/globals.websocket.cjs.map +1 -1
  61. package/dist/martyrs/src/modules/globals/views/classes/globals.websocket.js +40 -97
  62. package/dist/martyrs/src/modules/globals/views/classes/globals.websocket.js.map +1 -1
  63. package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.cjs +1 -1
  64. package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.js +1 -1
  65. package/dist/martyrs/src/modules/icons/skeletons/SkeletonBlogpost.vue.cjs +1 -1
  66. package/dist/martyrs/src/modules/icons/skeletons/SkeletonBlogpost.vue.cjs.map +1 -1
  67. package/dist/martyrs/src/modules/icons/skeletons/SkeletonBlogpost.vue.js +1 -1
  68. package/dist/martyrs/src/modules/icons/skeletons/SkeletonBlogpost.vue.js.map +1 -1
  69. package/dist/martyrs/src/modules/notifications/notifications.client.cjs +35 -9
  70. package/dist/martyrs/src/modules/notifications/notifications.client.cjs.map +1 -1
  71. package/dist/martyrs/src/modules/notifications/notifications.client.js +35 -9
  72. package/dist/martyrs/src/modules/notifications/notifications.client.js.map +1 -1
  73. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderUser.vue.cjs +1 -1
  74. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderUser.vue.js +1 -1
  75. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.cjs +1 -1
  76. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +1 -1
  77. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.cjs +7 -7
  78. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.cjs.map +1 -1
  79. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js +8 -8
  80. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js.map +1 -1
  81. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs +1 -1
  82. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +1 -1
  83. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +1 -1
  84. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +1 -1
  85. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.cjs +1 -1
  86. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +1 -1
  87. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +1 -1
  88. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +1 -1
  89. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.cjs +1 -1
  90. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +1 -1
  91. package/dist/martyrs/src/modules/products/components/blocks/CardPosition.vue.cjs +1 -1
  92. package/dist/martyrs/src/modules/products/components/blocks/CardPosition.vue.js +1 -1
  93. package/dist/martyrs/src/modules/products/components/pages/EditLeftover.vue.cjs +1 -1
  94. package/dist/martyrs/src/modules/products/components/pages/EditLeftover.vue.js +1 -1
  95. package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs +6 -5
  96. package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs.map +1 -1
  97. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +6 -5
  98. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js.map +1 -1
  99. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.cjs +1 -1
  100. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +1 -1
  101. package/dist/martyrs.cjs.js +1 -1
  102. package/dist/martyrs.css +1 -1
  103. package/dist/martyrs.es.js +1 -1
  104. package/dist/notifications.server.js +69 -13
  105. package/dist/notifications.server.mjs +69 -13
  106. package/dist/orders.server.js +1 -0
  107. package/dist/orders.server.mjs +1 -0
  108. package/package.json +1 -1
  109. package/src/components/Shader/Shader.vue +44 -25
  110. package/src/modules/chats/routes/chats.routes.js +21 -17
  111. package/src/modules/chats/store/chat.store.js +55 -28
  112. package/src/modules/community/components/blocks/CardBlogpost.vue +1 -1
  113. package/src/modules/community/components/pages/Blog.vue +1 -1
  114. package/src/modules/community/components/pages/BlogPost.vue +1 -0
  115. package/src/modules/community/components/pages/CreateBlogPost.vue +3 -3
  116. package/src/modules/constructor/components/elements/VideoPlayer.vue +1 -1
  117. package/src/modules/constructor/components/sections/Constructor.vue +9 -9
  118. package/src/modules/events/components/pages/EditEvent.vue +1 -1
  119. package/src/modules/globals/controllers/classes/globals.websocket.js +29 -21
  120. package/src/modules/globals/globals.client.js +0 -12
  121. package/src/modules/globals/views/classes/globals.websocket.js +46 -146
  122. package/src/modules/icons/skeletons/SkeletonBlogpost.vue +2 -2
  123. package/src/modules/notifications/controllers/notifications.controller.js +2 -2
  124. package/src/modules/notifications/notifications.client.js +57 -19
  125. package/src/modules/notifications/notifications.server.js +3 -1
  126. package/src/modules/notifications/routes/notifications.routes.js +2 -2
  127. package/src/modules/notifications/services/notification.service.js +34 -15
  128. package/src/modules/notifications/services/web-push.service.js +7 -6
  129. package/src/modules/orders/components/pages/OrderCreate.vue +3 -4
  130. package/src/modules/orders/controllers/orders.controller.js +2 -0
  131. package/src/modules/products/components/pages/Product.vue +7 -6
  132. package/dist/martyrs/src/components/SelectMulti/SelectMulti.vue2.cjs.map +0 -1
  133. package/dist/martyrs/src/components/Tooltip/Tooltip.vue.js.map +0 -1
  134. package/src/modules/notifications/notifications2.client.js +0 -256
  135. package/src/modules/notifications/services/websocket.service.js +0 -100
@@ -28,7 +28,7 @@ const _hoisted_7 = ["src"];
28
28
  const _hoisted_8 = {
29
29
  key: 1,
30
30
  controls: "",
31
- class: "mn-b-medium object-fit-cover w-100 h-max-20r"
31
+ class: "mn-b-medium object-fit-fit bg-black w-100 h-max-20r"
32
32
  };
33
33
  const _hoisted_9 = ["src"];
34
34
  const _sfc_main = {
@@ -1 +1 @@
1
- {"version":3,"file":"CardBlogpost.vue.cjs","sources":["../../../../../../../src/modules/community/components/blocks/CardBlogpost.vue"],"sourcesContent":["<template>\n\t<article \n\t\tclass=\"pos-relative flex-column flex\"\n\t>\n\t\t<CardHeader \n\t :class=\"{\n\t \t'mn-b-small pd-medium': type !== 'short',\n\t \t'flex-child-order-last flex-child mn-l-small': type === 'short',\n\t }\"\n\t :entity=\"blogpost\"\n\t :entityType=\"'blogpost'\"\n\t :user=\"user\"\n\t :owner=\"blogpost.owner\" \n \t:creator=\"blogpost.creator\"\n \t:date=\"blogpost.createdAt\"\n \t:actions=\"user && user === blogpost.creator.target._id ? [\n { to: { name: 'Edit BlogPost', params: {url: blogpost.url } }, label: 'Edit' }\n ]: null\"\n\t\t/>\n\n\t\n\t\t<section\n\t\t\tclass=\"pd-t-zero pd-b-zero pd-medium\"\n\t\t>\n\t\t\t\n\t\t\t<div v-if=\"type !== 'blogpostPage'\" class=\"cursor-pointer mn-b-thin flex-nowrap flex w-100\">\n\n\t\t\t\t<Text \n\t\t\t\t\tv-if=\"!hideTitle\"\n\t\t\t\t \t:text=\"blogpost.name || ''\" \n\t\t\t\t \t:maxLen=\"80\" \n\t\t\t\t \tclass=\"h3 d-block\"\n\t\t\t\t \t@click=\"router.push({\n\t\t\t\t\t\tname: 'BlogPost', \n\t\t\t\t\t\tparams: { \n\t\t\t\t\t\t\turl: blogpost.url \n\t\t\t\t\t\t}\n\t\t\t\t\t})\"\n\t\t\t\t/>\n\n\t\t\t\t<div \n\t\t\t\t\tv-if=\"blogpost.status === 'draft'\" \n\t\t\t\t\tclass=\"pd-micro t-white uppercase t-semi p-small flex-center flex pd-r-small pd-l-small mn-l-thin w-min bg-second radius-extra\"\n\t\t\t\t>\n\t\t\t\t\t{{blogpost.status}}\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t</div>\n\t\t\t\n\t\t\t<p \n\t\t\t\tv-if=\"firstText && firstText.content && type !== 'blogpostPage' && !hideDescription\" \n\t\t\t\tclass='mn-b-small t-transp p-big'\n\t\t\t>\n\t\t\t\t{{firstText.content.slice(0,120)}}...\n\t\t\t</p>\n\n\t\t\t<h3 \n\t\t\t\tv-if=\"type === 'blogpostPage' && !hideTitle\" \n\t\t\t\tclass=\"mn-b-small h2\"\n\t\t\t>\n\t\t\t\t{{blogpost.name}}\n\t\t\t</h3>\n\n\t\t\t<slot></slot>\n\n\t\t\t<!-- <Chips \n \tv-if=\"type !== 'short' && blogpost.tags?.length > 0\" \n \t:chips=\"blogpost.tags\"\n \t/> -->\n\n\t\t</section>\n\n\t\t\t<!-- <Image :prop=\"{content:firstImage.content}\" class=\"h-100\"/> -->\n\n\t\t<template\n\t\t\tv-if=\"firstImage && firstImage.content && type !== 'blogpostPage'\"\n\t\t>\n\t\t\t<img loading=\"lazy\" \n\t\t\t\t:src=\"(FILE_SERVER_URL || '') + firstImage.content\" \n\t\t\t\talt=\"Blog post image\" \n\t\t\t\tclass=\"mn-b-medium object-fit-cover w-100 h-min-10r h-100\"\n\t\t\t/>\n\t\t</template>\n\n\t\t<template\n\t\t\tv-if=\"!firstImage?.content && firstVideo && firstVideo.content && type !== 'blogpostPage'\"\n\t\t>\n\t\t\t<!-- <div class=\"flex-center flex\"> -->\n\t <video controls class=\"mn-b-medium object-fit-cover w-100 h-max-20r\">\n\t <source :src=\"firstVideo.content\" type=\"video/mp4\">\n\t Your browser does not support the video tag.\n\t </video>\n\t <!-- </div> -->\n\t\t</template>\n\n\t\t\n\t\t<FooterBlogpost \n\t\t\tclass=\"pd-t-zero pd-medium\" \n\t\t\t:blogpost=\"blogpost\" :user=\"user\"\n\t\t/>\n\t\n\t</article>\n\n</template>\n\n\n<script setup=\"props\">\n\timport CardHeader from '@martyrs/src/modules/globals/views/components/blocks/CardHeader.vue'\n\timport FooterBlogpost from '@martyrs/src/modules/community/components/blocks/FooterBlogpost.vue'\t\n\n\timport Image from '@martyrs/src/modules/constructor/components/elements/Image.vue';\n\n import Text from '@martyrs/src/components/Text/Text.vue'\n\timport Chips from '@martyrs/src/components/Chips/Chips.vue'\n\n\timport IconEdit from '@martyrs/src/modules/icons/navigation/IconEdit.vue'\n\n\timport { computed } from 'vue'\n\n\timport { useRouter } from 'vue-router'\n\n\tconst router = useRouter()\n\n\tconst props = defineProps({\n\t\tblogpost: {\n\t\t\ttype: Object,\n\t\t},\n\t\tuser: {\n\t\t\ttype: String,\n\t\t},\n\t\ttype: {\n\t\t\ttype: String,\n\t\t},\n\t\thideDescription: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t},\n\t\thideTitle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\n\t})\n\n const firstImage = computed(() => {\n\t return props.blogpost.content.find(block => block.type === 'ImageUpload');\n\t});\n\n\tconst firstVideo = computed(() => {\n\t return props.blogpost.content.find(block => block.type === 'Video');\n\t});\n\n\tconst firstText = computed(() => {\n\t return props.blogpost.content.find(block => \n\t block.type === 'Textarea' && block.class !== 'h2'\n\t );\n\t});\n\n</script>\n\n<style lang=\"scss\">\n</style>\n\n\n"],"names":["useRouter","computed"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyHC,UAAM,SAASA,UAAS,UAAA;AAExB,UAAM,QAAQ;AAoBb,UAAM,aAAaC,IAAAA,SAAS,MAAM;AACjC,aAAO,MAAM,SAAS,QAAQ,KAAK,WAAS,MAAM,SAAS,aAAa;AAAA,IAC3E,CAAE;AAED,UAAM,aAAaA,IAAAA,SAAS,MAAM;AAChC,aAAO,MAAM,SAAS,QAAQ,KAAK,WAAS,MAAM,SAAS,OAAO;AAAA,IACrE,CAAE;AAED,UAAM,YAAYA,IAAAA,SAAS,MAAM;AAC/B,aAAO,MAAM,SAAS,QAAQ;AAAA,QAAK,WACjC,MAAM,SAAS,cAAc,MAAM,UAAU;AAAA,MAC9C;AAAA,IACJ,CAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"CardBlogpost.vue.cjs","sources":["../../../../../../../src/modules/community/components/blocks/CardBlogpost.vue"],"sourcesContent":["<template>\n\t<article \n\t\tclass=\"pos-relative flex-column flex\"\n\t>\n\t\t<CardHeader \n\t :class=\"{\n\t \t'mn-b-small pd-medium': type !== 'short',\n\t \t'flex-child-order-last flex-child mn-l-small': type === 'short',\n\t }\"\n\t :entity=\"blogpost\"\n\t :entityType=\"'blogpost'\"\n\t :user=\"user\"\n\t :owner=\"blogpost.owner\" \n \t:creator=\"blogpost.creator\"\n \t:date=\"blogpost.createdAt\"\n \t:actions=\"user && user === blogpost.creator.target._id ? [\n { to: { name: 'Edit BlogPost', params: {url: blogpost.url } }, label: 'Edit' }\n ]: null\"\n\t\t/>\n\n\t\n\t\t<section\n\t\t\tclass=\"pd-t-zero pd-b-zero pd-medium\"\n\t\t>\n\t\t\t\n\t\t\t<div v-if=\"type !== 'blogpostPage'\" class=\"cursor-pointer mn-b-thin flex-nowrap flex w-100\">\n\n\t\t\t\t<Text \n\t\t\t\t\tv-if=\"!hideTitle\"\n\t\t\t\t \t:text=\"blogpost.name || ''\" \n\t\t\t\t \t:maxLen=\"80\" \n\t\t\t\t \tclass=\"h3 d-block\"\n\t\t\t\t \t@click=\"router.push({\n\t\t\t\t\t\tname: 'BlogPost', \n\t\t\t\t\t\tparams: { \n\t\t\t\t\t\t\turl: blogpost.url \n\t\t\t\t\t\t}\n\t\t\t\t\t})\"\n\t\t\t\t/>\n\n\t\t\t\t<div \n\t\t\t\t\tv-if=\"blogpost.status === 'draft'\" \n\t\t\t\t\tclass=\"pd-micro t-white uppercase t-semi p-small flex-center flex pd-r-small pd-l-small mn-l-thin w-min bg-second radius-extra\"\n\t\t\t\t>\n\t\t\t\t\t{{blogpost.status}}\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t</div>\n\t\t\t\n\t\t\t<p \n\t\t\t\tv-if=\"firstText && firstText.content && type !== 'blogpostPage' && !hideDescription\" \n\t\t\t\tclass='mn-b-small t-transp p-big'\n\t\t\t>\n\t\t\t\t{{firstText.content.slice(0,120)}}...\n\t\t\t</p>\n\n\t\t\t<h3 \n\t\t\t\tv-if=\"type === 'blogpostPage' && !hideTitle\" \n\t\t\t\tclass=\"mn-b-small h2\"\n\t\t\t>\n\t\t\t\t{{blogpost.name}}\n\t\t\t</h3>\n\n\t\t\t<slot></slot>\n\n\t\t\t<!-- <Chips \n \tv-if=\"type !== 'short' && blogpost.tags?.length > 0\" \n \t:chips=\"blogpost.tags\"\n \t/> -->\n\n\t\t</section>\n\n\t\t\t<!-- <Image :prop=\"{content:firstImage.content}\" class=\"h-100\"/> -->\n\n\t\t<template\n\t\t\tv-if=\"firstImage && firstImage.content && type !== 'blogpostPage'\"\n\t\t>\n\t\t\t<img loading=\"lazy\" \n\t\t\t\t:src=\"(FILE_SERVER_URL || '') + firstImage.content\" \n\t\t\t\talt=\"Blog post image\" \n\t\t\t\tclass=\"mn-b-medium object-fit-cover w-100 h-min-10r h-100\"\n\t\t\t/>\n\t\t</template>\n\n\t\t<template\n\t\t\tv-if=\"!firstImage?.content && firstVideo && firstVideo.content && type !== 'blogpostPage'\"\n\t\t>\n\t\t\t<!-- <div class=\"flex-center flex\"> -->\n\t <video controls class=\"mn-b-medium object-fit-fit bg-black w-100 h-max-20r\">\n\t <source :src=\"firstVideo.content\" type=\"video/mp4\">\n\t Your browser does not support the video tag.\n\t </video>\n\t <!-- </div> -->\n\t\t</template>\n\n\t\t\n\t\t<FooterBlogpost \n\t\t\tclass=\"pd-t-zero pd-medium\" \n\t\t\t:blogpost=\"blogpost\" :user=\"user\"\n\t\t/>\n\t\n\t</article>\n\n</template>\n\n\n<script setup=\"props\">\n\timport CardHeader from '@martyrs/src/modules/globals/views/components/blocks/CardHeader.vue'\n\timport FooterBlogpost from '@martyrs/src/modules/community/components/blocks/FooterBlogpost.vue'\t\n\n\timport Image from '@martyrs/src/modules/constructor/components/elements/Image.vue';\n\n import Text from '@martyrs/src/components/Text/Text.vue'\n\timport Chips from '@martyrs/src/components/Chips/Chips.vue'\n\n\timport IconEdit from '@martyrs/src/modules/icons/navigation/IconEdit.vue'\n\n\timport { computed } from 'vue'\n\n\timport { useRouter } from 'vue-router'\n\n\tconst router = useRouter()\n\n\tconst props = defineProps({\n\t\tblogpost: {\n\t\t\ttype: Object,\n\t\t},\n\t\tuser: {\n\t\t\ttype: String,\n\t\t},\n\t\ttype: {\n\t\t\ttype: String,\n\t\t},\n\t\thideDescription: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t},\n\t\thideTitle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\n\t})\n\n const firstImage = computed(() => {\n\t return props.blogpost.content.find(block => block.type === 'ImageUpload');\n\t});\n\n\tconst firstVideo = computed(() => {\n\t return props.blogpost.content.find(block => block.type === 'Video');\n\t});\n\n\tconst firstText = computed(() => {\n\t return props.blogpost.content.find(block => \n\t block.type === 'Textarea' && block.class !== 'h2'\n\t );\n\t});\n\n</script>\n\n<style lang=\"scss\">\n</style>\n\n\n"],"names":["useRouter","computed"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyHC,UAAM,SAASA,UAAS,UAAA;AAExB,UAAM,QAAQ;AAoBb,UAAM,aAAaC,IAAAA,SAAS,MAAM;AACjC,aAAO,MAAM,SAAS,QAAQ,KAAK,WAAS,MAAM,SAAS,aAAa;AAAA,IAC3E,CAAE;AAED,UAAM,aAAaA,IAAAA,SAAS,MAAM;AAChC,aAAO,MAAM,SAAS,QAAQ,KAAK,WAAS,MAAM,SAAS,OAAO;AAAA,IACrE,CAAE;AAED,UAAM,YAAYA,IAAAA,SAAS,MAAM;AAC/B,aAAO,MAAM,SAAS,QAAQ;AAAA,QAAK,WACjC,MAAM,SAAS,cAAc,MAAM,UAAU;AAAA,MAC9C;AAAA,IACJ,CAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -26,7 +26,7 @@ const _hoisted_7 = ["src"];
26
26
  const _hoisted_8 = {
27
27
  key: 1,
28
28
  controls: "",
29
- class: "mn-b-medium object-fit-cover w-100 h-max-20r"
29
+ class: "mn-b-medium object-fit-fit bg-black w-100 h-max-20r"
30
30
  };
31
31
  const _hoisted_9 = ["src"];
32
32
  const _sfc_main = {
@@ -1 +1 @@
1
- {"version":3,"file":"CardBlogpost.vue.js","sources":["../../../../../../../src/modules/community/components/blocks/CardBlogpost.vue"],"sourcesContent":["<template>\n\t<article \n\t\tclass=\"pos-relative flex-column flex\"\n\t>\n\t\t<CardHeader \n\t :class=\"{\n\t \t'mn-b-small pd-medium': type !== 'short',\n\t \t'flex-child-order-last flex-child mn-l-small': type === 'short',\n\t }\"\n\t :entity=\"blogpost\"\n\t :entityType=\"'blogpost'\"\n\t :user=\"user\"\n\t :owner=\"blogpost.owner\" \n \t:creator=\"blogpost.creator\"\n \t:date=\"blogpost.createdAt\"\n \t:actions=\"user && user === blogpost.creator.target._id ? [\n { to: { name: 'Edit BlogPost', params: {url: blogpost.url } }, label: 'Edit' }\n ]: null\"\n\t\t/>\n\n\t\n\t\t<section\n\t\t\tclass=\"pd-t-zero pd-b-zero pd-medium\"\n\t\t>\n\t\t\t\n\t\t\t<div v-if=\"type !== 'blogpostPage'\" class=\"cursor-pointer mn-b-thin flex-nowrap flex w-100\">\n\n\t\t\t\t<Text \n\t\t\t\t\tv-if=\"!hideTitle\"\n\t\t\t\t \t:text=\"blogpost.name || ''\" \n\t\t\t\t \t:maxLen=\"80\" \n\t\t\t\t \tclass=\"h3 d-block\"\n\t\t\t\t \t@click=\"router.push({\n\t\t\t\t\t\tname: 'BlogPost', \n\t\t\t\t\t\tparams: { \n\t\t\t\t\t\t\turl: blogpost.url \n\t\t\t\t\t\t}\n\t\t\t\t\t})\"\n\t\t\t\t/>\n\n\t\t\t\t<div \n\t\t\t\t\tv-if=\"blogpost.status === 'draft'\" \n\t\t\t\t\tclass=\"pd-micro t-white uppercase t-semi p-small flex-center flex pd-r-small pd-l-small mn-l-thin w-min bg-second radius-extra\"\n\t\t\t\t>\n\t\t\t\t\t{{blogpost.status}}\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t</div>\n\t\t\t\n\t\t\t<p \n\t\t\t\tv-if=\"firstText && firstText.content && type !== 'blogpostPage' && !hideDescription\" \n\t\t\t\tclass='mn-b-small t-transp p-big'\n\t\t\t>\n\t\t\t\t{{firstText.content.slice(0,120)}}...\n\t\t\t</p>\n\n\t\t\t<h3 \n\t\t\t\tv-if=\"type === 'blogpostPage' && !hideTitle\" \n\t\t\t\tclass=\"mn-b-small h2\"\n\t\t\t>\n\t\t\t\t{{blogpost.name}}\n\t\t\t</h3>\n\n\t\t\t<slot></slot>\n\n\t\t\t<!-- <Chips \n \tv-if=\"type !== 'short' && blogpost.tags?.length > 0\" \n \t:chips=\"blogpost.tags\"\n \t/> -->\n\n\t\t</section>\n\n\t\t\t<!-- <Image :prop=\"{content:firstImage.content}\" class=\"h-100\"/> -->\n\n\t\t<template\n\t\t\tv-if=\"firstImage && firstImage.content && type !== 'blogpostPage'\"\n\t\t>\n\t\t\t<img loading=\"lazy\" \n\t\t\t\t:src=\"(FILE_SERVER_URL || '') + firstImage.content\" \n\t\t\t\talt=\"Blog post image\" \n\t\t\t\tclass=\"mn-b-medium object-fit-cover w-100 h-min-10r h-100\"\n\t\t\t/>\n\t\t</template>\n\n\t\t<template\n\t\t\tv-if=\"!firstImage?.content && firstVideo && firstVideo.content && type !== 'blogpostPage'\"\n\t\t>\n\t\t\t<!-- <div class=\"flex-center flex\"> -->\n\t <video controls class=\"mn-b-medium object-fit-cover w-100 h-max-20r\">\n\t <source :src=\"firstVideo.content\" type=\"video/mp4\">\n\t Your browser does not support the video tag.\n\t </video>\n\t <!-- </div> -->\n\t\t</template>\n\n\t\t\n\t\t<FooterBlogpost \n\t\t\tclass=\"pd-t-zero pd-medium\" \n\t\t\t:blogpost=\"blogpost\" :user=\"user\"\n\t\t/>\n\t\n\t</article>\n\n</template>\n\n\n<script setup=\"props\">\n\timport CardHeader from '@martyrs/src/modules/globals/views/components/blocks/CardHeader.vue'\n\timport FooterBlogpost from '@martyrs/src/modules/community/components/blocks/FooterBlogpost.vue'\t\n\n\timport Image from '@martyrs/src/modules/constructor/components/elements/Image.vue';\n\n import Text from '@martyrs/src/components/Text/Text.vue'\n\timport Chips from '@martyrs/src/components/Chips/Chips.vue'\n\n\timport IconEdit from '@martyrs/src/modules/icons/navigation/IconEdit.vue'\n\n\timport { computed } from 'vue'\n\n\timport { useRouter } from 'vue-router'\n\n\tconst router = useRouter()\n\n\tconst props = defineProps({\n\t\tblogpost: {\n\t\t\ttype: Object,\n\t\t},\n\t\tuser: {\n\t\t\ttype: String,\n\t\t},\n\t\ttype: {\n\t\t\ttype: String,\n\t\t},\n\t\thideDescription: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t},\n\t\thideTitle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\n\t})\n\n const firstImage = computed(() => {\n\t return props.blogpost.content.find(block => block.type === 'ImageUpload');\n\t});\n\n\tconst firstVideo = computed(() => {\n\t return props.blogpost.content.find(block => block.type === 'Video');\n\t});\n\n\tconst firstText = computed(() => {\n\t return props.blogpost.content.find(block => \n\t block.type === 'Textarea' && block.class !== 'h2'\n\t );\n\t});\n\n</script>\n\n<style lang=\"scss\">\n</style>\n\n\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyHC,UAAM,SAAS,UAAS;AAExB,UAAM,QAAQ;AAoBb,UAAM,aAAa,SAAS,MAAM;AACjC,aAAO,MAAM,SAAS,QAAQ,KAAK,WAAS,MAAM,SAAS,aAAa;AAAA,IAC3E,CAAE;AAED,UAAM,aAAa,SAAS,MAAM;AAChC,aAAO,MAAM,SAAS,QAAQ,KAAK,WAAS,MAAM,SAAS,OAAO;AAAA,IACrE,CAAE;AAED,UAAM,YAAY,SAAS,MAAM;AAC/B,aAAO,MAAM,SAAS,QAAQ;AAAA,QAAK,WACjC,MAAM,SAAS,cAAc,MAAM,UAAU;AAAA,MAC9C;AAAA,IACJ,CAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"CardBlogpost.vue.js","sources":["../../../../../../../src/modules/community/components/blocks/CardBlogpost.vue"],"sourcesContent":["<template>\n\t<article \n\t\tclass=\"pos-relative flex-column flex\"\n\t>\n\t\t<CardHeader \n\t :class=\"{\n\t \t'mn-b-small pd-medium': type !== 'short',\n\t \t'flex-child-order-last flex-child mn-l-small': type === 'short',\n\t }\"\n\t :entity=\"blogpost\"\n\t :entityType=\"'blogpost'\"\n\t :user=\"user\"\n\t :owner=\"blogpost.owner\" \n \t:creator=\"blogpost.creator\"\n \t:date=\"blogpost.createdAt\"\n \t:actions=\"user && user === blogpost.creator.target._id ? [\n { to: { name: 'Edit BlogPost', params: {url: blogpost.url } }, label: 'Edit' }\n ]: null\"\n\t\t/>\n\n\t\n\t\t<section\n\t\t\tclass=\"pd-t-zero pd-b-zero pd-medium\"\n\t\t>\n\t\t\t\n\t\t\t<div v-if=\"type !== 'blogpostPage'\" class=\"cursor-pointer mn-b-thin flex-nowrap flex w-100\">\n\n\t\t\t\t<Text \n\t\t\t\t\tv-if=\"!hideTitle\"\n\t\t\t\t \t:text=\"blogpost.name || ''\" \n\t\t\t\t \t:maxLen=\"80\" \n\t\t\t\t \tclass=\"h3 d-block\"\n\t\t\t\t \t@click=\"router.push({\n\t\t\t\t\t\tname: 'BlogPost', \n\t\t\t\t\t\tparams: { \n\t\t\t\t\t\t\turl: blogpost.url \n\t\t\t\t\t\t}\n\t\t\t\t\t})\"\n\t\t\t\t/>\n\n\t\t\t\t<div \n\t\t\t\t\tv-if=\"blogpost.status === 'draft'\" \n\t\t\t\t\tclass=\"pd-micro t-white uppercase t-semi p-small flex-center flex pd-r-small pd-l-small mn-l-thin w-min bg-second radius-extra\"\n\t\t\t\t>\n\t\t\t\t\t{{blogpost.status}}\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t</div>\n\t\t\t\n\t\t\t<p \n\t\t\t\tv-if=\"firstText && firstText.content && type !== 'blogpostPage' && !hideDescription\" \n\t\t\t\tclass='mn-b-small t-transp p-big'\n\t\t\t>\n\t\t\t\t{{firstText.content.slice(0,120)}}...\n\t\t\t</p>\n\n\t\t\t<h3 \n\t\t\t\tv-if=\"type === 'blogpostPage' && !hideTitle\" \n\t\t\t\tclass=\"mn-b-small h2\"\n\t\t\t>\n\t\t\t\t{{blogpost.name}}\n\t\t\t</h3>\n\n\t\t\t<slot></slot>\n\n\t\t\t<!-- <Chips \n \tv-if=\"type !== 'short' && blogpost.tags?.length > 0\" \n \t:chips=\"blogpost.tags\"\n \t/> -->\n\n\t\t</section>\n\n\t\t\t<!-- <Image :prop=\"{content:firstImage.content}\" class=\"h-100\"/> -->\n\n\t\t<template\n\t\t\tv-if=\"firstImage && firstImage.content && type !== 'blogpostPage'\"\n\t\t>\n\t\t\t<img loading=\"lazy\" \n\t\t\t\t:src=\"(FILE_SERVER_URL || '') + firstImage.content\" \n\t\t\t\talt=\"Blog post image\" \n\t\t\t\tclass=\"mn-b-medium object-fit-cover w-100 h-min-10r h-100\"\n\t\t\t/>\n\t\t</template>\n\n\t\t<template\n\t\t\tv-if=\"!firstImage?.content && firstVideo && firstVideo.content && type !== 'blogpostPage'\"\n\t\t>\n\t\t\t<!-- <div class=\"flex-center flex\"> -->\n\t <video controls class=\"mn-b-medium object-fit-fit bg-black w-100 h-max-20r\">\n\t <source :src=\"firstVideo.content\" type=\"video/mp4\">\n\t Your browser does not support the video tag.\n\t </video>\n\t <!-- </div> -->\n\t\t</template>\n\n\t\t\n\t\t<FooterBlogpost \n\t\t\tclass=\"pd-t-zero pd-medium\" \n\t\t\t:blogpost=\"blogpost\" :user=\"user\"\n\t\t/>\n\t\n\t</article>\n\n</template>\n\n\n<script setup=\"props\">\n\timport CardHeader from '@martyrs/src/modules/globals/views/components/blocks/CardHeader.vue'\n\timport FooterBlogpost from '@martyrs/src/modules/community/components/blocks/FooterBlogpost.vue'\t\n\n\timport Image from '@martyrs/src/modules/constructor/components/elements/Image.vue';\n\n import Text from '@martyrs/src/components/Text/Text.vue'\n\timport Chips from '@martyrs/src/components/Chips/Chips.vue'\n\n\timport IconEdit from '@martyrs/src/modules/icons/navigation/IconEdit.vue'\n\n\timport { computed } from 'vue'\n\n\timport { useRouter } from 'vue-router'\n\n\tconst router = useRouter()\n\n\tconst props = defineProps({\n\t\tblogpost: {\n\t\t\ttype: Object,\n\t\t},\n\t\tuser: {\n\t\t\ttype: String,\n\t\t},\n\t\ttype: {\n\t\t\ttype: String,\n\t\t},\n\t\thideDescription: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t},\n\t\thideTitle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\n\t})\n\n const firstImage = computed(() => {\n\t return props.blogpost.content.find(block => block.type === 'ImageUpload');\n\t});\n\n\tconst firstVideo = computed(() => {\n\t return props.blogpost.content.find(block => block.type === 'Video');\n\t});\n\n\tconst firstText = computed(() => {\n\t return props.blogpost.content.find(block => \n\t block.type === 'Textarea' && block.class !== 'h2'\n\t );\n\t});\n\n</script>\n\n<style lang=\"scss\">\n</style>\n\n\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyHC,UAAM,SAAS,UAAS;AAExB,UAAM,QAAQ;AAoBb,UAAM,aAAa,SAAS,MAAM;AACjC,aAAO,MAAM,SAAS,QAAQ,KAAK,WAAS,MAAM,SAAS,aAAa;AAAA,IAC3E,CAAE;AAED,UAAM,aAAa,SAAS,MAAM;AAChC,aAAO,MAAM,SAAS,QAAQ,KAAK,WAAS,MAAM,SAAS,OAAO;AAAA,IACrE,CAAE;AAED,UAAM,YAAY,SAAS,MAAM;AAC/B,aAAO,MAAM,SAAS,QAAQ;AAAA,QAAK,WACjC,MAAM,SAAS,cAAc,MAAM,UAAU;AAAA,MAC9C;AAAA,IACJ,CAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -59,7 +59,7 @@ const _sfc_main = {
59
59
  user: auth.state.user._id,
60
60
  following: vue.unref(route).params.category === "following" ? auth.state.user._id : null
61
61
  },
62
- class: "row-1 gap-thin"
62
+ class: "rows-1 gap-thin"
63
63
  }, {
64
64
  default: vue.withCtx(({
65
65
  items
@@ -1 +1 @@
1
- {"version":3,"file":"Blog.vue.cjs","sources":["../../../../../../../src/modules/community/components/pages/Blog.vue"],"sourcesContent":["<template>\n <section>\n <Feed\n v-model:sort=\"blog.state.sort\"\n :showLoadMore=\"false\"\n :states=\"{\n empty: {\n title: 'No Blog Posts Found',\n description: 'Currently, there are no posts available in this blog. Please check back later.'\n },\n }\"\n :store=\"{\n read: (options) => blog.read(options)\n }\"\n :options=\"{\n limit: 15,\n category: route.params.category,\n period: route.query.period,\n status: 'published',\n user: auth.state.user._id,\n following: route.params.category === 'following' ? auth.state.user._id : null,\n }\"\n v-slot=\"{ \n items \n }\"\n class=\"row-1 gap-thin\"\n >\n <CardBlogpost \n v-for=\"item in items\" \n :key=\"item._id\" \n :blogpost=\"item\" \n :user=\"auth.state.user._id\" \n class=\"h-max-40r bg-light mn-b-thin radius-medium mobile:radius-zero\"\n />\n </Feed>\n </section>\n</template>\n\n\n<script setup=\"props\">\n import { ref, computed, onMounted, watch } from 'vue';\n import { useRoute, useRouter } from 'vue-router';\n\n import Breadcrumbs from '@martyrs/src/components/Breadcrumbs/Breadcrumbs.vue';\n import Feed from '@martyrs/src/components/Feed/Feed.vue'\n\n import CardBlogpost from '@martyrs/src/modules/community/components/blocks/CardBlogpost.vue';\n\n // Import state\n import * as blog from '@martyrs/src/modules/community/store/blogposts.js';\n import * as auth from '@martyrs/src/modules/auth/views/store/auth'\n\n // State\n const route = useRoute();\n const router = useRouter();\n\n // if (!route.params.category) {\n // route.params.category = 'popular'\n // }\n \n onMounted(() => {\n\n if (route.query) {\n const query = route.query;\n\n const newFilterValue = {\n tags: query.tags ? query.tags.split(',') : [],\n period: query.period ? query.period : null,\n };\n\n // проверяем наличие категории в route.params и добавляем ее в фильтр\n // if (route.params.category) {\n // newFilterValue.category = route.params.category;\n // }\n\n blog.state.filter = newFilterValue;\n }\n \n });\n\n watch(() => blog.state.filter, (newFilterValue, oldFilterValue) => {\n // Переводим фильтр в формат query\n const query = { ...route.query };\n\n // Удаляем старые значения фильтра из query\n Object.keys(oldFilterValue).forEach(key => {\n if (query[key]) {\n delete query[key];\n }\n });\n\n // Добавляем новые значения фильтра в query\n const newQueryValues = Object.fromEntries(\n Object.entries(newFilterValue)\n .filter(([key, value]) => (Array.isArray(value) && value.length > 0) || (typeof value === 'string' && value))\n .map(([key, value]) => [key, Array.isArray(value) ? value.join(',') : value])\n );\n Object.assign(query, newQueryValues);\n\n // Обновляем маршрут с новым query\n router.replace({ query });\n }, { deep: true })\n</script>\n\n<style lang=\"scss\">\n\n</style>\n"],"names":["useRoute","useRouter","onMounted","blog.state","watch"],"mappings":";;;;;;;;;;;;;AAqDE,UAAM,QAAQA,UAAAA,SAAU;AACxB,UAAM,SAASC,UAAAA,UAAW;AAM1BC,QAAAA,UAAU,MAAM;AAEd,UAAI,MAAM,OAAO;AACf,cAAM,QAAQ,MAAM;AAEpB,cAAM,iBAAiB;AAAA,UACrB,MAAM,MAAM,OAAO,MAAM,KAAK,MAAM,GAAG,IAAI,CAAE;AAAA,UAC7C,QAAQ,MAAM,SAAS,MAAM,SAAS;AAAA,QACvC;AAODC,kBAAU,MAAC,SAAS;AAAA,MAC1B;AAAA,IAEA,CAAG;AAEDC,QAAAA,MAAM,MAAMD,UAAU,MAAC,QAAQ,CAAC,gBAAgB,mBAAmB;AAEjE,YAAM,QAAQ,EAAE,GAAG,MAAM,MAAO;AAGhC,aAAO,KAAK,cAAc,EAAE,QAAQ,SAAO;AACzC,YAAI,MAAM,GAAG,GAAG;AACd,iBAAO,MAAM,GAAG;AAAA,QACxB;AAAA,MACA,CAAK;AAGD,YAAM,iBAAiB,OAAO;AAAA,QAC5B,OAAO,QAAQ,cAAc,EAC1B,OAAO,CAAC,CAAC,KAAK,KAAK,MAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,KAAO,OAAO,UAAU,YAAY,KAAM,EAC3G,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;AAAA,MAC/E;AACD,aAAO,OAAO,OAAO,cAAc;AAGnC,aAAO,QAAQ,EAAE,OAAO;AAAA,IAC5B,GAAK,EAAE,MAAM,KAAM,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Blog.vue.cjs","sources":["../../../../../../../src/modules/community/components/pages/Blog.vue"],"sourcesContent":["<template>\n <section>\n <Feed\n v-model:sort=\"blog.state.sort\"\n :showLoadMore=\"false\"\n :states=\"{\n empty: {\n title: 'No Blog Posts Found',\n description: 'Currently, there are no posts available in this blog. Please check back later.'\n },\n }\"\n :store=\"{\n read: (options) => blog.read(options)\n }\"\n :options=\"{\n limit: 15,\n category: route.params.category,\n period: route.query.period,\n status: 'published',\n user: auth.state.user._id,\n following: route.params.category === 'following' ? auth.state.user._id : null,\n }\"\n v-slot=\"{ \n items \n }\"\n class=\"rows-1 gap-thin\"\n >\n <CardBlogpost \n v-for=\"item in items\" \n :key=\"item._id\" \n :blogpost=\"item\" \n :user=\"auth.state.user._id\" \n class=\"h-max-40r bg-light mn-b-thin radius-medium mobile:radius-zero\"\n />\n </Feed>\n </section>\n</template>\n\n\n<script setup=\"props\">\n import { ref, computed, onMounted, watch } from 'vue';\n import { useRoute, useRouter } from 'vue-router';\n\n import Breadcrumbs from '@martyrs/src/components/Breadcrumbs/Breadcrumbs.vue';\n import Feed from '@martyrs/src/components/Feed/Feed.vue'\n\n import CardBlogpost from '@martyrs/src/modules/community/components/blocks/CardBlogpost.vue';\n\n // Import state\n import * as blog from '@martyrs/src/modules/community/store/blogposts.js';\n import * as auth from '@martyrs/src/modules/auth/views/store/auth'\n\n // State\n const route = useRoute();\n const router = useRouter();\n\n // if (!route.params.category) {\n // route.params.category = 'popular'\n // }\n \n onMounted(() => {\n\n if (route.query) {\n const query = route.query;\n\n const newFilterValue = {\n tags: query.tags ? query.tags.split(',') : [],\n period: query.period ? query.period : null,\n };\n\n // проверяем наличие категории в route.params и добавляем ее в фильтр\n // if (route.params.category) {\n // newFilterValue.category = route.params.category;\n // }\n\n blog.state.filter = newFilterValue;\n }\n \n });\n\n watch(() => blog.state.filter, (newFilterValue, oldFilterValue) => {\n // Переводим фильтр в формат query\n const query = { ...route.query };\n\n // Удаляем старые значения фильтра из query\n Object.keys(oldFilterValue).forEach(key => {\n if (query[key]) {\n delete query[key];\n }\n });\n\n // Добавляем новые значения фильтра в query\n const newQueryValues = Object.fromEntries(\n Object.entries(newFilterValue)\n .filter(([key, value]) => (Array.isArray(value) && value.length > 0) || (typeof value === 'string' && value))\n .map(([key, value]) => [key, Array.isArray(value) ? value.join(',') : value])\n );\n Object.assign(query, newQueryValues);\n\n // Обновляем маршрут с новым query\n router.replace({ query });\n }, { deep: true })\n</script>\n\n<style lang=\"scss\">\n\n</style>\n"],"names":["useRoute","useRouter","onMounted","blog.state","watch"],"mappings":";;;;;;;;;;;;;AAqDE,UAAM,QAAQA,UAAAA,SAAU;AACxB,UAAM,SAASC,UAAAA,UAAW;AAM1BC,QAAAA,UAAU,MAAM;AAEd,UAAI,MAAM,OAAO;AACf,cAAM,QAAQ,MAAM;AAEpB,cAAM,iBAAiB;AAAA,UACrB,MAAM,MAAM,OAAO,MAAM,KAAK,MAAM,GAAG,IAAI,CAAE;AAAA,UAC7C,QAAQ,MAAM,SAAS,MAAM,SAAS;AAAA,QACvC;AAODC,kBAAU,MAAC,SAAS;AAAA,MAC1B;AAAA,IAEA,CAAG;AAEDC,QAAAA,MAAM,MAAMD,UAAU,MAAC,QAAQ,CAAC,gBAAgB,mBAAmB;AAEjE,YAAM,QAAQ,EAAE,GAAG,MAAM,MAAO;AAGhC,aAAO,KAAK,cAAc,EAAE,QAAQ,SAAO;AACzC,YAAI,MAAM,GAAG,GAAG;AACd,iBAAO,MAAM,GAAG;AAAA,QACxB;AAAA,MACA,CAAK;AAGD,YAAM,iBAAiB,OAAO;AAAA,QAC5B,OAAO,QAAQ,cAAc,EAC1B,OAAO,CAAC,CAAC,KAAK,KAAK,MAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,KAAO,OAAO,UAAU,YAAY,KAAM,EAC3G,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;AAAA,MAC/E;AACD,aAAO,OAAO,OAAO,cAAc;AAGnC,aAAO,QAAQ,EAAE,OAAO;AAAA,IAC5B,GAAK,EAAE,MAAM,KAAM,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -57,7 +57,7 @@ const _sfc_main = {
57
57
  user: state$1.user._id,
58
58
  following: unref(route).params.category === "following" ? state$1.user._id : null
59
59
  },
60
- class: "row-1 gap-thin"
60
+ class: "rows-1 gap-thin"
61
61
  }, {
62
62
  default: withCtx(({
63
63
  items
@@ -1 +1 @@
1
- {"version":3,"file":"Blog.vue.js","sources":["../../../../../../../src/modules/community/components/pages/Blog.vue"],"sourcesContent":["<template>\n <section>\n <Feed\n v-model:sort=\"blog.state.sort\"\n :showLoadMore=\"false\"\n :states=\"{\n empty: {\n title: 'No Blog Posts Found',\n description: 'Currently, there are no posts available in this blog. Please check back later.'\n },\n }\"\n :store=\"{\n read: (options) => blog.read(options)\n }\"\n :options=\"{\n limit: 15,\n category: route.params.category,\n period: route.query.period,\n status: 'published',\n user: auth.state.user._id,\n following: route.params.category === 'following' ? auth.state.user._id : null,\n }\"\n v-slot=\"{ \n items \n }\"\n class=\"row-1 gap-thin\"\n >\n <CardBlogpost \n v-for=\"item in items\" \n :key=\"item._id\" \n :blogpost=\"item\" \n :user=\"auth.state.user._id\" \n class=\"h-max-40r bg-light mn-b-thin radius-medium mobile:radius-zero\"\n />\n </Feed>\n </section>\n</template>\n\n\n<script setup=\"props\">\n import { ref, computed, onMounted, watch } from 'vue';\n import { useRoute, useRouter } from 'vue-router';\n\n import Breadcrumbs from '@martyrs/src/components/Breadcrumbs/Breadcrumbs.vue';\n import Feed from '@martyrs/src/components/Feed/Feed.vue'\n\n import CardBlogpost from '@martyrs/src/modules/community/components/blocks/CardBlogpost.vue';\n\n // Import state\n import * as blog from '@martyrs/src/modules/community/store/blogposts.js';\n import * as auth from '@martyrs/src/modules/auth/views/store/auth'\n\n // State\n const route = useRoute();\n const router = useRouter();\n\n // if (!route.params.category) {\n // route.params.category = 'popular'\n // }\n \n onMounted(() => {\n\n if (route.query) {\n const query = route.query;\n\n const newFilterValue = {\n tags: query.tags ? query.tags.split(',') : [],\n period: query.period ? query.period : null,\n };\n\n // проверяем наличие категории в route.params и добавляем ее в фильтр\n // if (route.params.category) {\n // newFilterValue.category = route.params.category;\n // }\n\n blog.state.filter = newFilterValue;\n }\n \n });\n\n watch(() => blog.state.filter, (newFilterValue, oldFilterValue) => {\n // Переводим фильтр в формат query\n const query = { ...route.query };\n\n // Удаляем старые значения фильтра из query\n Object.keys(oldFilterValue).forEach(key => {\n if (query[key]) {\n delete query[key];\n }\n });\n\n // Добавляем новые значения фильтра в query\n const newQueryValues = Object.fromEntries(\n Object.entries(newFilterValue)\n .filter(([key, value]) => (Array.isArray(value) && value.length > 0) || (typeof value === 'string' && value))\n .map(([key, value]) => [key, Array.isArray(value) ? value.join(',') : value])\n );\n Object.assign(query, newQueryValues);\n\n // Обновляем маршрут с новым query\n router.replace({ query });\n }, { deep: true })\n</script>\n\n<style lang=\"scss\">\n\n</style>\n"],"names":["blog.state"],"mappings":";;;;;;;;;;;AAqDE,UAAM,QAAQ,SAAU;AACxB,UAAM,SAAS,UAAW;AAM1B,cAAU,MAAM;AAEd,UAAI,MAAM,OAAO;AACf,cAAM,QAAQ,MAAM;AAEpB,cAAM,iBAAiB;AAAA,UACrB,MAAM,MAAM,OAAO,MAAM,KAAK,MAAM,GAAG,IAAI,CAAE;AAAA,UAC7C,QAAQ,MAAM,SAAS,MAAM,SAAS;AAAA,QACvC;AAODA,cAAW,SAAS;AAAA,MAC1B;AAAA,IAEA,CAAG;AAED,UAAM,MAAMA,MAAW,QAAQ,CAAC,gBAAgB,mBAAmB;AAEjE,YAAM,QAAQ,EAAE,GAAG,MAAM,MAAO;AAGhC,aAAO,KAAK,cAAc,EAAE,QAAQ,SAAO;AACzC,YAAI,MAAM,GAAG,GAAG;AACd,iBAAO,MAAM,GAAG;AAAA,QACxB;AAAA,MACA,CAAK;AAGD,YAAM,iBAAiB,OAAO;AAAA,QAC5B,OAAO,QAAQ,cAAc,EAC1B,OAAO,CAAC,CAAC,KAAK,KAAK,MAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,KAAO,OAAO,UAAU,YAAY,KAAM,EAC3G,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;AAAA,MAC/E;AACD,aAAO,OAAO,OAAO,cAAc;AAGnC,aAAO,QAAQ,EAAE,OAAO;AAAA,IAC5B,GAAK,EAAE,MAAM,KAAM,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Blog.vue.js","sources":["../../../../../../../src/modules/community/components/pages/Blog.vue"],"sourcesContent":["<template>\n <section>\n <Feed\n v-model:sort=\"blog.state.sort\"\n :showLoadMore=\"false\"\n :states=\"{\n empty: {\n title: 'No Blog Posts Found',\n description: 'Currently, there are no posts available in this blog. Please check back later.'\n },\n }\"\n :store=\"{\n read: (options) => blog.read(options)\n }\"\n :options=\"{\n limit: 15,\n category: route.params.category,\n period: route.query.period,\n status: 'published',\n user: auth.state.user._id,\n following: route.params.category === 'following' ? auth.state.user._id : null,\n }\"\n v-slot=\"{ \n items \n }\"\n class=\"rows-1 gap-thin\"\n >\n <CardBlogpost \n v-for=\"item in items\" \n :key=\"item._id\" \n :blogpost=\"item\" \n :user=\"auth.state.user._id\" \n class=\"h-max-40r bg-light mn-b-thin radius-medium mobile:radius-zero\"\n />\n </Feed>\n </section>\n</template>\n\n\n<script setup=\"props\">\n import { ref, computed, onMounted, watch } from 'vue';\n import { useRoute, useRouter } from 'vue-router';\n\n import Breadcrumbs from '@martyrs/src/components/Breadcrumbs/Breadcrumbs.vue';\n import Feed from '@martyrs/src/components/Feed/Feed.vue'\n\n import CardBlogpost from '@martyrs/src/modules/community/components/blocks/CardBlogpost.vue';\n\n // Import state\n import * as blog from '@martyrs/src/modules/community/store/blogposts.js';\n import * as auth from '@martyrs/src/modules/auth/views/store/auth'\n\n // State\n const route = useRoute();\n const router = useRouter();\n\n // if (!route.params.category) {\n // route.params.category = 'popular'\n // }\n \n onMounted(() => {\n\n if (route.query) {\n const query = route.query;\n\n const newFilterValue = {\n tags: query.tags ? query.tags.split(',') : [],\n period: query.period ? query.period : null,\n };\n\n // проверяем наличие категории в route.params и добавляем ее в фильтр\n // if (route.params.category) {\n // newFilterValue.category = route.params.category;\n // }\n\n blog.state.filter = newFilterValue;\n }\n \n });\n\n watch(() => blog.state.filter, (newFilterValue, oldFilterValue) => {\n // Переводим фильтр в формат query\n const query = { ...route.query };\n\n // Удаляем старые значения фильтра из query\n Object.keys(oldFilterValue).forEach(key => {\n if (query[key]) {\n delete query[key];\n }\n });\n\n // Добавляем новые значения фильтра в query\n const newQueryValues = Object.fromEntries(\n Object.entries(newFilterValue)\n .filter(([key, value]) => (Array.isArray(value) && value.length > 0) || (typeof value === 'string' && value))\n .map(([key, value]) => [key, Array.isArray(value) ? value.join(',') : value])\n );\n Object.assign(query, newQueryValues);\n\n // Обновляем маршрут с новым query\n router.replace({ query });\n }, { deep: true })\n</script>\n\n<style lang=\"scss\">\n\n</style>\n"],"names":["blog.state"],"mappings":";;;;;;;;;;;AAqDE,UAAM,QAAQ,SAAU;AACxB,UAAM,SAAS,UAAW;AAM1B,cAAU,MAAM;AAEd,UAAI,MAAM,OAAO;AACf,cAAM,QAAQ,MAAM;AAEpB,cAAM,iBAAiB;AAAA,UACrB,MAAM,MAAM,OAAO,MAAM,KAAK,MAAM,GAAG,IAAI,CAAE;AAAA,UAC7C,QAAQ,MAAM,SAAS,MAAM,SAAS;AAAA,QACvC;AAODA,cAAW,SAAS;AAAA,MAC1B;AAAA,IAEA,CAAG;AAED,UAAM,MAAMA,MAAW,QAAQ,CAAC,gBAAgB,mBAAmB;AAEjE,YAAM,QAAQ,EAAE,GAAG,MAAM,MAAO;AAGhC,aAAO,KAAK,cAAc,EAAE,QAAQ,SAAO;AACzC,YAAI,MAAM,GAAG,GAAG;AACd,iBAAO,MAAM,GAAG;AAAA,QACxB;AAAA,MACA,CAAK;AAGD,YAAM,iBAAiB,OAAO;AAAA,QAC5B,OAAO,QAAQ,cAAc,EAC1B,OAAO,CAAC,CAAC,KAAK,KAAK,MAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,KAAO,OAAO,UAAU,YAAY,KAAM,EAC3G,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;AAAA,MAC/E;AACD,aAAO,OAAO,OAAO,cAAc;AAGnC,aAAO,QAAQ,EAAE,OAAO;AAAA,IAC5B,GAAK,EAAE,MAAM,KAAM,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -89,7 +89,10 @@ const _sfc_main = {
89
89
  }, {
90
90
  default: vue.withCtx(() => [
91
91
  isLoading.value ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 0 }, vue.renderList(3, (i) => {
92
- return vue.createVNode(SkeletonBlogpost.default, { key: i });
92
+ return vue.createVNode(SkeletonBlogpost.default, {
93
+ key: i,
94
+ class: ""
95
+ });
93
96
  }), 64)) : vue.createCommentVNode("", true)
94
97
  ]),
95
98
  _: 1
@@ -1 +1 @@
1
- {"version":3,"file":"BlogPost.vue.cjs","sources":["../../../../../../../src/modules/community/components/pages/BlogPost.vue"],"sourcesContent":["<template>\n <section>\n <TransitionGroup tag=\"ul\" name=\"fade\" class=\"o-hidden bg-light radius-medium\">\n <SkeletonBlogpost\n v-if=\"isLoading\"\n v-for=\"i in 3\" :key=\"i\"\n />\n </TransitionGroup>\n <transition \n name=\"fade\"\n >\n <EmptyState \n v-if=\"!isLoading && !blogpost\"\n title=\"No Blogpost Found\"\n description=\"Currently, there are no blogposts available. Please check back later.\"\n class=\"pd-medium mn-b-thin bg-light radius-big\"\n />\n </transition>\n\n <TransitionGroup tag=\"div\" name=\"fade\" class=\"container\">\n \t <!-- <button @click=\"share\" >\n\t\t\t Поделиться\n\t\t\t </button>\n\t\t\t -->\n \t<CardBlogpost \n v-if=\"!isLoading && blogpost\"\n @click=\"$router.push({name: 'Blogpost', params: {url: blogpost.url}})\" \n :blogpost=\"blogpost\" \n :user=\"auth.state.user._id\"\n :type=\"'blogpostPage'\"\n :hideTitle=\"true\"\n class=\"mn-b-regular bg-light radius-medium\"\n >\n\n \t <Viewer\n \t v-if=\"blogpost && blogpost.content\"\n \t :content=\"blogpost.content\"\n \t />\n\n \t\t\t\t<a v-if=\"blogpost.source\" :href=\"blogpost.source\" target=\"_blank\" class=\"mn-b-semi d-block w-max radius-big pd-thin bg-black t-white\">\n \t\t\t\t\tCheck Source 🔗\n \t\t\t\t</a>\n \t\t\t\n </CardBlogpost>\n\n \t<!-- <h3 class=\"mn-b-small\">Recommended Communities</h3>\n \t\t<Publics \n \t\t\tclass=\"mn-b-small\"\n \t\t/> -->\n\n <Comments \n v-if=\"!isLoading && blogpost\" \n :type=\"'blogpost'\" \n :target=\"blogpost._id\" \n :owner=\"auth.state.user._id\"\n />\n \n </TransitionGroup> \n \n </section>\n</template>\n\n<script setup>\nimport { ref, onMounted, computed, onServerPrefetch, watch } from 'vue';\nimport { useHead } from '@unhead/vue'\nimport Loader from '@martyrs/src/components/Loader/Loader.vue';\nimport EmptyState from '@martyrs/src/components/EmptyState/EmptyState.vue';\nimport CardBlogpost from '@martyrs/src/modules/community/components/blocks/CardBlogpost.vue';\nimport SkeletonBlogpost from '@martyrs/src/modules/icons/skeletons/SkeletonBlogpost.vue'\nimport Publics from '@martyrs/src/modules/organizations/components/sections/Publics.vue'\nimport Comments from '@martyrs/src/modules/community/components/sections/Comments.vue';\nimport Viewer from '@martyrs/src/modules/constructor/components/sections/Viewer.vue';\nimport * as blog from '@martyrs/src/modules/community/store/blogposts.js';\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth';\n \nimport { useRoute } from 'vue-router';\n\nconst route = useRoute();\nconst blogpost = computed(() => blog.state.current);\nconst isLoading = ref(false);\nconst canShare = ref(false);\nconst error = ref(null);\n\nasync function fetchBlogpost() {\n try {\n isLoading.value = true;\n const data = await blog.read({ user: auth.state.user?._id, url: route.params.url });\n blogpost.value = data[0];\n // Обновляем состояние хранилища\n blog.state.current = data[0];\n } catch (err) {\n error.value = err;\n console.error('Error fetching blogpost:', err);\n } finally {\n isLoading.value = false;\n }\n}\n\nonServerPrefetch(async() => {\n\tawait fetchBlogpost()\n});\n\nonMounted(async() => {\n if (!blogpost.value || blogpost.value.url !== route.params.url) {\n await fetchBlogpost();\n }\n canShare.value = !!navigator.share;\n});\n\n\nconst share = async () => {\n if (!canShare.value) return;\n try {\n await navigator.share({\n title: blogpost.value.name,\n text: firstText.value?.content.slice(0, 120) || 'Check out this blog post!',\n url: window.location.href,\n });\n console.log('Content shared successfully');\n } catch (error) {\n console.error('Error sharing:', error);\n }\n};\n\nconst firstImage = computed(() => {\n return blogpost.value?.content?.find(block => block.type === 'ImageUpload');\n});\n\nconst firstText = computed(() => {\n return blogpost.value?.content?.find(block => \n block.type === 'Textarea' && block.class !== 'h2'\n );\n});\n\nconst metadata = computed(() => ({\n title: blogpost.value?.name,\n description: firstText.value?.content.slice(0, 120),\n meta: [\n { hid: 'description', name: 'description', content: firstText.value?.content.slice(0, 120) },\n { hid: 'og:title', property: 'og:title', content: blogpost.value?.name },\n { hid: 'og:description', property: 'og:description', content: firstText.value?.content.slice(0, 120) },\n { hid: 'og:image', property: 'og:image', content: firstImage.value?.content ? `${process.env.FILE_SERVER_URL}${firstImage.value.content}` : `${process.env.FILE_SERVER_URL}/favicon/cover.jpg` },\n { hid: 'twitter:title', name: 'twitter:title', content: blogpost.value?.name },\n { hid: 'twitter:description', name: 'twitter:description', content: firstText.value?.content.slice(0, 120) },\n { hid: 'twitter:image', name: 'twitter:image', content: firstImage.value?.content ? `${process.env.FILE_SERVER_URL}${firstImage.value.content}` : `${process.env.FILE_SERVER_URL}/favicon/cover.jpg` },\n { hid: 'twitter:card', name: 'twitter:card', content: 'summary_large_image' },\n ],\n}));\n\nuseHead(metadata);\n</script>\n\n<style lang=\"scss\">\n\n</style>\n"],"names":["useRoute","computed","blog.state","ref","blog.read","auth.state","onServerPrefetch","onMounted","useHead"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA6EA,UAAM,QAAQA,UAAAA,SAAU;AACxB,UAAM,WAAWC,IAAQ,SAAC,MAAMC,UAAU,MAAC,OAAO;AAClD,UAAM,YAAYC,IAAG,IAAC,KAAK;AAC3B,UAAM,WAAWA,IAAG,IAAC,KAAK;AAC1B,UAAM,QAAQA,IAAG,IAAC,IAAI;AAEtB,mBAAe,gBAAgB;;AAC7B,UAAI;AACF,kBAAU,QAAQ;AAClB,cAAM,OAAO,MAAMC,eAAU,EAAE,OAAMC,UAAU,MAAC,SAAXA,mBAAiB,KAAK,KAAK,MAAM,OAAO,IAAG,CAAE;AAClF,iBAAS,QAAQ,KAAK,CAAC;AAEvBH,wBAAW,UAAU,KAAK,CAAC;AAAA,MAC5B,SAAQ,KAAK;AACZ,cAAM,QAAQ;AACd,gBAAQ,MAAM,4BAA4B,GAAG;AAAA,MACjD,UAAY;AACR,kBAAU,QAAQ;AAAA,MACtB;AAAA,IACA;AAEAI,QAAAA,iBAAiB,YAAW;AAC3B,YAAM,cAAa;AAAA,IACpB,CAAC;AAEDC,QAAAA,UAAU,YAAW;AACnB,UAAI,CAAC,SAAS,SAAS,SAAS,MAAM,QAAQ,MAAM,OAAO,KAAK;AAC9D,cAAM,cAAe;AAAA,MACzB;AACE,eAAS,QAAQ,CAAC,CAAC,UAAU;AAAA,IAC/B,CAAC;AAiBD,UAAM,aAAaN,IAAQ,SAAC,MAAM;;AAChC,cAAO,oBAAS,UAAT,mBAAgB,YAAhB,mBAAyB,KAAK,WAAS,MAAM,SAAS;AAAA,IAC/D,CAAC;AAED,UAAM,YAAYA,IAAQ,SAAC,MAAM;;AAC/B,cAAO,oBAAS,UAAT,mBAAgB,YAAhB,mBAAyB;AAAA,QAAK,WACnC,MAAM,SAAS,cAAc,MAAM,UAAU;AAAA;AAAA,IAEjD,CAAC;AAED,UAAM,WAAWA,IAAQ,SAAC,MAAO;;AAAA;AAAA,QAC/B,QAAO,cAAS,UAAT,mBAAgB;AAAA,QACvB,cAAa,eAAU,UAAV,mBAAiB,QAAQ,MAAM,GAAG;AAAA,QAC/C,MAAM;AAAA,UACJ,EAAE,KAAK,eAAe,MAAM,eAAe,UAAS,eAAU,UAAV,mBAAiB,QAAQ,MAAM,GAAG,KAAM;AAAA,UAC5F,EAAE,KAAK,YAAY,UAAU,YAAY,UAAS,cAAS,UAAT,mBAAgB,KAAM;AAAA,UACxE,EAAE,KAAK,kBAAkB,UAAU,kBAAkB,UAAS,eAAU,UAAV,mBAAiB,QAAQ,MAAM,GAAG,KAAM;AAAA,UACtG,EAAE,KAAK,YAAY,UAAU,YAAY,WAAS,gBAAW,UAAX,mBAAkB,WAAU,GAAG,QAAQ,IAAI,eAAe,GAAG,WAAW,MAAM,OAAO,KAAK,GAAG,QAAQ,IAAI,eAAe,qBAAsB;AAAA,UAChM,EAAE,KAAK,iBAAiB,MAAM,iBAAiB,UAAS,cAAS,UAAT,mBAAgB,KAAM;AAAA,UAC9E,EAAE,KAAK,uBAAuB,MAAM,uBAAuB,UAAS,eAAU,UAAV,mBAAiB,QAAQ,MAAM,GAAG,KAAM;AAAA,UAC5G,EAAE,KAAK,iBAAiB,MAAM,iBAAiB,WAAS,gBAAW,UAAX,mBAAkB,WAAU,GAAG,QAAQ,IAAI,eAAe,GAAG,WAAW,MAAM,OAAO,KAAK,GAAG,QAAQ,IAAI,eAAe,qBAAsB;AAAA,UACtM,EAAE,KAAK,gBAAgB,MAAM,gBAAgB,SAAS,sBAAuB;AAAA,QAC9E;AAAA,MACH;AAAA,KAAE;AAEFO,gBAAO,EAAC,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"BlogPost.vue.cjs","sources":["../../../../../../../src/modules/community/components/pages/BlogPost.vue"],"sourcesContent":["<template>\n <section>\n <TransitionGroup tag=\"ul\" name=\"fade\" class=\"o-hidden bg-light radius-medium\">\n <SkeletonBlogpost\n v-if=\"isLoading\"\n v-for=\"i in 3\" :key=\"i\"\n class=\"\"\n />\n </TransitionGroup>\n <transition \n name=\"fade\"\n >\n <EmptyState \n v-if=\"!isLoading && !blogpost\"\n title=\"No Blogpost Found\"\n description=\"Currently, there are no blogposts available. Please check back later.\"\n class=\"pd-medium mn-b-thin bg-light radius-big\"\n />\n </transition>\n\n <TransitionGroup tag=\"div\" name=\"fade\" class=\"container\">\n \t <!-- <button @click=\"share\" >\n\t\t\t Поделиться\n\t\t\t </button>\n\t\t\t -->\n \t<CardBlogpost \n v-if=\"!isLoading && blogpost\"\n @click=\"$router.push({name: 'Blogpost', params: {url: blogpost.url}})\" \n :blogpost=\"blogpost\" \n :user=\"auth.state.user._id\"\n :type=\"'blogpostPage'\"\n :hideTitle=\"true\"\n class=\"mn-b-regular bg-light radius-medium\"\n >\n\n \t <Viewer\n \t v-if=\"blogpost && blogpost.content\"\n \t :content=\"blogpost.content\"\n \t />\n\n \t\t\t\t<a v-if=\"blogpost.source\" :href=\"blogpost.source\" target=\"_blank\" class=\"mn-b-semi d-block w-max radius-big pd-thin bg-black t-white\">\n \t\t\t\t\tCheck Source 🔗\n \t\t\t\t</a>\n \t\t\t\n </CardBlogpost>\n\n \t<!-- <h3 class=\"mn-b-small\">Recommended Communities</h3>\n \t\t<Publics \n \t\t\tclass=\"mn-b-small\"\n \t\t/> -->\n\n <Comments \n v-if=\"!isLoading && blogpost\" \n :type=\"'blogpost'\" \n :target=\"blogpost._id\" \n :owner=\"auth.state.user._id\"\n />\n \n </TransitionGroup> \n \n </section>\n</template>\n\n<script setup>\nimport { ref, onMounted, computed, onServerPrefetch, watch } from 'vue';\nimport { useHead } from '@unhead/vue'\nimport Loader from '@martyrs/src/components/Loader/Loader.vue';\nimport EmptyState from '@martyrs/src/components/EmptyState/EmptyState.vue';\nimport CardBlogpost from '@martyrs/src/modules/community/components/blocks/CardBlogpost.vue';\nimport SkeletonBlogpost from '@martyrs/src/modules/icons/skeletons/SkeletonBlogpost.vue'\nimport Publics from '@martyrs/src/modules/organizations/components/sections/Publics.vue'\nimport Comments from '@martyrs/src/modules/community/components/sections/Comments.vue';\nimport Viewer from '@martyrs/src/modules/constructor/components/sections/Viewer.vue';\nimport * as blog from '@martyrs/src/modules/community/store/blogposts.js';\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth';\n \nimport { useRoute } from 'vue-router';\n\nconst route = useRoute();\nconst blogpost = computed(() => blog.state.current);\nconst isLoading = ref(false);\nconst canShare = ref(false);\nconst error = ref(null);\n\nasync function fetchBlogpost() {\n try {\n isLoading.value = true;\n const data = await blog.read({ user: auth.state.user?._id, url: route.params.url });\n blogpost.value = data[0];\n // Обновляем состояние хранилища\n blog.state.current = data[0];\n } catch (err) {\n error.value = err;\n console.error('Error fetching blogpost:', err);\n } finally {\n isLoading.value = false;\n }\n}\n\nonServerPrefetch(async() => {\n\tawait fetchBlogpost()\n});\n\nonMounted(async() => {\n if (!blogpost.value || blogpost.value.url !== route.params.url) {\n await fetchBlogpost();\n }\n canShare.value = !!navigator.share;\n});\n\n\nconst share = async () => {\n if (!canShare.value) return;\n try {\n await navigator.share({\n title: blogpost.value.name,\n text: firstText.value?.content.slice(0, 120) || 'Check out this blog post!',\n url: window.location.href,\n });\n console.log('Content shared successfully');\n } catch (error) {\n console.error('Error sharing:', error);\n }\n};\n\nconst firstImage = computed(() => {\n return blogpost.value?.content?.find(block => block.type === 'ImageUpload');\n});\n\nconst firstText = computed(() => {\n return blogpost.value?.content?.find(block => \n block.type === 'Textarea' && block.class !== 'h2'\n );\n});\n\nconst metadata = computed(() => ({\n title: blogpost.value?.name,\n description: firstText.value?.content.slice(0, 120),\n meta: [\n { hid: 'description', name: 'description', content: firstText.value?.content.slice(0, 120) },\n { hid: 'og:title', property: 'og:title', content: blogpost.value?.name },\n { hid: 'og:description', property: 'og:description', content: firstText.value?.content.slice(0, 120) },\n { hid: 'og:image', property: 'og:image', content: firstImage.value?.content ? `${process.env.FILE_SERVER_URL}${firstImage.value.content}` : `${process.env.FILE_SERVER_URL}/favicon/cover.jpg` },\n { hid: 'twitter:title', name: 'twitter:title', content: blogpost.value?.name },\n { hid: 'twitter:description', name: 'twitter:description', content: firstText.value?.content.slice(0, 120) },\n { hid: 'twitter:image', name: 'twitter:image', content: firstImage.value?.content ? `${process.env.FILE_SERVER_URL}${firstImage.value.content}` : `${process.env.FILE_SERVER_URL}/favicon/cover.jpg` },\n { hid: 'twitter:card', name: 'twitter:card', content: 'summary_large_image' },\n ],\n}));\n\nuseHead(metadata);\n</script>\n\n<style lang=\"scss\">\n\n</style>\n"],"names":["useRoute","computed","blog.state","ref","blog.read","auth.state","onServerPrefetch","onMounted","useHead"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA8EA,UAAM,QAAQA,UAAAA,SAAU;AACxB,UAAM,WAAWC,IAAQ,SAAC,MAAMC,UAAU,MAAC,OAAO;AAClD,UAAM,YAAYC,IAAG,IAAC,KAAK;AAC3B,UAAM,WAAWA,IAAG,IAAC,KAAK;AAC1B,UAAM,QAAQA,IAAG,IAAC,IAAI;AAEtB,mBAAe,gBAAgB;;AAC7B,UAAI;AACF,kBAAU,QAAQ;AAClB,cAAM,OAAO,MAAMC,eAAU,EAAE,OAAMC,UAAU,MAAC,SAAXA,mBAAiB,KAAK,KAAK,MAAM,OAAO,IAAG,CAAE;AAClF,iBAAS,QAAQ,KAAK,CAAC;AAEvBH,wBAAW,UAAU,KAAK,CAAC;AAAA,MAC5B,SAAQ,KAAK;AACZ,cAAM,QAAQ;AACd,gBAAQ,MAAM,4BAA4B,GAAG;AAAA,MACjD,UAAY;AACR,kBAAU,QAAQ;AAAA,MACtB;AAAA,IACA;AAEAI,QAAAA,iBAAiB,YAAW;AAC3B,YAAM,cAAa;AAAA,IACpB,CAAC;AAEDC,QAAAA,UAAU,YAAW;AACnB,UAAI,CAAC,SAAS,SAAS,SAAS,MAAM,QAAQ,MAAM,OAAO,KAAK;AAC9D,cAAM,cAAe;AAAA,MACzB;AACE,eAAS,QAAQ,CAAC,CAAC,UAAU;AAAA,IAC/B,CAAC;AAiBD,UAAM,aAAaN,IAAQ,SAAC,MAAM;;AAChC,cAAO,oBAAS,UAAT,mBAAgB,YAAhB,mBAAyB,KAAK,WAAS,MAAM,SAAS;AAAA,IAC/D,CAAC;AAED,UAAM,YAAYA,IAAQ,SAAC,MAAM;;AAC/B,cAAO,oBAAS,UAAT,mBAAgB,YAAhB,mBAAyB;AAAA,QAAK,WACnC,MAAM,SAAS,cAAc,MAAM,UAAU;AAAA;AAAA,IAEjD,CAAC;AAED,UAAM,WAAWA,IAAQ,SAAC,MAAO;;AAAA;AAAA,QAC/B,QAAO,cAAS,UAAT,mBAAgB;AAAA,QACvB,cAAa,eAAU,UAAV,mBAAiB,QAAQ,MAAM,GAAG;AAAA,QAC/C,MAAM;AAAA,UACJ,EAAE,KAAK,eAAe,MAAM,eAAe,UAAS,eAAU,UAAV,mBAAiB,QAAQ,MAAM,GAAG,KAAM;AAAA,UAC5F,EAAE,KAAK,YAAY,UAAU,YAAY,UAAS,cAAS,UAAT,mBAAgB,KAAM;AAAA,UACxE,EAAE,KAAK,kBAAkB,UAAU,kBAAkB,UAAS,eAAU,UAAV,mBAAiB,QAAQ,MAAM,GAAG,KAAM;AAAA,UACtG,EAAE,KAAK,YAAY,UAAU,YAAY,WAAS,gBAAW,UAAX,mBAAkB,WAAU,GAAG,QAAQ,IAAI,eAAe,GAAG,WAAW,MAAM,OAAO,KAAK,GAAG,QAAQ,IAAI,eAAe,qBAAsB;AAAA,UAChM,EAAE,KAAK,iBAAiB,MAAM,iBAAiB,UAAS,cAAS,UAAT,mBAAgB,KAAM;AAAA,UAC9E,EAAE,KAAK,uBAAuB,MAAM,uBAAuB,UAAS,eAAU,UAAV,mBAAiB,QAAQ,MAAM,GAAG,KAAM;AAAA,UAC5G,EAAE,KAAK,iBAAiB,MAAM,iBAAiB,WAAS,gBAAW,UAAX,mBAAkB,WAAU,GAAG,QAAQ,IAAI,eAAe,GAAG,WAAW,MAAM,OAAO,KAAK,GAAG,QAAQ,IAAI,eAAe,qBAAsB;AAAA,UACtM,EAAE,KAAK,gBAAgB,MAAM,gBAAgB,SAAS,sBAAuB;AAAA,QAC9E;AAAA,MACH;AAAA,KAAE;AAEFO,gBAAO,EAAC,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -87,7 +87,10 @@ const _sfc_main = {
87
87
  }, {
88
88
  default: withCtx(() => [
89
89
  isLoading.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, renderList(3, (i) => {
90
- return createVNode(SkeletonBlogpost, { key: i });
90
+ return createVNode(SkeletonBlogpost, {
91
+ key: i,
92
+ class: ""
93
+ });
91
94
  }), 64)) : createCommentVNode("", true)
92
95
  ]),
93
96
  _: 1
@@ -1 +1 @@
1
- {"version":3,"file":"BlogPost.vue.js","sources":["../../../../../../../src/modules/community/components/pages/BlogPost.vue"],"sourcesContent":["<template>\n <section>\n <TransitionGroup tag=\"ul\" name=\"fade\" class=\"o-hidden bg-light radius-medium\">\n <SkeletonBlogpost\n v-if=\"isLoading\"\n v-for=\"i in 3\" :key=\"i\"\n />\n </TransitionGroup>\n <transition \n name=\"fade\"\n >\n <EmptyState \n v-if=\"!isLoading && !blogpost\"\n title=\"No Blogpost Found\"\n description=\"Currently, there are no blogposts available. Please check back later.\"\n class=\"pd-medium mn-b-thin bg-light radius-big\"\n />\n </transition>\n\n <TransitionGroup tag=\"div\" name=\"fade\" class=\"container\">\n \t <!-- <button @click=\"share\" >\n\t\t\t Поделиться\n\t\t\t </button>\n\t\t\t -->\n \t<CardBlogpost \n v-if=\"!isLoading && blogpost\"\n @click=\"$router.push({name: 'Blogpost', params: {url: blogpost.url}})\" \n :blogpost=\"blogpost\" \n :user=\"auth.state.user._id\"\n :type=\"'blogpostPage'\"\n :hideTitle=\"true\"\n class=\"mn-b-regular bg-light radius-medium\"\n >\n\n \t <Viewer\n \t v-if=\"blogpost && blogpost.content\"\n \t :content=\"blogpost.content\"\n \t />\n\n \t\t\t\t<a v-if=\"blogpost.source\" :href=\"blogpost.source\" target=\"_blank\" class=\"mn-b-semi d-block w-max radius-big pd-thin bg-black t-white\">\n \t\t\t\t\tCheck Source 🔗\n \t\t\t\t</a>\n \t\t\t\n </CardBlogpost>\n\n \t<!-- <h3 class=\"mn-b-small\">Recommended Communities</h3>\n \t\t<Publics \n \t\t\tclass=\"mn-b-small\"\n \t\t/> -->\n\n <Comments \n v-if=\"!isLoading && blogpost\" \n :type=\"'blogpost'\" \n :target=\"blogpost._id\" \n :owner=\"auth.state.user._id\"\n />\n \n </TransitionGroup> \n \n </section>\n</template>\n\n<script setup>\nimport { ref, onMounted, computed, onServerPrefetch, watch } from 'vue';\nimport { useHead } from '@unhead/vue'\nimport Loader from '@martyrs/src/components/Loader/Loader.vue';\nimport EmptyState from '@martyrs/src/components/EmptyState/EmptyState.vue';\nimport CardBlogpost from '@martyrs/src/modules/community/components/blocks/CardBlogpost.vue';\nimport SkeletonBlogpost from '@martyrs/src/modules/icons/skeletons/SkeletonBlogpost.vue'\nimport Publics from '@martyrs/src/modules/organizations/components/sections/Publics.vue'\nimport Comments from '@martyrs/src/modules/community/components/sections/Comments.vue';\nimport Viewer from '@martyrs/src/modules/constructor/components/sections/Viewer.vue';\nimport * as blog from '@martyrs/src/modules/community/store/blogposts.js';\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth';\n \nimport { useRoute } from 'vue-router';\n\nconst route = useRoute();\nconst blogpost = computed(() => blog.state.current);\nconst isLoading = ref(false);\nconst canShare = ref(false);\nconst error = ref(null);\n\nasync function fetchBlogpost() {\n try {\n isLoading.value = true;\n const data = await blog.read({ user: auth.state.user?._id, url: route.params.url });\n blogpost.value = data[0];\n // Обновляем состояние хранилища\n blog.state.current = data[0];\n } catch (err) {\n error.value = err;\n console.error('Error fetching blogpost:', err);\n } finally {\n isLoading.value = false;\n }\n}\n\nonServerPrefetch(async() => {\n\tawait fetchBlogpost()\n});\n\nonMounted(async() => {\n if (!blogpost.value || blogpost.value.url !== route.params.url) {\n await fetchBlogpost();\n }\n canShare.value = !!navigator.share;\n});\n\n\nconst share = async () => {\n if (!canShare.value) return;\n try {\n await navigator.share({\n title: blogpost.value.name,\n text: firstText.value?.content.slice(0, 120) || 'Check out this blog post!',\n url: window.location.href,\n });\n console.log('Content shared successfully');\n } catch (error) {\n console.error('Error sharing:', error);\n }\n};\n\nconst firstImage = computed(() => {\n return blogpost.value?.content?.find(block => block.type === 'ImageUpload');\n});\n\nconst firstText = computed(() => {\n return blogpost.value?.content?.find(block => \n block.type === 'Textarea' && block.class !== 'h2'\n );\n});\n\nconst metadata = computed(() => ({\n title: blogpost.value?.name,\n description: firstText.value?.content.slice(0, 120),\n meta: [\n { hid: 'description', name: 'description', content: firstText.value?.content.slice(0, 120) },\n { hid: 'og:title', property: 'og:title', content: blogpost.value?.name },\n { hid: 'og:description', property: 'og:description', content: firstText.value?.content.slice(0, 120) },\n { hid: 'og:image', property: 'og:image', content: firstImage.value?.content ? `${process.env.FILE_SERVER_URL}${firstImage.value.content}` : `${process.env.FILE_SERVER_URL}/favicon/cover.jpg` },\n { hid: 'twitter:title', name: 'twitter:title', content: blogpost.value?.name },\n { hid: 'twitter:description', name: 'twitter:description', content: firstText.value?.content.slice(0, 120) },\n { hid: 'twitter:image', name: 'twitter:image', content: firstImage.value?.content ? `${process.env.FILE_SERVER_URL}${firstImage.value.content}` : `${process.env.FILE_SERVER_URL}/favicon/cover.jpg` },\n { hid: 'twitter:card', name: 'twitter:card', content: 'summary_large_image' },\n ],\n}));\n\nuseHead(metadata);\n</script>\n\n<style lang=\"scss\">\n\n</style>\n"],"names":["blog.state","blog.read","auth.state"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA6EA,UAAM,QAAQ,SAAU;AACxB,UAAM,WAAW,SAAS,MAAMA,MAAW,OAAO;AAClD,UAAM,YAAY,IAAI,KAAK;AAC3B,UAAM,WAAW,IAAI,KAAK;AAC1B,UAAM,QAAQ,IAAI,IAAI;AAEtB,mBAAe,gBAAgB;;AAC7B,UAAI;AACF,kBAAU,QAAQ;AAClB,cAAM,OAAO,MAAMC,KAAU,EAAE,OAAMC,aAAW,SAAXA,mBAAiB,KAAK,KAAK,MAAM,OAAO,IAAG,CAAE;AAClF,iBAAS,QAAQ,KAAK,CAAC;AAEvBF,cAAW,UAAU,KAAK,CAAC;AAAA,MAC5B,SAAQ,KAAK;AACZ,cAAM,QAAQ;AACd,gBAAQ,MAAM,4BAA4B,GAAG;AAAA,MACjD,UAAY;AACR,kBAAU,QAAQ;AAAA,MACtB;AAAA,IACA;AAEA,qBAAiB,YAAW;AAC3B,YAAM,cAAa;AAAA,IACpB,CAAC;AAED,cAAU,YAAW;AACnB,UAAI,CAAC,SAAS,SAAS,SAAS,MAAM,QAAQ,MAAM,OAAO,KAAK;AAC9D,cAAM,cAAe;AAAA,MACzB;AACE,eAAS,QAAQ,CAAC,CAAC,UAAU;AAAA,IAC/B,CAAC;AAiBD,UAAM,aAAa,SAAS,MAAM;;AAChC,cAAO,oBAAS,UAAT,mBAAgB,YAAhB,mBAAyB,KAAK,WAAS,MAAM,SAAS;AAAA,IAC/D,CAAC;AAED,UAAM,YAAY,SAAS,MAAM;;AAC/B,cAAO,oBAAS,UAAT,mBAAgB,YAAhB,mBAAyB;AAAA,QAAK,WACnC,MAAM,SAAS,cAAc,MAAM,UAAU;AAAA;AAAA,IAEjD,CAAC;AAED,UAAM,WAAW,SAAS,MAAO;;AAAA;AAAA,QAC/B,QAAO,cAAS,UAAT,mBAAgB;AAAA,QACvB,cAAa,eAAU,UAAV,mBAAiB,QAAQ,MAAM,GAAG;AAAA,QAC/C,MAAM;AAAA,UACJ,EAAE,KAAK,eAAe,MAAM,eAAe,UAAS,eAAU,UAAV,mBAAiB,QAAQ,MAAM,GAAG,KAAM;AAAA,UAC5F,EAAE,KAAK,YAAY,UAAU,YAAY,UAAS,cAAS,UAAT,mBAAgB,KAAM;AAAA,UACxE,EAAE,KAAK,kBAAkB,UAAU,kBAAkB,UAAS,eAAU,UAAV,mBAAiB,QAAQ,MAAM,GAAG,KAAM;AAAA,UACtG,EAAE,KAAK,YAAY,UAAU,YAAY,WAAS,gBAAW,UAAX,mBAAkB,WAAU,GAAG,QAAQ,IAAI,eAAe,GAAG,WAAW,MAAM,OAAO,KAAK,GAAG,QAAQ,IAAI,eAAe,qBAAsB;AAAA,UAChM,EAAE,KAAK,iBAAiB,MAAM,iBAAiB,UAAS,cAAS,UAAT,mBAAgB,KAAM;AAAA,UAC9E,EAAE,KAAK,uBAAuB,MAAM,uBAAuB,UAAS,eAAU,UAAV,mBAAiB,QAAQ,MAAM,GAAG,KAAM;AAAA,UAC5G,EAAE,KAAK,iBAAiB,MAAM,iBAAiB,WAAS,gBAAW,UAAX,mBAAkB,WAAU,GAAG,QAAQ,IAAI,eAAe,GAAG,WAAW,MAAM,OAAO,KAAK,GAAG,QAAQ,IAAI,eAAe,qBAAsB;AAAA,UACtM,EAAE,KAAK,gBAAgB,MAAM,gBAAgB,SAAS,sBAAuB;AAAA,QAC9E;AAAA,MACH;AAAA,KAAE;AAEF,YAAQ,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"BlogPost.vue.js","sources":["../../../../../../../src/modules/community/components/pages/BlogPost.vue"],"sourcesContent":["<template>\n <section>\n <TransitionGroup tag=\"ul\" name=\"fade\" class=\"o-hidden bg-light radius-medium\">\n <SkeletonBlogpost\n v-if=\"isLoading\"\n v-for=\"i in 3\" :key=\"i\"\n class=\"\"\n />\n </TransitionGroup>\n <transition \n name=\"fade\"\n >\n <EmptyState \n v-if=\"!isLoading && !blogpost\"\n title=\"No Blogpost Found\"\n description=\"Currently, there are no blogposts available. Please check back later.\"\n class=\"pd-medium mn-b-thin bg-light radius-big\"\n />\n </transition>\n\n <TransitionGroup tag=\"div\" name=\"fade\" class=\"container\">\n \t <!-- <button @click=\"share\" >\n\t\t\t Поделиться\n\t\t\t </button>\n\t\t\t -->\n \t<CardBlogpost \n v-if=\"!isLoading && blogpost\"\n @click=\"$router.push({name: 'Blogpost', params: {url: blogpost.url}})\" \n :blogpost=\"blogpost\" \n :user=\"auth.state.user._id\"\n :type=\"'blogpostPage'\"\n :hideTitle=\"true\"\n class=\"mn-b-regular bg-light radius-medium\"\n >\n\n \t <Viewer\n \t v-if=\"blogpost && blogpost.content\"\n \t :content=\"blogpost.content\"\n \t />\n\n \t\t\t\t<a v-if=\"blogpost.source\" :href=\"blogpost.source\" target=\"_blank\" class=\"mn-b-semi d-block w-max radius-big pd-thin bg-black t-white\">\n \t\t\t\t\tCheck Source 🔗\n \t\t\t\t</a>\n \t\t\t\n </CardBlogpost>\n\n \t<!-- <h3 class=\"mn-b-small\">Recommended Communities</h3>\n \t\t<Publics \n \t\t\tclass=\"mn-b-small\"\n \t\t/> -->\n\n <Comments \n v-if=\"!isLoading && blogpost\" \n :type=\"'blogpost'\" \n :target=\"blogpost._id\" \n :owner=\"auth.state.user._id\"\n />\n \n </TransitionGroup> \n \n </section>\n</template>\n\n<script setup>\nimport { ref, onMounted, computed, onServerPrefetch, watch } from 'vue';\nimport { useHead } from '@unhead/vue'\nimport Loader from '@martyrs/src/components/Loader/Loader.vue';\nimport EmptyState from '@martyrs/src/components/EmptyState/EmptyState.vue';\nimport CardBlogpost from '@martyrs/src/modules/community/components/blocks/CardBlogpost.vue';\nimport SkeletonBlogpost from '@martyrs/src/modules/icons/skeletons/SkeletonBlogpost.vue'\nimport Publics from '@martyrs/src/modules/organizations/components/sections/Publics.vue'\nimport Comments from '@martyrs/src/modules/community/components/sections/Comments.vue';\nimport Viewer from '@martyrs/src/modules/constructor/components/sections/Viewer.vue';\nimport * as blog from '@martyrs/src/modules/community/store/blogposts.js';\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth';\n \nimport { useRoute } from 'vue-router';\n\nconst route = useRoute();\nconst blogpost = computed(() => blog.state.current);\nconst isLoading = ref(false);\nconst canShare = ref(false);\nconst error = ref(null);\n\nasync function fetchBlogpost() {\n try {\n isLoading.value = true;\n const data = await blog.read({ user: auth.state.user?._id, url: route.params.url });\n blogpost.value = data[0];\n // Обновляем состояние хранилища\n blog.state.current = data[0];\n } catch (err) {\n error.value = err;\n console.error('Error fetching blogpost:', err);\n } finally {\n isLoading.value = false;\n }\n}\n\nonServerPrefetch(async() => {\n\tawait fetchBlogpost()\n});\n\nonMounted(async() => {\n if (!blogpost.value || blogpost.value.url !== route.params.url) {\n await fetchBlogpost();\n }\n canShare.value = !!navigator.share;\n});\n\n\nconst share = async () => {\n if (!canShare.value) return;\n try {\n await navigator.share({\n title: blogpost.value.name,\n text: firstText.value?.content.slice(0, 120) || 'Check out this blog post!',\n url: window.location.href,\n });\n console.log('Content shared successfully');\n } catch (error) {\n console.error('Error sharing:', error);\n }\n};\n\nconst firstImage = computed(() => {\n return blogpost.value?.content?.find(block => block.type === 'ImageUpload');\n});\n\nconst firstText = computed(() => {\n return blogpost.value?.content?.find(block => \n block.type === 'Textarea' && block.class !== 'h2'\n );\n});\n\nconst metadata = computed(() => ({\n title: blogpost.value?.name,\n description: firstText.value?.content.slice(0, 120),\n meta: [\n { hid: 'description', name: 'description', content: firstText.value?.content.slice(0, 120) },\n { hid: 'og:title', property: 'og:title', content: blogpost.value?.name },\n { hid: 'og:description', property: 'og:description', content: firstText.value?.content.slice(0, 120) },\n { hid: 'og:image', property: 'og:image', content: firstImage.value?.content ? `${process.env.FILE_SERVER_URL}${firstImage.value.content}` : `${process.env.FILE_SERVER_URL}/favicon/cover.jpg` },\n { hid: 'twitter:title', name: 'twitter:title', content: blogpost.value?.name },\n { hid: 'twitter:description', name: 'twitter:description', content: firstText.value?.content.slice(0, 120) },\n { hid: 'twitter:image', name: 'twitter:image', content: firstImage.value?.content ? `${process.env.FILE_SERVER_URL}${firstImage.value.content}` : `${process.env.FILE_SERVER_URL}/favicon/cover.jpg` },\n { hid: 'twitter:card', name: 'twitter:card', content: 'summary_large_image' },\n ],\n}));\n\nuseHead(metadata);\n</script>\n\n<style lang=\"scss\">\n\n</style>\n"],"names":["blog.state","blog.read","auth.state"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA8EA,UAAM,QAAQ,SAAU;AACxB,UAAM,WAAW,SAAS,MAAMA,MAAW,OAAO;AAClD,UAAM,YAAY,IAAI,KAAK;AAC3B,UAAM,WAAW,IAAI,KAAK;AAC1B,UAAM,QAAQ,IAAI,IAAI;AAEtB,mBAAe,gBAAgB;;AAC7B,UAAI;AACF,kBAAU,QAAQ;AAClB,cAAM,OAAO,MAAMC,KAAU,EAAE,OAAMC,aAAW,SAAXA,mBAAiB,KAAK,KAAK,MAAM,OAAO,IAAG,CAAE;AAClF,iBAAS,QAAQ,KAAK,CAAC;AAEvBF,cAAW,UAAU,KAAK,CAAC;AAAA,MAC5B,SAAQ,KAAK;AACZ,cAAM,QAAQ;AACd,gBAAQ,MAAM,4BAA4B,GAAG;AAAA,MACjD,UAAY;AACR,kBAAU,QAAQ;AAAA,MACtB;AAAA,IACA;AAEA,qBAAiB,YAAW;AAC3B,YAAM,cAAa;AAAA,IACpB,CAAC;AAED,cAAU,YAAW;AACnB,UAAI,CAAC,SAAS,SAAS,SAAS,MAAM,QAAQ,MAAM,OAAO,KAAK;AAC9D,cAAM,cAAe;AAAA,MACzB;AACE,eAAS,QAAQ,CAAC,CAAC,UAAU;AAAA,IAC/B,CAAC;AAiBD,UAAM,aAAa,SAAS,MAAM;;AAChC,cAAO,oBAAS,UAAT,mBAAgB,YAAhB,mBAAyB,KAAK,WAAS,MAAM,SAAS;AAAA,IAC/D,CAAC;AAED,UAAM,YAAY,SAAS,MAAM;;AAC/B,cAAO,oBAAS,UAAT,mBAAgB,YAAhB,mBAAyB;AAAA,QAAK,WACnC,MAAM,SAAS,cAAc,MAAM,UAAU;AAAA;AAAA,IAEjD,CAAC;AAED,UAAM,WAAW,SAAS,MAAO;;AAAA;AAAA,QAC/B,QAAO,cAAS,UAAT,mBAAgB;AAAA,QACvB,cAAa,eAAU,UAAV,mBAAiB,QAAQ,MAAM,GAAG;AAAA,QAC/C,MAAM;AAAA,UACJ,EAAE,KAAK,eAAe,MAAM,eAAe,UAAS,eAAU,UAAV,mBAAiB,QAAQ,MAAM,GAAG,KAAM;AAAA,UAC5F,EAAE,KAAK,YAAY,UAAU,YAAY,UAAS,cAAS,UAAT,mBAAgB,KAAM;AAAA,UACxE,EAAE,KAAK,kBAAkB,UAAU,kBAAkB,UAAS,eAAU,UAAV,mBAAiB,QAAQ,MAAM,GAAG,KAAM;AAAA,UACtG,EAAE,KAAK,YAAY,UAAU,YAAY,WAAS,gBAAW,UAAX,mBAAkB,WAAU,GAAG,QAAQ,IAAI,eAAe,GAAG,WAAW,MAAM,OAAO,KAAK,GAAG,QAAQ,IAAI,eAAe,qBAAsB;AAAA,UAChM,EAAE,KAAK,iBAAiB,MAAM,iBAAiB,UAAS,cAAS,UAAT,mBAAgB,KAAM;AAAA,UAC9E,EAAE,KAAK,uBAAuB,MAAM,uBAAuB,UAAS,eAAU,UAAV,mBAAiB,QAAQ,MAAM,GAAG,KAAM;AAAA,UAC5G,EAAE,KAAK,iBAAiB,MAAM,iBAAiB,WAAS,gBAAW,UAAX,mBAAkB,WAAU,GAAG,QAAQ,IAAI,eAAe,GAAG,WAAW,MAAM,OAAO,KAAK,GAAG,QAAQ,IAAI,eAAe,qBAAsB;AAAA,UACtM,EAAE,KAAK,gBAAgB,MAAM,gBAAgB,SAAS,sBAAuB;AAAA,QAC9E;AAAA,MACH;AAAA,KAAE;AAEF,YAAQ,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -19,14 +19,14 @@ const blogposts = require("../../store/blogposts.cjs");
19
19
  const auth = require("../../../auth/views/store/auth.cjs");
20
20
  const organizations = require("../../../organizations/store/organizations.cjs");
21
21
  const mixins = require("../../../globals/views/mixins/mixins.cjs");
22
- const _hoisted_1 = { class: "w-100 h-100 pos-relative" };
22
+ const _hoisted_1 = { class: "w-100 bg-light radius-medium pos-relative" };
23
23
  const _hoisted_2 = {
24
24
  style: { "min-height": "100%" },
25
- class: "w-100 bg-white pd-big radius-medium"
25
+ class: "w-100 pd-big"
26
26
  };
27
27
  const _hoisted_3 = {
28
28
  key: 0,
29
- class: "pd-thin pos-sticky pos-l-0 pos-b-0 w-100"
29
+ class: "pd-small pos-sticky pos-l-0 pos-b-0 w-100"
30
30
  };
31
31
  const _hoisted_4 = { class: "pd-thin radius-big bg-main w-100 flex-nowrap flex" };
32
32
  const _hoisted_5 = {
@@ -1 +1 @@
1
- {"version":3,"file":"CreateBlogPost.vue.cjs","sources":["../../../../../../../src/modules/community/components/pages/CreateBlogPost.vue"],"sourcesContent":["<template>\n <article \n class=\"w-100 h-100 pos-relative\"\n >\n <section \n style=\"min-height: 100%;\"\n class=\"w-100 bg-white pd-big radius-medium\"\n >\n <!-- Title -->\n <div \n class=\"w-full h-full\"\n >\n <!-- <Textarea \n v-if=\"post\" \n :prop=\"post\" \n :setFocus=\"true\"\n content=\"name\" \n placeholder=\"Enter post title\" \n class=\"h2\"\n /> -->\n </div>\n\n <Constructor \n v-if=\"post\" \n :content=\"post.content\"\n @update=\"update => post.content = update\"\n />\n\n </section>\n\n <transition name=\"scaleIn\" >\n <section v-if=\"post\" class=\"pd-thin pos-sticky pos-l-0 pos-b-0 w-100 \">\n <div class=\"pd-thin radius-big bg-main w-100 flex-nowrap flex\">\n <a v-if=\"route.params.url\" @click=\"onDelete()\" class=\"mn-r-auto bg-red t-white t-black button\">Delete</a>\n <a @click=\"onDrafts()\" class=\"mn-l-auto bg-white t-black button\">To Drafts</a>\n <a @click=\"openPulicationPopup()\" class=\"mn-l-thin bg-black t-white button\">Publish</a>\n </div>\n </section>\n </transition>\n\n <Popup \n @close-popup=\"closePublicationPopup\" \n :isPopupOpen=\"isPublicationPopup\"\n class=\"w-m-33r t-left pd-big bg-white radius-big\"\n >\n <h3 class=\"mn-b-small\">Final Touches</h3>\n \n <BlockTags\n @tags-changed=\"newTags => post.tags = newTags\"\n :tags=\"post.tags\"\n class=\"mn-b-small\"\n />\n\n <h5 class=\"mn-b-thin\">Add source:</h5>\n <Field \n v-model:field=\"post.source\" \n placeholder=\"Add full link to the source\" \n class=\"mn-b-medium bg-light radius-medium pd-small\" \n />\n\n <h5 class=\"mn-b-thin\">Add to public</h5>\n <Card\n v-if=\"selectedOrganization\"\n :photo=\"selectedOrganization.profile?.photo\"\n :title=\"selectedOrganization.profile?.name\"\n @click=\"() => { \n selectedOrganization = null\n }\"\n class=\"h-4r w-100 bg-light pd-thin radius-medium mn-b-thin\"\n />\n\n <section v-else class=\"mn-b-thin h-25r o-x-hidden o-y-scroll bg-light radius-big pd-small \">\n <Feed\n :showLoadMore=\"false\" \n :search=\"{\n placeholder: 'Search organization...',\n class: 'bg-white mn-b-thin'\n }\"\n :states=\"{\n empty: {\n title: 'No organizations Found',\n description: 'Currently, there are no such organizations available.'\n }\n }\"\n :store=\"{\n read: (options) => organizations.actions.read(options),\n state: null\n }\"\n :options=\"{\n user: auth.state.user._id,\n postable: auth.state.user._id,\n lookup: ['memberships']\n }\"\n v-slot=\"{ \n items \n }\"\n >\n <Card\n v-for=\"(organization, index) in items\" \n v-memo=\"[organization._id, organization.profile.name]\"\n :photo=\"organization.profile?.photo\"\n :title=\"organization.profile?.name\"\n @click=\"() => { \n selectedOrganization = organization\n }\"\n class=\"h-4r bg-white pd-thin radius-medium w-100 mn-b-thin\"\n />\n </Feed>\n </section>\n\n <h5 v-if=\"selectedOrganization\" class=\"mn-b-thin\">Options:</h5>\n <div v-if=\"selectedOrganization\" class=\"mn-b-medium br-grey-transp-25 br-2px br-solid pd-small radius-big\">\n <Checkbox \n :label=\"'Hide Author'\"\n :radio=\"post.creator.hidden\"\n @update:radio=\"event => post.creator.hidden = event\"\n name=\"prices\"\n class=\"w-100\"\n />\n </div>\n \n <Button :submit=\"onSubmit\" :callback=\"redirectTo\" class=\"w-100 bg-black t-white\">Publish</Button>\n </Popup>\n \n </article>\n</template>\n\n<script setup>\nimport Textarea from '@martyrs/src/modules/constructor/components/elements/Textarea.vue';\nimport Constructor from '@martyrs/src/modules/constructor/components/sections/Constructor.vue';\n\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport FieldTags from '@martyrs/src/components/FieldTags/FieldTags.vue'\nimport BlockTags from '@martyrs/src/components/FieldTags/BlockTags.vue'\nimport Checkbox from '@martyrs/src/components/Checkbox/Checkbox.vue'\nimport Field from '@martyrs/src/components/Field/Field.vue'\nimport Button from '@martyrs/src/components/Button/Button.vue'; \nimport Feed from '@martyrs/src/components/Feed/Feed.vue'\n\nimport Card from '@martyrs/src/modules/globals/views/components/blocks/Card.vue';\n\nimport { ref, onMounted, watchEffect, nextTick, computed } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { VueDraggableNext } from 'vue-draggable-next';\n// Store & Router\nimport * as blog from '@martyrs/src/modules/community/store/blogposts.js';\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth'\nimport * as organizations from '@martyrs/src/modules/organizations/store/organizations'\n \nimport { useGlobalMixins } from \"@martyrs/src/modules/globals/views/mixins/mixins.js\"\n\nconst { hasAccess } = useGlobalMixins()\n\nconst route = useRoute();\nconst router = useRouter();\n\nlet post = ref(null);\nlet publics = ref(null);\n\nconst selectedTags = ref([]);\nconst selectedOrganization = ref(null);\n\nonMounted(async () =>{\n \n if (route.params.url) {\n const data = await blog.read({ user: auth.state.user._id, url: route.params.url });\n \n post.value = data.pop();\n\n if (!post.value) {\n router.push({name: 'notfound'})\n }\n\n if (post.value.owner.type === 'organization') {\n // Если пост принадлежит организации, проверяем права на редактирование через `hasAccess`\n const isAccess = hasAccess(post.value.owner.target._id, 'posts', 'edit', auth.state.accesses, auth.state.access.roles);\n\n if (!isAccess) {\n router.push({name: 'unauthorized'})\n }\n }\n\n if (post.value.owner.type === 'user' && post.value.creator.target._id !== auth.state.user._id) {\n router.push({name: 'unauthorized'})\n }\n } else {\n blog.clean();\n post.value = blog.state.current;\n }\n\n if (!post.value.owner) post.value.owner = {\n target: auth.state.user._id,\n type: 'user'\n }\n\n if (!post.value.creator) post.value.creator = {\n target: auth.state.user._id,\n type: 'user',\n hidden: false\n }\n\n\n if (post.value.owner.type === 'organization') selectedOrganization.value = {\n _id: post.value.owner.target._id,\n name: post.value.owner.target.profile.name,\n photo: post.value.owner.target.profile.photo\n }\n})\n// /////////////////////////////////////////\n// Publication Form\n// /////////////////////////////////////////\nconst tag = ref('');\nconst autocompleteItems = ref([\n { text: 'story' },\n { text: 'news' },\n { text: 'guide' },\n { text: 'discussion' },\n { text: 'photos' },\n]);\n\nconst filteredItems = computed(() => {\n return autocompleteItems.value.filter(i => {\n return i.text.toLowerCase().includes(tag.value.toLowerCase());\n });\n});\n\nconst filteredSuggestedItems = computed(() => {\n return autocompleteItems.value.filter(item => {\n return !selectedTags.value.some(tag => tag.text === item.text);\n });\n })\n\nfunction addTag (tag) {\n selectedTags.value.push(tag)\n}\n// /////////////////////////////////////////\n// Publication Popup\n// /////////////////////////////////////////\nconst isPublicationPopup = ref(false)\n\nfunction openPulicationPopup() {\n isPublicationPopup.value = true;\n}\nfunction closePublicationPopup() {\n isPublicationPopup.value = false;\n}\n\nfunction onDrafts() {\n\n if (selectedTags.value.length > 0) selectedTags.value.map(tag => (tag.text))\n\n post.value.status = \"draft\"\n post.value.name = post.value.content[0].content\n\n if (route.params.url) {\n blog.update(post.value)\n .then(response => {\n router.push({ name: 'BlogPost', params: { url: response.url } });\n })\n .catch(error => {\n console.log(error);\n });\n } else {\n blog.create(post.value)\n .then(response => {\n router.push({ name: 'BlogPost', params: { url: response.url } });\n })\n .catch(error => {\n console.log(error);\n });\n }\n}\n\nfunction onSubmit() {\n\n if (selectedOrganization.value) post.value.owner = {\n target: selectedOrganization.value._id,\n type: 'organization'\n }\n\n if (!selectedOrganization.value) post.value.creator.hidden = false\n if (!selectedOrganization.value) post.value.organization = post.value.creator\n\n post.value.status = \"published\"\n post.value.name = post.value.content[0].content\n\n if (route.params.url) {\n blog.update(post.value)\n .then(response => {\n console.log(post.value)\n router.push({ name: 'BlogPost', params: { url: response.url } });\n })\n .catch(error => {\n console.error(error);\n });\n } else {\n blog.create(post.value)\n .then(response => {\n router.push({ name: 'BlogPost', params: { url: response.url } });\n })\n .catch(error => {\n console.error(error);\n });\n }\n}\n\nfunction onDelete() {\n if (confirm('Are you sure you want to delete this post?')) {\n blog.remove(post.value._id)\n .then(response => {\n router.push({ name: 'User Posts', params: { _id: post.value.creator.target._id } });\n })\n .catch(error => {\n console.log(error);\n });\n }\n}\n</script>\n\n\n<style lang=\"scss\">\n\n</style>\n"],"names":["useGlobalMixins","useRoute","useRouter","ref","onMounted","blog.read","auth.state","blog.clean","blog.state","computed","tag","blog.update","blog.create","blog.remove"],"mappings":"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"}
1
+ {"version":3,"file":"CreateBlogPost.vue.cjs","sources":["../../../../../../../src/modules/community/components/pages/CreateBlogPost.vue"],"sourcesContent":["<template>\n <article \n class=\"w-100 bg-light radius-medium pos-relative\"\n >\n <section \n style=\"min-height: 100%;\"\n class=\"w-100 pd-big\"\n >\n <!-- Title -->\n <div \n class=\"w-full h-full\"\n >\n <!-- <Textarea \n v-if=\"post\" \n :prop=\"post\" \n :setFocus=\"true\"\n content=\"name\" \n placeholder=\"Enter post title\" \n class=\"h2\"\n /> -->\n </div>\n\n <Constructor \n v-if=\"post\" \n :content=\"post.content\"\n @update=\"update => post.content = update\"\n />\n\n </section>\n\n <transition name=\"scaleIn\" >\n <section v-if=\"post\" class=\"pd-small pos-sticky pos-l-0 pos-b-0 w-100 \">\n <div class=\"pd-thin radius-big bg-main w-100 flex-nowrap flex\">\n <a v-if=\"route.params.url\" @click=\"onDelete()\" class=\"mn-r-auto bg-red t-white t-black button\">Delete</a>\n <a @click=\"onDrafts()\" class=\"mn-l-auto bg-white t-black button\">To Drafts</a>\n <a @click=\"openPulicationPopup()\" class=\"mn-l-thin bg-black t-white button\">Publish</a>\n </div>\n </section>\n </transition>\n\n <Popup \n @close-popup=\"closePublicationPopup\" \n :isPopupOpen=\"isPublicationPopup\"\n class=\"w-m-33r t-left pd-big bg-white radius-big\"\n >\n <h3 class=\"mn-b-small\">Final Touches</h3>\n \n <BlockTags\n @tags-changed=\"newTags => post.tags = newTags\"\n :tags=\"post.tags\"\n class=\"mn-b-small\"\n />\n\n <h5 class=\"mn-b-thin\">Add source:</h5>\n <Field \n v-model:field=\"post.source\" \n placeholder=\"Add full link to the source\" \n class=\"mn-b-medium bg-light radius-medium pd-small\" \n />\n\n <h5 class=\"mn-b-thin\">Add to public</h5>\n <Card\n v-if=\"selectedOrganization\"\n :photo=\"selectedOrganization.profile?.photo\"\n :title=\"selectedOrganization.profile?.name\"\n @click=\"() => { \n selectedOrganization = null\n }\"\n class=\"h-4r w-100 bg-light pd-thin radius-medium mn-b-thin\"\n />\n\n <section v-else class=\"mn-b-thin h-25r o-x-hidden o-y-scroll bg-light radius-big pd-small \">\n <Feed\n :showLoadMore=\"false\" \n :search=\"{\n placeholder: 'Search organization...',\n class: 'bg-white mn-b-thin'\n }\"\n :states=\"{\n empty: {\n title: 'No organizations Found',\n description: 'Currently, there are no such organizations available.'\n }\n }\"\n :store=\"{\n read: (options) => organizations.actions.read(options),\n state: null\n }\"\n :options=\"{\n user: auth.state.user._id,\n postable: auth.state.user._id,\n lookup: ['memberships']\n }\"\n v-slot=\"{ \n items \n }\"\n >\n <Card\n v-for=\"(organization, index) in items\" \n v-memo=\"[organization._id, organization.profile.name]\"\n :photo=\"organization.profile?.photo\"\n :title=\"organization.profile?.name\"\n @click=\"() => { \n selectedOrganization = organization\n }\"\n class=\"h-4r bg-white pd-thin radius-medium w-100 mn-b-thin\"\n />\n </Feed>\n </section>\n\n <h5 v-if=\"selectedOrganization\" class=\"mn-b-thin\">Options:</h5>\n <div v-if=\"selectedOrganization\" class=\"mn-b-medium br-grey-transp-25 br-2px br-solid pd-small radius-big\">\n <Checkbox \n :label=\"'Hide Author'\"\n :radio=\"post.creator.hidden\"\n @update:radio=\"event => post.creator.hidden = event\"\n name=\"prices\"\n class=\"w-100\"\n />\n </div>\n \n <Button :submit=\"onSubmit\" :callback=\"redirectTo\" class=\"w-100 bg-black t-white\">Publish</Button>\n </Popup>\n \n </article>\n</template>\n\n<script setup>\nimport Textarea from '@martyrs/src/modules/constructor/components/elements/Textarea.vue';\nimport Constructor from '@martyrs/src/modules/constructor/components/sections/Constructor.vue';\n\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport FieldTags from '@martyrs/src/components/FieldTags/FieldTags.vue'\nimport BlockTags from '@martyrs/src/components/FieldTags/BlockTags.vue'\nimport Checkbox from '@martyrs/src/components/Checkbox/Checkbox.vue'\nimport Field from '@martyrs/src/components/Field/Field.vue'\nimport Button from '@martyrs/src/components/Button/Button.vue'; \nimport Feed from '@martyrs/src/components/Feed/Feed.vue'\n\nimport Card from '@martyrs/src/modules/globals/views/components/blocks/Card.vue';\n\nimport { ref, onMounted, watchEffect, nextTick, computed } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { VueDraggableNext } from 'vue-draggable-next';\n// Store & Router\nimport * as blog from '@martyrs/src/modules/community/store/blogposts.js';\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth'\nimport * as organizations from '@martyrs/src/modules/organizations/store/organizations'\n \nimport { useGlobalMixins } from \"@martyrs/src/modules/globals/views/mixins/mixins.js\"\n\nconst { hasAccess } = useGlobalMixins()\n\nconst route = useRoute();\nconst router = useRouter();\n\nlet post = ref(null);\nlet publics = ref(null);\n\nconst selectedTags = ref([]);\nconst selectedOrganization = ref(null);\n\nonMounted(async () =>{\n \n if (route.params.url) {\n const data = await blog.read({ user: auth.state.user._id, url: route.params.url });\n \n post.value = data.pop();\n\n if (!post.value) {\n router.push({name: 'notfound'})\n }\n\n if (post.value.owner.type === 'organization') {\n // Если пост принадлежит организации, проверяем права на редактирование через `hasAccess`\n const isAccess = hasAccess(post.value.owner.target._id, 'posts', 'edit', auth.state.accesses, auth.state.access.roles);\n\n if (!isAccess) {\n router.push({name: 'unauthorized'})\n }\n }\n\n if (post.value.owner.type === 'user' && post.value.creator.target._id !== auth.state.user._id) {\n router.push({name: 'unauthorized'})\n }\n } else {\n blog.clean();\n post.value = blog.state.current;\n }\n\n if (!post.value.owner) post.value.owner = {\n target: auth.state.user._id,\n type: 'user'\n }\n\n if (!post.value.creator) post.value.creator = {\n target: auth.state.user._id,\n type: 'user',\n hidden: false\n }\n\n\n if (post.value.owner.type === 'organization') selectedOrganization.value = {\n _id: post.value.owner.target._id,\n name: post.value.owner.target.profile.name,\n photo: post.value.owner.target.profile.photo\n }\n})\n// /////////////////////////////////////////\n// Publication Form\n// /////////////////////////////////////////\nconst tag = ref('');\nconst autocompleteItems = ref([\n { text: 'story' },\n { text: 'news' },\n { text: 'guide' },\n { text: 'discussion' },\n { text: 'photos' },\n]);\n\nconst filteredItems = computed(() => {\n return autocompleteItems.value.filter(i => {\n return i.text.toLowerCase().includes(tag.value.toLowerCase());\n });\n});\n\nconst filteredSuggestedItems = computed(() => {\n return autocompleteItems.value.filter(item => {\n return !selectedTags.value.some(tag => tag.text === item.text);\n });\n })\n\nfunction addTag (tag) {\n selectedTags.value.push(tag)\n}\n// /////////////////////////////////////////\n// Publication Popup\n// /////////////////////////////////////////\nconst isPublicationPopup = ref(false)\n\nfunction openPulicationPopup() {\n isPublicationPopup.value = true;\n}\nfunction closePublicationPopup() {\n isPublicationPopup.value = false;\n}\n\nfunction onDrafts() {\n\n if (selectedTags.value.length > 0) selectedTags.value.map(tag => (tag.text))\n\n post.value.status = \"draft\"\n post.value.name = post.value.content[0].content\n\n if (route.params.url) {\n blog.update(post.value)\n .then(response => {\n router.push({ name: 'BlogPost', params: { url: response.url } });\n })\n .catch(error => {\n console.log(error);\n });\n } else {\n blog.create(post.value)\n .then(response => {\n router.push({ name: 'BlogPost', params: { url: response.url } });\n })\n .catch(error => {\n console.log(error);\n });\n }\n}\n\nfunction onSubmit() {\n\n if (selectedOrganization.value) post.value.owner = {\n target: selectedOrganization.value._id,\n type: 'organization'\n }\n\n if (!selectedOrganization.value) post.value.creator.hidden = false\n if (!selectedOrganization.value) post.value.organization = post.value.creator\n\n post.value.status = \"published\"\n post.value.name = post.value.content[0].content\n\n if (route.params.url) {\n blog.update(post.value)\n .then(response => {\n console.log(post.value)\n router.push({ name: 'BlogPost', params: { url: response.url } });\n })\n .catch(error => {\n console.error(error);\n });\n } else {\n blog.create(post.value)\n .then(response => {\n router.push({ name: 'BlogPost', params: { url: response.url } });\n })\n .catch(error => {\n console.error(error);\n });\n }\n}\n\nfunction onDelete() {\n if (confirm('Are you sure you want to delete this post?')) {\n blog.remove(post.value._id)\n .then(response => {\n router.push({ name: 'User Posts', params: { _id: post.value.creator.target._id } });\n })\n .catch(error => {\n console.log(error);\n });\n }\n}\n</script>\n\n\n<style lang=\"scss\">\n\n</style>\n"],"names":["useGlobalMixins","useRoute","useRouter","ref","onMounted","blog.read","auth.state","blog.clean","blog.state","computed","tag","blog.update","blog.create","blog.remove"],"mappings":"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"}
@@ -17,14 +17,14 @@ import { read, clean, state as state$1, remove, update, create } from "../../sto
17
17
  import { state } from "../../../auth/views/store/auth.js";
18
18
  import { actions } from "../../../organizations/store/organizations.js";
19
19
  import { useGlobalMixins } from "../../../globals/views/mixins/mixins.js";
20
- const _hoisted_1 = { class: "w-100 h-100 pos-relative" };
20
+ const _hoisted_1 = { class: "w-100 bg-light radius-medium pos-relative" };
21
21
  const _hoisted_2 = {
22
22
  style: { "min-height": "100%" },
23
- class: "w-100 bg-white pd-big radius-medium"
23
+ class: "w-100 pd-big"
24
24
  };
25
25
  const _hoisted_3 = {
26
26
  key: 0,
27
- class: "pd-thin pos-sticky pos-l-0 pos-b-0 w-100"
27
+ class: "pd-small pos-sticky pos-l-0 pos-b-0 w-100"
28
28
  };
29
29
  const _hoisted_4 = { class: "pd-thin radius-big bg-main w-100 flex-nowrap flex" };
30
30
  const _hoisted_5 = {
@@ -1 +1 @@
1
- {"version":3,"file":"CreateBlogPost.vue.js","sources":["../../../../../../../src/modules/community/components/pages/CreateBlogPost.vue"],"sourcesContent":["<template>\n <article \n class=\"w-100 h-100 pos-relative\"\n >\n <section \n style=\"min-height: 100%;\"\n class=\"w-100 bg-white pd-big radius-medium\"\n >\n <!-- Title -->\n <div \n class=\"w-full h-full\"\n >\n <!-- <Textarea \n v-if=\"post\" \n :prop=\"post\" \n :setFocus=\"true\"\n content=\"name\" \n placeholder=\"Enter post title\" \n class=\"h2\"\n /> -->\n </div>\n\n <Constructor \n v-if=\"post\" \n :content=\"post.content\"\n @update=\"update => post.content = update\"\n />\n\n </section>\n\n <transition name=\"scaleIn\" >\n <section v-if=\"post\" class=\"pd-thin pos-sticky pos-l-0 pos-b-0 w-100 \">\n <div class=\"pd-thin radius-big bg-main w-100 flex-nowrap flex\">\n <a v-if=\"route.params.url\" @click=\"onDelete()\" class=\"mn-r-auto bg-red t-white t-black button\">Delete</a>\n <a @click=\"onDrafts()\" class=\"mn-l-auto bg-white t-black button\">To Drafts</a>\n <a @click=\"openPulicationPopup()\" class=\"mn-l-thin bg-black t-white button\">Publish</a>\n </div>\n </section>\n </transition>\n\n <Popup \n @close-popup=\"closePublicationPopup\" \n :isPopupOpen=\"isPublicationPopup\"\n class=\"w-m-33r t-left pd-big bg-white radius-big\"\n >\n <h3 class=\"mn-b-small\">Final Touches</h3>\n \n <BlockTags\n @tags-changed=\"newTags => post.tags = newTags\"\n :tags=\"post.tags\"\n class=\"mn-b-small\"\n />\n\n <h5 class=\"mn-b-thin\">Add source:</h5>\n <Field \n v-model:field=\"post.source\" \n placeholder=\"Add full link to the source\" \n class=\"mn-b-medium bg-light radius-medium pd-small\" \n />\n\n <h5 class=\"mn-b-thin\">Add to public</h5>\n <Card\n v-if=\"selectedOrganization\"\n :photo=\"selectedOrganization.profile?.photo\"\n :title=\"selectedOrganization.profile?.name\"\n @click=\"() => { \n selectedOrganization = null\n }\"\n class=\"h-4r w-100 bg-light pd-thin radius-medium mn-b-thin\"\n />\n\n <section v-else class=\"mn-b-thin h-25r o-x-hidden o-y-scroll bg-light radius-big pd-small \">\n <Feed\n :showLoadMore=\"false\" \n :search=\"{\n placeholder: 'Search organization...',\n class: 'bg-white mn-b-thin'\n }\"\n :states=\"{\n empty: {\n title: 'No organizations Found',\n description: 'Currently, there are no such organizations available.'\n }\n }\"\n :store=\"{\n read: (options) => organizations.actions.read(options),\n state: null\n }\"\n :options=\"{\n user: auth.state.user._id,\n postable: auth.state.user._id,\n lookup: ['memberships']\n }\"\n v-slot=\"{ \n items \n }\"\n >\n <Card\n v-for=\"(organization, index) in items\" \n v-memo=\"[organization._id, organization.profile.name]\"\n :photo=\"organization.profile?.photo\"\n :title=\"organization.profile?.name\"\n @click=\"() => { \n selectedOrganization = organization\n }\"\n class=\"h-4r bg-white pd-thin radius-medium w-100 mn-b-thin\"\n />\n </Feed>\n </section>\n\n <h5 v-if=\"selectedOrganization\" class=\"mn-b-thin\">Options:</h5>\n <div v-if=\"selectedOrganization\" class=\"mn-b-medium br-grey-transp-25 br-2px br-solid pd-small radius-big\">\n <Checkbox \n :label=\"'Hide Author'\"\n :radio=\"post.creator.hidden\"\n @update:radio=\"event => post.creator.hidden = event\"\n name=\"prices\"\n class=\"w-100\"\n />\n </div>\n \n <Button :submit=\"onSubmit\" :callback=\"redirectTo\" class=\"w-100 bg-black t-white\">Publish</Button>\n </Popup>\n \n </article>\n</template>\n\n<script setup>\nimport Textarea from '@martyrs/src/modules/constructor/components/elements/Textarea.vue';\nimport Constructor from '@martyrs/src/modules/constructor/components/sections/Constructor.vue';\n\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport FieldTags from '@martyrs/src/components/FieldTags/FieldTags.vue'\nimport BlockTags from '@martyrs/src/components/FieldTags/BlockTags.vue'\nimport Checkbox from '@martyrs/src/components/Checkbox/Checkbox.vue'\nimport Field from '@martyrs/src/components/Field/Field.vue'\nimport Button from '@martyrs/src/components/Button/Button.vue'; \nimport Feed from '@martyrs/src/components/Feed/Feed.vue'\n\nimport Card from '@martyrs/src/modules/globals/views/components/blocks/Card.vue';\n\nimport { ref, onMounted, watchEffect, nextTick, computed } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { VueDraggableNext } from 'vue-draggable-next';\n// Store & Router\nimport * as blog from '@martyrs/src/modules/community/store/blogposts.js';\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth'\nimport * as organizations from '@martyrs/src/modules/organizations/store/organizations'\n \nimport { useGlobalMixins } from \"@martyrs/src/modules/globals/views/mixins/mixins.js\"\n\nconst { hasAccess } = useGlobalMixins()\n\nconst route = useRoute();\nconst router = useRouter();\n\nlet post = ref(null);\nlet publics = ref(null);\n\nconst selectedTags = ref([]);\nconst selectedOrganization = ref(null);\n\nonMounted(async () =>{\n \n if (route.params.url) {\n const data = await blog.read({ user: auth.state.user._id, url: route.params.url });\n \n post.value = data.pop();\n\n if (!post.value) {\n router.push({name: 'notfound'})\n }\n\n if (post.value.owner.type === 'organization') {\n // Если пост принадлежит организации, проверяем права на редактирование через `hasAccess`\n const isAccess = hasAccess(post.value.owner.target._id, 'posts', 'edit', auth.state.accesses, auth.state.access.roles);\n\n if (!isAccess) {\n router.push({name: 'unauthorized'})\n }\n }\n\n if (post.value.owner.type === 'user' && post.value.creator.target._id !== auth.state.user._id) {\n router.push({name: 'unauthorized'})\n }\n } else {\n blog.clean();\n post.value = blog.state.current;\n }\n\n if (!post.value.owner) post.value.owner = {\n target: auth.state.user._id,\n type: 'user'\n }\n\n if (!post.value.creator) post.value.creator = {\n target: auth.state.user._id,\n type: 'user',\n hidden: false\n }\n\n\n if (post.value.owner.type === 'organization') selectedOrganization.value = {\n _id: post.value.owner.target._id,\n name: post.value.owner.target.profile.name,\n photo: post.value.owner.target.profile.photo\n }\n})\n// /////////////////////////////////////////\n// Publication Form\n// /////////////////////////////////////////\nconst tag = ref('');\nconst autocompleteItems = ref([\n { text: 'story' },\n { text: 'news' },\n { text: 'guide' },\n { text: 'discussion' },\n { text: 'photos' },\n]);\n\nconst filteredItems = computed(() => {\n return autocompleteItems.value.filter(i => {\n return i.text.toLowerCase().includes(tag.value.toLowerCase());\n });\n});\n\nconst filteredSuggestedItems = computed(() => {\n return autocompleteItems.value.filter(item => {\n return !selectedTags.value.some(tag => tag.text === item.text);\n });\n })\n\nfunction addTag (tag) {\n selectedTags.value.push(tag)\n}\n// /////////////////////////////////////////\n// Publication Popup\n// /////////////////////////////////////////\nconst isPublicationPopup = ref(false)\n\nfunction openPulicationPopup() {\n isPublicationPopup.value = true;\n}\nfunction closePublicationPopup() {\n isPublicationPopup.value = false;\n}\n\nfunction onDrafts() {\n\n if (selectedTags.value.length > 0) selectedTags.value.map(tag => (tag.text))\n\n post.value.status = \"draft\"\n post.value.name = post.value.content[0].content\n\n if (route.params.url) {\n blog.update(post.value)\n .then(response => {\n router.push({ name: 'BlogPost', params: { url: response.url } });\n })\n .catch(error => {\n console.log(error);\n });\n } else {\n blog.create(post.value)\n .then(response => {\n router.push({ name: 'BlogPost', params: { url: response.url } });\n })\n .catch(error => {\n console.log(error);\n });\n }\n}\n\nfunction onSubmit() {\n\n if (selectedOrganization.value) post.value.owner = {\n target: selectedOrganization.value._id,\n type: 'organization'\n }\n\n if (!selectedOrganization.value) post.value.creator.hidden = false\n if (!selectedOrganization.value) post.value.organization = post.value.creator\n\n post.value.status = \"published\"\n post.value.name = post.value.content[0].content\n\n if (route.params.url) {\n blog.update(post.value)\n .then(response => {\n console.log(post.value)\n router.push({ name: 'BlogPost', params: { url: response.url } });\n })\n .catch(error => {\n console.error(error);\n });\n } else {\n blog.create(post.value)\n .then(response => {\n router.push({ name: 'BlogPost', params: { url: response.url } });\n })\n .catch(error => {\n console.error(error);\n });\n }\n}\n\nfunction onDelete() {\n if (confirm('Are you sure you want to delete this post?')) {\n blog.remove(post.value._id)\n .then(response => {\n router.push({ name: 'User Posts', params: { _id: post.value.creator.target._id } });\n })\n .catch(error => {\n console.log(error);\n });\n }\n}\n</script>\n\n\n<style lang=\"scss\">\n\n</style>\n"],"names":["blog.read","auth.state","blog.clean","blog.state","tag","blog.update","blog.create","blog.remove"],"mappings":"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"}
1
+ {"version":3,"file":"CreateBlogPost.vue.js","sources":["../../../../../../../src/modules/community/components/pages/CreateBlogPost.vue"],"sourcesContent":["<template>\n <article \n class=\"w-100 bg-light radius-medium pos-relative\"\n >\n <section \n style=\"min-height: 100%;\"\n class=\"w-100 pd-big\"\n >\n <!-- Title -->\n <div \n class=\"w-full h-full\"\n >\n <!-- <Textarea \n v-if=\"post\" \n :prop=\"post\" \n :setFocus=\"true\"\n content=\"name\" \n placeholder=\"Enter post title\" \n class=\"h2\"\n /> -->\n </div>\n\n <Constructor \n v-if=\"post\" \n :content=\"post.content\"\n @update=\"update => post.content = update\"\n />\n\n </section>\n\n <transition name=\"scaleIn\" >\n <section v-if=\"post\" class=\"pd-small pos-sticky pos-l-0 pos-b-0 w-100 \">\n <div class=\"pd-thin radius-big bg-main w-100 flex-nowrap flex\">\n <a v-if=\"route.params.url\" @click=\"onDelete()\" class=\"mn-r-auto bg-red t-white t-black button\">Delete</a>\n <a @click=\"onDrafts()\" class=\"mn-l-auto bg-white t-black button\">To Drafts</a>\n <a @click=\"openPulicationPopup()\" class=\"mn-l-thin bg-black t-white button\">Publish</a>\n </div>\n </section>\n </transition>\n\n <Popup \n @close-popup=\"closePublicationPopup\" \n :isPopupOpen=\"isPublicationPopup\"\n class=\"w-m-33r t-left pd-big bg-white radius-big\"\n >\n <h3 class=\"mn-b-small\">Final Touches</h3>\n \n <BlockTags\n @tags-changed=\"newTags => post.tags = newTags\"\n :tags=\"post.tags\"\n class=\"mn-b-small\"\n />\n\n <h5 class=\"mn-b-thin\">Add source:</h5>\n <Field \n v-model:field=\"post.source\" \n placeholder=\"Add full link to the source\" \n class=\"mn-b-medium bg-light radius-medium pd-small\" \n />\n\n <h5 class=\"mn-b-thin\">Add to public</h5>\n <Card\n v-if=\"selectedOrganization\"\n :photo=\"selectedOrganization.profile?.photo\"\n :title=\"selectedOrganization.profile?.name\"\n @click=\"() => { \n selectedOrganization = null\n }\"\n class=\"h-4r w-100 bg-light pd-thin radius-medium mn-b-thin\"\n />\n\n <section v-else class=\"mn-b-thin h-25r o-x-hidden o-y-scroll bg-light radius-big pd-small \">\n <Feed\n :showLoadMore=\"false\" \n :search=\"{\n placeholder: 'Search organization...',\n class: 'bg-white mn-b-thin'\n }\"\n :states=\"{\n empty: {\n title: 'No organizations Found',\n description: 'Currently, there are no such organizations available.'\n }\n }\"\n :store=\"{\n read: (options) => organizations.actions.read(options),\n state: null\n }\"\n :options=\"{\n user: auth.state.user._id,\n postable: auth.state.user._id,\n lookup: ['memberships']\n }\"\n v-slot=\"{ \n items \n }\"\n >\n <Card\n v-for=\"(organization, index) in items\" \n v-memo=\"[organization._id, organization.profile.name]\"\n :photo=\"organization.profile?.photo\"\n :title=\"organization.profile?.name\"\n @click=\"() => { \n selectedOrganization = organization\n }\"\n class=\"h-4r bg-white pd-thin radius-medium w-100 mn-b-thin\"\n />\n </Feed>\n </section>\n\n <h5 v-if=\"selectedOrganization\" class=\"mn-b-thin\">Options:</h5>\n <div v-if=\"selectedOrganization\" class=\"mn-b-medium br-grey-transp-25 br-2px br-solid pd-small radius-big\">\n <Checkbox \n :label=\"'Hide Author'\"\n :radio=\"post.creator.hidden\"\n @update:radio=\"event => post.creator.hidden = event\"\n name=\"prices\"\n class=\"w-100\"\n />\n </div>\n \n <Button :submit=\"onSubmit\" :callback=\"redirectTo\" class=\"w-100 bg-black t-white\">Publish</Button>\n </Popup>\n \n </article>\n</template>\n\n<script setup>\nimport Textarea from '@martyrs/src/modules/constructor/components/elements/Textarea.vue';\nimport Constructor from '@martyrs/src/modules/constructor/components/sections/Constructor.vue';\n\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport FieldTags from '@martyrs/src/components/FieldTags/FieldTags.vue'\nimport BlockTags from '@martyrs/src/components/FieldTags/BlockTags.vue'\nimport Checkbox from '@martyrs/src/components/Checkbox/Checkbox.vue'\nimport Field from '@martyrs/src/components/Field/Field.vue'\nimport Button from '@martyrs/src/components/Button/Button.vue'; \nimport Feed from '@martyrs/src/components/Feed/Feed.vue'\n\nimport Card from '@martyrs/src/modules/globals/views/components/blocks/Card.vue';\n\nimport { ref, onMounted, watchEffect, nextTick, computed } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { VueDraggableNext } from 'vue-draggable-next';\n// Store & Router\nimport * as blog from '@martyrs/src/modules/community/store/blogposts.js';\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth'\nimport * as organizations from '@martyrs/src/modules/organizations/store/organizations'\n \nimport { useGlobalMixins } from \"@martyrs/src/modules/globals/views/mixins/mixins.js\"\n\nconst { hasAccess } = useGlobalMixins()\n\nconst route = useRoute();\nconst router = useRouter();\n\nlet post = ref(null);\nlet publics = ref(null);\n\nconst selectedTags = ref([]);\nconst selectedOrganization = ref(null);\n\nonMounted(async () =>{\n \n if (route.params.url) {\n const data = await blog.read({ user: auth.state.user._id, url: route.params.url });\n \n post.value = data.pop();\n\n if (!post.value) {\n router.push({name: 'notfound'})\n }\n\n if (post.value.owner.type === 'organization') {\n // Если пост принадлежит организации, проверяем права на редактирование через `hasAccess`\n const isAccess = hasAccess(post.value.owner.target._id, 'posts', 'edit', auth.state.accesses, auth.state.access.roles);\n\n if (!isAccess) {\n router.push({name: 'unauthorized'})\n }\n }\n\n if (post.value.owner.type === 'user' && post.value.creator.target._id !== auth.state.user._id) {\n router.push({name: 'unauthorized'})\n }\n } else {\n blog.clean();\n post.value = blog.state.current;\n }\n\n if (!post.value.owner) post.value.owner = {\n target: auth.state.user._id,\n type: 'user'\n }\n\n if (!post.value.creator) post.value.creator = {\n target: auth.state.user._id,\n type: 'user',\n hidden: false\n }\n\n\n if (post.value.owner.type === 'organization') selectedOrganization.value = {\n _id: post.value.owner.target._id,\n name: post.value.owner.target.profile.name,\n photo: post.value.owner.target.profile.photo\n }\n})\n// /////////////////////////////////////////\n// Publication Form\n// /////////////////////////////////////////\nconst tag = ref('');\nconst autocompleteItems = ref([\n { text: 'story' },\n { text: 'news' },\n { text: 'guide' },\n { text: 'discussion' },\n { text: 'photos' },\n]);\n\nconst filteredItems = computed(() => {\n return autocompleteItems.value.filter(i => {\n return i.text.toLowerCase().includes(tag.value.toLowerCase());\n });\n});\n\nconst filteredSuggestedItems = computed(() => {\n return autocompleteItems.value.filter(item => {\n return !selectedTags.value.some(tag => tag.text === item.text);\n });\n })\n\nfunction addTag (tag) {\n selectedTags.value.push(tag)\n}\n// /////////////////////////////////////////\n// Publication Popup\n// /////////////////////////////////////////\nconst isPublicationPopup = ref(false)\n\nfunction openPulicationPopup() {\n isPublicationPopup.value = true;\n}\nfunction closePublicationPopup() {\n isPublicationPopup.value = false;\n}\n\nfunction onDrafts() {\n\n if (selectedTags.value.length > 0) selectedTags.value.map(tag => (tag.text))\n\n post.value.status = \"draft\"\n post.value.name = post.value.content[0].content\n\n if (route.params.url) {\n blog.update(post.value)\n .then(response => {\n router.push({ name: 'BlogPost', params: { url: response.url } });\n })\n .catch(error => {\n console.log(error);\n });\n } else {\n blog.create(post.value)\n .then(response => {\n router.push({ name: 'BlogPost', params: { url: response.url } });\n })\n .catch(error => {\n console.log(error);\n });\n }\n}\n\nfunction onSubmit() {\n\n if (selectedOrganization.value) post.value.owner = {\n target: selectedOrganization.value._id,\n type: 'organization'\n }\n\n if (!selectedOrganization.value) post.value.creator.hidden = false\n if (!selectedOrganization.value) post.value.organization = post.value.creator\n\n post.value.status = \"published\"\n post.value.name = post.value.content[0].content\n\n if (route.params.url) {\n blog.update(post.value)\n .then(response => {\n console.log(post.value)\n router.push({ name: 'BlogPost', params: { url: response.url } });\n })\n .catch(error => {\n console.error(error);\n });\n } else {\n blog.create(post.value)\n .then(response => {\n router.push({ name: 'BlogPost', params: { url: response.url } });\n })\n .catch(error => {\n console.error(error);\n });\n }\n}\n\nfunction onDelete() {\n if (confirm('Are you sure you want to delete this post?')) {\n blog.remove(post.value._id)\n .then(response => {\n router.push({ name: 'User Posts', params: { _id: post.value.creator.target._id } });\n })\n .catch(error => {\n console.log(error);\n });\n }\n}\n</script>\n\n\n<style lang=\"scss\">\n\n</style>\n"],"names":["blog.read","auth.state","blog.clean","blog.state","tag","blog.update","blog.create","blog.remove"],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
3
  const vue = require("vue");
4
4
  require("axios");
5
- const _hoisted_1 = { class: "mn-b-thin w-100 pd-medium bg-black radius-medium" };
5
+ const _hoisted_1 = { class: "mn-b-thin w-100 o-hidden bg-black radius-medium" };
6
6
  const _hoisted_2 = {
7
7
  key: 0,
8
8
  class: "flex-center flex"
@@ -1 +1 @@
1
- {"version":3,"file":"VideoPlayer.vue.cjs","sources":["../../../../../../../src/modules/constructor/components/elements/VideoPlayer.vue"],"sourcesContent":["<template>\n <div \n class=\"mn-b-thin w-100 pd-medium bg-black radius-medium\"\n >\n \n <div v-if=\"prop.content\" class=\"flex-center flex\">\n <video controls class=\"w-100 h-max-30r\">\n <source :src=\"prop.content\" type=\"video/mp4\">\n Your browser does not support the video tag.\n </video>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { ref } from 'vue';\n\nimport Upload from '@martyrs/src/components/Upload/Upload.vue'\n\nconst imageUrl = ref(null);\nconst fileInput = ref(null);\n\nconst props = defineProps([\n 'label',\n 'value',\n 'prop'\n]);\n\nconst emit = defineEmits(['input', 'updateBlock']);\n\nfunction isValidEmbedCode(code) {\n const allowedSources = [/youtube\\.com/, /soundcloud\\.com/, /vimeo\\.com/];\n return allowedSources.some(pattern => pattern.test(code));\n}\n\n\nfunction updateBlock(updatedBlock) {\n const index = post.value.content.findIndex(block => block === updatedBlock);\n if (index !== -1) {\n post.value.content.splice(index, 1, updatedBlock);\n }\n}\n\n\nfunction onComponentSave(url) {\n console.log(imageUrl.value )\n\n imageUrl.value = url\n\n if (imageUrl.value ) {\n emit('input', imageUrl.value);\n emit('updateBlock', props.prop, { content: imageUrl.value });\n } else {\n alert('Invalid embed code or source not allowed.');\n }\n}\n\n</script>\n\n"],"names":["ref"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAmBiBA,QAAAA,IAAI,IAAI;AACPA,QAAAA,IAAI,IAAI;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"VideoPlayer.vue.cjs","sources":["../../../../../../../src/modules/constructor/components/elements/VideoPlayer.vue"],"sourcesContent":["<template>\n <div \n class=\"mn-b-thin w-100 o-hidden bg-black radius-medium\"\n >\n \n <div v-if=\"prop.content\" class=\"flex-center flex\">\n <video controls class=\"w-100 h-max-30r\">\n <source :src=\"prop.content\" type=\"video/mp4\">\n Your browser does not support the video tag.\n </video>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { ref } from 'vue';\n\nimport Upload from '@martyrs/src/components/Upload/Upload.vue'\n\nconst imageUrl = ref(null);\nconst fileInput = ref(null);\n\nconst props = defineProps([\n 'label',\n 'value',\n 'prop'\n]);\n\nconst emit = defineEmits(['input', 'updateBlock']);\n\nfunction isValidEmbedCode(code) {\n const allowedSources = [/youtube\\.com/, /soundcloud\\.com/, /vimeo\\.com/];\n return allowedSources.some(pattern => pattern.test(code));\n}\n\n\nfunction updateBlock(updatedBlock) {\n const index = post.value.content.findIndex(block => block === updatedBlock);\n if (index !== -1) {\n post.value.content.splice(index, 1, updatedBlock);\n }\n}\n\n\nfunction onComponentSave(url) {\n console.log(imageUrl.value )\n\n imageUrl.value = url\n\n if (imageUrl.value ) {\n emit('input', imageUrl.value);\n emit('updateBlock', props.prop, { content: imageUrl.value });\n } else {\n alert('Invalid embed code or source not allowed.');\n }\n}\n\n</script>\n\n"],"names":["ref"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAmBiBA,QAAAA,IAAI,IAAI;AACPA,QAAAA,IAAI,IAAI;;;;;;;;;;;;;;;;;"}
@@ -1,6 +1,6 @@
1
1
  import { ref, createElementBlock, openBlock, createCommentVNode, createElementVNode, createTextVNode } from "vue";
2
2
  import "axios";
3
- const _hoisted_1 = { class: "mn-b-thin w-100 pd-medium bg-black radius-medium" };
3
+ const _hoisted_1 = { class: "mn-b-thin w-100 o-hidden bg-black radius-medium" };
4
4
  const _hoisted_2 = {
5
5
  key: 0,
6
6
  class: "flex-center flex"
@@ -1 +1 @@
1
- {"version":3,"file":"VideoPlayer.vue.js","sources":["../../../../../../../src/modules/constructor/components/elements/VideoPlayer.vue"],"sourcesContent":["<template>\n <div \n class=\"mn-b-thin w-100 pd-medium bg-black radius-medium\"\n >\n \n <div v-if=\"prop.content\" class=\"flex-center flex\">\n <video controls class=\"w-100 h-max-30r\">\n <source :src=\"prop.content\" type=\"video/mp4\">\n Your browser does not support the video tag.\n </video>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { ref } from 'vue';\n\nimport Upload from '@martyrs/src/components/Upload/Upload.vue'\n\nconst imageUrl = ref(null);\nconst fileInput = ref(null);\n\nconst props = defineProps([\n 'label',\n 'value',\n 'prop'\n]);\n\nconst emit = defineEmits(['input', 'updateBlock']);\n\nfunction isValidEmbedCode(code) {\n const allowedSources = [/youtube\\.com/, /soundcloud\\.com/, /vimeo\\.com/];\n return allowedSources.some(pattern => pattern.test(code));\n}\n\n\nfunction updateBlock(updatedBlock) {\n const index = post.value.content.findIndex(block => block === updatedBlock);\n if (index !== -1) {\n post.value.content.splice(index, 1, updatedBlock);\n }\n}\n\n\nfunction onComponentSave(url) {\n console.log(imageUrl.value )\n\n imageUrl.value = url\n\n if (imageUrl.value ) {\n emit('input', imageUrl.value);\n emit('updateBlock', props.prop, { content: imageUrl.value });\n } else {\n alert('Invalid embed code or source not allowed.');\n }\n}\n\n</script>\n\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAmBiB,QAAI,IAAI;AACP,QAAI,IAAI;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"VideoPlayer.vue.js","sources":["../../../../../../../src/modules/constructor/components/elements/VideoPlayer.vue"],"sourcesContent":["<template>\n <div \n class=\"mn-b-thin w-100 o-hidden bg-black radius-medium\"\n >\n \n <div v-if=\"prop.content\" class=\"flex-center flex\">\n <video controls class=\"w-100 h-max-30r\">\n <source :src=\"prop.content\" type=\"video/mp4\">\n Your browser does not support the video tag.\n </video>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { ref } from 'vue';\n\nimport Upload from '@martyrs/src/components/Upload/Upload.vue'\n\nconst imageUrl = ref(null);\nconst fileInput = ref(null);\n\nconst props = defineProps([\n 'label',\n 'value',\n 'prop'\n]);\n\nconst emit = defineEmits(['input', 'updateBlock']);\n\nfunction isValidEmbedCode(code) {\n const allowedSources = [/youtube\\.com/, /soundcloud\\.com/, /vimeo\\.com/];\n return allowedSources.some(pattern => pattern.test(code));\n}\n\n\nfunction updateBlock(updatedBlock) {\n const index = post.value.content.findIndex(block => block === updatedBlock);\n if (index !== -1) {\n post.value.content.splice(index, 1, updatedBlock);\n }\n}\n\n\nfunction onComponentSave(url) {\n console.log(imageUrl.value )\n\n imageUrl.value = url\n\n if (imageUrl.value ) {\n emit('input', imageUrl.value);\n emit('updateBlock', props.prop, { content: imageUrl.value });\n } else {\n alert('Invalid embed code or source not allowed.');\n }\n}\n\n</script>\n\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAmBiB,QAAI,IAAI;AACP,QAAI,IAAI;;;;;;;;;;;;;;;;"}
@@ -18,7 +18,7 @@ const _hoisted_3 = {
18
18
  };
19
19
  const _hoisted_4 = {
20
20
  key: 0,
21
- class: "z-index-5 radius-thin pd-thin bg-light w-max mn-b-small flex-nowrap flex-column flex"
21
+ class: "z-index-5 radius-thin pd-thin bg-white w-max mn-b-small flex-nowrap flex-column flex"
22
22
  };
23
23
  const _hoisted_5 = ["onClick"];
24
24
  const _hoisted_6 = ["onClick"];
@@ -147,37 +147,37 @@ const _sfc_main = {
147
147
  showControls.value === index ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3, [
148
148
  vue.createElementVNode("button", {
149
149
  onClick: _cache[0] || (_cache[0] = ($event) => showMenu.value = !showMenu.value),
150
- class: "mn-b-small cursor-pointer w-100 i-semi bg-light radius-thin"
150
+ class: "mn-b-small cursor-pointer w-100 i-semi bg-white radius-thin"
151
151
  }, vue.toDisplayString(block.content ? "⋯" : "+"), 1),
152
152
  showMenu.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4, [
153
153
  index !== 0 ? (vue.openBlock(), vue.createElementBlock("span", {
154
154
  key: 0,
155
155
  onClick: ($event) => handleDeleteBlock(block),
156
- class: "mn-b-thin w-max t-red bg-light button-small button"
156
+ class: "mn-b-thin w-max t-red bg-white button-small button"
157
157
  }, " Remove ", 8, _hoisted_5)) : vue.createCommentVNode("", true),
158
158
  vue.createElementVNode("span", {
159
159
  onClick: ($event) => handleAddBlock("ImageUpload", "", index),
160
- class: "mn-b-thin w-max t-black bg-light button-small button"
160
+ class: "mn-b-thin w-max t-black bg-white button-small button"
161
161
  }, " Add Image ", 8, _hoisted_6),
162
162
  vue.createElementVNode("span", {
163
163
  onClick: ($event) => handleAddBlock("H2", "", index),
164
- class: "w-max button-small t-black bg-light button"
164
+ class: "w-max button-small t-black bg-white button"
165
165
  }, " Add Title ", 8, _hoisted_7),
166
166
  vue.createElementVNode("span", {
167
167
  onClick: ($event) => handleAddBlock("Card", { photo: "", title: "", subtitle: "" }, index),
168
- class: "w-max button-small t-black bg-light button"
168
+ class: "w-max button-small t-black bg-white button"
169
169
  }, " Add Card ", 8, _hoisted_8),
170
170
  vue.createElementVNode("span", {
171
171
  onClick: ($event) => handleAddBlock("Embed", "", index),
172
- class: "w-max button-small t-black bg-light button"
172
+ class: "w-max button-small t-black bg-white button"
173
173
  }, " Add Embed ", 8, _hoisted_9),
174
174
  vue.createElementVNode("span", {
175
175
  onClick: ($event) => handleAddBlock("Audio", "", index),
176
- class: "w-max button-small t-black bg-light button"
176
+ class: "w-max button-small t-black bg-white button"
177
177
  }, " Add Audio ", 8, _hoisted_10),
178
178
  vue.createElementVNode("span", {
179
179
  onClick: ($event) => handleAddBlock("Video", "", index),
180
- class: "w-max button-small t-black bg-light button"
180
+ class: "w-max button-small t-black bg-white button"
181
181
  }, " Add Video ", 8, _hoisted_11)
182
182
  ])) : vue.createCommentVNode("", true)
183
183
  ])) : vue.createCommentVNode("", true)