From ad667fb28464a67adb6de7176fecb03bb1a616e5 Mon Sep 17 00:00:00 2001 From: guerler Date: Sun, 24 Nov 2024 09:47:14 +0300 Subject: [PATCH] Migrate phylocanvas to script tag --- client/gulpfile.js | 3 +- .../phylocanvas/config/phylocanvas.xml | 103 ++++++------------ .../visualizations/phylocanvas/package.json | 22 ---- .../visualizations/phylocanvas/src/script.js | 48 -------- .../phylocanvas/static/logo.png | Bin 13808 -> 7946 bytes 5 files changed, 34 insertions(+), 142 deletions(-) delete mode 100644 config/plugins/visualizations/phylocanvas/package.json delete mode 100644 config/plugins/visualizations/phylocanvas/src/script.js diff --git a/client/gulpfile.js b/client/gulpfile.js index f16b5eb84854..86e0d7009479 100644 --- a/client/gulpfile.js +++ b/client/gulpfile.js @@ -30,13 +30,12 @@ const STATIC_PLUGIN_BUILD_IDS = [ "nvd3/nvd3_bar", "openseadragon", "PCA_3Dplot", - "phylocanvas", "pv", "scatterplot", "tiffviewer", "ts_visjs", ]; -const INSTALL_PLUGIN_BUILD_IDS = ["cytoscape", "ngl", "msa", "openlayers", "venn", "vizarr"]; // todo: derive from XML +const INSTALL_PLUGIN_BUILD_IDS = ["cytoscape", "ngl", "msa", "openlayers", "phylocanvas", "venn", "vizarr"]; // todo: derive from XML const DIST_PLUGIN_BUILD_IDS = ["new_user"]; const PLUGIN_BUILD_IDS = Array.prototype.concat(DIST_PLUGIN_BUILD_IDS, STATIC_PLUGIN_BUILD_IDS); diff --git a/config/plugins/visualizations/phylocanvas/config/phylocanvas.xml b/config/plugins/visualizations/phylocanvas/config/phylocanvas.xml index c118182b35db..1eb56a81fb45 100644 --- a/config/plugins/visualizations/phylocanvas/config/phylocanvas.xml +++ b/config/plugins/visualizations/phylocanvas/config/phylocanvas.xml @@ -13,7 +13,10 @@ dataset_id - + + + + @@ -45,6 +48,32 @@ + + + node_shape + Select a node shape for leaves. + select + radio + circle + + + + circle + + + + square + + + + star + + + + triangle + + + edge_color @@ -64,84 +93,18 @@ #333333 - + show_labels Select false to hide labels. - select - radio + boolean true - - - - true - - - - false - - align_labels Select to align the labels of tree. Supported with rectangular, circular, and hierarchical tree types. - select - radio - true - - - - true - - - - false - - - - - - show_bootstrap - Select true to show bootstrap confidence values. - select - radio + boolean false - - - - true - - - - false - - - - - - node_shape - Select a node shape for leaves. - select - radio - circle - - - - circle - - - - square - - - - star - - - - triangle - - diff --git a/config/plugins/visualizations/phylocanvas/package.json b/config/plugins/visualizations/phylocanvas/package.json deleted file mode 100644 index efee4654d8d6..000000000000 --- a/config/plugins/visualizations/phylocanvas/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "visualization", - "version": "0.1.0", - "keywords": [ - "galaxy", - "visualization" - ], - "license": "AFL-3.0", - "dependencies": { - "@phylocanvas/phylocanvas.gl": "^1.48.0", - "babel-preset-env": "^1.6.1", - "deck.gl": "^8.8.23" - }, - "scripts": { - "build": "parcel build src/script.js --dist-dir static" - }, - "devDependencies": { - "buffer": "^6.0.3", - "parcel": "^2.12.0", - "process": "^0.11.10" - } -} diff --git a/config/plugins/visualizations/phylocanvas/src/script.js b/config/plugins/visualizations/phylocanvas/src/script.js deleted file mode 100644 index 9c73db9629d5..000000000000 --- a/config/plugins/visualizations/phylocanvas/src/script.js +++ /dev/null @@ -1,48 +0,0 @@ -import * as phylocanvas from "@phylocanvas/phylocanvas.gl"; - -/* This will be part of the charts/viz standard lib in 23.1 */ -const slashCleanup = /(\/)+/g; -function prefixedDownloadUrl(root, path) { - return `${root}/${path}`.replace(slashCleanup, "/"); -} -window.bundleEntries = window.bundleEntries || {}; -window.bundleEntries.load = function (options) { - const chart = options.chart; - const dataset = options.dataset; - const settings = options.chart.settings; - fetch(prefixedDownloadUrl(options.root, dataset.download_url)).then((response) => { - if (response.ok) { - response.text().then((content) => { - const container = document.getElementById(options.target); - const tree = new phylocanvas.PhylocanvasGL( - container, - { - source: content, - showLabels: settings.get("show_labels") === "true" ? true : false, - showLeafLabels: settings.get("show_labels") === "true" ? true : false, - interactive: true, - nodeShape: settings.get("node_shape"), - type: settings.get("tree_type"), - alignLabels: settings.get("align_labels") === "true" ? true : false, - strokeColour: settings.get("edge_color"), - highlightColour: settings.get("highlighted_color"), - fillColour: settings.get("node_color"), - showInternalNodeLabels: settings.get("show_bootstrap") === "true" ? true : false, - }, - [phylocanvas.plugins.scalebar] - ); - - tree.resize(container.parentElement.clientWidth, container.parentElement.clientHeight); - chart.state("ok", "Done."); - options.process.resolve(); - // resize tree on window resize - window.addEventListener("resize", () => { - tree.resize(container.parentElement.clientWidth, container.parentElement.clientHeight); - }); - }); - } else { - chart.state("failed", "Failed to access dataset."); - options.process.resolve(); - } - }); -}; diff --git a/config/plugins/visualizations/phylocanvas/static/logo.png b/config/plugins/visualizations/phylocanvas/static/logo.png index 6b65a5d88cbd99eb0b616c38db3f572cb9f43ff7..3c700dd3e3402da62ec045c141b5dad673e80677 100644 GIT binary patch literal 7946 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 K8dAkJ{Qm%}7Ep2k literal 13808 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