ep-lib-ts 1.1.19 → 1.1.21
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/components/educationals/EpBranchingScenario.vue2.js +2 -2
- package/dist/components/educationals/EpInstructions.vue.js +5 -3
- package/dist/components/educationals/EpInstructions.vue.js.map +1 -1
- package/dist/components/educationals/EpObjective.vue.js +5 -3
- package/dist/components/educationals/EpObjective.vue.js.map +1 -1
- package/dist/components/educationals/EpResource.vue.js +1 -1
- package/dist/components/educationals/EpResource.vue.js.map +1 -1
- package/dist/components/educationals/EpSegmentedBox.vue.js +1 -1
- package/dist/components/forms/EpRadioSummative.vue.js +1 -46
- package/dist/components/forms/EpRadioSummative.vue.js.map +1 -1
- package/dist/components/forms/EpRadioSummative.vue2.js +46 -1
- package/dist/components/forms/EpRadioSummative.vue2.js.map +1 -1
- package/dist/components/interactions/EpAccordeon.vue.js +1 -1
- package/dist/components/interactions/EpAccordeon.vue2.js +10 -7
- package/dist/components/interactions/EpAccordeon.vue2.js.map +1 -1
- package/dist/components/interactions/EpAssociation.vue.js +1 -1
- package/dist/components/interactions/EpContentSlider.vue.js +2 -1
- package/dist/components/interactions/EpContentSlider.vue.js.map +1 -1
- package/dist/components/interactions/EpQuestion.vue.js +1 -1
- package/dist/components/interactions/EpQuestion.vue.js.map +1 -1
- package/dist/components/interactions/EpSummativeTable.vue.js +1 -1
- package/dist/components/medias/EpAudio.vue.js +1 -1
- package/dist/components/medias/EpHierarchy.vue2.js +1 -0
- package/dist/components/medias/EpHierarchy.vue2.js.map +1 -1
- package/dist/components/medias/EpPlaylist.vue.js +80 -0
- package/dist/components/medias/EpPlaylist.vue.js.map +1 -0
- package/dist/components/medias/EpPlaylist.vue2.js +5 -0
- package/dist/components/medias/EpPlaylist.vue2.js.map +1 -0
- package/dist/components/tools/AssociationNode.vue.js +1 -82
- package/dist/components/tools/AssociationNode.vue.js.map +1 -1
- package/dist/components/tools/AssociationNode.vue2.js +82 -1
- package/dist/components/tools/AssociationNode.vue2.js.map +1 -1
- package/dist/components/tools/BgAudio.vue.js +1 -52
- package/dist/components/tools/BgAudio.vue.js.map +1 -1
- package/dist/components/tools/BgAudio.vue2.js +52 -1
- package/dist/components/tools/BgAudio.vue2.js.map +1 -1
- package/dist/components/tools/Details.vue.js +1 -56
- package/dist/components/tools/Details.vue.js.map +1 -1
- package/dist/components/tools/Details.vue2.js +56 -1
- package/dist/components/tools/Details.vue2.js.map +1 -1
- package/dist/components/tools/SegmentedBox.vue.js +1 -55
- package/dist/components/tools/SegmentedBox.vue.js.map +1 -1
- package/dist/components/tools/SegmentedBox.vue2.js +55 -1
- package/dist/components/tools/SegmentedBox.vue2.js.map +1 -1
- package/dist/components/tools/TextMedia.vue.js +1 -50
- package/dist/components/tools/TextMedia.vue.js.map +1 -1
- package/dist/components/tools/TextMedia.vue2.js +50 -1
- package/dist/components/tools/TextMedia.vue2.js.map +1 -1
- package/dist/components/tools/TwoColsMedia.vue2.js +2 -2
- package/dist/components/tools/TwoColsMedia.vue2.js.map +1 -1
- package/dist/entry/medias/EpPlaylist.d.ts +6 -0
- package/dist/entry/medias/EpPlaylist.js +7 -0
- package/dist/entry/medias/EpPlaylist.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +162 -159
- package/dist/index.js.map +1 -1
- package/dist/style.css +70 -70
- package/dist/types/educationals/EpInstructions.d.ts +2 -1
- package/dist/types/educationals/EpObjective.d.ts +1 -1
- package/dist/types/interactions/EpAccordeon.d.ts +1 -0
- package/dist/types/medias/EpPlaylist.d.ts +9 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EpQuestion.vue.js","sources":["../../../src/components/interactions/EpQuestion.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { watch, ref, toRefs, computed, defineAsyncComponent } from \"vue\";\nimport EpEdu from \"~/components/educationals/EpEdu.vue\";\nimport { type Answer } from \"~/types/Answer\";\nimport { useRenderText } from \"~/composables/useRenderText\";\nimport { useComponent } from \"~/composables/useComponent\";\nimport { mdiHelpCircle } from \"@mdi/js\";\nimport EpImg from \"~/components/basics/EpImg.vue\";\nimport EpRadio from \"~/components/forms/EpRadio.vue\";\nimport EpBtn from \"~/components/basics/EpBtn.vue\";\nimport EpAlert from \"~/components/signages/EpAlert.vue\";\nimport type { EpQuestionProps } from \"~/types/interactions/EpQuestion\";\n\nconst props = withDefaults(defineProps<EpQuestionProps>(), {\n type: \"neutral\",\n hideIcon: false,\n shuffle: false,\n before: false,\n numeration: false,\n labelNoAnswer: \"Veuillez choisir une réponse\",\n labelAnswerBtn: \"Valider\",\n labelTryAgainBtn: \"Réessayer\",\n});\n\nconst renderText = computed(() => {\n if (!props.intentions) {\n return null;\n }\n return useRenderText(props.intentions);\n});\n\n//shuffle and list\nconst shuffleAnswers = computed(() => {\n const array = props.answers;\n if (props.shuffle) {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const temp = array[i];\n array[i] = array[j];\n array[j] = temp;\n }\n }\n return array;\n});\n\nconst alphabet = [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\"];\nconst typeList = (index: number) => {\n if (props.numeration) {\n return alphabet[index];\n }\n return index + 1;\n};\n\n///user answer\nconst userAnswer = ref(\"\");\nconst answered = ref(false);\nconst valid = ref(true);\nconst response = ref<Answer>({\n type: \"warning\",\n text: \"no found\",\n component: null,\n feedback: \"\",\n});\nconst checkAnswer = () => {\n if (userAnswer.value === \"\") {\n valid.value = false;\n return;\n }\n const valuesAnswer = props.answers.find((x) => x.uid === userAnswer.value);\n if (!valuesAnswer) {\n return;\n }\n response.value = valuesAnswer!;\n answered.value = true;\n};\n\nconst reset = () => {\n answered.value = false;\n userAnswer.value = \"\";\n};\n\nwatch(userAnswer, (val) => {\n if (val !== \"\") {\n valid.value = true;\n }\n});\n\n//get Component asyncComponent\nconst getCompontent = (name: string | undefined) => {\n const componentToLoad = useComponent(name);\n //console.log(componentToLoad)\n if (componentToLoad.name === \"EpNothing\") {\n return defineAsyncComponent(() => import(\"../signages/EpNothing.vue\"));\n }\n return defineAsyncComponent(\n () => import(`../${componentToLoad.path}/${componentToLoad.name}.vue`)\n );\n};\n\n//returned values from props\nconst { title, intentions, hideIcon, question, src } = toRefs(props);\n</script>\n\n<template>\n <EpEdu\n :title=\"title\"\n :type=\"type\"\n :hideIcon=\"hideIcon\"\n :icon=\"mdiHelpCircle\"\n :label-intentions=\"labelIntentions\"\n card\n >\n <template #intentions v-if=\"renderText\">\n <div v-html=\"renderText\" />\n </template>\n <template #content>\n <div class=\"mt-5\">\n <EpImg\n v-if=\"src && before\"\n :src=\"src\"\n :alt=\"`Image soutien à la question`\"\n cols=\"5\"\n />\n <div v-html=\"useRenderText(question)\" class=\"my-6\" />\n <EpImg\n v-if=\"src && !before\"\n :src=\"src\"\n :alt=\"`Image soutien à la question`\"\n cols=\"5\"\n />\n\n <div class=\"mb-6\">\n <ol class=\"no-list\">\n <li v-for=\"(answer, i) in shuffleAnswers\" :key=\"answer.uid\">\n <EpRadio\n :label=\"`${typeList(i)}. ${answer.text}`\"\n v-model=\"userAnswer\"\n :value=\"answer.uid\"\n :disabled=\"answered\"\n type=\"primary\"\n ></EpRadio>\n </li>\n </ol>\n <EpAlert type=\"error\" outlined noIcon v-if=\"!valid\" :content=\"labelNoAnswer\"/>\n \n\n </div>\n\n <div v-if=\"answered\" class=\"mb-2\">\n <EpAlert :type=\"response.type\" outlined :content=\"response.feedback\"/>\n \n\n\n <div v-if=\"response.component\" class=\"my-2\">\n <component\n :is=\"getCompontent(response.component.type)\"\n v-bind=\"{ ...response.component.data }\"\n ></component>\n </div>\n </div>\n\n <EpBtn\n type=\"primary\"\n @click=\"checkAnswer\"\n :disabled=\"answered\"\n outlined\n extraClass=\"mr-2\"\n >{{ labelAnswerBtn }}</EpBtn\n >\n <EpBtn type=\"primary\" v-if=\"answered\" @click=\"reset\" outlined>{{\n labelTryAgainBtn\n }}</EpBtn>\n </div>\n </template>\n <!-- <template #actions>\n <EpBtn :color=\"type=='base'?'text-gray-700':'text-white'\" :type=\"type\">[Repair btn style... to change]</EpBtn>\n </template> -->\n </EpEdu>\n</template>\n"],"names":["_createBlock","EpEdu","_unref","type","labelIntentions","_createElementVNode","before","EpImg","_openBlock","_createElementBlock","_Fragment","_renderList","_createVNode","EpRadio","EpAlert","labelNoAnswer","_resolveDynamicComponent","_normalizeProps","_guardReactiveProps","EpBtn","labelAnswerBtn","labelTryAgainBtn"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EpQuestion.vue.js","sources":["../../../src/components/interactions/EpQuestion.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { watch, ref, toRefs, computed, defineAsyncComponent } from \"vue\";\nimport EpEdu from \"~/components/educationals/EpEdu.vue\";\nimport { type Answer } from \"~/types/Answer\";\nimport { useRenderText } from \"~/composables/useRenderText\";\nimport { useComponent } from \"~/composables/useComponent\";\nimport { mdiHelpCircle } from \"@mdi/js\";\nimport EpImg from \"~/components/basics/EpImg.vue\";\nimport EpRadio from \"~/components/forms/EpRadio.vue\";\nimport EpBtn from \"~/components/basics/EpBtn.vue\";\nimport EpAlert from \"~/components/signages/EpAlert.vue\";\nimport type { EpQuestionProps } from \"~/types/interactions/EpQuestion\";\n\nconst props = withDefaults(defineProps<EpQuestionProps>(), {\n type: \"neutral\",\n hideIcon: false,\n shuffle: false,\n before: false,\n numeration: false,\n labelNoAnswer: \"Veuillez choisir une réponse\",\n labelAnswerBtn: \"Valider\",\n labelTryAgainBtn: \"Réessayer\",\n});\n\nconst renderText = computed(() => {\n if (!props.intentions) {\n return null;\n }\n return useRenderText(props.intentions);\n});\n\n//shuffle and list\nconst shuffleAnswers = computed(() => {\n const array = props.answers;\n if (props.shuffle) {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const temp = array[i];\n array[i] = array[j];\n array[j] = temp;\n }\n }\n return array;\n});\n\nconst alphabet = [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\"];\nconst typeList = (index: number) => {\n if (props.numeration) {\n return alphabet[index];\n }\n return index + 1;\n};\n\n///user answer\nconst userAnswer = ref(\"\");\nconst answered = ref(false);\nconst valid = ref(true);\nconst response = ref<Answer>({\n type: \"warning\",\n text: \"no found\",\n component: null,\n feedback: \"\",\n});\nconst checkAnswer = () => {\n if (userAnswer.value === \"\") {\n valid.value = false;\n return;\n }\n const valuesAnswer = props.answers.find((x) => x.uid === userAnswer.value);\n if (!valuesAnswer) {\n return;\n }\n response.value = valuesAnswer!;\n answered.value = true;\n};\n\nconst reset = () => {\n answered.value = false;\n userAnswer.value = \"\";\n};\n\nwatch(userAnswer, (val) => {\n if (val !== \"\") {\n valid.value = true;\n }\n});\n\n//get Component asyncComponent\nconst getCompontent = (name: string | undefined) => {\n const componentToLoad = useComponent(name);\n //console.log(componentToLoad)\n if (componentToLoad.name === \"EpNothing\") {\n return defineAsyncComponent(() => import(\"../signages/EpNothing.vue\"));\n }\n return defineAsyncComponent(\n () => import(`../${componentToLoad.path}/${componentToLoad.name}.vue`)\n );\n};\n\n//returned values from props\nconst { title, intentions, hideIcon, question, src } = toRefs(props);\n</script>\n\n<template>\n <EpEdu\n :title=\"title\"\n :type=\"type\"\n :hideIcon=\"hideIcon\"\n :icon=\"mdiHelpCircle\"\n :label-intentions=\"labelIntentions\"\n card\n >\n <template #intentions v-if=\"renderText\">\n <div v-html=\"renderText\" />\n </template>\n <template #content>\n <div class=\"mt-5\">\n <EpImg\n v-if=\"src && before\"\n :src=\"src\"\n :alt=\"`Image soutien à la question`\"\n cols=\"5\"\n />\n <div v-html=\"useRenderText(question)\" class=\"my-6\" />\n <EpImg\n v-if=\"src && !before\"\n :src=\"src\"\n :alt=\"`Image soutien à la question`\"\n cols=\"5\"\n />\n\n <div class=\"mb-6\">\n <ol class=\"no-list\">\n <li v-for=\"(answer, i) in shuffleAnswers\" :key=\"answer.uid\">\n <EpRadio\n :label=\"`${typeList(i)}. ${answer.text}`\"\n v-model=\"userAnswer\"\n :value=\"answer.uid\"\n :disabled=\"answered\"\n type=\"primary\"\n ></EpRadio>\n </li>\n </ol>\n <EpAlert type=\"error\" outlined noIcon v-if=\"!valid\" :content=\"labelNoAnswer\"/>\n \n\n </div>\n\n <div v-if=\"answered\" class=\"mb-2\">\n <EpAlert :type=\"response.type\" outlined :content=\"response.feedback\"/>\n \n\n\n <div v-if=\"response.component\" class=\"my-2\">\n <component\n :is=\"getCompontent(response.component.type)\"\n v-bind=\"{ ...response.component.data }\"\n ></component>\n </div>\n </div>\n\n <EpBtn\n type=\"primary\"\n @click=\"checkAnswer\"\n :disabled=\"answered\"\n outlined\n extraClass=\"mr-2\"\n >{{ labelAnswerBtn }}</EpBtn\n >\n <EpBtn type=\"primary\" v-if=\"answered\" @click=\"reset\" outlined>{{\n labelTryAgainBtn\n }}</EpBtn>\n </div>\n </template>\n <!-- <template #actions>\n <EpBtn :color=\"type=='base'?'text-gray-700':'text-white'\" :type=\"type\">[Repair btn style... to change]</EpBtn>\n </template> -->\n </EpEdu>\n</template>\n"],"names":["_createBlock","EpEdu","_unref","type","labelIntentions","_createElementVNode","before","EpImg","_openBlock","_createElementBlock","_Fragment","_renderList","_createVNode","EpRadio","EpAlert","labelNoAnswer","_resolveDynamicComponent","_normalizeProps","_guardReactiveProps","EpBtn","labelAnswerBtn","labelTryAgainBtn"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineComponent, ref, computed, createElementBlock, openBlock, createCommentVNode, createElementVNode, toDisplayString, Fragment, renderList, createVNode, createBlock } from "vue";
|
|
2
2
|
import _sfc_main$2 from "../basics/EpDivider.vue.js";
|
|
3
|
-
import _sfc_main$1 from "../forms/EpRadioSummative.
|
|
3
|
+
import _sfc_main$1 from "../forms/EpRadioSummative.vue2.js";
|
|
4
4
|
const _hoisted_1 = { class: "mt-4 bg-surface-2 dark:bg-surface-2-dark p-4 rounded" };
|
|
5
5
|
const _hoisted_2 = {
|
|
6
6
|
key: 0,
|
|
@@ -2,7 +2,7 @@ import { defineComponent, computed, toRefs, createBlock, openBlock, unref, creat
|
|
|
2
2
|
import { isHtml } from "../../composables/isHtml.js";
|
|
3
3
|
import { useMarkdown } from "../../composables/useMarkdown.js";
|
|
4
4
|
import { mdiHeadphones } from "@mdi/js";
|
|
5
|
-
import _sfc_main$2 from "../tools/BgAudio.
|
|
5
|
+
import _sfc_main$2 from "../tools/BgAudio.vue2.js";
|
|
6
6
|
import Comp from "../signages/EpAlert.vue.js";
|
|
7
7
|
import _sfc_main$1 from "../educationals/EpEdu.vue.js";
|
|
8
8
|
const _hoisted_1 = ["innerHTML"];
|
|
@@ -69,6 +69,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
69
69
|
"./EpLink.vue": () => import("./EpLink.vue2.js"),
|
|
70
70
|
"./EpLinkVersion.vue": () => import("./EpLinkVersion.vue2.js"),
|
|
71
71
|
"./EpLottieSvg.vue": () => import("./EpLottieSvg.vue2.js"),
|
|
72
|
+
"./EpPlaylist.vue": () => import("./EpPlaylist.vue2.js"),
|
|
72
73
|
"./EpSensibleImage.vue": () => import("./EpSensibleImage.vue.js"),
|
|
73
74
|
"./EpSoftware.vue": () => import("./EpSoftware.vue2.js"),
|
|
74
75
|
"./EpSvg.vue": () => import("./EpSvg.vue2.js"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EpHierarchy.vue2.js","sources":["../../../src/components/medias/EpHierarchy.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, onMounted, computed, defineAsyncComponent } from \"vue\";\nimport {\n hierarchy,\n tree,\n cluster,\n type HierarchyPointLink,\n type HierarchyPointNode,\n} from \"d3-hierarchy\";\nimport * as d3 from \"d3-selection\";\nimport { linkVertical, linkHorizontal } from \"d3-shape\";\nimport * as d3Zoom from \"d3-zoom\";\nimport type { TreeNode } from \"~/types/Hierarchy\";\nimport type { NestedComponents } from \"~/types/Component\";\nimport { useComponent } from \"~/composables/useComponent\";\nimport EpModal from \"~/components/interactions/EpModal.vue\";\nimport EpBtn from \"~/components/basics/EpBtn.vue\";\nimport { useRenderText } from \"~/composables/useRenderText\";\nimport type { EpHierarchyProps } from \"~/types/medias/EpHierarchy\";\n\nconst props = withDefaults(defineProps<EpHierarchyProps>(), {\n labelClose: \"fermer\",\n maxWidth: 800,\n maxHeight: 600,\n isCluster: false,\n colorRect: \"fill-red-400\",\n colorPath: \"stroke-yellow-400\",\n});\n\nconst treeContainer = ref<HTMLDivElement | null>(null);\nconst treeWrapper = ref<HTMLDivElement | null>(null);\n\n/* control modal */\ntype ShowNode = {\n title: string;\n text?: string;\n component?: NestedComponents;\n};\n\nconst currentNode = ref<ShowNode | null>(null);\nconst showModal = ref(false);\n\nconst handleNodeClick = (node: TreeNode) => {\n currentNode.value = {\n title: node.name,\n text: node.text,\n component: node.component,\n };\n showModal.value = true;\n};\n\nconst closeModal = () => {\n showModal.value = false;\n currentNode.value = null;\n};\n//nested component\n\nconst components = import.meta.glob([\n \"./*.vue\", // all components in medias (same folder)\n \"../basics/*.vue\", // components/charts/\n \"../signages/*.vue\", // components/signages/\n]);\n\nconst currentRenderComponent = computed(() => {\n if (!currentNode.value || !currentNode.value.component) {\n return null;\n }\n\n const { path, name } = useComponent(currentNode.value.component.type);\n //console.log(path, name)\n let fullPath = \"\";\n if (path === \"medias\") {\n fullPath = `./${name}.vue`;\n } else {\n fullPath = `../${path}/${name}.vue`;\n }\n //console.log(fullPath)\n const loader = components[fullPath] as\n | (() => Promise<{ default: NestedComponents }>)\n | undefined;\n\n if (!loader) {\n console.warn(`Component not found: ${fullPath}`);\n return null; // or defineAsyncComponent(() => import('../fallbacks/EpNothing.vue'))\n }\n\n return defineAsyncComponent(loader);\n});\n\nonMounted(() => {\n if (!treeContainer.value) return;\n\n if (props.isCluster) {\n clusterView();\n } else {\n treeView();\n }\n});\n\nconst treeView = () => {\n const rectW = 130;\n const rectH = 40;\n const margin = { top: 40, right: 40, bottom: 40, left: 40 };\n\n const root = hierarchy<TreeNode>(props.nodes);\n //const totalLeafCount = root.leaves().length\n const width = Math.max(props.maxWidth);\n const height = props.maxHeight;\n\n const treeLayout = tree<TreeNode>().nodeSize([200, 100]); // [x spacing, y spacing]\n\n const treeData = treeLayout(root);\n\n const svg = d3\n .select(treeContainer.value)\n .append(\"svg\")\n .attr(\"width\", width)\n .attr(\"height\", height);\n\n const g = svg\n .append(\"g\")\n .attr(\"transform\", `translate(${margin.left}, ${margin.top})`);\n\n const zoom = d3Zoom\n .zoom<SVGSVGElement, unknown>()\n .scaleExtent([0.1, 2])\n .on(\"zoom\", (event) => {\n g.attr(\"transform\", event.transform);\n });\n\n svg.call(zoom);\n\n const centerX = width / 2 - treeData.x;\n const centerY = 30; //height / 2 - treeData.y\n const identity = (d3Zoom as any).zoomIdentity;\n svg.call(zoom.transform, identity.translate(centerX, centerY));\n\n // Links\n const linkPath = linkVertical<\n HierarchyPointLink<TreeNode>,\n HierarchyPointNode<TreeNode>\n >()\n .x((d) => d.x)\n .y((d) => d.y);\n\n g.selectAll(\"path.link\")\n .data(treeData.links())\n .enter()\n .append(\"path\")\n .attr(\"d\", (d) => linkPath(d))\n .attr(\"class\", (d) => {\n const link = d.target.data.active\n ? `${props.colorPath} stroke-2`\n : \"stroke-black dark:stroke-white\";\n return `${link} link fill-none`;\n });\n\n // Nodes\n const node = g\n .selectAll(\"g.node\")\n .data(treeData.descendants())\n .enter()\n .append(\"g\")\n .attr(\"class\", \"node\")\n .attr(\"transform\", (d) => `translate(${d.x}, ${d.y})`)\n .style(\"cursor\", (d) =>\n d.data.component || d.data.text ? \"pointer\" : \"default\"\n )\n .each(function (d) {\n if (d.data.component || d.data.text) {\n d3.select(this).on(\"click\", (_event) => handleNodeClick(d.data));\n }\n });\n //.style('cursor', 'pointer')\n //.on('click', (_event, d) => handleNodeClick(d.data))\n\n node.each(function (d) {\n const group = d3.select(this);\n\n // Append text temporarily\n const text = group\n .append(\"text\")\n .attr(\"class\", \"text-sm font-semibold fill-black dark:fill-white\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"x\", 0)\n .attr(\"y\", 0)\n .attr(\"dy\", \".35em\")\n .text((d.data.label) ? d.data.label : d.data.name);\n\n // Get bounding box to determine text size\n const bbox = (text.node() as SVGTextElement).getBBox();\n const paddingX = 10;\n const paddingY = 10;\n\n const width = bbox.width + paddingX * 2;\n const height = bbox.height + paddingY * 2;\n\n // Draw rect using text size\n group\n .insert(\"rect\", \"text\")\n .attr(\"class\", props.colorRect)\n .attr(\"x\", -width / 2)\n .attr(\"y\", -height / 2)\n .attr(\"width\", width)\n .attr(\"height\", height)\n .attr(\"rx\", 4)\n .attr(\"ry\", 4);\n });\n\n node\n .append(\"text\")\n .attr(\"x\", 0)\n .attr(\"y\", 0)\n .attr(\"dy\", \".35em\")\n .attr(\"class\", \"text-sm font-semibold fill-white dark:fill-black\")\n .attr(\"text-anchor\", \"middle\")\n .text((d) => {return (d.data.label) ? d.data.label : d.data.name})\n .style(\"pointer-events\", \"none\");\n};\n\nconst clusterView = () => {\n const rectW = 130;\n const rectH = 40;\n const margin = { top: 40, right: 40, bottom: 40, left: 40 };\n\n const root = hierarchy<TreeNode>(props.nodes);\n //const totalLeafCount = root.leaves().length\n const width = Math.max(props.maxWidth);\n const height = props.maxHeight;\n\n const treeLayout = cluster<TreeNode>().nodeSize([130, 200]); // [x spacing, y spacing]\n\n const treeData = treeLayout(root);\n\n const svg = d3\n .select(treeContainer.value)\n .append(\"svg\")\n .attr(\"width\", width)\n .attr(\"height\", height);\n\n const g = svg\n .append(\"g\")\n .attr(\"transform\", `translate(${margin.left}, ${margin.top})`);\n\n const zoom = d3Zoom\n .zoom<SVGSVGElement, unknown>()\n .scaleExtent([0.1, 4])\n .on(\"zoom\", (event) => {\n g.attr(\"transform\", event.transform);\n });\n\n svg.call(zoom);\n\n const centerX = 30;\n const centerY = height / 2 - treeData.x;\n const identity = (d3Zoom as any).zoomIdentity;\n svg.call(zoom.transform, identity.translate(centerX, centerY));\n\n // Links\n const linkPath = linkHorizontal<\n HierarchyPointLink<TreeNode>,\n HierarchyPointNode<TreeNode>\n >()\n .x((d) => d.y)\n .y((d) => d.x);\n\n g.selectAll(\"path.link\")\n .data(treeData.links())\n .enter()\n .append(\"path\")\n .attr(\"d\", (d) => linkPath(d))\n .attr(\"class\", (d) => {\n const link = d.target.data.active\n ? `${props.colorPath} stroke-2`\n : \"stroke-black dark:stroke-white\";\n return `${link} link fill-none`;\n });\n\n // Nodes\n const node = g\n .selectAll(\"g.node\")\n .data(treeData.descendants())\n .enter()\n .append(\"g\")\n .attr(\"class\", \"node\")\n .attr(\"transform\", (d) => `translate(${d.y}, ${d.x})`)\n .style(\"cursor\", (d) =>\n d.data.component || d.data.text ? \"pointer\" : \"default\"\n )\n .each(function (d) {\n if (d.data.component || d.data.text) {\n d3.select(this).on(\"click\", (_event) => handleNodeClick(d.data));\n }\n });\n //.style('cursor', 'pointer')\n //.on('click', (_event, d) => handleNodeClick(d.data))\n\n node.each(function (d) {\n const group = d3.select(this);\n\n // Append text temporarily\n const text = group\n .append(\"text\")\n .attr(\"class\", \"text-sm font-semibold fill-black dark:fill-white\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"x\", 0)\n .attr(\"y\", 0)\n .attr(\"dy\", \".35em\")\n .text((d.data.label) ? d.data.label : d.data.name);\n\n // Get bounding box to determine text size\n const bbox = (text.node() as SVGTextElement).getBBox();\n const paddingX = 10;\n const paddingY = 10;\n\n const width = bbox.width + paddingX * 2;\n const height = bbox.height + paddingY * 2;\n\n // Draw rect using text size\n group\n .insert(\"rect\", \"text\")\n .attr(\"class\", props.colorRect)\n .attr(\"x\", -width / 2)\n .attr(\"y\", -height / 2)\n .attr(\"width\", width)\n .attr(\"height\", height)\n .attr(\"rx\", 4)\n .attr(\"ry\", 4);\n });\n\n node\n .append(\"text\")\n .attr(\"x\", 0)\n .attr(\"y\", 0)\n .attr(\"dy\", \".35em\")\n .attr(\"class\", \"text-sm font-semibold fill-white dark:fill-black\")\n .attr(\"text-anchor\", \"middle\")\n .text((d) => {return (d.data.label) ? d.data.label : d.data.name})\n .style(\"pointer-events\", \"none\");\n};\n\nconst maxW = computed(() => {\n return `${props.maxWidth.toString()}px`;\n});\n\nconst maxH = computed(() => {\n return `${props.maxWidth.toString()}px`;\n});\n</script>\n\n<template>\n <div>\n <div\n ref=\"treeWrapper\"\n class=\"ep-tree-wrapper mx-auto\"\n :style=\"{ maxHeight: maxH, maxWidth: maxW }\"\n >\n <div ref=\"treeContainer\" class=\"ep-tree-container\" />\n </div>\n <EpModal v-model=\"showModal\" :title=\"currentNode.title\" v-if=\"currentNode\">\n <div v-if=\"currentNode.text\" v-html=\"useRenderText(currentNode.text)\" />\n <template v-if=\"currentRenderComponent && currentNode.component\">\n <component\n :is=\"currentRenderComponent\"\n v-bind=\"{ ...currentNode.component.data }\"\n />\n </template>\n <div class=\"flex justify-end\">\n <EpBtn @click=\"closeModal\" type=\"error\" outlined rounded>{{\n labelClose\n }}</EpBtn>\n </div>\n </EpModal>\n </div>\n</template>\n\n<style scoped>\n.ep-tree-wrapper {\n overflow: auto;\n border: 1px solid #ddd;\n}\n\n.ep-tree-container {\n width: 100%;\n overflow-x: auto;\n}\n</style>\n"],"names":["width","height","_createElementBlock","_createElementVNode","_normalizeStyle","_createBlock","EpModal","_unref","_openBlock","_resolveDynamicComponent","_normalizeProps","_mergeProps","_createVNode","EpBtn","labelClose"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAoBA,UAAM,QAAQ;AASd,UAAM,gBAAgB,IAA2B,IAAI;AACrD,UAAM,cAAc,IAA2B,IAAI;AASnD,UAAM,cAAc,IAAqB,IAAI;AAC7C,UAAM,YAAY,IAAI,KAAK;AAE3B,UAAM,kBAAkB,CAAC,SAAmB;AAC1C,kBAAY,QAAQ;AAAA,QAClB,OAAO,KAAK;AAAA,QACZ,MAAM,KAAK;AAAA,QACX,WAAW,KAAK;AAAA,MAAA;AAElB,gBAAU,QAAQ;AAAA,IACpB;AAEA,UAAM,aAAa,MAAM;AACvB,gBAAU,QAAQ;AAClB,kBAAY,QAAQ;AAAA,IACtB;AAGA,UAAM,aAAa,uBAAA,OAAA;AAAA,MAAA,0BAAA,MAAA,OAAA,2BAAA;AAAA,MAAA,yBAAA,MAAA,OAAA,0BAAA;AAAA,MAAA,uBAAA,MAAA,OAAA,yBAAA;AAAA,MAAA,wBAAA,MAAA,OAAA,0BAAA;AAAA,MAAA,wBAAA,MAAA,OAAA,0BAAA;AAAA,MAAA,2BAAA,MAAA,OAAA,6BAAA;AAAA,MAAA,wBAAA,MAAA,OAAA,0BAAA;AAAA,MAAA,yBAAA,MAAA,OAAA,2BAAA;AAAA,MAAA,6BAAA,MAAA,OAAA,+BAAA;AAAA,MAAA,wBAAA,MAAA,OAAA,0BAAA;AAAA,MAAA,uBAAA,MAAA,OAAA,yBAAA;AAAA,MAAA,+BAAA,MAAA,OAAA,iCAAA;AAAA,MAAA,wBAAA,MAAA,OAAA,yBAAA;AAAA,MAAA,4BAAA,MAAA,OAAA,8BAAA;AAAA,MAAA,2BAAA,MAAA,OAAA,6BAAA;AAAA,MAAA,+BAAA,MAAA,OAAA,iCAAA;AAAA,MAAA,2BAAA,MAAA,OAAA,6BAAA;AAAA,MAAA,+BAAA,MAAA,OAAA,iCAAA;AAAA,MAAA,yBAAA,MAAA,OAAA,2BAAA;AAAA,MAAA,wBAAA,MAAA,OAAA,0BAAA;AAAA,MAAA,iBAAA,MAAA,OAAA,mBAAA;AAAA,MAAA,oBAAA,MAAA,OAAA,sBAAA;AAAA,MAAA,oBAAA,MAAA,OAAA,sBAAA;AAAA,MAAA,qBAAA,MAAA,OAAA,sBAAA;AAAA,MAAA,kBAAA,MAAA,OAAA,oBAAA;AAAA,MAAA,iBAAA,MAAA,OAAA,kBAAA;AAAA,MAAA,gBAAA,MAAA,OAAA,kBAAA;AAAA,MAAA,uBAAA,MAAA,OAAA,yBAAA;AAAA,MAAA,qBAAA,MAAA,OAAA,uBAAA;AAAA,MAAA,yBAAA,MAAA,OAAA,0BAAA;AAAA,MAAA,oBAAA,MAAA,OAAA,sBAAA;AAAA,MAAA,eAAA,MAAA,OAAA,iBAAA;AAAA,MAAA,gBAAA,MAAA,OAAA,kBAAA;AAAA,MAAA,oBAAA,MAAA,OAAA,qBAAA;AAAA,MAAA,iBAAA,MAAA,OAAA,mBAAA;AAAA,MAAA,wBAAA,MAAA,OAAA,0BAAA;AAAA,MAAA,mBAAA,MAAA,OAAA,qBAAA;AAAA,MAAA,2BAAA,MAAA,OAAA,4BAAA;AAAA,MAAA,2BAAA,MAAA,OAAA,6BAAA;AAAA,MAAA,4BAAA,MAAA,OAAA,8BAAA;AAAA,MAAA,6BAAA,MAAA,OAAA,8BAAA;AAAA,MAAA,2BAAA,MAAA,OAAA,6BAAA;AAAA,MAAA,8BAAA,MAAA,OAAA,+BAAA;AAAA,IAAA,CAAA;AAMnB,UAAM,yBAAyB,SAAS,MAAM;AAC5C,UAAI,CAAC,YAAY,SAAS,CAAC,YAAY,MAAM,WAAW;AACtD,eAAO;AAAA,MACT;AAEA,YAAM,EAAE,MAAM,SAAS,aAAa,YAAY,MAAM,UAAU,IAAI;AAEpE,UAAI,WAAW;AACf,UAAI,SAAS,UAAU;AACrB,mBAAW,KAAK,IAAI;AAAA,MACtB,OAAO;AACL,mBAAW,MAAM,IAAI,IAAI,IAAI;AAAA,MAC/B;AAEA,YAAM,SAAS,WAAW,QAAQ;AAIlC,UAAI,CAAC,QAAQ;AACX,gBAAQ,KAAK,wBAAwB,QAAQ,EAAE;AAC/C,eAAO;AAAA,MACT;AAEA,aAAO,qBAAqB,MAAM;AAAA,IACpC,CAAC;AAED,cAAU,MAAM;AACd,UAAI,CAAC,cAAc,MAAO;AAE1B,UAAI,MAAM,WAAW;AACnB,oBAAA;AAAA,MACF,OAAO;AACL,iBAAA;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,WAAW,MAAM;AAGrB,YAAM,SAAS,EAAE,KAAK,IAA2B,MAAM,GAAA;AAEvD,YAAM,OAAO,UAAoB,MAAM,KAAK;AAE5C,YAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ;AACrC,YAAM,SAAS,MAAM;AAErB,YAAM,aAAa,KAAA,EAAiB,SAAS,CAAC,KAAK,GAAG,CAAC;AAEvD,YAAM,WAAW,WAAW,IAAI;AAEhC,YAAM,MAAM,GACT,OAAO,cAAc,KAAK,EAC1B,OAAO,KAAK,EACZ,KAAK,SAAS,KAAK,EACnB,KAAK,UAAU,MAAM;AAExB,YAAM,IAAI,IACP,OAAO,GAAG,EACV,KAAK,aAAa,aAAa,OAAO,IAAI,KAAK,OAAO,GAAG,GAAG;AAE/D,YAAM,OAAO,OACV,KAAA,EACA,YAAY,CAAC,KAAK,CAAC,CAAC,EACpB,GAAG,QAAQ,CAAC,UAAU;AACrB,UAAE,KAAK,aAAa,MAAM,SAAS;AAAA,MACrC,CAAC;AAEH,UAAI,KAAK,IAAI;AAEb,YAAM,UAAU,QAAQ,IAAI,SAAS;AACrC,YAAM,UAAU;AAChB,YAAM,WAAY,OAAe;AACjC,UAAI,KAAK,KAAK,WAAW,SAAS,UAAU,SAAS,OAAO,CAAC;AAG7D,YAAM,WAAW,aAAA,EAId,EAAE,CAAC,MAAM,EAAE,CAAC,EACZ,EAAE,CAAC,MAAM,EAAE,CAAC;AAEf,QAAE,UAAU,WAAW,EACpB,KAAK,SAAS,OAAO,EACrB,MAAA,EACA,OAAO,MAAM,EACb,KAAK,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC,EAC5B,KAAK,SAAS,CAAC,MAAM;AACpB,cAAM,OAAO,EAAE,OAAO,KAAK,SACvB,GAAG,MAAM,SAAS,cAClB;AACJ,eAAO,GAAG,IAAI;AAAA,MAChB,CAAC;AAGH,YAAM,OAAO,EACV,UAAU,QAAQ,EAClB,KAAK,SAAS,YAAA,CAAa,EAC3B,MAAA,EACA,OAAO,GAAG,EACV,KAAK,SAAS,MAAM,EACpB,KAAK,aAAa,CAAC,MAAM,aAAa,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,EACpD;AAAA,QAAM;AAAA,QAAU,CAAC,MAChB,EAAE,KAAK,aAAa,EAAE,KAAK,OAAO,YAAY;AAAA,MAAA,EAE/C,KAAK,SAAU,GAAG;AACjB,YAAI,EAAE,KAAK,aAAa,EAAE,KAAK,MAAM;AACnC,aAAG,OAAO,IAAI,EAAE,GAAG,SAAS,CAAC,WAAW,gBAAgB,EAAE,IAAI,CAAC;AAAA,QACjE;AAAA,MACF,CAAC;AAIH,WAAK,KAAK,SAAU,GAAG;AACrB,cAAM,QAAQ,GAAG,OAAO,IAAI;AAG5B,cAAM,OAAO,MACV,OAAO,MAAM,EACb,KAAK,SAAS,kDAAkD,EAChE,KAAK,eAAe,QAAQ,EAC5B,KAAK,KAAK,CAAC,EACX,KAAK,KAAK,CAAC,EACX,KAAK,MAAM,OAAO,EAClB,KAAM,EAAE,KAAK,QAAS,EAAE,KAAK,QAAQ,EAAE,KAAK,IAAI;AAGnD,cAAM,OAAQ,KAAK,KAAA,EAA0B,QAAA;AAC7C,cAAM,WAAW;AACjB,cAAM,WAAW;AAEjB,cAAMA,SAAQ,KAAK,QAAQ,WAAW;AACtC,cAAMC,UAAS,KAAK,SAAS,WAAW;AAGxC,cACG,OAAO,QAAQ,MAAM,EACrB,KAAK,SAAS,MAAM,SAAS,EAC7B,KAAK,KAAK,CAACD,SAAQ,CAAC,EACpB,KAAK,KAAK,CAACC,UAAS,CAAC,EACrB,KAAK,SAASD,MAAK,EACnB,KAAK,UAAUC,OAAM,EACrB,KAAK,MAAM,CAAC,EACZ,KAAK,MAAM,CAAC;AAAA,MACjB,CAAC;AAED,WACG,OAAO,MAAM,EACb,KAAK,KAAK,CAAC,EACX,KAAK,KAAK,CAAC,EACX,KAAK,MAAM,OAAO,EAClB,KAAK,SAAS,kDAAkD,EAChE,KAAK,eAAe,QAAQ,EAC5B,KAAK,CAAC,MAAM;AAAC,eAAQ,EAAE,KAAK,QAAS,EAAE,KAAK,QAAQ,EAAE,KAAK;AAAA,MAAI,CAAC,EAChE,MAAM,kBAAkB,MAAM;AAAA,IACnC;AAEA,UAAM,cAAc,MAAM;AAGxB,YAAM,SAAS,EAAE,KAAK,IAA2B,MAAM,GAAA;AAEvD,YAAM,OAAO,UAAoB,MAAM,KAAK;AAE5C,YAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ;AACrC,YAAM,SAAS,MAAM;AAErB,YAAM,aAAa,QAAA,EAAoB,SAAS,CAAC,KAAK,GAAG,CAAC;AAE1D,YAAM,WAAW,WAAW,IAAI;AAEhC,YAAM,MAAM,GACT,OAAO,cAAc,KAAK,EAC1B,OAAO,KAAK,EACZ,KAAK,SAAS,KAAK,EACnB,KAAK,UAAU,MAAM;AAExB,YAAM,IAAI,IACP,OAAO,GAAG,EACV,KAAK,aAAa,aAAa,OAAO,IAAI,KAAK,OAAO,GAAG,GAAG;AAE/D,YAAM,OAAO,OACV,KAAA,EACA,YAAY,CAAC,KAAK,CAAC,CAAC,EACpB,GAAG,QAAQ,CAAC,UAAU;AACrB,UAAE,KAAK,aAAa,MAAM,SAAS;AAAA,MACrC,CAAC;AAEH,UAAI,KAAK,IAAI;AAEb,YAAM,UAAU;AAChB,YAAM,UAAU,SAAS,IAAI,SAAS;AACtC,YAAM,WAAY,OAAe;AACjC,UAAI,KAAK,KAAK,WAAW,SAAS,UAAU,SAAS,OAAO,CAAC;AAG7D,YAAM,WAAW,eAAA,EAId,EAAE,CAAC,MAAM,EAAE,CAAC,EACZ,EAAE,CAAC,MAAM,EAAE,CAAC;AAEf,QAAE,UAAU,WAAW,EACpB,KAAK,SAAS,OAAO,EACrB,MAAA,EACA,OAAO,MAAM,EACb,KAAK,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC,EAC5B,KAAK,SAAS,CAAC,MAAM;AACpB,cAAM,OAAO,EAAE,OAAO,KAAK,SACvB,GAAG,MAAM,SAAS,cAClB;AACJ,eAAO,GAAG,IAAI;AAAA,MAChB,CAAC;AAGH,YAAM,OAAO,EACV,UAAU,QAAQ,EAClB,KAAK,SAAS,YAAA,CAAa,EAC3B,MAAA,EACA,OAAO,GAAG,EACV,KAAK,SAAS,MAAM,EACpB,KAAK,aAAa,CAAC,MAAM,aAAa,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,EACpD;AAAA,QAAM;AAAA,QAAU,CAAC,MAChB,EAAE,KAAK,aAAa,EAAE,KAAK,OAAO,YAAY;AAAA,MAAA,EAE/C,KAAK,SAAU,GAAG;AACjB,YAAI,EAAE,KAAK,aAAa,EAAE,KAAK,MAAM;AACnC,aAAG,OAAO,IAAI,EAAE,GAAG,SAAS,CAAC,WAAW,gBAAgB,EAAE,IAAI,CAAC;AAAA,QACjE;AAAA,MACF,CAAC;AAIH,WAAK,KAAK,SAAU,GAAG;AACrB,cAAM,QAAQ,GAAG,OAAO,IAAI;AAG5B,cAAM,OAAO,MACV,OAAO,MAAM,EACb,KAAK,SAAS,kDAAkD,EAChE,KAAK,eAAe,QAAQ,EAC5B,KAAK,KAAK,CAAC,EACX,KAAK,KAAK,CAAC,EACX,KAAK,MAAM,OAAO,EAClB,KAAM,EAAE,KAAK,QAAS,EAAE,KAAK,QAAQ,EAAE,KAAK,IAAI;AAGnD,cAAM,OAAQ,KAAK,KAAA,EAA0B,QAAA;AAC7C,cAAM,WAAW;AACjB,cAAM,WAAW;AAEjB,cAAMD,SAAQ,KAAK,QAAQ,WAAW;AACtC,cAAMC,UAAS,KAAK,SAAS,WAAW;AAGxC,cACG,OAAO,QAAQ,MAAM,EACrB,KAAK,SAAS,MAAM,SAAS,EAC7B,KAAK,KAAK,CAACD,SAAQ,CAAC,EACpB,KAAK,KAAK,CAACC,UAAS,CAAC,EACrB,KAAK,SAASD,MAAK,EACnB,KAAK,UAAUC,OAAM,EACrB,KAAK,MAAM,CAAC,EACZ,KAAK,MAAM,CAAC;AAAA,MACjB,CAAC;AAED,WACG,OAAO,MAAM,EACb,KAAK,KAAK,CAAC,EACX,KAAK,KAAK,CAAC,EACX,KAAK,MAAM,OAAO,EAClB,KAAK,SAAS,kDAAkD,EAChE,KAAK,eAAe,QAAQ,EAC5B,KAAK,CAAC,MAAM;AAAC,eAAQ,EAAE,KAAK,QAAS,EAAE,KAAK,QAAQ,EAAE,KAAK;AAAA,MAAI,CAAC,EAChE,MAAM,kBAAkB,MAAM;AAAA,IACnC;AAEA,UAAM,OAAO,SAAS,MAAM;AAC1B,aAAO,GAAG,MAAM,SAAS,SAAA,CAAU;AAAA,IACrC,CAAC;AAED,UAAM,OAAO,SAAS,MAAM;AAC1B,aAAO,GAAG,MAAM,SAAS,SAAA,CAAU;AAAA,IACrC,CAAC;;0BAICC,mBAsBM,OAAA,MAAA;AAAA,QArBJC,mBAMM,OAAA;AAAA,mBALA;AAAA,UAAJ,KAAI;AAAA,UACJ,OAAM;AAAA,UACL,OAAKC,eAAA,EAAA,WAAe,KAAA,OAAI,UAAY,KAAA,MAAA,CAAI;AAAA,QAAA;UAEzCD,mBAAqD,OAAA;AAAA,qBAA5C;AAAA,YAAJ,KAAI;AAAA,YAAgB,OAAM;AAAA,UAAA;;QAE6B,YAAA,sBAA9DE,YAaUC,aAAA;AAAA;sBAbQ,UAAA;AAAA,uEAAA,UAAS,QAAA;AAAA,UAAG,OAAO,YAAA,MAAY;AAAA,QAAA;2BAC/C,MAAwE;AAAA,YAA7D,YAAA,MAAY,qBAAvBJ,mBAAwE,OAAA;AAAA;cAA3C,WAAQK,MAAA,aAAA,EAAc,YAAA,MAAY,IAAI;AAAA,YAAA;YACnD,uBAAA,SAA0B,YAAA,MAAY,aACpDC,UAAA,GAAAH,YAGEI,wBAFK,uBAAA,KAAsB,GAAAC,eAAAC,WAAA,EAAA,KAAA,EAAA,GAAA,EAAA,GACd,kBAAY,UAAU,KAAA,CAAI,CAAA,GAAA,MAAA,EAAA;YAG3CR,mBAIM,OAJN,YAIM;AAAA,cAHJS,YAEUC,aAAA;AAAA,gBAFF,SAAO;AAAA,gBAAY,MAAK;AAAA,gBAAQ,UAAA;AAAA,gBAAS,SAAA;AAAA,cAAA;iCAAQ,MAEvD;AAAA,kDADAC,KAAAA,UAAU,GAAA,CAAA;AAAA,gBAAA;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"EpHierarchy.vue2.js","sources":["../../../src/components/medias/EpHierarchy.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, onMounted, computed, defineAsyncComponent } from \"vue\";\nimport {\n hierarchy,\n tree,\n cluster,\n type HierarchyPointLink,\n type HierarchyPointNode,\n} from \"d3-hierarchy\";\nimport * as d3 from \"d3-selection\";\nimport { linkVertical, linkHorizontal } from \"d3-shape\";\nimport * as d3Zoom from \"d3-zoom\";\nimport type { TreeNode } from \"~/types/Hierarchy\";\nimport type { NestedComponents } from \"~/types/Component\";\nimport { useComponent } from \"~/composables/useComponent\";\nimport EpModal from \"~/components/interactions/EpModal.vue\";\nimport EpBtn from \"~/components/basics/EpBtn.vue\";\nimport { useRenderText } from \"~/composables/useRenderText\";\nimport type { EpHierarchyProps } from \"~/types/medias/EpHierarchy\";\n\nconst props = withDefaults(defineProps<EpHierarchyProps>(), {\n labelClose: \"fermer\",\n maxWidth: 800,\n maxHeight: 600,\n isCluster: false,\n colorRect: \"fill-red-400\",\n colorPath: \"stroke-yellow-400\",\n});\n\nconst treeContainer = ref<HTMLDivElement | null>(null);\nconst treeWrapper = ref<HTMLDivElement | null>(null);\n\n/* control modal */\ntype ShowNode = {\n title: string;\n text?: string;\n component?: NestedComponents;\n};\n\nconst currentNode = ref<ShowNode | null>(null);\nconst showModal = ref(false);\n\nconst handleNodeClick = (node: TreeNode) => {\n currentNode.value = {\n title: node.name,\n text: node.text,\n component: node.component,\n };\n showModal.value = true;\n};\n\nconst closeModal = () => {\n showModal.value = false;\n currentNode.value = null;\n};\n//nested component\n\nconst components = import.meta.glob([\n \"./*.vue\", // all components in medias (same folder)\n \"../basics/*.vue\", // components/charts/\n \"../signages/*.vue\", // components/signages/\n]);\n\nconst currentRenderComponent = computed(() => {\n if (!currentNode.value || !currentNode.value.component) {\n return null;\n }\n\n const { path, name } = useComponent(currentNode.value.component.type);\n //console.log(path, name)\n let fullPath = \"\";\n if (path === \"medias\") {\n fullPath = `./${name}.vue`;\n } else {\n fullPath = `../${path}/${name}.vue`;\n }\n //console.log(fullPath)\n const loader = components[fullPath] as\n | (() => Promise<{ default: NestedComponents }>)\n | undefined;\n\n if (!loader) {\n console.warn(`Component not found: ${fullPath}`);\n return null; // or defineAsyncComponent(() => import('../fallbacks/EpNothing.vue'))\n }\n\n return defineAsyncComponent(loader);\n});\n\nonMounted(() => {\n if (!treeContainer.value) return;\n\n if (props.isCluster) {\n clusterView();\n } else {\n treeView();\n }\n});\n\nconst treeView = () => {\n const rectW = 130;\n const rectH = 40;\n const margin = { top: 40, right: 40, bottom: 40, left: 40 };\n\n const root = hierarchy<TreeNode>(props.nodes);\n //const totalLeafCount = root.leaves().length\n const width = Math.max(props.maxWidth);\n const height = props.maxHeight;\n\n const treeLayout = tree<TreeNode>().nodeSize([200, 100]); // [x spacing, y spacing]\n\n const treeData = treeLayout(root);\n\n const svg = d3\n .select(treeContainer.value)\n .append(\"svg\")\n .attr(\"width\", width)\n .attr(\"height\", height);\n\n const g = svg\n .append(\"g\")\n .attr(\"transform\", `translate(${margin.left}, ${margin.top})`);\n\n const zoom = d3Zoom\n .zoom<SVGSVGElement, unknown>()\n .scaleExtent([0.1, 2])\n .on(\"zoom\", (event) => {\n g.attr(\"transform\", event.transform);\n });\n\n svg.call(zoom);\n\n const centerX = width / 2 - treeData.x;\n const centerY = 30; //height / 2 - treeData.y\n const identity = (d3Zoom as any).zoomIdentity;\n svg.call(zoom.transform, identity.translate(centerX, centerY));\n\n // Links\n const linkPath = linkVertical<\n HierarchyPointLink<TreeNode>,\n HierarchyPointNode<TreeNode>\n >()\n .x((d) => d.x)\n .y((d) => d.y);\n\n g.selectAll(\"path.link\")\n .data(treeData.links())\n .enter()\n .append(\"path\")\n .attr(\"d\", (d) => linkPath(d))\n .attr(\"class\", (d) => {\n const link = d.target.data.active\n ? `${props.colorPath} stroke-2`\n : \"stroke-black dark:stroke-white\";\n return `${link} link fill-none`;\n });\n\n // Nodes\n const node = g\n .selectAll(\"g.node\")\n .data(treeData.descendants())\n .enter()\n .append(\"g\")\n .attr(\"class\", \"node\")\n .attr(\"transform\", (d) => `translate(${d.x}, ${d.y})`)\n .style(\"cursor\", (d) =>\n d.data.component || d.data.text ? \"pointer\" : \"default\"\n )\n .each(function (d) {\n if (d.data.component || d.data.text) {\n d3.select(this).on(\"click\", (_event) => handleNodeClick(d.data));\n }\n });\n //.style('cursor', 'pointer')\n //.on('click', (_event, d) => handleNodeClick(d.data))\n\n node.each(function (d) {\n const group = d3.select(this);\n\n // Append text temporarily\n const text = group\n .append(\"text\")\n .attr(\"class\", \"text-sm font-semibold fill-black dark:fill-white\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"x\", 0)\n .attr(\"y\", 0)\n .attr(\"dy\", \".35em\")\n .text((d.data.label) ? d.data.label : d.data.name);\n\n // Get bounding box to determine text size\n const bbox = (text.node() as SVGTextElement).getBBox();\n const paddingX = 10;\n const paddingY = 10;\n\n const width = bbox.width + paddingX * 2;\n const height = bbox.height + paddingY * 2;\n\n // Draw rect using text size\n group\n .insert(\"rect\", \"text\")\n .attr(\"class\", props.colorRect)\n .attr(\"x\", -width / 2)\n .attr(\"y\", -height / 2)\n .attr(\"width\", width)\n .attr(\"height\", height)\n .attr(\"rx\", 4)\n .attr(\"ry\", 4);\n });\n\n node\n .append(\"text\")\n .attr(\"x\", 0)\n .attr(\"y\", 0)\n .attr(\"dy\", \".35em\")\n .attr(\"class\", \"text-sm font-semibold fill-white dark:fill-black\")\n .attr(\"text-anchor\", \"middle\")\n .text((d) => {return (d.data.label) ? d.data.label : d.data.name})\n .style(\"pointer-events\", \"none\");\n};\n\nconst clusterView = () => {\n const rectW = 130;\n const rectH = 40;\n const margin = { top: 40, right: 40, bottom: 40, left: 40 };\n\n const root = hierarchy<TreeNode>(props.nodes);\n //const totalLeafCount = root.leaves().length\n const width = Math.max(props.maxWidth);\n const height = props.maxHeight;\n\n const treeLayout = cluster<TreeNode>().nodeSize([130, 200]); // [x spacing, y spacing]\n\n const treeData = treeLayout(root);\n\n const svg = d3\n .select(treeContainer.value)\n .append(\"svg\")\n .attr(\"width\", width)\n .attr(\"height\", height);\n\n const g = svg\n .append(\"g\")\n .attr(\"transform\", `translate(${margin.left}, ${margin.top})`);\n\n const zoom = d3Zoom\n .zoom<SVGSVGElement, unknown>()\n .scaleExtent([0.1, 4])\n .on(\"zoom\", (event) => {\n g.attr(\"transform\", event.transform);\n });\n\n svg.call(zoom);\n\n const centerX = 30;\n const centerY = height / 2 - treeData.x;\n const identity = (d3Zoom as any).zoomIdentity;\n svg.call(zoom.transform, identity.translate(centerX, centerY));\n\n // Links\n const linkPath = linkHorizontal<\n HierarchyPointLink<TreeNode>,\n HierarchyPointNode<TreeNode>\n >()\n .x((d) => d.y)\n .y((d) => d.x);\n\n g.selectAll(\"path.link\")\n .data(treeData.links())\n .enter()\n .append(\"path\")\n .attr(\"d\", (d) => linkPath(d))\n .attr(\"class\", (d) => {\n const link = d.target.data.active\n ? `${props.colorPath} stroke-2`\n : \"stroke-black dark:stroke-white\";\n return `${link} link fill-none`;\n });\n\n // Nodes\n const node = g\n .selectAll(\"g.node\")\n .data(treeData.descendants())\n .enter()\n .append(\"g\")\n .attr(\"class\", \"node\")\n .attr(\"transform\", (d) => `translate(${d.y}, ${d.x})`)\n .style(\"cursor\", (d) =>\n d.data.component || d.data.text ? \"pointer\" : \"default\"\n )\n .each(function (d) {\n if (d.data.component || d.data.text) {\n d3.select(this).on(\"click\", (_event) => handleNodeClick(d.data));\n }\n });\n //.style('cursor', 'pointer')\n //.on('click', (_event, d) => handleNodeClick(d.data))\n\n node.each(function (d) {\n const group = d3.select(this);\n\n // Append text temporarily\n const text = group\n .append(\"text\")\n .attr(\"class\", \"text-sm font-semibold fill-black dark:fill-white\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"x\", 0)\n .attr(\"y\", 0)\n .attr(\"dy\", \".35em\")\n .text((d.data.label) ? d.data.label : d.data.name);\n\n // Get bounding box to determine text size\n const bbox = (text.node() as SVGTextElement).getBBox();\n const paddingX = 10;\n const paddingY = 10;\n\n const width = bbox.width + paddingX * 2;\n const height = bbox.height + paddingY * 2;\n\n // Draw rect using text size\n group\n .insert(\"rect\", \"text\")\n .attr(\"class\", props.colorRect)\n .attr(\"x\", -width / 2)\n .attr(\"y\", -height / 2)\n .attr(\"width\", width)\n .attr(\"height\", height)\n .attr(\"rx\", 4)\n .attr(\"ry\", 4);\n });\n\n node\n .append(\"text\")\n .attr(\"x\", 0)\n .attr(\"y\", 0)\n .attr(\"dy\", \".35em\")\n .attr(\"class\", \"text-sm font-semibold fill-white dark:fill-black\")\n .attr(\"text-anchor\", \"middle\")\n .text((d) => {return (d.data.label) ? d.data.label : d.data.name})\n .style(\"pointer-events\", \"none\");\n};\n\nconst maxW = computed(() => {\n return `${props.maxWidth.toString()}px`;\n});\n\nconst maxH = computed(() => {\n return `${props.maxWidth.toString()}px`;\n});\n</script>\n\n<template>\n <div>\n <div\n ref=\"treeWrapper\"\n class=\"ep-tree-wrapper mx-auto\"\n :style=\"{ maxHeight: maxH, maxWidth: maxW }\"\n >\n <div ref=\"treeContainer\" class=\"ep-tree-container\" />\n </div>\n <EpModal v-model=\"showModal\" :title=\"currentNode.title\" v-if=\"currentNode\">\n <div v-if=\"currentNode.text\" v-html=\"useRenderText(currentNode.text)\" />\n <template v-if=\"currentRenderComponent && currentNode.component\">\n <component\n :is=\"currentRenderComponent\"\n v-bind=\"{ ...currentNode.component.data }\"\n />\n </template>\n <div class=\"flex justify-end\">\n <EpBtn @click=\"closeModal\" type=\"error\" outlined rounded>{{\n labelClose\n }}</EpBtn>\n </div>\n </EpModal>\n </div>\n</template>\n\n<style scoped>\n.ep-tree-wrapper {\n overflow: auto;\n border: 1px solid #ddd;\n}\n\n.ep-tree-container {\n width: 100%;\n overflow-x: auto;\n}\n</style>\n"],"names":["width","height","_createElementBlock","_createElementVNode","_normalizeStyle","_createBlock","EpModal","_unref","_openBlock","_resolveDynamicComponent","_normalizeProps","_mergeProps","_createVNode","EpBtn","labelClose"],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { defineComponent, ref, createElementBlock, openBlock, normalizeClass, createElementVNode, createCommentVNode, toDisplayString, unref, createVNode, Fragment, renderList, createTextVNode } from "vue";
|
|
2
|
+
import { useRenderText } from "../../composables/useRenderText.js";
|
|
3
|
+
import _sfc_main$1 from "./EpVideo.vue.js";
|
|
4
|
+
const _hoisted_1 = { class: "w-2/3" };
|
|
5
|
+
const _hoisted_2 = {
|
|
6
|
+
key: 0,
|
|
7
|
+
class: "my-3"
|
|
8
|
+
};
|
|
9
|
+
const _hoisted_3 = { class: "text-2xl font-bold" };
|
|
10
|
+
const _hoisted_4 = ["innerHTML"];
|
|
11
|
+
const _hoisted_5 = { key: 1 };
|
|
12
|
+
const _hoisted_6 = {
|
|
13
|
+
key: 2,
|
|
14
|
+
class: "p-6 flex justify-center items-center"
|
|
15
|
+
};
|
|
16
|
+
const _hoisted_7 = { class: "w-1/3" };
|
|
17
|
+
const _hoisted_8 = { class: "flex justify-between items-center my-5" };
|
|
18
|
+
const _hoisted_9 = { class: "overflow-y-auto flex flex-col justify-start" };
|
|
19
|
+
const _hoisted_10 = ["onClick"];
|
|
20
|
+
const _hoisted_11 = { class: "mr-2 font-bold" };
|
|
21
|
+
const _hoisted_12 = {
|
|
22
|
+
key: 1,
|
|
23
|
+
class: "m-4 text-center"
|
|
24
|
+
};
|
|
25
|
+
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
26
|
+
__name: "EpPlaylist",
|
|
27
|
+
props: {
|
|
28
|
+
videos: {}
|
|
29
|
+
},
|
|
30
|
+
setup(__props) {
|
|
31
|
+
const playingVideo = ref(0);
|
|
32
|
+
return (_ctx, _cache) => {
|
|
33
|
+
var _a;
|
|
34
|
+
return openBlock(), createElementBlock("div", {
|
|
35
|
+
class: normalizeClass(`flex gap-3 ${_ctx.videos.length != 0 ? "h-[500px]" : ""}`)
|
|
36
|
+
}, [
|
|
37
|
+
createElementVNode("div", _hoisted_1, [
|
|
38
|
+
_ctx.videos.length != 0 ? (openBlock(), createElementBlock("div", _hoisted_2, [
|
|
39
|
+
createElementVNode("h2", _hoisted_3, toDisplayString(_ctx.videos[playingVideo.value].title), 1),
|
|
40
|
+
_ctx.videos[playingVideo.value].description ? (openBlock(), createElementBlock("p", {
|
|
41
|
+
key: 0,
|
|
42
|
+
innerHTML: unref(useRenderText)((_a = _ctx.videos[playingVideo.value].description) != null ? _a : "")
|
|
43
|
+
}, null, 8, _hoisted_4)) : createCommentVNode("", true)
|
|
44
|
+
])) : createCommentVNode("", true),
|
|
45
|
+
_ctx.videos.length != 0 ? (openBlock(), createElementBlock("div", _hoisted_5, [
|
|
46
|
+
createVNode(_sfc_main$1, {
|
|
47
|
+
src: _ctx.videos[playingVideo.value].src
|
|
48
|
+
}, null, 8, ["src"])
|
|
49
|
+
])) : (openBlock(), createElementBlock("div", _hoisted_6, "Aucune vidéo"))
|
|
50
|
+
]),
|
|
51
|
+
createElementVNode("div", _hoisted_7, [
|
|
52
|
+
createElementVNode("div", _hoisted_8, [
|
|
53
|
+
_cache[0] || (_cache[0] = createElementVNode("span", { class: "font-bold" }, "Liste de vidéos", -1)),
|
|
54
|
+
createElementVNode("span", null, toDisplayString(_ctx.videos.length) + " vidéos", 1)
|
|
55
|
+
]),
|
|
56
|
+
createElementVNode("div", _hoisted_9, [
|
|
57
|
+
_ctx.videos.length != 0 ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(_ctx.videos, (video, index) => {
|
|
58
|
+
return openBlock(), createElementBlock("p", {
|
|
59
|
+
class: normalizeClass(`p-4 rounded-lg cursor-pointer
|
|
60
|
+
${index === playingVideo.value ? "bg-surface-2-dark text-white dark:bg-neutral-200 dark:text-surface-2-dark" : "hover:bg-neutral-200 dark:hover:bg-surface-2-dark"}`),
|
|
61
|
+
key: index,
|
|
62
|
+
onClick: () => {
|
|
63
|
+
playingVideo.value = index;
|
|
64
|
+
}
|
|
65
|
+
}, [
|
|
66
|
+
createElementVNode("span", _hoisted_11, toDisplayString(index + 1), 1),
|
|
67
|
+
_cache[1] || (_cache[1] = createTextVNode()),
|
|
68
|
+
createElementVNode("span", null, toDisplayString(video.title), 1)
|
|
69
|
+
], 10, _hoisted_10);
|
|
70
|
+
}), 128)) : (openBlock(), createElementBlock("p", _hoisted_12, "Aucune vidéo"))
|
|
71
|
+
])
|
|
72
|
+
])
|
|
73
|
+
], 2);
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
export {
|
|
78
|
+
_sfc_main as default
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=EpPlaylist.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EpPlaylist.vue.js","sources":["../../../src/components/medias/EpPlaylist.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport { useRenderText } from '~/composables/useRenderText';\nimport type { EpPlaylistProps } from '~/types/medias/EpPlaylist';\nimport EpVideo from './EpVideo.vue';\n\nconst props = withDefaults(defineProps<EpPlaylistProps>(), {\n});\n\nconst playingVideo = ref<number>(0);\n\n</script>\n\n<template>\n <div :class=\"`flex gap-3 ${(videos.length != 0) ? 'h-[500px]' : ''}`\">\n <div class=\"w-2/3\">\n <div class=\"my-3\" v-if=\"videos.length != 0\">\n <h2 class=\"text-2xl font-bold\">{{ videos[playingVideo].title }}</h2>\n <p v-if=\"videos[playingVideo].description\" v-html=\"useRenderText(videos[playingVideo].description ?? '')\"></p>\n </div>\n <div v-if=\"videos.length != 0\">\n <EpVideo\n :src=\"videos[playingVideo].src\"\n />\n </div>\n <div v-else class=\"p-6 flex justify-center items-center\">Aucune vidéo</div>\n </div>\n <div class=\"w-1/3\">\n <div class=\"flex justify-between items-center my-5\">\n <span class=\"font-bold\">Liste de vidéos</span>\n <span>{{ videos.length }} vidéos</span>\n </div>\n <div class=\"overflow-y-auto flex flex-col justify-start\">\n <p\n v-if=\"videos.length != 0\"\n :class=\"`p-4 rounded-lg cursor-pointer \n ${(index === playingVideo)? 'bg-surface-2-dark text-white dark:bg-neutral-200 dark:text-surface-2-dark' : 'hover:bg-neutral-200 dark:hover:bg-surface-2-dark'}`\"\n v-for=\"video, index in videos\" :key=\"index\"\n @click=\"() => {playingVideo = index}\"\n >\n <span class=\"mr-2 font-bold\">{{index + 1}}</span> <span>{{ video.title }}</span>\n </p>\n <p v-else class=\"m-4 text-center\">Aucune vidéo</p>\n </div>\n </div>\n </div>\n</template>\n"],"names":["_createElementBlock","_normalizeClass","videos","_createElementVNode","_openBlock","_toDisplayString","_unref","_createVNode","EpVideo","_Fragment","_renderList"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,UAAM,eAAe,IAAY,CAAC;;;0BAKhCA,mBA+BM,OAAA;AAAA,QA/BA,OAAKC,eAAA,cAAiBC,KAAAA,OAAO,UAAM,IAAA,cAAA,EAAA,EAAA;AAAA,MAAA;QACvCC,mBAWM,OAXN,YAWM;AAAA,UAVsBD,KAAAA,OAAO,UAAM,KAArCE,aAAAJ,mBAGM,OAHN,YAGM;AAAA,YAFFG,mBAAoE,MAApE,YAAoEE,gBAAlCH,YAAO,aAAA,KAAY,EAAE,KAAK,GAAA,CAAA;AAAA,YACnDA,KAAAA,OAAO,aAAA,KAAY,EAAE,4BAA9BF,mBAA8G,KAAA;AAAA;cAAnE,WAAQM,MAAA,aAAA,GAAcJ,iBAAO,aAAA,KAAY,EAAE,gBAArBA,YAAgC,EAAA;AAAA,YAAA;;UAE1FA,KAAAA,OAAO,UAAM,kBAAxBF,mBAIM,OAAA,YAAA;AAAA,YAHFO,YAEEC,aAAA;AAAA,cADG,KAAKN,KAAAA,OAAO,aAAA,KAAY,EAAE;AAAA,YAAA;8BAGnCF,mBAA2E,OAA3E,YAAyD,cAAY;AAAA,QAAA;QAEzEG,mBAiBM,OAjBN,YAiBM;AAAA,UAhBFA,mBAGM,OAHN,YAGM;AAAA,YAFF,OAAA,CAAA,MAAA,OAAA,CAAA,IAAAA,mBAA8C,QAAA,EAAxC,OAAM,YAAA,GAAY,mBAAe,EAAA;AAAA,YACvCA,mBAAuC,QAAA,MAAAE,gBAA9BH,KAAAA,OAAO,MAAM,IAAG,WAAO,CAAA;AAAA,UAAA;UAEpCC,mBAWM,OAXN,YAWM;AAAA,YATQD,KAAAA,OAAO,UAAM,KADvBE,UAAA,IAAA,GAAAJ,mBAQIS,UAAA,EAAA,KAAA,KAAAC,WAJuBR,KAAAA,QAAM,CAAtB,OAAO,UAAK;kCAJvBF,mBAQI,KAAA;AAAA,gBANC,OAAKC,eAAA;AAAA,8BAAiE,UAAU,aAAA,QAAY,8EAAA,mDAAA,EAAA;AAAA,gBAE7D,KAAK;AAAA,gBACpC,SAAK,MAAA;AAAS,+BAAA,QAAe;AAAA,gBAAK;AAAA,cAAA;gBAEnCE,mBAAiD,QAAjD,aAAiDE,gBAAlB,QAAK,CAAA,GAAA,CAAA;AAAA;gBAAcF,mBAA8B,QAAA,MAAAE,gBAArB,MAAM,KAAK,GAAA,CAAA;AAAA,cAAA;sCAE1EL,mBAAkD,KAAlD,aAAkC,cAAY;AAAA,UAAA;;;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EpPlaylist.vue2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1,85 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { Handle, Position } from "@vue-flow/core";
|
|
3
|
-
import _sfc_main$1 from "../basics/EpIcon.vue.js";
|
|
4
|
-
import { useRenderText } from "../../composables/useRenderText.js";
|
|
5
|
-
const _hoisted_1 = ["innerHTML"];
|
|
6
|
-
const plug = "M17,16H21V14H17V10H21V8H17V8C17,7 16,6 15,6H9.5L6,9.5H3V14.5H6L9.5,18H15C16,18 17,17 17,16Z";
|
|
7
|
-
const socket = "M7,16C7,17 8,18 9,18H14.5L18,14.5H21V9.5H18L14.5,6H9C8,6 7,7 7,8Z M7 19 L7 5";
|
|
8
|
-
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
9
|
-
__name: "AssociationNode",
|
|
10
|
-
props: {
|
|
11
|
-
id: {},
|
|
12
|
-
type: {},
|
|
13
|
-
selected: { type: Boolean },
|
|
14
|
-
connectable: { type: [Boolean, Number, String, Function] },
|
|
15
|
-
position: {},
|
|
16
|
-
dimensions: {},
|
|
17
|
-
label: {},
|
|
18
|
-
isValidTargetPos: {},
|
|
19
|
-
isValidSourcePos: {},
|
|
20
|
-
parent: {},
|
|
21
|
-
parentNodeId: {},
|
|
22
|
-
dragging: { type: Boolean },
|
|
23
|
-
resizing: { type: Boolean },
|
|
24
|
-
zIndex: {},
|
|
25
|
-
targetPosition: {},
|
|
26
|
-
sourcePosition: {},
|
|
27
|
-
dragHandle: {},
|
|
28
|
-
data: {},
|
|
29
|
-
events: {}
|
|
30
|
-
},
|
|
31
|
-
setup(__props) {
|
|
32
|
-
const props = __props;
|
|
33
|
-
const colorStyle = computed(() => {
|
|
34
|
-
if (!props.data.mode || props.data.mode == "neutral") {
|
|
35
|
-
return "border-2 border-black dark:border-white";
|
|
36
|
-
}
|
|
37
|
-
if (props.data.mode == "correct") {
|
|
38
|
-
return "border-2 border-green-600";
|
|
39
|
-
} else if (props.data.mode == "wrong") {
|
|
40
|
-
return "border-2 border-red-600";
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
return (_ctx, _cache) => {
|
|
44
|
-
return openBlock(), createElementBlock("div", {
|
|
45
|
-
class: normalizeClass(`shadow-lg rounded w-96 relative bg-surface-2 dark:bg-surface-2-dark ${colorStyle.value}`)
|
|
46
|
-
}, [
|
|
47
|
-
createElementVNode("div", {
|
|
48
|
-
class: "px-4 py-2 break-words",
|
|
49
|
-
innerHTML: unref(useRenderText)(_ctx.data.label)
|
|
50
|
-
}, null, 8, _hoisted_1),
|
|
51
|
-
createElementVNode("span", {
|
|
52
|
-
class: normalizeClass(`rounded-full w-6 h-6 flex justify-center bg-white dark:bg-neutral-800 items-center absolute bottom-1/3 ${_ctx.data.left ? "-left-3" : "-right-3"} ${colorStyle.value}`)
|
|
53
|
-
}, toDisplayString(_ctx.data.left ? String.fromCharCode(65 + _ctx.data.index) : _ctx.data.index), 3),
|
|
54
|
-
createVNode(unref(Handle), {
|
|
55
|
-
type: _ctx.data.left ? "source" : "target",
|
|
56
|
-
position: _ctx.data.left ? unref(Position).Right : unref(Position).Left,
|
|
57
|
-
style: normalizeStyle({
|
|
58
|
-
width: "20px",
|
|
59
|
-
// handle invisible, pas d’espace
|
|
60
|
-
height: "20px",
|
|
61
|
-
top: "50%",
|
|
62
|
-
zIndex: "100",
|
|
63
|
-
transform: "translateY(-50%)",
|
|
64
|
-
left: _ctx.data.left ? "96%" : "-10px",
|
|
65
|
-
opacity: 0
|
|
66
|
-
})
|
|
67
|
-
}, null, 8, ["type", "position", "style"]),
|
|
68
|
-
createVNode(_sfc_main$1, {
|
|
69
|
-
"icon-path": _ctx.data.left ? plug : socket,
|
|
70
|
-
style: normalizeStyle({
|
|
71
|
-
position: "absolute",
|
|
72
|
-
width: "30px",
|
|
73
|
-
height: "30px",
|
|
74
|
-
top: "50%",
|
|
75
|
-
transform: "translateY(-50%)",
|
|
76
|
-
left: _ctx.data.left ? "97%" : "-20px"
|
|
77
|
-
})
|
|
78
|
-
}, null, 8, ["icon-path", "style"])
|
|
79
|
-
], 2);
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
});
|
|
1
|
+
import _sfc_main from "./AssociationNode.vue2.js";
|
|
83
2
|
export {
|
|
84
3
|
_sfc_main as default
|
|
85
4
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssociationNode.vue.js","sources":[
|
|
1
|
+
{"version":3,"file":"AssociationNode.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1,4 +1,85 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { defineComponent, computed, createElementBlock, openBlock, normalizeClass, createElementVNode, createVNode, unref, toDisplayString, normalizeStyle } from "vue";
|
|
2
|
+
import { Handle, Position } from "@vue-flow/core";
|
|
3
|
+
import _sfc_main$1 from "../basics/EpIcon.vue.js";
|
|
4
|
+
import { useRenderText } from "../../composables/useRenderText.js";
|
|
5
|
+
const _hoisted_1 = ["innerHTML"];
|
|
6
|
+
const plug = "M17,16H21V14H17V10H21V8H17V8C17,7 16,6 15,6H9.5L6,9.5H3V14.5H6L9.5,18H15C16,18 17,17 17,16Z";
|
|
7
|
+
const socket = "M7,16C7,17 8,18 9,18H14.5L18,14.5H21V9.5H18L14.5,6H9C8,6 7,7 7,8Z M7 19 L7 5";
|
|
8
|
+
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
9
|
+
__name: "AssociationNode",
|
|
10
|
+
props: {
|
|
11
|
+
id: {},
|
|
12
|
+
type: {},
|
|
13
|
+
selected: { type: Boolean },
|
|
14
|
+
connectable: { type: [Boolean, Number, String, Function] },
|
|
15
|
+
position: {},
|
|
16
|
+
dimensions: {},
|
|
17
|
+
label: {},
|
|
18
|
+
isValidTargetPos: {},
|
|
19
|
+
isValidSourcePos: {},
|
|
20
|
+
parent: {},
|
|
21
|
+
parentNodeId: {},
|
|
22
|
+
dragging: { type: Boolean },
|
|
23
|
+
resizing: { type: Boolean },
|
|
24
|
+
zIndex: {},
|
|
25
|
+
targetPosition: {},
|
|
26
|
+
sourcePosition: {},
|
|
27
|
+
dragHandle: {},
|
|
28
|
+
data: {},
|
|
29
|
+
events: {}
|
|
30
|
+
},
|
|
31
|
+
setup(__props) {
|
|
32
|
+
const props = __props;
|
|
33
|
+
const colorStyle = computed(() => {
|
|
34
|
+
if (!props.data.mode || props.data.mode == "neutral") {
|
|
35
|
+
return "border-2 border-black dark:border-white";
|
|
36
|
+
}
|
|
37
|
+
if (props.data.mode == "correct") {
|
|
38
|
+
return "border-2 border-green-600";
|
|
39
|
+
} else if (props.data.mode == "wrong") {
|
|
40
|
+
return "border-2 border-red-600";
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
return (_ctx, _cache) => {
|
|
44
|
+
return openBlock(), createElementBlock("div", {
|
|
45
|
+
class: normalizeClass(`shadow-lg rounded w-96 relative bg-surface-2 dark:bg-surface-2-dark ${colorStyle.value}`)
|
|
46
|
+
}, [
|
|
47
|
+
createElementVNode("div", {
|
|
48
|
+
class: "px-4 py-2 break-words",
|
|
49
|
+
innerHTML: unref(useRenderText)(_ctx.data.label)
|
|
50
|
+
}, null, 8, _hoisted_1),
|
|
51
|
+
createElementVNode("span", {
|
|
52
|
+
class: normalizeClass(`rounded-full w-6 h-6 flex justify-center bg-white dark:bg-neutral-800 items-center absolute bottom-1/3 ${_ctx.data.left ? "-left-3" : "-right-3"} ${colorStyle.value}`)
|
|
53
|
+
}, toDisplayString(_ctx.data.left ? String.fromCharCode(65 + _ctx.data.index) : _ctx.data.index), 3),
|
|
54
|
+
createVNode(unref(Handle), {
|
|
55
|
+
type: _ctx.data.left ? "source" : "target",
|
|
56
|
+
position: _ctx.data.left ? unref(Position).Right : unref(Position).Left,
|
|
57
|
+
style: normalizeStyle({
|
|
58
|
+
width: "20px",
|
|
59
|
+
// handle invisible, pas d’espace
|
|
60
|
+
height: "20px",
|
|
61
|
+
top: "50%",
|
|
62
|
+
zIndex: "100",
|
|
63
|
+
transform: "translateY(-50%)",
|
|
64
|
+
left: _ctx.data.left ? "96%" : "-10px",
|
|
65
|
+
opacity: 0
|
|
66
|
+
})
|
|
67
|
+
}, null, 8, ["type", "position", "style"]),
|
|
68
|
+
createVNode(_sfc_main$1, {
|
|
69
|
+
"icon-path": _ctx.data.left ? plug : socket,
|
|
70
|
+
style: normalizeStyle({
|
|
71
|
+
position: "absolute",
|
|
72
|
+
width: "30px",
|
|
73
|
+
height: "30px",
|
|
74
|
+
top: "50%",
|
|
75
|
+
transform: "translateY(-50%)",
|
|
76
|
+
left: _ctx.data.left ? "97%" : "-20px"
|
|
77
|
+
})
|
|
78
|
+
}, null, 8, ["icon-path", "style"])
|
|
79
|
+
], 2);
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
});
|
|
2
83
|
export {
|
|
3
84
|
_sfc_main as default
|
|
4
85
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssociationNode.vue2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"AssociationNode.vue2.js","sources":["../../../src/components/tools/AssociationNode.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { Position, Handle } from '@vue-flow/core'\nimport type { NodeProps } from '@vue-flow/core'\nimport EpIcon from '../basics/EpIcon.vue'\nimport { useRenderText } from '~/composables/useRenderText';\n\n\nconst plug = 'M17,16H21V14H17V10H21V8H17V8C17,7 16,6 15,6H9.5L6,9.5H3V14.5H6L9.5,18H15C16,18 17,17 17,16Z';\nconst socket = 'M7,16C7,17 8,18 9,18H14.5L18,14.5H21V9.5H18L14.5,6H9C8,6 7,7 7,8Z M7 19 L7 5';\n\ninterface AssociationData {\n mode?: 'neutral' | 'correct' | 'wrong';\n left: boolean;\n index: number;\n label: string;\n}\n\nconst props = withDefaults(defineProps<NodeProps<AssociationData>>(), {});\n\nconst colorStyle = computed(() => {\n if(!props.data.mode || props.data.mode == 'neutral') {\n return 'border-2 border-black dark:border-white'\n }\n if(props.data.mode == 'correct') {\n return 'border-2 border-green-600'\n } else if(props.data.mode == 'wrong') {\n return 'border-2 border-red-600'\n }\n});\n\n</script>\n\n<template>\n <div :class=\"`shadow-lg rounded w-96 relative bg-surface-2 dark:bg-surface-2-dark ${colorStyle}`\">\n <div class=\"px-4 py-2 break-words\" v-html=\"useRenderText(data.label)\"></div>\n <span :class=\"`rounded-full w-6 h-6 flex justify-center bg-white dark:bg-neutral-800 items-center absolute bottom-1/3 ${(data.left)? '-left-3' : '-right-3'} ${colorStyle}`\">{{ (data.left)? String.fromCharCode(65 + data.index) : data.index }}</span>\n\n <Handle\n :type=\"data.left ? 'source' : 'target'\"\n :position=\"data.left ? Position.Right : Position.Left\"\n :style=\"{\n width: '20px', // handle invisible, pas d’espace\n height: '20px',\n top: '50%',\n zIndex: '100',\n transform: 'translateY(-50%)',\n left: data.left ? '96%' : '-10px',\n opacity: 0\n }\"\n />\n <EpIcon \n :icon-path=\"data.left ? plug : socket\"\n :style=\"{\n position: 'absolute',\n width: '30px',\n height: '30px',\n top: '50%',\n transform: 'translateY(-50%)',\n left: data.left ? '97%' : '-20px'\n }\" \n />\n </div>\n</template>\n"],"names":["_createElementBlock","_createElementVNode","_unref","data","_normalizeClass","_createVNode","_normalizeStyle","EpIcon"],"mappings":";;;;;AAQA,MAAM,OAAO;AACb,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;AASf,UAAM,QAAQ;AAEd,UAAM,aAAa,SAAS,MAAM;AAC9B,UAAG,CAAC,MAAM,KAAK,QAAQ,MAAM,KAAK,QAAQ,WAAW;AACjD,eAAO;AAAA,MACX;AACA,UAAG,MAAM,KAAK,QAAQ,WAAW;AAC7B,eAAO;AAAA,MACX,WAAU,MAAM,KAAK,QAAQ,SAAS;AAClC,eAAO;AAAA,MACX;AAAA,IACJ,CAAC;;0BAKGA,mBA4BM,OAAA;AAAA,QA5BA,6FAA8E,WAAA,KAAU,EAAA;AAAA,MAAA;QAC1FC,mBAA4E,OAAA;AAAA,UAAvE,OAAM;AAAA,UAAwB,WAAQC,MAAA,aAAA,EAAcC,KAAAA,KAAK,KAAK;AAAA,QAAA;QACnEF,mBAAwP,QAAA;AAAA,UAAjP,OAAKG,eAAA,0GAA6GD,KAAAA,KAAK,iCAAiC,WAAA,KAAU,EAAA;AAAA,QAAA,GAAQA,gBAAAA,KAAAA,KAAK,OAAO,OAAO,aAAY,KAAMA,KAAAA,KAAK,KAAK,IAAIA,KAAAA,KAAK,KAAK,GAAA,CAAA;AAAA,QAE9OE,YAYEH,MAAA,MAAA,GAAA;AAAA,UAXG,MAAMC,KAAAA,KAAK,OAAI,WAAA;AAAA,UACf,UAAUA,KAAAA,KAAK,OAAOD,MAAA,QAAA,EAAS,QAAQA,MAAA,QAAA,EAAS;AAAA,UAChD,OAAKI,eAAA;AAAA;;;;;;YAAuOH,MAAAA,KAAAA,KAAK,OAAI,QAAA;AAAA;;;QAU1PE,YAUEE,aAAA;AAAA,UATG,aAAWJ,KAAAA,KAAK,OAAO,OAAO;AAAA,UAC9B,OAAKG,eAAA;AAAA;;;;;YAA0MH,MAAAA,KAAAA,KAAK,OAAI,QAAA;AAAA,UAAA;;;;;;"}
|
|
@@ -1,55 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
const _hoisted_1 = {
|
|
3
|
-
version: "1.1",
|
|
4
|
-
id: "Layer_1",
|
|
5
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
6
|
-
"xmlns:xlink": "http://www.w3.org/1999/xlink",
|
|
7
|
-
x: "0px",
|
|
8
|
-
y: "0px",
|
|
9
|
-
viewBox: "0 0 640 360",
|
|
10
|
-
style: { "enable-background": "new 0 0 640 360" },
|
|
11
|
-
"xml:space": "preserve"
|
|
12
|
-
};
|
|
13
|
-
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
14
|
-
__name: "BgAudio",
|
|
15
|
-
props: {
|
|
16
|
-
fill: { default: "fill-primary" }
|
|
17
|
-
},
|
|
18
|
-
setup(__props) {
|
|
19
|
-
const props = __props;
|
|
20
|
-
return (_ctx, _cache) => {
|
|
21
|
-
return openBlock(), createElementBlock("svg", _hoisted_1, [
|
|
22
|
-
_cache[1] || (_cache[1] = createStaticVNode('<pattern y="-20" width="150" height="100" patternUnits="userSpaceOnUse" id="New_Pattern" viewBox="8 -107.8 150 100" style="overflow:visible;"><g><rect x="8" y="-107.8" style="fill:none;" width="150" height="100"></rect><g style="opacity:0.1;"><path d="M159.8-15.5c3.5,0.8,6.2,4,6.2,7.8s-2.7,7-6.2,7.8v-1.8c2.6-0.8,4.4-3.1,4.4-5.9s-1.9-5.2-4.4-5.9V-15.5 M162-7.8\n c0,1.6-0.9,2.9-2.2,3.5v-7.1C161.1-10.7,162-9.3,162-7.8 M153.5-10.4l4.4-4.4v14.2l-4.4-4.4H150v-5.3H153.5z"></path></g><g style="opacity:0.1;"><path d="M9.8-15.5c3.5,0.8,6.2,4,6.2,7.8s-2.7,7-6.2,7.8v-1.8c2.6-0.8,4.4-3.1,4.4-5.9s-1.9-5.2-4.4-5.9V-15.5 M12-7.8\n c0,1.6-0.9,2.9-2.2,3.5v-7.1C11.1-10.7,12-9.3,12-7.8 M3.5-10.4L8-14.8v14.2L3.5-5.1H0v-5.3H3.5z"></path></g><g style="opacity:0.1;"><path d="M159.8-115.5c3.5,0.8,6.2,4,6.2,7.8s-2.7,7-6.2,7.8v-1.8c2.6-0.8,4.4-3.1,4.4-5.9s-1.9-5.2-4.4-5.9V-115.5 M162-107.8\n c0,1.6-0.9,2.9-2.2,3.5v-7.1C161.1-110.7,162-109.3,162-107.8 M153.5-110.4l4.4-4.4v14.2l-4.4-4.4H150v-5.3H153.5z"></path></g><g style="opacity:0.1;"><path d="M84.8-65.5c3.5,0.8,6.2,4,6.2,7.8s-2.7,7-6.2,7.8v-1.8c2.6-0.8,4.4-3.1,4.4-5.9c0-2.8-1.9-5.2-4.4-5.9V-65.5 M87-57.8\n c0,1.6-0.9,2.9-2.2,3.5v-7.1C86.1-60.7,87-59.3,87-57.8 M78.5-60.4l4.4-4.4v14.2l-4.4-4.4H75v-5.3H78.5z"></path></g><g style="opacity:0.1;"><path d="M9.8-115.5c3.5,0.8,6.2,4,6.2,7.8s-2.7,7-6.2,7.8v-1.8c2.6-0.8,4.4-3.1,4.4-5.9s-1.9-5.2-4.4-5.9V-115.5 M12-107.8\n c0,1.6-0.9,2.9-2.2,3.5v-7.1C11.1-110.7,12-109.3,12-107.8 M3.5-110.4l4.4-4.4v14.2l-4.4-4.4H0v-5.3H3.5z"></path></g></g></pattern>', 1)),
|
|
23
|
-
createElementVNode("g", null, [
|
|
24
|
-
createElementVNode("rect", {
|
|
25
|
-
class: normalizeClass(props.fill),
|
|
26
|
-
width: "640",
|
|
27
|
-
height: "360"
|
|
28
|
-
}, null, 2),
|
|
29
|
-
_cache[0] || (_cache[0] = createElementVNode("path", {
|
|
30
|
-
style: { "fill": "url(#New_Pattern)" },
|
|
31
|
-
d: "M639,1v358H1V1H639 M640,0H0v360h640V0L640,0z"
|
|
32
|
-
}, null, -1))
|
|
33
|
-
]),
|
|
34
|
-
_cache[2] || (_cache[2] = createElementVNode("g", null, [
|
|
35
|
-
createElementVNode("rect", {
|
|
36
|
-
x: "0.5",
|
|
37
|
-
y: "0.5",
|
|
38
|
-
style: { "fill": "url(#New_Pattern)" },
|
|
39
|
-
width: "639",
|
|
40
|
-
height: "359"
|
|
41
|
-
})
|
|
42
|
-
], -1)),
|
|
43
|
-
_cache[3] || (_cache[3] = createElementVNode("g", null, [
|
|
44
|
-
createElementVNode("path", {
|
|
45
|
-
style: { "fill": "white" },
|
|
46
|
-
d: "M310.7,114.7c-31,4.4-53.2,32.4-53.2,63.7v46.8c0,11.5,9.3,20.8,20.8,20.8h20.8v-55.6h-27.8v-12\n c0-24.9,17.9-47.1,42.5-50.1c29.6-3.6,54.7,19.4,54.7,48.3v13.9h-27.8V246h20.8c11.5,0,20.8-9.3,20.8-20.8v-48.6\n C382.5,138.7,349.4,109.1,310.7,114.7z"
|
|
47
|
-
})
|
|
48
|
-
], -1))
|
|
49
|
-
]);
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
});
|
|
1
|
+
import _sfc_main from "./BgAudio.vue2.js";
|
|
53
2
|
export {
|
|
54
3
|
_sfc_main as default
|
|
55
4
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BgAudio.vue.js","sources":[
|
|
1
|
+
{"version":3,"file":"BgAudio.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|