@ozdao/martyrs 0.2.566 → 0.2.567
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.
- package/dist/{main-B9o1iBAZ.js → main-BFvlam0J.js} +9 -6
- package/dist/martyrs/dist/{main-B9o1iBAZ.js → main-BFvlam0J.js} +2 -2
- package/dist/martyrs/dist/{main-B9o1iBAZ.js.map → main-BFvlam0J.js.map} +1 -1
- package/dist/martyrs/dist/{web-BF3ijvEr.js → web-CH5wzMHy.js} +2 -2
- package/dist/martyrs/dist/{web-BF3ijvEr.js.map → web-CH5wzMHy.js.map} +1 -1
- package/dist/martyrs/src/components/Feed/Carousel.vue.js +2 -2
- package/dist/martyrs/src/components/Feed/Carousel.vue.js.map +1 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.js +6 -3
- package/dist/martyrs/src/components/Feed/Feed.vue.js.map +1 -1
- package/dist/martyrs/src/components/Menu/{Menu.vue2.js → Menu.vue.js} +2 -2
- package/dist/martyrs/src/components/Menu/Menu.vue.js.map +1 -0
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/sections/HotPosts.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/sections/EventsHot.vue.js +17 -1
- package/dist/martyrs/src/modules/events/components/sections/EventsHot.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +3 -3
- package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/player/FullscreenPlayer.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +1 -1
- package/dist/martyrs.css +1 -1
- package/dist/martyrs.es.js +1 -1
- package/dist/style.css +7 -7
- package/dist/{web-BF3ijvEr.js → web-CH5wzMHy.js} +1 -1
- package/package.json +1 -1
- package/src/components/Feed/Carousel.vue +1 -1
- package/src/components/Feed/Feed.vue +3 -3
- package/src/modules/community/components/sections/HotPosts.vue +8 -4
- package/src/modules/events/components/sections/EventsHot.vue +21 -4
- package/src/modules/music/components/cards/TrackListCard.vue +6 -6
- package/dist/martyrs/src/components/Menu/Menu.vue2.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { W as Nn } from "./main-
|
|
1
|
+
import { W as Nn } from "./main-BFvlam0J.js";
|
|
2
2
|
class f extends Nn {
|
|
3
3
|
constructor() {
|
|
4
4
|
super(...arguments), this.group = "CapacitorStorage";
|
|
@@ -52,4 +52,4 @@ class f extends Nn {
|
|
|
52
52
|
export {
|
|
53
53
|
f as PreferencesWeb
|
|
54
54
|
};
|
|
55
|
-
//# sourceMappingURL=web-
|
|
55
|
+
//# sourceMappingURL=web-CH5wzMHy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-
|
|
1
|
+
{"version":3,"file":"web-CH5wzMHy.js","sources":["../../web-CH5wzMHy.js"],"sourcesContent":["import { W as p } from \"./main-BFvlam0J.js\";\nclass f extends p {\n constructor() {\n super(...arguments), this.group = \"CapacitorStorage\";\n }\n async configure({ group: e }) {\n typeof e == \"string\" && (this.group = e);\n }\n async get(e) {\n return { value: this.impl.getItem(this.applyPrefix(e.key)) };\n }\n async set(e) {\n this.impl.setItem(this.applyPrefix(e.key), e.value);\n }\n async remove(e) {\n this.impl.removeItem(this.applyPrefix(e.key));\n }\n async keys() {\n return { keys: this.rawKeys().map((t) => t.substring(this.prefix.length)) };\n }\n async clear() {\n for (const e of this.rawKeys())\n this.impl.removeItem(e);\n }\n async migrate() {\n var e;\n const t = [], s = [], n = \"_cap_\", o = Object.keys(this.impl).filter((i) => i.indexOf(n) === 0);\n for (const i of o) {\n const r = i.substring(n.length), a = (e = this.impl.getItem(i)) !== null && e !== void 0 ? e : \"\", { value: l } = await this.get({ key: r });\n typeof l == \"string\" ? s.push(r) : (await this.set({ key: r, value: a }), t.push(r));\n }\n return { migrated: t, existing: s };\n }\n async removeOld() {\n const e = \"_cap_\", t = Object.keys(this.impl).filter((s) => s.indexOf(e) === 0);\n for (const s of t)\n this.impl.removeItem(s);\n }\n get impl() {\n return window.localStorage;\n }\n get prefix() {\n return this.group === \"NativeStorage\" ? \"\" : `${this.group}.`;\n }\n rawKeys() {\n return Object.keys(this.impl).filter((e) => e.indexOf(this.prefix) === 0);\n }\n applyPrefix(e) {\n return this.prefix + e;\n }\n}\nexport {\n f as PreferencesWeb\n};\n"],"names":["p"],"mappings":";AACA,MAAM,UAAUA,GAAE;AAAA,EAChB,cAAc;AACZ,UAAM,GAAG,SAAS,GAAG,KAAK,QAAQ;AAAA,EACpC;AAAA,EACA,MAAM,UAAU,EAAE,OAAO,KAAK;AAC5B,WAAO,KAAK,aAAa,KAAK,QAAQ;AAAA,EACxC;AAAA,EACA,MAAM,IAAI,GAAG;AACX,WAAO,EAAE,OAAO,KAAK,KAAK,QAAQ,KAAK,YAAY,EAAE,GAAG,CAAC,EAAC;AAAA,EAC5D;AAAA,EACA,MAAM,IAAI,GAAG;AACX,SAAK,KAAK,QAAQ,KAAK,YAAY,EAAE,GAAG,GAAG,EAAE,KAAK;AAAA,EACpD;AAAA,EACA,MAAM,OAAO,GAAG;AACd,SAAK,KAAK,WAAW,KAAK,YAAY,EAAE,GAAG,CAAC;AAAA,EAC9C;AAAA,EACA,MAAM,OAAO;AACX,WAAO,EAAE,MAAM,KAAK,QAAO,EAAG,IAAI,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,MAAM,CAAC,EAAC;AAAA,EAC3E;AAAA,EACA,MAAM,QAAQ;AACZ,eAAW,KAAK,KAAK,QAAO;AAC1B,WAAK,KAAK,WAAW,CAAC;AAAA,EAC1B;AAAA,EACA,MAAM,UAAU;AACd,QAAI;AACJ,UAAM,IAAI,CAAA,GAAI,IAAI,CAAA,GAAI,IAAI,SAAS,IAAI,OAAO,KAAK,KAAK,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC;AAC9F,eAAW,KAAK,GAAG;AACjB,YAAM,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,KAAK,IAAI,KAAK,KAAK,QAAQ,CAAC,OAAO,QAAQ,MAAM,SAAS,IAAI,IAAI,EAAE,OAAO,MAAM,MAAM,KAAK,IAAI,EAAE,KAAK,EAAC,CAAE;AAC3I,aAAO,KAAK,WAAW,EAAE,KAAK,CAAC,KAAK,MAAM,KAAK,IAAI,EAAE,KAAK,GAAG,OAAO,EAAC,CAAE,GAAG,EAAE,KAAK,CAAC;AAAA,IACpF;AACA,WAAO,EAAE,UAAU,GAAG,UAAU,EAAC;AAAA,EACnC;AAAA,EACA,MAAM,YAAY;AAChB,UAAM,IAAI,SAAS,IAAI,OAAO,KAAK,KAAK,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC;AAC9E,eAAW,KAAK;AACd,WAAK,KAAK,WAAW,CAAC;AAAA,EAC1B;AAAA,EACA,IAAI,OAAO;AACT,WAAO,OAAO;AAAA,EAChB;AAAA,EACA,IAAI,SAAS;AACX,WAAO,KAAK,UAAU,kBAAkB,KAAK,GAAG,KAAK,KAAK;AAAA,EAC5D;AAAA,EACA,UAAU;AACR,WAAO,OAAO,KAAK,KAAK,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,KAAK,MAAM,MAAM,CAAC;AAAA,EAC1E;AAAA,EACA,YAAY,GAAG;AACb,WAAO,KAAK,SAAS;AAAA,EACvB;AACF;"}
|
|
@@ -52,7 +52,7 @@ const _sfc_main = {
|
|
|
52
52
|
return (_ctx, _cache) => {
|
|
53
53
|
return openBlock(), createElementBlock("div", _hoisted_1, [
|
|
54
54
|
isLoading.value ? (openBlock(), createElementBlock("div", _hoisted_2, [
|
|
55
|
-
createVNode(Loader)
|
|
55
|
+
createVNode(Loader, { centered: true })
|
|
56
56
|
])) : entities.value.length < 1 ? (openBlock(), createBlock(_sfc_main$1, {
|
|
57
57
|
key: 1,
|
|
58
58
|
title: __props.states.empty.title,
|
|
@@ -92,7 +92,7 @@ const _sfc_main = {
|
|
|
92
92
|
};
|
|
93
93
|
}
|
|
94
94
|
};
|
|
95
|
-
const Carousel = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-
|
|
95
|
+
const Carousel = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-5db0aea4"]]);
|
|
96
96
|
export {
|
|
97
97
|
Carousel as default
|
|
98
98
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Carousel.vue.js","sources":["../../../../../src/components/Feed/Carousel.vue"],"sourcesContent":["<template>\n <div class=\"pos-relative\">\n <!-- Loading State -->\n <div v-if=\"isLoading\" class=\"h-20r radius-semi pos-relative w-100 bg-light\">\n <Loader />\n </div>\n <!-- Empty State -->\n <EmptyState\n v-else-if=\"entities.length < 1\"\n :title=\"states.empty.title\"\n :description=\"states.empty.description\"\n :action=\"states.empty.action\"\n :callback=\"states.empty.callback\"\n :class=\"replaceClasses('pd-medium bg-light radius-medium', states.empty.class)\"\n />\n <!-- Slider with loaded entities -->\n <Slider v-else :showDots=\"showDots\">\n <div \n v-for=\"(entity, key) in entities\" \n :key=\"key\"\n class=\"carousel__slide pd-nano\"\n >\n <transition name=\"fade\" mode=\"out-in\" appear>\n <slot\n :item=\"entity\"\n :user=\"user\"\n ></slot>\n </transition>\n </div>\n </Slider>\n </div>\n</template>\n\n<script setup>\nimport { ref, onMounted } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\nimport Loader from '@martyrs/src/components/Loader/Loader.vue'\nimport Slider from '@martyrs/src/components/Slider/Slider.vue'\nimport EmptyState from '@martyrs/src/components/EmptyState/EmptyState.vue';\n\nconst { replaceClasses } = useGlobalMixins();\n\nconst props = defineProps({\n showDots: Boolean,\n store: Object,\n states: {\n type: Object,\n default: () => ({\n empty: {\n title: 'Nothing found',\n description: 'Sorry, nothing found',\n },\n }),\n },\n options: Object,\n text: Object,\n user: Object\n})\n\nconst entities = ref([])\nconst isLoading = ref(true)\n\nconst { t } = useI18n({\n messages: props.text\n})\n\nonMounted(async() => {\n try {\n entities.value = await props.store.read(props.options)\n isLoading.value = false\n } catch (error) {\n console.error('Error loading entities:', error)\n entities.value = []\n isLoading.value = false\n } finally {\n isLoading.value = false\n }\n})\n</script>\n\n<style scoped>\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 0.3s ease;\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,UAAM,EAAE,eAAc,IAAK,gBAAe;AAE1C,UAAM,QAAQ;AAiBd,UAAM,WAAW,IAAI,CAAA,CAAE;AACvB,UAAM,YAAY,IAAI,IAAI;AAE1B,UAAM,EAAE,EAAC,IAAK,QAAQ;AAAA,MACpB,UAAU,MAAM;AAAA,IAClB,CAAC;AAED,cAAU,YAAW;AACnB,UAAI;AACF,iBAAS,QAAQ,MAAM,MAAM,MAAM,KAAK,MAAM,OAAO;AACrD,kBAAU,QAAQ;AAAA,MACpB,SAAS,OAAO;AACd,gBAAQ,MAAM,2BAA2B,KAAK;AAC9C,iBAAS,QAAQ,CAAA;AACjB,kBAAU,QAAQ;AAAA,MACpB,UAAC;AACC,kBAAU,QAAQ;AAAA,MACpB;AAAA,IACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"Carousel.vue.js","sources":["../../../../../src/components/Feed/Carousel.vue"],"sourcesContent":["<template>\n <div class=\"pos-relative\">\n <!-- Loading State -->\n <div v-if=\"isLoading\" class=\"h-20r radius-semi pos-relative w-100 bg-light\">\n <Loader :centered=\"true\" />\n </div>\n <!-- Empty State -->\n <EmptyState\n v-else-if=\"entities.length < 1\"\n :title=\"states.empty.title\"\n :description=\"states.empty.description\"\n :action=\"states.empty.action\"\n :callback=\"states.empty.callback\"\n :class=\"replaceClasses('pd-medium bg-light radius-medium', states.empty.class)\"\n />\n <!-- Slider with loaded entities -->\n <Slider v-else :showDots=\"showDots\">\n <div \n v-for=\"(entity, key) in entities\" \n :key=\"key\"\n class=\"carousel__slide pd-nano\"\n >\n <transition name=\"fade\" mode=\"out-in\" appear>\n <slot\n :item=\"entity\"\n :user=\"user\"\n ></slot>\n </transition>\n </div>\n </Slider>\n </div>\n</template>\n\n<script setup>\nimport { ref, onMounted } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\nimport Loader from '@martyrs/src/components/Loader/Loader.vue'\nimport Slider from '@martyrs/src/components/Slider/Slider.vue'\nimport EmptyState from '@martyrs/src/components/EmptyState/EmptyState.vue';\n\nconst { replaceClasses } = useGlobalMixins();\n\nconst props = defineProps({\n showDots: Boolean,\n store: Object,\n states: {\n type: Object,\n default: () => ({\n empty: {\n title: 'Nothing found',\n description: 'Sorry, nothing found',\n },\n }),\n },\n options: Object,\n text: Object,\n user: Object\n})\n\nconst entities = ref([])\nconst isLoading = ref(true)\n\nconst { t } = useI18n({\n messages: props.text\n})\n\nonMounted(async() => {\n try {\n entities.value = await props.store.read(props.options)\n isLoading.value = false\n } catch (error) {\n console.error('Error loading entities:', error)\n entities.value = []\n isLoading.value = false\n } finally {\n isLoading.value = false\n }\n})\n</script>\n\n<style scoped>\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 0.3s ease;\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,UAAM,EAAE,eAAc,IAAK,gBAAe;AAE1C,UAAM,QAAQ;AAiBd,UAAM,WAAW,IAAI,CAAA,CAAE;AACvB,UAAM,YAAY,IAAI,IAAI;AAE1B,UAAM,EAAE,EAAC,IAAK,QAAQ;AAAA,MACpB,UAAU,MAAM;AAAA,IAClB,CAAC;AAED,cAAU,YAAW;AACnB,UAAI;AACF,iBAAS,QAAQ,MAAM,MAAM,MAAM,KAAK,MAAM,OAAO;AACrD,kBAAU,QAAQ;AAAA,MACpB,SAAS,OAAO;AACd,gBAAQ,MAAM,2BAA2B,KAAK;AAC9C,iBAAS,QAAQ,CAAA;AACjB,kBAAU,QAAQ;AAAA,MACpB,UAAC;AACC,kBAAU,QAAQ;AAAA,MACpB;AAAA,IACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -363,7 +363,10 @@ const _sfc_main = {
|
|
|
363
363
|
class: normalizeClass(unref(replaceClasses)("radius-medium bg-light pd-thin flex-child-default o-hidden d-block", __props.skeleton.class))
|
|
364
364
|
}, null, 8, ["structure", "horizontal", "loading", "class"]);
|
|
365
365
|
}), 128)) : createCommentVNode("", true),
|
|
366
|
-
unref(isLoading) && __props.skeleton?.hide ? (openBlock(), createBlock(Loader, {
|
|
366
|
+
unref(isLoading) && __props.skeleton?.hide ? (openBlock(), createBlock(Loader, {
|
|
367
|
+
key: 1,
|
|
368
|
+
centered: true
|
|
369
|
+
})) : createCommentVNode("", true)
|
|
367
370
|
]),
|
|
368
371
|
_: 1
|
|
369
372
|
}, 8, ["class"])) : itemsList.value.length < 1 ? (openBlock(), createBlock(TransitionGroup, {
|
|
@@ -404,7 +407,7 @@ const _sfc_main = {
|
|
|
404
407
|
_: 3
|
|
405
408
|
}, 8, ["class"]),
|
|
406
409
|
unref(isLoading) && __props.keepSlotVisible ? (openBlock(), createElementBlock("div", _hoisted_3, [
|
|
407
|
-
createVNode(Loader)
|
|
410
|
+
createVNode(Loader, { centered: true })
|
|
408
411
|
])) : createCommentVNode("", true)
|
|
409
412
|
])),
|
|
410
413
|
__props.showLoadMore && hasMoreItems.value && itemsList.value.length > 0 && !unref(isLoadingExtra) ? (openBlock(), createElementBlock("button", {
|
|
@@ -418,7 +421,7 @@ const _sfc_main = {
|
|
|
418
421
|
class: "sentinel"
|
|
419
422
|
}, null, 512)),
|
|
420
423
|
unref(isLoadingExtra) ? (openBlock(), createElementBlock("div", _hoisted_4, [
|
|
421
|
-
createVNode(Loader)
|
|
424
|
+
createVNode(Loader, { centered: true })
|
|
422
425
|
])) : createCommentVNode("", true)
|
|
423
426
|
], 64);
|
|
424
427
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Feed.vue.js","sources":["../../../../../src/components/Feed/Feed.vue"],"sourcesContent":["<template>\n <div v-if=\"search || date || (sort && !sort.hideButton)\" style=\"transform: scale(1);\" class=\"mn-b-thin pos-relative z-index-2 pos-relative flex-nowrap flex gap-thin\">\n\n <BlockSearch \n v-if=\"search\"\n :placeholder=\"search.placeholder || 'Search...'\"\n :class=\"search.class || 'bg-light'\"\n @search=\"updateSearch\"\n :autofocus=\"search.autofocus\"\n />\n\n <FiltersBar\n v-if=\"filter\"\n v-model=\"filter.selected\"\n :filters=\"filterConfig\"\n :class=\"filter.class || 'mobile-only'\"\n />\n\n <Dropdown \n v-if=\"date\"\n :label=\"{\n component: ButtonDate,\n props: { date: date }\n }\" \n :class=\"date.class || 'bg-light'\"\n class=\"flex-child flex-child-shrink-0 pd-r-small pd-l-small pd-thin bg-light radius-medium\"\n :align=\"search ? 'right' : 'left'\"\n >\n\n <Calendar\n v-model:date=\"date\"\n :locale=\"$i18n.locale\"\n :allowRange=\"true\"\n class=\"radius-medium w-100 o-hidden bg-light\"\n />\n </Dropdown> \n\n <Dropdown \n v-if=\"sort && !sort.hideButton\"\n :label=\"{\n component: ButtonSort,\n props: { order: sort.order },\n class: 'w-1r'\n }\" \n :class=\"sort.class || 'bg-light'\"\n class=\"radius-medium aspect-1x1 h-100\"\n :align=\"search ? 'right' : 'left'\"\n >\n\n <BlockSorting\n v-model:param=\"sort.param\"\n v-model:order=\"sort.order\"\n :options=\"sort.options\"\n class=\"h-100 pd-small radius-medium t-white bg-black\"\n />\n </Dropdown> \n\n <!-- Actions -->\n <template\n v-if=\"actions.length\"\n >\n <template v-for=\"action in actions\" :key=\"action.key\">\n <div \n :class=\"action.class || 'bg-light'\"\n class=\"flex-center flex pd-thin bg-light radius-medium aspect-1x1 h-100\"\n >\n <component\n :is=\"action.component\"\n @click=\"action.handler\"\n class=\"w-1r h-auto\"\n >\n </component>\n\n </div>\n </template>\n </template>\n </div>\n\n <TransitionGroup \n v-if=\"isLoading && !keepSlotVisible\"\n tag=\"ul\" \n name=\"scaleTransition\" \n class=\"pos-relative z-index-1\"\n :class=\"$attrs.class\"\n >\n <Skeleton\n v-if=\"isLoading && !skeleton?.hide\"\n v-for=\"i in currentLimit\" \n :structure=\"skeleton.structure\"\n :horizontal=\"skeleton.horizontal\"\n :loading=\"skeleton.apply_to_slot\"\n :key=\"'skeleton-' + i\"\n :class=\"replaceClasses('radius-medium bg-light pd-thin flex-child-default o-hidden d-block', skeleton.class)\"\n />\n <Loader v-if=\"isLoading && skeleton?.hide\"/>\n </TransitionGroup>\n\n <TransitionGroup \n tag=\"ul\" \n v-else-if=\"itemsList.length < 1\"\n name=\"feed\"\n >\n <EmptyState\n v-if=\"!isLoading && itemsList.length < 1\"\n :title=\"states.empty.title\"\n :description=\"states.empty.description\"\n :action=\"states.empty.action\"\n :callback=\"states.empty.callback\"\n :class=\"replaceClasses('pd-medium bg-light radius-medium', states.empty.class)\"\n />\n </TransitionGroup>\n\n <TransitionGroup \n v-else-if=\"!keepSlotVisible || !isLoading\"\n tag=\"ul\" \n name=\"feed\"\n :class=\"$attrs.class\"\n >\n <slot\n :items=\"itemsList\"\n >\n </slot>\n </TransitionGroup>\n\n <!-- Slot visible with overlay loader -->\n <div v-else class=\"pos-relative\">\n <TransitionGroup \n tag=\"ul\" \n name=\"feed\"\n :class=\"$attrs.class\"\n >\n <slot\n :items=\"itemsList\"\n >\n </slot>\n </TransitionGroup>\n \n <!-- Overlay loader -->\n <div \n v-if=\"isLoading && keepSlotVisible\"\n class=\"pos-absolute pos-t-0 pos-l-0 w-100 h-100 flex-center bg-white-transp-90 z-index-10\"\n >\n <Loader />\n </div>\n </div>\n\n <button\n v-if=\"showLoadMore && hasMoreItems && itemsList.length > 0 && !isLoadingExtra\"\n @click=\"loadMoreItems\"\n class=\"col-w-100 mn-t-thin w-100 t-black bg-main button\"\n >\n Load More\n </button>\n\n <div v-else key=\"sentinel\" ref=\"sentinel\" class=\"sentinel\"></div> \n\n <div\n v-if=\"isLoadingExtra\"\n class=\"col-w-100 w-100 pos-relative\"\n >\n <Loader/>\n </div>\n \n\n</template>\n\n<script setup>\nimport { ref, computed, onMounted, onUnmounted, watch } from 'vue';\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\n\nimport SkeletonEvent from '@martyrs/src/modules/icons/skeletons/SkeletonEvent.vue'\n\nimport Loader from '@martyrs/src/components/Loader/Loader.vue';\nimport Skeleton from '@martyrs/src/components/Skeleton/Skeleton.vue';\nimport EmptyState from '@martyrs/src/components/EmptyState/EmptyState.vue';\nimport Dropdown from \"@martyrs/src/components/Dropdown/Dropdown.vue\";\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport BottomSheet from '@martyrs/src/components/BottomSheet/BottomSheet.vue';\n\nimport BlockSearch from '@martyrs/src/modules/core/views/components/blocks/BlockSearch.vue'\nimport BlockSorting from '@martyrs/src/modules/core/views/components/blocks/BlockSorting.vue'\n\nimport FiltersBar from '@martyrs/src/modules/core/views/components/sections/Filters.vue'\n\nimport ButtonSort from '@martyrs/src/modules/core/views/components/elements/ButtonSort.vue'\nimport ButtonDate from '@martyrs/src/modules/core/views/components/elements/ButtonDate.vue'\n\nimport IconFilter from '@martyrs/src/modules/icons/navigation/IconFilter.vue'\nimport IconEvents from '@martyrs/src/modules/icons/entities/IconEvents.vue'\n\nconst { replaceClasses } = useGlobalMixins();\n\nconst search = defineModel('search')\nconst sort = defineModel('sort')\nconst filter = defineModel('filter')\nconst date = defineModel('date')\nconst items = defineModel('items')\n\n// Внутреннее хранилище для случая, когда v-model:items не передан\nconst internalItems = ref([])\n\n// Элегантное решение через computed\nconst itemsList = computed({\n get: () => items.value ?? internalItems.value,\n set: (val) => {\n if (items.value !== undefined) {\n items.value = val\n } else {\n internalItems.value = val\n }\n }\n})\n\nconst filterConfig = computed(() => {\n if (!filter.value?.options) return []\n \n return filter.value.options.map(opt => ({\n key: opt.value,\n title: opt.title,\n type: 'options',\n options: opt.options || [],\n defaultValue: null\n }))\n})\n\n// Пропсы\nconst props = defineProps({\n showLoadMore: {\n type: Boolean,\n default: true\n },\n LoadMore: {\n type: Boolean,\n default: true\n },\n search: {\n type: [Boolean, Object],\n default: false\n },\n states: {\n type: Object,\n default: () => ({\n empty: {\n title: 'Nothing found',\n description: 'Sorry, nothing found',\n },\n }),\n },\n actions: {\n type: Array,\n default: () => []\n },\n skeleton: {\n type: Object,\n default: () => ({\n hide: false,\n horizontal: false,\n structure: [\n { block: 'text', size: 'medium' },\n { block: 'text', size: 'large' },\n { block: 'button', size: 'small' }\n ]\n }),\n \n },\n store: {\n type: Object,\n default: () => ({\n read: Function,\n state: Object,\n }),\n },\n external: {\n type: Boolean,\n default: false\n },\n options: {\n type: Object,\n default: () => ({\n category: null,\n limit: 10, \n skip: 0 ,\n owner: null,\n creator: null,\n customer: null,\n user: null,\n status: null,\n period: null,\n contain: null,\n }),\n },\n keepSlotVisible: {\n type: Boolean,\n default: false\n },\n});\n \nconst hasMoreItems = ref(false);\n\nlet isLoading = ref(true);\nlet isLoadingExtra = ref(false);\nlet sentinel = ref(null)\n\nlet currentSkip = ref(props.options.skip ? props.options.skip : 0);\nlet currentLimit = ref(props.options.limit ? props.options.limit : 10);\n\nlet currentSearch = ref('');\nlet isSearching = ref(false);\n\nlet requestId = 0;\n\nfunction debounce(fn, delay) {\n let timeoutId = null;\n return (...args) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn(...args), delay);\n };\n}\n\nconst debouncedSearch = debounce((value) => {\n isSearching.value = true;\n currentSearch.value = value;\n currentSkip.value = 0;\n currentLimit.value = 10;\n fetchItems();\n}, 500);\n\nfunction updateSearch(search) {\n debouncedSearch(search);\n}\n\nconst removeNullValues = (obj) => {\n return Object.fromEntries(\n Object.entries(obj).filter(([_, value]) => value != null)\n );\n};\n\nconst loadMoreItems = async () => {\n if (!hasMoreItems.value || isLoadingExtra.value) {\n return;\n }\n \n isLoadingExtra.value = true;\n \n const currentRequestId = ++requestId;\n\n currentSkip.value += currentLimit.value;\n \n try {\n const allParams = {\n skip: currentSkip.value,\n limit: currentLimit.value,\n search: currentSearch.value,\n dateStart: date.value?.start,\n dateEnd: date.value?.end,\n sortParam: sort.value?.param,\n sortOrder: sort.value?.order,\n ...props.options\n };\n\n const params = removeNullValues(allParams);\n\n const data = await props.store.read(params);\n\n if (currentRequestId !== requestId) {\n return;\n }\n\n if (data.length === 0) {\n hasMoreItems.value = false;\n } else if (data.length < currentLimit.value) {\n hasMoreItems.value = false;\n } else {\n hasMoreItems.value = true;\n }\n\n // Элегантное обновление через computed setter\n itemsList.value = [...itemsList.value, ...data];\n \n } catch (error) {\n console.error('Load more error:', error);\n } finally {\n if (currentRequestId === requestId) {\n isLoadingExtra.value = false;\n }\n }\n};\n\nconst fetchItems = async () => {\n isLoading.value = true;\n \n const currentRequestId = ++requestId;\n \n if (isSearching.value) {\n itemsList.value = [];\n isSearching.value = false;\n }\n \n try {\n const allParams = {\n skip: currentSkip.value,\n limit: currentLimit.value,\n search: currentSearch.value,\n dateStart: date.value?.start,\n dateEnd: date.value?.end,\n sortParam: sort.value?.param,\n sortOrder: sort.value?.order,\n ...props.options\n };\n\n const params = removeNullValues(allParams);\n\n const data = await props.store.read(params);\n\n if (currentRequestId !== requestId) {\n return;\n }\n\n if (data.length === 0) {\n hasMoreItems.value = false;\n } else if (data.length < currentLimit.value) {\n hasMoreItems.value = false;\n } else {\n hasMoreItems.value = true;\n }\n\n // Элегантное обновление через computed setter\n itemsList.value = data;\n \n } catch (error) {\n console.error('Fetch error:', error);\n } finally {\n if (currentRequestId === requestId) {\n isLoading.value = false;\n }\n }\n};\n\nwatch(\n [() => props.external, () => date.value, () => ({...sort.value}), () => ({...props.options})],\n ([newExternal, newDate, newSort, newOptions], [oldExternal, oldDate, oldSort, oldOptions]) => {\n if (\n newExternal !== oldExternal ||\n newDate !== oldDate ||\n newSort?.order !== oldSort?.order ||\n newSort?.param !== oldSort?.param ||\n JSON.stringify(newOptions) !== JSON.stringify(oldOptions)\n ) {\n currentSkip.value = 0;\n fetchItems();\n }\n },\n { deep: true }\n);\n\nlet observer = null\n\nonMounted(async () => {\n await fetchItems()\n\n if (typeof window !== 'undefined' && !props.showLoadMore && props.LoadMore) {\n observer = new IntersectionObserver(entries => {\n if (entries.some(entry => entry.isIntersecting)) {\n loadMoreItems()\n }\n })\n\n if (sentinel.value) observer.observe(sentinel.value)\n }\n});\n\nonUnmounted(() => {\n if (observer) {\n observer.disconnect();\n }\n});\n</script>\n\n<style>\n.feed-move,\n.feed-enter-active,\n.feed-leave-active {\n transition: all 0.5s ease;\n}\n\n.feed-enter-from,\n.feed-leave-to {\n opacity: 0;\n transform: translateY(30px);\n}\n\n.feed-leave-active {\n position: absolute;\n}\n</style>"],"names":["_useModel","search"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8LA,UAAM,EAAE,eAAc,IAAK,gBAAe;AAE1C,UAAM,SAASA,SAAW,SAAC,QAAQ;AACnC,UAAM,OAAOA,SAAW,SAAC,MAAM;AAC/B,UAAM,SAASA,SAAW,SAAC,QAAQ;AACnC,UAAM,OAAOA,SAAW,SAAC,MAAM;AAC/B,UAAM,QAAQA,SAAW,SAAC,OAAO;AAGjC,UAAM,gBAAgB,IAAI,CAAA,CAAE;AAG5B,UAAM,YAAY,SAAS;AAAA,MACzB,KAAK,MAAM,MAAM,SAAS,cAAc;AAAA,MACxC,KAAK,CAAC,QAAQ;AACZ,YAAI,MAAM,UAAU,QAAW;AAC7B,gBAAM,QAAQ;AAAA,QAChB,OAAO;AACL,wBAAc,QAAQ;AAAA,QACxB;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,eAAe,SAAS,MAAM;AAClC,UAAI,CAAC,OAAO,OAAO,QAAS,QAAO,CAAA;AAEnC,aAAO,OAAO,MAAM,QAAQ,IAAI,UAAQ;AAAA,QACtC,KAAK,IAAI;AAAA,QACT,OAAO,IAAI;AAAA,QACX,MAAM;AAAA,QACN,SAAS,IAAI,WAAW,CAAA;AAAA,QACxB,cAAc;AAAA,MAClB,EAAI;AAAA,IACJ,CAAC;AAGD,UAAM,QAAQ;AAuEd,UAAM,eAAe,IAAI,KAAK;AAE9B,QAAI,YAAY,IAAI,IAAI;AACxB,QAAI,iBAAiB,IAAI,KAAK;AAC9B,QAAI,WAAW,IAAI,IAAI;AAEvB,QAAI,cAAc,IAAI,MAAM,QAAQ,OAAO,MAAM,QAAQ,OAAO,CAAC;AACjE,QAAI,eAAe,IAAI,MAAM,QAAQ,QAAQ,MAAM,QAAQ,QAAQ,EAAE;AAErE,QAAI,gBAAgB,IAAI,EAAE;AAC1B,QAAI,cAAc,IAAI,KAAK;AAE3B,QAAI,YAAY;AAEhB,aAAS,SAAS,IAAI,OAAO;AAC3B,UAAI,YAAY;AAChB,aAAO,IAAI,SAAS;AAClB,qBAAa,SAAS;AACtB,oBAAY,WAAW,MAAM,GAAG,GAAG,IAAI,GAAG,KAAK;AAAA,MACjD;AAAA,IACF;AAEA,UAAM,kBAAkB,SAAS,CAAC,UAAU;AAC1C,kBAAY,QAAQ;AACpB,oBAAc,QAAQ;AACtB,kBAAY,QAAQ;AACpB,mBAAa,QAAQ;AACrB,iBAAU;AAAA,IACZ,GAAG,GAAG;AAEN,aAAS,aAAaC,SAAQ;AAC5B,sBAAgBA,OAAM;AAAA,IACxB;AAEA,UAAM,mBAAmB,CAAC,QAAQ;AAChC,aAAO,OAAO;AAAA,QACZ,OAAO,QAAQ,GAAG,EAAE,OAAO,CAAC,CAAC,GAAG,KAAK,MAAM,SAAS,IAAI;AAAA,MAC5D;AAAA,IACA;AAEA,UAAM,gBAAgB,YAAY;AAChC,UAAI,CAAC,aAAa,SAAS,eAAe,OAAO;AAC/C;AAAA,MACF;AAEA,qBAAe,QAAQ;AAEvB,YAAM,mBAAmB,EAAE;AAE3B,kBAAY,SAAS,aAAa;AAElC,UAAI;AACF,cAAM,YAAY;AAAA,UAChB,MAAM,YAAY;AAAA,UAClB,OAAO,aAAa;AAAA,UACpB,QAAQ,cAAc;AAAA,UACtB,WAAW,KAAK,OAAO;AAAA,UACvB,SAAS,KAAK,OAAO;AAAA,UACrB,WAAW,KAAK,OAAO;AAAA,UACvB,WAAW,KAAK,OAAO;AAAA,UACvB,GAAG,MAAM;AAAA,QACf;AAEI,cAAM,SAAS,iBAAiB,SAAS;AAEzC,cAAM,OAAO,MAAM,MAAM,MAAM,KAAK,MAAM;AAE1C,YAAI,qBAAqB,WAAW;AAClC;AAAA,QACF;AAEA,YAAI,KAAK,WAAW,GAAG;AACrB,uBAAa,QAAQ;AAAA,QACvB,WAAW,KAAK,SAAS,aAAa,OAAO;AAC3C,uBAAa,QAAQ;AAAA,QACvB,OAAO;AACL,uBAAa,QAAQ;AAAA,QACvB;AAGA,kBAAU,QAAQ,CAAC,GAAG,UAAU,OAAO,GAAG,IAAI;AAAA,MAEhD,SAAS,OAAO;AACd,gBAAQ,MAAM,oBAAoB,KAAK;AAAA,MACzC,UAAC;AACC,YAAI,qBAAqB,WAAW;AAClC,yBAAe,QAAQ;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,aAAa,YAAY;AAC7B,gBAAU,QAAQ;AAElB,YAAM,mBAAmB,EAAE;AAE3B,UAAI,YAAY,OAAO;AACrB,kBAAU,QAAQ,CAAA;AAClB,oBAAY,QAAQ;AAAA,MACtB;AAEA,UAAI;AACF,cAAM,YAAY;AAAA,UAChB,MAAM,YAAY;AAAA,UAClB,OAAO,aAAa;AAAA,UACpB,QAAQ,cAAc;AAAA,UACtB,WAAW,KAAK,OAAO;AAAA,UACvB,SAAS,KAAK,OAAO;AAAA,UACrB,WAAW,KAAK,OAAO;AAAA,UACvB,WAAW,KAAK,OAAO;AAAA,UACvB,GAAG,MAAM;AAAA,QACf;AAEI,cAAM,SAAS,iBAAiB,SAAS;AAEzC,cAAM,OAAO,MAAM,MAAM,MAAM,KAAK,MAAM;AAE1C,YAAI,qBAAqB,WAAW;AAClC;AAAA,QACF;AAEA,YAAI,KAAK,WAAW,GAAG;AACrB,uBAAa,QAAQ;AAAA,QACvB,WAAW,KAAK,SAAS,aAAa,OAAO;AAC3C,uBAAa,QAAQ;AAAA,QACvB,OAAO;AACL,uBAAa,QAAQ;AAAA,QACvB;AAGA,kBAAU,QAAQ;AAAA,MAEpB,SAAS,OAAO;AACd,gBAAQ,MAAM,gBAAgB,KAAK;AAAA,MACrC,UAAC;AACC,YAAI,qBAAqB,WAAW;AAClC,oBAAU,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA;AAAA,MACE,CAAC,MAAM,MAAM,UAAU,MAAM,KAAK,OAAO,OAAO,EAAC,GAAG,KAAK,MAAK,IAAI,OAAO,EAAC,GAAG,MAAM,QAAO,EAAE;AAAA,MAC5F,CAAC,CAAC,aAAa,SAAS,SAAS,UAAU,GAAG,CAAC,aAAa,SAAS,SAAS,UAAU,MAAM;AAC5F,YACE,gBAAgB,eAChB,YAAY,WACZ,SAAS,UAAU,SAAS,SAC5B,SAAS,UAAU,SAAS,SAC5B,KAAK,UAAU,UAAU,MAAM,KAAK,UAAU,UAAU,GACxD;AACA,sBAAY,QAAQ;AACpB,qBAAU;AAAA,QACZ;AAAA,MACF;AAAA,MACA,EAAE,MAAM,KAAI;AAAA,IACd;AAEA,QAAI,WAAW;AAEf,cAAU,YAAY;AACpB,YAAM,WAAU;AAEhB,UAAI,OAAO,WAAW,eAAe,CAAC,MAAM,gBAAgB,MAAM,UAAU;AAC1E,mBAAW,IAAI,qBAAqB,aAAW;AAC7C,cAAI,QAAQ,KAAK,WAAS,MAAM,cAAc,GAAG;AAC/C,0BAAa;AAAA,UACf;AAAA,QACF,CAAC;AAED,YAAI,SAAS,MAAO,UAAS,QAAQ,SAAS,KAAK;AAAA,MACrD;AAAA,IACF,CAAC;AAED,gBAAY,MAAM;AAChB,UAAI,UAAU;AACZ,iBAAS,WAAU;AAAA,MACrB;AAAA,IACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"Feed.vue.js","sources":["../../../../../src/components/Feed/Feed.vue"],"sourcesContent":["<template>\n <div v-if=\"search || date || (sort && !sort.hideButton)\" style=\"transform: scale(1);\" class=\"mn-b-thin pos-relative z-index-2 pos-relative flex-nowrap flex gap-thin\">\n\n <BlockSearch \n v-if=\"search\"\n :placeholder=\"search.placeholder || 'Search...'\"\n :class=\"search.class || 'bg-light'\"\n @search=\"updateSearch\"\n :autofocus=\"search.autofocus\"\n />\n\n <FiltersBar\n v-if=\"filter\"\n v-model=\"filter.selected\"\n :filters=\"filterConfig\"\n :class=\"filter.class || 'mobile-only'\"\n />\n\n <Dropdown \n v-if=\"date\"\n :label=\"{\n component: ButtonDate,\n props: { date: date }\n }\" \n :class=\"date.class || 'bg-light'\"\n class=\"flex-child flex-child-shrink-0 pd-r-small pd-l-small pd-thin bg-light radius-medium\"\n :align=\"search ? 'right' : 'left'\"\n >\n\n <Calendar\n v-model:date=\"date\"\n :locale=\"$i18n.locale\"\n :allowRange=\"true\"\n class=\"radius-medium w-100 o-hidden bg-light\"\n />\n </Dropdown> \n\n <Dropdown \n v-if=\"sort && !sort.hideButton\"\n :label=\"{\n component: ButtonSort,\n props: { order: sort.order },\n class: 'w-1r'\n }\" \n :class=\"sort.class || 'bg-light'\"\n class=\"radius-medium aspect-1x1 h-100\"\n :align=\"search ? 'right' : 'left'\"\n >\n\n <BlockSorting\n v-model:param=\"sort.param\"\n v-model:order=\"sort.order\"\n :options=\"sort.options\"\n class=\"h-100 pd-small radius-medium t-white bg-black\"\n />\n </Dropdown> \n\n <!-- Actions -->\n <template\n v-if=\"actions.length\"\n >\n <template v-for=\"action in actions\" :key=\"action.key\">\n <div \n :class=\"action.class || 'bg-light'\"\n class=\"flex-center flex pd-thin bg-light radius-medium aspect-1x1 h-100\"\n >\n <component\n :is=\"action.component\"\n @click=\"action.handler\"\n class=\"w-1r h-auto\"\n >\n </component>\n\n </div>\n </template>\n </template>\n </div>\n\n <TransitionGroup \n v-if=\"isLoading && !keepSlotVisible\"\n tag=\"ul\" \n name=\"scaleTransition\" \n class=\"pos-relative z-index-1\"\n :class=\"$attrs.class\"\n >\n <Skeleton\n v-if=\"isLoading && !skeleton?.hide\"\n v-for=\"i in currentLimit\" \n :structure=\"skeleton.structure\"\n :horizontal=\"skeleton.horizontal\"\n :loading=\"skeleton.apply_to_slot\"\n :key=\"'skeleton-' + i\"\n :class=\"replaceClasses('radius-medium bg-light pd-thin flex-child-default o-hidden d-block', skeleton.class)\"\n />\n <Loader v-if=\"isLoading && skeleton?.hide\" :centered=\"true\" />\n </TransitionGroup>\n\n <TransitionGroup \n tag=\"ul\" \n v-else-if=\"itemsList.length < 1\"\n name=\"feed\"\n >\n <EmptyState\n v-if=\"!isLoading && itemsList.length < 1\"\n :title=\"states.empty.title\"\n :description=\"states.empty.description\"\n :action=\"states.empty.action\"\n :callback=\"states.empty.callback\"\n :class=\"replaceClasses('pd-medium bg-light radius-medium', states.empty.class)\"\n />\n </TransitionGroup>\n\n <TransitionGroup \n v-else-if=\"!keepSlotVisible || !isLoading\"\n tag=\"ul\" \n name=\"feed\"\n :class=\"$attrs.class\"\n >\n <slot\n :items=\"itemsList\"\n >\n </slot>\n </TransitionGroup>\n\n <!-- Slot visible with overlay loader -->\n <div v-else class=\"pos-relative\">\n <TransitionGroup \n tag=\"ul\" \n name=\"feed\"\n :class=\"$attrs.class\"\n >\n <slot\n :items=\"itemsList\"\n >\n </slot>\n </TransitionGroup>\n \n <!-- Overlay loader -->\n <div \n v-if=\"isLoading && keepSlotVisible\"\n class=\"pos-absolute pos-t-0 pos-l-0 w-100 h-100 flex-center bg-white-transp-90 z-index-10\"\n >\n <Loader :centered=\"true\" />\n </div>\n </div>\n\n <button\n v-if=\"showLoadMore && hasMoreItems && itemsList.length > 0 && !isLoadingExtra\"\n @click=\"loadMoreItems\"\n class=\"col-w-100 mn-t-thin w-100 t-black bg-main button\"\n >\n Load More\n </button>\n\n <div v-else key=\"sentinel\" ref=\"sentinel\" class=\"sentinel\"></div> \n\n <div\n v-if=\"isLoadingExtra\"\n class=\"col-w-100 w-100 pos-relative\"\n >\n <Loader :centered=\"true\" />\n </div>\n \n\n</template>\n\n<script setup>\nimport { ref, computed, onMounted, onUnmounted, watch } from 'vue';\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js';\n\nimport SkeletonEvent from '@martyrs/src/modules/icons/skeletons/SkeletonEvent.vue'\n\nimport Loader from '@martyrs/src/components/Loader/Loader.vue';\nimport Skeleton from '@martyrs/src/components/Skeleton/Skeleton.vue';\nimport EmptyState from '@martyrs/src/components/EmptyState/EmptyState.vue';\nimport Dropdown from \"@martyrs/src/components/Dropdown/Dropdown.vue\";\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport BottomSheet from '@martyrs/src/components/BottomSheet/BottomSheet.vue';\n\nimport BlockSearch from '@martyrs/src/modules/core/views/components/blocks/BlockSearch.vue'\nimport BlockSorting from '@martyrs/src/modules/core/views/components/blocks/BlockSorting.vue'\n\nimport FiltersBar from '@martyrs/src/modules/core/views/components/sections/Filters.vue'\n\nimport ButtonSort from '@martyrs/src/modules/core/views/components/elements/ButtonSort.vue'\nimport ButtonDate from '@martyrs/src/modules/core/views/components/elements/ButtonDate.vue'\n\nimport IconFilter from '@martyrs/src/modules/icons/navigation/IconFilter.vue'\nimport IconEvents from '@martyrs/src/modules/icons/entities/IconEvents.vue'\n\nconst { replaceClasses } = useGlobalMixins();\n\nconst search = defineModel('search')\nconst sort = defineModel('sort')\nconst filter = defineModel('filter')\nconst date = defineModel('date')\nconst items = defineModel('items')\n\n// Внутреннее хранилище для случая, когда v-model:items не передан\nconst internalItems = ref([])\n\n// Элегантное решение через computed\nconst itemsList = computed({\n get: () => items.value ?? internalItems.value,\n set: (val) => {\n if (items.value !== undefined) {\n items.value = val\n } else {\n internalItems.value = val\n }\n }\n})\n\nconst filterConfig = computed(() => {\n if (!filter.value?.options) return []\n \n return filter.value.options.map(opt => ({\n key: opt.value,\n title: opt.title,\n type: 'options',\n options: opt.options || [],\n defaultValue: null\n }))\n})\n\n// Пропсы\nconst props = defineProps({\n showLoadMore: {\n type: Boolean,\n default: true\n },\n LoadMore: {\n type: Boolean,\n default: true\n },\n search: {\n type: [Boolean, Object],\n default: false\n },\n states: {\n type: Object,\n default: () => ({\n empty: {\n title: 'Nothing found',\n description: 'Sorry, nothing found',\n },\n }),\n },\n actions: {\n type: Array,\n default: () => []\n },\n skeleton: {\n type: Object,\n default: () => ({\n hide: false,\n horizontal: false,\n structure: [\n { block: 'text', size: 'medium' },\n { block: 'text', size: 'large' },\n { block: 'button', size: 'small' }\n ]\n }),\n \n },\n store: {\n type: Object,\n default: () => ({\n read: Function,\n state: Object,\n }),\n },\n external: {\n type: Boolean,\n default: false\n },\n options: {\n type: Object,\n default: () => ({\n category: null,\n limit: 10, \n skip: 0 ,\n owner: null,\n creator: null,\n customer: null,\n user: null,\n status: null,\n period: null,\n contain: null,\n }),\n },\n keepSlotVisible: {\n type: Boolean,\n default: false\n },\n});\n \nconst hasMoreItems = ref(false);\n\nlet isLoading = ref(true);\nlet isLoadingExtra = ref(false);\nlet sentinel = ref(null)\n\nlet currentSkip = ref(props.options.skip ? props.options.skip : 0);\nlet currentLimit = ref(props.options.limit ? props.options.limit : 10);\n\nlet currentSearch = ref('');\nlet isSearching = ref(false);\n\nlet requestId = 0;\n\nfunction debounce(fn, delay) {\n let timeoutId = null;\n return (...args) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn(...args), delay);\n };\n}\n\nconst debouncedSearch = debounce((value) => {\n isSearching.value = true;\n currentSearch.value = value;\n currentSkip.value = 0;\n currentLimit.value = 10;\n fetchItems();\n}, 500);\n\nfunction updateSearch(search) {\n debouncedSearch(search);\n}\n\nconst removeNullValues = (obj) => {\n return Object.fromEntries(\n Object.entries(obj).filter(([_, value]) => value != null)\n );\n};\n\nconst loadMoreItems = async () => {\n if (!hasMoreItems.value || isLoadingExtra.value) {\n return;\n }\n \n isLoadingExtra.value = true;\n \n const currentRequestId = ++requestId;\n\n currentSkip.value += currentLimit.value;\n \n try {\n const allParams = {\n skip: currentSkip.value,\n limit: currentLimit.value,\n search: currentSearch.value,\n dateStart: date.value?.start,\n dateEnd: date.value?.end,\n sortParam: sort.value?.param,\n sortOrder: sort.value?.order,\n ...props.options\n };\n\n const params = removeNullValues(allParams);\n\n const data = await props.store.read(params);\n\n if (currentRequestId !== requestId) {\n return;\n }\n\n if (data.length === 0) {\n hasMoreItems.value = false;\n } else if (data.length < currentLimit.value) {\n hasMoreItems.value = false;\n } else {\n hasMoreItems.value = true;\n }\n\n // Элегантное обновление через computed setter\n itemsList.value = [...itemsList.value, ...data];\n \n } catch (error) {\n console.error('Load more error:', error);\n } finally {\n if (currentRequestId === requestId) {\n isLoadingExtra.value = false;\n }\n }\n};\n\nconst fetchItems = async () => {\n isLoading.value = true;\n \n const currentRequestId = ++requestId;\n \n if (isSearching.value) {\n itemsList.value = [];\n isSearching.value = false;\n }\n \n try {\n const allParams = {\n skip: currentSkip.value,\n limit: currentLimit.value,\n search: currentSearch.value,\n dateStart: date.value?.start,\n dateEnd: date.value?.end,\n sortParam: sort.value?.param,\n sortOrder: sort.value?.order,\n ...props.options\n };\n\n const params = removeNullValues(allParams);\n\n const data = await props.store.read(params);\n\n if (currentRequestId !== requestId) {\n return;\n }\n\n if (data.length === 0) {\n hasMoreItems.value = false;\n } else if (data.length < currentLimit.value) {\n hasMoreItems.value = false;\n } else {\n hasMoreItems.value = true;\n }\n\n // Элегантное обновление через computed setter\n itemsList.value = data;\n \n } catch (error) {\n console.error('Fetch error:', error);\n } finally {\n if (currentRequestId === requestId) {\n isLoading.value = false;\n }\n }\n};\n\nwatch(\n [() => props.external, () => date.value, () => ({...sort.value}), () => ({...props.options})],\n ([newExternal, newDate, newSort, newOptions], [oldExternal, oldDate, oldSort, oldOptions]) => {\n if (\n newExternal !== oldExternal ||\n newDate !== oldDate ||\n newSort?.order !== oldSort?.order ||\n newSort?.param !== oldSort?.param ||\n JSON.stringify(newOptions) !== JSON.stringify(oldOptions)\n ) {\n currentSkip.value = 0;\n fetchItems();\n }\n },\n { deep: true }\n);\n\nlet observer = null\n\nonMounted(async () => {\n await fetchItems()\n\n if (typeof window !== 'undefined' && !props.showLoadMore && props.LoadMore) {\n observer = new IntersectionObserver(entries => {\n if (entries.some(entry => entry.isIntersecting)) {\n loadMoreItems()\n }\n })\n\n if (sentinel.value) observer.observe(sentinel.value)\n }\n});\n\nonUnmounted(() => {\n if (observer) {\n observer.disconnect();\n }\n});\n</script>\n\n<style>\n.feed-move,\n.feed-enter-active,\n.feed-leave-active {\n transition: all 0.5s ease;\n}\n\n.feed-enter-from,\n.feed-leave-to {\n opacity: 0;\n transform: translateY(30px);\n}\n\n.feed-leave-active {\n position: absolute;\n}\n</style>"],"names":["_useModel","search"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createElementBlock, openBlock, renderSlot } from "vue";
|
|
2
|
-
/* empty css
|
|
2
|
+
/* empty css */
|
|
3
3
|
const _hoisted_1 = { class: "mobile-menu-section pd-r-zero pd-t-thin pd-b-thin pd-medium radius-medium" };
|
|
4
4
|
const _sfc_main = {
|
|
5
5
|
__name: "Menu",
|
|
@@ -14,4 +14,4 @@ const _sfc_main = {
|
|
|
14
14
|
export {
|
|
15
15
|
_sfc_main as default
|
|
16
16
|
};
|
|
17
|
-
//# sourceMappingURL=Menu.
|
|
17
|
+
//# sourceMappingURL=Menu.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Menu.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;"}
|
|
@@ -3,7 +3,7 @@ import { ref, inject, onMounted, resolveComponent, createElementBlock, createCom
|
|
|
3
3
|
/* empty css */
|
|
4
4
|
/* empty css */
|
|
5
5
|
import _sfc_main$1 from "../../../../../components/Dropdown/Dropdown.vue.js";
|
|
6
|
-
import _sfc_main$6 from "../../../../../components/Menu/Menu.
|
|
6
|
+
import _sfc_main$6 from "../../../../../components/Menu/Menu.vue.js";
|
|
7
7
|
import _sfc_main$b from "../../../../../components/Menu/MenuItem.vue.js";
|
|
8
8
|
import _sfc_main$3 from "../../../../organizations/components/elements/ButtonToggleMembership.vue.js";
|
|
9
9
|
import _sfc_main$2 from "../../../../reports/components/sections/FormReport.vue.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HotPosts.vue.js","sources":["../../../../../../../src/modules/community/components/sections/HotPosts.vue"],"sourcesContent":["<template>\n <Carousel\n :store=\"{\n read: (options) => blog.read({ \n skip: props.skip, \n limit: props.limit,\n user: props.userId,\n period: props.period,\n category: props.category \n })\n }\"\n :text=\"{\n messages: {\n en: {\n title: 'No Blogposts Found',\n description: 'Currently, there are no blogposts available.'\n }\n }\n }\"\n v-slot=\"{ \n item\n }\"\n class=\"slider-hotpost flex-child-default\"\n >\n <CardBlogpost \n :key=\"item._id\" \n :blogpost=\"item\" \n :user=\"auth.state.user._id\" \n :hideDescription=\"true\"\n class=\"bg-white flex flex-column radius-medium h-35r\"\n />\n </Carousel>\n</template>\n\n<script setup>\nimport { defineProps } from 'vue'\nimport Carousel from '@martyrs/src/components/Feed/Carousel.vue'\nimport CardBlogpost from '@martyrs/src/modules/community/components/blocks/CardBlogpost.vue'\nimport * as blog from '@martyrs/src/modules/community/store/blogposts.js'\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth.js'\n\nconst props = defineProps({\n skip: {\n type: Number,\n default: 0\n },\n limit: {\n type: Number,\n default: 8\n },\n userId: {\n type: String,\n default: () => auth.state.user._id\n },\n period: {\n type: String,\n },\n category: {\n type: String,\n default: 'featured'\n }\n})\n</script>\n\n<style lang=\"scss\">\n.slider-hotpost
|
|
1
|
+
{"version":3,"file":"HotPosts.vue.js","sources":["../../../../../../../src/modules/community/components/sections/HotPosts.vue"],"sourcesContent":["<template>\n <Carousel\n :store=\"{\n read: (options) => blog.read({ \n skip: props.skip, \n limit: props.limit,\n user: props.userId,\n period: props.period,\n category: props.category \n })\n }\"\n :text=\"{\n messages: {\n en: {\n title: 'No Blogposts Found',\n description: 'Currently, there are no blogposts available.'\n }\n }\n }\"\n v-slot=\"{ \n item\n }\"\n class=\"slider-hotpost flex-child-default\"\n >\n <CardBlogpost \n :key=\"item._id\" \n :blogpost=\"item\" \n :user=\"auth.state.user._id\" \n :hideDescription=\"true\"\n class=\"bg-white flex flex-column radius-medium h-35r\"\n />\n </Carousel>\n</template>\n\n<script setup>\nimport { defineProps } from 'vue'\nimport Carousel from '@martyrs/src/components/Feed/Carousel.vue'\nimport CardBlogpost from '@martyrs/src/modules/community/components/blocks/CardBlogpost.vue'\nimport * as blog from '@martyrs/src/modules/community/store/blogposts.js'\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth.js'\n\nconst props = defineProps({\n skip: {\n type: Number,\n default: 0\n },\n limit: {\n type: Number,\n default: 8\n },\n userId: {\n type: String,\n default: () => auth.state.user._id\n },\n period: {\n type: String,\n },\n category: {\n type: String,\n default: 'featured'\n }\n})\n</script>\n\n<style lang=\"scss\">\n.slider-hotpost {\n .carousel__slide {\n flex: 0 0 33%;\n }\n}\n\n@media screen and (max-width: 1025px) {\n .slider-hotpost {\n .carousel__slide {\n flex: 0 0 75%;\n }\n }\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,UAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { resolveComponent, createBlock, openBlock, withCtx, createVNode, createElementVNode, createElementBlock, createCommentVNode, toDisplayString } from "vue";
|
|
2
|
+
import { useRoute } from "vue-router";
|
|
2
3
|
import Carousel from "../../../../components/Feed/Carousel.vue.js";
|
|
3
4
|
import Media from "../../../../components/Media/Media.vue.js";
|
|
4
5
|
import { read } from "../../store/events.js";
|
|
@@ -33,9 +34,24 @@ const _sfc_main = {
|
|
|
33
34
|
status: {
|
|
34
35
|
type: String,
|
|
35
36
|
default: "featured"
|
|
37
|
+
},
|
|
38
|
+
organization: {
|
|
39
|
+
type: String
|
|
36
40
|
}
|
|
37
41
|
},
|
|
38
42
|
setup(__props) {
|
|
43
|
+
const route = useRoute();
|
|
44
|
+
const props = __props;
|
|
45
|
+
const getEventPath = (item) => {
|
|
46
|
+
if (route.meta.context === "backoffice") {
|
|
47
|
+
return `/backoffice/events/${item.url}`;
|
|
48
|
+
}
|
|
49
|
+
if (route.meta.context === "organization" || props.organization) {
|
|
50
|
+
const orgId = props.organization || route.params._id;
|
|
51
|
+
return `/organizations/${orgId}/events/${item.url}`;
|
|
52
|
+
}
|
|
53
|
+
return `/events/${item.url}`;
|
|
54
|
+
};
|
|
39
55
|
return (_ctx, _cache) => {
|
|
40
56
|
const _component_router_link = resolveComponent("router-link");
|
|
41
57
|
return openBlock(), createBlock(Carousel, {
|
|
@@ -56,7 +72,7 @@ const _sfc_main = {
|
|
|
56
72
|
}, {
|
|
57
73
|
default: withCtx(({ item }) => [
|
|
58
74
|
createVNode(_component_router_link, {
|
|
59
|
-
to:
|
|
75
|
+
to: getEventPath(item),
|
|
60
76
|
class: "cursor-pointer pos-relative flex flex-justify-end flex-column h-25r bg-semi radius-medium o-hidden pd-medium t-white bg-dark"
|
|
61
77
|
}, {
|
|
62
78
|
default: withCtx(() => [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventsHot.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EventsHot.vue.js","sources":["../../../../../../../src/modules/events/components/sections/EventsHot.vue"],"sourcesContent":["<template>\n <Carousel\n :store=\"{\n read: (options) => events.read({ \n skip, \n limit,\n status \n })\n }\"\n :text=\"{\n en: {\n title: 'No Featured Events Found',\n description: 'Currently, there are no featured events available.'\n }\n }\"\n class=\"slider-hotpost flex-child-default\"\n >\n <template v-slot=\"{ item }\">\n <router-link\n :to=\"getEventPath(item)\"\n class=\"cursor-pointer pos-relative flex flex-justify-end flex-column h-25r bg-semi radius-medium o-hidden pd-medium t-white bg-dark\"\n >\n <Media \n :url=\"(FILE_SERVER_URL || '') + item.cover\"\n class=\"pos-absolute pos-t-0 pos-r-0 z-index-1 w-100 h-100 object-fit-cover bg-light\"\n />\n <div class=\"pos-relative z-index-2\">\n <h3 \n class=\"mn-b-small\"\n >\n {{ item.name }}\n </h3>\n <span v-if=\"item.date?.start\" class=\"mn-r-nano d-inline-block w-max pd-b-micro pd-t-micro pd-r-thin pd-l-thin radius-small t-medium bg-white\">\n <span class=\"t-semi t-black\" > \n {{item.location}} / {{formatDate(item.date.start, { language: $i18n.locale, monthName: true, })}} \n </span>\n </span> \n </div>\n </router-link>\n </template>\n </Carousel>\n</template>\n\n<script setup>\nimport { ref, onMounted, defineProps, computed } from 'vue'\nimport { useRoute } from 'vue-router'\nimport Carousel from '@martyrs/src/components/Feed/Carousel.vue'\nimport Media from '@martyrs/src/components/Media/Media.vue'\nimport * as events from '@martyrs/src/modules/events/store/events.js';\nimport * as auth from '@martyrs/src/modules/auth/views/store/auth.js'\n\nconst route = useRoute()\n\nconst props = defineProps({\n skip: {\n type: Number,\n default: 0\n },\n limit: {\n type: Number,\n default: 8\n },\n userId: {\n type: String,\n default: () => auth.state.user._id\n },\n period: {\n type: String,\n default: 'year'\n },\n status: {\n type: String,\n default: 'featured'\n },\n organization: {\n type: String\n }\n})\n\nconst getEventPath = (item) => {\n if (route.meta.context === 'backoffice') {\n return `/backoffice/events/${item.url}`\n }\n if (route.meta.context === 'organization' || props.organization) {\n const orgId = props.organization || route.params._id\n return `/organizations/${orgId}/events/${item.url}`\n }\n return `/events/${item.url}`\n}\n</script>\n\n<style lang=\"scss\">\n.slider-hotpost .embla__slide {\n flex: 0 0 75%;\n}\n@media screen and (max-width: 1025px) {\n .slider-hotpost .embla__slide {\n flex: 0 0 75%;\n }\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDA,UAAM,QAAQ,SAAQ;AAEtB,UAAM,QAAQ;AA0Bd,UAAM,eAAe,CAAC,SAAS;AAC7B,UAAI,MAAM,KAAK,YAAY,cAAc;AACvC,eAAO,sBAAsB,KAAK,GAAG;AAAA,MACvC;AACA,UAAI,MAAM,KAAK,YAAY,kBAAkB,MAAM,cAAc;AAC/D,cAAM,QAAQ,MAAM,gBAAgB,MAAM,OAAO;AACjD,eAAO,kBAAkB,KAAK,WAAW,KAAK,GAAG;AAAA,MACnD;AACA,aAAO,WAAW,KAAK,GAAG;AAAA,IAC5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -124,7 +124,7 @@ const _sfc_main = {
|
|
|
124
124
|
}, [
|
|
125
125
|
__props.track.url ? (openBlock(), createBlock(_component_router_link, {
|
|
126
126
|
key: 0,
|
|
127
|
-
to:
|
|
127
|
+
to: "/music/tracks/" + __props.track.url,
|
|
128
128
|
class: normalizeClass(["hover-t-main hover-t-underline", { "t-main": isPlaying(__props.track) }]),
|
|
129
129
|
onClick: _cache[4] || (_cache[4] = withModifiers(() => {
|
|
130
130
|
}, ["stop"]))
|
|
@@ -140,7 +140,7 @@ const _sfc_main = {
|
|
|
140
140
|
}, [
|
|
141
141
|
__props.track.artist && __props.track.artist._id ? (openBlock(), createBlock(_component_router_link, {
|
|
142
142
|
key: 0,
|
|
143
|
-
to:
|
|
143
|
+
to: "/music/artists/" + __props.track.artist.url,
|
|
144
144
|
class: "t-transp hover-t-underline",
|
|
145
145
|
onClick: _cache[5] || (_cache[5] = withModifiers(() => {
|
|
146
146
|
}, ["stop"]))
|
|
@@ -156,7 +156,7 @@ const _sfc_main = {
|
|
|
156
156
|
__props.showAlbum ? (openBlock(), createElementBlock("div", _hoisted_8, [
|
|
157
157
|
__props.track.album && __props.track.album._id ? (openBlock(), createBlock(_component_router_link, {
|
|
158
158
|
key: 0,
|
|
159
|
-
to:
|
|
159
|
+
to: "/music/albums/" + __props.track.album.url,
|
|
160
160
|
class: "t-transp hover-t-underline",
|
|
161
161
|
onClick: _cache[6] || (_cache[6] = withModifiers(() => {
|
|
162
162
|
}, ["stop"]))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TrackListCard.vue.js","sources":["../../../../../../../src/modules/music/components/cards/TrackListCard.vue"],"sourcesContent":["<!-- components/cards/TrackListCard.vue -->\n<template>\n <div \n class=\"track-item pd-small hover-bg-white-transp-25 flex-v-center flex cursor-pointer\"\n :class=\"{'bg-main-transp-10': isPlaying(track)}\"\n @click=\"playTrack(track)\"\n @dblclick=\"playTrack(track, true)\"\n @mouseenter=\"hoveredIndex = props.index\"\n @mouseleave=\"hoveredIndex = -1\"\n >\n <div class=\"track-number w-3r t-center pos-relative\">\n <span v-if=\"!isPlaying(track) && hoveredIndex !== props.index\" class=\"t-transp\">{{ props.index + 1 }}</span>\n <Button \n v-else-if=\"!isPlaying(track) && hoveredIndex === props.index\"\n @click.stop=\"playTrack(track)\"\n class=\"bg-main pd-thin\"\n :showLoader=\"false\"\n :showSucces=\"false\"\n >\n <IconPlay @click.stop=\"playTrack(track)\" class=\"i-small\" fill=\"rgb(var(--white))\"/>\n </Button>\n <Button \n v-else\n @click.stop=\"pauseTrack()\"\n class=\"bg-main pd-thin\"\n :showLoader=\"false\"\n :showSucces=\"false\"\n >\n <IconPause @click.stop=\"pauseTrack()\" class=\"i-small\" fill=\"rgb(var(--white))\"/>\n </Button>\n </div>\n \n <div class=\"track-title flex-child-1 flex flex-v-center\">\n <div v-if=\"showCover\" class=\"track-cover mn-r-small\">\n <Media \n :url=\"track.coverUrl || (track.album && track.album.coverUrl) || '/logo/logo-placeholder.jpg'\" \n class=\"w-3r h-3r object-fit-cover o-hidden radius-small\"\n />\n </div>\n \n <div class=\"track-info\">\n <div class=\"track-name \" :class=\"{'t-main': isPlaying(track)}\">\n <router-link
|
|
1
|
+
{"version":3,"file":"TrackListCard.vue.js","sources":["../../../../../../../src/modules/music/components/cards/TrackListCard.vue"],"sourcesContent":["<!-- components/cards/TrackListCard.vue -->\n<template>\n <div \n class=\"track-item pd-small hover-bg-white-transp-25 flex-v-center flex cursor-pointer\"\n :class=\"{'bg-main-transp-10': isPlaying(track)}\"\n @click=\"playTrack(track)\"\n @dblclick=\"playTrack(track, true)\"\n @mouseenter=\"hoveredIndex = props.index\"\n @mouseleave=\"hoveredIndex = -1\"\n >\n <div class=\"track-number w-3r t-center pos-relative\">\n <span v-if=\"!isPlaying(track) && hoveredIndex !== props.index\" class=\"t-transp\">{{ props.index + 1 }}</span>\n <Button \n v-else-if=\"!isPlaying(track) && hoveredIndex === props.index\"\n @click.stop=\"playTrack(track)\"\n class=\"bg-main pd-thin\"\n :showLoader=\"false\"\n :showSucces=\"false\"\n >\n <IconPlay @click.stop=\"playTrack(track)\" class=\"i-small\" fill=\"rgb(var(--white))\"/>\n </Button>\n <Button \n v-else\n @click.stop=\"pauseTrack()\"\n class=\"bg-main pd-thin\"\n :showLoader=\"false\"\n :showSucces=\"false\"\n >\n <IconPause @click.stop=\"pauseTrack()\" class=\"i-small\" fill=\"rgb(var(--white))\"/>\n </Button>\n </div>\n \n <div class=\"track-title flex-child-1 flex flex-v-center\">\n <div v-if=\"showCover\" class=\"track-cover mn-r-small\">\n <Media \n :url=\"track.coverUrl || (track.album && track.album.coverUrl) || '/logo/logo-placeholder.jpg'\" \n class=\"w-3r h-3r object-fit-cover o-hidden radius-small\"\n />\n </div>\n \n <div class=\"track-info\">\n <div class=\"track-name \" :class=\"{'t-main': isPlaying(track)}\">\n <router-link\n v-if=\"track.url\"\n :to=\"'/music/tracks/' + track.url\"\n class=\"hover-t-main hover-t-underline\"\n :class=\"{'t-main': isPlaying(track)}\"\n @click.stop\n >\n {{ track.title }}\n </router-link>\n <span v-else>{{ track.title }}</span>\n </div>\n <div :class=\"{'t-main': isPlaying(track)}\" class=\"track-artist t-transp t-small\">\n <router-link\n v-if=\"track.artist && track.artist._id\"\n :to=\"'/music/artists/' + track.artist.url\"\n class=\"t-transp hover-t-underline\"\n @click.stop\n >\n {{ getArtistName(track) }}\n </router-link>\n <span v-else>{{ getArtistName(track) }}</span>\n </div>\n </div>\n </div>\n \n <div v-if=\"showAlbum\" class=\"track-album w-15r mobile:w-0 mobile:hidden t-transp t-truncate\">\n <router-link\n v-if=\"track.album && track.album._id\"\n :to=\"'/music/albums/' + track.album.url\"\n class=\"t-transp hover-t-underline\"\n @click.stop\n >\n {{ track.album.title }}\n </router-link>\n <span v-else>{{ track.album?.title || 'Single' }}</span>\n </div>\n \n <div class=\"track-duration w-5r t-right t-transp\">{{ formatDuration(track.duration) }}</div>\n </div>\n</template>\n\n<script setup>\nimport { ref } from 'vue';\nimport Button from '@martyrs/src/components/Button/Button.vue';\nimport Media from '@martyrs/src/components/Media/Media.vue';\nimport IconPlay from '@martyrs/src/modules/icons/navigation/IconPlay.vue';\nimport IconPause from '@martyrs/src/modules/icons/navigation/IconPause.vue';\n\n// Import player store\nimport { state as playerState, actions as playerActions } from '../../store/player.js';\n\n// Props\nconst props = defineProps({\n track: {\n type: Object,\n required: true\n },\n index: {\n type: Number,\n default: 0\n },\n showCover: {\n type: Boolean,\n default: true\n },\n showAlbum: {\n type: Boolean,\n default: true\n }\n});\n\n// State\nconst hoveredIndex = ref(-1);\n\n// Methods\nconst isPlaying = (track) => {\n return playerState.currentTrack && playerState.currentTrack._id === track._id && playerState.isPlaying;\n};\n\nconst playTrack = (track, force = false) => {\n if (isPlaying(track) && !force) {\n playerActions.togglePlay();\n } else {\n playerActions.playTrack(track);\n }\n};\n\nconst pauseTrack = () => {\n playerActions.togglePlay();\n};\n\nconst getArtistName = (track) => {\n if (!track || !track.artist) return 'Unknown Artist';\n return typeof track.artist === 'object' ? track.artist.name : 'Unknown Artist';\n};\n\nconst formatDuration = (duration) => {\n if (!duration) return '--:--';\n \n const minutes = Math.floor(duration / 60);\n const seconds = Math.floor(duration % 60);\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n};\n</script>"],"names":["playerState","playerActions"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8FA,UAAM,QAAQ;AAoBd,UAAM,eAAe,IAAI,EAAE;AAG3B,UAAM,YAAY,CAAC,UAAU;AAC3B,aAAOA,MAAY,gBAAgBA,MAAY,aAAa,QAAQ,MAAM,OAAOA,MAAY;AAAA,IAC/F;AAEA,UAAM,YAAY,CAAC,OAAO,QAAQ,UAAU;AAC1C,UAAI,UAAU,KAAK,KAAK,CAAC,OAAO;AAC9BC,gBAAc,WAAU;AAAA,MAC1B,OAAO;AACLA,gBAAc,UAAU,KAAK;AAAA,MAC/B;AAAA,IACF;AAEA,UAAM,aAAa,MAAM;AACvBA,cAAc,WAAU;AAAA,IAC1B;AAEA,UAAM,gBAAgB,CAAC,UAAU;AAC/B,UAAI,CAAC,SAAS,CAAC,MAAM,OAAQ,QAAO;AACpC,aAAO,OAAO,MAAM,WAAW,WAAW,MAAM,OAAO,OAAO;AAAA,IAChE;AAEA,UAAM,iBAAiB,CAAC,aAAa;AACnC,UAAI,CAAC,SAAU,QAAO;AAEtB,YAAM,UAAU,KAAK,MAAM,WAAW,EAAE;AACxC,YAAM,UAAU,KAAK,MAAM,WAAW,EAAE;AACxC,aAAO,GAAG,OAAO,IAAI,QAAQ,SAAQ,EAAG,SAAS,GAAG,GAAG,CAAC;AAAA,IAC1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ref, onMounted, createElementBlock, openBlock, createElementVNode, createCommentVNode, normalizeClass, unref, normalizeStyle, Fragment, renderList, createBlock, withCtx, createTextVNode, toDisplayString, createVNode } from "vue";
|
|
2
2
|
import _imports_0 from "./tonar.png.js";
|
|
3
|
-
import { r as fu } from "../../../../../dist/main-
|
|
3
|
+
import { r as fu } from "../../../../../dist/main-BFvlam0J.js";
|
|
4
4
|
import _sfc_main$1 from "../../../icons/navigation/IconLike.vue.js";
|
|
5
5
|
import _sfc_main$2 from "../../../icons/entities/IconEvents.vue.js";
|
|
6
6
|
import _sfc_main$3 from "../cards/TrackListCard.vue.js";
|
|
@@ -5,7 +5,7 @@ import "vue-i18n";
|
|
|
5
5
|
/* empty css */
|
|
6
6
|
import _sfc_main$1 from "../../../../components/Dropdown/Dropdown.vue.js";
|
|
7
7
|
import _sfc_main$7 from "../../../../components/Chips/Chips.vue.js";
|
|
8
|
-
/* empty css
|
|
8
|
+
/* empty css */
|
|
9
9
|
import "../../../../components/Menu/MenuItem.vue.js";
|
|
10
10
|
import _sfc_main$6 from "../../../icons/entities/IconFollowing.vue.js";
|
|
11
11
|
import _sfc_main$5 from "../../../icons/navigation/IconEdit.vue.js";
|
package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref, onMounted, createElementBlock, openBlock, createVNode, withCtx, createBlock, createCommentVNode, unref, createElementVNode } from "vue";
|
|
2
|
-
import _sfc_main$1 from "../../../../components/Menu/Menu.
|
|
2
|
+
import _sfc_main$1 from "../../../../components/Menu/Menu.vue.js";
|
|
3
3
|
import _sfc_main$2 from "../../../../components/Menu/MenuItem.vue.js";
|
|
4
4
|
/* empty css */
|
|
5
5
|
import _sfc_main$4 from "../../../icons/entities/IconProducts.vue.js";
|