@milaboratories/graph-maker 1.2.6 → 1.2.8

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ChartTruncationWarningAlert.js","names":[],"sources":["../../src/components/ChartTruncationWarningAlert.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { PlBtnPrimary, PlNotificationAlert, PlSpacer } from '@platforma-sdk/ui-vue';\nimport { computed, ref } from 'vue';\nimport type { ChartTruncationWarning } from '../utils/createChartSettingsForRender/composeChartSettings';\nimport { formatTruncationTotal } from '../utils/createChartSettingsForRender/composeChartSettings';\nimport { useStore } from '../store';\n\nconst props = defineProps<{ truncationWarning: ChartTruncationWarning }>();\n\nconst store = useStore();\nconst isAlertOpen = ref(true);\n\nconst message = computed(() => {\n const w = props.truncationWarning;\n const intro: string[] = [];\n if (w.groups) intro.push('Some groups are hidden');\n if (w.facets) intro.push('Some facets are hidden');\n const lead = intro.join('. ');\n const countParts: string[] = [];\n if (w.groups && w.groupsVisible != null && w.groupsTotal != null) {\n countParts.push(`${w.groupsVisible} of ${formatTruncationTotal(w.groupsTotal)} groups`);\n }\n if (w.facets && w.facetsVisible != null && w.facetsTotal != null) {\n countParts.push(`${w.facetsVisible} of ${formatTruncationTotal(w.facetsTotal)} facets`);\n }\n const countText = countParts.length ? ` Showing ${countParts.join('; ')}.` : '';\n const end = 'Limits can be changed in Axes settings.';\n return `${lead}.${countText} ${end}`;\n});\n\nfunction openAxesSettings() {\n store.value.reactive.currentTab = 'axes';\n store.value.reactive.tabDefaultState.axes.scrollToBottom = true;\n}\n</script>\n<template>\n <div :class=\"$style.alert\">\n <PlNotificationAlert v-model=\"isAlertOpen\" type=\"warning\" closable>\n {{ message }}\n <template #actions>\n <PlBtnPrimary icon=\"arrow-right\" @click.stop=\"() => openAxesSettings()\">Open Axes settings</PlBtnPrimary>\n <PlSpacer />\n </template>\n </PlNotificationAlert>\n </div>\n</template>\n<style module>\n.alert {\n position: fixed;\n bottom: 12px;\n right: 12px;\n width: 256px;\n height: auto;\n z-index: 1;\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"ChartTruncationWarningAlert.js","names":[],"sources":["../../src/components/ChartTruncationWarningAlert.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { PlBtnPrimary, PlNotificationAlert, PlSpacer } from '@platforma-sdk/ui-vue';\nimport { computed, ref } from 'vue';\nimport type { ChartTruncationWarning } from '../utils/createChartSettingsForRender/composeChartSettings';\nimport { formatTruncationTotal } from '../utils/createChartSettingsForRender/composeChartSettings';\nimport { useStore } from '../store';\n\nconst props = defineProps<{ truncationWarning: ChartTruncationWarning }>();\n\nconst store = useStore();\nconst isAlertOpen = ref(true);\n\nconst message = computed(() => {\n const w = props.truncationWarning;\n\n if (w.type === 'dataOverflow') {\n return `Only ${w.dataVisible} values are shown on the chart. Use filters.`;\n }\n const intro: string[] = [];\n if (w.groups) intro.push('Some groups are hidden');\n if (w.facets) intro.push('Some facets are hidden');\n const lead = intro.join('. ');\n const countParts: string[] = [];\n if (w.groups && w.groupsVisible != null && w.groupsTotal != null) {\n countParts.push(`${w.groupsVisible} of ${formatTruncationTotal(w.groupsTotal)} groups`);\n }\n if (w.facets && w.facetsVisible != null && w.facetsTotal != null) {\n countParts.push(`${w.facetsVisible} of ${formatTruncationTotal(w.facetsTotal)} facets`);\n }\n const countText = countParts.length ? ` Showing ${countParts.join('; ')}.` : '';\n const end = 'Limits can be changed in Axes settings.';\n return `${lead}.${countText} ${end}`;\n});\n\nfunction openAxesSettings() {\n store.value.reactive.currentTab = 'axes';\n store.value.reactive.tabDefaultState.axes.scrollToBottom = true;\n}\n\nfunction openDataMapping() {\n store.value.reactive.currentTab = 'dataMapping';\n}\n</script>\n<template>\n <div :class=\"$style.alert\">\n <PlNotificationAlert v-model=\"isAlertOpen\" type=\"warning\" closable>\n {{ message }}\n <template #actions>\n <PlBtnPrimary v-if=\"truncationWarning.type === 'dataOverflow'\" icon=\"arrow-right\" @click.stop=\"() => openDataMapping()\">Open Data Mapping</PlBtnPrimary>\n <PlBtnPrimary v-else icon=\"arrow-right\" @click.stop=\"() => openAxesSettings()\">Open Axes settings</PlBtnPrimary>\n <PlSpacer />\n </template>\n </PlNotificationAlert>\n </div>\n</template>\n<style module>\n.alert {\n position: fixed;\n bottom: 12px;\n right: 12px;\n width: 256px;\n height: auto;\n z-index: 1;\n}\n</style>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"ChartTruncationWarningAlert.vue_vue_type_style_index_0_lang.module.js","names":[],"sources":["../../src/components/ChartTruncationWarningAlert.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { PlBtnPrimary, PlNotificationAlert, PlSpacer } from '@platforma-sdk/ui-vue';\nimport { computed, ref } from 'vue';\nimport type { ChartTruncationWarning } from '../utils/createChartSettingsForRender/composeChartSettings';\nimport { formatTruncationTotal } from '../utils/createChartSettingsForRender/composeChartSettings';\nimport { useStore } from '../store';\n\nconst props = defineProps<{ truncationWarning: ChartTruncationWarning }>();\n\nconst store = useStore();\nconst isAlertOpen = ref(true);\n\nconst message = computed(() => {\n const w = props.truncationWarning;\n const intro: string[] = [];\n if (w.groups) intro.push('Some groups are hidden');\n if (w.facets) intro.push('Some facets are hidden');\n const lead = intro.join('. ');\n const countParts: string[] = [];\n if (w.groups && w.groupsVisible != null && w.groupsTotal != null) {\n countParts.push(`${w.groupsVisible} of ${formatTruncationTotal(w.groupsTotal)} groups`);\n }\n if (w.facets && w.facetsVisible != null && w.facetsTotal != null) {\n countParts.push(`${w.facetsVisible} of ${formatTruncationTotal(w.facetsTotal)} facets`);\n }\n const countText = countParts.length ? ` Showing ${countParts.join('; ')}.` : '';\n const end = 'Limits can be changed in Axes settings.';\n return `${lead}.${countText} ${end}`;\n});\n\nfunction openAxesSettings() {\n store.value.reactive.currentTab = 'axes';\n store.value.reactive.tabDefaultState.axes.scrollToBottom = true;\n}\n</script>\n<template>\n <div :class=\"$style.alert\">\n <PlNotificationAlert v-model=\"isAlertOpen\" type=\"warning\" closable>\n {{ message }}\n <template #actions>\n <PlBtnPrimary icon=\"arrow-right\" @click.stop=\"() => openAxesSettings()\">Open Axes settings</PlBtnPrimary>\n <PlSpacer />\n </template>\n </PlNotificationAlert>\n </div>\n</template>\n<style module>\n.alert {\n position: fixed;\n bottom: 12px;\n right: 12px;\n width: 256px;\n height: auto;\n z-index: 1;\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"ChartTruncationWarningAlert.vue_vue_type_style_index_0_lang.module.js","names":[],"sources":["../../src/components/ChartTruncationWarningAlert.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { PlBtnPrimary, PlNotificationAlert, PlSpacer } from '@platforma-sdk/ui-vue';\nimport { computed, ref } from 'vue';\nimport type { ChartTruncationWarning } from '../utils/createChartSettingsForRender/composeChartSettings';\nimport { formatTruncationTotal } from '../utils/createChartSettingsForRender/composeChartSettings';\nimport { useStore } from '../store';\n\nconst props = defineProps<{ truncationWarning: ChartTruncationWarning }>();\n\nconst store = useStore();\nconst isAlertOpen = ref(true);\n\nconst message = computed(() => {\n const w = props.truncationWarning;\n\n if (w.type === 'dataOverflow') {\n return `Only ${w.dataVisible} values are shown on the chart. Use filters.`;\n }\n const intro: string[] = [];\n if (w.groups) intro.push('Some groups are hidden');\n if (w.facets) intro.push('Some facets are hidden');\n const lead = intro.join('. ');\n const countParts: string[] = [];\n if (w.groups && w.groupsVisible != null && w.groupsTotal != null) {\n countParts.push(`${w.groupsVisible} of ${formatTruncationTotal(w.groupsTotal)} groups`);\n }\n if (w.facets && w.facetsVisible != null && w.facetsTotal != null) {\n countParts.push(`${w.facetsVisible} of ${formatTruncationTotal(w.facetsTotal)} facets`);\n }\n const countText = countParts.length ? ` Showing ${countParts.join('; ')}.` : '';\n const end = 'Limits can be changed in Axes settings.';\n return `${lead}.${countText} ${end}`;\n});\n\nfunction openAxesSettings() {\n store.value.reactive.currentTab = 'axes';\n store.value.reactive.tabDefaultState.axes.scrollToBottom = true;\n}\n\nfunction openDataMapping() {\n store.value.reactive.currentTab = 'dataMapping';\n}\n</script>\n<template>\n <div :class=\"$style.alert\">\n <PlNotificationAlert v-model=\"isAlertOpen\" type=\"warning\" closable>\n {{ message }}\n <template #actions>\n <PlBtnPrimary v-if=\"truncationWarning.type === 'dataOverflow'\" icon=\"arrow-right\" @click.stop=\"() => openDataMapping()\">Open Data Mapping</PlBtnPrimary>\n <PlBtnPrimary v-else icon=\"arrow-right\" @click.stop=\"() => openAxesSettings()\">Open Axes settings</PlBtnPrimary>\n <PlSpacer />\n </template>\n </PlNotificationAlert>\n </div>\n</template>\n<style module>\n.alert {\n position: fixed;\n bottom: 12px;\n right: 12px;\n width: 256px;\n height: auto;\n z-index: 1;\n}\n</style>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"ChartTruncationWarningAlert.vue.d.ts","sourceRoot":"","sources":["../../src/components/ChartTruncationWarningAlert.vue"],"names":[],"mappings":"AA4DA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4DAA4D,CAAC;AAIzG,KAAK,WAAW,GAAG;IAAE,iBAAiB,EAAE,sBAAsB,CAAA;CAAE,CAAC;;AAyHjE,wBAOG"}
1
+ {"version":3,"file":"ChartTruncationWarningAlert.vue.d.ts","sourceRoot":"","sources":["../../src/components/ChartTruncationWarningAlert.vue"],"names":[],"mappings":"AAqEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4DAA4D,CAAC;AAIzG,KAAK,WAAW,GAAG;IAAE,iBAAiB,EAAE,sBAAsB,CAAA;CAAE,CAAC;;AAwJjE,wBAOG"}
@@ -1,38 +1,51 @@
1
1
  import { formatTruncationTotal as e } from "../utils/createChartSettingsForRender/composeChartSettings.js";
2
2
  import { useStore as t } from "../store.js";
3
- import { computed as n, createElementBlock as r, createTextVNode as i, createVNode as a, defineComponent as o, normalizeClass as s, openBlock as c, ref as l, toDisplayString as u, unref as d, withCtx as f, withModifiers as p } from "vue";
4
- import { PlBtnPrimary as m, PlNotificationAlert as h, PlSpacer as g } from "@platforma-sdk/ui-vue";
5
- var _ = /* @__PURE__ */ o({
3
+ import { computed as n, createBlock as r, createElementBlock as i, createTextVNode as a, createVNode as o, defineComponent as s, normalizeClass as c, openBlock as l, ref as u, toDisplayString as d, unref as f, withCtx as p, withModifiers as m } from "vue";
4
+ import { PlBtnPrimary as h, PlNotificationAlert as g, PlSpacer as _ } from "@platforma-sdk/ui-vue";
5
+ var v = /* @__PURE__ */ s({
6
6
  __name: "ChartTruncationWarningAlert",
7
7
  props: { truncationWarning: {} },
8
- setup(o) {
9
- let _ = o, v = t(), y = l(!0), b = n(() => {
10
- let t = _.truncationWarning, n = [];
8
+ setup(s) {
9
+ let v = s, y = t(), b = u(!0), x = n(() => {
10
+ let t = v.truncationWarning;
11
+ if (t.type === "dataOverflow") return `Only ${t.dataVisible} values are shown on the chart. Use filters.`;
12
+ let n = [];
11
13
  t.groups && n.push("Some groups are hidden"), t.facets && n.push("Some facets are hidden");
12
14
  let r = n.join(". "), i = [];
13
15
  return t.groups && t.groupsVisible != null && t.groupsTotal != null && i.push(`${t.groupsVisible} of ${e(t.groupsTotal)} groups`), t.facets && t.facetsVisible != null && t.facetsTotal != null && i.push(`${t.facetsVisible} of ${e(t.facetsTotal)} facets`), `${r}.${i.length ? ` Showing ${i.join("; ")}.` : ""} Limits can be changed in Axes settings.`;
14
16
  });
15
- function x() {
16
- v.value.reactive.currentTab = "axes", v.value.reactive.tabDefaultState.axes.scrollToBottom = !0;
17
+ function S() {
18
+ y.value.reactive.currentTab = "axes", y.value.reactive.tabDefaultState.axes.scrollToBottom = !0;
17
19
  }
18
- return (e, t) => (c(), r("div", { class: s(e.$style.alert) }, [a(d(h), {
19
- modelValue: y.value,
20
- "onUpdate:modelValue": t[1] ||= (e) => y.value = e,
20
+ function C() {
21
+ y.value.reactive.currentTab = "dataMapping";
22
+ }
23
+ return (e, t) => (l(), i("div", { class: c(e.$style.alert) }, [o(f(g), {
24
+ modelValue: b.value,
25
+ "onUpdate:modelValue": t[2] ||= (e) => b.value = e,
21
26
  type: "warning",
22
27
  closable: ""
23
28
  }, {
24
- actions: f(() => [a(d(m), {
29
+ actions: p(() => [s.truncationWarning.type === "dataOverflow" ? (l(), r(f(h), {
30
+ key: 0,
31
+ icon: "arrow-right",
32
+ onClick: t[0] ||= m(() => C(), ["stop"])
33
+ }, {
34
+ default: p(() => [...t[3] ||= [a("Open Data Mapping", -1)]]),
35
+ _: 1
36
+ })) : (l(), r(f(h), {
37
+ key: 1,
25
38
  icon: "arrow-right",
26
- onClick: t[0] ||= p(() => x(), ["stop"])
39
+ onClick: t[1] ||= m(() => S(), ["stop"])
27
40
  }, {
28
- default: f(() => [...t[2] ||= [i("Open Axes settings", -1)]]),
41
+ default: p(() => [...t[4] ||= [a("Open Axes settings", -1)]]),
29
42
  _: 1
30
- }), a(d(g))]),
31
- default: f(() => [i(u(b.value) + " ", 1)]),
43
+ })), o(f(_))]),
44
+ default: p(() => [a(d(x.value) + " ", 1)]),
32
45
  _: 1
33
46
  }, 8, ["modelValue"])], 2));
34
47
  }
35
48
  });
36
- export { _ as default };
49
+ export { v as default };
37
50
 
38
51
  //# sourceMappingURL=ChartTruncationWarningAlert.vue2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChartTruncationWarningAlert.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../src/components/ChartTruncationWarningAlert.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { PlBtnPrimary, PlNotificationAlert, PlSpacer } from '@platforma-sdk/ui-vue';\nimport { computed, ref } from 'vue';\nimport type { ChartTruncationWarning } from '../utils/createChartSettingsForRender/composeChartSettings';\nimport { formatTruncationTotal } from '../utils/createChartSettingsForRender/composeChartSettings';\nimport { useStore } from '../store';\n\nconst props = defineProps<{ truncationWarning: ChartTruncationWarning }>();\n\nconst store = useStore();\nconst isAlertOpen = ref(true);\n\nconst message = computed(() => {\n const w = props.truncationWarning;\n const intro: string[] = [];\n if (w.groups) intro.push('Some groups are hidden');\n if (w.facets) intro.push('Some facets are hidden');\n const lead = intro.join('. ');\n const countParts: string[] = [];\n if (w.groups && w.groupsVisible != null && w.groupsTotal != null) {\n countParts.push(`${w.groupsVisible} of ${formatTruncationTotal(w.groupsTotal)} groups`);\n }\n if (w.facets && w.facetsVisible != null && w.facetsTotal != null) {\n countParts.push(`${w.facetsVisible} of ${formatTruncationTotal(w.facetsTotal)} facets`);\n }\n const countText = countParts.length ? ` Showing ${countParts.join('; ')}.` : '';\n const end = 'Limits can be changed in Axes settings.';\n return `${lead}.${countText} ${end}`;\n});\n\nfunction openAxesSettings() {\n store.value.reactive.currentTab = 'axes';\n store.value.reactive.tabDefaultState.axes.scrollToBottom = true;\n}\n</script>\n<template>\n <div :class=\"$style.alert\">\n <PlNotificationAlert v-model=\"isAlertOpen\" type=\"warning\" closable>\n {{ message }}\n <template #actions>\n <PlBtnPrimary icon=\"arrow-right\" @click.stop=\"() => openAxesSettings()\">Open Axes settings</PlBtnPrimary>\n <PlSpacer />\n </template>\n </PlNotificationAlert>\n </div>\n</template>\n<style module>\n.alert {\n position: fixed;\n bottom: 12px;\n right: 12px;\n width: 256px;\n height: auto;\n z-index: 1;\n}\n</style>\n"],"mappings":";;;;;;;;EAOA,IAAM,IAAQ,GAER,IAAQ,GAAU,EAClB,IAAc,EAAI,GAAK,EAEvB,IAAU,QAAe;GAC7B,IAAM,IAAI,EAAM,mBACV,IAAkB,EAAE;AAE1B,GADI,EAAE,UAAQ,EAAM,KAAK,yBAAyB,EAC9C,EAAE,UAAQ,EAAM,KAAK,yBAAyB;GAClD,IAAM,IAAO,EAAM,KAAK,KAAK,EACvB,IAAuB,EAAE;AAS/B,UARI,EAAE,UAAU,EAAE,iBAAiB,QAAQ,EAAE,eAAe,QAC1D,EAAW,KAAK,GAAG,EAAE,cAAc,MAAM,EAAsB,EAAE,YAAY,CAAC,SAAS,EAErF,EAAE,UAAU,EAAE,iBAAiB,QAAQ,EAAE,eAAe,QAC1D,EAAW,KAAK,GAAG,EAAE,cAAc,MAAM,EAAsB,EAAE,YAAY,CAAC,SAAS,EAIlF,GAAG,EAAK,GAFG,EAAW,SAAS,YAAY,EAAW,KAAK,KAAK,CAAC,KAAK,GAEjD;IAC5B;EAEF,SAAS,IAAmB;AAE1B,GADA,EAAM,MAAM,SAAS,aAAa,QAClC,EAAM,MAAM,SAAS,gBAAgB,KAAK,iBAAiB;;yBAI3D,EAQM,OAAA,EARA,OAAK,EAAEA,EAAAA,OAAO,MAAK,EAAA,EAAA,CACvB,EAMsB,EAAA,EAAA,EAAA;eANQ,EAAA;4CAAW,QAAA;GAAE,MAAK;GAAU,UAAA;;GAE7C,SAAO,QACyF,CAAzG,EAAyG,EAAA,EAAA,EAAA;IAA3F,MAAK;IAAe,SAAK,AAAA,EAAA,OAAA,QAAa,GAAgB,EAAA,CAAA,OAAA,CAAA;;qBAAsB,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAAlB,sBAAkB,GAAA,CAAA,CAAA,CAAA;;OAC1F,EAAY,EAAA,EAAA,CAAA,CAAA,CAAA;oBAHD,CAAA,EAAA,EAAV,EAAA,MAAO,GAAG,KACb,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"ChartTruncationWarningAlert.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../src/components/ChartTruncationWarningAlert.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { PlBtnPrimary, PlNotificationAlert, PlSpacer } from '@platforma-sdk/ui-vue';\nimport { computed, ref } from 'vue';\nimport type { ChartTruncationWarning } from '../utils/createChartSettingsForRender/composeChartSettings';\nimport { formatTruncationTotal } from '../utils/createChartSettingsForRender/composeChartSettings';\nimport { useStore } from '../store';\n\nconst props = defineProps<{ truncationWarning: ChartTruncationWarning }>();\n\nconst store = useStore();\nconst isAlertOpen = ref(true);\n\nconst message = computed(() => {\n const w = props.truncationWarning;\n\n if (w.type === 'dataOverflow') {\n return `Only ${w.dataVisible} values are shown on the chart. Use filters.`;\n }\n const intro: string[] = [];\n if (w.groups) intro.push('Some groups are hidden');\n if (w.facets) intro.push('Some facets are hidden');\n const lead = intro.join('. ');\n const countParts: string[] = [];\n if (w.groups && w.groupsVisible != null && w.groupsTotal != null) {\n countParts.push(`${w.groupsVisible} of ${formatTruncationTotal(w.groupsTotal)} groups`);\n }\n if (w.facets && w.facetsVisible != null && w.facetsTotal != null) {\n countParts.push(`${w.facetsVisible} of ${formatTruncationTotal(w.facetsTotal)} facets`);\n }\n const countText = countParts.length ? ` Showing ${countParts.join('; ')}.` : '';\n const end = 'Limits can be changed in Axes settings.';\n return `${lead}.${countText} ${end}`;\n});\n\nfunction openAxesSettings() {\n store.value.reactive.currentTab = 'axes';\n store.value.reactive.tabDefaultState.axes.scrollToBottom = true;\n}\n\nfunction openDataMapping() {\n store.value.reactive.currentTab = 'dataMapping';\n}\n</script>\n<template>\n <div :class=\"$style.alert\">\n <PlNotificationAlert v-model=\"isAlertOpen\" type=\"warning\" closable>\n {{ message }}\n <template #actions>\n <PlBtnPrimary v-if=\"truncationWarning.type === 'dataOverflow'\" icon=\"arrow-right\" @click.stop=\"() => openDataMapping()\">Open Data Mapping</PlBtnPrimary>\n <PlBtnPrimary v-else icon=\"arrow-right\" @click.stop=\"() => openAxesSettings()\">Open Axes settings</PlBtnPrimary>\n <PlSpacer />\n </template>\n </PlNotificationAlert>\n </div>\n</template>\n<style module>\n.alert {\n position: fixed;\n bottom: 12px;\n right: 12px;\n width: 256px;\n height: auto;\n z-index: 1;\n}\n</style>\n"],"mappings":";;;;;;;;EAOA,IAAM,IAAQ,GAER,IAAQ,GAAU,EAClB,IAAc,EAAI,GAAK,EAEvB,IAAU,QAAe;GAC7B,IAAM,IAAI,EAAM;AAEhB,OAAI,EAAE,SAAS,eACb,QAAO,QAAQ,EAAE,YAAY;GAE/B,IAAM,IAAkB,EAAE;AAE1B,GADI,EAAE,UAAQ,EAAM,KAAK,yBAAyB,EAC9C,EAAE,UAAQ,EAAM,KAAK,yBAAyB;GAClD,IAAM,IAAO,EAAM,KAAK,KAAK,EACvB,IAAuB,EAAE;AAS/B,UARI,EAAE,UAAU,EAAE,iBAAiB,QAAQ,EAAE,eAAe,QAC1D,EAAW,KAAK,GAAG,EAAE,cAAc,MAAM,EAAsB,EAAE,YAAY,CAAC,SAAS,EAErF,EAAE,UAAU,EAAE,iBAAiB,QAAQ,EAAE,eAAe,QAC1D,EAAW,KAAK,GAAG,EAAE,cAAc,MAAM,EAAsB,EAAE,YAAY,CAAC,SAAS,EAIlF,GAAG,EAAK,GAFG,EAAW,SAAS,YAAY,EAAW,KAAK,KAAK,CAAC,KAAK,GAEjD;IAC5B;EAEF,SAAS,IAAmB;AAE1B,GADA,EAAM,MAAM,SAAS,aAAa,QAClC,EAAM,MAAM,SAAS,gBAAgB,KAAK,iBAAiB;;EAG7D,SAAS,IAAkB;AACzB,KAAM,MAAM,SAAS,aAAa;;yBAIlC,EASM,OAAA,EATA,OAAK,EAAEA,EAAAA,OAAO,MAAK,EAAA,EAAA,CACvB,EAOsB,EAAA,EAAA,EAAA;eAPQ,EAAA;4CAAW,QAAA;GAAE,MAAK;GAAU,UAAA;;GAE7C,SAAO,QACwI,CAApI,EAAA,kBAAkB,SAAI,kBAAA,GAAA,EAA1C,EAAwJ,EAAA,EAAA,EAAA;;IAAzF,MAAK;IAAe,SAAK,AAAA,EAAA,OAAA,QAAa,GAAe,EAAA,CAAA,OAAA,CAAA;;qBAAqB,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAAjB,qBAAiB,GAAA,CAAA,CAAA,CAAA;;eACzI,EAAgH,EAAA,EAAA,EAAA;;IAA3F,MAAK;IAAe,SAAK,AAAA,EAAA,OAAA,QAAa,GAAgB,EAAA,CAAA,OAAA,CAAA;;qBAAsB,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAAlB,sBAAkB,GAAA,CAAA,CAAA,CAAA;;QACjG,EAAY,EAAA,EAAA,CAAA,CAAA,CAAA;oBAJD,CAAA,EAAA,EAAV,EAAA,MAAO,GAAG,KACb,EAAA,CAAA,CAAA"}
package/dist/ui.d.ts CHANGED
@@ -1,4 +1,3 @@
1
1
  export { default as GraphMaker } from './ui.vue';
2
- export { default as GraphMakerPlugin } from './GraphMakerPlugin.vue';
3
2
  export * from './types';
4
3
  //# sourceMappingURL=ui.d.ts.map
package/dist/ui.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACrE,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,UAAU,CAAC;AAEjD,cAAc,SAAS,CAAC"}
package/dist/ui.js CHANGED
@@ -1,3 +1,2 @@
1
1
  import e from "./ui2.js";
2
- import t from "./GraphMakerPlugin.js";
3
- export { e as GraphMaker, t as GraphMakerPlugin };
2
+ export { e as GraphMaker };
package/dist/ui.vue2.js CHANGED
@@ -359,7 +359,7 @@ var pe = { class: "graph-maker" }, T = { class: "graph-maker__main-pane" }, E =
359
359
  key: 0,
360
360
  errorInfo: z.value
361
361
  }, null, 8, ["errorInfo"])) : l("", !0),
362
- Z.value && (Z.value.groups || Z.value.facets) ? (p(), c(oe, {
362
+ Z.value ? (p(), c(oe, {
363
363
  key: 1,
364
364
  "truncation-warning": Z.value
365
365
  }, null, 8, ["truncation-warning"])) : l("", !0)
@@ -1 +1 @@
1
- {"version":3,"file":"ui.vue_vue_type_script_setup_true_lang.js","names":["$emit"],"sources":["../src/ui.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport './assets/ui.scss';\nimport type {\n ChartInterface,\n DataByColumns,\n ErrorInfo,\n LassoControlsState,\n Settings,\n} from '@milaboratories/miplots4';\nimport { MiPlots } from '@milaboratories/miplots4';\nimport type { ChartType, PlotDataAndSettings } from '@milaboratories/pf-plots';\nimport { DemoDataStore } from '@milaboratories/pf-plots';\nimport type { AxisSpec, PFrameDriver, PlSelectionModel, PTableKey } from '@platforma-sdk/model';\nimport { watchDebounced } from '@vueuse/core';\nimport { computed, onMounted, onUnmounted, ref, shallowRef, toRaw, useSlots, watch } from 'vue';\nimport Chart from './components/Chart.vue';\nimport PanelModal from './components/PanelModal.vue';\nimport VTabs from './components/SettingsTabs/index.vue';\nimport TransitionSlidePanel from './components/TransitionSlidePanel.vue';\nimport ChartErrorNotificationAlert from './components/ChartErrorNotificationAlert.vue';\nimport ChartTruncationWarningAlert from './components/ChartTruncationWarningAlert.vue';\nimport { isOwnGraphMakerTab, useSettingsForm } from './forms';\nimport { createReactiveState, provideStore } from './store';\nimport type { DendroNodeInfo, GraphMakerProps, GraphMakerState, GraphStatus } from './types';\nimport { composeChartSettings, saveToFile } from './utils';\nimport type { ChartTruncationWarning } from './utils/createChartSettingsForRender/composeChartSettings';\nimport { copyJSON } from './utils/copyJSON';\nimport GraphStatusScreen from './components/GraphStatusScreen.vue';\n\nconst _emit = defineEmits(['delete-this-graph', 'tooltip-btn-click']);\n\nconst graphMakerState = defineModel<GraphMakerState>({ required: true });\nconst selectionState = defineModel<PlSelectionModel>('selection');\n\nconst props = defineProps<GraphMakerProps>();\n\ndefineExpose({\n /**\n reset() will update data-mapping, axis-settings, layers-settings with the state that is in v-model at the moment.\n In other cases editing of v-model fields doesn't make any impact to graphs and interface.\n */\n reset,\n});\n\nconst dataStore = ref<DemoDataStore | null>(null);\n\nwatch(() => props.pFrame, (pframe) => {\n if (!pframe.ok || !pframe.value) {\n dataStore.value = null;\n return;\n }\n const driver = ('platforma' in window) ? window.platforma?.pFrameDriver as PFrameDriver : props.driver;\n if (!driver) {\n throw new Error('PFrame driver is missing');\n }\n dataStore.value = new DemoDataStore(\n pframe.value,\n driver,\n props.labelsModifier,\n );\n}, { immediate: true, deep: true });\n\n// fixed options can be updated outside, other settings only inside from chart settings interface, so we don't watching other settings\nconst fixedOptions = ref<typeof props.fixedOptions>(props.fixedOptions ?? []);\nwatch(() => props.fixedOptions, (value, oldValue) => {\n if (\n (value && oldValue && JSON.stringify(value) !== JSON.stringify(oldValue))\n || (value && !oldValue)\n || (oldValue && !value)\n ) {\n fixedOptions.value = value;\n }\n}, { deep: true });\nconst defaultOptions = ref<typeof props.defaultOptions>(props.defaultOptions);\nwatch(() => props.defaultOptions, (v) => {\n defaultOptions.value = v;\n}, { deep: true });\nconst state = provideStore(\n toRaw(graphMakerState.value),\n dataStore,\n props.chartType,\n defaultOptions,\n fixedOptions,\n props.dataColumnPredicate,\n props.metaColumnPredicate,\n props.readonlyInputs,\n props.defaultPalette,\n);\n\nfunction reset() {\n const nextReactiveState = createReactiveState(\n toRaw(graphMakerState.value),\n props.chartType,\n );\n Object.assign(state.value.reactive, nextReactiveState);\n Object.assign(state.value.loading, {\n initialInputGuide: true,\n initialCharts: true,\n initialDefaults: true,\n inputGuide: false,\n chartData: false,\n });\n defaultOptions.value = props.defaultOptions;\n}\n\nconst currentForm = computed(() => useSettingsForm(state.value.reactive.currentTab));\n\nconst chartRef = shallowRef<ChartInterface | null>(null);\nconst chartCalculatedDataRef = ref<Record<string, unknown> | null>(null);\nconst chartError = ref(false);\nconst chartErrorInfo = ref<ErrorInfo | null>(null);\n\nconst isRunning = computed(\n () => props.pFrame.ok && !props.pFrame.value && !props.pFrame.stable,\n);\nconst isInitialLoading = computed(\n () => state.value.loading.initialInputGuide && graphStatus.value === 'loading',\n);\n\nwatch(() => isRunning.value, (val, prevVal) => {\n if (val && !prevVal) {\n state.value.reactive.currentTab = null;\n }\n});\n\nconst graphStatus = computed<GraphStatus>((previousStatus) => {\n if (isRunning.value) {\n return 'running';\n }\n if (props.pFrame.ok && props.pFrame.stable && !props.pFrame.value) {\n return 'noPframe';\n }\n if (!props.pFrame.ok) {\n return 'noPframeWithError';\n }\n const inputGuide = state.value.inputGuide.value;\n const chartData = state.value.chartData.value;\n if (!inputGuide.consistent) {\n return 'inconsistent';\n }\n if (!inputGuide.ready) {\n return defaultOptions.value === null\n || state.value.loading.defaults\n || state.value.loading.initialInputGuide\n ? 'loading'\n : 'notReady';\n }\n if (chartData && Object.values(chartData.data.byColumns.values)[0]?.length === 0) {\n return 'empty';\n }\n if (chartError.value) {\n return chartErrorInfo.value?.type === 'unknownError' ? 'unknownError' : 'knownError';\n }\n if (\n (state.value.loading.initialCharts || (previousStatus !== 'ready' && state.value.loading.chartData) || state.value.loading.chartRendering)\n || (chartRef.value === null && (state.value.loading.inputGuide || state.value.loading.chartData))\n ) {\n return 'loading';\n }\n return 'ready';\n});\n\nfunction onTreeNodeClick(d: DendroNodeInfo) {\n state.value.reactive.dendroSelectedNodeId = d?.info[0]?.id as number;\n state.value.reactive.dendroInfoByClick = d;\n}\n\nconst tooltipHintHideTimerRef = ref<ReturnType<typeof setTimeout> | null>(null);\n\nfunction onTooltipHintSwitch(v: boolean) {\n const reactive = state.value.reactive;\n if (v) {\n if (reactive.tooltipHintWasShown) return;\n if (tooltipHintHideTimerRef.value) {\n clearTimeout(tooltipHintHideTimerRef.value);\n tooltipHintHideTimerRef.value = null;\n }\n reactive.showTooltipHint = true;\n tooltipHintHideTimerRef.value = setTimeout(() => {\n reactive.showTooltipHint = false;\n reactive.tooltipHintWasShown = true;\n tooltipHintHideTimerRef.value = null;\n }, 3000);\n } else {\n reactive.showTooltipHint = false;\n }\n}\n\nfunction onLassoPolygonUpdate(dotIndexes: number[], polygons: { points: [number, number][]; closed: boolean }[]) {\n graphMakerState.value = {\n ...graphMakerState.value,\n selectedPolygons: polygons,\n };\n\n const axesData = state.value.chartData.value?.data?.axesData;\n if (dotIndexes.length === 0 || !axesData) {\n selectionState.value = { axesSpec: [], selectedKeys: [] };\n return;\n }\n\n const axisKeys = Object.keys(axesData);\n const inputGuide = state.value.inputGuide.value;\n selectionState.value = {\n axesSpec: axisKeys.map((axisKey) => inputGuide.getSourceInfo(axisKey).spec as AxisSpec),\n selectedKeys: dotIndexes.map((idx) => axisKeys.map((axisKey) => axesData[axisKey][idx]) as PTableKey),\n };\n}\n\nfunction onLassoStateChange(v: LassoControlsState) {\n state.value.reactive.lassoControlsState = v;\n}\nlet chartRenderingInProgress: ReturnType<typeof setTimeout> | null = null;\nfunction onLoadingStateChange(v: boolean) {\n if (v) {\n chartRenderingInProgress = setTimeout(() => {\n state.value.loading.chartRendering = true;\n }, 1000);\n } else {\n if (chartRenderingInProgress) {\n clearTimeout(chartRenderingInProgress);\n }\n state.value.loading.chartRendering = false;\n }\n}\nconst isScatterplotZoomChanged = ref(false);\nfunction onZoomChange(isZoomChanged: boolean) {\n isScatterplotZoomChanged.value = isZoomChanged;\n}\nconst graphEventHandlers: Record<ChartType, unknown> = {\n 'dendro': [onTreeNodeClick],\n 'scatterplot-umap': {\n onPolygonUpdate: onLassoPolygonUpdate,\n onTooltipHintSwitch,\n onLassoControlsStateUpdate: onLassoStateChange,\n onZoomChange,\n },\n 'discrete': [onTooltipHintSwitch],\n 'scatterplot': {\n onPolygonUpdate: onLassoPolygonUpdate,\n onTooltipHintSwitch,\n onLassoControlsStateUpdate: onLassoStateChange,\n },\n 'histogram': [onTooltipHintSwitch],\n 'heatmap': { onTooltipHintSwitch, onLoadingChange: onLoadingStateChange },\n 'bubble': [onTooltipHintSwitch],\n};\nfunction updateChart(value: { data: PlotDataAndSettings['data']['byColumns']; settings: PlotDataAndSettings['settings'] } | null) {\n // if dataByColumns exists but columns has no data - show empty chart\n if (value && Object.values(value.data.values)[0]?.length > 0) {\n // console.log('value.dataByColumns', toRaw(value.data));\n // console.log('value.settings', toRaw(value.settings));\n if (chartRef.value) {\n chartRef.value.updateSettingsAndData({ ...toRaw(value.data), id: value.data.id + (props.pFrame.ok ? props.pFrame.value : '') }, toRaw(value.settings) as Settings);\n } else {\n const htmlNode = document.getElementById('chartSvgContainer');\n if (htmlNode) {\n chartRef.value = MiPlots.newPlot(toRaw(value.data), toRaw(value.settings) as Settings, graphEventHandlers[value.settings.type as ChartType]);\n if (value.settings.type === 'scatterplot-umap') {\n // set default polygons (from props)\n chartRef.value.updateChartState('polygon', graphMakerState.value.selectedPolygons ?? []);\n }\n chartRef.value.mount(htmlNode);\n }\n }\n // calculated by chart renderer data, tree hierarchy for example\n chartCalculatedDataRef.value = chartRef.value?.calculatedData ? { ...chartRef.value.calculatedData } : null;\n chartError.value = chartRef.value?.hasError ?? false;\n chartErrorInfo.value = chartRef.value?.errorInfo ?? null;\n } else {\n chartRef.value?.unmount();\n chartRef.value = null;\n chartErrorInfo.value = null;\n }\n}\n\nwatch(() => graphStatus.value, (v) => {\n if (v === 'notReady' || v === 'noPframe' || dataStore.value === null) {\n chartRef.value?.unmount();\n chartRef.value = null;\n }\n});\n\nconst chartDataForRender = shallowRef<{ settings: Settings; data: DataByColumns } | null>(null);\nconst chartTruncationWarning = ref<ChartTruncationWarning | null>(null);\n\nfunction applyComposeResult(result: ReturnType<typeof composeChartSettings>) {\n if (!result) {\n chartDataForRender.value = null;\n chartTruncationWarning.value = null;\n return;\n }\n chartDataForRender.value = { settings: result.settings, data: result.data };\n chartTruncationWarning.value = result.truncationWarning;\n}\n\nwatch([\n () => state.value.chartData.value,\n], ([chartData]) => {\n applyComposeResult(composeChartSettings(\n toRaw(chartData),\n toRaw(state.value.inputGuide.value),\n toRaw(state.value.uniqueValuesData.value),\n toRaw(state.value.filterLabelsInfo.value),\n toRaw(state.value.reactive),\n toRaw(state.value.defaultPalette),\n toRaw(state.value.facetValuesData.value),\n ));\n});\nwatch([\n () => state.value.reactive.template,\n () => state.value.reactive.layersSettings,\n () => state.value.reactive.axesSettings,\n () => state.value.reactive.statisticsSettings,\n () => state.value.reactive.dataBindAes,\n () => state.value.reactive.chartScale,\n], () => {\n applyComposeResult(composeChartSettings(\n toRaw(state.value.chartData.value),\n toRaw(state.value.inputGuide.value),\n toRaw(state.value.uniqueValuesData.value),\n toRaw(state.value.filterLabelsInfo.value),\n toRaw(state.value.reactive),\n toRaw(state.value.defaultPalette),\n toRaw(state.value.facetValuesData.value),\n ));\n}, { deep: true });\n\nwatch(() => chartDataForRender.value, (chartData) => {\n updateChart(chartData);\n});\nonMounted(() => {\n updateChart(null);\n});\nonUnmounted(() => {\n if (tooltipHintHideTimerRef.value) {\n clearTimeout(tooltipHintHideTimerRef.value);\n tooltipHintHideTimerRef.value = null;\n }\n chartRef.value?.unmount();\n});\n\nwatchDebounced(() => state.value.reactive.optionsState, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n optionsState: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\nwatchDebounced(() => state.value.reactive.usedDefaultOptions, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n usedDefaultOptions: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\nwatchDebounced(() => state.value.reactive.statisticsSettings, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n statisticsSettings: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\nwatchDebounced(() => state.value.reactive.axesSettings, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n axesSettings: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\nwatchDebounced(() => state.value.reactive.layersSettings, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n layersSettings: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\nwatchDebounced(() => state.value.reactive.dataBindAes, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n dataBindAes: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\n\nwatchDebounced([\n () => state.value.reactive.chartScale,\n () => state.value.reactive.template,\n () => state.value.reactive.currentTab,\n], ([zoomState, template, currentTab]) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n zoomState,\n template,\n currentTab,\n };\n}, { debounce: 1000 });\n\nwatch(() => state.value.reactive.tooltipHintWasShown, (v) => {\n if (v) {\n graphMakerState.value = { ...graphMakerState.value, tooltipHintWasShown: true };\n }\n});\n\nwatch(() => graphMakerState.value.currentTab, (v) => {\n state.value.reactive.currentTab = v === undefined ? 'dataMapping' : v;\n});\n\nwatch(() => graphMakerState.value?.layersSettings?.dendro?.showTable, (v) => {\n state.value.reactive.layersSettings.dendro.showTable = v ?? false;\n});\n\nfunction onExport() {\n saveToFile(\n new Blob([\n chartRef.value?.export() ?? '',\n ]),\n 'chart.svg',\n );\n}\n\nfunction updateGraphTitle(nextTitle: string) {\n graphMakerState.value = {\n ...graphMakerState.value,\n title: nextTitle,\n };\n}\n\nfunction selectTreeNode(id: number | null) {\n state.value.reactive.dendroSelectedNodeId = id;\n chartRef.value?.updateChartState('selectedNode', id);\n}\n\nconst slots = useSlots();\n\nconst hasAnnotationsSlot = computed(() => Boolean(slots.annotationsSlot));\nconst hasSettingsSlot = computed(() => Boolean(slots.settingsSlot));\nconst hasLogSlot = computed(() => Boolean(slots.logSlot));\n\n</script>\n\n<template>\n <div class=\"graph-maker\">\n <div class=\"graph-maker__main-pane\">\n <Chart\n :graph-status=\"graphStatus\" :graphTitle=\"graphMakerState.title\" :chartData=\"chartCalculatedDataRef\"\n :chart-ref=\"chartRef\" :error-info=\"chartErrorInfo\" :dendroTooltipButton=\"tooltipButton\"\n :custom-status-text=\"statusText\"\n :allow-title-editing=\"allowTitleEditing\"\n :isScatterplotZoomChanged=\"isScatterplotZoomChanged\"\n @graph-title-update=\"updateGraphTitle\" @dendro-node-select=\"selectTreeNode\"\n @dendro-tooltip-btn-click=\"(id: string) => $emit('tooltip-btn-click', id)\"\n >\n <slot name=\"titleLineSlot\" />\n </Chart>\n <GraphStatusScreen v-if=\"isInitialLoading || isRunning\" :graphStatus=\"isRunning ? 'running' : 'loading'\" :top=\"67\" :left=\"12\" :right=\"12\" :bottom=\"12\" :customStatusText=\"statusText\" />\n <TransitionSlidePanel id=\"graph-settings-modal\">\n <PanelModal\n v-if=\"state.reactive.currentTab && !((isInitialLoading || isRunning) && isOwnGraphMakerTab(state.reactive.currentTab))\"\n @close=\"state.reactive.currentTab = null\"\n >\n <component :is=\"currentForm.value\">\n <slot v-if=\"state.reactive.currentTab === 'annotations'\" name=\"annotationsSlot\" />\n <slot v-if=\"state.reactive.currentTab === 'settings'\" name=\"settingsSlot\" />\n <slot v-if=\"state.reactive.currentTab === 'log'\" name=\"logSlot\" />\n </component>\n </PanelModal>\n </TransitionSlidePanel>\n </div>\n <VTabs\n v-model=\"state.reactive.currentTab\" :chart-type=\"state.reactive.chartType\" :graph-status=\"graphStatus\"\n :allowDeleting=\"allowChartDeleting\" :hasAnnotationsSlot=\"hasAnnotationsSlot\" :hasSettingsSlot=\"hasSettingsSlot\"\n :hasLogSlot=\"hasLogSlot\" :initialLoading=\"isInitialLoading || isRunning\" @export=\"onExport\"\n @delete=\"$emit('delete-this-graph')\"\n />\n <ChartErrorNotificationAlert v-if=\"chartErrorInfo?.type === 'unknownError'\" :errorInfo=\"chartErrorInfo\" />\n <ChartTruncationWarningAlert\n v-if=\"chartTruncationWarning && (chartTruncationWarning.groups || chartTruncationWarning.facets)\"\n :truncation-warning=\"chartTruncationWarning\"\n />\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"ui.vue_vue_type_script_setup_true_lang.js","names":["$emit"],"sources":["../src/ui.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport './assets/ui.scss';\nimport type {\n ChartInterface,\n DataByColumns,\n ErrorInfo,\n LassoControlsState,\n Settings,\n} from '@milaboratories/miplots4';\nimport { MiPlots } from '@milaboratories/miplots4';\nimport type { ChartType, PlotDataAndSettings } from '@milaboratories/pf-plots';\nimport { DemoDataStore } from '@milaboratories/pf-plots';\nimport type { AxisSpec, PFrameDriver, PlSelectionModel, PTableKey } from '@platforma-sdk/model';\nimport { watchDebounced } from '@vueuse/core';\nimport { computed, onMounted, onUnmounted, ref, shallowRef, toRaw, useSlots, watch } from 'vue';\nimport Chart from './components/Chart.vue';\nimport PanelModal from './components/PanelModal.vue';\nimport VTabs from './components/SettingsTabs/index.vue';\nimport TransitionSlidePanel from './components/TransitionSlidePanel.vue';\nimport ChartErrorNotificationAlert from './components/ChartErrorNotificationAlert.vue';\nimport ChartTruncationWarningAlert from './components/ChartTruncationWarningAlert.vue';\nimport { isOwnGraphMakerTab, useSettingsForm } from './forms';\nimport { createReactiveState, provideStore } from './store';\nimport type { DendroNodeInfo, GraphMakerProps, GraphMakerState, GraphStatus } from './types';\nimport { composeChartSettings, saveToFile } from './utils';\nimport type { ChartTruncationWarning } from './utils/createChartSettingsForRender/composeChartSettings';\nimport { copyJSON } from './utils/copyJSON';\nimport GraphStatusScreen from './components/GraphStatusScreen.vue';\n\nconst _emit = defineEmits(['delete-this-graph', 'tooltip-btn-click']);\n\nconst graphMakerState = defineModel<GraphMakerState>({ required: true });\nconst selectionState = defineModel<PlSelectionModel>('selection');\n\nconst props = defineProps<GraphMakerProps>();\n\ndefineExpose({\n /**\n reset() will update data-mapping, axis-settings, layers-settings with the state that is in v-model at the moment.\n In other cases editing of v-model fields doesn't make any impact to graphs and interface.\n */\n reset,\n});\n\nconst dataStore = ref<DemoDataStore | null>(null);\n\nwatch(() => props.pFrame, (pframe) => {\n if (!pframe.ok || !pframe.value) {\n dataStore.value = null;\n return;\n }\n const driver = ('platforma' in window) ? window.platforma?.pFrameDriver as PFrameDriver : props.driver;\n if (!driver) {\n throw new Error('PFrame driver is missing');\n }\n dataStore.value = new DemoDataStore(\n pframe.value,\n driver,\n props.labelsModifier,\n );\n}, { immediate: true, deep: true });\n\n// fixed options can be updated outside, other settings only inside from chart settings interface, so we don't watching other settings\nconst fixedOptions = ref<typeof props.fixedOptions>(props.fixedOptions ?? []);\nwatch(() => props.fixedOptions, (value, oldValue) => {\n if (\n (value && oldValue && JSON.stringify(value) !== JSON.stringify(oldValue))\n || (value && !oldValue)\n || (oldValue && !value)\n ) {\n fixedOptions.value = value;\n }\n}, { deep: true });\nconst defaultOptions = ref<typeof props.defaultOptions>(props.defaultOptions);\nwatch(() => props.defaultOptions, (v) => {\n defaultOptions.value = v;\n}, { deep: true });\nconst state = provideStore(\n toRaw(graphMakerState.value),\n dataStore,\n props.chartType,\n defaultOptions,\n fixedOptions,\n props.dataColumnPredicate,\n props.metaColumnPredicate,\n props.readonlyInputs,\n props.defaultPalette,\n);\n\nfunction reset() {\n const nextReactiveState = createReactiveState(\n toRaw(graphMakerState.value),\n props.chartType,\n );\n Object.assign(state.value.reactive, nextReactiveState);\n Object.assign(state.value.loading, {\n initialInputGuide: true,\n initialCharts: true,\n initialDefaults: true,\n inputGuide: false,\n chartData: false,\n });\n defaultOptions.value = props.defaultOptions;\n}\n\nconst currentForm = computed(() => useSettingsForm(state.value.reactive.currentTab));\n\nconst chartRef = shallowRef<ChartInterface | null>(null);\nconst chartCalculatedDataRef = ref<Record<string, unknown> | null>(null);\nconst chartError = ref(false);\nconst chartErrorInfo = ref<ErrorInfo | null>(null);\n\nconst isRunning = computed(\n () => props.pFrame.ok && !props.pFrame.value && !props.pFrame.stable,\n);\nconst isInitialLoading = computed(\n () => state.value.loading.initialInputGuide && graphStatus.value === 'loading',\n);\n\nwatch(() => isRunning.value, (val, prevVal) => {\n if (val && !prevVal) {\n state.value.reactive.currentTab = null;\n }\n});\n\nconst graphStatus = computed<GraphStatus>((previousStatus) => {\n if (isRunning.value) {\n return 'running';\n }\n if (props.pFrame.ok && props.pFrame.stable && !props.pFrame.value) {\n return 'noPframe';\n }\n if (!props.pFrame.ok) {\n return 'noPframeWithError';\n }\n const inputGuide = state.value.inputGuide.value;\n const chartData = state.value.chartData.value;\n if (!inputGuide.consistent) {\n return 'inconsistent';\n }\n if (!inputGuide.ready) {\n return defaultOptions.value === null\n || state.value.loading.defaults\n || state.value.loading.initialInputGuide\n ? 'loading'\n : 'notReady';\n }\n if (chartData && Object.values(chartData.data.byColumns.values)[0]?.length === 0) {\n return 'empty';\n }\n if (chartError.value) {\n return chartErrorInfo.value?.type === 'unknownError' ? 'unknownError' : 'knownError';\n }\n if (\n (state.value.loading.initialCharts || (previousStatus !== 'ready' && state.value.loading.chartData) || state.value.loading.chartRendering)\n || (chartRef.value === null && (state.value.loading.inputGuide || state.value.loading.chartData))\n ) {\n return 'loading';\n }\n return 'ready';\n});\n\nfunction onTreeNodeClick(d: DendroNodeInfo) {\n state.value.reactive.dendroSelectedNodeId = d?.info[0]?.id as number;\n state.value.reactive.dendroInfoByClick = d;\n}\n\nconst tooltipHintHideTimerRef = ref<ReturnType<typeof setTimeout> | null>(null);\n\nfunction onTooltipHintSwitch(v: boolean) {\n const reactive = state.value.reactive;\n if (v) {\n if (reactive.tooltipHintWasShown) return;\n if (tooltipHintHideTimerRef.value) {\n clearTimeout(tooltipHintHideTimerRef.value);\n tooltipHintHideTimerRef.value = null;\n }\n reactive.showTooltipHint = true;\n tooltipHintHideTimerRef.value = setTimeout(() => {\n reactive.showTooltipHint = false;\n reactive.tooltipHintWasShown = true;\n tooltipHintHideTimerRef.value = null;\n }, 3000);\n } else {\n reactive.showTooltipHint = false;\n }\n}\n\nfunction onLassoPolygonUpdate(dotIndexes: number[], polygons: { points: [number, number][]; closed: boolean }[]) {\n graphMakerState.value = {\n ...graphMakerState.value,\n selectedPolygons: polygons,\n };\n\n const axesData = state.value.chartData.value?.data?.axesData;\n if (dotIndexes.length === 0 || !axesData) {\n selectionState.value = { axesSpec: [], selectedKeys: [] };\n return;\n }\n\n const axisKeys = Object.keys(axesData);\n const inputGuide = state.value.inputGuide.value;\n selectionState.value = {\n axesSpec: axisKeys.map((axisKey) => inputGuide.getSourceInfo(axisKey).spec as AxisSpec),\n selectedKeys: dotIndexes.map((idx) => axisKeys.map((axisKey) => axesData[axisKey][idx]) as PTableKey),\n };\n}\n\nfunction onLassoStateChange(v: LassoControlsState) {\n state.value.reactive.lassoControlsState = v;\n}\nlet chartRenderingInProgress: ReturnType<typeof setTimeout> | null = null;\nfunction onLoadingStateChange(v: boolean) {\n if (v) {\n chartRenderingInProgress = setTimeout(() => {\n state.value.loading.chartRendering = true;\n }, 1000);\n } else {\n if (chartRenderingInProgress) {\n clearTimeout(chartRenderingInProgress);\n }\n state.value.loading.chartRendering = false;\n }\n}\nconst isScatterplotZoomChanged = ref(false);\nfunction onZoomChange(isZoomChanged: boolean) {\n isScatterplotZoomChanged.value = isZoomChanged;\n}\nconst graphEventHandlers: Record<ChartType, unknown> = {\n 'dendro': [onTreeNodeClick],\n 'scatterplot-umap': {\n onPolygonUpdate: onLassoPolygonUpdate,\n onTooltipHintSwitch,\n onLassoControlsStateUpdate: onLassoStateChange,\n onZoomChange,\n },\n 'discrete': [onTooltipHintSwitch],\n 'scatterplot': {\n onPolygonUpdate: onLassoPolygonUpdate,\n onTooltipHintSwitch,\n onLassoControlsStateUpdate: onLassoStateChange,\n },\n 'histogram': [onTooltipHintSwitch],\n 'heatmap': { onTooltipHintSwitch, onLoadingChange: onLoadingStateChange },\n 'bubble': [onTooltipHintSwitch],\n};\nfunction updateChart(value: { data: PlotDataAndSettings['data']['byColumns']; settings: PlotDataAndSettings['settings'] } | null) {\n // if dataByColumns exists but columns has no data - show empty chart\n if (value && Object.values(value.data.values)[0]?.length > 0) {\n // console.log('value.dataByColumns', toRaw(value.data));\n // console.log('value.settings', toRaw(value.settings));\n if (chartRef.value) {\n chartRef.value.updateSettingsAndData({ ...toRaw(value.data), id: value.data.id + (props.pFrame.ok ? props.pFrame.value : '') }, toRaw(value.settings) as Settings);\n } else {\n const htmlNode = document.getElementById('chartSvgContainer');\n if (htmlNode) {\n chartRef.value = MiPlots.newPlot(toRaw(value.data), toRaw(value.settings) as Settings, graphEventHandlers[value.settings.type as ChartType]);\n if (value.settings.type === 'scatterplot-umap') {\n // set default polygons (from props)\n chartRef.value.updateChartState('polygon', graphMakerState.value.selectedPolygons ?? []);\n }\n chartRef.value.mount(htmlNode);\n }\n }\n // calculated by chart renderer data, tree hierarchy for example\n chartCalculatedDataRef.value = chartRef.value?.calculatedData ? { ...chartRef.value.calculatedData } : null;\n chartError.value = chartRef.value?.hasError ?? false;\n chartErrorInfo.value = chartRef.value?.errorInfo ?? null;\n } else {\n chartRef.value?.unmount();\n chartRef.value = null;\n chartErrorInfo.value = null;\n }\n}\n\nwatch(() => graphStatus.value, (v) => {\n if (v === 'notReady' || v === 'noPframe' || dataStore.value === null) {\n chartRef.value?.unmount();\n chartRef.value = null;\n }\n});\n\nconst chartDataForRender = shallowRef<{ settings: Settings; data: DataByColumns } | null>(null);\nconst chartTruncationWarning = ref<ChartTruncationWarning | null>(null);\n\nfunction applyComposeResult(result: ReturnType<typeof composeChartSettings>) {\n if (!result) {\n chartDataForRender.value = null;\n chartTruncationWarning.value = null;\n return;\n }\n chartDataForRender.value = { settings: result.settings, data: result.data };\n chartTruncationWarning.value = result.truncationWarning;\n}\n\nwatch([\n () => state.value.chartData.value,\n], ([chartData]) => {\n applyComposeResult(composeChartSettings(\n toRaw(chartData),\n toRaw(state.value.inputGuide.value),\n toRaw(state.value.uniqueValuesData.value),\n toRaw(state.value.filterLabelsInfo.value),\n toRaw(state.value.reactive),\n toRaw(state.value.defaultPalette),\n toRaw(state.value.facetValuesData.value),\n ));\n});\nwatch([\n () => state.value.reactive.template,\n () => state.value.reactive.layersSettings,\n () => state.value.reactive.axesSettings,\n () => state.value.reactive.statisticsSettings,\n () => state.value.reactive.dataBindAes,\n () => state.value.reactive.chartScale,\n], () => {\n applyComposeResult(composeChartSettings(\n toRaw(state.value.chartData.value),\n toRaw(state.value.inputGuide.value),\n toRaw(state.value.uniqueValuesData.value),\n toRaw(state.value.filterLabelsInfo.value),\n toRaw(state.value.reactive),\n toRaw(state.value.defaultPalette),\n toRaw(state.value.facetValuesData.value),\n ));\n}, { deep: true });\n\nwatch(() => chartDataForRender.value, (chartData) => {\n updateChart(chartData);\n});\nonMounted(() => {\n updateChart(null);\n});\nonUnmounted(() => {\n if (tooltipHintHideTimerRef.value) {\n clearTimeout(tooltipHintHideTimerRef.value);\n tooltipHintHideTimerRef.value = null;\n }\n chartRef.value?.unmount();\n});\n\nwatchDebounced(() => state.value.reactive.optionsState, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n optionsState: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\nwatchDebounced(() => state.value.reactive.usedDefaultOptions, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n usedDefaultOptions: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\nwatchDebounced(() => state.value.reactive.statisticsSettings, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n statisticsSettings: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\nwatchDebounced(() => state.value.reactive.axesSettings, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n axesSettings: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\nwatchDebounced(() => state.value.reactive.layersSettings, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n layersSettings: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\nwatchDebounced(() => state.value.reactive.dataBindAes, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n dataBindAes: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\n\nwatchDebounced([\n () => state.value.reactive.chartScale,\n () => state.value.reactive.template,\n () => state.value.reactive.currentTab,\n], ([zoomState, template, currentTab]) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n zoomState,\n template,\n currentTab,\n };\n}, { debounce: 1000 });\n\nwatch(() => state.value.reactive.tooltipHintWasShown, (v) => {\n if (v) {\n graphMakerState.value = { ...graphMakerState.value, tooltipHintWasShown: true };\n }\n});\n\nwatch(() => graphMakerState.value.currentTab, (v) => {\n state.value.reactive.currentTab = v === undefined ? 'dataMapping' : v;\n});\n\nwatch(() => graphMakerState.value?.layersSettings?.dendro?.showTable, (v) => {\n state.value.reactive.layersSettings.dendro.showTable = v ?? false;\n});\n\nfunction onExport() {\n saveToFile(\n new Blob([\n chartRef.value?.export() ?? '',\n ]),\n 'chart.svg',\n );\n}\n\nfunction updateGraphTitle(nextTitle: string) {\n graphMakerState.value = {\n ...graphMakerState.value,\n title: nextTitle,\n };\n}\n\nfunction selectTreeNode(id: number | null) {\n state.value.reactive.dendroSelectedNodeId = id;\n chartRef.value?.updateChartState('selectedNode', id);\n}\n\nconst slots = useSlots();\n\nconst hasAnnotationsSlot = computed(() => Boolean(slots.annotationsSlot));\nconst hasSettingsSlot = computed(() => Boolean(slots.settingsSlot));\nconst hasLogSlot = computed(() => Boolean(slots.logSlot));\n\n</script>\n\n<template>\n <div class=\"graph-maker\">\n <div class=\"graph-maker__main-pane\">\n <Chart\n :graph-status=\"graphStatus\" :graphTitle=\"graphMakerState.title\" :chartData=\"chartCalculatedDataRef\"\n :chart-ref=\"chartRef\" :error-info=\"chartErrorInfo\" :dendroTooltipButton=\"tooltipButton\"\n :custom-status-text=\"statusText\"\n :allow-title-editing=\"allowTitleEditing\"\n :isScatterplotZoomChanged=\"isScatterplotZoomChanged\"\n @graph-title-update=\"updateGraphTitle\" @dendro-node-select=\"selectTreeNode\"\n @dendro-tooltip-btn-click=\"(id: string) => $emit('tooltip-btn-click', id)\"\n >\n <slot name=\"titleLineSlot\" />\n </Chart>\n <GraphStatusScreen v-if=\"isInitialLoading || isRunning\" :graphStatus=\"isRunning ? 'running' : 'loading'\" :top=\"67\" :left=\"12\" :right=\"12\" :bottom=\"12\" :customStatusText=\"statusText\" />\n <TransitionSlidePanel id=\"graph-settings-modal\">\n <PanelModal\n v-if=\"state.reactive.currentTab && !((isInitialLoading || isRunning) && isOwnGraphMakerTab(state.reactive.currentTab))\"\n @close=\"state.reactive.currentTab = null\"\n >\n <component :is=\"currentForm.value\">\n <slot v-if=\"state.reactive.currentTab === 'annotations'\" name=\"annotationsSlot\" />\n <slot v-if=\"state.reactive.currentTab === 'settings'\" name=\"settingsSlot\" />\n <slot v-if=\"state.reactive.currentTab === 'log'\" name=\"logSlot\" />\n </component>\n </PanelModal>\n </TransitionSlidePanel>\n </div>\n <VTabs\n v-model=\"state.reactive.currentTab\" :chart-type=\"state.reactive.chartType\" :graph-status=\"graphStatus\"\n :allowDeleting=\"allowChartDeleting\" :hasAnnotationsSlot=\"hasAnnotationsSlot\" :hasSettingsSlot=\"hasSettingsSlot\"\n :hasLogSlot=\"hasLogSlot\" :initialLoading=\"isInitialLoading || isRunning\" @export=\"onExport\"\n @delete=\"$emit('delete-this-graph')\"\n />\n <ChartErrorNotificationAlert v-if=\"chartErrorInfo?.type === 'unknownError'\" :errorInfo=\"chartErrorInfo\" />\n <ChartTruncationWarningAlert\n v-if=\"chartTruncationWarning\"\n :truncation-warning=\"chartTruncationWarning\"\n />\n </div>\n</template>\n"],"mappings":"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"}
package/dist/ui2.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ui2.js","names":[],"sources":["../src/ui.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport './assets/ui.scss';\nimport type {\n ChartInterface,\n DataByColumns,\n ErrorInfo,\n LassoControlsState,\n Settings,\n} from '@milaboratories/miplots4';\nimport { MiPlots } from '@milaboratories/miplots4';\nimport type { ChartType, PlotDataAndSettings } from '@milaboratories/pf-plots';\nimport { DemoDataStore } from '@milaboratories/pf-plots';\nimport type { AxisSpec, PFrameDriver, PlSelectionModel, PTableKey } from '@platforma-sdk/model';\nimport { watchDebounced } from '@vueuse/core';\nimport { computed, onMounted, onUnmounted, ref, shallowRef, toRaw, useSlots, watch } from 'vue';\nimport Chart from './components/Chart.vue';\nimport PanelModal from './components/PanelModal.vue';\nimport VTabs from './components/SettingsTabs/index.vue';\nimport TransitionSlidePanel from './components/TransitionSlidePanel.vue';\nimport ChartErrorNotificationAlert from './components/ChartErrorNotificationAlert.vue';\nimport ChartTruncationWarningAlert from './components/ChartTruncationWarningAlert.vue';\nimport { isOwnGraphMakerTab, useSettingsForm } from './forms';\nimport { createReactiveState, provideStore } from './store';\nimport type { DendroNodeInfo, GraphMakerProps, GraphMakerState, GraphStatus } from './types';\nimport { composeChartSettings, saveToFile } from './utils';\nimport type { ChartTruncationWarning } from './utils/createChartSettingsForRender/composeChartSettings';\nimport { copyJSON } from './utils/copyJSON';\nimport GraphStatusScreen from './components/GraphStatusScreen.vue';\n\nconst _emit = defineEmits(['delete-this-graph', 'tooltip-btn-click']);\n\nconst graphMakerState = defineModel<GraphMakerState>({ required: true });\nconst selectionState = defineModel<PlSelectionModel>('selection');\n\nconst props = defineProps<GraphMakerProps>();\n\ndefineExpose({\n /**\n reset() will update data-mapping, axis-settings, layers-settings with the state that is in v-model at the moment.\n In other cases editing of v-model fields doesn't make any impact to graphs and interface.\n */\n reset,\n});\n\nconst dataStore = ref<DemoDataStore | null>(null);\n\nwatch(() => props.pFrame, (pframe) => {\n if (!pframe.ok || !pframe.value) {\n dataStore.value = null;\n return;\n }\n const driver = ('platforma' in window) ? window.platforma?.pFrameDriver as PFrameDriver : props.driver;\n if (!driver) {\n throw new Error('PFrame driver is missing');\n }\n dataStore.value = new DemoDataStore(\n pframe.value,\n driver,\n props.labelsModifier,\n );\n}, { immediate: true, deep: true });\n\n// fixed options can be updated outside, other settings only inside from chart settings interface, so we don't watching other settings\nconst fixedOptions = ref<typeof props.fixedOptions>(props.fixedOptions ?? []);\nwatch(() => props.fixedOptions, (value, oldValue) => {\n if (\n (value && oldValue && JSON.stringify(value) !== JSON.stringify(oldValue))\n || (value && !oldValue)\n || (oldValue && !value)\n ) {\n fixedOptions.value = value;\n }\n}, { deep: true });\nconst defaultOptions = ref<typeof props.defaultOptions>(props.defaultOptions);\nwatch(() => props.defaultOptions, (v) => {\n defaultOptions.value = v;\n}, { deep: true });\nconst state = provideStore(\n toRaw(graphMakerState.value),\n dataStore,\n props.chartType,\n defaultOptions,\n fixedOptions,\n props.dataColumnPredicate,\n props.metaColumnPredicate,\n props.readonlyInputs,\n props.defaultPalette,\n);\n\nfunction reset() {\n const nextReactiveState = createReactiveState(\n toRaw(graphMakerState.value),\n props.chartType,\n );\n Object.assign(state.value.reactive, nextReactiveState);\n Object.assign(state.value.loading, {\n initialInputGuide: true,\n initialCharts: true,\n initialDefaults: true,\n inputGuide: false,\n chartData: false,\n });\n defaultOptions.value = props.defaultOptions;\n}\n\nconst currentForm = computed(() => useSettingsForm(state.value.reactive.currentTab));\n\nconst chartRef = shallowRef<ChartInterface | null>(null);\nconst chartCalculatedDataRef = ref<Record<string, unknown> | null>(null);\nconst chartError = ref(false);\nconst chartErrorInfo = ref<ErrorInfo | null>(null);\n\nconst isRunning = computed(\n () => props.pFrame.ok && !props.pFrame.value && !props.pFrame.stable,\n);\nconst isInitialLoading = computed(\n () => state.value.loading.initialInputGuide && graphStatus.value === 'loading',\n);\n\nwatch(() => isRunning.value, (val, prevVal) => {\n if (val && !prevVal) {\n state.value.reactive.currentTab = null;\n }\n});\n\nconst graphStatus = computed<GraphStatus>((previousStatus) => {\n if (isRunning.value) {\n return 'running';\n }\n if (props.pFrame.ok && props.pFrame.stable && !props.pFrame.value) {\n return 'noPframe';\n }\n if (!props.pFrame.ok) {\n return 'noPframeWithError';\n }\n const inputGuide = state.value.inputGuide.value;\n const chartData = state.value.chartData.value;\n if (!inputGuide.consistent) {\n return 'inconsistent';\n }\n if (!inputGuide.ready) {\n return defaultOptions.value === null\n || state.value.loading.defaults\n || state.value.loading.initialInputGuide\n ? 'loading'\n : 'notReady';\n }\n if (chartData && Object.values(chartData.data.byColumns.values)[0]?.length === 0) {\n return 'empty';\n }\n if (chartError.value) {\n return chartErrorInfo.value?.type === 'unknownError' ? 'unknownError' : 'knownError';\n }\n if (\n (state.value.loading.initialCharts || (previousStatus !== 'ready' && state.value.loading.chartData) || state.value.loading.chartRendering)\n || (chartRef.value === null && (state.value.loading.inputGuide || state.value.loading.chartData))\n ) {\n return 'loading';\n }\n return 'ready';\n});\n\nfunction onTreeNodeClick(d: DendroNodeInfo) {\n state.value.reactive.dendroSelectedNodeId = d?.info[0]?.id as number;\n state.value.reactive.dendroInfoByClick = d;\n}\n\nconst tooltipHintHideTimerRef = ref<ReturnType<typeof setTimeout> | null>(null);\n\nfunction onTooltipHintSwitch(v: boolean) {\n const reactive = state.value.reactive;\n if (v) {\n if (reactive.tooltipHintWasShown) return;\n if (tooltipHintHideTimerRef.value) {\n clearTimeout(tooltipHintHideTimerRef.value);\n tooltipHintHideTimerRef.value = null;\n }\n reactive.showTooltipHint = true;\n tooltipHintHideTimerRef.value = setTimeout(() => {\n reactive.showTooltipHint = false;\n reactive.tooltipHintWasShown = true;\n tooltipHintHideTimerRef.value = null;\n }, 3000);\n } else {\n reactive.showTooltipHint = false;\n }\n}\n\nfunction onLassoPolygonUpdate(dotIndexes: number[], polygons: { points: [number, number][]; closed: boolean }[]) {\n graphMakerState.value = {\n ...graphMakerState.value,\n selectedPolygons: polygons,\n };\n\n const axesData = state.value.chartData.value?.data?.axesData;\n if (dotIndexes.length === 0 || !axesData) {\n selectionState.value = { axesSpec: [], selectedKeys: [] };\n return;\n }\n\n const axisKeys = Object.keys(axesData);\n const inputGuide = state.value.inputGuide.value;\n selectionState.value = {\n axesSpec: axisKeys.map((axisKey) => inputGuide.getSourceInfo(axisKey).spec as AxisSpec),\n selectedKeys: dotIndexes.map((idx) => axisKeys.map((axisKey) => axesData[axisKey][idx]) as PTableKey),\n };\n}\n\nfunction onLassoStateChange(v: LassoControlsState) {\n state.value.reactive.lassoControlsState = v;\n}\nlet chartRenderingInProgress: ReturnType<typeof setTimeout> | null = null;\nfunction onLoadingStateChange(v: boolean) {\n if (v) {\n chartRenderingInProgress = setTimeout(() => {\n state.value.loading.chartRendering = true;\n }, 1000);\n } else {\n if (chartRenderingInProgress) {\n clearTimeout(chartRenderingInProgress);\n }\n state.value.loading.chartRendering = false;\n }\n}\nconst isScatterplotZoomChanged = ref(false);\nfunction onZoomChange(isZoomChanged: boolean) {\n isScatterplotZoomChanged.value = isZoomChanged;\n}\nconst graphEventHandlers: Record<ChartType, unknown> = {\n 'dendro': [onTreeNodeClick],\n 'scatterplot-umap': {\n onPolygonUpdate: onLassoPolygonUpdate,\n onTooltipHintSwitch,\n onLassoControlsStateUpdate: onLassoStateChange,\n onZoomChange,\n },\n 'discrete': [onTooltipHintSwitch],\n 'scatterplot': {\n onPolygonUpdate: onLassoPolygonUpdate,\n onTooltipHintSwitch,\n onLassoControlsStateUpdate: onLassoStateChange,\n },\n 'histogram': [onTooltipHintSwitch],\n 'heatmap': { onTooltipHintSwitch, onLoadingChange: onLoadingStateChange },\n 'bubble': [onTooltipHintSwitch],\n};\nfunction updateChart(value: { data: PlotDataAndSettings['data']['byColumns']; settings: PlotDataAndSettings['settings'] } | null) {\n // if dataByColumns exists but columns has no data - show empty chart\n if (value && Object.values(value.data.values)[0]?.length > 0) {\n // console.log('value.dataByColumns', toRaw(value.data));\n // console.log('value.settings', toRaw(value.settings));\n if (chartRef.value) {\n chartRef.value.updateSettingsAndData({ ...toRaw(value.data), id: value.data.id + (props.pFrame.ok ? props.pFrame.value : '') }, toRaw(value.settings) as Settings);\n } else {\n const htmlNode = document.getElementById('chartSvgContainer');\n if (htmlNode) {\n chartRef.value = MiPlots.newPlot(toRaw(value.data), toRaw(value.settings) as Settings, graphEventHandlers[value.settings.type as ChartType]);\n if (value.settings.type === 'scatterplot-umap') {\n // set default polygons (from props)\n chartRef.value.updateChartState('polygon', graphMakerState.value.selectedPolygons ?? []);\n }\n chartRef.value.mount(htmlNode);\n }\n }\n // calculated by chart renderer data, tree hierarchy for example\n chartCalculatedDataRef.value = chartRef.value?.calculatedData ? { ...chartRef.value.calculatedData } : null;\n chartError.value = chartRef.value?.hasError ?? false;\n chartErrorInfo.value = chartRef.value?.errorInfo ?? null;\n } else {\n chartRef.value?.unmount();\n chartRef.value = null;\n chartErrorInfo.value = null;\n }\n}\n\nwatch(() => graphStatus.value, (v) => {\n if (v === 'notReady' || v === 'noPframe' || dataStore.value === null) {\n chartRef.value?.unmount();\n chartRef.value = null;\n }\n});\n\nconst chartDataForRender = shallowRef<{ settings: Settings; data: DataByColumns } | null>(null);\nconst chartTruncationWarning = ref<ChartTruncationWarning | null>(null);\n\nfunction applyComposeResult(result: ReturnType<typeof composeChartSettings>) {\n if (!result) {\n chartDataForRender.value = null;\n chartTruncationWarning.value = null;\n return;\n }\n chartDataForRender.value = { settings: result.settings, data: result.data };\n chartTruncationWarning.value = result.truncationWarning;\n}\n\nwatch([\n () => state.value.chartData.value,\n], ([chartData]) => {\n applyComposeResult(composeChartSettings(\n toRaw(chartData),\n toRaw(state.value.inputGuide.value),\n toRaw(state.value.uniqueValuesData.value),\n toRaw(state.value.filterLabelsInfo.value),\n toRaw(state.value.reactive),\n toRaw(state.value.defaultPalette),\n toRaw(state.value.facetValuesData.value),\n ));\n});\nwatch([\n () => state.value.reactive.template,\n () => state.value.reactive.layersSettings,\n () => state.value.reactive.axesSettings,\n () => state.value.reactive.statisticsSettings,\n () => state.value.reactive.dataBindAes,\n () => state.value.reactive.chartScale,\n], () => {\n applyComposeResult(composeChartSettings(\n toRaw(state.value.chartData.value),\n toRaw(state.value.inputGuide.value),\n toRaw(state.value.uniqueValuesData.value),\n toRaw(state.value.filterLabelsInfo.value),\n toRaw(state.value.reactive),\n toRaw(state.value.defaultPalette),\n toRaw(state.value.facetValuesData.value),\n ));\n}, { deep: true });\n\nwatch(() => chartDataForRender.value, (chartData) => {\n updateChart(chartData);\n});\nonMounted(() => {\n updateChart(null);\n});\nonUnmounted(() => {\n if (tooltipHintHideTimerRef.value) {\n clearTimeout(tooltipHintHideTimerRef.value);\n tooltipHintHideTimerRef.value = null;\n }\n chartRef.value?.unmount();\n});\n\nwatchDebounced(() => state.value.reactive.optionsState, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n optionsState: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\nwatchDebounced(() => state.value.reactive.usedDefaultOptions, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n usedDefaultOptions: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\nwatchDebounced(() => state.value.reactive.statisticsSettings, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n statisticsSettings: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\nwatchDebounced(() => state.value.reactive.axesSettings, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n axesSettings: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\nwatchDebounced(() => state.value.reactive.layersSettings, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n layersSettings: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\nwatchDebounced(() => state.value.reactive.dataBindAes, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n dataBindAes: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\n\nwatchDebounced([\n () => state.value.reactive.chartScale,\n () => state.value.reactive.template,\n () => state.value.reactive.currentTab,\n], ([zoomState, template, currentTab]) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n zoomState,\n template,\n currentTab,\n };\n}, { debounce: 1000 });\n\nwatch(() => state.value.reactive.tooltipHintWasShown, (v) => {\n if (v) {\n graphMakerState.value = { ...graphMakerState.value, tooltipHintWasShown: true };\n }\n});\n\nwatch(() => graphMakerState.value.currentTab, (v) => {\n state.value.reactive.currentTab = v === undefined ? 'dataMapping' : v;\n});\n\nwatch(() => graphMakerState.value?.layersSettings?.dendro?.showTable, (v) => {\n state.value.reactive.layersSettings.dendro.showTable = v ?? false;\n});\n\nfunction onExport() {\n saveToFile(\n new Blob([\n chartRef.value?.export() ?? '',\n ]),\n 'chart.svg',\n );\n}\n\nfunction updateGraphTitle(nextTitle: string) {\n graphMakerState.value = {\n ...graphMakerState.value,\n title: nextTitle,\n };\n}\n\nfunction selectTreeNode(id: number | null) {\n state.value.reactive.dendroSelectedNodeId = id;\n chartRef.value?.updateChartState('selectedNode', id);\n}\n\nconst slots = useSlots();\n\nconst hasAnnotationsSlot = computed(() => Boolean(slots.annotationsSlot));\nconst hasSettingsSlot = computed(() => Boolean(slots.settingsSlot));\nconst hasLogSlot = computed(() => Boolean(slots.logSlot));\n\n</script>\n\n<template>\n <div class=\"graph-maker\">\n <div class=\"graph-maker__main-pane\">\n <Chart\n :graph-status=\"graphStatus\" :graphTitle=\"graphMakerState.title\" :chartData=\"chartCalculatedDataRef\"\n :chart-ref=\"chartRef\" :error-info=\"chartErrorInfo\" :dendroTooltipButton=\"tooltipButton\"\n :custom-status-text=\"statusText\"\n :allow-title-editing=\"allowTitleEditing\"\n :isScatterplotZoomChanged=\"isScatterplotZoomChanged\"\n @graph-title-update=\"updateGraphTitle\" @dendro-node-select=\"selectTreeNode\"\n @dendro-tooltip-btn-click=\"(id: string) => $emit('tooltip-btn-click', id)\"\n >\n <slot name=\"titleLineSlot\" />\n </Chart>\n <GraphStatusScreen v-if=\"isInitialLoading || isRunning\" :graphStatus=\"isRunning ? 'running' : 'loading'\" :top=\"67\" :left=\"12\" :right=\"12\" :bottom=\"12\" :customStatusText=\"statusText\" />\n <TransitionSlidePanel id=\"graph-settings-modal\">\n <PanelModal\n v-if=\"state.reactive.currentTab && !((isInitialLoading || isRunning) && isOwnGraphMakerTab(state.reactive.currentTab))\"\n @close=\"state.reactive.currentTab = null\"\n >\n <component :is=\"currentForm.value\">\n <slot v-if=\"state.reactive.currentTab === 'annotations'\" name=\"annotationsSlot\" />\n <slot v-if=\"state.reactive.currentTab === 'settings'\" name=\"settingsSlot\" />\n <slot v-if=\"state.reactive.currentTab === 'log'\" name=\"logSlot\" />\n </component>\n </PanelModal>\n </TransitionSlidePanel>\n </div>\n <VTabs\n v-model=\"state.reactive.currentTab\" :chart-type=\"state.reactive.chartType\" :graph-status=\"graphStatus\"\n :allowDeleting=\"allowChartDeleting\" :hasAnnotationsSlot=\"hasAnnotationsSlot\" :hasSettingsSlot=\"hasSettingsSlot\"\n :hasLogSlot=\"hasLogSlot\" :initialLoading=\"isInitialLoading || isRunning\" @export=\"onExport\"\n @delete=\"$emit('delete-this-graph')\"\n />\n <ChartErrorNotificationAlert v-if=\"chartErrorInfo?.type === 'unknownError'\" :errorInfo=\"chartErrorInfo\" />\n <ChartTruncationWarningAlert\n v-if=\"chartTruncationWarning && (chartTruncationWarning.groups || chartTruncationWarning.facets)\"\n :truncation-warning=\"chartTruncationWarning\"\n />\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"ui2.js","names":[],"sources":["../src/ui.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport './assets/ui.scss';\nimport type {\n ChartInterface,\n DataByColumns,\n ErrorInfo,\n LassoControlsState,\n Settings,\n} from '@milaboratories/miplots4';\nimport { MiPlots } from '@milaboratories/miplots4';\nimport type { ChartType, PlotDataAndSettings } from '@milaboratories/pf-plots';\nimport { DemoDataStore } from '@milaboratories/pf-plots';\nimport type { AxisSpec, PFrameDriver, PlSelectionModel, PTableKey } from '@platforma-sdk/model';\nimport { watchDebounced } from '@vueuse/core';\nimport { computed, onMounted, onUnmounted, ref, shallowRef, toRaw, useSlots, watch } from 'vue';\nimport Chart from './components/Chart.vue';\nimport PanelModal from './components/PanelModal.vue';\nimport VTabs from './components/SettingsTabs/index.vue';\nimport TransitionSlidePanel from './components/TransitionSlidePanel.vue';\nimport ChartErrorNotificationAlert from './components/ChartErrorNotificationAlert.vue';\nimport ChartTruncationWarningAlert from './components/ChartTruncationWarningAlert.vue';\nimport { isOwnGraphMakerTab, useSettingsForm } from './forms';\nimport { createReactiveState, provideStore } from './store';\nimport type { DendroNodeInfo, GraphMakerProps, GraphMakerState, GraphStatus } from './types';\nimport { composeChartSettings, saveToFile } from './utils';\nimport type { ChartTruncationWarning } from './utils/createChartSettingsForRender/composeChartSettings';\nimport { copyJSON } from './utils/copyJSON';\nimport GraphStatusScreen from './components/GraphStatusScreen.vue';\n\nconst _emit = defineEmits(['delete-this-graph', 'tooltip-btn-click']);\n\nconst graphMakerState = defineModel<GraphMakerState>({ required: true });\nconst selectionState = defineModel<PlSelectionModel>('selection');\n\nconst props = defineProps<GraphMakerProps>();\n\ndefineExpose({\n /**\n reset() will update data-mapping, axis-settings, layers-settings with the state that is in v-model at the moment.\n In other cases editing of v-model fields doesn't make any impact to graphs and interface.\n */\n reset,\n});\n\nconst dataStore = ref<DemoDataStore | null>(null);\n\nwatch(() => props.pFrame, (pframe) => {\n if (!pframe.ok || !pframe.value) {\n dataStore.value = null;\n return;\n }\n const driver = ('platforma' in window) ? window.platforma?.pFrameDriver as PFrameDriver : props.driver;\n if (!driver) {\n throw new Error('PFrame driver is missing');\n }\n dataStore.value = new DemoDataStore(\n pframe.value,\n driver,\n props.labelsModifier,\n );\n}, { immediate: true, deep: true });\n\n// fixed options can be updated outside, other settings only inside from chart settings interface, so we don't watching other settings\nconst fixedOptions = ref<typeof props.fixedOptions>(props.fixedOptions ?? []);\nwatch(() => props.fixedOptions, (value, oldValue) => {\n if (\n (value && oldValue && JSON.stringify(value) !== JSON.stringify(oldValue))\n || (value && !oldValue)\n || (oldValue && !value)\n ) {\n fixedOptions.value = value;\n }\n}, { deep: true });\nconst defaultOptions = ref<typeof props.defaultOptions>(props.defaultOptions);\nwatch(() => props.defaultOptions, (v) => {\n defaultOptions.value = v;\n}, { deep: true });\nconst state = provideStore(\n toRaw(graphMakerState.value),\n dataStore,\n props.chartType,\n defaultOptions,\n fixedOptions,\n props.dataColumnPredicate,\n props.metaColumnPredicate,\n props.readonlyInputs,\n props.defaultPalette,\n);\n\nfunction reset() {\n const nextReactiveState = createReactiveState(\n toRaw(graphMakerState.value),\n props.chartType,\n );\n Object.assign(state.value.reactive, nextReactiveState);\n Object.assign(state.value.loading, {\n initialInputGuide: true,\n initialCharts: true,\n initialDefaults: true,\n inputGuide: false,\n chartData: false,\n });\n defaultOptions.value = props.defaultOptions;\n}\n\nconst currentForm = computed(() => useSettingsForm(state.value.reactive.currentTab));\n\nconst chartRef = shallowRef<ChartInterface | null>(null);\nconst chartCalculatedDataRef = ref<Record<string, unknown> | null>(null);\nconst chartError = ref(false);\nconst chartErrorInfo = ref<ErrorInfo | null>(null);\n\nconst isRunning = computed(\n () => props.pFrame.ok && !props.pFrame.value && !props.pFrame.stable,\n);\nconst isInitialLoading = computed(\n () => state.value.loading.initialInputGuide && graphStatus.value === 'loading',\n);\n\nwatch(() => isRunning.value, (val, prevVal) => {\n if (val && !prevVal) {\n state.value.reactive.currentTab = null;\n }\n});\n\nconst graphStatus = computed<GraphStatus>((previousStatus) => {\n if (isRunning.value) {\n return 'running';\n }\n if (props.pFrame.ok && props.pFrame.stable && !props.pFrame.value) {\n return 'noPframe';\n }\n if (!props.pFrame.ok) {\n return 'noPframeWithError';\n }\n const inputGuide = state.value.inputGuide.value;\n const chartData = state.value.chartData.value;\n if (!inputGuide.consistent) {\n return 'inconsistent';\n }\n if (!inputGuide.ready) {\n return defaultOptions.value === null\n || state.value.loading.defaults\n || state.value.loading.initialInputGuide\n ? 'loading'\n : 'notReady';\n }\n if (chartData && Object.values(chartData.data.byColumns.values)[0]?.length === 0) {\n return 'empty';\n }\n if (chartError.value) {\n return chartErrorInfo.value?.type === 'unknownError' ? 'unknownError' : 'knownError';\n }\n if (\n (state.value.loading.initialCharts || (previousStatus !== 'ready' && state.value.loading.chartData) || state.value.loading.chartRendering)\n || (chartRef.value === null && (state.value.loading.inputGuide || state.value.loading.chartData))\n ) {\n return 'loading';\n }\n return 'ready';\n});\n\nfunction onTreeNodeClick(d: DendroNodeInfo) {\n state.value.reactive.dendroSelectedNodeId = d?.info[0]?.id as number;\n state.value.reactive.dendroInfoByClick = d;\n}\n\nconst tooltipHintHideTimerRef = ref<ReturnType<typeof setTimeout> | null>(null);\n\nfunction onTooltipHintSwitch(v: boolean) {\n const reactive = state.value.reactive;\n if (v) {\n if (reactive.tooltipHintWasShown) return;\n if (tooltipHintHideTimerRef.value) {\n clearTimeout(tooltipHintHideTimerRef.value);\n tooltipHintHideTimerRef.value = null;\n }\n reactive.showTooltipHint = true;\n tooltipHintHideTimerRef.value = setTimeout(() => {\n reactive.showTooltipHint = false;\n reactive.tooltipHintWasShown = true;\n tooltipHintHideTimerRef.value = null;\n }, 3000);\n } else {\n reactive.showTooltipHint = false;\n }\n}\n\nfunction onLassoPolygonUpdate(dotIndexes: number[], polygons: { points: [number, number][]; closed: boolean }[]) {\n graphMakerState.value = {\n ...graphMakerState.value,\n selectedPolygons: polygons,\n };\n\n const axesData = state.value.chartData.value?.data?.axesData;\n if (dotIndexes.length === 0 || !axesData) {\n selectionState.value = { axesSpec: [], selectedKeys: [] };\n return;\n }\n\n const axisKeys = Object.keys(axesData);\n const inputGuide = state.value.inputGuide.value;\n selectionState.value = {\n axesSpec: axisKeys.map((axisKey) => inputGuide.getSourceInfo(axisKey).spec as AxisSpec),\n selectedKeys: dotIndexes.map((idx) => axisKeys.map((axisKey) => axesData[axisKey][idx]) as PTableKey),\n };\n}\n\nfunction onLassoStateChange(v: LassoControlsState) {\n state.value.reactive.lassoControlsState = v;\n}\nlet chartRenderingInProgress: ReturnType<typeof setTimeout> | null = null;\nfunction onLoadingStateChange(v: boolean) {\n if (v) {\n chartRenderingInProgress = setTimeout(() => {\n state.value.loading.chartRendering = true;\n }, 1000);\n } else {\n if (chartRenderingInProgress) {\n clearTimeout(chartRenderingInProgress);\n }\n state.value.loading.chartRendering = false;\n }\n}\nconst isScatterplotZoomChanged = ref(false);\nfunction onZoomChange(isZoomChanged: boolean) {\n isScatterplotZoomChanged.value = isZoomChanged;\n}\nconst graphEventHandlers: Record<ChartType, unknown> = {\n 'dendro': [onTreeNodeClick],\n 'scatterplot-umap': {\n onPolygonUpdate: onLassoPolygonUpdate,\n onTooltipHintSwitch,\n onLassoControlsStateUpdate: onLassoStateChange,\n onZoomChange,\n },\n 'discrete': [onTooltipHintSwitch],\n 'scatterplot': {\n onPolygonUpdate: onLassoPolygonUpdate,\n onTooltipHintSwitch,\n onLassoControlsStateUpdate: onLassoStateChange,\n },\n 'histogram': [onTooltipHintSwitch],\n 'heatmap': { onTooltipHintSwitch, onLoadingChange: onLoadingStateChange },\n 'bubble': [onTooltipHintSwitch],\n};\nfunction updateChart(value: { data: PlotDataAndSettings['data']['byColumns']; settings: PlotDataAndSettings['settings'] } | null) {\n // if dataByColumns exists but columns has no data - show empty chart\n if (value && Object.values(value.data.values)[0]?.length > 0) {\n // console.log('value.dataByColumns', toRaw(value.data));\n // console.log('value.settings', toRaw(value.settings));\n if (chartRef.value) {\n chartRef.value.updateSettingsAndData({ ...toRaw(value.data), id: value.data.id + (props.pFrame.ok ? props.pFrame.value : '') }, toRaw(value.settings) as Settings);\n } else {\n const htmlNode = document.getElementById('chartSvgContainer');\n if (htmlNode) {\n chartRef.value = MiPlots.newPlot(toRaw(value.data), toRaw(value.settings) as Settings, graphEventHandlers[value.settings.type as ChartType]);\n if (value.settings.type === 'scatterplot-umap') {\n // set default polygons (from props)\n chartRef.value.updateChartState('polygon', graphMakerState.value.selectedPolygons ?? []);\n }\n chartRef.value.mount(htmlNode);\n }\n }\n // calculated by chart renderer data, tree hierarchy for example\n chartCalculatedDataRef.value = chartRef.value?.calculatedData ? { ...chartRef.value.calculatedData } : null;\n chartError.value = chartRef.value?.hasError ?? false;\n chartErrorInfo.value = chartRef.value?.errorInfo ?? null;\n } else {\n chartRef.value?.unmount();\n chartRef.value = null;\n chartErrorInfo.value = null;\n }\n}\n\nwatch(() => graphStatus.value, (v) => {\n if (v === 'notReady' || v === 'noPframe' || dataStore.value === null) {\n chartRef.value?.unmount();\n chartRef.value = null;\n }\n});\n\nconst chartDataForRender = shallowRef<{ settings: Settings; data: DataByColumns } | null>(null);\nconst chartTruncationWarning = ref<ChartTruncationWarning | null>(null);\n\nfunction applyComposeResult(result: ReturnType<typeof composeChartSettings>) {\n if (!result) {\n chartDataForRender.value = null;\n chartTruncationWarning.value = null;\n return;\n }\n chartDataForRender.value = { settings: result.settings, data: result.data };\n chartTruncationWarning.value = result.truncationWarning;\n}\n\nwatch([\n () => state.value.chartData.value,\n], ([chartData]) => {\n applyComposeResult(composeChartSettings(\n toRaw(chartData),\n toRaw(state.value.inputGuide.value),\n toRaw(state.value.uniqueValuesData.value),\n toRaw(state.value.filterLabelsInfo.value),\n toRaw(state.value.reactive),\n toRaw(state.value.defaultPalette),\n toRaw(state.value.facetValuesData.value),\n ));\n});\nwatch([\n () => state.value.reactive.template,\n () => state.value.reactive.layersSettings,\n () => state.value.reactive.axesSettings,\n () => state.value.reactive.statisticsSettings,\n () => state.value.reactive.dataBindAes,\n () => state.value.reactive.chartScale,\n], () => {\n applyComposeResult(composeChartSettings(\n toRaw(state.value.chartData.value),\n toRaw(state.value.inputGuide.value),\n toRaw(state.value.uniqueValuesData.value),\n toRaw(state.value.filterLabelsInfo.value),\n toRaw(state.value.reactive),\n toRaw(state.value.defaultPalette),\n toRaw(state.value.facetValuesData.value),\n ));\n}, { deep: true });\n\nwatch(() => chartDataForRender.value, (chartData) => {\n updateChart(chartData);\n});\nonMounted(() => {\n updateChart(null);\n});\nonUnmounted(() => {\n if (tooltipHintHideTimerRef.value) {\n clearTimeout(tooltipHintHideTimerRef.value);\n tooltipHintHideTimerRef.value = null;\n }\n chartRef.value?.unmount();\n});\n\nwatchDebounced(() => state.value.reactive.optionsState, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n optionsState: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\nwatchDebounced(() => state.value.reactive.usedDefaultOptions, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n usedDefaultOptions: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\nwatchDebounced(() => state.value.reactive.statisticsSettings, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n statisticsSettings: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\nwatchDebounced(() => state.value.reactive.axesSettings, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n axesSettings: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\nwatchDebounced(() => state.value.reactive.layersSettings, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n layersSettings: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\nwatchDebounced(() => state.value.reactive.dataBindAes, (v) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n dataBindAes: copyJSON(v),\n };\n}, { deep: true, debounce: 1000 });\n\nwatchDebounced([\n () => state.value.reactive.chartScale,\n () => state.value.reactive.template,\n () => state.value.reactive.currentTab,\n], ([zoomState, template, currentTab]) => {\n graphMakerState.value = {\n ...graphMakerState.value,\n zoomState,\n template,\n currentTab,\n };\n}, { debounce: 1000 });\n\nwatch(() => state.value.reactive.tooltipHintWasShown, (v) => {\n if (v) {\n graphMakerState.value = { ...graphMakerState.value, tooltipHintWasShown: true };\n }\n});\n\nwatch(() => graphMakerState.value.currentTab, (v) => {\n state.value.reactive.currentTab = v === undefined ? 'dataMapping' : v;\n});\n\nwatch(() => graphMakerState.value?.layersSettings?.dendro?.showTable, (v) => {\n state.value.reactive.layersSettings.dendro.showTable = v ?? false;\n});\n\nfunction onExport() {\n saveToFile(\n new Blob([\n chartRef.value?.export() ?? '',\n ]),\n 'chart.svg',\n );\n}\n\nfunction updateGraphTitle(nextTitle: string) {\n graphMakerState.value = {\n ...graphMakerState.value,\n title: nextTitle,\n };\n}\n\nfunction selectTreeNode(id: number | null) {\n state.value.reactive.dendroSelectedNodeId = id;\n chartRef.value?.updateChartState('selectedNode', id);\n}\n\nconst slots = useSlots();\n\nconst hasAnnotationsSlot = computed(() => Boolean(slots.annotationsSlot));\nconst hasSettingsSlot = computed(() => Boolean(slots.settingsSlot));\nconst hasLogSlot = computed(() => Boolean(slots.logSlot));\n\n</script>\n\n<template>\n <div class=\"graph-maker\">\n <div class=\"graph-maker__main-pane\">\n <Chart\n :graph-status=\"graphStatus\" :graphTitle=\"graphMakerState.title\" :chartData=\"chartCalculatedDataRef\"\n :chart-ref=\"chartRef\" :error-info=\"chartErrorInfo\" :dendroTooltipButton=\"tooltipButton\"\n :custom-status-text=\"statusText\"\n :allow-title-editing=\"allowTitleEditing\"\n :isScatterplotZoomChanged=\"isScatterplotZoomChanged\"\n @graph-title-update=\"updateGraphTitle\" @dendro-node-select=\"selectTreeNode\"\n @dendro-tooltip-btn-click=\"(id: string) => $emit('tooltip-btn-click', id)\"\n >\n <slot name=\"titleLineSlot\" />\n </Chart>\n <GraphStatusScreen v-if=\"isInitialLoading || isRunning\" :graphStatus=\"isRunning ? 'running' : 'loading'\" :top=\"67\" :left=\"12\" :right=\"12\" :bottom=\"12\" :customStatusText=\"statusText\" />\n <TransitionSlidePanel id=\"graph-settings-modal\">\n <PanelModal\n v-if=\"state.reactive.currentTab && !((isInitialLoading || isRunning) && isOwnGraphMakerTab(state.reactive.currentTab))\"\n @close=\"state.reactive.currentTab = null\"\n >\n <component :is=\"currentForm.value\">\n <slot v-if=\"state.reactive.currentTab === 'annotations'\" name=\"annotationsSlot\" />\n <slot v-if=\"state.reactive.currentTab === 'settings'\" name=\"settingsSlot\" />\n <slot v-if=\"state.reactive.currentTab === 'log'\" name=\"logSlot\" />\n </component>\n </PanelModal>\n </TransitionSlidePanel>\n </div>\n <VTabs\n v-model=\"state.reactive.currentTab\" :chart-type=\"state.reactive.chartType\" :graph-status=\"graphStatus\"\n :allowDeleting=\"allowChartDeleting\" :hasAnnotationsSlot=\"hasAnnotationsSlot\" :hasSettingsSlot=\"hasSettingsSlot\"\n :hasLogSlot=\"hasLogSlot\" :initialLoading=\"isInitialLoading || isRunning\" @export=\"onExport\"\n @delete=\"$emit('delete-this-graph')\"\n />\n <ChartErrorNotificationAlert v-if=\"chartErrorInfo?.type === 'unknownError'\" :errorInfo=\"chartErrorInfo\" />\n <ChartTruncationWarningAlert\n v-if=\"chartTruncationWarning\"\n :truncation-warning=\"chartTruncationWarning\"\n />\n </div>\n</template>\n"],"mappings":""}
@@ -2,6 +2,10 @@ import { DemoDataStore, InputGuide, InputState, PlotDataAndSettings } from '@mil
2
2
  import { DefaultPalettes, GraphMakerProps, ReactiveState, UniqueValuesBySourceMap } from '../../types';
3
3
  import { DataByColumns, Settings } from '@milaboratories/miplots4';
4
4
  export type ChartTruncationWarning = {
5
+ type: 'dataOverflow';
6
+ dataVisible: number;
7
+ } | {
8
+ type: 'tooManyGroups';
5
9
  groups: boolean;
6
10
  facets: boolean;
7
11
  /** Visible (shown) count for groups */
@@ -25,6 +29,6 @@ export declare function composeChartSettings(chartData: PlotDataAndSettings | nu
25
29
  }>>, reactiveState: ReactiveState, defaultPalette: DefaultPalettes, facetValuesData?: UniqueValuesBySourceMap): null | {
26
30
  settings: Settings;
27
31
  data: DataByColumns;
28
- truncationWarning: ChartTruncationWarning;
32
+ truncationWarning: ChartTruncationWarning | null;
29
33
  };
30
34
  //# sourceMappingURL=composeChartSettings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"composeChartSettings.d.ts","sourceRoot":"","sources":["../../../src/utils/createChartSettingsForRender/composeChartSettings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,aAAa,EACb,UAAU,EACV,UAAU,EACV,mBAAmB,EAEpB,MAAM,0BAA0B,CAAC;AAIlC,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,aAAa,EAEb,uBAAuB,EACxB,MAAM,aAAa,CAAC;AAIrB,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,uCAAuC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,+FAA+F;AAC/F,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,EAC5B,eAAe,EAAE,uBAAuB,EACxC,cAAc,EAAE,MAAM,GACrB,MAAM,EAAE,GAAG,SAAS,CAUtB;AAMD,OAAO,KAAK,EAEV,aAAa,EAOb,QAAQ,EACT,MAAM,0BAA0B,CAAC;AAgElC,wBAAsB,eAAe,CACnC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,EAClC,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,aAAa,GAAG,IAAI,EAC/B,YAAY,CAAC,EAAE,eAAe,CAAC,cAAc,CAAC,uCAqB/C;AACD,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,mBAAmB,GAAG,IAAI,EACrC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,EAClC,UAAU,EAAE,uBAAuB,EACnC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,EACnF,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,eAAe,EAC/B,eAAe,GAAE,uBAA4B,GAC5C,IAAI,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,aAAa,CAAC;IAAC,iBAAiB,EAAE,sBAAsB,CAAA;CAAE,CAgE/F"}
1
+ {"version":3,"file":"composeChartSettings.d.ts","sourceRoot":"","sources":["../../../src/utils/createChartSettingsForRender/composeChartSettings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,aAAa,EACb,UAAU,EACV,UAAU,EACV,mBAAmB,EAEpB,MAAM,0BAA0B,CAAC;AAIlC,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,aAAa,EAEb,uBAAuB,EACxB,MAAM,aAAa,CAAC;AAIrB,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG;IACF,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,uCAAuC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,+FAA+F;AAC/F,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,EAC5B,eAAe,EAAE,uBAAuB,EACxC,cAAc,EAAE,MAAM,GACrB,MAAM,EAAE,GAAG,SAAS,CAUtB;AAMD,OAAO,KAAK,EAEV,aAAa,EAOb,QAAQ,EACT,MAAM,0BAA0B,CAAC;AAgElC,wBAAsB,eAAe,CACnC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,EAClC,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,aAAa,GAAG,IAAI,EAC/B,YAAY,CAAC,EAAE,eAAe,CAAC,cAAc,CAAC,uCAqB/C;AACD,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,mBAAmB,GAAG,IAAI,EACrC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,EAClC,UAAU,EAAE,uBAAuB,EACnC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,EACnF,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,eAAe,EAC/B,eAAe,GAAE,uBAA4B,GAC5C,IAAI,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,aAAa,CAAC;IAAC,iBAAiB,EAAE,sBAAsB,GAAG,IAAI,CAAA;CAAE,CA0EtG"}
@@ -63,6 +63,7 @@ function g(e, l, u, d, h, g, _ = {}) {
63
63
  let v = { ...e.settings }, y = e.data.byColumns;
64
64
  v.title = m(h.chartType, h.optionsState, d, h.axesSettings), v.size = p(h.chartScale, h.optionsState.components?.facetBy.selectorStates.length || 0), v.legend = { show: h.axesSettings.other.showLegend };
65
65
  let b = {
66
+ type: "tooManyGroups",
66
67
  groups: !1,
67
68
  facets: !1
68
69
  };
@@ -77,7 +78,10 @@ function g(e, l, u, d, h, g, _ = {}) {
77
78
  order: r
78
79
  };
79
80
  }
80
- return {
81
+ return b.facets === !1 && b.groups === !1 && (b = null), e.data.byColumns.overflow && (b = {
82
+ type: "dataOverflow",
83
+ dataVisible: e.data.byColumns.values[Object.keys(e.data.byColumns.values)[0]].length
84
+ }), {
81
85
  settings: v,
82
86
  data: e.data.byColumns,
83
87
  truncationWarning: b
@@ -1 +1 @@
1
- {"version":3,"file":"composeChartSettings.js","names":[],"sources":["../../../src/utils/createChartSettingsForRender/composeChartSettings.ts"],"sourcesContent":["import type {\n ChartType,\n DemoDataStore,\n InputGuide,\n InputState,\n PlotDataAndSettings,\n SelectorStateFilter,\n} from '@milaboratories/pf-plots';\nimport {\n getControllerByType,\n} from '@milaboratories/pf-plots';\nimport type {\n DefaultPalettes,\n GraphMakerProps,\n ReactiveState,\n TitlePosition,\n UniqueValuesBySourceMap,\n} from '../../types';\n\nconst DISPLAY_MAX = 1000;\n\nexport type ChartTruncationWarning = {\n groups: boolean;\n facets: boolean;\n /** Visible (shown) count for groups */\n groupsVisible?: number;\n /** Total count for groups (use 1000+ in UI when >= 1000) */\n groupsTotal?: number;\n /** Visible (shown) count for facets */\n facetsVisible?: number;\n /** Total count for facets (use 1000+ in UI when >= 1000) */\n facetsTotal?: number;\n};\n\nexport function formatTruncationTotal(n: number): string {\n return n >= DISPLAY_MAX ? '1000+' : String(n);\n}\n\n/** Build facet order for chart settings from saved facet values, limited by maxFacetsCount. */\nexport function getFacetOrderForChartSettings(\n facetBy: { value: string }[],\n facetValuesData: UniqueValuesBySourceMap,\n maxFacetsCount: number,\n): string[] | undefined {\n if (!facetBy?.length || maxFacetsCount <= 0) {\n return undefined;\n }\n const valueLists = facetBy.map((col) => facetValuesData[col.value]?.list ?? []);\n if (valueLists.some((list) => !list.length)) {\n return undefined;\n }\n const keys = getFacetKeysFromValueLists(valueLists);\n return keys.slice(0, maxFacetsCount);\n}\nimport { addFixedOptionsToState } from '../addFixedOptionsToState';\nimport type {\n AxesState } from '../../constantsCommon';\nimport { DEFAULT_HEIGHT, DEFAULT_HEIGHT_SMALL, DEFAULT_WIDTH, DEFAULT_WIDTH_SMALL,\n} from '../../constantsCommon';\nimport type {\n BubbleSettings,\n DataByColumns,\n DendroSettings,\n DiscreteSettings,\n HeatmapSettings,\n HistogramSettings,\n ScatterplotSettings,\n ScatterplotUmapSettings,\n Settings,\n} from '@milaboratories/miplots4';\nimport { getFacetKeysFromValueLists } from '@milaboratories/miplots4';\nimport { composeDiscreteSettings } from './composeDiscreteSettings';\nimport { composeScatterplotSettings } from './composeScatterplotSettings';\nimport { composeScatterplotUmapSettings } from './composeScatterplotUmapSettings';\nimport { composeHeatmapSettings } from './composeHeatmapSettings';\nimport { composeDendroSettings } from './composeDendroSettings';\nimport { composeHistogramSettings } from './composeHistogramSettings';\nimport { composeBubbleSettings } from './composeBubbleSettings';\n\nfunction getChartSizes(chartScale: number, facetByLength = 0) {\n return {\n width: (facetByLength > 0 ? DEFAULT_WIDTH_SMALL : DEFAULT_WIDTH) * (chartScale / 100),\n height: (facetByLength > 0 ? DEFAULT_HEIGHT_SMALL : DEFAULT_HEIGHT) * (chartScale / 100),\n };\n}\n\nfunction getChartTitle(\n chartType: ChartType,\n optionsState: InputState,\n filterLabelsInfo: Record<string, Record<string, { value: unknown; label: string }>>,\n axesSettings: AxesState,\n): {\n name: string;\n show: boolean;\n position?: TitlePosition;\n } {\n if (\n chartType !== 'scatterplot'\n && chartType !== 'scatterplot-umap'\n && chartType !== 'discrete'\n && chartType !== 'heatmap'\n && chartType !== 'histogram'\n && chartType !== 'bubble'\n ) {\n return { name: '', show: false };\n }\n if (axesSettings.title.mode === 'hidden') {\n return { name: '', show: false };\n }\n if (axesSettings.title.mode === 'custom') {\n return { name: axesSettings.title.value, show: true, position: axesSettings.title.position };\n }\n if (axesSettings.title.mode === 'auto') {\n const selectedFilters: string[] = [];\n const tabByStates = (optionsState.components?.tabBy.selectorStates ?? []);\n const filterStates = (optionsState.components?.filters.selectorStates ?? []).filter((state) => !tabByStates.some((tabByState) => tabByState.selectedSource === state.selectedSource));\n\n const usedInTitleStates = [\n ...tabByStates,\n ...filterStates,\n ] as SelectorStateFilter[];\n usedInTitleStates.forEach(({ type, selectedSource, selectedFilterValues }) => {\n if ((!type || type === 'equals') && selectedFilterValues && filterLabelsInfo[selectedSource]) {\n selectedFilters.push(...selectedFilterValues\n .map((selectedFilterValue) => filterLabelsInfo[selectedSource]?.[selectedFilterValue]?.label ?? String(selectedFilterValue)));\n }\n });\n const title = selectedFilters.join(', ');\n return { name: title, show: true, position: axesSettings.title.position };\n }\n return { name: '', show: false };\n}\n\nexport async function loadDataForPlot(\n inputGuide: InputGuide<InputState>,\n reactiveState: ReactiveState,\n dataStore: DemoDataStore | null,\n fixedOptions?: GraphMakerProps['fixedOptions'],\n) {\n if (!inputGuide.ready || dataStore === null) {\n return null;\n }\n try {\n const controller = getControllerByType(reactiveState.chartType);\n const optionsStateWithFixed = await addFixedOptionsToState(\n reactiveState.optionsState,\n dataStore,\n fixedOptions,\n );\n return controller.createDataForPlot(\n dataStore,\n optionsStateWithFixed,\n );\n } catch (err) {\n console.warn('Cant build chart data');\n console.warn((err as Error).message);\n return null;\n }\n}\nexport function composeChartSettings(\n chartData: PlotDataAndSettings | null,\n inputGuide: InputGuide<InputState>,\n labelsInfo: UniqueValuesBySourceMap,\n filterLabelsInfo: Record<string, Record<string, { value: unknown; label: string }>>,\n reactiveState: ReactiveState,\n defaultPalette: DefaultPalettes,\n facetValuesData: UniqueValuesBySourceMap = {},\n): null | { settings: Settings; data: DataByColumns; truncationWarning: ChartTruncationWarning } {\n if (!inputGuide.ready || chartData === null) {\n return null;\n }\n\n let settings: Settings = { ...chartData.settings } as Settings;\n const dataByColumns = chartData.data.byColumns;\n settings.title = getChartTitle(reactiveState.chartType, reactiveState.optionsState, filterLabelsInfo, reactiveState.axesSettings);\n settings.size = getChartSizes(reactiveState.chartScale, reactiveState.optionsState.components?.facetBy.selectorStates.length || 0);\n settings.legend = { show: reactiveState.axesSettings.other.showLegend };\n\n const truncationWarning: ChartTruncationWarning = { groups: false, facets: false };\n\n if (reactiveState.chartType === 'discrete') {\n const result = composeDiscreteSettings(settings as DiscreteSettings, reactiveState, labelsInfo, inputGuide, defaultPalette);\n settings = result.settings;\n truncationWarning.groups = result.groupsAreTruncated;\n if (result.groupsAreTruncated && result.groupsVisible != null && result.groupsTotal != null) {\n truncationWarning.groupsVisible = result.groupsVisible;\n truncationWarning.groupsTotal = result.groupsTotal;\n }\n }\n if (reactiveState.chartType === 'scatterplot') {\n settings = composeScatterplotSettings(settings as ScatterplotSettings, dataByColumns, reactiveState, inputGuide, labelsInfo, defaultPalette);\n }\n if (reactiveState.chartType === 'scatterplot-umap') {\n settings = composeScatterplotUmapSettings(settings as ScatterplotUmapSettings, dataByColumns, reactiveState, inputGuide, labelsInfo, defaultPalette);\n }\n if (reactiveState.chartType === 'heatmap') {\n settings = composeHeatmapSettings(settings as HeatmapSettings, reactiveState, defaultPalette);\n }\n if (reactiveState.chartType === 'dendro') {\n settings = composeDendroSettings(settings as DendroSettings, dataByColumns, reactiveState, inputGuide, labelsInfo);\n }\n if (reactiveState.chartType === 'histogram') {\n settings = composeHistogramSettings(settings as HistogramSettings, reactiveState, labelsInfo, defaultPalette);\n }\n if (reactiveState.chartType === 'bubble') {\n settings = composeBubbleSettings(settings as BubbleSettings, reactiveState, defaultPalette);\n }\n\n if ('facetBy' in settings && 'facetSettings' in settings && settings.facetBy?.length && settings.facetSettings) {\n const valueLists = settings.facetBy.map((col: { value: string }) => facetValuesData[col.value]?.list ?? []);\n const allFacetKeys = valueLists.every((list: string[]) => list.length > 0)\n ? getFacetKeysFromValueLists(valueLists)\n : [];\n const maxFacetsCount = reactiveState.axesSettings.other.maxFacetsCount;\n const order = getFacetOrderForChartSettings(\n settings.facetBy,\n facetValuesData,\n maxFacetsCount,\n );\n if (allFacetKeys.length > maxFacetsCount) {\n truncationWarning.facets = true;\n truncationWarning.facetsVisible = order?.length ?? 0;\n truncationWarning.facetsTotal = allFacetKeys.length;\n }\n settings.facetSettings = { ...settings.facetSettings, order };\n }\n return {\n settings: settings as Settings,\n data: chartData.data.byColumns,\n truncationWarning,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"composeChartSettings.js","names":[],"sources":["../../../src/utils/createChartSettingsForRender/composeChartSettings.ts"],"sourcesContent":["import type {\n ChartType,\n DemoDataStore,\n InputGuide,\n InputState,\n PlotDataAndSettings,\n SelectorStateFilter,\n} from '@milaboratories/pf-plots';\nimport {\n getControllerByType,\n} from '@milaboratories/pf-plots';\nimport type {\n DefaultPalettes,\n GraphMakerProps,\n ReactiveState,\n TitlePosition,\n UniqueValuesBySourceMap,\n} from '../../types';\n\nconst DISPLAY_MAX = 1000;\n\nexport type ChartTruncationWarning = {\n type: 'dataOverflow';\n dataVisible: number;\n} | {\n type: 'tooManyGroups';\n groups: boolean;\n facets: boolean;\n /** Visible (shown) count for groups */\n groupsVisible?: number;\n /** Total count for groups (use 1000+ in UI when >= 1000) */\n groupsTotal?: number;\n /** Visible (shown) count for facets */\n facetsVisible?: number;\n /** Total count for facets (use 1000+ in UI when >= 1000) */\n facetsTotal?: number;\n};\n\nexport function formatTruncationTotal(n: number): string {\n return n >= DISPLAY_MAX ? '1000+' : String(n);\n}\n\n/** Build facet order for chart settings from saved facet values, limited by maxFacetsCount. */\nexport function getFacetOrderForChartSettings(\n facetBy: { value: string }[],\n facetValuesData: UniqueValuesBySourceMap,\n maxFacetsCount: number,\n): string[] | undefined {\n if (!facetBy?.length || maxFacetsCount <= 0) {\n return undefined;\n }\n const valueLists = facetBy.map((col) => facetValuesData[col.value]?.list ?? []);\n if (valueLists.some((list) => !list.length)) {\n return undefined;\n }\n const keys = getFacetKeysFromValueLists(valueLists);\n return keys.slice(0, maxFacetsCount);\n}\nimport { addFixedOptionsToState } from '../addFixedOptionsToState';\nimport type {\n AxesState } from '../../constantsCommon';\nimport { DEFAULT_HEIGHT, DEFAULT_HEIGHT_SMALL, DEFAULT_WIDTH, DEFAULT_WIDTH_SMALL,\n} from '../../constantsCommon';\nimport type {\n BubbleSettings,\n DataByColumns,\n DendroSettings,\n DiscreteSettings,\n HeatmapSettings,\n HistogramSettings,\n ScatterplotSettings,\n ScatterplotUmapSettings,\n Settings,\n} from '@milaboratories/miplots4';\nimport { getFacetKeysFromValueLists } from '@milaboratories/miplots4';\nimport { composeDiscreteSettings } from './composeDiscreteSettings';\nimport { composeScatterplotSettings } from './composeScatterplotSettings';\nimport { composeScatterplotUmapSettings } from './composeScatterplotUmapSettings';\nimport { composeHeatmapSettings } from './composeHeatmapSettings';\nimport { composeDendroSettings } from './composeDendroSettings';\nimport { composeHistogramSettings } from './composeHistogramSettings';\nimport { composeBubbleSettings } from './composeBubbleSettings';\n\nfunction getChartSizes(chartScale: number, facetByLength = 0) {\n return {\n width: (facetByLength > 0 ? DEFAULT_WIDTH_SMALL : DEFAULT_WIDTH) * (chartScale / 100),\n height: (facetByLength > 0 ? DEFAULT_HEIGHT_SMALL : DEFAULT_HEIGHT) * (chartScale / 100),\n };\n}\n\nfunction getChartTitle(\n chartType: ChartType,\n optionsState: InputState,\n filterLabelsInfo: Record<string, Record<string, { value: unknown; label: string }>>,\n axesSettings: AxesState,\n): {\n name: string;\n show: boolean;\n position?: TitlePosition;\n } {\n if (\n chartType !== 'scatterplot'\n && chartType !== 'scatterplot-umap'\n && chartType !== 'discrete'\n && chartType !== 'heatmap'\n && chartType !== 'histogram'\n && chartType !== 'bubble'\n ) {\n return { name: '', show: false };\n }\n if (axesSettings.title.mode === 'hidden') {\n return { name: '', show: false };\n }\n if (axesSettings.title.mode === 'custom') {\n return { name: axesSettings.title.value, show: true, position: axesSettings.title.position };\n }\n if (axesSettings.title.mode === 'auto') {\n const selectedFilters: string[] = [];\n const tabByStates = (optionsState.components?.tabBy.selectorStates ?? []);\n const filterStates = (optionsState.components?.filters.selectorStates ?? []).filter((state) => !tabByStates.some((tabByState) => tabByState.selectedSource === state.selectedSource));\n\n const usedInTitleStates = [\n ...tabByStates,\n ...filterStates,\n ] as SelectorStateFilter[];\n usedInTitleStates.forEach(({ type, selectedSource, selectedFilterValues }) => {\n if ((!type || type === 'equals') && selectedFilterValues && filterLabelsInfo[selectedSource]) {\n selectedFilters.push(...selectedFilterValues\n .map((selectedFilterValue) => filterLabelsInfo[selectedSource]?.[selectedFilterValue]?.label ?? String(selectedFilterValue)));\n }\n });\n const title = selectedFilters.join(', ');\n return { name: title, show: true, position: axesSettings.title.position };\n }\n return { name: '', show: false };\n}\n\nexport async function loadDataForPlot(\n inputGuide: InputGuide<InputState>,\n reactiveState: ReactiveState,\n dataStore: DemoDataStore | null,\n fixedOptions?: GraphMakerProps['fixedOptions'],\n) {\n if (!inputGuide.ready || dataStore === null) {\n return null;\n }\n try {\n const controller = getControllerByType(reactiveState.chartType);\n const optionsStateWithFixed = await addFixedOptionsToState(\n reactiveState.optionsState,\n dataStore,\n fixedOptions,\n );\n return controller.createDataForPlot(\n dataStore,\n optionsStateWithFixed,\n );\n } catch (err) {\n console.warn('Cant build chart data');\n console.warn((err as Error).message);\n return null;\n }\n}\nexport function composeChartSettings(\n chartData: PlotDataAndSettings | null,\n inputGuide: InputGuide<InputState>,\n labelsInfo: UniqueValuesBySourceMap,\n filterLabelsInfo: Record<string, Record<string, { value: unknown; label: string }>>,\n reactiveState: ReactiveState,\n defaultPalette: DefaultPalettes,\n facetValuesData: UniqueValuesBySourceMap = {},\n): null | { settings: Settings; data: DataByColumns; truncationWarning: ChartTruncationWarning | null } {\n if (!inputGuide.ready || chartData === null) {\n return null;\n }\n\n let settings: Settings = { ...chartData.settings } as Settings;\n const dataByColumns = chartData.data.byColumns;\n settings.title = getChartTitle(reactiveState.chartType, reactiveState.optionsState, filterLabelsInfo, reactiveState.axesSettings);\n settings.size = getChartSizes(reactiveState.chartScale, reactiveState.optionsState.components?.facetBy.selectorStates.length || 0);\n settings.legend = { show: reactiveState.axesSettings.other.showLegend };\n\n let truncationWarning: ChartTruncationWarning | null = { type: 'tooManyGroups', groups: false, facets: false };\n\n if (reactiveState.chartType === 'discrete') {\n const result = composeDiscreteSettings(settings as DiscreteSettings, reactiveState, labelsInfo, inputGuide, defaultPalette);\n settings = result.settings;\n truncationWarning.groups = result.groupsAreTruncated;\n if (result.groupsAreTruncated && result.groupsVisible != null && result.groupsTotal != null) {\n truncationWarning.groupsVisible = result.groupsVisible;\n truncationWarning.groupsTotal = result.groupsTotal;\n }\n }\n if (reactiveState.chartType === 'scatterplot') {\n settings = composeScatterplotSettings(settings as ScatterplotSettings, dataByColumns, reactiveState, inputGuide, labelsInfo, defaultPalette);\n }\n if (reactiveState.chartType === 'scatterplot-umap') {\n settings = composeScatterplotUmapSettings(settings as ScatterplotUmapSettings, dataByColumns, reactiveState, inputGuide, labelsInfo, defaultPalette);\n }\n if (reactiveState.chartType === 'heatmap') {\n settings = composeHeatmapSettings(settings as HeatmapSettings, reactiveState, defaultPalette);\n }\n if (reactiveState.chartType === 'dendro') {\n settings = composeDendroSettings(settings as DendroSettings, dataByColumns, reactiveState, inputGuide, labelsInfo);\n }\n if (reactiveState.chartType === 'histogram') {\n settings = composeHistogramSettings(settings as HistogramSettings, reactiveState, labelsInfo, defaultPalette);\n }\n if (reactiveState.chartType === 'bubble') {\n settings = composeBubbleSettings(settings as BubbleSettings, reactiveState, defaultPalette);\n }\n\n if ('facetBy' in settings && 'facetSettings' in settings && settings.facetBy?.length && settings.facetSettings) {\n const valueLists = settings.facetBy.map((col: { value: string }) => facetValuesData[col.value]?.list ?? []);\n const allFacetKeys = valueLists.every((list: string[]) => list.length > 0)\n ? getFacetKeysFromValueLists(valueLists)\n : [];\n const maxFacetsCount = reactiveState.axesSettings.other.maxFacetsCount;\n const order = getFacetOrderForChartSettings(\n settings.facetBy,\n facetValuesData,\n maxFacetsCount,\n );\n if (allFacetKeys.length > maxFacetsCount) {\n truncationWarning.facets = true;\n truncationWarning.facetsVisible = order?.length ?? 0;\n truncationWarning.facetsTotal = allFacetKeys.length;\n }\n settings.facetSettings = { ...settings.facetSettings, order };\n }\n\n if (truncationWarning.facets === false && truncationWarning.groups === false) {\n truncationWarning = null;\n }\n if (chartData.data.byColumns.overflow) {\n truncationWarning = {\n type: 'dataOverflow',\n dataVisible: chartData.data.byColumns.values[Object.keys(chartData.data.byColumns.values)[0]].length,\n };\n }\n return {\n settings: settings as Settings,\n data: chartData.data.byColumns,\n truncationWarning,\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milaboratories/graph-maker",
3
- "version": "1.2.6",
3
+ "version": "1.2.8",
4
4
  "type": "module",
5
5
  "main": "dist/ui.js",
6
6
  "types": "dist/ui.d.ts",
@@ -38,8 +38,8 @@
38
38
  "d3-hierarchy": "^3.1.2",
39
39
  "d3-scale": "^4.0.2",
40
40
  "vue": "^3.5.24",
41
- "@milaboratories/pf-plots": "1.1.67",
42
- "@milaboratories/miplots4": "1.0.177"
41
+ "@milaboratories/miplots4": "1.0.178",
42
+ "@milaboratories/pf-plots": "1.1.69"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@milaboratories/build-configs": "^1.5.0",
@@ -1,5 +0,0 @@
1
- import e from "./GraphMakerPlugin.vue2.js";
2
- var t = e;
3
- export { t as default };
4
-
5
- //# sourceMappingURL=GraphMakerPlugin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GraphMakerPlugin.js","names":[],"sources":["../src/GraphMakerPlugin.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue';\nimport { usePlugin, type InferPluginHandle } from '@platforma-sdk/ui-vue';\nimport { type PlSelectionModel, type PColumnSpec, getRawPlatformaInstance } from '@platforma-sdk/model';\nimport type { ChartType } from '@milaboratories/pf-plots';\nimport type { GraphMakerPlugin } from './plugin';\nimport type { GraphMakerProps, GraphMakerState, PredefinedGraphOption, StatusTextData } from './types';\nimport GraphMaker from './ui.vue';\n\nconst props = defineProps<{\n handle: InferPluginHandle<GraphMakerPlugin>;\n defaultOptions?: PredefinedGraphOption<ChartType>[] | null;\n fixedOptions?: PredefinedGraphOption<ChartType>[];\n tooltipButton?: string;\n labelsModifier?: (id: string, label: string) => string;\n dataColumnPredicate?: (spec: PColumnSpec) => boolean;\n metaColumnPredicate?: (spec: PColumnSpec) => boolean;\n statusText?: Partial<StatusTextData>;\n}>();\n\nconst emit = defineEmits<{\n 'delete-this-graph': [];\n 'tooltip-btn-click': [id: string];\n}>();\n\nconst plugin = usePlugin(props.handle);\nconst data = plugin.model.data;\n\nconst state = computed<GraphMakerState>({\n get: () => data.state,\n set: (v) => { data.state = v; },\n});\n\nconst selection = computed<PlSelectionModel | undefined>({\n get: () => data.selection,\n set: (v) => { data.selection = v; },\n});\n\nconst graphMakerProps = computed(() => ({\n chartType: plugin.model.outputs.chartType as ChartType,\n pFrame: plugin.model.outputs.pFrame,\n defaultPalette: plugin.model.outputs.defaultPalette ?? undefined,\n readonlyInputs: plugin.model.outputs.readonlyInputs ?? [],\n allowChartDeleting: plugin.model.outputs.allowChartDeleting ?? false,\n allowTitleEditing: plugin.model.outputs.allowTitleEditing ?? false,\n defaultOptions: props.defaultOptions,\n fixedOptions: props.fixedOptions,\n driver: getRawPlatformaInstance().pFrameDriver,\n tooltipButton: props.tooltipButton,\n labelsModifier: props.labelsModifier,\n dataColumnPredicate: props.dataColumnPredicate,\n metaColumnPredicate: props.metaColumnPredicate,\n statusText: props.statusText,\n}) as GraphMakerProps);\n</script>\n\n<template>\n <GraphMaker\n v-model=\"state\"\n v-model:selection=\"selection\"\n v-bind=\"graphMakerProps\"\n @delete-this-graph=\"emit('delete-this-graph')\"\n @tooltip-btn-click=\"(id: string) => emit('tooltip-btn-click', id)\"\n >\n <template v-for=\"(_, name) in $slots\" #[name]>\n <slot :name=\"name\" />\n </template>\n </GraphMaker>\n</template>\n"],"mappings":""}
@@ -1,37 +0,0 @@
1
- import { InferPluginHandle } from '@platforma-sdk/ui-vue';
2
- import { PColumnSpec } from '@platforma-sdk/model';
3
- import { ChartType } from '@milaboratories/pf-plots';
4
- import { GraphMakerPlugin } from './plugin';
5
- import { PredefinedGraphOption, StatusTextData } from './types';
6
- type __VLS_Props = {
7
- handle: InferPluginHandle<GraphMakerPlugin>;
8
- defaultOptions?: PredefinedGraphOption<ChartType>[] | null;
9
- fixedOptions?: PredefinedGraphOption<ChartType>[];
10
- tooltipButton?: string;
11
- labelsModifier?: (id: string, label: string) => string;
12
- dataColumnPredicate?: (spec: PColumnSpec) => boolean;
13
- metaColumnPredicate?: (spec: PColumnSpec) => boolean;
14
- statusText?: Partial<StatusTextData>;
15
- };
16
- declare function __VLS_template(): {
17
- attrs: Partial<{}>;
18
- slots: any;
19
- refs: {};
20
- rootEl: HTMLDivElement;
21
- };
22
- type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
23
- declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
24
- "tooltip-btn-click": (id: string) => any;
25
- "delete-this-graph": () => any;
26
- }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
27
- "onTooltip-btn-click"?: ((id: string) => any) | undefined;
28
- "onDelete-this-graph"?: (() => any) | undefined;
29
- }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
30
- declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
31
- export default _default;
32
- type __VLS_WithTemplateSlots<T, S> = T & {
33
- new (): {
34
- $slots: S;
35
- };
36
- };
37
- //# sourceMappingURL=GraphMakerPlugin.vue.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GraphMakerPlugin.vue.d.ts","sourceRoot":"","sources":["../src/GraphMakerPlugin.vue"],"names":[],"mappings":"AAwEA,OAAO,EAAa,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAyB,KAAK,WAAW,EAA2B,MAAM,sBAAsB,CAAC;AACxG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,KAAK,EAAoC,qBAAqB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGvG,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IAC5C,cAAc,CAAC,EAAE,qBAAqB,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,CAAC;IAC3D,YAAY,CAAC,EAAE,qBAAqB,CAAC,SAAS,CAAC,EAAE,CAAC;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACvD,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC;IACrD,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC;IACrD,UAAU,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;CACtC,CAAC;AAyCF,iBAAS,cAAc;WAwDT,OAAO,IAA6B;;;;EAKjD;AAcD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;;;;;;6FAQnB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAQpG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
@@ -1,61 +0,0 @@
1
- import e from "./ui2.js";
2
- import { computed as t, createBlock as n, createSlots as r, defineComponent as i, mergeProps as a, openBlock as o, renderList as s, renderSlot as c, withCtx as l } from "vue";
3
- import { usePlugin as u } from "@platforma-sdk/ui-vue";
4
- import { getRawPlatformaInstance as d } from "@platforma-sdk/model";
5
- var f = /* @__PURE__ */ i({
6
- __name: "GraphMakerPlugin",
7
- props: {
8
- handle: {},
9
- defaultOptions: {},
10
- fixedOptions: {},
11
- tooltipButton: {},
12
- labelsModifier: { type: Function },
13
- dataColumnPredicate: { type: Function },
14
- metaColumnPredicate: { type: Function },
15
- statusText: {}
16
- },
17
- emits: ["delete-this-graph", "tooltip-btn-click"],
18
- setup(i, { emit: f }) {
19
- let p = i, m = f, h = u(p.handle), g = h.model.data, _ = t({
20
- get: () => g.state,
21
- set: (e) => {
22
- g.state = e;
23
- }
24
- }), v = t({
25
- get: () => g.selection,
26
- set: (e) => {
27
- g.selection = e;
28
- }
29
- }), y = t(() => ({
30
- chartType: h.model.outputs.chartType,
31
- pFrame: h.model.outputs.pFrame,
32
- defaultPalette: h.model.outputs.defaultPalette ?? void 0,
33
- readonlyInputs: h.model.outputs.readonlyInputs ?? [],
34
- allowChartDeleting: h.model.outputs.allowChartDeleting ?? !1,
35
- allowTitleEditing: h.model.outputs.allowTitleEditing ?? !1,
36
- defaultOptions: p.defaultOptions,
37
- fixedOptions: p.fixedOptions,
38
- driver: d().pFrameDriver,
39
- tooltipButton: p.tooltipButton,
40
- labelsModifier: p.labelsModifier,
41
- dataColumnPredicate: p.dataColumnPredicate,
42
- metaColumnPredicate: p.metaColumnPredicate,
43
- statusText: p.statusText
44
- }));
45
- return (t, i) => (o(), n(e, a({
46
- modelValue: _.value,
47
- "onUpdate:modelValue": i[0] ||= (e) => _.value = e,
48
- selection: v.value,
49
- "onUpdate:selection": i[1] ||= (e) => v.value = e
50
- }, y.value, {
51
- onDeleteThisGraph: i[2] ||= (e) => m("delete-this-graph"),
52
- onTooltipBtnClick: i[3] ||= (e) => m("tooltip-btn-click", e)
53
- }), r({ _: 2 }, [s(t.$slots, (e, n) => ({
54
- name: n,
55
- fn: l(() => [c(t.$slots, n)])
56
- }))]), 1040, ["modelValue", "selection"]));
57
- }
58
- });
59
- export { f as default };
60
-
61
- //# sourceMappingURL=GraphMakerPlugin.vue2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GraphMakerPlugin.vue_vue_type_script_setup_true_lang.js","names":["$slots"],"sources":["../src/GraphMakerPlugin.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue';\nimport { usePlugin, type InferPluginHandle } from '@platforma-sdk/ui-vue';\nimport { type PlSelectionModel, type PColumnSpec, getRawPlatformaInstance } from '@platforma-sdk/model';\nimport type { ChartType } from '@milaboratories/pf-plots';\nimport type { GraphMakerPlugin } from './plugin';\nimport type { GraphMakerProps, GraphMakerState, PredefinedGraphOption, StatusTextData } from './types';\nimport GraphMaker from './ui.vue';\n\nconst props = defineProps<{\n handle: InferPluginHandle<GraphMakerPlugin>;\n defaultOptions?: PredefinedGraphOption<ChartType>[] | null;\n fixedOptions?: PredefinedGraphOption<ChartType>[];\n tooltipButton?: string;\n labelsModifier?: (id: string, label: string) => string;\n dataColumnPredicate?: (spec: PColumnSpec) => boolean;\n metaColumnPredicate?: (spec: PColumnSpec) => boolean;\n statusText?: Partial<StatusTextData>;\n}>();\n\nconst emit = defineEmits<{\n 'delete-this-graph': [];\n 'tooltip-btn-click': [id: string];\n}>();\n\nconst plugin = usePlugin(props.handle);\nconst data = plugin.model.data;\n\nconst state = computed<GraphMakerState>({\n get: () => data.state,\n set: (v) => { data.state = v; },\n});\n\nconst selection = computed<PlSelectionModel | undefined>({\n get: () => data.selection,\n set: (v) => { data.selection = v; },\n});\n\nconst graphMakerProps = computed(() => ({\n chartType: plugin.model.outputs.chartType as ChartType,\n pFrame: plugin.model.outputs.pFrame,\n defaultPalette: plugin.model.outputs.defaultPalette ?? undefined,\n readonlyInputs: plugin.model.outputs.readonlyInputs ?? [],\n allowChartDeleting: plugin.model.outputs.allowChartDeleting ?? false,\n allowTitleEditing: plugin.model.outputs.allowTitleEditing ?? false,\n defaultOptions: props.defaultOptions,\n fixedOptions: props.fixedOptions,\n driver: getRawPlatformaInstance().pFrameDriver,\n tooltipButton: props.tooltipButton,\n labelsModifier: props.labelsModifier,\n dataColumnPredicate: props.dataColumnPredicate,\n metaColumnPredicate: props.metaColumnPredicate,\n statusText: props.statusText,\n}) as GraphMakerProps);\n</script>\n\n<template>\n <GraphMaker\n v-model=\"state\"\n v-model:selection=\"selection\"\n v-bind=\"graphMakerProps\"\n @delete-this-graph=\"emit('delete-this-graph')\"\n @tooltip-btn-click=\"(id: string) => emit('tooltip-btn-click', id)\"\n >\n <template v-for=\"(_, name) in $slots\" #[name]>\n <slot :name=\"name\" />\n </template>\n </GraphMaker>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;EASA,IAAM,IAAQ,GAWR,IAAO,GAKP,IAAS,EAAU,EAAM,OAAO,EAChC,IAAO,EAAO,MAAM,MAEpB,IAAQ,EAA0B;GACtC,WAAW,EAAK;GAChB,MAAM,MAAM;AAAE,MAAK,QAAQ;;GAC5B,CAAC,EAEI,IAAY,EAAuC;GACvD,WAAW,EAAK;GAChB,MAAM,MAAM;AAAE,MAAK,YAAY;;GAChC,CAAC,EAEI,IAAkB,SAAgB;GACtC,WAAW,EAAO,MAAM,QAAQ;GAChC,QAAQ,EAAO,MAAM,QAAQ;GAC7B,gBAAgB,EAAO,MAAM,QAAQ,kBAAkB,KAAA;GACvD,gBAAgB,EAAO,MAAM,QAAQ,kBAAkB,EAAE;GACzD,oBAAoB,EAAO,MAAM,QAAQ,sBAAsB;GAC/D,mBAAmB,EAAO,MAAM,QAAQ,qBAAqB;GAC7D,gBAAgB,EAAM;GACtB,cAAc,EAAM;GACpB,QAAQ,GAAyB,CAAC;GAClC,eAAe,EAAM;GACrB,gBAAgB,EAAM;GACtB,qBAAqB,EAAM;GAC3B,qBAAqB,EAAM;GAC3B,YAAY,EAAM;GACnB,EAAqB;yBAIpB,EAUa,GAVb,EAUa;eATF,EAAA;4CAAK,QAAA;GACN,WAAW,EAAA;2CAAS,QAAA;KACpB,EAAA,OAAe;GACtB,mBAAiB,AAAA,EAAA,QAAA,MAAE,EAAI,oBAAA;GACvB,mBAAiB,AAAA,EAAA,QAAG,MAAe,EAAI,qBAAsB,EAAE;qBAElCA,EAAAA,SAAZ,GAAG;GAAkB;eAChB,CAArB,EAAqB,EAAA,QAAR,EAAI,CAAA,CAAA"}